require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return [] } process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; },{}],2:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var tinycolor = _interopDefault(require('tinycolor2')); var hueStep = 2; // 色相阶梯 var saturationStep = 0.16; // 饱和度阶梯,浅色部分 var saturationStep2 = 0.05; // 饱和度阶梯,深色部分 var brightnessStep1 = 0.05; // 亮度阶梯,浅色部分 var brightnessStep2 = 0.15; // 亮度阶梯,深色部分 var lightColorCount = 5; // 浅色数量,主色上 var darkColorCount = 4; // 深色数量,主色下 // 暗色主题颜色映射关系表 var darkColorMap = [{ index: 7, opacity: 0.15 }, { index: 6, opacity: 0.25 }, { index: 5, opacity: 0.3 }, { index: 5, opacity: 0.45 }, { index: 5, opacity: 0.65 }, { index: 5, opacity: 0.85 }, { index: 4, opacity: 0.9 }, { index: 3, opacity: 0.95 }, { index: 2, opacity: 0.97 }, { index: 1, opacity: 0.98 }]; function getHue(hsv, i, light) { var hue; // 根据色相不同,色相转向不同 if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) { hue = light ? Math.round(hsv.h) - hueStep * i : Math.round(hsv.h) + hueStep * i; } else { hue = light ? Math.round(hsv.h) + hueStep * i : Math.round(hsv.h) - hueStep * i; } if (hue < 0) { hue += 360; } else if (hue >= 360) { hue -= 360; } return hue; } function getSaturation(hsv, i, light) { // grey color don't change saturation if (hsv.h === 0 && hsv.s === 0) { return hsv.s; } var saturation; if (light) { saturation = hsv.s - saturationStep * i; } else if (i === darkColorCount) { saturation = hsv.s + saturationStep; } else { saturation = hsv.s + saturationStep2 * i; } // 边界值修正 if (saturation > 1) { saturation = 1; } // 第一格的 s 限制在 0.06-0.1 之间 if (light && i === lightColorCount && saturation > 0.1) { saturation = 0.1; } if (saturation < 0.06) { saturation = 0.06; } return Number(saturation.toFixed(2)); } function getValue(hsv, i, light) { var value; if (light) { value = hsv.v + brightnessStep1 * i; } else { value = hsv.v - brightnessStep2 * i; } if (value > 1) { value = 1; } return Number(value.toFixed(2)); } function generate(color) { var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var patterns = []; var pColor = tinycolor(color); for (var i = lightColorCount; i > 0; i -= 1) { var hsv = pColor.toHsv(); var colorString = tinycolor({ h: getHue(hsv, i, true), s: getSaturation(hsv, i, true), v: getValue(hsv, i, true) }).toHexString(); patterns.push(colorString); } patterns.push(pColor.toHexString()); for (var _i = 1; _i <= darkColorCount; _i += 1) { var _hsv = pColor.toHsv(); var _colorString = tinycolor({ h: getHue(_hsv, _i), s: getSaturation(_hsv, _i), v: getValue(_hsv, _i) }).toHexString(); patterns.push(_colorString); } // dark theme patterns if (opts.theme === 'dark') { return darkColorMap.map(function (_ref) { var index = _ref.index, opacity = _ref.opacity; var darkColorString = tinycolor.mix(opts.backgroundColor || '#141414', patterns[index], opacity * 100).toHexString(); return darkColorString; }); } return patterns; } var presetPrimaryColors = { red: '#F5222D', volcano: '#FA541C', orange: '#FA8C16', gold: '#FAAD14', yellow: '#FADB14', lime: '#A0D911', green: '#52C41A', cyan: '#13C2C2', blue: '#1890FF', geekblue: '#2F54EB', purple: '#722ED1', magenta: '#EB2F96', grey: '#666666' }; var presetPalettes = {}; var presetDarkPalettes = {}; Object.keys(presetPrimaryColors).forEach(function (key) { presetPalettes[key] = generate(presetPrimaryColors[key]); presetPalettes[key].primary = presetPalettes[key][5]; // dark presetPalettes presetDarkPalettes[key] = generate(presetPrimaryColors[key], { theme: 'dark', backgroundColor: '#141414' }); presetDarkPalettes[key].primary = presetDarkPalettes[key][5]; }); var red = presetPalettes.red; var volcano = presetPalettes.volcano; var gold = presetPalettes.gold; var orange = presetPalettes.orange; var yellow = presetPalettes.yellow; var lime = presetPalettes.lime; var green = presetPalettes.green; var cyan = presetPalettes.cyan; var blue = presetPalettes.blue; var geekblue = presetPalettes.geekblue; var purple = presetPalettes.purple; var magenta = presetPalettes.magenta; var grey = presetPalettes.grey; exports.blue = blue; exports.cyan = cyan; exports.geekblue = geekblue; exports.generate = generate; exports.gold = gold; exports.green = green; exports.grey = grey; exports.lime = lime; exports.magenta = magenta; exports.orange = orange; exports.presetDarkPalettes = presetDarkPalettes; exports.presetPalettes = presetPalettes; exports.presetPrimaryColors = presetPrimaryColors; exports.purple = purple; exports.red = red; exports.volcano = volcano; exports.yellow = yellow; },{"tinycolor2":903}],3:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var START_EVENT_NAME_MAP = { transitionstart: { transition: 'transitionstart', WebkitTransition: 'webkitTransitionStart', MozTransition: 'mozTransitionStart', OTransition: 'oTransitionStart', msTransition: 'MSTransitionStart' }, animationstart: { animation: 'animationstart', WebkitAnimation: 'webkitAnimationStart', MozAnimation: 'mozAnimationStart', OAnimation: 'oAnimationStart', msAnimation: 'MSAnimationStart' } }; var END_EVENT_NAME_MAP = { transitionend: { transition: 'transitionend', WebkitTransition: 'webkitTransitionEnd', MozTransition: 'mozTransitionEnd', OTransition: 'oTransitionEnd', msTransition: 'MSTransitionEnd' }, animationend: { animation: 'animationend', WebkitAnimation: 'webkitAnimationEnd', MozAnimation: 'mozAnimationEnd', OAnimation: 'oAnimationEnd', msAnimation: 'MSAnimationEnd' } }; var startEvents = []; var endEvents = []; function detectEvents() { var testEl = document.createElement('div'); var style = testEl.style; if (!('AnimationEvent' in window)) { delete START_EVENT_NAME_MAP.animationstart.animation; delete END_EVENT_NAME_MAP.animationend.animation; } if (!('TransitionEvent' in window)) { delete START_EVENT_NAME_MAP.transitionstart.transition; delete END_EVENT_NAME_MAP.transitionend.transition; } function process(EVENT_NAME_MAP, events) { for (var baseEventName in EVENT_NAME_MAP) { if (EVENT_NAME_MAP.hasOwnProperty(baseEventName)) { var baseEvents = EVENT_NAME_MAP[baseEventName]; for (var styleName in baseEvents) { if (styleName in style) { events.push(baseEvents[styleName]); break; } } } } } process(START_EVENT_NAME_MAP, startEvents); process(END_EVENT_NAME_MAP, endEvents); } if (typeof window !== 'undefined' && typeof document !== 'undefined') { detectEvents(); } function addEventListener(node, eventName, eventListener) { node.addEventListener(eventName, eventListener, false); } function removeEventListener(node, eventName, eventListener) { node.removeEventListener(eventName, eventListener, false); } var TransitionEvents = { // Start events startEvents: startEvents, addStartEventListener: function addStartEventListener(node, eventListener) { if (startEvents.length === 0) { window.setTimeout(eventListener, 0); return; } startEvents.forEach(function (startEvent) { addEventListener(node, startEvent, eventListener); }); }, removeStartEventListener: function removeStartEventListener(node, eventListener) { if (startEvents.length === 0) { return; } startEvents.forEach(function (startEvent) { removeEventListener(node, startEvent, eventListener); }); }, // End events endEvents: endEvents, addEndEventListener: function addEndEventListener(node, eventListener) { if (endEvents.length === 0) { window.setTimeout(eventListener, 0); return; } endEvents.forEach(function (endEvent) { addEventListener(node, endEvent, eventListener); }); }, removeEndEventListener: function removeEndEventListener(node, eventListener) { if (endEvents.length === 0) { return; } endEvents.forEach(function (endEvent) { removeEventListener(node, endEvent, eventListener); }); } }; exports['default'] = TransitionEvents; module.exports = exports['default']; },{}],4:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.isCssAnimationSupported = undefined; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _Event = require('./Event'); var _Event2 = _interopRequireDefault(_Event); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var isCssAnimationSupported = _Event2['default'].endEvents.length !== 0; var capitalPrefixes = ['Webkit', 'Moz', 'O', // ms is special .... ! 'ms']; var prefixes = ['-webkit-', '-moz-', '-o-', 'ms-', '']; function getStyleProperty(node, name) { // old ff need null, https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle var style = window.getComputedStyle(node, null); var ret = ''; for (var i = 0; i < prefixes.length; i++) { ret = style.getPropertyValue(prefixes[i] + name); if (ret) { break; } } return ret; } function fixBrowserByTimeout(node) { if (isCssAnimationSupported) { var transitionDelay = parseFloat(getStyleProperty(node, 'transition-delay')) || 0; var transitionDuration = parseFloat(getStyleProperty(node, 'transition-duration')) || 0; var animationDelay = parseFloat(getStyleProperty(node, 'animation-delay')) || 0; var animationDuration = parseFloat(getStyleProperty(node, 'animation-duration')) || 0; var time = Math.max(transitionDuration + transitionDelay, animationDuration + animationDelay); // sometimes, browser bug node.rcEndAnimTimeout = setTimeout(function () { node.rcEndAnimTimeout = null; if (node.rcEndListener) { node.rcEndListener(); } }, time * 1000 + 200); } } function clearBrowserBugTimeout(node) { if (node.rcEndAnimTimeout) { clearTimeout(node.rcEndAnimTimeout); node.rcEndAnimTimeout = null; } } var cssAnimation = function cssAnimation(node, transitionName, endCallback) { var nameIsObj = (typeof transitionName === 'undefined' ? 'undefined' : _typeof(transitionName)) === 'object'; var className = nameIsObj ? transitionName.name : transitionName; var activeClassName = nameIsObj ? transitionName.active : transitionName + '-active'; var end = endCallback; var start = void 0; var active = void 0; if (endCallback && Object.prototype.toString.call(endCallback) === '[object Object]') { end = endCallback.end; start = endCallback.start; active = endCallback.active; } if (node.rcEndListener) { node.rcEndListener(); } node.rcEndListener = function (e) { if (e && e.target !== node) { return; } if (node.rcAnimTimeout) { clearTimeout(node.rcAnimTimeout); node.rcAnimTimeout = null; } clearBrowserBugTimeout(node); node.classList.remove(className); node.classList.remove(activeClassName); _Event2['default'].removeEndEventListener(node, node.rcEndListener); node.rcEndListener = null; // Usually this optional end is used for informing an owner of // a leave animation and telling it to remove the child. if (end) { end(); } }; _Event2['default'].addEndEventListener(node, node.rcEndListener); if (start) { start(); } node.classList.add(className); node.rcAnimTimeout = setTimeout(function () { node.rcAnimTimeout = null; node.classList.add(activeClassName); if (active) { active(); } fixBrowserByTimeout(node); }, 0); return { stop: function stop() { if (node.rcEndListener) { node.rcEndListener(); } } }; }; cssAnimation.style = function (node, style, callback) { if (node.rcEndListener) { node.rcEndListener(); } node.rcEndListener = function (e) { if (e && e.target !== node) { return; } if (node.rcAnimTimeout) { clearTimeout(node.rcAnimTimeout); node.rcAnimTimeout = null; } clearBrowserBugTimeout(node); _Event2['default'].removeEndEventListener(node, node.rcEndListener); node.rcEndListener = null; // Usually this optional callback is used for informing an owner of // a leave animation and telling it to remove the child. if (callback) { callback(); } }; _Event2['default'].addEndEventListener(node, node.rcEndListener); node.rcAnimTimeout = setTimeout(function () { for (var s in style) { if (style.hasOwnProperty(s)) { node.style[s] = style[s]; } } node.rcAnimTimeout = null; fixBrowserByTimeout(node); }, 0); }; cssAnimation.setTransition = function (node, p, value) { var property = p; var v = value; if (value === undefined) { v = property; property = ''; } property = property || ''; capitalPrefixes.forEach(function (prefix) { node.style[prefix + 'Transition' + property] = v; }); }; cssAnimation.isCssAnimationSupported = isCssAnimationSupported; exports.isCssAnimationSupported = isCssAnimationSupported; exports['default'] = cssAnimation; },{"./Event":3}],5:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var ArrowLeftOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M872 474H286.9l350.2-304c5.6-4.9 2.2-14-5.2-14h-88.5c-3.9 0-7.6 1.4-10.5 3.9L155 487.8a31.96 31.96 0 000 48.3L535.1 866c1.5 1.3 3.3 2 5.2 2h91.5c7.4 0 10.8-9.2 5.2-14L286.9 550H872c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z" } }] }, "name": "arrow-left", "theme": "outlined" }; exports.default = ArrowLeftOutlined; },{}],6:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var ArrowRightOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z" } }] }, "name": "arrow-right", "theme": "outlined" }; exports.default = ArrowRightOutlined; },{}],7:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var BarsOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M912 192H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM104 228a56 56 0 10112 0 56 56 0 10-112 0zm0 284a56 56 0 10112 0 56 56 0 10-112 0zm0 284a56 56 0 10112 0 56 56 0 10-112 0z" } }] }, "name": "bars", "theme": "outlined" }; exports.default = BarsOutlined; },{}],8:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CalendarOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zM184 392V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136H184z" } }] }, "name": "calendar", "theme": "outlined" }; exports.default = CalendarOutlined; },{}],9:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CaretDownFilled = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z" } }] }, "name": "caret-down", "theme": "filled" }; exports.default = CaretDownFilled; },{}],10:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CaretDownOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z" } }] }, "name": "caret-down", "theme": "outlined" }; exports.default = CaretDownOutlined; },{}],11:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CaretUpOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M858.9 689L530.5 308.2c-9.4-10.9-27.5-10.9-37 0L165.1 689c-12.2 14.2-1.2 35 18.5 35h656.8c19.7 0 30.7-20.8 18.5-35z" } }] }, "name": "caret-up", "theme": "outlined" }; exports.default = CaretUpOutlined; },{}],12:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CheckCircleFilled = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 01-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z" } }] }, "name": "check-circle", "theme": "filled" }; exports.default = CheckCircleFilled; },{}],13:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CheckCircleOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M699 353h-46.9c-10.2 0-19.9 4.9-25.9 13.3L469 584.3l-71.2-98.8c-6-8.3-15.6-13.3-25.9-13.3H325c-6.5 0-10.3 7.4-6.5 12.7l124.6 172.8a31.8 31.8 0 0051.7 0l210.6-292c3.9-5.3.1-12.7-6.4-12.7z" } }, { "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }] }, "name": "check-circle", "theme": "outlined" }; exports.default = CheckCircleOutlined; },{}],14:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CheckOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 00-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" } }] }, "name": "check", "theme": "outlined" }; exports.default = CheckOutlined; },{}],15:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var ClockCircleOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M686.7 638.6L544.1 535.5V288c0-4.4-3.6-8-8-8H488c-4.4 0-8 3.6-8 8v275.4c0 2.6 1.2 5 3.3 6.5l165.4 120.6c3.6 2.6 8.6 1.8 11.2-1.7l28.6-39c2.6-3.7 1.8-8.7-1.8-11.2z" } }] }, "name": "clock-circle", "theme": "outlined" }; exports.default = ClockCircleOutlined; },{}],16:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CloseCircleFilled = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm165.4 618.2l-66-.3L512 563.4l-99.3 118.4-66.1.3c-4.4 0-8-3.5-8-8 0-1.9.7-3.7 1.9-5.2l130.1-155L340.5 359a8.32 8.32 0 01-1.9-5.2c0-4.4 3.6-8 8-8l66.1.3L512 464.6l99.3-118.4 66-.3c4.4 0 8 3.5 8 8 0 1.9-.7 3.7-1.9 5.2L553.5 514l130 155c1.2 1.5 1.9 3.3 1.9 5.2 0 4.4-3.6 8-8 8z" } }] }, "name": "close-circle", "theme": "filled" }; exports.default = CloseCircleFilled; },{}],17:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CloseCircleOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M685.4 354.8c0-4.4-3.6-8-8-8l-66 .3L512 465.6l-99.3-118.4-66.1-.3c-4.4 0-8 3.5-8 8 0 1.9.7 3.7 1.9 5.2l130.1 155L340.5 670a8.32 8.32 0 00-1.9 5.2c0 4.4 3.6 8 8 8l66.1-.3L512 564.4l99.3 118.4 66 .3c4.4 0 8-3.5 8-8 0-1.9-.7-3.7-1.9-5.2L553.5 515l130.1-155c1.2-1.4 1.8-3.3 1.8-5.2z" } }, { "tag": "path", "attrs": { "d": "M512 65C264.6 65 64 265.6 64 513s200.6 448 448 448 448-200.6 448-448S759.4 65 512 65zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }] }, "name": "close-circle", "theme": "outlined" }; exports.default = CloseCircleOutlined; },{}],18:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CloseOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z" } }] }, "name": "close", "theme": "outlined" }; exports.default = CloseOutlined; },{}],19:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var CopyOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M832 64H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496v688c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V96c0-17.7-14.3-32-32-32zM704 192H192c-17.7 0-32 14.3-32 32v530.7c0 8.5 3.4 16.6 9.4 22.6l173.3 173.3c2.2 2.2 4.7 4 7.4 5.5v1.9h4.2c3.5 1.3 7.2 2 11 2H704c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM350 856.2L263.9 770H350v86.2zM664 888H414V746c0-22.1-17.9-40-40-40H232V264h432v624z" } }] }, "name": "copy", "theme": "outlined" }; exports.default = CopyOutlined; },{}],20:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var DeleteOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M360 184h-8c4.4 0 8-3.6 8-8v8h304v-8c0 4.4 3.6 8 8 8h-8v72h72v-80c0-35.3-28.7-64-64-64H352c-35.3 0-64 28.7-64 64v80h72v-72zm504 72H160c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h60.4l24.7 523c1.6 34.1 29.8 61 63.9 61h454c34.2 0 62.3-26.8 63.9-61l24.7-523H888c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM731.3 840H292.7l-24.2-512h487l-24.2 512z" } }] }, "name": "delete", "theme": "outlined" }; exports.default = DeleteOutlined; },{}],21:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var DoubleLeftOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M272.9 512l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L186.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H532c6.7 0 10.4-7.7 6.3-12.9L272.9 512zm304 0l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L490.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H836c6.7 0 10.4-7.7 6.3-12.9L576.9 512z" } }] }, "name": "double-left", "theme": "outlined" }; exports.default = DoubleLeftOutlined; },{}],22:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var DoubleRightOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M533.2 492.3L277.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H188c-6.7 0-10.4 7.7-6.3 12.9L447.1 512 181.7 851.1A7.98 7.98 0 00188 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5zm304 0L581.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H492c-6.7 0-10.4 7.7-6.3 12.9L751.1 512 485.7 851.1A7.98 7.98 0 00492 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5z" } }] }, "name": "double-right", "theme": "outlined" }; exports.default = DoubleRightOutlined; },{}],23:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var DownOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z" } }] }, "name": "down", "theme": "outlined" }; exports.default = DownOutlined; },{}],24:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var DownloadOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M505.7 661a8 8 0 0012.6 0l112-141.7c4.1-5.2.4-12.9-6.3-12.9h-74.1V168c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v338.3H400c-6.7 0-10.4 7.7-6.3 12.9l112 141.8zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z" } }] }, "name": "download", "theme": "outlined" }; exports.default = DownloadOutlined; },{}],25:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var EditOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M257.7 752c2 0 4-.2 6-.5L431.9 722c2-.4 3.9-1.3 5.3-2.8l423.9-423.9a9.96 9.96 0 000-14.1L694.9 114.9c-1.9-1.9-4.4-2.9-7.1-2.9s-5.2 1-7.1 2.9L256.8 538.8c-1.5 1.5-2.4 3.3-2.8 5.3l-29.5 168.2a33.5 33.5 0 009.4 29.8c6.6 6.4 14.9 9.9 23.8 9.9zm67.4-174.4L687.8 215l73.3 73.3-362.7 362.6-88.9 15.7 15.6-89zM880 836H144c-17.7 0-32 14.3-32 32v36c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-36c0-17.7-14.3-32-32-32z" } }] }, "name": "edit", "theme": "outlined" }; exports.default = EditOutlined; },{}],26:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var EllipsisOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M176 511a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0z" } }] }, "name": "ellipsis", "theme": "outlined" }; exports.default = EllipsisOutlined; },{}],27:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var EnterOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M864 170h-60c-4.4 0-8 3.6-8 8v518H310v-73c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 000 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-75h498c35.3 0 64-28.7 64-64V178c0-4.4-3.6-8-8-8z" } }] }, "name": "enter", "theme": "outlined" }; exports.default = EnterOutlined; },{}],28:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var ExclamationCircleFilled = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z" } }] }, "name": "exclamation-circle", "theme": "filled" }; exports.default = ExclamationCircleFilled; },{}],29:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var ExclamationCircleOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z" } }] }, "name": "exclamation-circle", "theme": "outlined" }; exports.default = ExclamationCircleOutlined; },{}],30:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var EyeInvisibleOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M942.2 486.2Q889.47 375.11 816.7 305l-50.88 50.88C807.31 395.53 843.45 447.4 874.7 512 791.5 684.2 673.4 766 512 766q-72.67 0-133.87-22.38L323 798.75Q408 838 512 838q288.3 0 430.2-300.3a60.29 60.29 0 000-51.5zm-63.57-320.64L836 122.88a8 8 0 00-11.32 0L715.31 232.2Q624.86 186 512 186q-288.3 0-430.2 300.3a60.3 60.3 0 000 51.5q56.69 119.4 136.5 191.41L112.48 835a8 8 0 000 11.31L155.17 889a8 8 0 0011.31 0l712.15-712.12a8 8 0 000-11.32zM149.3 512C232.6 339.8 350.7 258 512 258c54.54 0 104.13 9.36 149.12 28.39l-70.3 70.3a176 176 0 00-238.13 238.13l-83.42 83.42C223.1 637.49 183.3 582.28 149.3 512zm246.7 0a112.11 112.11 0 01146.2-106.69L401.31 546.2A112 112 0 01396 512z" } }, { "tag": "path", "attrs": { "d": "M508 624c-3.46 0-6.87-.16-10.25-.47l-52.82 52.82a176.09 176.09 0 00227.42-227.42l-52.82 52.82c.31 3.38.47 6.79.47 10.25a111.94 111.94 0 01-112 112z" } }] }, "name": "eye-invisible", "theme": "outlined" }; exports.default = EyeInvisibleOutlined; },{}],31:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var EyeOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z" } }] }, "name": "eye", "theme": "outlined" }; exports.default = EyeOutlined; },{}],32:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var FileOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0042 42h216v494z" } }] }, "name": "file", "theme": "outlined" }; exports.default = FileOutlined; },{}],33:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var FileTwoTone = { "icon": function render(primaryColor, secondaryColor) { return { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M534 352V136H232v752h560V394H576a42 42 0 01-42-42z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0042 42h216v494z", "fill": primaryColor } }] }; }, "name": "file", "theme": "twotone" }; exports.default = FileTwoTone; },{}],34:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var FilterFilled = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M349 838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V642H349v196zm531.1-684H143.9c-24.5 0-39.8 26.7-27.5 48l221.3 376h348.8l221.3-376c12.1-21.3-3.2-48-27.7-48z" } }] }, "name": "filter", "theme": "filled" }; exports.default = FilterFilled; },{}],35:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var FolderOpenOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 00-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z" } }] }, "name": "folder-open", "theme": "outlined" }; exports.default = FolderOpenOutlined; },{}],36:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var FolderOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M880 298.4H521L403.7 186.2a8.15 8.15 0 00-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32zM840 768H184V256h188.5l119.6 114.4H840V768z" } }] }, "name": "folder", "theme": "outlined" }; exports.default = FolderOutlined; },{}],37:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var InfoCircleFilled = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 010-96 48.01 48.01 0 010 96z" } }] }, "name": "info-circle", "theme": "filled" }; exports.default = InfoCircleFilled; },{}],38:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var InfoCircleOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M464 336a48 48 0 1096 0 48 48 0 10-96 0zm72 112h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z" } }] }, "name": "info-circle", "theme": "outlined" }; exports.default = InfoCircleOutlined; },{}],39:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var LeftOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z" } }] }, "name": "left", "theme": "outlined" }; exports.default = LeftOutlined; },{}],40:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var LoadingOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z" } }] }, "name": "loading", "theme": "outlined" }; exports.default = LoadingOutlined; },{}],41:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var MinusSquareOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M328 544h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z" } }, { "tag": "path", "attrs": { "d": "M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z" } }] }, "name": "minus-square", "theme": "outlined" }; exports.default = MinusSquareOutlined; },{}],42:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var PaperClipOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M779.3 196.6c-94.2-94.2-247.6-94.2-341.7 0l-261 260.8c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l261-260.8c32.4-32.4 75.5-50.2 121.3-50.2s88.9 17.8 121.2 50.2c32.4 32.4 50.2 75.5 50.2 121.2 0 45.8-17.8 88.8-50.2 121.2l-266 265.9-43.1 43.1c-40.3 40.3-105.8 40.3-146.1 0-19.5-19.5-30.2-45.4-30.2-73s10.7-53.5 30.2-73l263.9-263.8c6.7-6.6 15.5-10.3 24.9-10.3h.1c9.4 0 18.1 3.7 24.7 10.3 6.7 6.7 10.3 15.5 10.3 24.9 0 9.3-3.7 18.1-10.3 24.7L372.4 653c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l215.6-215.6c19.9-19.9 30.8-46.3 30.8-74.4s-11-54.6-30.8-74.4c-41.1-41.1-107.9-41-149 0L463 364 224.8 602.1A172.22 172.22 0 00174 724.8c0 46.3 18.1 89.8 50.8 122.5 33.9 33.8 78.3 50.7 122.7 50.7 44.4 0 88.8-16.9 122.6-50.7l309.2-309C824.8 492.7 850 432 850 367.5c.1-64.6-25.1-125.3-70.7-170.9z" } }] }, "name": "paper-clip", "theme": "outlined" }; exports.default = PaperClipOutlined; },{}],43:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var PictureTwoTone = { "icon": function render(primaryColor, secondaryColor) { return { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136v-39.9l138.5-164.3 150.1 178L658.1 489 888 761.6V792zm0-129.8L664.2 396.8c-3.2-3.8-9-3.8-12.2 0L424.6 666.4l-144-170.7c-3.2-3.8-9-3.8-12.2 0L136 652.7V232h752v430.2z", "fill": primaryColor } }, { "tag": "path", "attrs": { "d": "M424.6 765.8l-150.1-178L136 752.1V792h752v-30.4L658.1 489z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M136 652.7l132.4-157c3.2-3.8 9-3.8 12.2 0l144 170.7L652 396.8c3.2-3.8 9-3.8 12.2 0L888 662.2V232H136v420.7zM304 280a88 88 0 110 176 88 88 0 010-176z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M276 368a28 28 0 1056 0 28 28 0 10-56 0z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M304 456a88 88 0 100-176 88 88 0 000 176zm0-116c15.5 0 28 12.5 28 28s-12.5 28-28 28-28-12.5-28-28 12.5-28 28-28z", "fill": primaryColor } }] }; }, "name": "picture", "theme": "twotone" }; exports.default = PictureTwoTone; },{}],44:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var PlusOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z" } }, { "tag": "path", "attrs": { "d": "M176 474h672q8 0 8 8v60q0 8-8 8H176q-8 0-8-8v-60q0-8 8-8z" } }] }, "name": "plus", "theme": "outlined" }; exports.default = PlusOutlined; },{}],45:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var PlusSquareOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z" } }, { "tag": "path", "attrs": { "d": "M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z" } }] }, "name": "plus-square", "theme": "outlined" }; exports.default = PlusSquareOutlined; },{}],46:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var RedoOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M758.2 839.1C851.8 765.9 912 651.9 912 523.9 912 303 733.5 124.3 512.6 124 291.4 123.7 112 302.8 112 523.9c0 125.2 57.5 236.9 147.6 310.2 3.5 2.8 8.6 2.2 11.4-1.3l39.4-50.5c2.7-3.4 2.1-8.3-1.2-11.1-8.1-6.6-15.9-13.7-23.4-21.2a318.64 318.64 0 01-68.6-101.7C200.4 609 192 567.1 192 523.9s8.4-85.1 25.1-124.5c16.1-38.1 39.2-72.3 68.6-101.7 29.4-29.4 63.6-52.5 101.7-68.6C426.9 212.4 468.8 204 512 204s85.1 8.4 124.5 25.1c38.1 16.1 72.3 39.2 101.7 68.6 29.4 29.4 52.5 63.6 68.6 101.7 16.7 39.4 25.1 81.3 25.1 124.5s-8.4 85.1-25.1 124.5a318.64 318.64 0 01-68.6 101.7c-9.3 9.3-19.1 18-29.3 26L668.2 724a8 8 0 00-14.1 3l-39.6 162.2c-1.2 5 2.6 9.9 7.7 9.9l167 .8c6.7 0 10.5-7.7 6.3-12.9l-37.3-47.9z" } }] }, "name": "redo", "theme": "outlined" }; exports.default = RedoOutlined; },{}],47:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var RightOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z" } }] }, "name": "right", "theme": "outlined" }; exports.default = RightOutlined; },{}],48:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var RotateLeftOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M672 418H144c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H188V494h440v326z" } }, { "tag": "path", "attrs": { "d": "M819.3 328.5c-78.8-100.7-196-153.6-314.6-154.2l-.2-64c0-6.5-7.6-10.1-12.6-6.1l-128 101c-4 3.1-3.9 9.1 0 12.3L492 318.6c5.1 4 12.7.4 12.6-6.1v-63.9c12.9.1 25.9.9 38.8 2.5 42.1 5.2 82.1 18.2 119 38.7 38.1 21.2 71.2 49.7 98.4 84.3 27.1 34.7 46.7 73.7 58.1 115.8a325.95 325.95 0 016.5 140.9h74.9c14.8-103.6-11.3-213-81-302.3z" } }] }, "name": "rotate-left", "theme": "outlined" }; exports.default = RotateLeftOutlined; },{}],49:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var RotateRightOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M480.5 251.2c13-1.6 25.9-2.4 38.8-2.5v63.9c0 6.5 7.5 10.1 12.6 6.1L660 217.6c4-3.2 4-9.2 0-12.3l-128-101c-5.1-4-12.6-.4-12.6 6.1l-.2 64c-118.6.5-235.8 53.4-314.6 154.2A399.75 399.75 0 00123.5 631h74.9c-.9-5.3-1.7-10.7-2.4-16.1-5.1-42.1-2.1-84.1 8.9-124.8 11.4-42.2 31-81.1 58.1-115.8 27.2-34.7 60.3-63.2 98.4-84.3 37-20.6 76.9-33.6 119.1-38.8z" } }, { "tag": "path", "attrs": { "d": "M880 418H352c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H396V494h440v326z" } }] }, "name": "rotate-right", "theme": "outlined" }; exports.default = RotateRightOutlined; },{}],50:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var SearchOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M909.6 854.5L649.9 594.8C690.2 542.7 712 479 712 412c0-80.2-31.3-155.4-87.9-212.1-56.6-56.7-132-87.9-212.1-87.9s-155.5 31.3-212.1 87.9C143.2 256.5 112 331.8 112 412c0 80.1 31.3 155.5 87.9 212.1C256.5 680.8 331.8 712 412 712c67 0 130.6-21.8 182.7-62l259.7 259.6a8.2 8.2 0 0011.6 0l43.6-43.5a8.2 8.2 0 000-11.6zM570.4 570.4C528 612.7 471.8 636 412 636s-116-23.3-158.4-65.6C211.3 528 188 471.8 188 412s23.3-116.1 65.6-158.4C296 211.3 352.2 188 412 188s116.1 23.2 158.4 65.6S636 352.2 636 412s-23.3 116.1-65.6 158.4z" } }] }, "name": "search", "theme": "outlined" }; exports.default = SearchOutlined; },{}],51:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var StarFilled = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 00.6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0046.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3z" } }] }, "name": "star", "theme": "filled" }; exports.default = StarFilled; },{}],52:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var SwapRightOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M873.1 596.2l-164-208A32 32 0 00684 376h-64.8c-6.7 0-10.4 7.7-6.3 13l144.3 183H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h695.9c26.8 0 41.7-30.8 25.2-51.8z" } }] }, "name": "swap-right", "theme": "outlined" }; exports.default = SwapRightOutlined; },{}],53:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var UpOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M890.5 755.3L537.9 269.2c-12.8-17.6-39-17.6-51.7 0L133.5 755.3A8 8 0 00140 768h75c5.1 0 9.9-2.5 12.9-6.6L512 369.8l284.1 391.6c3 4.1 7.8 6.6 12.9 6.6h75c6.5 0 10.3-7.4 6.5-12.7z" } }] }, "name": "up", "theme": "outlined" }; exports.default = UpOutlined; },{}],54:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var VerticalAlignTopOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M859.9 168H164.1c-4.5 0-8.1 3.6-8.1 8v60c0 4.4 3.6 8 8.1 8h695.8c4.5 0 8.1-3.6 8.1-8v-60c0-4.4-3.6-8-8.1-8zM518.3 355a8 8 0 00-12.6 0l-112 141.7a7.98 7.98 0 006.3 12.9h73.9V848c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V509.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 355z" } }] }, "name": "vertical-align-top", "theme": "outlined" }; exports.default = VerticalAlignTopOutlined; },{}],55:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var WarningFilled = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M955.7 856l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zM480 416c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v184c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V416zm32 352a48.01 48.01 0 010-96 48.01 48.01 0 010 96z" } }] }, "name": "warning", "theme": "filled" }; exports.default = WarningFilled; },{}],56:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var ZoomInOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M637 443H519V309c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v134H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h118v134c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V519h118c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z" } }] }, "name": "zoom-in", "theme": "outlined" }; exports.default = ZoomInOutlined; },{}],57:[function(require,module,exports){ "use strict"; // This icon file is generated automatically. Object.defineProperty(exports, "__esModule", { value: true }); var ZoomOutOutlined = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M637 443H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h312c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z" } }] }, "name": "zoom-out", "theme": "outlined" }; exports.default = ZoomOutOutlined; },{}],58:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ArrowLeftOutlined = _interopRequireDefault(require('./lib/icons/ArrowLeftOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _ArrowLeftOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/ArrowLeftOutlined":114}],59:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ArrowRightOutlined = _interopRequireDefault(require('./lib/icons/ArrowRightOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _ArrowRightOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/ArrowRightOutlined":115}],60:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _BarsOutlined = _interopRequireDefault(require('./lib/icons/BarsOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _BarsOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/BarsOutlined":116}],61:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CalendarOutlined = _interopRequireDefault(require('./lib/icons/CalendarOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CalendarOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/CalendarOutlined":117}],62:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CaretDownFilled = _interopRequireDefault(require('./lib/icons/CaretDownFilled')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CaretDownFilled; exports.default = _default; module.exports = _default; },{"./lib/icons/CaretDownFilled":118}],63:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CaretDownOutlined = _interopRequireDefault(require('./lib/icons/CaretDownOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CaretDownOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/CaretDownOutlined":119}],64:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CaretUpOutlined = _interopRequireDefault(require('./lib/icons/CaretUpOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CaretUpOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/CaretUpOutlined":120}],65:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CheckCircleFilled = _interopRequireDefault(require('./lib/icons/CheckCircleFilled')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CheckCircleFilled; exports.default = _default; module.exports = _default; },{"./lib/icons/CheckCircleFilled":121}],66:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CheckCircleOutlined = _interopRequireDefault(require('./lib/icons/CheckCircleOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CheckCircleOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/CheckCircleOutlined":122}],67:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CheckOutlined = _interopRequireDefault(require('./lib/icons/CheckOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CheckOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/CheckOutlined":123}],68:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ClockCircleOutlined = _interopRequireDefault(require('./lib/icons/ClockCircleOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _ClockCircleOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/ClockCircleOutlined":124}],69:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CloseCircleFilled = _interopRequireDefault(require('./lib/icons/CloseCircleFilled')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CloseCircleFilled; exports.default = _default; module.exports = _default; },{"./lib/icons/CloseCircleFilled":125}],70:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CloseCircleOutlined = _interopRequireDefault(require('./lib/icons/CloseCircleOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CloseCircleOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/CloseCircleOutlined":126}],71:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CloseOutlined = _interopRequireDefault(require('./lib/icons/CloseOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CloseOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/CloseOutlined":127}],72:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _CopyOutlined = _interopRequireDefault(require('./lib/icons/CopyOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _CopyOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/CopyOutlined":128}],73:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _DeleteOutlined = _interopRequireDefault(require('./lib/icons/DeleteOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _DeleteOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/DeleteOutlined":129}],74:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _DoubleLeftOutlined = _interopRequireDefault(require('./lib/icons/DoubleLeftOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _DoubleLeftOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/DoubleLeftOutlined":130}],75:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _DoubleRightOutlined = _interopRequireDefault(require('./lib/icons/DoubleRightOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _DoubleRightOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/DoubleRightOutlined":131}],76:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _DownOutlined = _interopRequireDefault(require('./lib/icons/DownOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _DownOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/DownOutlined":132}],77:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _DownloadOutlined = _interopRequireDefault(require('./lib/icons/DownloadOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _DownloadOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/DownloadOutlined":133}],78:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _EditOutlined = _interopRequireDefault(require('./lib/icons/EditOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _EditOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/EditOutlined":134}],79:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _EllipsisOutlined = _interopRequireDefault(require('./lib/icons/EllipsisOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _EllipsisOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/EllipsisOutlined":135}],80:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _EnterOutlined = _interopRequireDefault(require('./lib/icons/EnterOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _EnterOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/EnterOutlined":136}],81:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ExclamationCircleFilled = _interopRequireDefault(require('./lib/icons/ExclamationCircleFilled')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _ExclamationCircleFilled; exports.default = _default; module.exports = _default; },{"./lib/icons/ExclamationCircleFilled":137}],82:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ExclamationCircleOutlined = _interopRequireDefault(require('./lib/icons/ExclamationCircleOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _ExclamationCircleOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/ExclamationCircleOutlined":138}],83:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _EyeInvisibleOutlined = _interopRequireDefault(require('./lib/icons/EyeInvisibleOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _EyeInvisibleOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/EyeInvisibleOutlined":139}],84:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _EyeOutlined = _interopRequireDefault(require('./lib/icons/EyeOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _EyeOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/EyeOutlined":140}],85:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _FileOutlined = _interopRequireDefault(require('./lib/icons/FileOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _FileOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/FileOutlined":141}],86:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _FileTwoTone = _interopRequireDefault(require('./lib/icons/FileTwoTone')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _FileTwoTone; exports.default = _default; module.exports = _default; },{"./lib/icons/FileTwoTone":142}],87:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _FilterFilled = _interopRequireDefault(require('./lib/icons/FilterFilled')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _FilterFilled; exports.default = _default; module.exports = _default; },{"./lib/icons/FilterFilled":143}],88:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _FolderOpenOutlined = _interopRequireDefault(require('./lib/icons/FolderOpenOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _FolderOpenOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/FolderOpenOutlined":144}],89:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _FolderOutlined = _interopRequireDefault(require('./lib/icons/FolderOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _FolderOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/FolderOutlined":145}],90:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _InfoCircleFilled = _interopRequireDefault(require('./lib/icons/InfoCircleFilled')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _InfoCircleFilled; exports.default = _default; module.exports = _default; },{"./lib/icons/InfoCircleFilled":146}],91:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _InfoCircleOutlined = _interopRequireDefault(require('./lib/icons/InfoCircleOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _InfoCircleOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/InfoCircleOutlined":147}],92:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _LeftOutlined = _interopRequireDefault(require('./lib/icons/LeftOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _LeftOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/LeftOutlined":148}],93:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _LoadingOutlined = _interopRequireDefault(require('./lib/icons/LoadingOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _LoadingOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/LoadingOutlined":149}],94:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _MinusSquareOutlined = _interopRequireDefault(require('./lib/icons/MinusSquareOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _MinusSquareOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/MinusSquareOutlined":150}],95:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _PaperClipOutlined = _interopRequireDefault(require('./lib/icons/PaperClipOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _PaperClipOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/PaperClipOutlined":151}],96:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _PictureTwoTone = _interopRequireDefault(require('./lib/icons/PictureTwoTone')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _PictureTwoTone; exports.default = _default; module.exports = _default; },{"./lib/icons/PictureTwoTone":152}],97:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _PlusOutlined = _interopRequireDefault(require('./lib/icons/PlusOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _PlusOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/PlusOutlined":153}],98:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _PlusSquareOutlined = _interopRequireDefault(require('./lib/icons/PlusSquareOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _PlusSquareOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/PlusSquareOutlined":154}],99:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _RedoOutlined = _interopRequireDefault(require('./lib/icons/RedoOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _RedoOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/RedoOutlined":155}],100:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _RightOutlined = _interopRequireDefault(require('./lib/icons/RightOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _RightOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/RightOutlined":156}],101:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _RotateLeftOutlined = _interopRequireDefault(require('./lib/icons/RotateLeftOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _RotateLeftOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/RotateLeftOutlined":157}],102:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _RotateRightOutlined = _interopRequireDefault(require('./lib/icons/RotateRightOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _RotateRightOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/RotateRightOutlined":158}],103:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _SearchOutlined = _interopRequireDefault(require('./lib/icons/SearchOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _SearchOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/SearchOutlined":159}],104:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _StarFilled = _interopRequireDefault(require('./lib/icons/StarFilled')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _StarFilled; exports.default = _default; module.exports = _default; },{"./lib/icons/StarFilled":160}],105:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _SwapRightOutlined = _interopRequireDefault(require('./lib/icons/SwapRightOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _SwapRightOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/SwapRightOutlined":161}],106:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _UpOutlined = _interopRequireDefault(require('./lib/icons/UpOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _UpOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/UpOutlined":162}],107:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _VerticalAlignTopOutlined = _interopRequireDefault(require('./lib/icons/VerticalAlignTopOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _VerticalAlignTopOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/VerticalAlignTopOutlined":163}],108:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _WarningFilled = _interopRequireDefault(require('./lib/icons/WarningFilled')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _WarningFilled; exports.default = _default; module.exports = _default; },{"./lib/icons/WarningFilled":164}],109:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ZoomInOutlined = _interopRequireDefault(require('./lib/icons/ZoomInOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _ZoomInOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/ZoomInOutlined":165}],110:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ZoomOutOutlined = _interopRequireDefault(require('./lib/icons/ZoomOutOutlined')); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _default = _ZoomOutOutlined; exports.default = _default; module.exports = _default; },{"./lib/icons/ZoomOutOutlined":166}],111:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _IconBase = _interopRequireDefault(require("./IconBase")); var _twoTonePrimaryColor = require("./twoTonePrimaryColor"); var _utils = require("../utils"); // Initial setting // should move it to antd main repo? (0, _twoTonePrimaryColor.setTwoToneColor)('#1890ff'); var Icon = React.forwardRef(function (props, ref) { var className = props.className, icon = props.icon, spin = props.spin, rotate = props.rotate, tabIndex = props.tabIndex, onClick = props.onClick, twoToneColor = props.twoToneColor, restProps = (0, _objectWithoutProperties2.default)(props, ["className", "icon", "spin", "rotate", "tabIndex", "onClick", "twoToneColor"]); var classString = (0, _classnames.default)('anticon', (0, _defineProperty2.default)({}, "anticon-".concat(icon.name), Boolean(icon.name)), className); var svgClassString = (0, _classnames.default)({ 'anticon-spin': !!spin || icon.name === 'loading' }); var iconTabIndex = tabIndex; if (iconTabIndex === undefined && onClick) { iconTabIndex = -1; } var svgStyle = rotate ? { msTransform: "rotate(".concat(rotate, "deg)"), transform: "rotate(".concat(rotate, "deg)") } : undefined; var _normalizeTwoToneColo = (0, _utils.normalizeTwoToneColors)(twoToneColor), _normalizeTwoToneColo2 = (0, _slicedToArray2.default)(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1]; return React.createElement("span", Object.assign({ role: "img", "aria-label": icon.name }, restProps, { ref: ref, tabIndex: iconTabIndex, onClick: onClick, className: classString }), React.createElement(_IconBase.default, { className: svgClassString, icon: icon, primaryColor: primaryColor, secondaryColor: secondaryColor, style: svgStyle })); }); Icon.displayName = 'AntdIcon'; Icon.getTwoToneColor = _twoTonePrimaryColor.getTwoToneColor; Icon.setTwoToneColor = _twoTonePrimaryColor.setTwoToneColor; var _default = Icon; exports.default = _default; },{"../utils":167,"./IconBase":112,"./twoTonePrimaryColor":113,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"react":"react"}],112:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _utils = require("../utils"); var twoToneColorPalette = { primaryColor: '#333', secondaryColor: '#E6E6E6', calculated: false }; function setTwoToneColors(_ref) { var primaryColor = _ref.primaryColor, secondaryColor = _ref.secondaryColor; twoToneColorPalette.primaryColor = primaryColor; twoToneColorPalette.secondaryColor = secondaryColor || (0, _utils.getSecondaryColor)(primaryColor); twoToneColorPalette.calculated = !!secondaryColor; } function getTwoToneColors() { return (0, _objectSpread2.default)({}, twoToneColorPalette); } var IconBase = function IconBase(props) { var icon = props.icon, className = props.className, onClick = props.onClick, style = props.style, primaryColor = props.primaryColor, secondaryColor = props.secondaryColor, restProps = (0, _objectWithoutProperties2.default)(props, ["icon", "className", "onClick", "style", "primaryColor", "secondaryColor"]); var colors = twoToneColorPalette; if (primaryColor) { colors = { primaryColor: primaryColor, secondaryColor: secondaryColor || (0, _utils.getSecondaryColor)(primaryColor) }; } (0, _utils.useInsertStyles)(); (0, _utils.warning)((0, _utils.isIconDefinition)(icon), "icon should be icon definiton, but got ".concat(icon)); if (!(0, _utils.isIconDefinition)(icon)) { return null; } var target = icon; if (target && typeof target.icon === 'function') { target = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, target), {}, { icon: target.icon(colors.primaryColor, colors.secondaryColor) }); } return (0, _utils.generate)(target.icon, "svg-".concat(target.name), (0, _objectSpread2.default)({ className: className, onClick: onClick, style: style, 'data-icon': target.name, width: '1em', height: '1em', fill: 'currentColor', 'aria-hidden': 'true' }, restProps)); }; IconBase.displayName = 'IconReact'; IconBase.getTwoToneColors = getTwoToneColors; IconBase.setTwoToneColors = setTwoToneColors; var _default = IconBase; exports.default = _default; },{"../utils":167,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200}],113:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.setTwoToneColor = setTwoToneColor; exports.getTwoToneColor = getTwoToneColor; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _IconBase = _interopRequireDefault(require("./IconBase")); var _utils = require("../utils"); function setTwoToneColor(twoToneColor) { var _normalizeTwoToneColo = (0, _utils.normalizeTwoToneColors)(twoToneColor), _normalizeTwoToneColo2 = (0, _slicedToArray2.default)(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1]; return _IconBase.default.setTwoToneColors({ primaryColor: primaryColor, secondaryColor: secondaryColor }); } function getTwoToneColor() { var colors = _IconBase.default.getTwoToneColors(); if (!colors.calculated) { return colors.primaryColor; } return [colors.primaryColor, colors.secondaryColor]; } },{"../utils":167,"./IconBase":112,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204}],114:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _ArrowLeftOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/ArrowLeftOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var ArrowLeftOutlined = function ArrowLeftOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _ArrowLeftOutlined.default })); }; ArrowLeftOutlined.displayName = 'ArrowLeftOutlined'; var _default = React.forwardRef(ArrowLeftOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/ArrowLeftOutlined":5,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],115:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _ArrowRightOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/ArrowRightOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var ArrowRightOutlined = function ArrowRightOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _ArrowRightOutlined.default })); }; ArrowRightOutlined.displayName = 'ArrowRightOutlined'; var _default = React.forwardRef(ArrowRightOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/ArrowRightOutlined":6,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],116:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _BarsOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/BarsOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var BarsOutlined = function BarsOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _BarsOutlined.default })); }; BarsOutlined.displayName = 'BarsOutlined'; var _default = React.forwardRef(BarsOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/BarsOutlined":7,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],117:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CalendarOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CalendarOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CalendarOutlined = function CalendarOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CalendarOutlined.default })); }; CalendarOutlined.displayName = 'CalendarOutlined'; var _default = React.forwardRef(CalendarOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CalendarOutlined":8,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],118:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CaretDownFilled = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CaretDownFilled")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CaretDownFilled = function CaretDownFilled(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CaretDownFilled.default })); }; CaretDownFilled.displayName = 'CaretDownFilled'; var _default = React.forwardRef(CaretDownFilled); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CaretDownFilled":9,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],119:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CaretDownOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CaretDownOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CaretDownOutlined = function CaretDownOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CaretDownOutlined.default })); }; CaretDownOutlined.displayName = 'CaretDownOutlined'; var _default = React.forwardRef(CaretDownOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CaretDownOutlined":10,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],120:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CaretUpOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CaretUpOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CaretUpOutlined = function CaretUpOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CaretUpOutlined.default })); }; CaretUpOutlined.displayName = 'CaretUpOutlined'; var _default = React.forwardRef(CaretUpOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CaretUpOutlined":11,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],121:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CheckCircleFilled = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CheckCircleFilled")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CheckCircleFilled = function CheckCircleFilled(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CheckCircleFilled.default })); }; CheckCircleFilled.displayName = 'CheckCircleFilled'; var _default = React.forwardRef(CheckCircleFilled); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CheckCircleFilled":12,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],122:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CheckCircleOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CheckCircleOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CheckCircleOutlined = function CheckCircleOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CheckCircleOutlined.default })); }; CheckCircleOutlined.displayName = 'CheckCircleOutlined'; var _default = React.forwardRef(CheckCircleOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CheckCircleOutlined":13,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],123:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CheckOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CheckOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CheckOutlined = function CheckOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CheckOutlined.default })); }; CheckOutlined.displayName = 'CheckOutlined'; var _default = React.forwardRef(CheckOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CheckOutlined":14,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],124:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _ClockCircleOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/ClockCircleOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var ClockCircleOutlined = function ClockCircleOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _ClockCircleOutlined.default })); }; ClockCircleOutlined.displayName = 'ClockCircleOutlined'; var _default = React.forwardRef(ClockCircleOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/ClockCircleOutlined":15,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],125:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CloseCircleFilled")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CloseCircleFilled = function CloseCircleFilled(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CloseCircleFilled.default })); }; CloseCircleFilled.displayName = 'CloseCircleFilled'; var _default = React.forwardRef(CloseCircleFilled); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CloseCircleFilled":16,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],126:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CloseCircleOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CloseCircleOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CloseCircleOutlined = function CloseCircleOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CloseCircleOutlined.default })); }; CloseCircleOutlined.displayName = 'CloseCircleOutlined'; var _default = React.forwardRef(CloseCircleOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CloseCircleOutlined":17,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],127:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CloseOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CloseOutlined = function CloseOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CloseOutlined.default })); }; CloseOutlined.displayName = 'CloseOutlined'; var _default = React.forwardRef(CloseOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CloseOutlined":18,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],128:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _CopyOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/CopyOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var CopyOutlined = function CopyOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _CopyOutlined.default })); }; CopyOutlined.displayName = 'CopyOutlined'; var _default = React.forwardRef(CopyOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/CopyOutlined":19,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],129:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _DeleteOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/DeleteOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var DeleteOutlined = function DeleteOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _DeleteOutlined.default })); }; DeleteOutlined.displayName = 'DeleteOutlined'; var _default = React.forwardRef(DeleteOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/DeleteOutlined":20,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],130:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _DoubleLeftOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/DoubleLeftOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var DoubleLeftOutlined = function DoubleLeftOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _DoubleLeftOutlined.default })); }; DoubleLeftOutlined.displayName = 'DoubleLeftOutlined'; var _default = React.forwardRef(DoubleLeftOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/DoubleLeftOutlined":21,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],131:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _DoubleRightOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/DoubleRightOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var DoubleRightOutlined = function DoubleRightOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _DoubleRightOutlined.default })); }; DoubleRightOutlined.displayName = 'DoubleRightOutlined'; var _default = React.forwardRef(DoubleRightOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/DoubleRightOutlined":22,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],132:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _DownOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/DownOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var DownOutlined = function DownOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _DownOutlined.default })); }; DownOutlined.displayName = 'DownOutlined'; var _default = React.forwardRef(DownOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/DownOutlined":23,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],133:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _DownloadOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/DownloadOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var DownloadOutlined = function DownloadOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _DownloadOutlined.default })); }; DownloadOutlined.displayName = 'DownloadOutlined'; var _default = React.forwardRef(DownloadOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/DownloadOutlined":24,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],134:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _EditOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/EditOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var EditOutlined = function EditOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _EditOutlined.default })); }; EditOutlined.displayName = 'EditOutlined'; var _default = React.forwardRef(EditOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/EditOutlined":25,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],135:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _EllipsisOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/EllipsisOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var EllipsisOutlined = function EllipsisOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _EllipsisOutlined.default })); }; EllipsisOutlined.displayName = 'EllipsisOutlined'; var _default = React.forwardRef(EllipsisOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/EllipsisOutlined":26,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],136:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _EnterOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/EnterOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var EnterOutlined = function EnterOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _EnterOutlined.default })); }; EnterOutlined.displayName = 'EnterOutlined'; var _default = React.forwardRef(EnterOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/EnterOutlined":27,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],137:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _ExclamationCircleFilled = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/ExclamationCircleFilled")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var ExclamationCircleFilled = function ExclamationCircleFilled(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _ExclamationCircleFilled.default })); }; ExclamationCircleFilled.displayName = 'ExclamationCircleFilled'; var _default = React.forwardRef(ExclamationCircleFilled); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/ExclamationCircleFilled":28,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],138:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _ExclamationCircleOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/ExclamationCircleOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var ExclamationCircleOutlined = function ExclamationCircleOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _ExclamationCircleOutlined.default })); }; ExclamationCircleOutlined.displayName = 'ExclamationCircleOutlined'; var _default = React.forwardRef(ExclamationCircleOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/ExclamationCircleOutlined":29,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],139:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _EyeInvisibleOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/EyeInvisibleOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var EyeInvisibleOutlined = function EyeInvisibleOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _EyeInvisibleOutlined.default })); }; EyeInvisibleOutlined.displayName = 'EyeInvisibleOutlined'; var _default = React.forwardRef(EyeInvisibleOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/EyeInvisibleOutlined":30,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],140:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _EyeOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/EyeOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var EyeOutlined = function EyeOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _EyeOutlined.default })); }; EyeOutlined.displayName = 'EyeOutlined'; var _default = React.forwardRef(EyeOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/EyeOutlined":31,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],141:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _FileOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/FileOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var FileOutlined = function FileOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _FileOutlined.default })); }; FileOutlined.displayName = 'FileOutlined'; var _default = React.forwardRef(FileOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/FileOutlined":32,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],142:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _FileTwoTone = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/FileTwoTone")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var FileTwoTone = function FileTwoTone(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _FileTwoTone.default })); }; FileTwoTone.displayName = 'FileTwoTone'; var _default = React.forwardRef(FileTwoTone); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/FileTwoTone":33,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],143:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _FilterFilled = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/FilterFilled")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var FilterFilled = function FilterFilled(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _FilterFilled.default })); }; FilterFilled.displayName = 'FilterFilled'; var _default = React.forwardRef(FilterFilled); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/FilterFilled":34,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],144:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _FolderOpenOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/FolderOpenOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var FolderOpenOutlined = function FolderOpenOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _FolderOpenOutlined.default })); }; FolderOpenOutlined.displayName = 'FolderOpenOutlined'; var _default = React.forwardRef(FolderOpenOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/FolderOpenOutlined":35,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],145:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _FolderOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/FolderOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var FolderOutlined = function FolderOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _FolderOutlined.default })); }; FolderOutlined.displayName = 'FolderOutlined'; var _default = React.forwardRef(FolderOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/FolderOutlined":36,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],146:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _InfoCircleFilled = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/InfoCircleFilled")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var InfoCircleFilled = function InfoCircleFilled(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _InfoCircleFilled.default })); }; InfoCircleFilled.displayName = 'InfoCircleFilled'; var _default = React.forwardRef(InfoCircleFilled); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/InfoCircleFilled":37,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],147:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _InfoCircleOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/InfoCircleOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var InfoCircleOutlined = function InfoCircleOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _InfoCircleOutlined.default })); }; InfoCircleOutlined.displayName = 'InfoCircleOutlined'; var _default = React.forwardRef(InfoCircleOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/InfoCircleOutlined":38,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],148:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _LeftOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/LeftOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var LeftOutlined = function LeftOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _LeftOutlined.default })); }; LeftOutlined.displayName = 'LeftOutlined'; var _default = React.forwardRef(LeftOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/LeftOutlined":39,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],149:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/LoadingOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var LoadingOutlined = function LoadingOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _LoadingOutlined.default })); }; LoadingOutlined.displayName = 'LoadingOutlined'; var _default = React.forwardRef(LoadingOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/LoadingOutlined":40,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],150:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _MinusSquareOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/MinusSquareOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var MinusSquareOutlined = function MinusSquareOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _MinusSquareOutlined.default })); }; MinusSquareOutlined.displayName = 'MinusSquareOutlined'; var _default = React.forwardRef(MinusSquareOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/MinusSquareOutlined":41,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],151:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _PaperClipOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/PaperClipOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var PaperClipOutlined = function PaperClipOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _PaperClipOutlined.default })); }; PaperClipOutlined.displayName = 'PaperClipOutlined'; var _default = React.forwardRef(PaperClipOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/PaperClipOutlined":42,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],152:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _PictureTwoTone = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/PictureTwoTone")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var PictureTwoTone = function PictureTwoTone(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _PictureTwoTone.default })); }; PictureTwoTone.displayName = 'PictureTwoTone'; var _default = React.forwardRef(PictureTwoTone); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/PictureTwoTone":43,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],153:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _PlusOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/PlusOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var PlusOutlined = function PlusOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _PlusOutlined.default })); }; PlusOutlined.displayName = 'PlusOutlined'; var _default = React.forwardRef(PlusOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/PlusOutlined":44,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],154:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _PlusSquareOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/PlusSquareOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var PlusSquareOutlined = function PlusSquareOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _PlusSquareOutlined.default })); }; PlusSquareOutlined.displayName = 'PlusSquareOutlined'; var _default = React.forwardRef(PlusSquareOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/PlusSquareOutlined":45,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],155:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _RedoOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/RedoOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var RedoOutlined = function RedoOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _RedoOutlined.default })); }; RedoOutlined.displayName = 'RedoOutlined'; var _default = React.forwardRef(RedoOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/RedoOutlined":46,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],156:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _RightOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/RightOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var RightOutlined = function RightOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _RightOutlined.default })); }; RightOutlined.displayName = 'RightOutlined'; var _default = React.forwardRef(RightOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/RightOutlined":47,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],157:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _RotateLeftOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/RotateLeftOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var RotateLeftOutlined = function RotateLeftOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _RotateLeftOutlined.default })); }; RotateLeftOutlined.displayName = 'RotateLeftOutlined'; var _default = React.forwardRef(RotateLeftOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/RotateLeftOutlined":48,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],158:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _RotateRightOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/RotateRightOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var RotateRightOutlined = function RotateRightOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _RotateRightOutlined.default })); }; RotateRightOutlined.displayName = 'RotateRightOutlined'; var _default = React.forwardRef(RotateRightOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/RotateRightOutlined":49,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],159:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _SearchOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/SearchOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var SearchOutlined = function SearchOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _SearchOutlined.default })); }; SearchOutlined.displayName = 'SearchOutlined'; var _default = React.forwardRef(SearchOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/SearchOutlined":50,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],160:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _StarFilled = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/StarFilled")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var StarFilled = function StarFilled(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _StarFilled.default })); }; StarFilled.displayName = 'StarFilled'; var _default = React.forwardRef(StarFilled); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/StarFilled":51,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],161:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _SwapRightOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/SwapRightOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var SwapRightOutlined = function SwapRightOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _SwapRightOutlined.default })); }; SwapRightOutlined.displayName = 'SwapRightOutlined'; var _default = React.forwardRef(SwapRightOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/SwapRightOutlined":52,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],162:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _UpOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/UpOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var UpOutlined = function UpOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _UpOutlined.default })); }; UpOutlined.displayName = 'UpOutlined'; var _default = React.forwardRef(UpOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/UpOutlined":53,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],163:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _VerticalAlignTopOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/VerticalAlignTopOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var VerticalAlignTopOutlined = function VerticalAlignTopOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _VerticalAlignTopOutlined.default })); }; VerticalAlignTopOutlined.displayName = 'VerticalAlignTopOutlined'; var _default = React.forwardRef(VerticalAlignTopOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/VerticalAlignTopOutlined":54,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],164:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _WarningFilled = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/WarningFilled")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var WarningFilled = function WarningFilled(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _WarningFilled.default })); }; WarningFilled.displayName = 'WarningFilled'; var _default = React.forwardRef(WarningFilled); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/WarningFilled":55,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],165:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _ZoomInOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/ZoomInOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var ZoomInOutlined = function ZoomInOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _ZoomInOutlined.default })); }; ZoomInOutlined.displayName = 'ZoomInOutlined'; var _default = React.forwardRef(ZoomInOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/ZoomInOutlined":56,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],166:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _ZoomOutOutlined = _interopRequireDefault(require("@ant-design/icons-svg/lib/asn/ZoomOutOutlined")); var _AntdIcon = _interopRequireDefault(require("../components/AntdIcon")); // GENERATE BY ./scripts/generate.ts // DON NOT EDIT IT MANUALLY var ZoomOutOutlined = function ZoomOutOutlined(props, ref) { return React.createElement(_AntdIcon.default, Object.assign({}, props, { ref: ref, icon: _ZoomOutOutlined.default })); }; ZoomOutOutlined.displayName = 'ZoomOutOutlined'; var _default = React.forwardRef(ZoomOutOutlined); exports.default = _default; },{"../components/AntdIcon":111,"@ant-design/icons-svg/lib/asn/ZoomOutOutlined":57,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],167:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.warning = warning; exports.isIconDefinition = isIconDefinition; exports.normalizeAttrs = normalizeAttrs; exports.generate = generate; exports.getSecondaryColor = getSecondaryColor; exports.normalizeTwoToneColors = normalizeTwoToneColors; exports.useInsertStyles = exports.iconStyles = exports.svgBaseProps = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _colors = require("@ant-design/colors"); var _react = _interopRequireWildcard(require("react")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _insertCss = require("insert-css"); function warning(valid, message) { (0, _warning.default)(valid, "[@ant-design/icons] ".concat(message)); } function isIconDefinition(target) { return (0, _typeof2.default)(target) === 'object' && typeof target.name === 'string' && typeof target.theme === 'string' && ((0, _typeof2.default)(target.icon) === 'object' || typeof target.icon === 'function'); } function normalizeAttrs() { var attrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return Object.keys(attrs).reduce(function (acc, key) { var val = attrs[key]; switch (key) { case 'class': acc.className = val; delete acc.class; break; default: acc[key] = val; } return acc; }, {}); } function generate(node, key, rootProps) { if (!rootProps) { return _react.default.createElement(node.tag, (0, _objectSpread2.default)({ key: key }, normalizeAttrs(node.attrs)), (node.children || []).map(function (child, index) { return generate(child, "".concat(key, "-").concat(node.tag, "-").concat(index)); })); } return _react.default.createElement(node.tag, (0, _objectSpread2.default)((0, _objectSpread2.default)({ key: key }, normalizeAttrs(node.attrs)), rootProps), (node.children || []).map(function (child, index) { return generate(child, "".concat(key, "-").concat(node.tag, "-").concat(index)); })); } function getSecondaryColor(primaryColor) { // choose the second color return (0, _colors.generate)(primaryColor)[0]; } function normalizeTwoToneColors(twoToneColor) { if (!twoToneColor) { return []; } return Array.isArray(twoToneColor) ? twoToneColor : [twoToneColor]; } // These props make sure that the SVG behaviours like general text. // Reference: https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4 var svgBaseProps = { width: '1em', height: '1em', fill: 'currentColor', 'aria-hidden': 'true', focusable: 'false' }; exports.svgBaseProps = svgBaseProps; var iconStyles = "\n.anticon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n"; exports.iconStyles = iconStyles; var cssInjectedFlag = false; var useInsertStyles = function useInsertStyles() { var styleStr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : iconStyles; (0, _react.useEffect)(function () { if (!cssInjectedFlag) { (0, _insertCss.insertCss)(styleStr, { prepend: true }); cssInjectedFlag = true; } }, []); }; exports.useInsertStyles = useInsertStyles; },{"@ant-design/colors":169,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/typeof":208,"insert-css":460,"rc-util/lib/warning":879,"react":"react"}],168:[function(require,module,exports){ "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var tinycolor2_1 = __importDefault(require("tinycolor2")); var hueStep = 2; // 色相阶梯 var saturationStep = 16; // 饱和度阶梯,浅色部分 var saturationStep2 = 5; // 饱和度阶梯,深色部分 var brightnessStep1 = 5; // 亮度阶梯,浅色部分 var brightnessStep2 = 15; // 亮度阶梯,深色部分 var lightColorCount = 5; // 浅色数量,主色上 var darkColorCount = 4; // 深色数量,主色下 function getHue(hsv, i, light) { var hue; // 根据色相不同,色相转向不同 if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) { hue = light ? Math.round(hsv.h) - hueStep * i : Math.round(hsv.h) + hueStep * i; } else { hue = light ? Math.round(hsv.h) + hueStep * i : Math.round(hsv.h) - hueStep * i; } if (hue < 0) { hue += 360; } else if (hue >= 360) { hue -= 360; } return hue; } function getSaturation(hsv, i, light) { // grey color don't change saturation if (hsv.h === 0 && hsv.s === 0) { return hsv.s; } var saturation; if (light) { saturation = Math.round(hsv.s * 100) - saturationStep * i; } else if (i === darkColorCount) { saturation = Math.round(hsv.s * 100) + saturationStep; } else { saturation = Math.round(hsv.s * 100) + saturationStep2 * i; } // 边界值修正 if (saturation > 100) { saturation = 100; } // 第一格的 s 限制在 6-10 之间 if (light && i === lightColorCount && saturation > 10) { saturation = 10; } if (saturation < 6) { saturation = 6; } return saturation; } function getValue(hsv, i, light) { if (light) { return Math.round(hsv.v * 100) + brightnessStep1 * i; } return Math.round(hsv.v * 100) - brightnessStep2 * i; } function generate(color) { var patterns = []; var pColor = tinycolor2_1.default(color); for (var i = lightColorCount; i > 0; i -= 1) { var hsv = pColor.toHsv(); var colorString = tinycolor2_1.default({ h: getHue(hsv, i, true), s: getSaturation(hsv, i, true), v: getValue(hsv, i, true), }).toHexString(); patterns.push(colorString); } patterns.push(pColor.toHexString()); for (var i = 1; i <= darkColorCount; i += 1) { var hsv = pColor.toHsv(); var colorString = tinycolor2_1.default({ h: getHue(hsv, i), s: getSaturation(hsv, i), v: getValue(hsv, i), }).toHexString(); patterns.push(colorString); } return patterns; } exports.default = generate; },{"tinycolor2":903}],169:[function(require,module,exports){ "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var generate_1 = __importDefault(require("./generate")); exports.generate = generate_1.default; var presetPrimaryColors = { red: '#F5222D', volcano: '#FA541C', orange: '#FA8C16', gold: '#FAAD14', yellow: '#FADB14', lime: '#A0D911', green: '#52C41A', cyan: '#13C2C2', blue: '#1890FF', geekblue: '#2F54EB', purple: '#722ED1', magenta: '#EB2F96', grey: '#666666', }; exports.presetPrimaryColors = presetPrimaryColors; var presetPalettes = {}; exports.presetPalettes = presetPalettes; Object.keys(presetPrimaryColors).forEach(function (key) { presetPalettes[key] = generate_1.default(presetPrimaryColors[key]); presetPalettes[key].primary = presetPalettes[key][5]; }); var red = presetPalettes.red; exports.red = red; var volcano = presetPalettes.volcano; exports.volcano = volcano; var gold = presetPalettes.gold; exports.gold = gold; var orange = presetPalettes.orange; exports.orange = orange; var yellow = presetPalettes.yellow; exports.yellow = yellow; var lime = presetPalettes.lime; exports.lime = lime; var green = presetPalettes.green; exports.green = green; var cyan = presetPalettes.cyan; exports.cyan = cyan; var blue = presetPalettes.blue; exports.blue = blue; var geekblue = presetPalettes.geekblue; exports.geekblue = geekblue; var purple = presetPalettes.purple; exports.purple = purple; var magenta = presetPalettes.magenta; exports.magenta = magenta; var grey = presetPalettes.grey; exports.grey = grey; },{"./generate":168}],170:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.NextArrow = exports.PrevArrow = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _innerSliderUtils = require("./utils/innerSliderUtils"); var PrevArrow = /*#__PURE__*/function (_React$PureComponent) { (0, _inherits2["default"])(PrevArrow, _React$PureComponent); var _super = (0, _createSuper2["default"])(PrevArrow); function PrevArrow() { (0, _classCallCheck2["default"])(this, PrevArrow); return _super.apply(this, arguments); } (0, _createClass2["default"])(PrevArrow, [{ key: "clickHandler", value: function clickHandler(options, e) { if (e) { e.preventDefault(); } this.props.clickHandler(options, e); } }, { key: "render", value: function render() { var prevClasses = { "slick-arrow": true, "slick-prev": true }; var prevHandler = this.clickHandler.bind(this, { message: "previous" }); if (!this.props.infinite && (this.props.currentSlide === 0 || this.props.slideCount <= this.props.slidesToShow)) { prevClasses["slick-disabled"] = true; prevHandler = null; } var prevArrowProps = { key: "0", "data-role": "none", className: (0, _classnames["default"])(prevClasses), style: { display: "block" }, onClick: prevHandler }; var customProps = { currentSlide: this.props.currentSlide, slideCount: this.props.slideCount }; var prevArrow; if (this.props.prevArrow) { prevArrow = /*#__PURE__*/_react["default"].cloneElement(this.props.prevArrow, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, prevArrowProps), customProps)); } else { prevArrow = /*#__PURE__*/_react["default"].createElement("button", (0, _extends2["default"])({ key: "0", type: "button" }, prevArrowProps), " ", "Previous"); } return prevArrow; } }]); return PrevArrow; }(_react["default"].PureComponent); exports.PrevArrow = PrevArrow; var NextArrow = /*#__PURE__*/function (_React$PureComponent2) { (0, _inherits2["default"])(NextArrow, _React$PureComponent2); var _super2 = (0, _createSuper2["default"])(NextArrow); function NextArrow() { (0, _classCallCheck2["default"])(this, NextArrow); return _super2.apply(this, arguments); } (0, _createClass2["default"])(NextArrow, [{ key: "clickHandler", value: function clickHandler(options, e) { if (e) { e.preventDefault(); } this.props.clickHandler(options, e); } }, { key: "render", value: function render() { var nextClasses = { "slick-arrow": true, "slick-next": true }; var nextHandler = this.clickHandler.bind(this, { message: "next" }); if (!(0, _innerSliderUtils.canGoNext)(this.props)) { nextClasses["slick-disabled"] = true; nextHandler = null; } var nextArrowProps = { key: "1", "data-role": "none", className: (0, _classnames["default"])(nextClasses), style: { display: "block" }, onClick: nextHandler }; var customProps = { currentSlide: this.props.currentSlide, slideCount: this.props.slideCount }; var nextArrow; if (this.props.nextArrow) { nextArrow = /*#__PURE__*/_react["default"].cloneElement(this.props.nextArrow, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, nextArrowProps), customProps)); } else { nextArrow = /*#__PURE__*/_react["default"].createElement("button", (0, _extends2["default"])({ key: "1", type: "button" }, nextArrowProps), " ", "Next"); } return nextArrow; } }]); return NextArrow; }(_react["default"].PureComponent); exports.NextArrow = NextArrow; },{"./utils/innerSliderUtils":178,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"react":"react"}],171:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireDefault(require("react")); var defaultProps = { accessibility: true, adaptiveHeight: false, afterChange: null, appendDots: function appendDots(dots) { return /*#__PURE__*/_react["default"].createElement("ul", { style: { display: "block" } }, dots); }, arrows: true, autoplay: false, autoplaySpeed: 3000, beforeChange: null, centerMode: false, centerPadding: "50px", className: "", cssEase: "ease", customPaging: function customPaging(i) { return /*#__PURE__*/_react["default"].createElement("button", null, i + 1); }, dots: false, dotsClass: "slick-dots", draggable: true, easing: "linear", edgeFriction: 0.35, fade: false, focusOnSelect: false, infinite: true, initialSlide: 0, lazyLoad: null, nextArrow: null, onEdge: null, onInit: null, onLazyLoadError: null, onReInit: null, pauseOnDotsHover: false, pauseOnFocus: false, pauseOnHover: true, prevArrow: null, responsive: null, rows: 1, rtl: false, slide: "div", slidesPerRow: 1, slidesToScroll: 1, slidesToShow: 1, speed: 500, swipe: true, swipeEvent: null, swipeToSlide: false, touchMove: true, touchThreshold: 5, useCSS: true, useTransform: true, variableWidth: false, vertical: false, waitForAnimate: true }; var _default = defaultProps; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"react":"react"}],172:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.Dots = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _innerSliderUtils = require("./utils/innerSliderUtils"); var getDotCount = function getDotCount(spec) { var dots; if (spec.infinite) { dots = Math.ceil(spec.slideCount / spec.slidesToScroll); } else { dots = Math.ceil((spec.slideCount - spec.slidesToShow) / spec.slidesToScroll) + 1; } return dots; }; var Dots = /*#__PURE__*/function (_React$PureComponent) { (0, _inherits2["default"])(Dots, _React$PureComponent); var _super = (0, _createSuper2["default"])(Dots); function Dots() { (0, _classCallCheck2["default"])(this, Dots); return _super.apply(this, arguments); } (0, _createClass2["default"])(Dots, [{ key: "clickHandler", value: function clickHandler(options, e) { // In Autoplay the focus stays on clicked button even after transition // to next slide. That only goes away by click somewhere outside e.preventDefault(); this.props.clickHandler(options); } }, { key: "render", value: function render() { var _this$props = this.props, onMouseEnter = _this$props.onMouseEnter, onMouseOver = _this$props.onMouseOver, onMouseLeave = _this$props.onMouseLeave, infinite = _this$props.infinite, slidesToScroll = _this$props.slidesToScroll, slidesToShow = _this$props.slidesToShow, slideCount = _this$props.slideCount, currentSlide = _this$props.currentSlide; var dotCount = getDotCount({ slideCount: slideCount, slidesToScroll: slidesToScroll, slidesToShow: slidesToShow, infinite: infinite }); var mouseEvents = { onMouseEnter: onMouseEnter, onMouseOver: onMouseOver, onMouseLeave: onMouseLeave }; var dots = []; for (var i = 0; i < dotCount; i++) { var _rightBound = (i + 1) * slidesToScroll - 1; var rightBound = infinite ? _rightBound : (0, _innerSliderUtils.clamp)(_rightBound, 0, slideCount - 1); var _leftBound = rightBound - (slidesToScroll - 1); var leftBound = infinite ? _leftBound : (0, _innerSliderUtils.clamp)(_leftBound, 0, slideCount - 1); var className = (0, _classnames["default"])({ "slick-active": infinite ? currentSlide >= leftBound && currentSlide <= rightBound : currentSlide === leftBound }); var dotOptions = { message: "dots", index: i, slidesToScroll: slidesToScroll, currentSlide: currentSlide }; var onClick = this.clickHandler.bind(this, dotOptions); dots = dots.concat( /*#__PURE__*/_react["default"].createElement("li", { key: i, className: className }, /*#__PURE__*/_react["default"].cloneElement(this.props.customPaging(i), { onClick: onClick }))); } return /*#__PURE__*/_react["default"].cloneElement(this.props.appendDots(dots), (0, _objectSpread2["default"])({ className: this.props.dotsClass }, mouseEvents)); } }]); return Dots; }(_react["default"].PureComponent); exports.Dots = Dots; },{"./utils/innerSliderUtils":178,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"react":"react"}],173:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _slider = _interopRequireDefault(require("./slider")); var _default = _slider["default"]; exports["default"] = _default; },{"./slider":176,"@babel/runtime/helpers/interopRequireDefault":192}],174:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var initialState = { animating: false, autoplaying: null, currentDirection: 0, currentLeft: null, currentSlide: 0, direction: 1, dragging: false, edgeDragged: false, initialized: false, lazyLoadedList: [], listHeight: null, listWidth: null, scrolling: false, slideCount: null, slideHeight: null, slideWidth: null, swipeLeft: null, swiped: false, // used by swipeEvent. differentites between touch and swipe. swiping: false, touchObject: { startX: 0, startY: 0, curX: 0, curY: 0 }, trackStyle: {}, trackWidth: 0, targetSlide: 0 }; var _default = initialState; exports["default"] = _default; },{}],175:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.InnerSlider = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _initialState = _interopRequireDefault(require("./initial-state")); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _classnames = _interopRequireDefault(require("classnames")); var _innerSliderUtils = require("./utils/innerSliderUtils"); var _track = require("./track"); var _dots = require("./dots"); var _arrows = require("./arrows"); var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill")); var InnerSlider = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(InnerSlider, _React$Component); var _super = (0, _createSuper2["default"])(InnerSlider); function InnerSlider(props) { var _this; (0, _classCallCheck2["default"])(this, InnerSlider); _this = _super.call(this, props); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "listRefHandler", function (ref) { return _this.list = ref; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "trackRefHandler", function (ref) { return _this.track = ref; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "adaptHeight", function () { if (_this.props.adaptiveHeight && _this.list) { var elem = _this.list.querySelector("[data-index=\"".concat(_this.state.currentSlide, "\"]")); _this.list.style.height = (0, _innerSliderUtils.getHeight)(elem) + "px"; } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "componentDidMount", function () { _this.props.onInit && _this.props.onInit(); if (_this.props.lazyLoad) { var slidesToLoad = (0, _innerSliderUtils.getOnDemandLazySlides)((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state)); if (slidesToLoad.length > 0) { _this.setState(function (prevState) { return { lazyLoadedList: prevState.lazyLoadedList.concat(slidesToLoad) }; }); if (_this.props.onLazyLoad) { _this.props.onLazyLoad(slidesToLoad); } } } var spec = (0, _objectSpread2["default"])({ listRef: _this.list, trackRef: _this.track }, _this.props); _this.updateState(spec, true, function () { _this.adaptHeight(); _this.props.autoplay && _this.autoPlay("update"); }); if (_this.props.lazyLoad === "progressive") { _this.lazyLoadTimer = setInterval(_this.progressiveLazyLoad, 1000); } _this.ro = new _resizeObserverPolyfill["default"](function () { if (_this.state.animating) { _this.onWindowResized(false); // don't set trackStyle hence don't break animation _this.callbackTimers.push(setTimeout(function () { return _this.onWindowResized(); }, _this.props.speed)); } else { _this.onWindowResized(); } }); _this.ro.observe(_this.list); Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"), function (slide) { slide.onfocus = _this.props.pauseOnFocus ? _this.onSlideFocus : null; slide.onblur = _this.props.pauseOnFocus ? _this.onSlideBlur : null; }); if (window.addEventListener) { window.addEventListener("resize", _this.onWindowResized); } else { window.attachEvent("onresize", _this.onWindowResized); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "componentWillUnmount", function () { if (_this.animationEndCallback) { clearTimeout(_this.animationEndCallback); } if (_this.lazyLoadTimer) { clearInterval(_this.lazyLoadTimer); } if (_this.callbackTimers.length) { _this.callbackTimers.forEach(function (timer) { return clearTimeout(timer); }); _this.callbackTimers = []; } if (window.addEventListener) { window.removeEventListener("resize", _this.onWindowResized); } else { window.detachEvent("onresize", _this.onWindowResized); } if (_this.autoplayTimer) { clearInterval(_this.autoplayTimer); } _this.ro.disconnect(); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "componentDidUpdate", function (prevProps) { _this.checkImagesLoad(); _this.props.onReInit && _this.props.onReInit(); if (_this.props.lazyLoad) { var slidesToLoad = (0, _innerSliderUtils.getOnDemandLazySlides)((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state)); if (slidesToLoad.length > 0) { _this.setState(function (prevState) { return { lazyLoadedList: prevState.lazyLoadedList.concat(slidesToLoad) }; }); if (_this.props.onLazyLoad) { _this.props.onLazyLoad(slidesToLoad); } } } // if (this.props.onLazyLoad) { // this.props.onLazyLoad([leftMostSlide]) // } _this.adaptHeight(); var spec = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({ listRef: _this.list, trackRef: _this.track }, _this.props), _this.state); var setTrackStyle = _this.didPropsChange(prevProps); setTrackStyle && _this.updateState(spec, setTrackStyle, function () { if (_this.state.currentSlide >= _react["default"].Children.count(_this.props.children)) { _this.changeSlide({ message: "index", index: _react["default"].Children.count(_this.props.children) - _this.props.slidesToShow, currentSlide: _this.state.currentSlide }); } if (prevProps.autoplay !== _this.props.autoplay || prevProps.autoplaySpeed !== _this.props.autoplaySpeed) { if (_this.props.autoplay) { _this.autoPlay("update"); } else { _this.pause("paused"); } } }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onWindowResized", function (setTrackStyle) { if (_this.debouncedResize) _this.debouncedResize.cancel(); _this.debouncedResize = (0, _debounce["default"])(function () { return _this.resizeWindow(setTrackStyle); }, 50); _this.debouncedResize(); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "resizeWindow", function () { var setTrackStyle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; var isTrackMounted = Boolean(_this.track && _this.track.node); // prevent warning: setting state on unmounted component (server side rendering) if (!isTrackMounted) return; var spec = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({ listRef: _this.list, trackRef: _this.track }, _this.props), _this.state); _this.updateState(spec, setTrackStyle, function () { if (_this.props.autoplay) _this.autoPlay("update");else _this.pause("paused"); }); // animating state should be cleared while resizing, otherwise autoplay stops working _this.setState({ animating: false }); clearTimeout(_this.animationEndCallback); delete _this.animationEndCallback; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateState", function (spec, setTrackStyle, callback) { var updatedState = (0, _innerSliderUtils.initializedState)(spec); spec = (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), updatedState), {}, { slideIndex: updatedState.currentSlide }); var targetLeft = (0, _innerSliderUtils.getTrackLeft)(spec); spec = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { left: targetLeft }); var trackStyle = (0, _innerSliderUtils.getTrackCSS)(spec); if (setTrackStyle || _react["default"].Children.count(_this.props.children) !== _react["default"].Children.count(spec.children)) { updatedState["trackStyle"] = trackStyle; } _this.setState(updatedState, callback); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "ssrInit", function () { if (_this.props.variableWidth) { var _trackWidth = 0, _trackLeft = 0; var childrenWidths = []; var preClones = (0, _innerSliderUtils.getPreClones)((0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state), {}, { slideCount: _this.props.children.length })); var postClones = (0, _innerSliderUtils.getPostClones)((0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state), {}, { slideCount: _this.props.children.length })); _this.props.children.forEach(function (child) { childrenWidths.push(child.props.style.width); _trackWidth += child.props.style.width; }); for (var i = 0; i < preClones; i++) { _trackLeft += childrenWidths[childrenWidths.length - 1 - i]; _trackWidth += childrenWidths[childrenWidths.length - 1 - i]; } for (var _i = 0; _i < postClones; _i++) { _trackWidth += childrenWidths[_i]; } for (var _i2 = 0; _i2 < _this.state.currentSlide; _i2++) { _trackLeft += childrenWidths[_i2]; } var _trackStyle = { width: _trackWidth + "px", left: -_trackLeft + "px" }; if (_this.props.centerMode) { var currentWidth = "".concat(childrenWidths[_this.state.currentSlide], "px"); _trackStyle.left = "calc(".concat(_trackStyle.left, " + (100% - ").concat(currentWidth, ") / 2 ) "); } return { trackStyle: _trackStyle }; } var childrenCount = _react["default"].Children.count(_this.props.children); var spec = (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state), {}, { slideCount: childrenCount }); var slideCount = (0, _innerSliderUtils.getPreClones)(spec) + (0, _innerSliderUtils.getPostClones)(spec) + childrenCount; var trackWidth = 100 / _this.props.slidesToShow * slideCount; var slideWidth = 100 / slideCount; var trackLeft = -slideWidth * ((0, _innerSliderUtils.getPreClones)(spec) + _this.state.currentSlide) * trackWidth / 100; if (_this.props.centerMode) { trackLeft += (100 - slideWidth * trackWidth / 100) / 2; } var trackStyle = { width: trackWidth + "%", left: trackLeft + "%" }; return { slideWidth: slideWidth + "%", trackStyle: trackStyle }; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "checkImagesLoad", function () { var images = _this.list.querySelectorAll(".slick-slide img"); var imagesCount = images.length, loadedCount = 0; Array.prototype.forEach.call(images, function (image) { var handler = function handler() { return ++loadedCount && loadedCount >= imagesCount && _this.onWindowResized(); }; if (!image.onclick) { image.onclick = function () { return image.parentNode.focus(); }; } else { var prevClickHandler = image.onclick; image.onclick = function () { prevClickHandler(); image.parentNode.focus(); }; } if (!image.onload) { if (_this.props.lazyLoad) { image.onload = function () { _this.adaptHeight(); _this.callbackTimers.push(setTimeout(_this.onWindowResized, _this.props.speed)); }; } else { image.onload = handler; image.onerror = function () { handler(); _this.props.onLazyLoadError && _this.props.onLazyLoadError(); }; } } }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "progressiveLazyLoad", function () { var slidesToLoad = []; var spec = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state); for (var index = _this.state.currentSlide; index < _this.state.slideCount + (0, _innerSliderUtils.getPostClones)(spec); index++) { if (_this.state.lazyLoadedList.indexOf(index) < 0) { slidesToLoad.push(index); break; } } for (var _index = _this.state.currentSlide - 1; _index >= -(0, _innerSliderUtils.getPreClones)(spec); _index--) { if (_this.state.lazyLoadedList.indexOf(_index) < 0) { slidesToLoad.push(_index); break; } } if (slidesToLoad.length > 0) { _this.setState(function (state) { return { lazyLoadedList: state.lazyLoadedList.concat(slidesToLoad) }; }); if (_this.props.onLazyLoad) { _this.props.onLazyLoad(slidesToLoad); } } else { if (_this.lazyLoadTimer) { clearInterval(_this.lazyLoadTimer); delete _this.lazyLoadTimer; } } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slideHandler", function (index) { var dontAnimate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var _this$props = _this.props, asNavFor = _this$props.asNavFor, beforeChange = _this$props.beforeChange, onLazyLoad = _this$props.onLazyLoad, speed = _this$props.speed, afterChange = _this$props.afterChange; // capture currentslide before state is updated var currentSlide = _this.state.currentSlide; var _slideHandler = (0, _innerSliderUtils.slideHandler)((0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({ index: index }, _this.props), _this.state), {}, { trackRef: _this.track, useCSS: _this.props.useCSS && !dontAnimate })), state = _slideHandler.state, nextState = _slideHandler.nextState; if (!state) return; beforeChange && beforeChange(currentSlide, state.currentSlide); var slidesToLoad = state.lazyLoadedList.filter(function (value) { return _this.state.lazyLoadedList.indexOf(value) < 0; }); onLazyLoad && slidesToLoad.length > 0 && onLazyLoad(slidesToLoad); if (!_this.props.waitForAnimate && _this.animationEndCallback) { clearTimeout(_this.animationEndCallback); afterChange && afterChange(currentSlide); delete _this.animationEndCallback; } _this.setState(state, function () { // asNavForIndex check is to avoid recursive calls of slideHandler in waitForAnimate=false mode if (asNavFor && _this.asNavForIndex !== index) { _this.asNavForIndex = index; asNavFor.innerSlider.slideHandler(index); } if (!nextState) return; _this.animationEndCallback = setTimeout(function () { var animating = nextState.animating, firstBatch = (0, _objectWithoutProperties2["default"])(nextState, ["animating"]); _this.setState(firstBatch, function () { _this.callbackTimers.push(setTimeout(function () { return _this.setState({ animating: animating }); }, 10)); afterChange && afterChange(state.currentSlide); delete _this.animationEndCallback; }); }, speed); }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeSlide", function (options) { var dontAnimate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var spec = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state); var targetSlide = (0, _innerSliderUtils.changeSlide)(spec, options); if (targetSlide !== 0 && !targetSlide) return; if (dontAnimate === true) { _this.slideHandler(targetSlide, dontAnimate); } else { _this.slideHandler(targetSlide); } _this.props.autoplay && _this.autoPlay("update"); if (_this.props.focusOnSelect) { var nodes = _this.list.querySelectorAll(".slick-current"); nodes[0] && nodes[0].focus(); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "clickHandler", function (e) { if (_this.clickable === false) { e.stopPropagation(); e.preventDefault(); } _this.clickable = true; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "keyHandler", function (e) { var dir = (0, _innerSliderUtils.keyHandler)(e, _this.props.accessibility, _this.props.rtl); dir !== "" && _this.changeSlide({ message: dir }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectHandler", function (options) { _this.changeSlide(options); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "disableBodyScroll", function () { var preventDefault = function preventDefault(e) { e = e || window.event; if (e.preventDefault) e.preventDefault(); e.returnValue = false; }; window.ontouchmove = preventDefault; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "enableBodyScroll", function () { window.ontouchmove = null; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "swipeStart", function (e) { if (_this.props.verticalSwiping) { _this.disableBodyScroll(); } var state = (0, _innerSliderUtils.swipeStart)(e, _this.props.swipe, _this.props.draggable); state !== "" && _this.setState(state); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "swipeMove", function (e) { var state = (0, _innerSliderUtils.swipeMove)(e, (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state), {}, { trackRef: _this.track, listRef: _this.list, slideIndex: _this.state.currentSlide })); if (!state) return; if (state["swiping"]) { _this.clickable = false; } _this.setState(state); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "swipeEnd", function (e) { var state = (0, _innerSliderUtils.swipeEnd)(e, (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state), {}, { trackRef: _this.track, listRef: _this.list, slideIndex: _this.state.currentSlide })); if (!state) return; var triggerSlideHandler = state["triggerSlideHandler"]; delete state["triggerSlideHandler"]; _this.setState(state); if (triggerSlideHandler === undefined) return; _this.slideHandler(triggerSlideHandler); if (_this.props.verticalSwiping) { _this.enableBodyScroll(); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "touchEnd", function (e) { _this.swipeEnd(e); _this.clickable = true; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slickPrev", function () { // this and fellow methods are wrapped in setTimeout // to make sure initialize setState has happened before // any of such methods are called _this.callbackTimers.push(setTimeout(function () { return _this.changeSlide({ message: "previous" }); }, 0)); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slickNext", function () { _this.callbackTimers.push(setTimeout(function () { return _this.changeSlide({ message: "next" }); }, 0)); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slickGoTo", function (slide) { var dontAnimate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; slide = Number(slide); if (isNaN(slide)) return ""; _this.callbackTimers.push(setTimeout(function () { return _this.changeSlide({ message: "index", index: slide, currentSlide: _this.state.currentSlide }, dontAnimate); }, 0)); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "play", function () { var nextIndex; if (_this.props.rtl) { nextIndex = _this.state.currentSlide - _this.props.slidesToScroll; } else { if ((0, _innerSliderUtils.canGoNext)((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state))) { nextIndex = _this.state.currentSlide + _this.props.slidesToScroll; } else { return false; } } _this.slideHandler(nextIndex); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "autoPlay", function (playType) { if (_this.autoplayTimer) { clearInterval(_this.autoplayTimer); } var autoplaying = _this.state.autoplaying; if (playType === "update") { if (autoplaying === "hovered" || autoplaying === "focused" || autoplaying === "paused") { return; } } else if (playType === "leave") { if (autoplaying === "paused" || autoplaying === "focused") { return; } } else if (playType === "blur") { if (autoplaying === "paused" || autoplaying === "hovered") { return; } } _this.autoplayTimer = setInterval(_this.play, _this.props.autoplaySpeed + 50); _this.setState({ autoplaying: "playing" }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "pause", function (pauseType) { if (_this.autoplayTimer) { clearInterval(_this.autoplayTimer); _this.autoplayTimer = null; } var autoplaying = _this.state.autoplaying; if (pauseType === "paused") { _this.setState({ autoplaying: "paused" }); } else if (pauseType === "focused") { if (autoplaying === "hovered" || autoplaying === "playing") { _this.setState({ autoplaying: "focused" }); } } else { // pauseType is 'hovered' if (autoplaying === "playing") { _this.setState({ autoplaying: "hovered" }); } } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDotsOver", function () { return _this.props.autoplay && _this.pause("hovered"); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDotsLeave", function () { return _this.props.autoplay && _this.state.autoplaying === "hovered" && _this.autoPlay("leave"); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onTrackOver", function () { return _this.props.autoplay && _this.pause("hovered"); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onTrackLeave", function () { return _this.props.autoplay && _this.state.autoplaying === "hovered" && _this.autoPlay("leave"); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onSlideFocus", function () { return _this.props.autoplay && _this.pause("focused"); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onSlideBlur", function () { return _this.props.autoplay && _this.state.autoplaying === "focused" && _this.autoPlay("blur"); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "render", function () { var className = (0, _classnames["default"])("slick-slider", _this.props.className, { "slick-vertical": _this.props.vertical, "slick-initialized": true }); var spec = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.props), _this.state); var trackProps = (0, _innerSliderUtils.extractObject)(spec, ["fade", "cssEase", "speed", "infinite", "centerMode", "focusOnSelect", "currentSlide", "lazyLoad", "lazyLoadedList", "rtl", "slideWidth", "slideHeight", "listHeight", "vertical", "slidesToShow", "slidesToScroll", "slideCount", "trackStyle", "variableWidth", "unslick", "centerPadding", "targetSlide", "useCSS"]); var pauseOnHover = _this.props.pauseOnHover; trackProps = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, trackProps), {}, { onMouseEnter: pauseOnHover ? _this.onTrackOver : null, onMouseLeave: pauseOnHover ? _this.onTrackLeave : null, onMouseOver: pauseOnHover ? _this.onTrackOver : null, focusOnSelect: _this.props.focusOnSelect && _this.clickable ? _this.selectHandler : null }); var dots; if (_this.props.dots === true && _this.state.slideCount >= _this.props.slidesToShow) { var dotProps = (0, _innerSliderUtils.extractObject)(spec, ["dotsClass", "slideCount", "slidesToShow", "currentSlide", "slidesToScroll", "clickHandler", "children", "customPaging", "infinite", "appendDots"]); var pauseOnDotsHover = _this.props.pauseOnDotsHover; dotProps = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, dotProps), {}, { clickHandler: _this.changeSlide, onMouseEnter: pauseOnDotsHover ? _this.onDotsLeave : null, onMouseOver: pauseOnDotsHover ? _this.onDotsOver : null, onMouseLeave: pauseOnDotsHover ? _this.onDotsLeave : null }); dots = /*#__PURE__*/_react["default"].createElement(_dots.Dots, dotProps); } var prevArrow, nextArrow; var arrowProps = (0, _innerSliderUtils.extractObject)(spec, ["infinite", "centerMode", "currentSlide", "slideCount", "slidesToShow", "prevArrow", "nextArrow"]); arrowProps.clickHandler = _this.changeSlide; if (_this.props.arrows) { prevArrow = /*#__PURE__*/_react["default"].createElement(_arrows.PrevArrow, arrowProps); nextArrow = /*#__PURE__*/_react["default"].createElement(_arrows.NextArrow, arrowProps); } var verticalHeightStyle = null; if (_this.props.vertical) { verticalHeightStyle = { height: _this.state.listHeight }; } var centerPaddingStyle = null; if (_this.props.vertical === false) { if (_this.props.centerMode === true) { centerPaddingStyle = { padding: "0px " + _this.props.centerPadding }; } } else { if (_this.props.centerMode === true) { centerPaddingStyle = { padding: _this.props.centerPadding + " 0px" }; } } var listStyle = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, verticalHeightStyle), centerPaddingStyle); var touchMove = _this.props.touchMove; var listProps = { className: "slick-list", style: listStyle, onClick: _this.clickHandler, onMouseDown: touchMove ? _this.swipeStart : null, onMouseMove: _this.state.dragging && touchMove ? _this.swipeMove : null, onMouseUp: touchMove ? _this.swipeEnd : null, onMouseLeave: _this.state.dragging && touchMove ? _this.swipeEnd : null, onTouchStart: touchMove ? _this.swipeStart : null, onTouchMove: _this.state.dragging && touchMove ? _this.swipeMove : null, onTouchEnd: touchMove ? _this.touchEnd : null, onTouchCancel: _this.state.dragging && touchMove ? _this.swipeEnd : null, onKeyDown: _this.props.accessibility ? _this.keyHandler : null }; var innerSliderProps = { className: className, dir: "ltr", style: _this.props.style }; if (_this.props.unslick) { listProps = { className: "slick-list" }; innerSliderProps = { className: className }; } return /*#__PURE__*/_react["default"].createElement("div", innerSliderProps, !_this.props.unslick ? prevArrow : "", /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({ ref: _this.listRefHandler }, listProps), /*#__PURE__*/_react["default"].createElement(_track.Track, (0, _extends2["default"])({ ref: _this.trackRefHandler }, trackProps), _this.props.children)), !_this.props.unslick ? nextArrow : "", !_this.props.unslick ? dots : ""); }); _this.list = null; _this.track = null; _this.state = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _initialState["default"]), {}, { currentSlide: _this.props.initialSlide, slideCount: _react["default"].Children.count(_this.props.children) }); _this.callbackTimers = []; _this.clickable = true; _this.debouncedResize = null; var ssrState = _this.ssrInit(); _this.state = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _this.state), ssrState); return _this; } (0, _createClass2["default"])(InnerSlider, [{ key: "didPropsChange", value: function didPropsChange(prevProps) { var setTrackStyle = false; for (var _i3 = 0, _Object$keys = Object.keys(this.props); _i3 < _Object$keys.length; _i3++) { var key = _Object$keys[_i3]; // eslint-disable-next-line no-prototype-builtins if (!prevProps.hasOwnProperty(key)) { setTrackStyle = true; break; } if ((0, _typeof2["default"])(prevProps[key]) === "object" || typeof prevProps[key] === "function") { continue; } if (prevProps[key] !== this.props[key]) { setTrackStyle = true; break; } } return setTrackStyle || _react["default"].Children.count(this.props.children) !== _react["default"].Children.count(prevProps.children); } }]); return InnerSlider; }(_react["default"].Component); exports.InnerSlider = InnerSlider; },{"./arrows":170,"./dots":172,"./initial-state":174,"./track":177,"./utils/innerSliderUtils":178,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/typeof":208,"classnames":455,"lodash/debounce":551,"react":"react","resize-observer-polyfill":899}],176:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _innerSlider = require("./inner-slider"); var _json2mq = _interopRequireDefault(require("json2mq")); var _defaultProps = _interopRequireDefault(require("./default-props")); var _innerSliderUtils = require("./utils/innerSliderUtils"); var Slider = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Slider, _React$Component); var _super = (0, _createSuper2["default"])(Slider); function Slider(props) { var _this; (0, _classCallCheck2["default"])(this, Slider); _this = _super.call(this, props); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "innerSliderRefHandler", function (ref) { return _this.innerSlider = ref; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slickPrev", function () { return _this.innerSlider.slickPrev(); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slickNext", function () { return _this.innerSlider.slickNext(); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slickGoTo", function (slide) { var dontAnimate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return _this.innerSlider.slickGoTo(slide, dontAnimate); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slickPause", function () { return _this.innerSlider.pause("paused"); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slickPlay", function () { return _this.innerSlider.autoPlay("play"); }); _this.state = { breakpoint: null }; _this._responsiveMediaHandlers = []; return _this; } (0, _createClass2["default"])(Slider, [{ key: "media", value: function media(query, handler) { // javascript handler for css media query var mql = window.matchMedia(query); var listener = function listener(_ref) { var matches = _ref.matches; if (matches) { handler(); } }; mql.addListener(listener); listener(mql); this._responsiveMediaHandlers.push({ mql: mql, query: query, listener: listener }); } // handles responsive breakpoints }, { key: "componentDidMount", value: function componentDidMount() { var _this2 = this; // performance monitoring //if (process.env.NODE_ENV !== 'production') { //const { whyDidYouUpdate } = require('why-did-you-update') //whyDidYouUpdate(React) //} if (this.props.responsive) { var breakpoints = this.props.responsive.map(function (breakpt) { return breakpt.breakpoint; }); // sort them in increasing order of their numerical value breakpoints.sort(function (x, y) { return x - y; }); breakpoints.forEach(function (breakpoint, index) { // media query for each breakpoint var bQuery; if (index === 0) { bQuery = (0, _json2mq["default"])({ minWidth: 0, maxWidth: breakpoint }); } else { bQuery = (0, _json2mq["default"])({ minWidth: breakpoints[index - 1] + 1, maxWidth: breakpoint }); } // when not using server side rendering (0, _innerSliderUtils.canUseDOM)() && _this2.media(bQuery, function () { _this2.setState({ breakpoint: breakpoint }); }); }); // Register media query for full screen. Need to support resize from small to large // convert javascript object to media query string var query = (0, _json2mq["default"])({ minWidth: breakpoints.slice(-1)[0] }); (0, _innerSliderUtils.canUseDOM)() && this.media(query, function () { _this2.setState({ breakpoint: null }); }); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this._responsiveMediaHandlers.forEach(function (obj) { obj.mql.removeListener(obj.listener); }); } }, { key: "render", value: function render() { var _this3 = this; var settings; var newProps; if (this.state.breakpoint) { newProps = this.props.responsive.filter(function (resp) { return resp.breakpoint === _this3.state.breakpoint; }); settings = newProps[0].settings === "unslick" ? "unslick" : (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _defaultProps["default"]), this.props), newProps[0].settings); } else { settings = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _defaultProps["default"]), this.props); } // force scrolling by one if centerMode is on if (settings.centerMode) { if (settings.slidesToScroll > 1 && process.env.NODE_ENV !== "production") { console.warn("slidesToScroll should be equal to 1 in centerMode, you are using ".concat(settings.slidesToScroll)); } settings.slidesToScroll = 1; } // force showing one slide and scrolling by one if the fade mode is on if (settings.fade) { if (settings.slidesToShow > 1 && process.env.NODE_ENV !== "production") { console.warn("slidesToShow should be equal to 1 when fade is true, you're using ".concat(settings.slidesToShow)); } if (settings.slidesToScroll > 1 && process.env.NODE_ENV !== "production") { console.warn("slidesToScroll should be equal to 1 when fade is true, you're using ".concat(settings.slidesToScroll)); } settings.slidesToShow = 1; settings.slidesToScroll = 1; } // makes sure that children is an array, even when there is only 1 child var children = _react["default"].Children.toArray(this.props.children); // Children may contain false or null, so we should filter them // children may also contain string filled with spaces (in certain cases where we use jsx strings) children = children.filter(function (child) { if (typeof child === "string") { return !!child.trim(); } return !!child; }); // rows and slidesPerRow logic is handled here if (settings.variableWidth && (settings.rows > 1 || settings.slidesPerRow > 1)) { console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"); settings.variableWidth = false; } var newChildren = []; var currentWidth = null; for (var i = 0; i < children.length; i += settings.rows * settings.slidesPerRow) { var newSlide = []; for (var j = i; j < i + settings.rows * settings.slidesPerRow; j += settings.slidesPerRow) { var row = []; for (var k = j; k < j + settings.slidesPerRow; k += 1) { if (settings.variableWidth && children[k].props.style) { currentWidth = children[k].props.style.width; } if (k >= children.length) break; row.push( /*#__PURE__*/_react["default"].cloneElement(children[k], { key: 100 * i + 10 * j + k, tabIndex: -1, style: { width: "".concat(100 / settings.slidesPerRow, "%"), display: "inline-block" } })); } newSlide.push( /*#__PURE__*/_react["default"].createElement("div", { key: 10 * i + j }, row)); } if (settings.variableWidth) { newChildren.push( /*#__PURE__*/_react["default"].createElement("div", { key: i, style: { width: currentWidth } }, newSlide)); } else { newChildren.push( /*#__PURE__*/_react["default"].createElement("div", { key: i }, newSlide)); } } if (settings === "unslick") { var className = "regular slider " + (this.props.className || ""); return /*#__PURE__*/_react["default"].createElement("div", { className: className }, children); } else if (newChildren.length <= settings.slidesToShow) { settings.unslick = true; } return /*#__PURE__*/_react["default"].createElement(_innerSlider.InnerSlider, (0, _extends2["default"])({ style: this.props.style, ref: this.innerSliderRefHandler }, settings), newChildren); } }]); return Slider; }(_react["default"].Component); exports["default"] = Slider; }).call(this,require('_process')) },{"./default-props":171,"./inner-slider":175,"./utils/innerSliderUtils":178,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"_process":1,"json2mq":461,"react":"react"}],177:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.Track = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _innerSliderUtils = require("./utils/innerSliderUtils"); // given specifications/props for a slide, fetch all the classes that need to be applied to the slide var getSlideClasses = function getSlideClasses(spec) { var slickActive, slickCenter, slickCloned; var centerOffset, index; if (spec.rtl) { index = spec.slideCount - 1 - spec.index; } else { index = spec.index; } slickCloned = index < 0 || index >= spec.slideCount; if (spec.centerMode) { centerOffset = Math.floor(spec.slidesToShow / 2); slickCenter = (index - spec.currentSlide) % spec.slideCount === 0; if (index > spec.currentSlide - centerOffset - 1 && index <= spec.currentSlide + centerOffset) { slickActive = true; } } else { slickActive = spec.currentSlide <= index && index < spec.currentSlide + spec.slidesToShow; } var focusedSlide; if (spec.targetSlide < 0) { focusedSlide = spec.targetSlide + spec.slideCount; } else if (spec.targetSlide >= spec.slideCount) { focusedSlide = spec.targetSlide - spec.slideCount; } else { focusedSlide = spec.targetSlide; } var slickCurrent = index === focusedSlide; return { "slick-slide": true, "slick-active": slickActive, "slick-center": slickCenter, "slick-cloned": slickCloned, "slick-current": slickCurrent // dubious in case of RTL }; }; var getSlideStyle = function getSlideStyle(spec) { var style = {}; if (spec.variableWidth === undefined || spec.variableWidth === false) { style.width = spec.slideWidth; } if (spec.fade) { style.position = "relative"; if (spec.vertical) { style.top = -spec.index * parseInt(spec.slideHeight); } else { style.left = -spec.index * parseInt(spec.slideWidth); } style.opacity = spec.currentSlide === spec.index ? 1 : 0; if (spec.useCSS) { style.transition = "opacity " + spec.speed + "ms " + spec.cssEase + ", " + "visibility " + spec.speed + "ms " + spec.cssEase; } } return style; }; var getKey = function getKey(child, fallbackKey) { return child.key + "-" + fallbackKey; }; var renderSlides = function renderSlides(spec) { var key; var slides = []; var preCloneSlides = []; var postCloneSlides = []; var childrenCount = _react["default"].Children.count(spec.children); var startIndex = (0, _innerSliderUtils.lazyStartIndex)(spec); var endIndex = (0, _innerSliderUtils.lazyEndIndex)(spec); _react["default"].Children.forEach(spec.children, function (elem, index) { var child; var childOnClickOptions = { message: "children", index: index, slidesToScroll: spec.slidesToScroll, currentSlide: spec.currentSlide }; // in case of lazyLoad, whether or not we want to fetch the slide if (!spec.lazyLoad || spec.lazyLoad && spec.lazyLoadedList.indexOf(index) >= 0) { child = elem; } else { child = /*#__PURE__*/_react["default"].createElement("div", null); } var childStyle = getSlideStyle((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { index: index })); var slideClass = child.props.className || ""; var slideClasses = getSlideClasses((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { index: index })); // push a cloned element of the desired slide slides.push( /*#__PURE__*/_react["default"].cloneElement(child, { key: "original" + getKey(child, index), "data-index": index, className: (0, _classnames["default"])(slideClasses, slideClass), tabIndex: "-1", "aria-hidden": !slideClasses["slick-active"], style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({ outline: "none" }, child.props.style || {}), childStyle), onClick: function onClick(e) { child.props && child.props.onClick && child.props.onClick(e); if (spec.focusOnSelect) { spec.focusOnSelect(childOnClickOptions); } } })); // if slide needs to be precloned or postcloned if (spec.infinite && spec.fade === false) { var preCloneNo = childrenCount - index; if (preCloneNo <= (0, _innerSliderUtils.getPreClones)(spec) && childrenCount !== spec.slidesToShow) { key = -preCloneNo; if (key >= startIndex) { child = elem; } slideClasses = getSlideClasses((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { index: key })); preCloneSlides.push( /*#__PURE__*/_react["default"].cloneElement(child, { key: "precloned" + getKey(child, key), "data-index": key, tabIndex: "-1", className: (0, _classnames["default"])(slideClasses, slideClass), "aria-hidden": !slideClasses["slick-active"], style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, child.props.style || {}), childStyle), onClick: function onClick(e) { child.props && child.props.onClick && child.props.onClick(e); if (spec.focusOnSelect) { spec.focusOnSelect(childOnClickOptions); } } })); } if (childrenCount !== spec.slidesToShow) { key = childrenCount + index; if (key < endIndex) { child = elem; } slideClasses = getSlideClasses((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { index: key })); postCloneSlides.push( /*#__PURE__*/_react["default"].cloneElement(child, { key: "postcloned" + getKey(child, key), "data-index": key, tabIndex: "-1", className: (0, _classnames["default"])(slideClasses, slideClass), "aria-hidden": !slideClasses["slick-active"], style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, child.props.style || {}), childStyle), onClick: function onClick(e) { child.props && child.props.onClick && child.props.onClick(e); if (spec.focusOnSelect) { spec.focusOnSelect(childOnClickOptions); } } })); } } }); if (spec.rtl) { return preCloneSlides.concat(slides, postCloneSlides).reverse(); } else { return preCloneSlides.concat(slides, postCloneSlides); } }; var Track = /*#__PURE__*/function (_React$PureComponent) { (0, _inherits2["default"])(Track, _React$PureComponent); var _super = (0, _createSuper2["default"])(Track); function Track() { var _this; (0, _classCallCheck2["default"])(this, Track); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "node", null); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleRef", function (ref) { _this.node = ref; }); return _this; } (0, _createClass2["default"])(Track, [{ key: "render", value: function render() { var slides = renderSlides(this.props); var _this$props = this.props, onMouseEnter = _this$props.onMouseEnter, onMouseOver = _this$props.onMouseOver, onMouseLeave = _this$props.onMouseLeave; var mouseEvents = { onMouseEnter: onMouseEnter, onMouseOver: onMouseOver, onMouseLeave: onMouseLeave }; return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({ ref: this.handleRef, className: "slick-track", style: this.props.trackStyle }, mouseEvents), slides); } }]); return Track; }(_react["default"].PureComponent); exports.Track = Track; },{"./utils/innerSliderUtils":178,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"react":"react"}],178:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.clamp = clamp; exports.canUseDOM = exports.slidesOnLeft = exports.slidesOnRight = exports.siblingDirection = exports.getTotalSlides = exports.getPostClones = exports.getPreClones = exports.getTrackLeft = exports.getTrackAnimateCSS = exports.getTrackCSS = exports.checkSpecKeys = exports.getSlideCount = exports.checkNavigable = exports.getNavigableIndexes = exports.swipeEnd = exports.swipeMove = exports.swipeStart = exports.keyHandler = exports.changeSlide = exports.slideHandler = exports.initializedState = exports.extractObject = exports.canGoNext = exports.getSwipeDirection = exports.getHeight = exports.getWidth = exports.lazySlidesOnRight = exports.lazySlidesOnLeft = exports.lazyEndIndex = exports.lazyStartIndex = exports.getRequiredLazySlides = exports.getOnDemandLazySlides = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _react = _interopRequireDefault(require("react")); function clamp(number, lowerBound, upperBound) { return Math.max(lowerBound, Math.min(number, upperBound)); } var getOnDemandLazySlides = function getOnDemandLazySlides(spec) { var onDemandSlides = []; var startIndex = lazyStartIndex(spec); var endIndex = lazyEndIndex(spec); for (var slideIndex = startIndex; slideIndex < endIndex; slideIndex++) { if (spec.lazyLoadedList.indexOf(slideIndex) < 0) { onDemandSlides.push(slideIndex); } } return onDemandSlides; }; // return list of slides that need to be present exports.getOnDemandLazySlides = getOnDemandLazySlides; var getRequiredLazySlides = function getRequiredLazySlides(spec) { var requiredSlides = []; var startIndex = lazyStartIndex(spec); var endIndex = lazyEndIndex(spec); for (var slideIndex = startIndex; slideIndex < endIndex; slideIndex++) { requiredSlides.push(slideIndex); } return requiredSlides; }; // startIndex that needs to be present exports.getRequiredLazySlides = getRequiredLazySlides; var lazyStartIndex = function lazyStartIndex(spec) { return spec.currentSlide - lazySlidesOnLeft(spec); }; exports.lazyStartIndex = lazyStartIndex; var lazyEndIndex = function lazyEndIndex(spec) { return spec.currentSlide + lazySlidesOnRight(spec); }; exports.lazyEndIndex = lazyEndIndex; var lazySlidesOnLeft = function lazySlidesOnLeft(spec) { return spec.centerMode ? Math.floor(spec.slidesToShow / 2) + (parseInt(spec.centerPadding) > 0 ? 1 : 0) : 0; }; exports.lazySlidesOnLeft = lazySlidesOnLeft; var lazySlidesOnRight = function lazySlidesOnRight(spec) { return spec.centerMode ? Math.floor((spec.slidesToShow - 1) / 2) + 1 + (parseInt(spec.centerPadding) > 0 ? 1 : 0) : spec.slidesToShow; }; // get width of an element exports.lazySlidesOnRight = lazySlidesOnRight; var getWidth = function getWidth(elem) { return elem && elem.offsetWidth || 0; }; exports.getWidth = getWidth; var getHeight = function getHeight(elem) { return elem && elem.offsetHeight || 0; }; exports.getHeight = getHeight; var getSwipeDirection = function getSwipeDirection(touchObject) { var verticalSwiping = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var xDist, yDist, r, swipeAngle; xDist = touchObject.startX - touchObject.curX; yDist = touchObject.startY - touchObject.curY; r = Math.atan2(yDist, xDist); swipeAngle = Math.round(r * 180 / Math.PI); if (swipeAngle < 0) { swipeAngle = 360 - Math.abs(swipeAngle); } if (swipeAngle <= 45 && swipeAngle >= 0 || swipeAngle <= 360 && swipeAngle >= 315) { return "left"; } if (swipeAngle >= 135 && swipeAngle <= 225) { return "right"; } if (verticalSwiping === true) { if (swipeAngle >= 35 && swipeAngle <= 135) { return "up"; } else { return "down"; } } return "vertical"; }; // whether or not we can go next exports.getSwipeDirection = getSwipeDirection; var canGoNext = function canGoNext(spec) { var canGo = true; if (!spec.infinite) { if (spec.centerMode && spec.currentSlide >= spec.slideCount - 1) { canGo = false; } else if (spec.slideCount <= spec.slidesToShow || spec.currentSlide >= spec.slideCount - spec.slidesToShow) { canGo = false; } } return canGo; }; // given an object and a list of keys, return new object with given keys exports.canGoNext = canGoNext; var extractObject = function extractObject(spec, keys) { var newObject = {}; keys.forEach(function (key) { return newObject[key] = spec[key]; }); return newObject; }; // get initialized state exports.extractObject = extractObject; var initializedState = function initializedState(spec) { // spec also contains listRef, trackRef var slideCount = _react["default"].Children.count(spec.children); var listNode = spec.listRef; var listWidth = Math.ceil(getWidth(listNode)); var trackNode = spec.trackRef && spec.trackRef.node; var trackWidth = Math.ceil(getWidth(trackNode)); var slideWidth; if (!spec.vertical) { var centerPaddingAdj = spec.centerMode && parseInt(spec.centerPadding) * 2; if (typeof spec.centerPadding === "string" && spec.centerPadding.slice(-1) === "%") { centerPaddingAdj *= listWidth / 100; } slideWidth = Math.ceil((listWidth - centerPaddingAdj) / spec.slidesToShow); } else { slideWidth = listWidth; } var slideHeight = listNode && getHeight(listNode.querySelector('[data-index="0"]')); var listHeight = slideHeight * spec.slidesToShow; var currentSlide = spec.currentSlide === undefined ? spec.initialSlide : spec.currentSlide; if (spec.rtl && spec.currentSlide === undefined) { currentSlide = slideCount - 1 - spec.initialSlide; } var lazyLoadedList = spec.lazyLoadedList || []; var slidesToLoad = getOnDemandLazySlides((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { currentSlide: currentSlide, lazyLoadedList: lazyLoadedList })); lazyLoadedList.concat(slidesToLoad); var state = { slideCount: slideCount, slideWidth: slideWidth, listWidth: listWidth, trackWidth: trackWidth, currentSlide: currentSlide, slideHeight: slideHeight, listHeight: listHeight, lazyLoadedList: lazyLoadedList }; if (spec.autoplaying === null && spec.autoplay) { state["autoplaying"] = "playing"; } return state; }; exports.initializedState = initializedState; var slideHandler = function slideHandler(spec) { var waitForAnimate = spec.waitForAnimate, animating = spec.animating, fade = spec.fade, infinite = spec.infinite, index = spec.index, slideCount = spec.slideCount, lazyLoadedList = spec.lazyLoadedList, lazyLoad = spec.lazyLoad, currentSlide = spec.currentSlide, centerMode = spec.centerMode, slidesToScroll = spec.slidesToScroll, slidesToShow = spec.slidesToShow, useCSS = spec.useCSS; if (waitForAnimate && animating) return {}; var animationSlide = index, finalSlide, animationLeft, finalLeft; var state = {}, nextState = {}; var targetSlide = infinite ? index : clamp(index, 0, slideCount - 1); if (fade) { if (!infinite && (index < 0 || index >= slideCount)) return {}; if (index < 0) { animationSlide = index + slideCount; } else if (index >= slideCount) { animationSlide = index - slideCount; } if (lazyLoad && lazyLoadedList.indexOf(animationSlide) < 0) { lazyLoadedList.push(animationSlide); } state = { animating: true, currentSlide: animationSlide, lazyLoadedList: lazyLoadedList }; nextState = { animating: false }; } else { finalSlide = animationSlide; if (animationSlide < 0) { finalSlide = animationSlide + slideCount; if (!infinite) finalSlide = 0;else if (slideCount % slidesToScroll !== 0) finalSlide = slideCount - slideCount % slidesToScroll; } else if (!canGoNext(spec) && animationSlide > currentSlide) { animationSlide = finalSlide = currentSlide; } else if (centerMode && animationSlide >= slideCount) { animationSlide = infinite ? slideCount : slideCount - 1; finalSlide = infinite ? 0 : slideCount - 1; } else if (animationSlide >= slideCount) { finalSlide = animationSlide - slideCount; if (!infinite) finalSlide = slideCount - slidesToShow;else if (slideCount % slidesToScroll !== 0) finalSlide = 0; } if (!infinite && animationSlide + slidesToShow >= slideCount) { finalSlide = slideCount - slidesToShow; } animationLeft = getTrackLeft((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { slideIndex: animationSlide })); finalLeft = getTrackLeft((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { slideIndex: finalSlide })); if (!infinite) { if (animationLeft === finalLeft) animationSlide = finalSlide; animationLeft = finalLeft; } lazyLoad && lazyLoadedList.concat(getOnDemandLazySlides((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { currentSlide: animationSlide }))); if (!useCSS) { state = { currentSlide: finalSlide, trackStyle: getTrackCSS((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { left: finalLeft })), lazyLoadedList: lazyLoadedList, targetSlide: targetSlide }; } else { state = { animating: true, currentSlide: finalSlide, trackStyle: getTrackAnimateCSS((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { left: animationLeft })), lazyLoadedList: lazyLoadedList, targetSlide: targetSlide }; nextState = { animating: false, currentSlide: finalSlide, trackStyle: getTrackCSS((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { left: finalLeft })), swipeLeft: null, targetSlide: targetSlide }; } } return { state: state, nextState: nextState }; }; exports.slideHandler = slideHandler; var changeSlide = function changeSlide(spec, options) { var indexOffset, previousInt, slideOffset, unevenOffset, targetSlide; var slidesToScroll = spec.slidesToScroll, slidesToShow = spec.slidesToShow, slideCount = spec.slideCount, currentSlide = spec.currentSlide, previousTargetSlide = spec.targetSlide, lazyLoad = spec.lazyLoad, infinite = spec.infinite; unevenOffset = slideCount % slidesToScroll !== 0; indexOffset = unevenOffset ? 0 : (slideCount - currentSlide) % slidesToScroll; if (options.message === "previous") { slideOffset = indexOffset === 0 ? slidesToScroll : slidesToShow - indexOffset; targetSlide = currentSlide - slideOffset; if (lazyLoad && !infinite) { previousInt = currentSlide - slideOffset; targetSlide = previousInt === -1 ? slideCount - 1 : previousInt; } if (!infinite) { targetSlide = previousTargetSlide - slidesToScroll; } } else if (options.message === "next") { slideOffset = indexOffset === 0 ? slidesToScroll : indexOffset; targetSlide = currentSlide + slideOffset; if (lazyLoad && !infinite) { targetSlide = (currentSlide + slidesToScroll) % slideCount + indexOffset; } if (!infinite) { targetSlide = previousTargetSlide + slidesToScroll; } } else if (options.message === "dots") { // Click on dots targetSlide = options.index * options.slidesToScroll; } else if (options.message === "children") { // Click on the slides targetSlide = options.index; if (infinite) { var direction = siblingDirection((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { targetSlide: targetSlide })); if (targetSlide > options.currentSlide && direction === "left") { targetSlide = targetSlide - slideCount; } else if (targetSlide < options.currentSlide && direction === "right") { targetSlide = targetSlide + slideCount; } } } else if (options.message === "index") { targetSlide = Number(options.index); } return targetSlide; }; exports.changeSlide = changeSlide; var keyHandler = function keyHandler(e, accessibility, rtl) { if (e.target.tagName.match("TEXTAREA|INPUT|SELECT") || !accessibility) return ""; if (e.keyCode === 37) return rtl ? "next" : "previous"; if (e.keyCode === 39) return rtl ? "previous" : "next"; return ""; }; exports.keyHandler = keyHandler; var swipeStart = function swipeStart(e, swipe, draggable) { e.target.tagName === "IMG" && e.preventDefault(); if (!swipe || !draggable && e.type.indexOf("mouse") !== -1) return ""; return { dragging: true, touchObject: { startX: e.touches ? e.touches[0].pageX : e.clientX, startY: e.touches ? e.touches[0].pageY : e.clientY, curX: e.touches ? e.touches[0].pageX : e.clientX, curY: e.touches ? e.touches[0].pageY : e.clientY } }; }; exports.swipeStart = swipeStart; var swipeMove = function swipeMove(e, spec) { // spec also contains, trackRef and slideIndex var scrolling = spec.scrolling, animating = spec.animating, vertical = spec.vertical, swipeToSlide = spec.swipeToSlide, verticalSwiping = spec.verticalSwiping, rtl = spec.rtl, currentSlide = spec.currentSlide, edgeFriction = spec.edgeFriction, edgeDragged = spec.edgeDragged, onEdge = spec.onEdge, swiped = spec.swiped, swiping = spec.swiping, slideCount = spec.slideCount, slidesToScroll = spec.slidesToScroll, infinite = spec.infinite, touchObject = spec.touchObject, swipeEvent = spec.swipeEvent, listHeight = spec.listHeight, listWidth = spec.listWidth; if (scrolling) return; if (animating) return e.preventDefault(); if (vertical && swipeToSlide && verticalSwiping) e.preventDefault(); var swipeLeft, state = {}; var curLeft = getTrackLeft(spec); touchObject.curX = e.touches ? e.touches[0].pageX : e.clientX; touchObject.curY = e.touches ? e.touches[0].pageY : e.clientY; touchObject.swipeLength = Math.round(Math.sqrt(Math.pow(touchObject.curX - touchObject.startX, 2))); var verticalSwipeLength = Math.round(Math.sqrt(Math.pow(touchObject.curY - touchObject.startY, 2))); if (!verticalSwiping && !swiping && verticalSwipeLength > 10) { return { scrolling: true }; } if (verticalSwiping) touchObject.swipeLength = verticalSwipeLength; var positionOffset = (!rtl ? 1 : -1) * (touchObject.curX > touchObject.startX ? 1 : -1); if (verticalSwiping) positionOffset = touchObject.curY > touchObject.startY ? 1 : -1; var dotCount = Math.ceil(slideCount / slidesToScroll); var swipeDirection = getSwipeDirection(spec.touchObject, verticalSwiping); var touchSwipeLength = touchObject.swipeLength; if (!infinite) { if (currentSlide === 0 && swipeDirection === "right" || currentSlide + 1 >= dotCount && swipeDirection === "left" || !canGoNext(spec) && swipeDirection === "left") { touchSwipeLength = touchObject.swipeLength * edgeFriction; if (edgeDragged === false && onEdge) { onEdge(swipeDirection); state["edgeDragged"] = true; } } } if (!swiped && swipeEvent) { swipeEvent(swipeDirection); state["swiped"] = true; } if (!vertical) { if (!rtl) { swipeLeft = curLeft + touchSwipeLength * positionOffset; } else { swipeLeft = curLeft - touchSwipeLength * positionOffset; } } else { swipeLeft = curLeft + touchSwipeLength * (listHeight / listWidth) * positionOffset; } if (verticalSwiping) { swipeLeft = curLeft + touchSwipeLength * positionOffset; } state = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, state), {}, { touchObject: touchObject, swipeLeft: swipeLeft, trackStyle: getTrackCSS((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { left: swipeLeft })) }); if (Math.abs(touchObject.curX - touchObject.startX) < Math.abs(touchObject.curY - touchObject.startY) * 0.8) { return state; } if (touchObject.swipeLength > 10) { state["swiping"] = true; e.preventDefault(); } return state; }; exports.swipeMove = swipeMove; var swipeEnd = function swipeEnd(e, spec) { var dragging = spec.dragging, swipe = spec.swipe, touchObject = spec.touchObject, listWidth = spec.listWidth, touchThreshold = spec.touchThreshold, verticalSwiping = spec.verticalSwiping, listHeight = spec.listHeight, swipeToSlide = spec.swipeToSlide, scrolling = spec.scrolling, onSwipe = spec.onSwipe, targetSlide = spec.targetSlide, currentSlide = spec.currentSlide, infinite = spec.infinite; if (!dragging) { if (swipe) e.preventDefault(); return {}; } var minSwipe = verticalSwiping ? listHeight / touchThreshold : listWidth / touchThreshold; var swipeDirection = getSwipeDirection(touchObject, verticalSwiping); // reset the state of touch related state variables. var state = { dragging: false, edgeDragged: false, scrolling: false, swiping: false, swiped: false, swipeLeft: null, touchObject: {} }; if (scrolling) { return state; } if (!touchObject.swipeLength) { return state; } if (touchObject.swipeLength > minSwipe) { e.preventDefault(); if (onSwipe) { onSwipe(swipeDirection); } var slideCount, newSlide; var activeSlide = infinite ? currentSlide : targetSlide; switch (swipeDirection) { case "left": case "up": newSlide = activeSlide + getSlideCount(spec); slideCount = swipeToSlide ? checkNavigable(spec, newSlide) : newSlide; state["currentDirection"] = 0; break; case "right": case "down": newSlide = activeSlide - getSlideCount(spec); slideCount = swipeToSlide ? checkNavigable(spec, newSlide) : newSlide; state["currentDirection"] = 1; break; default: slideCount = activeSlide; } state["triggerSlideHandler"] = slideCount; } else { // Adjust the track back to it's original position. var currentLeft = getTrackLeft(spec); state["trackStyle"] = getTrackAnimateCSS((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, spec), {}, { left: currentLeft })); } return state; }; exports.swipeEnd = swipeEnd; var getNavigableIndexes = function getNavigableIndexes(spec) { var max = spec.infinite ? spec.slideCount * 2 : spec.slideCount; var breakpoint = spec.infinite ? spec.slidesToShow * -1 : 0; var counter = spec.infinite ? spec.slidesToShow * -1 : 0; var indexes = []; while (breakpoint < max) { indexes.push(breakpoint); breakpoint = counter + spec.slidesToScroll; counter += Math.min(spec.slidesToScroll, spec.slidesToShow); } return indexes; }; exports.getNavigableIndexes = getNavigableIndexes; var checkNavigable = function checkNavigable(spec, index) { var navigables = getNavigableIndexes(spec); var prevNavigable = 0; if (index > navigables[navigables.length - 1]) { index = navigables[navigables.length - 1]; } else { for (var n in navigables) { if (index < navigables[n]) { index = prevNavigable; break; } prevNavigable = navigables[n]; } } return index; }; exports.checkNavigable = checkNavigable; var getSlideCount = function getSlideCount(spec) { var centerOffset = spec.centerMode ? spec.slideWidth * Math.floor(spec.slidesToShow / 2) : 0; if (spec.swipeToSlide) { var swipedSlide; var slickList = spec.listRef; var slides = slickList.querySelectorAll(".slick-slide"); Array.from(slides).every(function (slide) { if (!spec.vertical) { if (slide.offsetLeft - centerOffset + getWidth(slide) / 2 > spec.swipeLeft * -1) { swipedSlide = slide; return false; } } else { if (slide.offsetTop + getHeight(slide) / 2 > spec.swipeLeft * -1) { swipedSlide = slide; return false; } } return true; }); if (!swipedSlide) { return 0; } var currentIndex = spec.rtl === true ? spec.slideCount - spec.currentSlide : spec.currentSlide; var slidesTraversed = Math.abs(swipedSlide.dataset.index - currentIndex) || 1; return slidesTraversed; } else { return spec.slidesToScroll; } }; exports.getSlideCount = getSlideCount; var checkSpecKeys = function checkSpecKeys(spec, keysArray) { return (// eslint-disable-next-line no-prototype-builtins keysArray.reduce(function (value, key) { return value && spec.hasOwnProperty(key); }, true) ? null : console.error("Keys Missing:", spec) ); }; exports.checkSpecKeys = checkSpecKeys; var getTrackCSS = function getTrackCSS(spec) { checkSpecKeys(spec, ["left", "variableWidth", "slideCount", "slidesToShow", "slideWidth"]); var trackWidth, trackHeight; var trackChildren = spec.slideCount + 2 * spec.slidesToShow; if (!spec.vertical) { trackWidth = getTotalSlides(spec) * spec.slideWidth; } else { trackHeight = trackChildren * spec.slideHeight; } var style = { opacity: 1, transition: "", WebkitTransition: "" }; if (spec.useTransform) { var WebkitTransform = !spec.vertical ? "translate3d(" + spec.left + "px, 0px, 0px)" : "translate3d(0px, " + spec.left + "px, 0px)"; var transform = !spec.vertical ? "translate3d(" + spec.left + "px, 0px, 0px)" : "translate3d(0px, " + spec.left + "px, 0px)"; var msTransform = !spec.vertical ? "translateX(" + spec.left + "px)" : "translateY(" + spec.left + "px)"; style = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, style), {}, { WebkitTransform: WebkitTransform, transform: transform, msTransform: msTransform }); } else { if (spec.vertical) { style["top"] = spec.left; } else { style["left"] = spec.left; } } if (spec.fade) style = { opacity: 1 }; if (trackWidth) style.width = trackWidth; if (trackHeight) style.height = trackHeight; // Fallback for IE8 if (window && !window.addEventListener && window.attachEvent) { if (!spec.vertical) { style.marginLeft = spec.left + "px"; } else { style.marginTop = spec.left + "px"; } } return style; }; exports.getTrackCSS = getTrackCSS; var getTrackAnimateCSS = function getTrackAnimateCSS(spec) { checkSpecKeys(spec, ["left", "variableWidth", "slideCount", "slidesToShow", "slideWidth", "speed", "cssEase"]); var style = getTrackCSS(spec); // useCSS is true by default so it can be undefined if (spec.useTransform) { style.WebkitTransition = "-webkit-transform " + spec.speed + "ms " + spec.cssEase; style.transition = "transform " + spec.speed + "ms " + spec.cssEase; } else { if (spec.vertical) { style.transition = "top " + spec.speed + "ms " + spec.cssEase; } else { style.transition = "left " + spec.speed + "ms " + spec.cssEase; } } return style; }; exports.getTrackAnimateCSS = getTrackAnimateCSS; var getTrackLeft = function getTrackLeft(spec) { if (spec.unslick) { return 0; } checkSpecKeys(spec, ["slideIndex", "trackRef", "infinite", "centerMode", "slideCount", "slidesToShow", "slidesToScroll", "slideWidth", "listWidth", "variableWidth", "slideHeight"]); var slideIndex = spec.slideIndex, trackRef = spec.trackRef, infinite = spec.infinite, centerMode = spec.centerMode, slideCount = spec.slideCount, slidesToShow = spec.slidesToShow, slidesToScroll = spec.slidesToScroll, slideWidth = spec.slideWidth, listWidth = spec.listWidth, variableWidth = spec.variableWidth, slideHeight = spec.slideHeight, fade = spec.fade, vertical = spec.vertical; var slideOffset = 0; var targetLeft; var targetSlide; var verticalOffset = 0; if (fade || spec.slideCount === 1) { return 0; } var slidesToOffset = 0; if (infinite) { slidesToOffset = -getPreClones(spec); // bring active slide to the beginning of visual area // if next scroll doesn't have enough children, just reach till the end of original slides instead of shifting slidesToScroll children if (slideCount % slidesToScroll !== 0 && slideIndex + slidesToScroll > slideCount) { slidesToOffset = -(slideIndex > slideCount ? slidesToShow - (slideIndex - slideCount) : slideCount % slidesToScroll); } // shift current slide to center of the frame if (centerMode) { slidesToOffset += parseInt(slidesToShow / 2); } } else { if (slideCount % slidesToScroll !== 0 && slideIndex + slidesToScroll > slideCount) { slidesToOffset = slidesToShow - slideCount % slidesToScroll; } if (centerMode) { slidesToOffset = parseInt(slidesToShow / 2); } } slideOffset = slidesToOffset * slideWidth; verticalOffset = slidesToOffset * slideHeight; if (!vertical) { targetLeft = slideIndex * slideWidth * -1 + slideOffset; } else { targetLeft = slideIndex * slideHeight * -1 + verticalOffset; } if (variableWidth === true) { var targetSlideIndex; var trackElem = trackRef && trackRef.node; targetSlideIndex = slideIndex + getPreClones(spec); targetSlide = trackElem && trackElem.childNodes[targetSlideIndex]; targetLeft = targetSlide ? targetSlide.offsetLeft * -1 : 0; if (centerMode === true) { targetSlideIndex = infinite ? slideIndex + getPreClones(spec) : slideIndex; targetSlide = trackElem && trackElem.children[targetSlideIndex]; targetLeft = 0; for (var slide = 0; slide < targetSlideIndex; slide++) { targetLeft -= trackElem && trackElem.children[slide] && trackElem.children[slide].offsetWidth; } targetLeft -= parseInt(spec.centerPadding); targetLeft += targetSlide && (listWidth - targetSlide.offsetWidth) / 2; } } return targetLeft; }; exports.getTrackLeft = getTrackLeft; var getPreClones = function getPreClones(spec) { if (spec.unslick || !spec.infinite) { return 0; } if (spec.variableWidth) { return spec.slideCount; } return spec.slidesToShow + (spec.centerMode ? 1 : 0); }; exports.getPreClones = getPreClones; var getPostClones = function getPostClones(spec) { if (spec.unslick || !spec.infinite) { return 0; } return spec.slideCount; }; exports.getPostClones = getPostClones; var getTotalSlides = function getTotalSlides(spec) { return spec.slideCount === 1 ? 1 : getPreClones(spec) + spec.slideCount + getPostClones(spec); }; exports.getTotalSlides = getTotalSlides; var siblingDirection = function siblingDirection(spec) { if (spec.targetSlide > spec.currentSlide) { if (spec.targetSlide > spec.currentSlide + slidesOnRight(spec)) { return "left"; } return "right"; } else { if (spec.targetSlide < spec.currentSlide - slidesOnLeft(spec)) { return "right"; } return "left"; } }; exports.siblingDirection = siblingDirection; var slidesOnRight = function slidesOnRight(_ref) { var slidesToShow = _ref.slidesToShow, centerMode = _ref.centerMode, rtl = _ref.rtl, centerPadding = _ref.centerPadding; // returns no of slides on the right of active slide if (centerMode) { var right = (slidesToShow - 1) / 2 + 1; if (parseInt(centerPadding) > 0) right += 1; if (rtl && slidesToShow % 2 === 0) right += 1; return right; } if (rtl) { return 0; } return slidesToShow - 1; }; exports.slidesOnRight = slidesOnRight; var slidesOnLeft = function slidesOnLeft(_ref2) { var slidesToShow = _ref2.slidesToShow, centerMode = _ref2.centerMode, rtl = _ref2.rtl, centerPadding = _ref2.centerPadding; // returns no of slides on the left of active slide if (centerMode) { var left = (slidesToShow - 1) / 2 + 1; if (parseInt(centerPadding) > 0) left += 1; if (!rtl && slidesToShow % 2 === 0) left += 1; return left; } if (rtl) { return slidesToShow - 1; } return 0; }; exports.slidesOnLeft = slidesOnLeft; var canUseDOM = function canUseDOM() { return !!(typeof window !== "undefined" && window.document && window.document.createElement); }; exports.canUseDOM = canUseDOM; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"react":"react"}],179:[function(require,module,exports){ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } module.exports = _arrayLikeToArray; },{}],180:[function(require,module,exports){ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } module.exports = _arrayWithHoles; },{}],181:[function(require,module,exports){ var arrayLikeToArray = require("./arrayLikeToArray"); function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return arrayLikeToArray(arr); } module.exports = _arrayWithoutHoles; },{"./arrayLikeToArray":179}],182:[function(require,module,exports){ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } module.exports = _assertThisInitialized; },{}],183:[function(require,module,exports){ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } module.exports = _asyncToGenerator; },{}],184:[function(require,module,exports){ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } module.exports = _classCallCheck; },{}],185:[function(require,module,exports){ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } module.exports = _createClass; },{}],186:[function(require,module,exports){ var getPrototypeOf = require("./getPrototypeOf"); var isNativeReflectConstruct = require("./isNativeReflectConstruct"); var possibleConstructorReturn = require("./possibleConstructorReturn"); function _createSuper(Derived) { var hasNativeReflectConstruct = isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn(this, result); }; } module.exports = _createSuper; },{"./getPrototypeOf":190,"./isNativeReflectConstruct":194,"./possibleConstructorReturn":202}],187:[function(require,module,exports){ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } module.exports = _defineProperty; },{}],188:[function(require,module,exports){ function _extends() { module.exports = _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } module.exports = _extends; },{}],189:[function(require,module,exports){ var superPropBase = require("./superPropBase"); function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { module.exports = _get = Reflect.get; } else { module.exports = _get = function _get(target, property, receiver) { var base = superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } module.exports = _get; },{"./superPropBase":205}],190:[function(require,module,exports){ function _getPrototypeOf(o) { module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } module.exports = _getPrototypeOf; },{}],191:[function(require,module,exports){ var setPrototypeOf = require("./setPrototypeOf"); function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) setPrototypeOf(subClass, superClass); } module.exports = _inherits; },{"./setPrototypeOf":203}],192:[function(require,module,exports){ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } module.exports = _interopRequireDefault; },{}],193:[function(require,module,exports){ var _typeof = require("../helpers/typeof"); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } module.exports = _interopRequireWildcard; },{"../helpers/typeof":208}],194:[function(require,module,exports){ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } module.exports = _isNativeReflectConstruct; },{}],195:[function(require,module,exports){ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } module.exports = _iterableToArray; },{}],196:[function(require,module,exports){ function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } module.exports = _iterableToArrayLimit; },{}],197:[function(require,module,exports){ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } module.exports = _nonIterableRest; },{}],198:[function(require,module,exports){ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } module.exports = _nonIterableSpread; },{}],199:[function(require,module,exports){ var defineProperty = require("./defineProperty"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } module.exports = _objectSpread2; },{"./defineProperty":187}],200:[function(require,module,exports){ var objectWithoutPropertiesLoose = require("./objectWithoutPropertiesLoose"); function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } module.exports = _objectWithoutProperties; },{"./objectWithoutPropertiesLoose":201}],201:[function(require,module,exports){ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } module.exports = _objectWithoutPropertiesLoose; },{}],202:[function(require,module,exports){ var _typeof = require("../helpers/typeof"); var assertThisInitialized = require("./assertThisInitialized"); function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return assertThisInitialized(self); } module.exports = _possibleConstructorReturn; },{"../helpers/typeof":208,"./assertThisInitialized":182}],203:[function(require,module,exports){ function _setPrototypeOf(o, p) { module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } module.exports = _setPrototypeOf; },{}],204:[function(require,module,exports){ var arrayWithHoles = require("./arrayWithHoles"); var iterableToArrayLimit = require("./iterableToArrayLimit"); var unsupportedIterableToArray = require("./unsupportedIterableToArray"); var nonIterableRest = require("./nonIterableRest"); function _slicedToArray(arr, i) { return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); } module.exports = _slicedToArray; },{"./arrayWithHoles":180,"./iterableToArrayLimit":196,"./nonIterableRest":197,"./unsupportedIterableToArray":209}],205:[function(require,module,exports){ var getPrototypeOf = require("./getPrototypeOf"); function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = getPrototypeOf(object); if (object === null) break; } return object; } module.exports = _superPropBase; },{"./getPrototypeOf":190}],206:[function(require,module,exports){ var arrayWithHoles = require("./arrayWithHoles"); var iterableToArray = require("./iterableToArray"); var unsupportedIterableToArray = require("./unsupportedIterableToArray"); var nonIterableRest = require("./nonIterableRest"); function _toArray(arr) { return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest(); } module.exports = _toArray; },{"./arrayWithHoles":180,"./iterableToArray":195,"./nonIterableRest":197,"./unsupportedIterableToArray":209}],207:[function(require,module,exports){ var arrayWithoutHoles = require("./arrayWithoutHoles"); var iterableToArray = require("./iterableToArray"); var unsupportedIterableToArray = require("./unsupportedIterableToArray"); var nonIterableSpread = require("./nonIterableSpread"); function _toConsumableArray(arr) { return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); } module.exports = _toConsumableArray; },{"./arrayWithoutHoles":181,"./iterableToArray":195,"./nonIterableSpread":198,"./unsupportedIterableToArray":209}],208:[function(require,module,exports){ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { module.exports = _typeof = function _typeof(obj) { return typeof obj; }; } else { module.exports = _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } module.exports = _typeof; },{}],209:[function(require,module,exports){ var arrayLikeToArray = require("./arrayLikeToArray"); function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); } module.exports = _unsupportedIterableToArray; },{"./arrayLikeToArray":179}],210:[function(require,module,exports){ module.exports = require("regenerator-runtime"); },{"regenerator-runtime":898}],211:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PresetColorTypes = exports.PresetStatusColorTypes = void 0; var _type = require("./type"); var PresetStatusColorTypes = (0, _type.tuple)('success', 'processing', 'error', 'default', 'warning'); // eslint-disable-next-line import/prefer-default-export exports.PresetStatusColorTypes = PresetStatusColorTypes; var PresetColorTypes = (0, _type.tuple)('pink', 'red', 'yellow', 'orange', 'cyan', 'green', 'blue', 'purple', 'geekblue', 'magenta', 'volcano', 'gold', 'lime'); exports.PresetColorTypes = PresetColorTypes; },{"./type":230}],212:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "resetWarned", { enumerable: true, get: function get() { return _warning.resetWarned; } }); exports["default"] = void 0; var _warning = _interopRequireWildcard(require("rc-util/lib/warning")); var _default = function _default(valid, component, message) { (0, _warning["default"])(valid, "[antd: ".concat(component, "] ").concat(message)); }; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"rc-util/lib/warning":879}],213:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.easeInOutCubic = easeInOutCubic; // eslint-disable-next-line import/prefer-default-export function easeInOutCubic(t, b, c, d) { var cc = c - b; t /= d / 2; if (t < 1) { return cc / 2 * t * t * t + b; } // eslint-disable-next-line no-return-assign return cc / 2 * ((t -= 2) * t * t + 2) + b; } },{}],214:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = getDataOrAriaProps; function getDataOrAriaProps(props) { return Object.keys(props).reduce(function (prev, key) { if ((key.substr(0, 5) === 'data-' || key.substr(0, 5) === 'aria-' || key === 'role') && key.substr(0, 7) !== 'data-__') { prev[key] = props[key]; } return prev; }, {}); } },{}],215:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRenderPropValue = void 0; var getRenderPropValue = function getRenderPropValue(propValue) { if (!propValue) { return null; } var isRenderFunction = typeof propValue === 'function'; if (isRenderFunction) { return propValue(); } return propValue; }; exports.getRenderPropValue = getRenderPropValue; },{}],216:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isWindow = isWindow; exports["default"] = getScroll; function isWindow(obj) { return obj !== null && obj !== undefined && obj === obj.window; } function getScroll(target, top) { if (typeof window === 'undefined') { return 0; } var method = top ? 'scrollTop' : 'scrollLeft'; var result = 0; if (isWindow(target)) { result = target[top ? 'pageYOffset' : 'pageXOffset']; } else if (target instanceof Document) { result = target.documentElement[method]; } else if (target) { result = target[method]; } if (target && !isWindow(target) && typeof result !== 'number') { result = (target.ownerDocument || target).documentElement[method]; } return result; } },{}],217:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useForceUpdate; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); function useForceUpdate() { var _React$useReducer = React.useReducer(function (x) { return x + 1; }, 0), _React$useReducer2 = (0, _slicedToArray2["default"])(_React$useReducer, 2), forceUpdate = _React$useReducer2[1]; return forceUpdate; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],218:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = usePatchElement; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); function usePatchElement() { var _React$useState = React.useState([]), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), elements = _React$useState2[0], setElements = _React$useState2[1]; function patchElement(element) { // append a new element to elements (and create a new ref) setElements(function (originElements) { return [].concat((0, _toConsumableArray2["default"])(originElements), [element]); }); // return a function that removes the new element out of elements (and create a new ref) // it works a little like useEffect return function () { setElements(function (originElements) { return originElements.filter(function (ele) { return ele !== element; }); }); }; } return [elements, patchElement]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"react":"react"}],219:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useSyncState; var React = _interopRequireWildcard(require("react")); var _useForceUpdate = _interopRequireDefault(require("./useForceUpdate")); function useSyncState(initialValue) { var ref = React.useRef(initialValue); var forceUpdate = (0, _useForceUpdate["default"])(); return [function () { return ref.current; }, function (newValue) { ref.current = newValue; // re-render forceUpdate(); }]; } },{"./useForceUpdate":217,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],220:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var isNumeric = function isNumeric(value) { return !isNaN(parseFloat(value)) && isFinite(value); }; var _default = isNumeric; exports["default"] = _default; },{}],221:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; // ================== Collapse Motion ================== var getCollapsedHeight = function getCollapsedHeight() { return { height: 0, opacity: 0 }; }; var getRealHeight = function getRealHeight(node) { return { height: node.scrollHeight, opacity: 1 }; }; var getCurrentHeight = function getCurrentHeight(node) { return { height: node.offsetHeight }; }; var skipOpacityTransition = function skipOpacityTransition(_, event) { return event.propertyName === 'height'; }; var collapseMotion = { motionName: 'ant-motion-collapse', onAppearStart: getCollapsedHeight, onEnterStart: getCollapsedHeight, onAppearActive: getRealHeight, onEnterActive: getRealHeight, onLeaveStart: getCurrentHeight, onLeaveActive: getCollapsedHeight, onAppearEnd: skipOpacityTransition, onEnterEnd: skipOpacityTransition, onLeaveEnd: skipOpacityTransition, motionDeadline: 500 }; var _default = collapseMotion; exports["default"] = _default; },{}],222:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = wrapperRaf; var _raf = _interopRequireDefault(require("raf")); var id = 0; var ids = {}; // Support call raf with delay specified frame function wrapperRaf(callback) { var delayFrames = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var myId = id++; var restFrames = delayFrames; function internalCallback() { restFrames -= 1; if (restFrames <= 0) { callback(); delete ids[myId]; } else { ids[myId] = (0, _raf["default"])(internalCallback); } } ids[myId] = (0, _raf["default"])(internalCallback); return myId; } wrapperRaf.cancel = function cancel(pid) { if (pid === undefined) return; _raf["default"].cancel(ids[pid]); delete ids[pid]; }; wrapperRaf.ids = ids; // export this for test usage },{"@babel/runtime/helpers/interopRequireDefault":192,"raf":581}],223:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.replaceElement = replaceElement; exports.cloneElement = cloneElement; exports.isValidElement = void 0; var React = _interopRequireWildcard(require("react")); var isValidElement = React.isValidElement; exports.isValidElement = isValidElement; function replaceElement(element, replacement, props) { if (!isValidElement(element)) return replacement; return /*#__PURE__*/React.cloneElement(element, typeof props === 'function' ? props() : props); } function cloneElement(element, props) { return replaceElement(element, element, props); } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],224:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.fillRef = fillRef; exports.composeRef = composeRef; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); function fillRef(ref, node) { if (typeof ref === 'function') { ref(node); } else if ((0, _typeof2["default"])(ref) === 'object' && ref && 'current' in ref) { ref.current = node; } } function composeRef() { for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) { refs[_key] = arguments[_key]; } return function (node) { refs.forEach(function (ref) { fillRef(ref, node); }); }; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/typeof":208}],225:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.responsiveMap = exports.responsiveArray = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var responsiveArray = ['xxl', 'xl', 'lg', 'md', 'sm', 'xs']; exports.responsiveArray = responsiveArray; var responsiveMap = { xs: '(max-width: 575px)', sm: '(min-width: 576px)', md: '(min-width: 768px)', lg: '(min-width: 992px)', xl: '(min-width: 1200px)', xxl: '(min-width: 1600px)' }; exports.responsiveMap = responsiveMap; var subscribers = new Map(); var subUid = -1; var screens = {}; var responsiveObserve = { matchHandlers: {}, dispatch: function dispatch(pointMap) { screens = pointMap; subscribers.forEach(function (func) { return func(screens); }); return subscribers.size >= 1; }, subscribe: function subscribe(func) { if (!subscribers.size) this.register(); subUid += 1; subscribers.set(subUid, func); func(screens); return subUid; }, unsubscribe: function unsubscribe(token) { subscribers["delete"](token); if (!subscribers.size) this.unregister(); }, unregister: function unregister() { var _this = this; Object.keys(responsiveMap).forEach(function (screen) { var matchMediaQuery = responsiveMap[screen]; var handler = _this.matchHandlers[matchMediaQuery]; handler === null || handler === void 0 ? void 0 : handler.mql.removeListener(handler === null || handler === void 0 ? void 0 : handler.listener); }); subscribers.clear(); }, register: function register() { var _this2 = this; Object.keys(responsiveMap).forEach(function (screen) { var matchMediaQuery = responsiveMap[screen]; var listener = function listener(_ref) { var matches = _ref.matches; _this2.dispatch((0, _extends3["default"])((0, _extends3["default"])({}, screens), (0, _defineProperty2["default"])({}, screen, matches))); }; var mql = window.matchMedia(matchMediaQuery); mql.addListener(listener); _this2.matchHandlers[matchMediaQuery] = { mql: mql, listener: listener }; listener(mql); }); } }; var _default = responsiveObserve; exports["default"] = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192}],226:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = scrollTo; var _raf = _interopRequireDefault(require("raf")); var _getScroll = _interopRequireWildcard(require("./getScroll")); var _easings = require("./easings"); function scrollTo(y) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var _options$getContainer = options.getContainer, getContainer = _options$getContainer === void 0 ? function () { return window; } : _options$getContainer, callback = options.callback, _options$duration = options.duration, duration = _options$duration === void 0 ? 450 : _options$duration; var container = getContainer(); var scrollTop = (0, _getScroll["default"])(container, true); var startTime = Date.now(); var frameFunc = function frameFunc() { var timestamp = Date.now(); var time = timestamp - startTime; var nextScrollTop = (0, _easings.easeInOutCubic)(time > duration ? duration : time, scrollTop, y, duration); if ((0, _getScroll.isWindow)(container)) { container.scrollTo(window.pageXOffset, nextScrollTop); } else if (container instanceof HTMLDocument || container.constructor.name === 'HTMLDocument') { container.documentElement.scrollTop = nextScrollTop; } else { container.scrollTop = nextScrollTop; } if (time < duration) { (0, _raf["default"])(frameFunc); } else if (typeof callback === 'function') { callback(); } }; (0, _raf["default"])(frameFunc); } },{"./easings":213,"./getScroll":216,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"raf":581}],227:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isFlexSupported = exports.isStyleSupport = void 0; var isStyleSupport = function isStyleSupport(styleName) { if (typeof window !== 'undefined' && window.document && window.document.documentElement) { var styleNameList = Array.isArray(styleName) ? styleName : [styleName]; var documentElement = window.document.documentElement; return styleNameList.some(function (name) { return name in documentElement.style; }); } return false; }; exports.isStyleSupport = isStyleSupport; var isFlexSupported = isStyleSupport(['flex', 'webkitFlex', 'Flex', 'msFlex']); exports.isFlexSupported = isFlexSupported; },{}],228:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.throttleByAnimationFrame = throttleByAnimationFrame; exports.throttleByAnimationFrameDecorator = throttleByAnimationFrameDecorator; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _raf = _interopRequireDefault(require("raf")); function throttleByAnimationFrame(fn) { var requestId; var later = function later(args) { return function () { requestId = null; fn.apply(void 0, (0, _toConsumableArray2["default"])(args)); }; }; var throttled = function throttled() { if (requestId == null) { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } requestId = (0, _raf["default"])(later(args)); } }; throttled.cancel = function () { return _raf["default"].cancel(requestId); }; return throttled; } function throttleByAnimationFrameDecorator() { return function throttle(target, key, descriptor) { var fn = descriptor.value; var definingProperty = false; return { configurable: true, get: function get() { // In IE11 calling Object.defineProperty has a side-effect of evaluating the // getter for the property which is being replaced. This causes infinite // recursion and an "Out of stack space" error. // eslint-disable-next-line no-prototype-builtins if (definingProperty || this === target.prototype || this.hasOwnProperty(key)) { /* istanbul ignore next */ return fn; } var boundFn = throttleByAnimationFrame(fn.bind(this)); definingProperty = true; Object.defineProperty(this, key, { value: boundFn, configurable: true, writable: true }); definingProperty = false; return boundFn; } }; }; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/toConsumableArray":207,"raf":581}],229:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; /** * Wrap of sub component which need use as Button capacity (like Icon component). * This helps accessibility reader to tread as a interactive button to operation. */ var inlineStyle = { border: 0, background: 'transparent', padding: 0, lineHeight: 'inherit', display: 'inline-block' }; var TransButton = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(TransButton, _React$Component); var _super = (0, _createSuper2["default"])(TransButton); function TransButton() { var _this; (0, _classCallCheck2["default"])(this, TransButton); _this = _super.apply(this, arguments); _this.onKeyDown = function (event) { var keyCode = event.keyCode; if (keyCode === _KeyCode["default"].ENTER) { event.preventDefault(); } }; _this.onKeyUp = function (event) { var keyCode = event.keyCode; var onClick = _this.props.onClick; if (keyCode === _KeyCode["default"].ENTER && onClick) { onClick(); } }; _this.setRef = function (btn) { _this.div = btn; }; return _this; } (0, _createClass2["default"])(TransButton, [{ key: "componentDidMount", value: function componentDidMount() { var autoFocus = this.props.autoFocus; if (autoFocus) { this.focus(); } } }, { key: "focus", value: function focus() { if (this.div) { this.div.focus(); } } }, { key: "blur", value: function blur() { if (this.div) { this.div.blur(); } } }, { key: "render", value: function render() { var _a = this.props, style = _a.style, noStyle = _a.noStyle, disabled = _a.disabled, restProps = __rest(_a, ["style", "noStyle", "disabled"]); var mergedStyle = {}; if (!noStyle) { mergedStyle = (0, _extends2["default"])({}, inlineStyle); } if (disabled) { mergedStyle.pointerEvents = 'none'; } mergedStyle = (0, _extends2["default"])((0, _extends2["default"])({}, mergedStyle), style); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({ role: "button", tabIndex: 0, ref: this.setRef }, restProps, { onKeyDown: this.onKeyDown, onKeyUp: this.onKeyUp, style: mergedStyle })); } }]); return TransButton; }(React.Component); var _default = TransButton; exports["default"] = _default; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-util/lib/KeyCode":865,"react":"react"}],230:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.tupleNum = exports.tuple = void 0; // https://stackoverflow.com/questions/46176165/ways-to-get-string-literal-type-of-array-values-without-enum-overhead var tuple = function tuple() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return args; }; exports.tuple = tuple; var tupleNum = function tupleNum() { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return args; }; exports.tupleNum = tupleNum; },{}],231:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var UnreachableException = function UnreachableException(value) { (0, _classCallCheck2["default"])(this, UnreachableException); return new Error("unreachable case: ".concat(JSON.stringify(value))); }; exports["default"] = UnreachableException; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/interopRequireDefault":192}],232:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _reactDom = require("react-dom"); var _Event = _interopRequireDefault(require("@ant-design/css-animation/lib/Event")); var _raf = _interopRequireDefault(require("./raf")); var _configProvider = require("../config-provider"); var styleForPesudo; // Where el is the DOM element you'd like to test for visibility function isHidden(element) { if (process.env.NODE_ENV === 'test') { return false; } return !element || element.offsetParent === null; } function isNotGrey(color) { // eslint-disable-next-line no-useless-escape var match = (color || '').match(/rgba?\((\d*), (\d*), (\d*)(, [\d.]*)?\)/); if (match && match[1] && match[2] && match[3]) { return !(match[1] === match[2] && match[2] === match[3]); } return true; } var Wave = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Wave, _React$Component); var _super = (0, _createSuper2["default"])(Wave); function Wave() { var _this; (0, _classCallCheck2["default"])(this, Wave); _this = _super.apply(this, arguments); _this.animationStart = false; _this.destroyed = false; _this.onClick = function (node, waveColor) { if (!node || isHidden(node) || node.className.indexOf('-leave') >= 0) { return; } var insertExtraNode = _this.props.insertExtraNode; _this.extraNode = document.createElement('div'); var _assertThisInitialize = (0, _assertThisInitialized2["default"])(_this), extraNode = _assertThisInitialize.extraNode; var getPrefixCls = _this.context.getPrefixCls; extraNode.className = "".concat(getPrefixCls(''), "-click-animating-node"); var attributeName = _this.getAttributeName(); node.setAttribute(attributeName, 'true'); // Not white or transparnt or grey styleForPesudo = styleForPesudo || document.createElement('style'); if (waveColor && waveColor !== '#ffffff' && waveColor !== 'rgb(255, 255, 255)' && isNotGrey(waveColor) && !/rgba\((?:\d*, ){3}0\)/.test(waveColor) && // any transparent rgba color waveColor !== 'transparent') { // Add nonce if CSP exist if (_this.csp && _this.csp.nonce) { styleForPesudo.nonce = _this.csp.nonce; } extraNode.style.borderColor = waveColor; styleForPesudo.innerHTML = "\n [".concat(getPrefixCls(''), "-click-animating-without-extra-node='true']::after, .").concat(getPrefixCls(''), "-click-animating-node {\n --antd-wave-shadow-color: ").concat(waveColor, ";\n }"); if (!document.body.contains(styleForPesudo)) { document.body.appendChild(styleForPesudo); } } if (insertExtraNode) { node.appendChild(extraNode); } _Event["default"].addStartEventListener(node, _this.onTransitionStart); _Event["default"].addEndEventListener(node, _this.onTransitionEnd); }; _this.onTransitionStart = function (e) { if (_this.destroyed) { return; } var node = (0, _reactDom.findDOMNode)((0, _assertThisInitialized2["default"])(_this)); if (!e || e.target !== node || _this.animationStart) { return; } _this.resetEffect(node); }; _this.onTransitionEnd = function (e) { if (!e || e.animationName !== 'fadeEffect') { return; } _this.resetEffect(e.target); }; _this.bindAnimationEvent = function (node) { if (!node || !node.getAttribute || node.getAttribute('disabled') || node.className.indexOf('disabled') >= 0) { return; } var onClick = function onClick(e) { // Fix radio button click twice if (e.target.tagName === 'INPUT' || isHidden(e.target)) { return; } _this.resetEffect(node); // Get wave color from target var waveColor = getComputedStyle(node).getPropertyValue('border-top-color') || // Firefox Compatible getComputedStyle(node).getPropertyValue('border-color') || getComputedStyle(node).getPropertyValue('background-color'); _this.clickWaveTimeoutId = window.setTimeout(function () { return _this.onClick(node, waveColor); }, 0); _raf["default"].cancel(_this.animationStartId); _this.animationStart = true; // Render to trigger transition event cost 3 frames. Let's delay 10 frames to reset this. _this.animationStartId = (0, _raf["default"])(function () { _this.animationStart = false; }, 10); }; node.addEventListener('click', onClick, true); return { cancel: function cancel() { node.removeEventListener('click', onClick, true); } }; }; _this.renderWave = function (_ref) { var csp = _ref.csp; var children = _this.props.children; _this.csp = csp; return children; }; return _this; } (0, _createClass2["default"])(Wave, [{ key: "componentDidMount", value: function componentDidMount() { var node = (0, _reactDom.findDOMNode)(this); if (!node || node.nodeType !== 1) { return; } this.instance = this.bindAnimationEvent(node); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.instance) { this.instance.cancel(); } if (this.clickWaveTimeoutId) { clearTimeout(this.clickWaveTimeoutId); } this.destroyed = true; } }, { key: "getAttributeName", value: function getAttributeName() { var getPrefixCls = this.context.getPrefixCls; var insertExtraNode = this.props.insertExtraNode; return insertExtraNode ? "".concat(getPrefixCls(''), "-click-animating") : "".concat(getPrefixCls(''), "-click-animating-without-extra-node"); } }, { key: "resetEffect", value: function resetEffect(node) { if (!node || node === this.extraNode || !(node instanceof Element)) { return; } var insertExtraNode = this.props.insertExtraNode; var attributeName = this.getAttributeName(); node.setAttribute(attributeName, 'false'); // edge has bug on `removeAttribute` #14466 if (styleForPesudo) { styleForPesudo.innerHTML = ''; } if (insertExtraNode && this.extraNode && node.contains(this.extraNode)) { node.removeChild(this.extraNode); } _Event["default"].removeStartEventListener(node, this.onTransitionStart); _Event["default"].removeEndEventListener(node, this.onTransitionEnd); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderWave); } }]); return Wave; }(React.Component); exports["default"] = Wave; Wave.contextType = _configProvider.ConfigContext; }).call(this,require('_process')) },{"../config-provider":278,"./raf":222,"@ant-design/css-animation/lib/Event":3,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"_process":1,"react":"react","react-dom":"react-dom"}],233:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer")); var _configProvider = require("../config-provider"); var _throttleByAnimationFrame = require("../_util/throttleByAnimationFrame"); var _utils = require("./utils"); var __decorate = void 0 && (void 0).__decorate || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if ((typeof Reflect === "undefined" ? "undefined" : (0, _typeof2["default"])(Reflect)) === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) { if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; } return c > 3 && r && Object.defineProperty(target, key, r), r; }; function getDefaultTarget() { return typeof window !== 'undefined' ? window : null; } var AffixStatus; (function (AffixStatus) { AffixStatus[AffixStatus["None"] = 0] = "None"; AffixStatus[AffixStatus["Prepare"] = 1] = "Prepare"; })(AffixStatus || (AffixStatus = {})); var Affix = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Affix, _React$Component); var _super = (0, _createSuper2["default"])(Affix); function Affix() { var _this; (0, _classCallCheck2["default"])(this, Affix); _this = _super.apply(this, arguments); _this.state = { status: AffixStatus.None, lastAffix: false, prevTarget: null }; _this.getOffsetTop = function () { var offsetBottom = _this.props.offsetBottom; var offsetTop = _this.props.offsetTop; if (offsetBottom === undefined && offsetTop === undefined) { offsetTop = 0; } return offsetTop; }; _this.getOffsetBottom = function () { return _this.props.offsetBottom; }; _this.savePlaceholderNode = function (node) { _this.placeholderNode = node; }; _this.saveFixedNode = function (node) { _this.fixedNode = node; }; // =================== Measure =================== _this.measure = function () { var _this$state = _this.state, status = _this$state.status, lastAffix = _this$state.lastAffix; var onChange = _this.props.onChange; var targetFunc = _this.getTargetFunc(); if (status !== AffixStatus.Prepare || !_this.fixedNode || !_this.placeholderNode || !targetFunc) { return; } var offsetTop = _this.getOffsetTop(); var offsetBottom = _this.getOffsetBottom(); var targetNode = targetFunc(); if (!targetNode) { return; } var newState = { status: AffixStatus.None }; var targetRect = (0, _utils.getTargetRect)(targetNode); var placeholderReact = (0, _utils.getTargetRect)(_this.placeholderNode); var fixedTop = (0, _utils.getFixedTop)(placeholderReact, targetRect, offsetTop); var fixedBottom = (0, _utils.getFixedBottom)(placeholderReact, targetRect, offsetBottom); if (fixedTop !== undefined) { newState.affixStyle = { position: 'fixed', top: fixedTop, width: placeholderReact.width, height: placeholderReact.height }; newState.placeholderStyle = { width: placeholderReact.width, height: placeholderReact.height }; } else if (fixedBottom !== undefined) { newState.affixStyle = { position: 'fixed', bottom: fixedBottom, width: placeholderReact.width, height: placeholderReact.height }; newState.placeholderStyle = { width: placeholderReact.width, height: placeholderReact.height }; } newState.lastAffix = !!newState.affixStyle; if (onChange && lastAffix !== newState.lastAffix) { onChange(newState.lastAffix); } _this.setState(newState); }; // @ts-ignore TS6133 _this.prepareMeasure = function () { // event param is used before. Keep compatible ts define here. _this.setState({ status: AffixStatus.Prepare, affixStyle: undefined, placeholderStyle: undefined }); // Test if `updatePosition` called if (process.env.NODE_ENV === 'test') { var onTestUpdatePosition = _this.props.onTestUpdatePosition; if (onTestUpdatePosition) { onTestUpdatePosition(); } } }; // =================== Render =================== _this.render = function () { var getPrefixCls = _this.context.getPrefixCls; var _this$state2 = _this.state, affixStyle = _this$state2.affixStyle, placeholderStyle = _this$state2.placeholderStyle; var _this$props = _this.props, prefixCls = _this$props.prefixCls, children = _this$props.children; var className = (0, _classnames["default"])((0, _defineProperty2["default"])({}, getPrefixCls('affix', prefixCls), affixStyle)); var props = (0, _omit["default"])(_this.props, ['prefixCls', 'offsetTop', 'offsetBottom', 'target', 'onChange']); // Omit this since `onTestUpdatePosition` only works on test. if (process.env.NODE_ENV === 'test') { props = (0, _omit["default"])(props, ['onTestUpdatePosition']); } return /*#__PURE__*/React.createElement(_rcResizeObserver["default"], { onResize: function onResize() { _this.updatePosition(); } }, /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, props, { ref: _this.savePlaceholderNode }), affixStyle && /*#__PURE__*/React.createElement("div", { style: placeholderStyle, "aria-hidden": "true" }), /*#__PURE__*/React.createElement("div", { className: className, ref: _this.saveFixedNode, style: affixStyle }, /*#__PURE__*/React.createElement(_rcResizeObserver["default"], { onResize: function onResize() { _this.updatePosition(); } }, children)))); }; return _this; } (0, _createClass2["default"])(Affix, [{ key: "getTargetFunc", value: function getTargetFunc() { var getTargetContainer = this.context.getTargetContainer; var target = this.props.target; if (target !== undefined) { return target; } return getTargetContainer || getDefaultTarget; } // Event handler }, { key: "componentDidMount", value: function componentDidMount() { var _this2 = this; var targetFunc = this.getTargetFunc(); if (targetFunc) { // [Legacy] Wait for parent component ref has its value. // We should use target as directly element instead of function which makes element check hard. this.timeout = setTimeout(function () { (0, _utils.addObserveTarget)(targetFunc(), _this2); // Mock Event object. _this2.updatePosition(); }); } } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var prevTarget = this.state.prevTarget; var targetFunc = this.getTargetFunc(); var newTarget = null; if (targetFunc) { newTarget = targetFunc() || null; } if (prevTarget !== newTarget) { (0, _utils.removeObserveTarget)(this); if (newTarget) { (0, _utils.addObserveTarget)(newTarget, this); // Mock Event object. this.updatePosition(); } // eslint-disable-next-line react/no-did-update-set-state this.setState({ prevTarget: newTarget }); } if (prevProps.offsetTop !== this.props.offsetTop || prevProps.offsetBottom !== this.props.offsetBottom) { this.updatePosition(); } this.measure(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { clearTimeout(this.timeout); (0, _utils.removeObserveTarget)(this); this.updatePosition.cancel(); // https://github.com/ant-design/ant-design/issues/22683 this.lazyUpdatePosition.cancel(); } // Handle realign logic }, { key: "updatePosition", value: function updatePosition() { this.prepareMeasure(); } }, { key: "lazyUpdatePosition", value: function lazyUpdatePosition() { var targetFunc = this.getTargetFunc(); var affixStyle = this.state.affixStyle; // Check position change before measure to make Safari smooth if (targetFunc && affixStyle) { var offsetTop = this.getOffsetTop(); var offsetBottom = this.getOffsetBottom(); var targetNode = targetFunc(); if (targetNode && this.placeholderNode) { var targetRect = (0, _utils.getTargetRect)(targetNode); var placeholderReact = (0, _utils.getTargetRect)(this.placeholderNode); var fixedTop = (0, _utils.getFixedTop)(placeholderReact, targetRect, offsetTop); var fixedBottom = (0, _utils.getFixedBottom)(placeholderReact, targetRect, offsetBottom); if (fixedTop !== undefined && affixStyle.top === fixedTop || fixedBottom !== undefined && affixStyle.bottom === fixedBottom) { return; } } } // Directly call prepare measure since it's already throttled. this.prepareMeasure(); } }]); return Affix; }(React.Component); Affix.contextType = _configProvider.ConfigContext; __decorate([(0, _throttleByAnimationFrame.throttleByAnimationFrameDecorator)()], Affix.prototype, "updatePosition", null); __decorate([(0, _throttleByAnimationFrame.throttleByAnimationFrameDecorator)()], Affix.prototype, "lazyUpdatePosition", null); var _default = Affix; exports["default"] = _default; }).call(this,require('_process')) },{"../_util/throttleByAnimationFrame":228,"../config-provider":278,"./utils":234,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"_process":1,"classnames":455,"omit.js":579,"rc-resize-observer":729,"react":"react"}],234:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getTargetRect = getTargetRect; exports.getFixedTop = getFixedTop; exports.getFixedBottom = getFixedBottom; exports.getObserverEntities = getObserverEntities; exports.addObserveTarget = addObserveTarget; exports.removeObserveTarget = removeObserveTarget; var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); function getTargetRect(target) { return target !== window ? target.getBoundingClientRect() : { top: 0, bottom: window.innerHeight }; } function getFixedTop(placeholderReact, targetRect, offsetTop) { if (offsetTop !== undefined && targetRect.top > placeholderReact.top - offsetTop) { return offsetTop + targetRect.top; } return undefined; } function getFixedBottom(placeholderReact, targetRect, offsetBottom) { if (offsetBottom !== undefined && targetRect.bottom < placeholderReact.bottom + offsetBottom) { var targetBottomOffset = window.innerHeight - targetRect.bottom; return offsetBottom + targetBottomOffset; } return undefined; } // ======================== Observer ======================== var TRIGGER_EVENTS = ['resize', 'scroll', 'touchstart', 'touchmove', 'touchend', 'pageshow', 'load']; var observerEntities = []; function getObserverEntities() { // Only used in test env. Can be removed if refactor. return observerEntities; } function addObserveTarget(target, affix) { if (!target) return; var entity = observerEntities.find(function (item) { return item.target === target; }); if (entity) { entity.affixList.push(affix); } else { entity = { target: target, affixList: [affix], eventHandlers: {} }; observerEntities.push(entity); // Add listener TRIGGER_EVENTS.forEach(function (eventName) { entity.eventHandlers[eventName] = (0, _addEventListener["default"])(target, eventName, function () { entity.affixList.forEach(function (targetAffix) { targetAffix.lazyUpdatePosition(); }); }); }); } } function removeObserveTarget(affix) { var observerEntity = observerEntities.find(function (oriObserverEntity) { var hasAffix = oriObserverEntity.affixList.some(function (item) { return item === affix; }); if (hasAffix) { oriObserverEntity.affixList = oriObserverEntity.affixList.filter(function (item) { return item !== affix; }); } return hasAffix; }); if (observerEntity && observerEntity.affixList.length === 0) { observerEntities = observerEntities.filter(function (item) { return item !== observerEntity; }); // Remove listener TRIGGER_EVENTS.forEach(function (eventName) { var handler = observerEntity.eventHandlers[eventName]; if (handler && handler.remove) { handler.remove(); } }); } } },{"@babel/runtime/helpers/interopRequireDefault":192,"rc-util/lib/Dom/addEventListener":859}],235:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _ = _interopRequireDefault(require(".")); var ErrorBoundary = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(ErrorBoundary, _React$Component); var _super = (0, _createSuper2["default"])(ErrorBoundary); function ErrorBoundary() { var _this; (0, _classCallCheck2["default"])(this, ErrorBoundary); _this = _super.apply(this, arguments); _this.state = { error: undefined, info: { componentStack: '' } }; return _this; } (0, _createClass2["default"])(ErrorBoundary, [{ key: "componentDidCatch", value: function componentDidCatch(error, info) { this.setState({ error: error, info: info }); } }, { key: "render", value: function render() { var _this$props = this.props, message = _this$props.message, description = _this$props.description, children = _this$props.children; var _this$state = this.state, error = _this$state.error, info = _this$state.info; var componentStack = info && info.componentStack ? info.componentStack : null; var errorMessage = typeof message === 'undefined' ? (error || '').toString() : message; var errorDescription = typeof description === 'undefined' ? componentStack : description; if (error) { return /*#__PURE__*/React.createElement(_["default"], { type: "error", message: errorMessage, description: /*#__PURE__*/React.createElement("pre", null, errorDescription) }); } return children; } }]); return ErrorBoundary; }(React.Component); exports["default"] = ErrorBoundary; },{".":236,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],236:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _CheckCircleOutlined = _interopRequireDefault(require("@ant-design/icons/CheckCircleOutlined")); var _ExclamationCircleOutlined = _interopRequireDefault(require("@ant-design/icons/ExclamationCircleOutlined")); var _InfoCircleOutlined = _interopRequireDefault(require("@ant-design/icons/InfoCircleOutlined")); var _CloseCircleOutlined = _interopRequireDefault(require("@ant-design/icons/CloseCircleOutlined")); var _CheckCircleFilled = _interopRequireDefault(require("@ant-design/icons/CheckCircleFilled")); var _ExclamationCircleFilled = _interopRequireDefault(require("@ant-design/icons/ExclamationCircleFilled")); var _InfoCircleFilled = _interopRequireDefault(require("@ant-design/icons/InfoCircleFilled")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _rcMotion = _interopRequireDefault(require("rc-motion")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _getDataOrAriaProps = _interopRequireDefault(require("../_util/getDataOrAriaProps")); var _ErrorBoundary = _interopRequireDefault(require("./ErrorBoundary")); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var iconMapFilled = { success: _CheckCircleFilled["default"], info: _InfoCircleFilled["default"], error: _CloseCircleFilled["default"], warning: _ExclamationCircleFilled["default"] }; var iconMapOutlined = { success: _CheckCircleOutlined["default"], info: _InfoCircleOutlined["default"], error: _CloseCircleOutlined["default"], warning: _ExclamationCircleOutlined["default"] }; var Alert = function Alert(_a) { var _classNames2; var description = _a.description, customizePrefixCls = _a.prefixCls, message = _a.message, banner = _a.banner, _a$className = _a.className, className = _a$className === void 0 ? '' : _a$className, style = _a.style, onMouseEnter = _a.onMouseEnter, onMouseLeave = _a.onMouseLeave, onClick = _a.onClick, afterClose = _a.afterClose, showIcon = _a.showIcon, closable = _a.closable, closeText = _a.closeText, props = __rest(_a, ["description", "prefixCls", "message", "banner", "className", "style", "onMouseEnter", "onMouseLeave", "onClick", "afterClose", "showIcon", "closable", "closeText"]); var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), closed = _React$useState2[0], setClosed = _React$useState2[1]; var ref = React.useRef(); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var prefixCls = getPrefixCls('alert', customizePrefixCls); var handleClose = function handleClose(e) { var _a; setClosed(true); (_a = props.onClose) === null || _a === void 0 ? void 0 : _a.call(props, e); }; var getType = function getType() { var type = props.type; if (type !== undefined) { return type; } // banner 模式默认为警告 return banner ? 'warning' : 'info'; }; // closeable when closeText is assigned var isClosable = closeText ? true : closable; var type = getType(); var renderIconNode = function renderIconNode() { var icon = props.icon; // use outline icon in alert with description var iconType = (description ? iconMapOutlined : iconMapFilled)[type] || null; if (icon) { return (0, _reactNode.replaceElement)(icon, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-icon") }, icon), function () { return { className: (0, _classnames["default"])("".concat(prefixCls, "-icon"), (0, _defineProperty2["default"])({}, icon.props.className, icon.props.className)) }; }); } return /*#__PURE__*/React.createElement(iconType, { className: "".concat(prefixCls, "-icon") }); }; var renderCloseIcon = function renderCloseIcon() { return isClosable ? /*#__PURE__*/React.createElement("button", { type: "button", onClick: handleClose, className: "".concat(prefixCls, "-close-icon"), tabIndex: 0 }, closeText ? /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-close-text") }, closeText) : /*#__PURE__*/React.createElement(_CloseOutlined["default"], null)) : null; }; // banner 模式默认有 Icon var isShowIcon = banner && showIcon === undefined ? true : showIcon; var alertCls = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-").concat(type), (_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-with-description"), !!description), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-no-icon"), !isShowIcon), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-banner"), !!banner), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-closable"), isClosable), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames2), className); var dataOrAriaProps = (0, _getDataOrAriaProps["default"])(props); return /*#__PURE__*/React.createElement(_rcMotion["default"], { visible: !closed, motionName: "".concat(prefixCls, "-motion"), motionAppear: false, motionEnter: false, onLeaveStart: function onLeaveStart(node) { return { maxHeight: node.offsetHeight }; }, onLeaveEnd: afterClose }, function (_ref) { var motionClassName = _ref.className, motionStyle = _ref.style; return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({ ref: ref, "data-show": !closed, className: (0, _classnames["default"])(alertCls, motionClassName), style: (0, _extends2["default"])((0, _extends2["default"])({}, style), motionStyle), onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onClick: onClick, role: "alert" }, dataOrAriaProps), isShowIcon ? renderIconNode() : null, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-message") }, message), /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-description") }, description), renderCloseIcon()); }); }; Alert.ErrorBoundary = _ErrorBoundary["default"]; var _default = Alert; exports["default"] = _default; },{"../_util/getDataOrAriaProps":214,"../_util/reactNode":223,"../config-provider":278,"./ErrorBoundary":235,"@ant-design/icons/CheckCircleFilled":65,"@ant-design/icons/CheckCircleOutlined":66,"@ant-design/icons/CloseCircleFilled":69,"@ant-design/icons/CloseCircleOutlined":70,"@ant-design/icons/CloseOutlined":71,"@ant-design/icons/ExclamationCircleFilled":81,"@ant-design/icons/ExclamationCircleOutlined":82,"@ant-design/icons/InfoCircleFilled":90,"@ant-design/icons/InfoCircleOutlined":91,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-motion":661,"react":"react"}],237:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var ReactDOM = _interopRequireWildcard(require("react-dom")); var _classnames = _interopRequireDefault(require("classnames")); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var _affix = _interopRequireDefault(require("../affix")); var _configProvider = require("../config-provider"); var _scrollTo = _interopRequireDefault(require("../_util/scrollTo")); var _getScroll = _interopRequireDefault(require("../_util/getScroll")); var _context = _interopRequireDefault(require("./context")); function getDefaultContainer() { return window; } function getOffsetTop(element, container) { if (!element.getClientRects().length) { return 0; } var rect = element.getBoundingClientRect(); if (rect.width || rect.height) { if (container === window) { container = element.ownerDocument.documentElement; return rect.top - container.clientTop; } return rect.top - container.getBoundingClientRect().top; } return rect.top; } var sharpMatcherRegx = /#(\S+)$/; var Anchor = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Anchor, _React$Component); var _super = (0, _createSuper2["default"])(Anchor); function Anchor() { var _this; (0, _classCallCheck2["default"])(this, Anchor); _this = _super.apply(this, arguments); _this.state = { activeLink: null }; _this.links = []; // Context _this.registerLink = function (link) { if (!_this.links.includes(link)) { _this.links.push(link); } }; _this.unregisterLink = function (link) { var index = _this.links.indexOf(link); if (index !== -1) { _this.links.splice(index, 1); } }; _this.getContainer = function () { var getTargetContainer = _this.context.getTargetContainer; var getContainer = _this.props.getContainer; var getFunc = getContainer || getTargetContainer || getDefaultContainer; return getFunc(); }; _this.handleScrollTo = function (link) { var _this$props = _this.props, offsetTop = _this$props.offsetTop, targetOffset = _this$props.targetOffset; _this.setCurrentActiveLink(link); var container = _this.getContainer(); var scrollTop = (0, _getScroll["default"])(container, true); var sharpLinkMatch = sharpMatcherRegx.exec(link); if (!sharpLinkMatch) { return; } var targetElement = document.getElementById(sharpLinkMatch[1]); if (!targetElement) { return; } var eleOffsetTop = getOffsetTop(targetElement, container); var y = scrollTop + eleOffsetTop; y -= targetOffset !== undefined ? targetOffset : offsetTop || 0; _this.animating = true; (0, _scrollTo["default"])(y, { callback: function callback() { _this.animating = false; }, getContainer: _this.getContainer }); }; _this.saveInkNode = function (node) { _this.inkNode = node; }; _this.setCurrentActiveLink = function (link) { var activeLink = _this.state.activeLink; var onChange = _this.props.onChange; if (activeLink !== link) { _this.setState({ activeLink: link }); if (onChange) { onChange(link); } } }; _this.handleScroll = function () { if (_this.animating) { return; } var _this$props2 = _this.props, offsetTop = _this$props2.offsetTop, bounds = _this$props2.bounds, targetOffset = _this$props2.targetOffset; var currentActiveLink = _this.getCurrentAnchor(targetOffset !== undefined ? targetOffset : offsetTop || 0, bounds); _this.setCurrentActiveLink(currentActiveLink); }; _this.updateInk = function () { var _assertThisInitialize = (0, _assertThisInitialized2["default"])(_this), prefixCls = _assertThisInitialize.prefixCls; var anchorNode = ReactDOM.findDOMNode((0, _assertThisInitialized2["default"])(_this)); var linkNode = anchorNode.getElementsByClassName("".concat(prefixCls, "-link-title-active"))[0]; if (linkNode) { _this.inkNode.style.top = "".concat(linkNode.offsetTop + linkNode.clientHeight / 2 - 4.5, "px"); } }; _this.render = function () { var _this$context = _this.context, getPrefixCls = _this$context.getPrefixCls, direction = _this$context.direction; var _this$props3 = _this.props, customizePrefixCls = _this$props3.prefixCls, _this$props3$classNam = _this$props3.className, className = _this$props3$classNam === void 0 ? '' : _this$props3$classNam, style = _this$props3.style, offsetTop = _this$props3.offsetTop, affix = _this$props3.affix, showInkInFixed = _this$props3.showInkInFixed, children = _this$props3.children; var activeLink = _this.state.activeLink; var prefixCls = getPrefixCls('anchor', customizePrefixCls); // To support old version react. // Have to add prefixCls on the instance. // https://github.com/facebook/react/issues/12397 _this.prefixCls = prefixCls; var inkClass = (0, _classnames["default"])("".concat(prefixCls, "-ink-ball"), { visible: activeLink }); var wrapperClass = (0, _classnames["default"])("".concat(prefixCls, "-wrapper"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); var anchorClass = (0, _classnames["default"])(prefixCls, { fixed: !affix && !showInkInFixed }); var wrapperStyle = (0, _extends2["default"])({ maxHeight: offsetTop ? "calc(100vh - ".concat(offsetTop, "px)") : '100vh' }, style); var anchorContent = /*#__PURE__*/React.createElement("div", { className: wrapperClass, style: wrapperStyle }, /*#__PURE__*/React.createElement("div", { className: anchorClass }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-ink") }, /*#__PURE__*/React.createElement("span", { className: inkClass, ref: _this.saveInkNode })), children)); return /*#__PURE__*/React.createElement(_context["default"].Provider, { value: { registerLink: _this.registerLink, unregisterLink: _this.unregisterLink, activeLink: _this.state.activeLink, scrollTo: _this.handleScrollTo, onClick: _this.props.onClick } }, !affix ? anchorContent : /*#__PURE__*/React.createElement(_affix["default"], { offsetTop: offsetTop, target: _this.getContainer }, anchorContent)); }; return _this; } (0, _createClass2["default"])(Anchor, [{ key: "componentDidMount", value: function componentDidMount() { this.scrollContainer = this.getContainer(); this.scrollEvent = (0, _addEventListener["default"])(this.scrollContainer, 'scroll', this.handleScroll); this.handleScroll(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { if (this.scrollEvent) { var currentContainer = this.getContainer(); if (this.scrollContainer !== currentContainer) { this.scrollContainer = currentContainer; this.scrollEvent.remove(); this.scrollEvent = (0, _addEventListener["default"])(this.scrollContainer, 'scroll', this.handleScroll); this.handleScroll(); } } this.updateInk(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.scrollEvent) { this.scrollEvent.remove(); } } }, { key: "getCurrentAnchor", value: function getCurrentAnchor() { var offsetTop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var bounds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5; var getCurrentAnchor = this.props.getCurrentAnchor; if (typeof getCurrentAnchor === 'function') { return getCurrentAnchor(); } var linkSections = []; var container = this.getContainer(); this.links.forEach(function (link) { var sharpLinkMatch = sharpMatcherRegx.exec(link.toString()); if (!sharpLinkMatch) { return; } var target = document.getElementById(sharpLinkMatch[1]); if (target) { var top = getOffsetTop(target, container); if (top < offsetTop + bounds) { linkSections.push({ link: link, top: top }); } } }); if (linkSections.length) { var maxSection = linkSections.reduce(function (prev, curr) { return curr.top > prev.top ? curr : prev; }); return maxSection.link; } return ''; } }]); return Anchor; }(React.Component); exports["default"] = Anchor; Anchor.defaultProps = { affix: true, showInkInFixed: false }; Anchor.contextType = _configProvider.ConfigContext; },{"../_util/getScroll":216,"../_util/scrollTo":226,"../affix":233,"../config-provider":278,"./context":239,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-util/lib/Dom/addEventListener":859,"react":"react","react-dom":"react-dom"}],238:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _context = _interopRequireDefault(require("./context")); var AnchorLink = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(AnchorLink, _React$Component); var _super = (0, _createSuper2["default"])(AnchorLink); function AnchorLink() { var _this; (0, _classCallCheck2["default"])(this, AnchorLink); _this = _super.apply(this, arguments); _this.handleClick = function (e) { var _this$context = _this.context, scrollTo = _this$context.scrollTo, onClick = _this$context.onClick; var _this$props = _this.props, href = _this$props.href, title = _this$props.title; if (onClick) { onClick(e, { title: title, href: href }); } scrollTo(href); }; _this.renderAnchorLink = function (_ref) { var getPrefixCls = _ref.getPrefixCls; var _this$props2 = _this.props, customizePrefixCls = _this$props2.prefixCls, href = _this$props2.href, title = _this$props2.title, children = _this$props2.children, className = _this$props2.className, target = _this$props2.target; var prefixCls = getPrefixCls('anchor', customizePrefixCls); var active = _this.context.activeLink === href; var wrapperClassName = (0, _classnames["default"])("".concat(prefixCls, "-link"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-link-active"), active), className); var titleClassName = (0, _classnames["default"])("".concat(prefixCls, "-link-title"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-link-title-active"), active)); return /*#__PURE__*/React.createElement("div", { className: wrapperClassName }, /*#__PURE__*/React.createElement("a", { className: titleClassName, href: href, title: typeof title === 'string' ? title : '', target: target, onClick: _this.handleClick }, title), children); }; return _this; } (0, _createClass2["default"])(AnchorLink, [{ key: "componentDidMount", value: function componentDidMount() { this.context.registerLink(this.props.href); } }, { key: "componentDidUpdate", value: function componentDidUpdate(_ref2) { var prevHref = _ref2.href; var href = this.props.href; if (prevHref !== href) { this.context.unregisterLink(prevHref); this.context.registerLink(href); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.context.unregisterLink(this.props.href); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderAnchorLink); } }]); return AnchorLink; }(React.Component); AnchorLink.defaultProps = { href: '#' }; AnchorLink.contextType = _context["default"]; var _default = AnchorLink; exports["default"] = _default; },{"../config-provider":278,"./context":239,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],239:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var AnchorContext = /*#__PURE__*/React.createContext(null); var _default = AnchorContext; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],240:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Anchor = _interopRequireDefault(require("./Anchor")); var _AnchorLink = _interopRequireDefault(require("./AnchorLink")); _Anchor["default"].Link = _AnchorLink["default"]; var _default = _Anchor["default"]; exports["default"] = _default; },{"./Anchor":237,"./AnchorLink":238,"@babel/runtime/helpers/interopRequireDefault":192}],241:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _select = _interopRequireDefault(require("../select")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _reactNode = require("../_util/reactNode"); /** * TODO: 4.0 * - remove `dataSource` * - `size` not work with customizeInput * - customizeInput not feedback `ENTER` key since accessibility enhancement */ var Option = _select["default"].Option; var InternalSelect = _select["default"]; function isSelectOptionOrSelectOptGroup(child) { return child && child.type && (child.type.isSelectOption || child.type.isSelectOptGroup); } var AutoComplete = function AutoComplete(props, ref) { var customizePrefixCls = props.prefixCls, className = props.className, children = props.children, dataSource = props.dataSource; var childNodes = (0, _toArray["default"])(children); var selectRef = React.useRef(); React.useImperativeHandle(ref, function () { return selectRef.current; }); // ============================= Input ============================= var customizeInput; if (childNodes.length === 1 && (0, _reactNode.isValidElement)(childNodes[0]) && !isSelectOptionOrSelectOptGroup(childNodes[0])) { var _childNodes = (0, _slicedToArray2["default"])(childNodes, 1); customizeInput = _childNodes[0]; } var getInputElement = customizeInput ? function () { return customizeInput; } : undefined; // ============================ Options ============================ var optionChildren; // [Legacy] convert `children` or `dataSource` into option children if (childNodes.length && isSelectOptionOrSelectOptGroup(childNodes[0])) { optionChildren = children; } else { optionChildren = dataSource ? dataSource.map(function (item) { if ((0, _reactNode.isValidElement)(item)) { return item; } switch ((0, _typeof2["default"])(item)) { case 'string': return /*#__PURE__*/React.createElement(Option, { key: item, value: item }, item); case 'object': { var optionValue = item.value; return /*#__PURE__*/React.createElement(Option, { key: optionValue, value: optionValue }, item.text); } default: throw new Error('AutoComplete[dataSource] only supports type `string[] | Object[]`.'); } }) : []; } // ============================ Warning ============================ React.useEffect(function () { (0, _devWarning["default"])(!('dataSource' in props), 'AutoComplete', '`dataSource` is deprecated, please use `options` instead.'); (0, _devWarning["default"])(!customizeInput || !('size' in props), 'AutoComplete', 'You need to control style self instead of setting `size` when using customize input.'); }, []); return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref) { var getPrefixCls = _ref.getPrefixCls; var prefixCls = getPrefixCls('select', customizePrefixCls); return /*#__PURE__*/React.createElement(InternalSelect, (0, _extends2["default"])({ ref: selectRef }, (0, _omit["default"])(props, ['dataSource']), { prefixCls: prefixCls, className: (0, _classnames["default"])("".concat(prefixCls, "-auto-complete"), className), mode: _select["default"].SECRET_COMBOBOX_MODE_DO_NOT_USE, getInputElement: getInputElement }), optionChildren); }); }; var RefAutoComplete = /*#__PURE__*/React.forwardRef(AutoComplete); RefAutoComplete.Option = Option; var _default = RefAutoComplete; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/reactNode":223,"../config-provider":278,"../select":377,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"classnames":455,"omit.js":579,"rc-util/lib/Children/toArray":858,"react":"react"}],242:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _ref = require("../_util/ref"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var InternalAvatar = function InternalAvatar(props, ref) { var _classNames, _classNames2; var _React$useState = React.useState(1), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), scale = _React$useState2[0], setScale = _React$useState2[1]; var _React$useState3 = React.useState(false), _React$useState4 = (0, _slicedToArray2["default"])(_React$useState3, 2), mounted = _React$useState4[0], setMounted = _React$useState4[1]; var _React$useState5 = React.useState(true), _React$useState6 = (0, _slicedToArray2["default"])(_React$useState5, 2), isImgExist = _React$useState6[0], setIsImgExist = _React$useState6[1]; var avatarNodeRef = React.useRef(); var avatarChildrenRef = React.useRef(); var avatarNodeMergeRef = (0, _ref.composeRef)(ref, avatarNodeRef); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var setScaleParam = function setScaleParam() { if (!avatarChildrenRef.current || !avatarNodeRef.current) { return; } var childrenWidth = avatarChildrenRef.current.offsetWidth; // offsetWidth avoid affecting be transform scale var nodeWidth = avatarNodeRef.current.offsetWidth; // denominator is 0 is no meaning if (childrenWidth !== 0 && nodeWidth !== 0) { var _props$gap = props.gap, gap = _props$gap === void 0 ? 4 : _props$gap; if (gap * 2 < nodeWidth) { setScale(nodeWidth - gap * 2 < childrenWidth ? (nodeWidth - gap * 2) / childrenWidth : 1); } } }; React.useEffect(function () { setMounted(true); }, []); React.useEffect(function () { setIsImgExist(true); setScale(1); }, [props.src]); React.useEffect(function () { setScaleParam(); }, [props.gap]); var handleImgLoadError = function handleImgLoadError() { var onError = props.onError; var errorFlag = onError ? onError() : undefined; if (errorFlag !== false) { setIsImgExist(false); } }; var customizePrefixCls = props.prefixCls, shape = props.shape, size = props.size, src = props.src, srcSet = props.srcSet, icon = props.icon, className = props.className, alt = props.alt, draggable = props.draggable, children = props.children, others = __rest(props, ["prefixCls", "shape", "size", "src", "srcSet", "icon", "className", "alt", "draggable", "children"]); (0, _devWarning["default"])(!(typeof icon === 'string' && icon.length > 2), 'Avatar', "`icon` is using ReactNode instead of string naming in v4. Please check `".concat(icon, "` at https://ant.design/components/icon")); var prefixCls = getPrefixCls('avatar', customizePrefixCls); var sizeCls = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-lg"), size === 'large'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-sm"), size === 'small'), _classNames)); var classString = (0, _classnames["default"])(prefixCls, sizeCls, (_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-").concat(shape), shape), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-image"), src && isImgExist), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-icon"), icon), _classNames2), className); var sizeStyle = typeof size === 'number' ? { width: size, height: size, lineHeight: "".concat(size, "px"), fontSize: icon ? size / 2 : 18 } : {}; var childrenToRender; if (src && isImgExist) { childrenToRender = /*#__PURE__*/React.createElement("img", { src: src, draggable: draggable, srcSet: srcSet, onError: handleImgLoadError, alt: alt }); } else if (icon) { childrenToRender = icon; } else if (mounted || scale !== 1) { var transformString = "scale(".concat(scale, ") translateX(-50%)"); var childrenStyle = { msTransform: transformString, WebkitTransform: transformString, transform: transformString }; var sizeChildrenStyle = typeof size === 'number' ? { lineHeight: "".concat(size, "px") } : {}; childrenToRender = /*#__PURE__*/React.createElement(_rcResizeObserver["default"], { onResize: setScaleParam }, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-string"), ref: function ref(node) { avatarChildrenRef.current = node; }, style: (0, _extends2["default"])((0, _extends2["default"])({}, sizeChildrenStyle), childrenStyle) }, children)); } else { childrenToRender = /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-string"), style: { opacity: 0 }, ref: function ref(node) { avatarChildrenRef.current = node; } }, children); } // The event is triggered twice from bubbling up the DOM tree. // see https://codesandbox.io/s/kind-snow-9lidz delete others.onError; delete others.gap; return /*#__PURE__*/React.createElement("span", (0, _extends2["default"])({}, others, { style: (0, _extends2["default"])((0, _extends2["default"])({}, sizeStyle), others.style), className: classString, ref: avatarNodeMergeRef }), childrenToRender); }; var Avatar = /*#__PURE__*/React.forwardRef(InternalAvatar); Avatar.displayName = 'Avatar'; Avatar.defaultProps = { shape: 'circle', size: 'default' }; var _default = Avatar; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/ref":224,"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-resize-observer":729,"react":"react"}],243:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _reactNode = require("../_util/reactNode"); var _configProvider = require("../config-provider"); var _avatar = _interopRequireDefault(require("./avatar")); var _popover = _interopRequireDefault(require("../popover")); var Group = function Group(props) { var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? '' : _props$className, maxCount = props.maxCount, maxStyle = props.maxStyle; var prefixCls = getPrefixCls('avatar-group', customizePrefixCls); var cls = (0, _classnames["default"])(prefixCls, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); var children = props.children, _props$maxPopoverPlac = props.maxPopoverPlacement, maxPopoverPlacement = _props$maxPopoverPlac === void 0 ? 'top' : _props$maxPopoverPlac; var childrenWithProps = (0, _toArray["default"])(children).map(function (child, index) { return (0, _reactNode.cloneElement)(child, { key: "avatar-key-".concat(index) }); }); var numOfChildren = childrenWithProps.length; if (maxCount && maxCount < numOfChildren) { var childrenShow = childrenWithProps.slice(0, maxCount); var childrenHidden = childrenWithProps.slice(maxCount, numOfChildren); childrenShow.push( /*#__PURE__*/React.createElement(_popover["default"], { key: "avatar-popover-key", content: childrenHidden, trigger: "hover", placement: maxPopoverPlacement, overlayClassName: "".concat(prefixCls, "-popover") }, /*#__PURE__*/React.createElement(_avatar["default"], { style: maxStyle }, "+".concat(numOfChildren - maxCount)))); return /*#__PURE__*/React.createElement("div", { className: cls, style: props.style }, childrenShow); } return /*#__PURE__*/React.createElement("div", { className: cls, style: props.style }, children); }; var _default = Group; exports["default"] = _default; },{"../_util/reactNode":223,"../config-provider":278,"../popover":359,"./avatar":242,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-util/lib/Children/toArray":858,"react":"react"}],244:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Group", { enumerable: true, get: function get() { return _group["default"]; } }); exports["default"] = void 0; var _avatar = _interopRequireDefault(require("./avatar")); var _group = _interopRequireDefault(require("./group")); var Avatar = _avatar["default"]; Avatar.Group = _group["default"]; var _default = Avatar; exports["default"] = _default; },{"./avatar":242,"./group":243,"@babel/runtime/helpers/interopRequireDefault":192}],245:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _rcAnimate = _interopRequireDefault(require("rc-animate")); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _VerticalAlignTopOutlined = _interopRequireDefault(require("@ant-design/icons/VerticalAlignTopOutlined")); var _throttleByAnimationFrame = require("../_util/throttleByAnimationFrame"); var _configProvider = require("../config-provider"); var _getScroll = _interopRequireDefault(require("../_util/getScroll")); var _scrollTo = _interopRequireDefault(require("../_util/scrollTo")); var BackTop = function BackTop(props) { var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1]; var ref = /*#__PURE__*/React.createRef(); var scrollEvent = React.useRef(); var getDefaultTarget = function getDefaultTarget() { return ref.current && ref.current.ownerDocument ? ref.current.ownerDocument : window; }; var handleScroll = (0, _throttleByAnimationFrame.throttleByAnimationFrame)(function (e) { var visibilityHeight = props.visibilityHeight; var scrollTop = (0, _getScroll["default"])(e.target, true); setVisible(scrollTop > visibilityHeight); }); var bindScrollEvent = function bindScrollEvent() { var target = props.target; var getTarget = target || getDefaultTarget; var container = getTarget(); scrollEvent.current = (0, _addEventListener["default"])(container, 'scroll', function (e) { handleScroll(e); }); handleScroll({ target: container }); }; React.useEffect(function () { bindScrollEvent(); return function () { if (scrollEvent.current) { scrollEvent.current.remove(); } handleScroll.cancel(); }; }, [props.target]); var getVisible = function getVisible() { if ('visible' in props) { return props.visible; } return visible; }; var scrollToTop = function scrollToTop(e) { var onClick = props.onClick, target = props.target, _props$duration = props.duration, duration = _props$duration === void 0 ? 450 : _props$duration; (0, _scrollTo["default"])(0, { getContainer: target || getDefaultTarget, duration: duration }); if (typeof onClick === 'function') { onClick(e); } }; var renderChildren = function renderChildren(_ref) { var prefixCls = _ref.prefixCls; var children = props.children; var defaultElement = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-content") }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-icon") }, /*#__PURE__*/React.createElement(_VerticalAlignTopOutlined["default"], null))); return /*#__PURE__*/React.createElement(_rcAnimate["default"], { component: "", transitionName: "fade" }, getVisible() ? /*#__PURE__*/React.createElement("div", null, children || defaultElement) : null); }; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? '' : _props$className; var prefixCls = getPrefixCls('back-top', customizePrefixCls); var classString = (0, _classnames["default"])(prefixCls, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); // fix https://fb.me/react-unknown-prop var divProps = (0, _omit["default"])(props, ['prefixCls', 'className', 'children', 'visibilityHeight', 'target', 'visible']); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, divProps, { className: classString, onClick: scrollToTop, ref: ref }), renderChildren({ prefixCls: prefixCls })); }; BackTop.defaultProps = { visibilityHeight: 400 }; var _default = /*#__PURE__*/React.memo(BackTop); exports["default"] = _default; },{"../_util/getScroll":216,"../_util/scrollTo":226,"../_util/throttleByAnimationFrame":228,"../config-provider":278,"@ant-design/icons/VerticalAlignTopOutlined":107,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"omit.js":579,"rc-animate":586,"rc-util/lib/Dom/addEventListener":859,"react":"react"}],246:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _utils = require("./utils"); var Ribbon = function Ribbon(_ref) { var _classNames; var className = _ref.className, customizePrefixCls = _ref.prefixCls, style = _ref.style, color = _ref.color, children = _ref.children, text = _ref.text, _ref$placement = _ref.placement, placement = _ref$placement === void 0 ? 'end' : _ref$placement; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var prefixCls = getPrefixCls('ribbon', customizePrefixCls); var colorInPreset = (0, _utils.isPresetColor)(color); var ribbonCls = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-placement-").concat(placement), (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-color-").concat(color), colorInPreset), _classNames), className); var colorStyle = {}; var cornerColorStyle = {}; if (color && !colorInPreset) { colorStyle.background = color; cornerColorStyle.color = color; } return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-wrapper") }, children, /*#__PURE__*/React.createElement("div", { className: ribbonCls, style: (0, _extends2["default"])((0, _extends2["default"])({}, colorStyle), style) }, text, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-corner"), style: cornerColorStyle }))); }; var _default = Ribbon; exports["default"] = _default; },{"../config-provider":278,"./utils":249,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],247:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; function getNumberArray(num) { return num ? num.toString().split('').reverse().map(function (i) { var current = Number(i); return isNaN(current) ? i : current; }) : []; } function renderNumberList(position, className) { var childrenToReturn = []; for (var i = 0; i < 30; i++) { childrenToReturn.push( /*#__PURE__*/React.createElement("p", { key: i.toString(), className: (0, _classnames["default"])(className, { current: position === i }) }, i % 10)); } return childrenToReturn; } var ScrollNumber = function ScrollNumber(_a) { var customizePrefixCls = _a.prefixCls, customizeCount = _a.count, className = _a.className, style = _a.style, title = _a.title, _a$component = _a.component, component = _a$component === void 0 ? 'sup' : _a$component, displayComponent = _a.displayComponent, _a$onAnimated = _a.onAnimated, onAnimated = _a$onAnimated === void 0 ? function () {} : _a$onAnimated, restProps = __rest(_a, ["prefixCls", "count", "className", "style", "title", "component", "displayComponent", "onAnimated"]); var _React$useState = React.useState(true), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), animateStarted = _React$useState2[0], setAnimateStarted = _React$useState2[1]; var _React$useState3 = React.useState(customizeCount), _React$useState4 = (0, _slicedToArray2["default"])(_React$useState3, 2), count = _React$useState4[0], setCount = _React$useState4[1]; var _React$useState5 = React.useState(customizeCount), _React$useState6 = (0, _slicedToArray2["default"])(_React$useState5, 2), prevCount = _React$useState6[0], setPrevCount = _React$useState6[1]; var _React$useState7 = React.useState(customizeCount), _React$useState8 = (0, _slicedToArray2["default"])(_React$useState7, 2), lastCount = _React$useState8[0], setLastCount = _React$useState8[1]; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('scroll-number', customizePrefixCls); if (prevCount !== customizeCount) { setAnimateStarted(true); setPrevCount(customizeCount); } React.useEffect(function () { setLastCount(count); var timeout; if (animateStarted) { // Let browser has time to reset the scroller before actually // performing the transition. timeout = setTimeout(function () { setAnimateStarted(false); setCount(customizeCount); onAnimated(); }); } return function () { if (timeout) { clearTimeout(timeout); } }; }, [animateStarted, customizeCount, onAnimated]); var getPositionByNum = function getPositionByNum(num, i) { var currentCount = Math.abs(Number(count)); var lstCount = Math.abs(Number(lastCount)); var currentDigit = Math.abs(getNumberArray(count)[i]); var lastDigit = Math.abs(getNumberArray(lstCount)[i]); if (animateStarted) { return 10 + num; } // 同方向则在同一侧切换数字 if (currentCount > lstCount) { if (currentDigit >= lastDigit) { return 10 + num; } return 20 + num; } if (currentDigit <= lastDigit) { return 10 + num; } return num; }; var renderCurrentNumber = function renderCurrentNumber(num, i) { if (typeof num === 'number') { var position = getPositionByNum(num, i); var removeTransition = animateStarted || getNumberArray(lastCount)[i] === undefined; return /*#__PURE__*/React.createElement('span', { className: "".concat(prefixCls, "-only"), style: { transition: removeTransition ? 'none' : undefined, msTransform: "translateY(".concat(-position * 100, "%)"), WebkitTransform: "translateY(".concat(-position * 100, "%)"), transform: "translateY(".concat(-position * 100, "%)") }, key: i }, renderNumberList(position, "".concat(prefixCls, "-only-unit"))); } return /*#__PURE__*/React.createElement("span", { key: "symbol", className: "".concat(prefixCls, "-symbol") }, num); }; var renderNumberElement = function renderNumberElement() { if (count && Number(count) % 1 === 0) { return getNumberArray(count).map(function (num, i) { return renderCurrentNumber(num, i); }).reverse(); } return count; }; var newProps = (0, _extends2["default"])((0, _extends2["default"])({}, restProps), { style: style, className: (0, _classnames["default"])(prefixCls, className), title: title }); // allow specify the border // mock border-color by box-shadow for compatible with old usage: // if (style && style.borderColor) { newProps.style = (0, _extends2["default"])((0, _extends2["default"])({}, style), { boxShadow: "0 0 0 1px ".concat(style.borderColor, " inset") }); } if (displayComponent) { return (0, _reactNode.cloneElement)(displayComponent, { className: (0, _classnames["default"])("".concat(prefixCls, "-custom-component"), displayComponent.props && displayComponent.props.className) }); } return /*#__PURE__*/React.createElement(component, newProps, renderNumberElement()); }; var _default = ScrollNumber; exports["default"] = _default; },{"../_util/reactNode":223,"../config-provider":278,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"react":"react"}],248:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcAnimate = _interopRequireDefault(require("rc-animate")); var _classnames = _interopRequireDefault(require("classnames")); var _ScrollNumber = _interopRequireDefault(require("./ScrollNumber")); var _Ribbon = _interopRequireDefault(require("./Ribbon")); var _configProvider = require("../config-provider"); var _reactNode = require("../_util/reactNode"); var _utils = require("./utils"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Badge = function Badge(_a) { var _classNames2, _classNames3; var customizePrefixCls = _a.prefixCls, customizeScrollNumberPrefixCls = _a.scrollNumberPrefixCls, children = _a.children, status = _a.status, text = _a.text, color = _a.color, _a$count = _a.count, count = _a$count === void 0 ? null : _a$count, _a$overflowCount = _a.overflowCount, overflowCount = _a$overflowCount === void 0 ? 99 : _a$overflowCount, _a$dot = _a.dot, dot = _a$dot === void 0 ? false : _a$dot, _a$size = _a.size, size = _a$size === void 0 ? 'default' : _a$size, title = _a.title, offset = _a.offset, style = _a.style, className = _a.className, _a$showZero = _a.showZero, showZero = _a$showZero === void 0 ? false : _a$showZero, restProps = __rest(_a, ["prefixCls", "scrollNumberPrefixCls", "children", "status", "text", "color", "count", "overflowCount", "dot", "size", "title", "offset", "style", "className", "showZero"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var prefixCls = getPrefixCls('badge', customizePrefixCls); var getNumberedDisplayCount = function getNumberedDisplayCount() { var displayCount = count > overflowCount ? "".concat(overflowCount, "+") : count; return displayCount; }; var hasStatus = function hasStatus() { return status !== null && status !== undefined || color !== null && color !== undefined; }; var isZero = function isZero() { var numberedDisplayCount = getNumberedDisplayCount(); return numberedDisplayCount === '0' || numberedDisplayCount === 0; }; var isDot = function isDot() { return dot && !isZero() || hasStatus(); }; var getDisplayCount = function getDisplayCount() { // dot mode don't need count if (isDot()) { return ''; } return getNumberedDisplayCount(); }; var getScrollNumberTitle = function getScrollNumberTitle() { if (title) { return title; } return typeof count === 'string' || typeof count === 'number' ? count : undefined; }; var getStyleWithOffset = function getStyleWithOffset() { if (direction === 'rtl') { return offset ? (0, _extends2["default"])({ left: parseInt(offset[0], 10), marginTop: offset[1] }, style) : style; } return offset ? (0, _extends2["default"])({ right: -parseInt(offset[0], 10), marginTop: offset[1] }, style) : style; }; var isHidden = function isHidden() { var displayCount = getDisplayCount(); var isEmpty = displayCount === null || displayCount === undefined || displayCount === ''; return (isEmpty || isZero() && !showZero) && !isDot(); }; var renderStatusText = function renderStatusText() { var hidden = isHidden(); return hidden || !text ? null : /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-status-text") }, text); }; var renderDisplayComponent = function renderDisplayComponent() { var customNode = count; if (!customNode || (0, _typeof2["default"])(customNode) !== 'object') { return undefined; } return (0, _reactNode.cloneElement)(customNode, { style: (0, _extends2["default"])((0, _extends2["default"])({}, getStyleWithOffset()), customNode.props && customNode.props.style) }); }; var renderBadgeNumber = function renderBadgeNumber() { var _classNames; var scrollNumberPrefixCls = getPrefixCls('scroll-number', customizeScrollNumberPrefixCls); var displayCount = getDisplayCount(); var bDot = isDot(); var hidden = isHidden(); var scrollNumberCls = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-dot"), bDot), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-count"), !bDot), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-count-sm"), size === 'small'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-multiple-words"), !bDot && count && count.toString && count.toString().length > 1), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-status-").concat(status), !!status), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-status-").concat(color), (0, _utils.isPresetColor)(color)), _classNames)); var statusStyle = getStyleWithOffset(); if (color && !(0, _utils.isPresetColor)(color)) { statusStyle = statusStyle || {}; statusStyle.background = color; } return hidden ? null : /*#__PURE__*/React.createElement(_ScrollNumber["default"], { prefixCls: scrollNumberPrefixCls, "data-show": !hidden, className: scrollNumberCls, count: displayCount, displayComponent: renderDisplayComponent() // }> , title: getScrollNumberTitle(), style: statusStyle, key: "scrollNumber" }); }; var statusCls = (0, _classnames["default"])((_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-status-dot"), hasStatus()), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-status-").concat(status), !!status), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-status-").concat(color), (0, _utils.isPresetColor)(color)), _classNames2)); var statusStyle = {}; if (color && !(0, _utils.isPresetColor)(color)) { statusStyle.background = color; } var badgeClassName = (0, _classnames["default"])(prefixCls, (_classNames3 = {}, (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-status"), hasStatus()), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-not-a-wrapper"), !children), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames3), className); // if (!children && hasStatus()) { var styleWithOffset = getStyleWithOffset(); var statusTextColor = styleWithOffset && styleWithOffset.color; return /*#__PURE__*/React.createElement("span", (0, _extends2["default"])({}, restProps, { className: badgeClassName, style: styleWithOffset }), /*#__PURE__*/React.createElement("span", { className: statusCls, style: statusStyle }), /*#__PURE__*/React.createElement("span", { style: { color: statusTextColor }, className: "".concat(prefixCls, "-status-text") }, text)); } return /*#__PURE__*/React.createElement("span", (0, _extends2["default"])({}, restProps, { className: badgeClassName }), children, /*#__PURE__*/React.createElement(_rcAnimate["default"], { component: "", showProp: "data-show", transitionName: children ? "".concat(prefixCls, "-zoom") : '', transitionAppear: true }, renderBadgeNumber()), renderStatusText()); }; Badge.Ribbon = _Ribbon["default"]; var _default = Badge; exports["default"] = _default; },{"../_util/reactNode":223,"../config-provider":278,"./Ribbon":246,"./ScrollNumber":247,"./utils":249,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"classnames":455,"rc-animate":586,"react":"react"}],249:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isPresetColor = isPresetColor; var _colors = require("../_util/colors"); // eslint-disable-next-line import/prefer-default-export function isPresetColor(color) { return _colors.PresetColorTypes.indexOf(color) !== -1; } },{"../_util/colors":211}],250:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _BreadcrumbItem = _interopRequireDefault(require("./BreadcrumbItem")); var _BreadcrumbSeparator = _interopRequireDefault(require("./BreadcrumbSeparator")); var _menu = _interopRequireDefault(require("../menu")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; function getBreadcrumbName(route, params) { if (!route.breadcrumbName) { return null; } var paramsKeys = Object.keys(params).join('|'); var name = route.breadcrumbName.replace(new RegExp(":(".concat(paramsKeys, ")"), 'g'), function (replacement, key) { return params[key] || replacement; }); return name; } function defaultItemRender(route, params, routes, paths) { var isLastItem = routes.indexOf(route) === routes.length - 1; var name = getBreadcrumbName(route, params); return isLastItem ? /*#__PURE__*/React.createElement("span", null, name) : /*#__PURE__*/React.createElement("a", { href: "#/".concat(paths.join('/')) }, name); } var getPath = function getPath(path, params) { path = (path || '').replace(/^\//, ''); Object.keys(params).forEach(function (key) { path = path.replace(":".concat(key), params[key]); }); return path; }; var addChildPath = function addChildPath(paths) { var childPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var params = arguments.length > 2 ? arguments[2] : undefined; var originalPaths = (0, _toConsumableArray2["default"])(paths); var path = getPath(childPath, params); if (path) { originalPaths.push(path); } return originalPaths; }; var Breadcrumb = function Breadcrumb(_a) { var customizePrefixCls = _a.prefixCls, _a$separator = _a.separator, separator = _a$separator === void 0 ? '/' : _a$separator, style = _a.style, className = _a.className, routes = _a.routes, children = _a.children, _a$itemRender = _a.itemRender, itemRender = _a$itemRender === void 0 ? defaultItemRender : _a$itemRender, _a$params = _a.params, params = _a$params === void 0 ? {} : _a$params, restProps = __rest(_a, ["prefixCls", "separator", "style", "className", "routes", "children", "itemRender", "params"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var crumbs; var prefixCls = getPrefixCls('breadcrumb', customizePrefixCls); if (routes && routes.length > 0) { // generated by route var paths = []; crumbs = routes.map(function (route) { var path = getPath(route.path, params); if (path) { paths.push(path); } // generated overlay by route.children var overlay; if (route.children && route.children.length) { overlay = /*#__PURE__*/React.createElement(_menu["default"], null, route.children.map(function (child) { return /*#__PURE__*/React.createElement(_menu["default"].Item, { key: child.path || child.breadcrumbName }, itemRender(child, params, routes, addChildPath(paths, child.path, params))); })); } return /*#__PURE__*/React.createElement(_BreadcrumbItem["default"], { overlay: overlay, separator: separator, key: path || route.breadcrumbName }, itemRender(route, params, routes, paths)); }); } else if (children) { crumbs = (0, _toArray["default"])(children).map(function (element, index) { if (!element) { return element; } (0, _devWarning["default"])(element.type && (element.type.__ANT_BREADCRUMB_ITEM === true || element.type.__ANT_BREADCRUMB_SEPARATOR === true), 'Breadcrumb', "Only accepts Breadcrumb.Item and Breadcrumb.Separator as it's children"); return (0, _reactNode.cloneElement)(element, { separator: separator, key: index }); }); } var breadcrumbClassName = (0, _classnames["default"])(prefixCls, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({ className: breadcrumbClassName, style: style }, restProps), crumbs); }; Breadcrumb.Item = _BreadcrumbItem["default"]; Breadcrumb.Separator = _BreadcrumbSeparator["default"]; var _default = Breadcrumb; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/reactNode":223,"../config-provider":278,"../menu":341,"./BreadcrumbItem":251,"./BreadcrumbSeparator":252,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"rc-util/lib/Children/toArray":858,"react":"react"}],251:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _DownOutlined = _interopRequireDefault(require("@ant-design/icons/DownOutlined")); var _dropdown = _interopRequireDefault(require("../dropdown/dropdown")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var BreadcrumbItem = function BreadcrumbItem(_a) { var customizePrefixCls = _a.prefixCls, _a$separator = _a.separator, separator = _a$separator === void 0 ? '/' : _a$separator, children = _a.children, overlay = _a.overlay, dropdownProps = _a.dropdownProps, restProps = __rest(_a, ["prefixCls", "separator", "children", "overlay", "dropdownProps"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('breadcrumb', customizePrefixCls); /** * if overlay is have * Wrap a DropDown */ var renderBreadcrumbNode = function renderBreadcrumbNode(breadcrumbItem) { if (overlay) { return /*#__PURE__*/React.createElement(_dropdown["default"], (0, _extends2["default"])({ overlay: overlay, placement: "bottomCenter" }, dropdownProps), /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-overlay-link") }, breadcrumbItem, /*#__PURE__*/React.createElement(_DownOutlined["default"], null))); } return breadcrumbItem; }; var link; if ('href' in restProps) { link = /*#__PURE__*/React.createElement("a", (0, _extends2["default"])({ className: "".concat(prefixCls, "-link") }, restProps), children); } else { link = /*#__PURE__*/React.createElement("span", (0, _extends2["default"])({ className: "".concat(prefixCls, "-link") }, restProps), children); } // wrap to dropDown link = renderBreadcrumbNode(link); if (children) { return /*#__PURE__*/React.createElement("span", null, link, separator && separator !== '' && /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-separator") }, separator)); } return null; }; BreadcrumbItem.__ANT_BREADCRUMB_ITEM = true; var _default = BreadcrumbItem; exports["default"] = _default; },{"../config-provider":278,"../dropdown/dropdown":295,"@ant-design/icons/DownOutlined":76,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],252:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _configProvider = require("../config-provider"); var BreadcrumbSeparator = function BreadcrumbSeparator(_ref) { var children = _ref.children; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('breadcrumb'); return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-separator") }, children || '/'); }; BreadcrumbSeparator.__ANT_BREADCRUMB_SEPARATOR = true; var _default = BreadcrumbSeparator; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],253:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Breadcrumb = _interopRequireDefault(require("./Breadcrumb")); var _default = _Breadcrumb["default"]; exports["default"] = _default; },{"./Breadcrumb":250,"@babel/runtime/helpers/interopRequireDefault":192}],254:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = LoadingIcon; var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcMotion = _interopRequireDefault(require("rc-motion")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons/LoadingOutlined")); var getCollapsedWidth = function getCollapsedWidth() { return { width: 0, opacity: 0, transform: 'scale(0)' }; }; var getRealWidth = function getRealWidth(node) { return { width: node.scrollWidth, opacity: 1, transform: 'scale(1)' }; }; function LoadingIcon(_ref) { var prefixCls = _ref.prefixCls, loading = _ref.loading, existIcon = _ref.existIcon; var visible = !!loading; if (existIcon) { return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-loading-icon") }, /*#__PURE__*/React.createElement(_LoadingOutlined["default"], null)); } return /*#__PURE__*/React.createElement(_rcMotion["default"], { visible: visible // We do not really use this motionName , motionName: "".concat(prefixCls, "-loading-icon-motion"), removeOnLeave: true, onAppearStart: getCollapsedWidth, onAppearActive: getRealWidth, onEnterStart: getCollapsedWidth, onEnterActive: getRealWidth, onLeaveStart: getRealWidth, onLeaveActive: getCollapsedWidth }, function (_ref2, ref) { var className = _ref2.className, style = _ref2.style; return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-loading-icon"), style: style, ref: ref }, /*#__PURE__*/React.createElement(_LoadingOutlined["default"], { className: (0, _classnames["default"])(className) })); }); } },{"@ant-design/icons/LoadingOutlined":93,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-motion":661,"react":"react"}],255:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _unreachableException = _interopRequireDefault(require("../_util/unreachableException")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var ButtonGroup = function ButtonGroup(props) { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref) { var _classNames; var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var customizePrefixCls = props.prefixCls, size = props.size, className = props.className, others = __rest(props, ["prefixCls", "size", "className"]); var prefixCls = getPrefixCls('btn-group', customizePrefixCls); // large => lg // small => sm var sizeCls = ''; switch (size) { case 'large': sizeCls = 'lg'; break; case 'small': sizeCls = 'sm'; break; case 'middle': case undefined: break; default: // eslint-disable-next-line no-console console.warn(new _unreachableException["default"](size)); } var classes = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(sizeCls), sizeCls), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, others, { className: classes })); }); }; var _default = ButtonGroup; exports["default"] = _default; },{"../_util/unreachableException":231,"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],256:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.convertLegacyProps = convertLegacyProps; exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _buttonGroup = _interopRequireDefault(require("./button-group")); var _configProvider = require("../config-provider"); var _wave = _interopRequireDefault(require("../_util/wave")); var _type = require("../_util/type"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var _LoadingIcon = _interopRequireDefault(require("./LoadingIcon")); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; /* eslint-disable react/button-has-type */ var rxTwoCNChar = /^[\u4e00-\u9fa5]{2}$/; var isTwoCNChar = rxTwoCNChar.test.bind(rxTwoCNChar); function isString(str) { return typeof str === 'string'; } function isUnborderedButtonType(type) { return type === 'text' || type === 'link'; } // Insert one space between two chinese characters automatically. function insertSpace(child, needInserted) { // Check the child if is undefined or null. if (child == null) { return; } var SPACE = needInserted ? ' ' : ''; // strictNullChecks oops. if (typeof child !== 'string' && typeof child !== 'number' && isString(child.type) && isTwoCNChar(child.props.children)) { return (0, _reactNode.cloneElement)(child, { children: child.props.children.split('').join(SPACE) }); } if (typeof child === 'string') { if (isTwoCNChar(child)) { child = child.split('').join(SPACE); } return /*#__PURE__*/React.createElement("span", null, child); } return child; } function spaceChildren(children, needInserted) { var isPrevChildPure = false; var childList = []; React.Children.forEach(children, function (child) { var type = (0, _typeof2["default"])(child); var isCurrentChildPure = type === 'string' || type === 'number'; if (isPrevChildPure && isCurrentChildPure) { var lastIndex = childList.length - 1; var lastChild = childList[lastIndex]; childList[lastIndex] = "".concat(lastChild).concat(child); } else { childList.push(child); } isPrevChildPure = isCurrentChildPure; }); // Pass to React.Children.map to auto fill key return React.Children.map(childList, function (child) { return insertSpace(child, needInserted); }); } var ButtonTypes = (0, _type.tuple)('default', 'primary', 'ghost', 'dashed', 'link', 'text'); var ButtonShapes = (0, _type.tuple)('circle', 'circle-outline', 'round'); var ButtonHTMLTypes = (0, _type.tuple)('submit', 'button', 'reset'); function convertLegacyProps(type) { if (type === 'danger') { return { danger: true }; } return { type: type }; } var InternalButton = function InternalButton(props, ref) { var _classNames; var loading = props.loading, customizePrefixCls = props.prefixCls, type = props.type, danger = props.danger, shape = props.shape, customizeSize = props.size, className = props.className, children = props.children, icon = props.icon, ghost = props.ghost, block = props.block, rest = __rest(props, ["loading", "prefixCls", "type", "danger", "shape", "size", "className", "children", "icon", "ghost", "block"]); var size = React.useContext(_SizeContext["default"]); var _React$useState = React.useState(!!loading), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), innerLoading = _React$useState2[0], setLoading = _React$useState2[1]; var _React$useState3 = React.useState(false), _React$useState4 = (0, _slicedToArray2["default"])(_React$useState3, 2), hasTwoCNChar = _React$useState4[0], setHasTwoCNChar = _React$useState4[1]; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, autoInsertSpaceInButton = _React$useContext.autoInsertSpaceInButton, direction = _React$useContext.direction; var buttonRef = ref || /*#__PURE__*/React.createRef(); var delayTimeoutRef = React.useRef(); var isNeedInserted = function isNeedInserted() { return React.Children.count(children) === 1 && !icon && !isUnborderedButtonType(type); }; var fixTwoCNChar = function fixTwoCNChar() { // Fix for HOC usage like if (!buttonRef || !buttonRef.current || autoInsertSpaceInButton === false) { return; } var buttonText = buttonRef.current.textContent; if (isNeedInserted() && isTwoCNChar(buttonText)) { if (!hasTwoCNChar) { setHasTwoCNChar(true); } } else if (hasTwoCNChar) { setHasTwoCNChar(false); } }; // =============== Update Loading =============== var loadingOrDelay; if ((0, _typeof2["default"])(loading) === 'object' && loading.delay) { loadingOrDelay = loading.delay || true; } else { loadingOrDelay = !!loading; } React.useEffect(function () { clearTimeout(delayTimeoutRef.current); if (typeof loadingOrDelay === 'number') { delayTimeoutRef.current = window.setTimeout(function () { setLoading(loadingOrDelay); }, loadingOrDelay); } else { setLoading(loadingOrDelay); } }, [loadingOrDelay]); React.useEffect(function () { fixTwoCNChar(); }, [buttonRef]); var handleClick = function handleClick(e) { var onClick = props.onClick; if (innerLoading) { return; } if (onClick) { onClick(e); } }; (0, _devWarning["default"])(!(typeof icon === 'string' && icon.length > 2), 'Button', "`icon` is using ReactNode instead of string naming in v4. Please check `".concat(icon, "` at https://ant.design/components/icon")); (0, _devWarning["default"])(!(ghost && isUnborderedButtonType(type)), 'Button', "`link` or `text` button can't be a `ghost` button."); var prefixCls = getPrefixCls('btn', customizePrefixCls); var autoInsertSpace = autoInsertSpaceInButton !== false; // large => lg // small => sm var sizeCls = ''; switch (customizeSize || size) { case 'large': sizeCls = 'lg'; break; case 'small': sizeCls = 'sm'; break; default: break; } var iconType = innerLoading ? 'loading' : icon; var classes = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(type), type), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(shape), shape), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(sizeCls), sizeCls), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-icon-only"), !children && children !== 0 && iconType), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-background-ghost"), ghost && !isUnborderedButtonType(type)), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-loading"), innerLoading), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-two-chinese-chars"), hasTwoCNChar && autoInsertSpace), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-block"), block), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-dangerous"), !!danger), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); var iconNode = icon && !innerLoading ? icon : /*#__PURE__*/React.createElement(_LoadingIcon["default"], { existIcon: !!icon, prefixCls: prefixCls, loading: !!innerLoading }); var kids = children || children === 0 ? spaceChildren(children, isNeedInserted() && autoInsertSpace) : null; var linkButtonRestProps = (0, _omit["default"])(rest, ['htmlType', 'loading', 'navigate']); if (linkButtonRestProps.href !== undefined) { return /*#__PURE__*/React.createElement("a", (0, _extends2["default"])({}, linkButtonRestProps, { className: classes, onClick: handleClick, ref: buttonRef }), iconNode, kids); } // React does not recognize the `htmlType` prop on a DOM element. Here we pick it out of `rest`. var _a = rest, htmlType = _a.htmlType, otherProps = __rest(_a, ["htmlType"]); var buttonNode = /*#__PURE__*/React.createElement("button", (0, _extends2["default"])({}, (0, _omit["default"])(otherProps, ['loading']), { type: htmlType, className: classes, onClick: handleClick, ref: buttonRef }), iconNode, kids); if (isUnborderedButtonType(type)) { return buttonNode; } return /*#__PURE__*/React.createElement(_wave["default"], null, buttonNode); }; var Button = /*#__PURE__*/React.forwardRef(InternalButton); Button.displayName = 'Button'; Button.defaultProps = { loading: false, ghost: false, block: false, htmlType: 'button' }; Button.Group = _buttonGroup["default"]; Button.__ANT_BUTTON = true; var _default = Button; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/reactNode":223,"../_util/type":230,"../_util/wave":232,"../config-provider":278,"../config-provider/SizeContext":276,"./LoadingIcon":254,"./button-group":255,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"classnames":455,"omit.js":579,"react":"react"}],257:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _button = _interopRequireDefault(require("./button")); var _default = _button["default"]; exports["default"] = _default; },{"./button":256,"@babel/runtime/helpers/interopRequireDefault":192}],258:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _select = _interopRequireDefault(require("../select")); var _radio = require("../radio"); var YearSelectOffset = 10; var YearSelectTotal = 20; function YearSelect(props) { var fullscreen = props.fullscreen, validRange = props.validRange, generateConfig = props.generateConfig, locale = props.locale, prefixCls = props.prefixCls, value = props.value, _onChange = props.onChange, divRef = props.divRef; var year = generateConfig.getYear(value); var start = year - YearSelectOffset; var end = start + YearSelectTotal; if (validRange) { start = generateConfig.getYear(validRange[0]); end = generateConfig.getYear(validRange[1]) + 1; } var suffix = locale && locale.year === '年' ? '年' : ''; var options = []; for (var index = start; index < end; index++) { options.push({ label: "".concat(index).concat(suffix), value: index }); } return /*#__PURE__*/React.createElement(_select["default"], { size: fullscreen ? undefined : 'small', options: options, value: year, className: "".concat(prefixCls, "-year-select"), onChange: function onChange(numYear) { var newDate = generateConfig.setYear(value, numYear); if (validRange) { var _validRange = (0, _slicedToArray2["default"])(validRange, 2), startDate = _validRange[0], endDate = _validRange[1]; var newYear = generateConfig.getYear(newDate); var newMonth = generateConfig.getMonth(newDate); if (newYear === generateConfig.getYear(endDate) && newMonth > generateConfig.getMonth(endDate)) { newDate = generateConfig.setMonth(newDate, generateConfig.getMonth(endDate)); } if (newYear === generateConfig.getYear(startDate) && newMonth < generateConfig.getMonth(startDate)) { newDate = generateConfig.setMonth(newDate, generateConfig.getMonth(startDate)); } } _onChange(newDate); }, getPopupContainer: function getPopupContainer() { return divRef.current; } }); } function MonthSelect(props) { var prefixCls = props.prefixCls, fullscreen = props.fullscreen, validRange = props.validRange, value = props.value, generateConfig = props.generateConfig, locale = props.locale, _onChange2 = props.onChange, divRef = props.divRef; var month = generateConfig.getMonth(value); var start = 0; var end = 11; if (validRange) { var _validRange2 = (0, _slicedToArray2["default"])(validRange, 2), rangeStart = _validRange2[0], rangeEnd = _validRange2[1]; var currentYear = generateConfig.getYear(value); if (generateConfig.getYear(rangeEnd) === currentYear) { end = generateConfig.getMonth(rangeEnd); } if (generateConfig.getYear(rangeStart) === currentYear) { start = generateConfig.getMonth(rangeStart); } } var months = locale.shortMonths || generateConfig.locale.getShortMonths(locale.locale); var options = []; for (var index = start; index <= end; index += 1) { options.push({ label: months[index], value: index }); } return /*#__PURE__*/React.createElement(_select["default"], { size: fullscreen ? undefined : 'small', className: "".concat(prefixCls, "-month-select"), value: month, options: options, onChange: function onChange(newMonth) { _onChange2(generateConfig.setMonth(value, newMonth)); }, getPopupContainer: function getPopupContainer() { return divRef.current; } }); } function ModeSwitch(props) { var prefixCls = props.prefixCls, locale = props.locale, mode = props.mode, fullscreen = props.fullscreen, onModeChange = props.onModeChange; return /*#__PURE__*/React.createElement(_radio.Group, { onChange: function onChange(_ref) { var value = _ref.target.value; onModeChange(value); }, value: mode, size: fullscreen ? undefined : 'small', className: "".concat(prefixCls, "-mode-switch") }, /*#__PURE__*/React.createElement(_radio.Button, { value: "month" }, locale.month), /*#__PURE__*/React.createElement(_radio.Button, { value: "year" }, locale.year)); } function CalendarHeader(props) { var prefixCls = props.prefixCls, fullscreen = props.fullscreen, mode = props.mode, onChange = props.onChange, onModeChange = props.onModeChange; var divRef = React.useRef(null); var sharedProps = (0, _extends2["default"])((0, _extends2["default"])({}, props), { onChange: onChange, fullscreen: fullscreen, divRef: divRef }); return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-header"), ref: divRef }, /*#__PURE__*/React.createElement(YearSelect, sharedProps), mode === 'month' && /*#__PURE__*/React.createElement(MonthSelect, sharedProps), /*#__PURE__*/React.createElement(ModeSwitch, (0, _extends2["default"])({}, sharedProps, { onModeChange: onModeChange }))); } var _default = CalendarHeader; exports["default"] = _default; },{"../radio":368,"../select":377,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],259:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _classnames = _interopRequireDefault(require("classnames")); var _padStart = _interopRequireDefault(require("lodash/padStart")); var _rcPicker = require("rc-picker"); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _en_US = _interopRequireDefault(require("./locale/en_US")); var _configProvider = require("../config-provider"); var _Header = _interopRequireDefault(require("./Header")); function generateCalendar(generateConfig) { function isSameYear(date1, date2) { return date1 && date2 && generateConfig.getYear(date1) === generateConfig.getYear(date2); } function isSameMonth(date1, date2) { return isSameYear(date1, date2) && generateConfig.getMonth(date1) === generateConfig.getMonth(date2); } function isSameDate(date1, date2) { return isSameMonth(date1, date2) && generateConfig.getDate(date1) === generateConfig.getDate(date2); } var Calendar = function Calendar(props) { var customizePrefixCls = props.prefixCls, className = props.className, style = props.style, dateFullCellRender = props.dateFullCellRender, dateCellRender = props.dateCellRender, monthFullCellRender = props.monthFullCellRender, monthCellRender = props.monthCellRender, headerRender = props.headerRender, value = props.value, defaultValue = props.defaultValue, disabledDate = props.disabledDate, mode = props.mode, validRange = props.validRange, _props$fullscreen = props.fullscreen, fullscreen = _props$fullscreen === void 0 ? true : _props$fullscreen, onChange = props.onChange, onPanelChange = props.onPanelChange, onSelect = props.onSelect; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var prefixCls = getPrefixCls('picker', customizePrefixCls); var calendarPrefixCls = "".concat(prefixCls, "-calendar"); var today = generateConfig.getNow(); // ====================== State ======================= // Value var _useMergedState = (0, _useMergedState5["default"])(function () { return value || generateConfig.getNow(); }, { defaultValue: defaultValue, value: value }), _useMergedState2 = (0, _slicedToArray2["default"])(_useMergedState, 2), mergedValue = _useMergedState2[0], setMergedValue = _useMergedState2[1]; // Mode var _useMergedState3 = (0, _useMergedState5["default"])('month', { value: mode }), _useMergedState4 = (0, _slicedToArray2["default"])(_useMergedState3, 2), mergedMode = _useMergedState4[0], setMergedMode = _useMergedState4[1]; var panelMode = React.useMemo(function () { return mergedMode === 'year' ? 'month' : 'date'; }, [mergedMode]); // Disabled Date var mergedDisabledDate = React.useCallback(function (date) { var notInRange = validRange ? generateConfig.isAfter(validRange[0], date) || generateConfig.isAfter(date, validRange[1]) : false; return notInRange || !!(disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date)); }, [disabledDate, validRange]); // ====================== Events ====================== var triggerPanelChange = function triggerPanelChange(date, newMode) { if (onPanelChange) { onPanelChange(date, newMode); } }; var triggerChange = function triggerChange(date) { setMergedValue(date); if (!isSameDate(date, mergedValue)) { // Trigger when month panel switch month if (panelMode === 'date' && !isSameMonth(date, mergedValue) || panelMode === 'month' && !isSameYear(date, mergedValue)) { triggerPanelChange(date, mergedMode); } if (onChange) { onChange(date); } } }; var triggerModeChange = function triggerModeChange(newMode) { setMergedMode(newMode); triggerPanelChange(mergedValue, newMode); }; var onInternalSelect = function onInternalSelect(date) { triggerChange(date); if (onSelect) { onSelect(date); } }; // ====================== Locale ====================== var getDefaultLocale = function getDefaultLocale() { var locale = props.locale; var result = (0, _extends2["default"])((0, _extends2["default"])({}, _en_US["default"]), locale); result.lang = (0, _extends2["default"])((0, _extends2["default"])({}, result.lang), (locale || {}).lang); return result; }; // ====================== Render ====================== var dateRender = React.useCallback(function (date) { if (dateFullCellRender) { return dateFullCellRender(date); } return /*#__PURE__*/React.createElement("div", { className: (0, _classnames["default"])("".concat(prefixCls, "-cell-inner"), "".concat(calendarPrefixCls, "-date"), (0, _defineProperty2["default"])({}, "".concat(calendarPrefixCls, "-date-today"), isSameDate(today, date))) }, /*#__PURE__*/React.createElement("div", { className: "".concat(calendarPrefixCls, "-date-value") }, (0, _padStart["default"])(String(generateConfig.getDate(date)), 2, '0')), /*#__PURE__*/React.createElement("div", { className: "".concat(calendarPrefixCls, "-date-content") }, dateCellRender && dateCellRender(date))); }, [dateFullCellRender, dateCellRender]); var monthRender = React.useCallback(function (date, locale) { if (monthFullCellRender) { return monthFullCellRender(date); } var months = locale.shortMonths || generateConfig.locale.getShortMonths(locale.locale); return /*#__PURE__*/React.createElement("div", { className: (0, _classnames["default"])("".concat(prefixCls, "-cell-inner"), "".concat(calendarPrefixCls, "-date"), (0, _defineProperty2["default"])({}, "".concat(calendarPrefixCls, "-date-today"), isSameMonth(today, date))) }, /*#__PURE__*/React.createElement("div", { className: "".concat(calendarPrefixCls, "-date-value") }, months[generateConfig.getMonth(date)]), /*#__PURE__*/React.createElement("div", { className: "".concat(calendarPrefixCls, "-date-content") }, monthCellRender && monthCellRender(date))); }, [monthFullCellRender, monthCellRender]); return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Calendar", defaultLocale: getDefaultLocale }, function (mergedLocale) { var _classNames3; return /*#__PURE__*/React.createElement("div", { className: (0, _classnames["default"])(calendarPrefixCls, (_classNames3 = {}, (0, _defineProperty2["default"])(_classNames3, "".concat(calendarPrefixCls, "-full"), fullscreen), (0, _defineProperty2["default"])(_classNames3, "".concat(calendarPrefixCls, "-mini"), !fullscreen), (0, _defineProperty2["default"])(_classNames3, "".concat(calendarPrefixCls, "-rtl"), direction === 'rtl'), _classNames3), className), style: style }, headerRender ? headerRender({ value: mergedValue, type: mergedMode, onChange: onInternalSelect, onTypeChange: triggerModeChange }) : /*#__PURE__*/React.createElement(_Header["default"], { prefixCls: calendarPrefixCls, value: mergedValue, generateConfig: generateConfig, mode: mergedMode, fullscreen: fullscreen, locale: mergedLocale.lang, validRange: validRange, onChange: onInternalSelect, onModeChange: triggerModeChange }), /*#__PURE__*/React.createElement(_rcPicker.PickerPanel, { value: mergedValue, prefixCls: prefixCls, locale: mergedLocale.lang, generateConfig: generateConfig, dateRender: dateRender, monthCellRender: function monthCellRender(date) { return monthRender(date, mergedLocale.lang); }, onSelect: onInternalSelect, mode: panelMode, picker: panelMode, disabledDate: mergedDisabledDate, hideHeader: true })); }); }; return Calendar; } var _default = generateCalendar; exports["default"] = _default; },{"../config-provider":278,"../locale-provider/LocaleReceiver":331,"./Header":258,"./locale/en_US":261,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"lodash/padStart":567,"rc-picker":690,"rc-util/lib/hooks/useMergedState":871,"react":"react"}],260:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _moment = _interopRequireDefault(require("rc-picker/lib/generate/moment")); var _generateCalendar = _interopRequireDefault(require("./generateCalendar")); var Calendar = (0, _generateCalendar["default"])(_moment["default"]); var _default = Calendar; exports["default"] = _default; },{"./generateCalendar":259,"@babel/runtime/helpers/interopRequireDefault":192,"rc-picker/lib/generate/moment":682}],261:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _en_US = _interopRequireDefault(require("../../date-picker/locale/en_US")); var _default = _en_US["default"]; exports["default"] = _default; },{"../../date-picker/locale/en_US":286,"@babel/runtime/helpers/interopRequireDefault":192}],262:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Grid = function Grid(props) { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref) { var getPrefixCls = _ref.getPrefixCls; var customizePrefixCls = props.prefixCls, className = props.className, _props$hoverable = props.hoverable, hoverable = _props$hoverable === void 0 ? true : _props$hoverable, others = __rest(props, ["prefixCls", "className", "hoverable"]); var prefixCls = getPrefixCls('card', customizePrefixCls); var classString = (0, _classnames["default"])("".concat(prefixCls, "-grid"), className, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-grid-hoverable"), hoverable)); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, others, { className: classString })); }); }; var _default = Grid; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],263:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Meta = function Meta(props) { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref) { var getPrefixCls = _ref.getPrefixCls; var customizePrefixCls = props.prefixCls, className = props.className, avatar = props.avatar, title = props.title, description = props.description, others = __rest(props, ["prefixCls", "className", "avatar", "title", "description"]); var prefixCls = getPrefixCls('card', customizePrefixCls); var classString = (0, _classnames["default"])("".concat(prefixCls, "-meta"), className); var avatarDom = avatar ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-meta-avatar") }, avatar) : null; var titleDom = title ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-meta-title") }, title) : null; var descriptionDom = description ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-meta-description") }, description) : null; var MetaDetail = titleDom || descriptionDom ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-meta-detail") }, titleDom, descriptionDom) : null; return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, others, { className: classString }), avatarDom, MetaDetail); }); }; var _default = Meta; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],264:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _Grid = _interopRequireDefault(require("./Grid")); var _Meta = _interopRequireDefault(require("./Meta")); var _tabs = _interopRequireDefault(require("../tabs")); var _row = _interopRequireDefault(require("../row")); var _col = _interopRequireDefault(require("../col")); var _configProvider = require("../config-provider"); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; function getAction(actions) { var actionList = actions.map(function (action, index) { return ( /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key React.createElement("li", { style: { width: "".concat(100 / actions.length, "%") }, key: "action-".concat(index) }, /*#__PURE__*/React.createElement("span", null, action)) ); }); return actionList; } var Card = function Card(props) { var _extends2, _classNames; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var size = React.useContext(_SizeContext["default"]); var onTabChange = function onTabChange(key) { if (props.onTabChange) { props.onTabChange(key); } }; var isContainGrid = function isContainGrid() { var containGrid; React.Children.forEach(props.children, function (element) { if (element && element.type && element.type === _Grid["default"]) { containGrid = true; } }); return containGrid; }; var customizePrefixCls = props.prefixCls, className = props.className, extra = props.extra, _props$headStyle = props.headStyle, headStyle = _props$headStyle === void 0 ? {} : _props$headStyle, _props$bodyStyle = props.bodyStyle, bodyStyle = _props$bodyStyle === void 0 ? {} : _props$bodyStyle, title = props.title, loading = props.loading, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, customizeSize = props.size, type = props.type, cover = props.cover, actions = props.actions, tabList = props.tabList, children = props.children, activeTabKey = props.activeTabKey, defaultActiveTabKey = props.defaultActiveTabKey, tabBarExtraContent = props.tabBarExtraContent, hoverable = props.hoverable, _props$tabProps = props.tabProps, tabProps = _props$tabProps === void 0 ? {} : _props$tabProps, others = __rest(props, ["prefixCls", "className", "extra", "headStyle", "bodyStyle", "title", "loading", "bordered", "size", "type", "cover", "actions", "tabList", "children", "activeTabKey", "defaultActiveTabKey", "tabBarExtraContent", "hoverable", "tabProps"]); var prefixCls = getPrefixCls('card', customizePrefixCls); var loadingBlockStyle = bodyStyle.padding === 0 || bodyStyle.padding === '0px' ? { padding: 24 } : undefined; var block = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-loading-block") }); var loadingBlock = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-loading-content"), style: loadingBlockStyle }, /*#__PURE__*/React.createElement(_row["default"], { gutter: 8 }, /*#__PURE__*/React.createElement(_col["default"], { span: 22 }, block)), /*#__PURE__*/React.createElement(_row["default"], { gutter: 8 }, /*#__PURE__*/React.createElement(_col["default"], { span: 8 }, block), /*#__PURE__*/React.createElement(_col["default"], { span: 15 }, block)), /*#__PURE__*/React.createElement(_row["default"], { gutter: 8 }, /*#__PURE__*/React.createElement(_col["default"], { span: 6 }, block), /*#__PURE__*/React.createElement(_col["default"], { span: 18 }, block)), /*#__PURE__*/React.createElement(_row["default"], { gutter: 8 }, /*#__PURE__*/React.createElement(_col["default"], { span: 13 }, block), /*#__PURE__*/React.createElement(_col["default"], { span: 9 }, block)), /*#__PURE__*/React.createElement(_row["default"], { gutter: 8 }, /*#__PURE__*/React.createElement(_col["default"], { span: 4 }, block), /*#__PURE__*/React.createElement(_col["default"], { span: 3 }, block), /*#__PURE__*/React.createElement(_col["default"], { span: 16 }, block))); var hasActiveTabKey = activeTabKey !== undefined; var extraProps = (0, _extends3["default"])((0, _extends3["default"])({}, tabProps), (_extends2 = {}, (0, _defineProperty2["default"])(_extends2, hasActiveTabKey ? 'activeKey' : 'defaultActiveKey', hasActiveTabKey ? activeTabKey : defaultActiveTabKey), (0, _defineProperty2["default"])(_extends2, "tabBarExtraContent", tabBarExtraContent), _extends2)); var head; var tabs = tabList && tabList.length ? /*#__PURE__*/React.createElement(_tabs["default"], (0, _extends3["default"])({ size: "large" }, extraProps, { className: "".concat(prefixCls, "-head-tabs"), onChange: onTabChange }), tabList.map(function (item) { return /*#__PURE__*/React.createElement(_tabs["default"].TabPane, { tab: item.tab, disabled: item.disabled, key: item.key }); })) : null; if (title || extra || tabs) { head = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-head"), style: headStyle }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-head-wrapper") }, title && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-head-title") }, title), extra && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-extra") }, extra)), tabs); } var coverDom = cover ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-cover") }, cover) : null; var body = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-body"), style: bodyStyle }, loading ? loadingBlock : children); var actionDom = actions && actions.length ? /*#__PURE__*/React.createElement("ul", { className: "".concat(prefixCls, "-actions") }, getAction(actions)) : null; var divProps = (0, _omit["default"])(others, ['onTabChange']); var mergedSize = customizeSize || size; var classString = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-loading"), loading), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-bordered"), bordered), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-hoverable"), hoverable), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-contain-grid"), isContainGrid()), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-contain-tabs"), tabList && tabList.length), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(mergedSize), mergedSize), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-type-").concat(type), !!type), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement("div", (0, _extends3["default"])({}, divProps, { className: classString }), head, coverDom, body, actionDom); }; Card.Grid = _Grid["default"]; Card.Meta = _Meta["default"]; var _default = Card; exports["default"] = _default; },{"../col":270,"../config-provider":278,"../config-provider/SizeContext":276,"../row":376,"../tabs":414,"./Grid":262,"./Meta":263,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"react":"react"}],265:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _reactSlick = _interopRequireDefault(require("@ant-design/react-slick")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var Carousel = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Carousel, _React$Component); var _super = (0, _createSuper2["default"])(Carousel); function Carousel(props) { var _this; (0, _classCallCheck2["default"])(this, Carousel); _this = _super.call(this, props); _this.saveSlick = function (node) { _this.slick = node; }; _this.onWindowResized = function () { // Fix https://github.com/ant-design/ant-design/issues/2550 var autoplay = _this.props.autoplay; if (autoplay && _this.slick && _this.slick.innerSlider && _this.slick.innerSlider.autoPlay) { _this.slick.innerSlider.autoPlay(); } }; _this.renderCarousel = function (_ref) { var _classNames; var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var _a; var props = (0, _extends2["default"])({}, _this.props); if (props.effect === 'fade') { props.fade = true; } var prefixCls = getPrefixCls('carousel', props.prefixCls); var dotsClass = 'slick-dots'; var dotPosition = _this.getDotPosition(); props.vertical = dotPosition === 'left' || dotPosition === 'right'; var enableDots = !!props.dots; var dsClass = (0, _classnames["default"])(dotsClass, "".concat(dotsClass, "-").concat(dotPosition || 'bottom'), typeof props.dots === 'boolean' ? false : (_a = props.dots) === null || _a === void 0 ? void 0 : _a.className); var className = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-vertical"), props.vertical), _classNames)); return /*#__PURE__*/React.createElement("div", { className: className }, /*#__PURE__*/React.createElement(_reactSlick["default"], (0, _extends2["default"])({ ref: _this.saveSlick }, props, { dots: enableDots, dotsClass: dsClass }))); }; _this.onWindowResized = (0, _debounce["default"])(_this.onWindowResized, 500, { leading: false }); return _this; } (0, _createClass2["default"])(Carousel, [{ key: "componentDidMount", value: function componentDidMount() { var autoplay = this.props.autoplay; if (autoplay) { window.addEventListener('resize', this.onWindowResized); } // https://github.com/ant-design/ant-design/issues/7191 this.innerSlider = this.slick && this.slick.innerSlider; } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { if (React.Children.count(this.props.children) !== React.Children.count(prevProps.children)) { this.goTo(this.props.initialSlide || 0, false); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var autoplay = this.props.autoplay; if (autoplay) { window.removeEventListener('resize', this.onWindowResized); this.onWindowResized.cancel(); } } }, { key: "getDotPosition", value: function getDotPosition() { var _this$props$dotPositi = this.props.dotPosition, dotPosition = _this$props$dotPositi === void 0 ? 'bottom' : _this$props$dotPositi; return dotPosition; } }, { key: "next", value: function next() { this.slick.slickNext(); } }, { key: "prev", value: function prev() { this.slick.slickPrev(); } }, { key: "goTo", value: function goTo(slide) { var dontAnimate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; this.slick.slickGoTo(slide, dontAnimate); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderCarousel); } }]); return Carousel; }(React.Component); exports["default"] = Carousel; Carousel.defaultProps = { dots: true, arrows: false, draggable: false }; },{"../config-provider":278,"@ant-design/react-slick":173,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"lodash/debounce":551,"react":"react"}],266:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _rcCascader = _interopRequireDefault(require("rc-cascader")); var _arrayTreeFilter = _interopRequireDefault(require("array-tree-filter")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _DownOutlined = _interopRequireDefault(require("@ant-design/icons/DownOutlined")); var _RightOutlined = _interopRequireDefault(require("@ant-design/icons/RightOutlined")); var _RedoOutlined = _interopRequireDefault(require("@ant-design/icons/RedoOutlined")); var _LeftOutlined = _interopRequireDefault(require("@ant-design/icons/LeftOutlined")); var _input = _interopRequireDefault(require("../input")); var _configProvider = require("../config-provider"); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; // We limit the filtered item count by default var defaultLimit = 50; // keep value when filtering var keepFilteredValueField = '__KEEP_FILTERED_OPTION_VALUE'; function highlightKeyword(str, keyword, prefixCls) { return str.split(keyword).map(function (node, index) { return index === 0 ? node : [/*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-menu-item-keyword"), key: "seperator" }, keyword), node]; }); } function defaultFilterOption(inputValue, path, names) { return path.some(function (option) { return option[names.label].indexOf(inputValue) > -1; }); } function defaultRenderFilteredOption(inputValue, path, prefixCls, names) { return path.map(function (option, index) { var label = option[names.label]; var node = label.indexOf(inputValue) > -1 ? highlightKeyword(label, inputValue, prefixCls) : label; return index === 0 ? node : [' / ', node]; }); } function defaultSortFilteredOption(a, b, inputValue, names) { function callback(elem) { return elem[names.label].indexOf(inputValue) > -1; } return a.findIndex(callback) - b.findIndex(callback); } function getFieldNames(_ref) { var fieldNames = _ref.fieldNames; return fieldNames; } function getFilledFieldNames(props) { var fieldNames = getFieldNames(props) || {}; var names = { children: fieldNames.children || 'children', label: fieldNames.label || 'label', value: fieldNames.value || 'value' }; return names; } function flattenTree(options, props) { var ancestor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var names = getFilledFieldNames(props); var flattenOptions = []; var childrenName = names.children; options.forEach(function (option) { var path = ancestor.concat(option); if (props.changeOnSelect || !option[childrenName] || !option[childrenName].length) { flattenOptions.push(path); } if (option[childrenName]) { flattenOptions = flattenOptions.concat(flattenTree(option[childrenName], props, path)); } }); return flattenOptions; } var defaultDisplayRender = function defaultDisplayRender(label) { return label.join(' / '); }; function warningValueNotExist(list) { var fieldNames = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; (list || []).forEach(function (item) { var valueFieldName = fieldNames.value || 'value'; (0, _devWarning["default"])(valueFieldName in item, 'Cascader', 'Not found `value` in `options`.'); warningValueNotExist(item[fieldNames.children || 'children'], fieldNames); }); } var Cascader = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Cascader, _React$Component); var _super = (0, _createSuper2["default"])(Cascader); function Cascader(props) { var _this; (0, _classCallCheck2["default"])(this, Cascader); _this = _super.call(this, props); _this.cachedOptions = []; _this.setValue = function (value) { var selectedOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; if (!('value' in _this.props)) { _this.setState({ value: value }); } var onChange = _this.props.onChange; if (onChange) { onChange(value, selectedOptions); } }; _this.saveInput = function (node) { _this.input = node; }; _this.handleChange = function (value, selectedOptions) { _this.setState({ inputValue: '' }); if (selectedOptions[0].__IS_FILTERED_OPTION) { var unwrappedValue = selectedOptions[0][keepFilteredValueField] === undefined ? value[0] : selectedOptions[0][keepFilteredValueField]; var unwrappedSelectedOptions = selectedOptions[0].path; _this.setValue(unwrappedValue, unwrappedSelectedOptions); return; } _this.setValue(value, selectedOptions); }; _this.handlePopupVisibleChange = function (popupVisible) { if (!('popupVisible' in _this.props)) { _this.setState(function (state) { return { popupVisible: popupVisible, inputFocused: popupVisible, inputValue: popupVisible ? state.inputValue : '' }; }); } var onPopupVisibleChange = _this.props.onPopupVisibleChange; if (onPopupVisibleChange) { onPopupVisibleChange(popupVisible); } }; _this.handleInputBlur = function () { _this.setState({ inputFocused: false }); }; _this.handleInputClick = function (e) { var _this$state = _this.state, inputFocused = _this$state.inputFocused, popupVisible = _this$state.popupVisible; // Prevent `Trigger` behaviour. if (inputFocused || popupVisible) { e.stopPropagation(); } }; _this.handleKeyDown = function (e) { // SPACE => https://github.com/ant-design/ant-design/issues/16871 if (e.keyCode === _KeyCode["default"].BACKSPACE || e.keyCode === _KeyCode["default"].SPACE) { e.stopPropagation(); } }; _this.handleInputChange = function (e) { var popupVisible = _this.state.popupVisible; var inputValue = e.target.value; if (!popupVisible) { _this.handlePopupVisibleChange(true); } _this.setState({ inputValue: inputValue }); }; _this.clearSelection = function (e) { var inputValue = _this.state.inputValue; e.preventDefault(); e.stopPropagation(); if (!inputValue) { _this.handlePopupVisibleChange(false); _this.clearSelectionTimeout = setTimeout(function () { _this.setValue([]); }, 200); } else { _this.setState({ inputValue: '' }); } }; _this.renderCascader = function (_ref2, locale) { var getContextPopupContainer = _ref2.getPopupContainer, getPrefixCls = _ref2.getPrefixCls, renderEmpty = _ref2.renderEmpty, direction = _ref2.direction; return /*#__PURE__*/React.createElement(_SizeContext["default"].Consumer, null, function (size) { var _classNames, _classNames2, _classNames3, _classNames5; var _assertThisInitialize = (0, _assertThisInitialized2["default"])(_this), props = _assertThisInitialize.props, state = _assertThisInitialize.state; var customizePrefixCls = props.prefixCls, customizeInputPrefixCls = props.inputPrefixCls, children = props.children, _props$placeholder = props.placeholder, placeholder = _props$placeholder === void 0 ? locale.placeholder || 'Please select' : _props$placeholder, customizeSize = props.size, disabled = props.disabled, className = props.className, style = props.style, allowClear = props.allowClear, _props$showSearch = props.showSearch, showSearch = _props$showSearch === void 0 ? false : _props$showSearch, suffixIcon = props.suffixIcon, expandIcon = props.expandIcon, notFoundContent = props.notFoundContent, popupClassName = props.popupClassName, bordered = props.bordered, dropdownRender = props.dropdownRender, otherProps = __rest(props, ["prefixCls", "inputPrefixCls", "children", "placeholder", "size", "disabled", "className", "style", "allowClear", "showSearch", "suffixIcon", "expandIcon", "notFoundContent", "popupClassName", "bordered", "dropdownRender"]); var mergedSize = customizeSize || size; var value = state.value, inputFocused = state.inputFocused; var isRtlLayout = direction === 'rtl'; var prefixCls = getPrefixCls('cascader', customizePrefixCls); var inputPrefixCls = getPrefixCls('input', customizeInputPrefixCls); var sizeCls = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(inputPrefixCls, "-lg"), mergedSize === 'large'), (0, _defineProperty2["default"])(_classNames, "".concat(inputPrefixCls, "-sm"), mergedSize === 'small'), _classNames)); var clearIcon = allowClear && !disabled && value.length > 0 || state.inputValue ? /*#__PURE__*/React.createElement(_CloseCircleFilled["default"], { className: "".concat(prefixCls, "-picker-clear"), onClick: _this.clearSelection }) : null; var arrowCls = (0, _classnames["default"])((_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-picker-arrow"), true), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-picker-arrow-expand"), state.popupVisible), _classNames2)); var pickerCls = (0, _classnames["default"])("".concat(prefixCls, "-picker"), (_classNames3 = {}, (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-picker-rtl"), isRtlLayout), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-picker-with-value"), state.inputValue), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-picker-disabled"), disabled), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-picker-").concat(mergedSize), !!mergedSize), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-picker-show-search"), !!showSearch), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-picker-focused"), inputFocused), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-picker-borderless"), !bordered), _classNames3), className); // Fix bug of https://github.com/facebook/react/pull/5004 // and https://fb.me/react-unknown-prop var inputProps = (0, _omit["default"])(otherProps, ['onChange', 'options', 'popupPlacement', 'transitionName', 'displayRender', 'onPopupVisibleChange', 'changeOnSelect', 'expandTrigger', 'popupVisible', 'getPopupContainer', 'loadData', 'popupClassName', 'filterOption', 'renderFilteredOption', 'sortFilteredOption', 'notFoundContent', 'fieldNames', 'bordered']); var options = props.options; var names = getFilledFieldNames(_this.props); if (options && options.length > 0) { if (state.inputValue) { options = _this.generateFilteredOptions(prefixCls, renderEmpty); } } else { var _ref3; options = [(_ref3 = {}, (0, _defineProperty2["default"])(_ref3, names.label, notFoundContent || renderEmpty('Cascader')), (0, _defineProperty2["default"])(_ref3, names.value, 'ANT_CASCADER_NOT_FOUND'), _ref3)]; } // Dropdown menu should keep previous status until it is fully closed. if (!state.popupVisible) { options = _this.cachedOptions; } else { _this.cachedOptions = options; } var dropdownMenuColumnStyle = {}; var isNotFound = (options || []).length === 1 && options[0].isEmptyNode; if (isNotFound) { dropdownMenuColumnStyle.height = 'auto'; // Height of one row. } // The default value of `matchInputWidth` is `true` var resultListMatchInputWidth = showSearch.matchInputWidth !== false; if (resultListMatchInputWidth && (state.inputValue || isNotFound) && _this.input) { dropdownMenuColumnStyle.width = _this.input.input.offsetWidth; } var inputIcon; if (suffixIcon) { inputIcon = (0, _reactNode.replaceElement)(suffixIcon, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-picker-arrow") }, suffixIcon), function () { var _classNames4; return { className: (0, _classnames["default"])((_classNames4 = {}, (0, _defineProperty2["default"])(_classNames4, suffixIcon.props.className, suffixIcon.props.className), (0, _defineProperty2["default"])(_classNames4, "".concat(prefixCls, "-picker-arrow"), true), _classNames4)) }; }); } else { inputIcon = /*#__PURE__*/React.createElement(_DownOutlined["default"], { className: arrowCls }); } var input = children || /*#__PURE__*/React.createElement("span", { style: style, className: pickerCls }, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-picker-label") }, _this.getLabel()), /*#__PURE__*/React.createElement(_input["default"], (0, _extends2["default"])({}, inputProps, { tabIndex: "-1", ref: _this.saveInput, prefixCls: inputPrefixCls, placeholder: value && value.length > 0 ? undefined : placeholder, className: "".concat(prefixCls, "-input ").concat(sizeCls), value: state.inputValue, disabled: disabled, readOnly: !showSearch, autoComplete: inputProps.autoComplete || 'off', onClick: showSearch ? _this.handleInputClick : undefined, onBlur: showSearch ? _this.handleInputBlur : undefined, onKeyDown: _this.handleKeyDown, onChange: showSearch ? _this.handleInputChange : undefined })), clearIcon, inputIcon); var expandIconNode; if (expandIcon) { expandIconNode = expandIcon; } else { expandIconNode = isRtlLayout ? /*#__PURE__*/React.createElement(_LeftOutlined["default"], null) : /*#__PURE__*/React.createElement(_RightOutlined["default"], null); } var loadingIcon = /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-menu-item-loading-icon") }, /*#__PURE__*/React.createElement(_RedoOutlined["default"], { spin: true })); var getPopupContainer = props.getPopupContainer || getContextPopupContainer; var rest = (0, _omit["default"])(props, ['inputIcon', 'expandIcon', 'loadingIcon', 'bordered']); var rcCascaderPopupClassName = (0, _classnames["default"])(popupClassName, (_classNames5 = {}, (0, _defineProperty2["default"])(_classNames5, "".concat(prefixCls, "-menu-").concat(direction), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames5, "".concat(prefixCls, "-menu-empty"), options.length === 1 && options[0].value === 'ANT_CASCADER_NOT_FOUND'), _classNames5)); return /*#__PURE__*/React.createElement(_rcCascader["default"], (0, _extends2["default"])({}, rest, { prefixCls: prefixCls, getPopupContainer: getPopupContainer, options: options, value: value, popupVisible: state.popupVisible, onPopupVisibleChange: _this.handlePopupVisibleChange, onChange: _this.handleChange, dropdownMenuColumnStyle: dropdownMenuColumnStyle, expandIcon: expandIconNode, loadingIcon: loadingIcon, popupClassName: rcCascaderPopupClassName, popupPlacement: _this.getPopupPlacement(direction), dropdownRender: dropdownRender }), input); }); }; _this.state = { value: props.value || props.defaultValue || [], inputValue: '', inputFocused: false, popupVisible: props.popupVisible, flattenOptions: props.showSearch ? flattenTree(props.options, props) : undefined, prevProps: props }; return _this; } (0, _createClass2["default"])(Cascader, [{ key: "componentWillUnmount", value: function componentWillUnmount() { if (this.clearSelectionTimeout) { clearTimeout(this.clearSelectionTimeout); } } }, { key: "getLabel", value: function getLabel() { var _this$props = this.props, options = _this$props.options, _this$props$displayRe = _this$props.displayRender, displayRender = _this$props$displayRe === void 0 ? defaultDisplayRender : _this$props$displayRe; var names = getFilledFieldNames(this.props); var value = this.state.value; var unwrappedValue = Array.isArray(value[0]) ? value[0] : value; var selectedOptions = (0, _arrayTreeFilter["default"])(options, function (o, level) { return o[names.value] === unwrappedValue[level]; }, { childrenKeyName: names.children }); var label = selectedOptions.length ? selectedOptions.map(function (o) { return o[names.label]; }) : value; return displayRender(label, selectedOptions); } }, { key: "generateFilteredOptions", value: function generateFilteredOptions(prefixCls, renderEmpty) { var _this2 = this, _ref5; var _this$props2 = this.props, showSearch = _this$props2.showSearch, notFoundContent = _this$props2.notFoundContent; var names = getFilledFieldNames(this.props); var _showSearch$filter = showSearch.filter, filter = _showSearch$filter === void 0 ? defaultFilterOption : _showSearch$filter, _showSearch$render = showSearch.render, render = _showSearch$render === void 0 ? defaultRenderFilteredOption : _showSearch$render, _showSearch$sort = showSearch.sort, sort = _showSearch$sort === void 0 ? defaultSortFilteredOption : _showSearch$sort, _showSearch$limit = showSearch.limit, limit = _showSearch$limit === void 0 ? defaultLimit : _showSearch$limit; var _this$state2 = this.state, _this$state2$flattenO = _this$state2.flattenOptions, flattenOptions = _this$state2$flattenO === void 0 ? [] : _this$state2$flattenO, inputValue = _this$state2.inputValue; // Limit the filter if needed var filtered; if (limit > 0) { filtered = []; var matchCount = 0; // Perf optimization to filter items only below the limit flattenOptions.some(function (path) { var match = filter(_this2.state.inputValue, path, names); if (match) { filtered.push(path); matchCount += 1; } return matchCount >= limit; }); } else { (0, _devWarning["default"])(typeof limit !== 'number', 'Cascader', "'limit' of showSearch should be positive number or false."); filtered = flattenOptions.filter(function (path) { return filter(_this2.state.inputValue, path, names); }); } filtered = filtered.sort(function (a, b) { return sort(a, b, inputValue, names); }); if (filtered.length > 0) { // Fix issue: https://github.com/ant-design/ant-design/issues/26554 var field = names.value === names.label ? keepFilteredValueField : names.value; return filtered.map(function (path) { var _ref4; return _ref4 = { __IS_FILTERED_OPTION: true, path: path }, (0, _defineProperty2["default"])(_ref4, field, path.map(function (o) { return o[names.value]; })), (0, _defineProperty2["default"])(_ref4, names.label, render(inputValue, path, prefixCls, names)), (0, _defineProperty2["default"])(_ref4, "disabled", path.some(function (o) { return !!o.disabled; })), (0, _defineProperty2["default"])(_ref4, "isEmptyNode", true), _ref4; }); } return [(_ref5 = {}, (0, _defineProperty2["default"])(_ref5, names.value, 'ANT_CASCADER_NOT_FOUND'), (0, _defineProperty2["default"])(_ref5, names.label, notFoundContent || renderEmpty('Cascader')), (0, _defineProperty2["default"])(_ref5, "disabled", true), (0, _defineProperty2["default"])(_ref5, "isEmptyNode", true), _ref5)]; } }, { key: "focus", value: function focus() { this.input.focus(); } }, { key: "blur", value: function blur() { this.input.blur(); } }, { key: "getPopupPlacement", value: function getPopupPlacement() { var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'ltr'; var popupPlacement = this.props.popupPlacement; if (popupPlacement !== undefined) { return popupPlacement; } return direction === 'rtl' ? 'bottomRight' : 'bottomLeft'; } }, { key: "render", value: function render() { var _this3 = this; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (configArgument) { return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], null, function (locale) { return _this3.renderCascader(configArgument, locale); }); }); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, _ref6) { var prevProps = _ref6.prevProps; var newState = { prevProps: nextProps }; if ('value' in nextProps) { newState.value = nextProps.value || []; } if ('popupVisible' in nextProps) { newState.popupVisible = nextProps.popupVisible; } if (nextProps.showSearch && prevProps.options !== nextProps.options) { newState.flattenOptions = flattenTree(nextProps.options, nextProps); } if (process.env.NODE_ENV !== 'production' && nextProps.options) { warningValueNotExist(nextProps.options, getFieldNames(nextProps)); } return newState; } }]); return Cascader; }(React.Component); Cascader.defaultProps = { transitionName: 'slide-up', options: [], disabled: false, allowClear: true, bordered: true }; var _default = Cascader; exports["default"] = _default; }).call(this,require('_process')) },{"../_util/devWarning":212,"../_util/reactNode":223,"../config-provider":278,"../config-provider/SizeContext":276,"../input":325,"../locale-provider/LocaleReceiver":331,"@ant-design/icons/CloseCircleFilled":69,"@ant-design/icons/DownOutlined":76,"@ant-design/icons/LeftOutlined":92,"@ant-design/icons/RedoOutlined":99,"@ant-design/icons/RightOutlined":100,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"_process":1,"array-tree-filter":453,"classnames":455,"omit.js":579,"rc-cascader":593,"rc-util/lib/KeyCode":865,"react":"react"}],267:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcCheckbox = _interopRequireDefault(require("rc-checkbox")); var _Group = require("./Group"); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Checkbox = /*#__PURE__*/function (_React$PureComponent) { (0, _inherits2["default"])(Checkbox, _React$PureComponent); var _super = (0, _createSuper2["default"])(Checkbox); function Checkbox() { var _this; (0, _classCallCheck2["default"])(this, Checkbox); _this = _super.apply(this, arguments); _this.saveCheckbox = function (node) { _this.rcCheckbox = node; }; _this.renderCheckbox = function (_ref) { var _classNames; var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var _assertThisInitialize = (0, _assertThisInitialized2["default"])(_this), props = _assertThisInitialize.props, context = _assertThisInitialize.context; var customizePrefixCls = props.prefixCls, className = props.className, children = props.children, indeterminate = props.indeterminate, style = props.style, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, restProps = __rest(props, ["prefixCls", "className", "children", "indeterminate", "style", "onMouseEnter", "onMouseLeave"]); var checkboxGroup = context; var prefixCls = getPrefixCls('checkbox', customizePrefixCls); var checkboxProps = (0, _extends2["default"])({}, restProps); if (checkboxGroup) { checkboxProps.onChange = function () { if (restProps.onChange) { restProps.onChange.apply(restProps, arguments); } checkboxGroup.toggleOption({ label: children, value: props.value }); }; checkboxProps.name = checkboxGroup.name; checkboxProps.checked = checkboxGroup.value.indexOf(props.value) !== -1; checkboxProps.disabled = props.disabled || checkboxGroup.disabled; } var classString = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-wrapper"), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-wrapper-checked"), checkboxProps.checked), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-wrapper-disabled"), checkboxProps.disabled), _classNames), className); var checkboxClass = (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(prefixCls, "-indeterminate"), indeterminate)); return ( /*#__PURE__*/ // eslint-disable-next-line jsx-a11y/label-has-associated-control React.createElement("label", { className: classString, style: style, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave }, /*#__PURE__*/React.createElement(_rcCheckbox["default"], (0, _extends2["default"])({}, checkboxProps, { prefixCls: prefixCls, className: checkboxClass, ref: _this.saveCheckbox })), children !== undefined && /*#__PURE__*/React.createElement("span", null, children)) ); }; return _this; } (0, _createClass2["default"])(Checkbox, [{ key: "componentDidMount", value: function componentDidMount() { var _a; var value = this.props.value; (_a = this.context) === null || _a === void 0 ? void 0 : _a.registerValue(value); (0, _devWarning["default"])('checked' in this.props || this.context || !('value' in this.props), 'Checkbox', '`value` is not a valid prop, do you mean `checked`?'); } }, { key: "componentDidUpdate", value: function componentDidUpdate(_ref2) { var prevValue = _ref2.value; var _a, _b; var value = this.props.value; if (value !== prevValue) { (_a = this.context) === null || _a === void 0 ? void 0 : _a.cancelValue(prevValue); (_b = this.context) === null || _b === void 0 ? void 0 : _b.registerValue(value); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _a; var value = this.props.value; (_a = this.context) === null || _a === void 0 ? void 0 : _a.cancelValue(value); } }, { key: "focus", value: function focus() { this.rcCheckbox.focus(); } }, { key: "blur", value: function blur() { this.rcCheckbox.blur(); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderCheckbox); } }]); return Checkbox; }(React.PureComponent); Checkbox.__ANT_CHECKBOX = true; Checkbox.defaultProps = { indeterminate: false }; Checkbox.contextType = _Group.GroupContext; var _default = Checkbox; exports["default"] = _default; },{"../_util/devWarning":212,"../config-provider":278,"./Group":268,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-checkbox":596,"react":"react"}],268:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.GroupContext = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _Checkbox = _interopRequireDefault(require("./Checkbox")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var GroupContext = /*#__PURE__*/React.createContext(null); exports.GroupContext = GroupContext; var CheckboxGroup = /*#__PURE__*/function (_React$PureComponent) { (0, _inherits2["default"])(CheckboxGroup, _React$PureComponent); var _super = (0, _createSuper2["default"])(CheckboxGroup); function CheckboxGroup(props) { var _this; (0, _classCallCheck2["default"])(this, CheckboxGroup); _this = _super.call(this, props); _this.cancelValue = function (value) { _this.setState(function (_ref) { var registeredValues = _ref.registeredValues; return { registeredValues: registeredValues.filter(function (val) { return val !== value; }) }; }); }; _this.registerValue = function (value) { _this.setState(function (_ref2) { var registeredValues = _ref2.registeredValues; return { registeredValues: [].concat((0, _toConsumableArray2["default"])(registeredValues), [value]) }; }); }; _this.toggleOption = function (option) { var registeredValues = _this.state.registeredValues; var optionIndex = _this.state.value.indexOf(option.value); var value = (0, _toConsumableArray2["default"])(_this.state.value); if (optionIndex === -1) { value.push(option.value); } else { value.splice(optionIndex, 1); } if (!('value' in _this.props)) { _this.setState({ value: value }); } var onChange = _this.props.onChange; if (onChange) { var options = _this.getOptions(); onChange(value.filter(function (val) { return registeredValues.indexOf(val) !== -1; }).sort(function (a, b) { var indexA = options.findIndex(function (opt) { return opt.value === a; }); var indexB = options.findIndex(function (opt) { return opt.value === b; }); return indexA - indexB; })); } }; _this.renderGroup = function (_ref3) { var getPrefixCls = _ref3.getPrefixCls, direction = _ref3.direction; var _assertThisInitialize = (0, _assertThisInitialized2["default"])(_this), props = _assertThisInitialize.props, state = _assertThisInitialize.state; var customizePrefixCls = props.prefixCls, className = props.className, style = props.style, options = props.options, restProps = __rest(props, ["prefixCls", "className", "style", "options"]); var prefixCls = getPrefixCls('checkbox', customizePrefixCls); var groupPrefixCls = "".concat(prefixCls, "-group"); var domProps = (0, _omit["default"])(restProps, ['children', 'defaultValue', 'value', 'onChange', 'disabled']); var children = props.children; if (options && options.length > 0) { children = _this.getOptions().map(function (option) { return /*#__PURE__*/React.createElement(_Checkbox["default"], { prefixCls: prefixCls, key: option.value.toString(), disabled: 'disabled' in option ? option.disabled : props.disabled, value: option.value, checked: state.value.indexOf(option.value) !== -1, onChange: option.onChange, className: "".concat(groupPrefixCls, "-item"), style: option.style }, option.label); }); } var context = { toggleOption: _this.toggleOption, value: _this.state.value, disabled: _this.props.disabled, name: _this.props.name, // https://github.com/ant-design/ant-design/issues/16376 registerValue: _this.registerValue, cancelValue: _this.cancelValue }; var classString = (0, _classnames["default"])(groupPrefixCls, (0, _defineProperty2["default"])({}, "".concat(groupPrefixCls, "-rtl"), direction === 'rtl'), className); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({ className: classString, style: style }, domProps), /*#__PURE__*/React.createElement(GroupContext.Provider, { value: context }, children)); }; _this.state = { value: props.value || props.defaultValue || [], registeredValues: [] }; return _this; } (0, _createClass2["default"])(CheckboxGroup, [{ key: "getOptions", value: function getOptions() { var options = this.props.options; // https://github.com/Microsoft/TypeScript/issues/7960 return options.map(function (option) { if (typeof option === 'string') { return { label: option, value: option }; } return option; }); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderGroup); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps) { if ('value' in nextProps) { return { value: nextProps.value || [] }; } return null; } }]); return CheckboxGroup; }(React.PureComponent); CheckboxGroup.defaultProps = { options: [] }; var _default = CheckboxGroup; exports["default"] = _default; },{"../config-provider":278,"./Checkbox":267,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"omit.js":579,"react":"react"}],269:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Checkbox = _interopRequireDefault(require("./Checkbox")); var _Group = _interopRequireDefault(require("./Group")); _Checkbox["default"].Group = _Group["default"]; var _default = _Checkbox["default"]; exports["default"] = _default; },{"./Checkbox":267,"./Group":268,"@babel/runtime/helpers/interopRequireDefault":192}],270:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _grid = require("../grid"); var _default = _grid.Col; exports["default"] = _default; },{"../grid":315}],271:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _rcCollapse = _interopRequireDefault(require("rc-collapse")); var _classnames = _interopRequireDefault(require("classnames")); var _RightOutlined = _interopRequireDefault(require("@ant-design/icons/RightOutlined")); var _CollapsePanel = _interopRequireDefault(require("./CollapsePanel")); var _configProvider = require("../config-provider"); var _openAnimation = _interopRequireDefault(require("./openAnimation")); var _reactNode = require("../_util/reactNode"); var Collapse = function Collapse(props) { var _classNames; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? '' : _props$className, bordered = props.bordered, ghost = props.ghost; var prefixCls = getPrefixCls('collapse', customizePrefixCls); var getIconPosition = function getIconPosition() { var expandIconPosition = props.expandIconPosition; if (expandIconPosition !== undefined) { return expandIconPosition; } return direction === 'rtl' ? 'right' : 'left'; }; var renderExpandIcon = function renderExpandIcon() { var panelProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var expandIcon = props.expandIcon; var icon = expandIcon ? expandIcon(panelProps) : /*#__PURE__*/React.createElement(_RightOutlined["default"], { rotate: panelProps.isActive ? 90 : undefined }); return (0, _reactNode.cloneElement)(icon, function () { return { className: (0, _classnames["default"])(icon.props.className, "".concat(prefixCls, "-arrow")) }; }); }; var iconPosition = getIconPosition(); var collapseClassName = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-borderless"), !bordered), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-icon-position-").concat(iconPosition), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-ghost"), !!ghost), _classNames), className); var openAnimation = (0, _extends2["default"])((0, _extends2["default"])({}, _openAnimation["default"]), { appear: function appear() {} }); return /*#__PURE__*/React.createElement(_rcCollapse["default"], (0, _extends2["default"])({ openAnimation: openAnimation }, props, { expandIcon: function expandIcon(panelProps) { return renderExpandIcon(panelProps); }, prefixCls: prefixCls, className: collapseClassName })); }; Collapse.Panel = _CollapsePanel["default"]; Collapse.defaultProps = { bordered: true }; var _default = Collapse; exports["default"] = _default; },{"../_util/reactNode":223,"../config-provider":278,"./CollapsePanel":272,"./openAnimation":274,"@ant-design/icons/RightOutlined":100,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-collapse":600,"react":"react"}],272:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _rcCollapse = _interopRequireDefault(require("rc-collapse")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var CollapsePanel = function CollapsePanel(props) { var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? '' : _props$className, _props$showArrow = props.showArrow, showArrow = _props$showArrow === void 0 ? true : _props$showArrow; var prefixCls = getPrefixCls('collapse', customizePrefixCls); var collapsePanelClassName = (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(prefixCls, "-no-arrow"), !showArrow), className); return /*#__PURE__*/React.createElement(_rcCollapse["default"].Panel, (0, _extends2["default"])({}, props, { prefixCls: prefixCls, className: collapsePanelClassName })); }; var _default = CollapsePanel; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-collapse":600,"react":"react"}],273:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Collapse = _interopRequireDefault(require("./Collapse")); var _default = _Collapse["default"]; exports["default"] = _default; },{"./Collapse":271,"@babel/runtime/helpers/interopRequireDefault":192}],274:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _cssAnimation = _interopRequireDefault(require("@ant-design/css-animation")); var _raf = _interopRequireDefault(require("raf")); /** * Deprecated. We should replace the animation with pure react motion instead of modify style directly. * If you are creating new component with animation, please use `./motion`. */ function animate(node, show, done) { var height; var requestAnimationFrameId; return (0, _cssAnimation["default"])(node, 'ant-motion-collapse-legacy', { start: function start() { if (!show) { node.style.height = "".concat(node.offsetHeight, "px"); node.style.opacity = '1'; } else { height = node.offsetHeight; node.style.height = '0px'; node.style.opacity = '0'; } }, active: function active() { requestAnimationFrameId = (0, _raf["default"])(function () { node.style.height = "".concat(show ? height : 0, "px"); node.style.opacity = show ? '1' : '0'; }); }, end: function end() { if (requestAnimationFrameId) { _raf["default"].cancel(requestAnimationFrameId); } node.style.height = ''; node.style.opacity = ''; done(); } }); } var animation = { enter: function enter(node, done) { return animate(node, true, done); }, leave: function leave(node, done) { return animate(node, false, done); }, appear: function appear(node, done) { return animate(node, true, done); } }; var _default = animation; exports["default"] = _default; },{"@ant-design/css-animation":4,"@babel/runtime/helpers/interopRequireDefault":192,"raf":581}],275:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Comment = function Comment(_a) { var actions = _a.actions, author = _a.author, avatar = _a.avatar, children = _a.children, className = _a.className, content = _a.content, customizePrefixCls = _a.prefixCls, datetime = _a.datetime, otherProps = __rest(_a, ["actions", "author", "avatar", "children", "className", "content", "prefixCls", "datetime"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var renderNested = function renderNested(prefixCls, nestedChildren) { return /*#__PURE__*/React.createElement("div", { className: (0, _classnames["default"])("".concat(prefixCls, "-nested")) }, nestedChildren); }; var prefixCls = getPrefixCls('comment', customizePrefixCls); var avatarDom = avatar ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-avatar") }, typeof avatar === 'string' ? /*#__PURE__*/React.createElement("img", { src: avatar, alt: "comment-avatar" }) : avatar) : null; var actionDom = actions && actions.length ? /*#__PURE__*/React.createElement("ul", { className: "".concat(prefixCls, "-actions") }, actions.map(function (action, index) { return /*#__PURE__*/React.createElement("li", { key: "action-".concat(index) }, action) // eslint-disable-line react/no-array-index-key ; })) : null; var authorContent = (author || datetime) && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-content-author") }, author && /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-content-author-name") }, author), datetime && /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-content-author-time") }, datetime)); var contentDom = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-content") }, authorContent, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-content-detail") }, content), actionDom); var cls = (0, _classnames["default"])(prefixCls, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, otherProps, { className: cls }), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-inner") }, avatarDom, contentDom), children ? renderNested(prefixCls, children) : null); }; var _default = Comment; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],276:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.SizeContextProvider = void 0; var React = _interopRequireWildcard(require("react")); var SizeContext = /*#__PURE__*/React.createContext(undefined); var SizeContextProvider = function SizeContextProvider(_ref) { var children = _ref.children, size = _ref.size; return /*#__PURE__*/React.createElement(SizeContext.Consumer, null, function (originSize) { return /*#__PURE__*/React.createElement(SizeContext.Provider, { value: size || originSize }, children); }); }; exports.SizeContextProvider = SizeContextProvider; var _default = SizeContext; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],277:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.withConfigConsumer = withConfigConsumer; exports.ConfigConsumer = exports.ConfigContext = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _renderEmpty = _interopRequireDefault(require("./renderEmpty")); var ConfigContext = /*#__PURE__*/React.createContext({ // We provide a default function for Context without provider getPrefixCls: function getPrefixCls(suffixCls, customizePrefixCls) { if (customizePrefixCls) return customizePrefixCls; return suffixCls ? "ant-".concat(suffixCls) : 'ant'; }, renderEmpty: _renderEmpty["default"] }); exports.ConfigContext = ConfigContext; var ConfigConsumer = ConfigContext.Consumer; exports.ConfigConsumer = ConfigConsumer; function withConfigConsumer(config) { return function withConfigConsumerFunc(Component) { // Wrap with ConfigConsumer. Since we need compatible with react 15, be care when using ref methods var SFC = function SFC(props) { return /*#__PURE__*/React.createElement(ConfigConsumer, null, function (configProps) { var basicPrefixCls = config.prefixCls; var getPrefixCls = configProps.getPrefixCls; var customizePrefixCls = props.prefixCls; var prefixCls = getPrefixCls(basicPrefixCls, customizePrefixCls); return /*#__PURE__*/React.createElement(Component, (0, _extends2["default"])({}, configProps, props, { prefixCls: prefixCls })); }); }; var cons = Component.constructor; var name = cons && cons.displayName || Component.name || 'Component'; SFC.displayName = "withConfigConsumer(".concat(name, ")"); return SFC; }; } },{"./renderEmpty":279,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],278:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "ConfigConsumer", { enumerable: true, get: function get() { return _context.ConfigConsumer; } }); Object.defineProperty(exports, "ConfigContext", { enumerable: true, get: function get() { return _context.ConfigContext; } }); exports["default"] = exports.configConsumerProps = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcFieldForm = require("rc-field-form"); var _localeProvider = _interopRequireWildcard(require("../locale-provider")); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _context = require("./context"); var _SizeContext = require("./SizeContext"); var _message = _interopRequireDefault(require("../message")); var _notification = _interopRequireDefault(require("../notification")); // TODO: remove this lint // SFC has specified a displayName, but not worked. /* eslint-disable react/display-name */ var configConsumerProps = ['getTargetContainer', 'getPopupContainer', 'rootPrefixCls', 'getPrefixCls', 'renderEmpty', 'csp', 'autoInsertSpaceInButton', 'locale', 'pageHeader']; exports.configConsumerProps = configConsumerProps; var ConfigProvider = function ConfigProvider(props) { React.useEffect(function () { if (props.direction) { _message["default"].config({ rtl: props.direction === 'rtl' }); _notification["default"].config({ rtl: props.direction === 'rtl' }); } }, [props.direction]); var getPrefixClsWrapper = function getPrefixClsWrapper(context) { return function (suffixCls, customizePrefixCls) { var prefixCls = props.prefixCls; if (customizePrefixCls) return customizePrefixCls; var mergedPrefixCls = prefixCls || context.getPrefixCls(''); return suffixCls ? "".concat(mergedPrefixCls, "-").concat(suffixCls) : mergedPrefixCls; }; }; var renderProvider = function renderProvider(context, legacyLocale) { var children = props.children, getTargetContainer = props.getTargetContainer, getPopupContainer = props.getPopupContainer, renderEmpty = props.renderEmpty, csp = props.csp, autoInsertSpaceInButton = props.autoInsertSpaceInButton, form = props.form, input = props.input, locale = props.locale, pageHeader = props.pageHeader, componentSize = props.componentSize, direction = props.direction, space = props.space, virtual = props.virtual, dropdownMatchSelectWidth = props.dropdownMatchSelectWidth; var config = (0, _extends2["default"])((0, _extends2["default"])({}, context), { getPrefixCls: getPrefixClsWrapper(context), csp: csp, autoInsertSpaceInButton: autoInsertSpaceInButton, locale: locale || legacyLocale, direction: direction, space: space, virtual: virtual, dropdownMatchSelectWidth: dropdownMatchSelectWidth }); if (getTargetContainer) { config.getTargetContainer = getTargetContainer; } if (getPopupContainer) { config.getPopupContainer = getPopupContainer; } if (renderEmpty) { config.renderEmpty = renderEmpty; } if (pageHeader) { config.pageHeader = pageHeader; } if (input) { config.input = input; } var childNode = children; // Additional Form provider var validateMessages = {}; if (locale && locale.Form && locale.Form.defaultValidateMessages) { validateMessages = locale.Form.defaultValidateMessages; } if (form && form.validateMessages) { validateMessages = (0, _extends2["default"])((0, _extends2["default"])({}, validateMessages), form.validateMessages); } if (Object.keys(validateMessages).length > 0) { childNode = /*#__PURE__*/React.createElement(_rcFieldForm.FormProvider, { validateMessages: validateMessages }, children); } return /*#__PURE__*/React.createElement(_SizeContext.SizeContextProvider, { size: componentSize }, /*#__PURE__*/React.createElement(_context.ConfigContext.Provider, { value: config }, /*#__PURE__*/React.createElement(_localeProvider["default"], { locale: locale || legacyLocale, _ANT_MARK__: _localeProvider.ANT_MARK }, childNode))); }; return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], null, function (_, __, legacyLocale) { return /*#__PURE__*/React.createElement(_context.ConfigConsumer, null, function (context) { return renderProvider(context, legacyLocale); }); }); }; /** @private internal usage. do not use in your production */ ConfigProvider.ConfigContext = _context.ConfigContext; var _default = ConfigProvider; exports["default"] = _default; },{"../locale-provider":334,"../locale-provider/LocaleReceiver":331,"../message":343,"../notification":353,"./SizeContext":276,"./context":277,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-field-form":618,"react":"react"}],279:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _empty = _interopRequireDefault(require("../empty")); var _ = require("."); var renderEmpty = function renderEmpty(componentName) { return /*#__PURE__*/React.createElement(_.ConfigConsumer, null, function (_ref) { var getPrefixCls = _ref.getPrefixCls; var prefix = getPrefixCls('empty'); switch (componentName) { case 'Table': case 'List': return /*#__PURE__*/React.createElement(_empty["default"], { image: _empty["default"].PRESENTED_IMAGE_SIMPLE }); case 'Select': case 'TreeSelect': case 'Cascader': case 'Transfer': case 'Mentions': return /*#__PURE__*/React.createElement(_empty["default"], { image: _empty["default"].PRESENTED_IMAGE_SIMPLE, className: "".concat(prefix, "-small") }); default: return /*#__PURE__*/React.createElement(_empty["default"], null); } }); }; var _default = renderEmpty; exports["default"] = _default; },{".":278,"../empty":298,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],280:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = PickerButton; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _button = _interopRequireDefault(require("../button")); function PickerButton(props) { return /*#__PURE__*/React.createElement(_button["default"], (0, _extends2["default"])({ size: "small", type: "primary" }, props)); } },{"../button":257,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],281:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = PickerTag; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _tag = _interopRequireDefault(require("../tag")); function PickerTag(props) { return /*#__PURE__*/React.createElement(_tag["default"], (0, _extends2["default"])({ color: "blue" }, props)); } },{"../tag":416,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],282:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = generateRangePicker; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _CalendarOutlined = _interopRequireDefault(require("@ant-design/icons/CalendarOutlined")); var _ClockCircleOutlined = _interopRequireDefault(require("@ant-design/icons/ClockCircleOutlined")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _SwapRightOutlined = _interopRequireDefault(require("@ant-design/icons/SwapRightOutlined")); var _rcPicker = require("rc-picker"); var _en_US = _interopRequireDefault(require("../locale/en_US")); var _configProvider = require("../../config-provider"); var _SizeContext = _interopRequireDefault(require("../../config-provider/SizeContext")); var _LocaleReceiver = _interopRequireDefault(require("../../locale-provider/LocaleReceiver")); var _util = require("../util"); var _ = require("."); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; function generateRangePicker(generateConfig) { var RangePicker = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(RangePicker, _React$Component); var _super = (0, _createSuper2["default"])(RangePicker); function RangePicker() { var _this; (0, _classCallCheck2["default"])(this, RangePicker); _this = _super.apply(this, arguments); _this.pickerRef = /*#__PURE__*/React.createRef(); _this.focus = function () { if (_this.pickerRef.current) { _this.pickerRef.current.focus(); } }; _this.blur = function () { if (_this.pickerRef.current) { _this.pickerRef.current.blur(); } }; _this.getDefaultLocale = function () { var locale = _this.props.locale; var result = (0, _extends2["default"])((0, _extends2["default"])({}, _en_US["default"]), locale); result.lang = (0, _extends2["default"])((0, _extends2["default"])({}, result.lang), (locale || {}).lang); return result; }; _this.renderPicker = function (locale) { var _this$context = _this.context, getPrefixCls = _this$context.getPrefixCls, direction = _this$context.direction, getPopupContainer = _this$context.getPopupContainer; var _a = _this.props, customizePrefixCls = _a.prefixCls, customGetPopupContainer = _a.getPopupContainer, className = _a.className, customizeSize = _a.size, _a$bordered = _a.bordered, bordered = _a$bordered === void 0 ? true : _a$bordered, placeholder = _a.placeholder, restProps = __rest(_a, ["prefixCls", "getPopupContainer", "className", "size", "bordered", "placeholder"]); var _this$props = _this.props, format = _this$props.format, showTime = _this$props.showTime, picker = _this$props.picker; var prefixCls = getPrefixCls('picker', customizePrefixCls); var additionalOverrideProps = {}; additionalOverrideProps = (0, _extends2["default"])((0, _extends2["default"])((0, _extends2["default"])({}, additionalOverrideProps), showTime ? (0, _.getTimeProps)((0, _extends2["default"])({ format: format, picker: picker }, showTime)) : {}), picker === 'time' ? (0, _.getTimeProps)((0, _extends2["default"])((0, _extends2["default"])({ format: format }, _this.props), { picker: picker })) : {}); return /*#__PURE__*/React.createElement(_SizeContext["default"].Consumer, null, function (size) { var _classNames; var mergedSize = customizeSize || size; return /*#__PURE__*/React.createElement(_rcPicker.RangePicker, (0, _extends2["default"])({ separator: /*#__PURE__*/React.createElement("span", { "aria-label": "to", className: "".concat(prefixCls, "-separator") }, /*#__PURE__*/React.createElement(_SwapRightOutlined["default"], null)), ref: _this.pickerRef, placeholder: (0, _util.getRangePlaceholder)(picker, locale, placeholder), suffixIcon: picker === 'time' ? /*#__PURE__*/React.createElement(_ClockCircleOutlined["default"], null) : /*#__PURE__*/React.createElement(_CalendarOutlined["default"], null), clearIcon: /*#__PURE__*/React.createElement(_CloseCircleFilled["default"], null), allowClear: true, transitionName: "slide-up" }, restProps, additionalOverrideProps, { className: (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(mergedSize), mergedSize), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _classNames), className), locale: locale.lang, prefixCls: prefixCls, getPopupContainer: customGetPopupContainer || getPopupContainer, generateConfig: generateConfig, prevIcon: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-prev-icon") }), nextIcon: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-next-icon") }), superPrevIcon: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-super-prev-icon") }), superNextIcon: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-super-next-icon") }), components: _.Components, direction: direction })); }); }; return _this; } (0, _createClass2["default"])(RangePicker, [{ key: "render", value: function render() { return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "DatePicker", defaultLocale: this.getDefaultLocale }, this.renderPicker); } }]); return RangePicker; }(React.Component); RangePicker.contextType = _configProvider.ConfigContext; return RangePicker; } },{".":284,"../../config-provider":278,"../../config-provider/SizeContext":276,"../../locale-provider/LocaleReceiver":331,"../locale/en_US":286,"../util":287,"@ant-design/icons/CalendarOutlined":61,"@ant-design/icons/ClockCircleOutlined":68,"@ant-design/icons/CloseCircleFilled":69,"@ant-design/icons/SwapRightOutlined":105,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-picker":690,"react":"react"}],283:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = generatePicker; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _CalendarOutlined = _interopRequireDefault(require("@ant-design/icons/CalendarOutlined")); var _ClockCircleOutlined = _interopRequireDefault(require("@ant-design/icons/ClockCircleOutlined")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _rcPicker = _interopRequireDefault(require("rc-picker")); var _en_US = _interopRequireDefault(require("../locale/en_US")); var _util = require("../util"); var _devWarning = _interopRequireDefault(require("../../_util/devWarning")); var _configProvider = require("../../config-provider"); var _LocaleReceiver = _interopRequireDefault(require("../../locale-provider/LocaleReceiver")); var _SizeContext = _interopRequireDefault(require("../../config-provider/SizeContext")); var _ = require("."); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; function generatePicker(generateConfig) { function getPicker(picker, displayName) { var Picker = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Picker, _React$Component); var _super = (0, _createSuper2["default"])(Picker); function Picker(props) { var _this; (0, _classCallCheck2["default"])(this, Picker); _this = _super.call(this, props); _this.pickerRef = /*#__PURE__*/React.createRef(); _this.focus = function () { if (_this.pickerRef.current) { _this.pickerRef.current.focus(); } }; _this.blur = function () { if (_this.pickerRef.current) { _this.pickerRef.current.blur(); } }; _this.getDefaultLocale = function () { var locale = _this.props.locale; var result = (0, _extends2["default"])((0, _extends2["default"])({}, _en_US["default"]), locale); result.lang = (0, _extends2["default"])((0, _extends2["default"])({}, result.lang), (locale || {}).lang); return result; }; _this.renderPicker = function (locale) { var _this$context = _this.context, getPrefixCls = _this$context.getPrefixCls, direction = _this$context.direction, getPopupContainer = _this$context.getPopupContainer; var _a = _this.props, customizePrefixCls = _a.prefixCls, customizeGetPopupContainer = _a.getPopupContainer, className = _a.className, customizeSize = _a.size, _a$bordered = _a.bordered, bordered = _a$bordered === void 0 ? true : _a$bordered, placeholder = _a.placeholder, restProps = __rest(_a, ["prefixCls", "getPopupContainer", "className", "size", "bordered", "placeholder"]); var _this$props = _this.props, format = _this$props.format, showTime = _this$props.showTime; var prefixCls = getPrefixCls('picker', customizePrefixCls); var additionalProps = { showToday: true }; var additionalOverrideProps = {}; if (picker) { additionalOverrideProps.picker = picker; } var mergedPicker = picker || _this.props.picker; additionalOverrideProps = (0, _extends2["default"])((0, _extends2["default"])((0, _extends2["default"])({}, additionalOverrideProps), showTime ? (0, _.getTimeProps)((0, _extends2["default"])({ format: format, picker: mergedPicker }, showTime)) : {}), mergedPicker === 'time' ? (0, _.getTimeProps)((0, _extends2["default"])((0, _extends2["default"])({ format: format }, _this.props), { picker: mergedPicker })) : {}); return /*#__PURE__*/React.createElement(_SizeContext["default"].Consumer, null, function (size) { var _classNames; var mergedSize = customizeSize || size; return /*#__PURE__*/React.createElement(_rcPicker["default"], (0, _extends2["default"])({ ref: _this.pickerRef, placeholder: (0, _util.getPlaceholder)(mergedPicker, locale, placeholder), suffixIcon: mergedPicker === 'time' ? /*#__PURE__*/React.createElement(_ClockCircleOutlined["default"], null) : /*#__PURE__*/React.createElement(_CalendarOutlined["default"], null), clearIcon: /*#__PURE__*/React.createElement(_CloseCircleFilled["default"], null), allowClear: true, transitionName: "slide-up" }, additionalProps, restProps, additionalOverrideProps, { locale: locale.lang, className: (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(mergedSize), mergedSize), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _classNames), className), prefixCls: prefixCls, getPopupContainer: customizeGetPopupContainer || getPopupContainer, generateConfig: generateConfig, prevIcon: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-prev-icon") }), nextIcon: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-next-icon") }), superPrevIcon: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-super-prev-icon") }), superNextIcon: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-super-next-icon") }), components: _.Components, direction: direction })); }); }; (0, _devWarning["default"])(picker !== 'quarter', displayName, "DatePicker.".concat(displayName, " is legacy usage. Please use DatePicker[picker='").concat(picker, "'] directly.")); return _this; } (0, _createClass2["default"])(Picker, [{ key: "render", value: function render() { return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "DatePicker", defaultLocale: this.getDefaultLocale }, this.renderPicker); } }]); return Picker; }(React.Component); Picker.contextType = _configProvider.ConfigContext; if (displayName) { Picker.displayName = displayName; } return Picker; } var DatePicker = getPicker(); var WeekPicker = getPicker('week', 'WeekPicker'); var MonthPicker = getPicker('month', 'MonthPicker'); var YearPicker = getPicker('year', 'YearPicker'); var TimePicker = getPicker('time', 'TimePicker'); var QuarterPicker = getPicker('quarter', 'QuarterPicker'); return { DatePicker: DatePicker, WeekPicker: WeekPicker, MonthPicker: MonthPicker, YearPicker: YearPicker, TimePicker: TimePicker, QuarterPicker: QuarterPicker }; } },{".":284,"../../_util/devWarning":212,"../../config-provider":278,"../../config-provider/SizeContext":276,"../../locale-provider/LocaleReceiver":331,"../locale/en_US":286,"../util":287,"@ant-design/icons/CalendarOutlined":61,"@ant-design/icons/ClockCircleOutlined":68,"@ant-design/icons/CloseCircleFilled":69,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-picker":690,"react":"react"}],284:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getTimeProps = getTimeProps; exports["default"] = exports.Components = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _PickerButton = _interopRequireDefault(require("../PickerButton")); var _PickerTag = _interopRequireDefault(require("../PickerTag")); var _generateSinglePicker2 = _interopRequireDefault(require("./generateSinglePicker")); var _generateRangePicker = _interopRequireDefault(require("./generateRangePicker")); var Components = { button: _PickerButton["default"], rangeItem: _PickerTag["default"] }; exports.Components = Components; function toArray(list) { if (!list) { return []; } return Array.isArray(list) ? list : [list]; } function getTimeProps(props) { var format = props.format, picker = props.picker, showHour = props.showHour, showMinute = props.showMinute, showSecond = props.showSecond, use12Hours = props.use12Hours; var firstFormat = toArray(format)[0]; var showTimeObj = (0, _extends2["default"])({}, props); if (firstFormat) { if (!firstFormat.includes('s') && showSecond === undefined) { showTimeObj.showSecond = false; } if (!firstFormat.includes('m') && showMinute === undefined) { showTimeObj.showMinute = false; } if (!firstFormat.includes('H') && !firstFormat.includes('h') && showHour === undefined) { showTimeObj.showHour = false; } if ((firstFormat.includes('a') || firstFormat.includes('A')) && use12Hours === undefined) { showTimeObj.use12Hours = true; } } if (picker === 'time') { return showTimeObj; } return { showTime: showTimeObj }; } function generatePicker(generateConfig) { // =========================== Picker =========================== var _generateSinglePicker = (0, _generateSinglePicker2["default"])(generateConfig), DatePicker = _generateSinglePicker.DatePicker, WeekPicker = _generateSinglePicker.WeekPicker, MonthPicker = _generateSinglePicker.MonthPicker, YearPicker = _generateSinglePicker.YearPicker, TimePicker = _generateSinglePicker.TimePicker, QuarterPicker = _generateSinglePicker.QuarterPicker; // ======================== Range Picker ======================== var RangePicker = (0, _generateRangePicker["default"])(generateConfig); var MergedDatePicker = DatePicker; MergedDatePicker.WeekPicker = WeekPicker; MergedDatePicker.MonthPicker = MonthPicker; MergedDatePicker.YearPicker = YearPicker; MergedDatePicker.RangePicker = RangePicker; MergedDatePicker.TimePicker = TimePicker; MergedDatePicker.QuarterPicker = QuarterPicker; return MergedDatePicker; } var _default = generatePicker; exports["default"] = _default; },{"../PickerButton":280,"../PickerTag":281,"./generateRangePicker":282,"./generateSinglePicker":283,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192}],285:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _moment = _interopRequireDefault(require("rc-picker/lib/generate/moment")); var _generatePicker = _interopRequireDefault(require("./generatePicker")); var DatePicker = (0, _generatePicker["default"])(_moment["default"]); var _default = DatePicker; exports["default"] = _default; },{"./generatePicker":284,"@babel/runtime/helpers/interopRequireDefault":192,"rc-picker/lib/generate/moment":682}],286:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _en_US = _interopRequireDefault(require("rc-picker/lib/locale/en_US")); var _en_US2 = _interopRequireDefault(require("../../time-picker/locale/en_US")); // Merge into a locale object var locale = { lang: (0, _extends2["default"])({ placeholder: 'Select date', yearPlaceholder: 'Select year', quarterPlaceholder: 'Select quarter', monthPlaceholder: 'Select month', weekPlaceholder: 'Select week', rangePlaceholder: ['Start date', 'End date'], rangeYearPlaceholder: ['Start year', 'End year'], rangeMonthPlaceholder: ['Start month', 'End month'], rangeWeekPlaceholder: ['Start week', 'End week'] }, _en_US["default"]), timePickerLocale: (0, _extends2["default"])({}, _en_US2["default"]) }; // All settings at: // https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json var _default = locale; exports["default"] = _default; },{"../../time-picker/locale/en_US":418,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"rc-picker/lib/locale/en_US":691}],287:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getPlaceholder = getPlaceholder; exports.getRangePlaceholder = getRangePlaceholder; function getPlaceholder(picker, locale, customizePlaceholder) { if (customizePlaceholder !== undefined) { return customizePlaceholder; } if (picker === 'year' && locale.lang.yearPlaceholder) { return locale.lang.yearPlaceholder; } if (picker === 'quarter' && locale.lang.quarterPlaceholder) { return locale.lang.quarterPlaceholder; } if (picker === 'month' && locale.lang.monthPlaceholder) { return locale.lang.monthPlaceholder; } if (picker === 'week' && locale.lang.weekPlaceholder) { return locale.lang.weekPlaceholder; } if (picker === 'time' && locale.timePickerLocale.placeholder) { return locale.timePickerLocale.placeholder; } return locale.lang.placeholder; } function getRangePlaceholder(picker, locale, customizePlaceholder) { if (customizePlaceholder !== undefined) { return customizePlaceholder; } if (picker === 'year' && locale.lang.yearPlaceholder) { return locale.lang.rangeYearPlaceholder; } if (picker === 'month' && locale.lang.monthPlaceholder) { return locale.lang.rangeMonthPlaceholder; } if (picker === 'week' && locale.lang.weekPlaceholder) { return locale.lang.rangeWeekPlaceholder; } if (picker === 'time' && locale.timePickerLocale.placeholder) { return locale.timePickerLocale.rangePlaceholder; } return locale.lang.rangePlaceholder; } },{}],288:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); function notEmpty(val) { return val !== undefined && val !== null; } var Cell = function Cell(_ref) { var itemPrefixCls = _ref.itemPrefixCls, component = _ref.component, span = _ref.span, className = _ref.className, style = _ref.style, bordered = _ref.bordered, label = _ref.label, content = _ref.content, colon = _ref.colon; var Component = component; if (bordered) { var _classNames; return /*#__PURE__*/React.createElement(Component, { className: (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(itemPrefixCls, "-item-label"), notEmpty(label)), (0, _defineProperty2["default"])(_classNames, "".concat(itemPrefixCls, "-item-content"), notEmpty(content)), _classNames), className), style: style, colSpan: span }, notEmpty(label) ? label : content); } return /*#__PURE__*/React.createElement(Component, { className: (0, _classnames["default"])("".concat(itemPrefixCls, "-item"), className), style: style, colSpan: span }, /*#__PURE__*/React.createElement("div", { className: "".concat(itemPrefixCls, "-item-container") }, label && /*#__PURE__*/React.createElement("span", { className: (0, _classnames["default"])("".concat(itemPrefixCls, "-item-label"), (0, _defineProperty2["default"])({}, "".concat(itemPrefixCls, "-item-no-colon"), !colon)) }, label), content && /*#__PURE__*/React.createElement("span", { className: (0, _classnames["default"])("".concat(itemPrefixCls, "-item-content")) }, content))); }; var _default = Cell; exports["default"] = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],289:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var DescriptionsItem = function DescriptionsItem(_ref) { var children = _ref.children; return children; }; var _default = DescriptionsItem; exports["default"] = _default; },{}],290:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _Cell = _interopRequireDefault(require("./Cell")); function renderCells(items, _ref, _ref2) { var colon = _ref.colon, prefixCls = _ref.prefixCls, bordered = _ref.bordered; var component = _ref2.component, type = _ref2.type, showLabel = _ref2.showLabel, showContent = _ref2.showContent; return items.map(function (_ref3, index) { var _ref3$props = _ref3.props, label = _ref3$props.label, children = _ref3$props.children, _ref3$props$prefixCls = _ref3$props.prefixCls, itemPrefixCls = _ref3$props$prefixCls === void 0 ? prefixCls : _ref3$props$prefixCls, className = _ref3$props.className, style = _ref3$props.style, _ref3$props$span = _ref3$props.span, span = _ref3$props$span === void 0 ? 1 : _ref3$props$span, key = _ref3.key; if (typeof component === 'string') { return /*#__PURE__*/React.createElement(_Cell["default"], { key: "".concat(type, "-").concat(key || index), className: className, style: style, span: span, colon: colon, component: component, itemPrefixCls: itemPrefixCls, bordered: bordered, label: showLabel ? label : null, content: showContent ? children : null }); } return [/*#__PURE__*/React.createElement(_Cell["default"], { key: "label-".concat(key || index), className: className, style: style, span: 1, colon: colon, component: component[0], itemPrefixCls: itemPrefixCls, bordered: bordered, label: label }), /*#__PURE__*/React.createElement(_Cell["default"], { key: "content-".concat(key || index), className: className, style: style, span: span * 2 - 1, component: component[1], itemPrefixCls: itemPrefixCls, bordered: bordered, content: children })]; }); } var Row = function Row(props) { var prefixCls = props.prefixCls, vertical = props.vertical, row = props.row, index = props.index, bordered = props.bordered; if (vertical) { return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("tr", { key: "label-".concat(index), className: "".concat(prefixCls, "-row") }, renderCells(row, props, { component: 'th', type: 'label', showLabel: true })), /*#__PURE__*/React.createElement("tr", { key: "content-".concat(index), className: "".concat(prefixCls, "-row") }, renderCells(row, props, { component: 'td', type: 'content', showContent: true }))); } return /*#__PURE__*/React.createElement("tr", { key: index, className: "".concat(prefixCls, "-row") }, renderCells(row, props, { component: bordered ? ['th', 'td'] : 'td', type: 'item', showLabel: true, showContent: true })); }; var _default = Row; exports["default"] = _default; },{"./Cell":288,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],291:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _responsiveObserve = _interopRequireWildcard(require("../_util/responsiveObserve")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _configProvider = require("../config-provider"); var _Row = _interopRequireDefault(require("./Row")); var _Item = _interopRequireDefault(require("./Item")); var _reactNode = require("../_util/reactNode"); /* eslint-disable react/no-array-index-key */ var DEFAULT_COLUMN_MAP = { xxl: 3, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }; function getColumn(column, screens) { if (typeof column === 'number') { return column; } if ((0, _typeof2["default"])(column) === 'object') { for (var i = 0; i < _responsiveObserve.responsiveArray.length; i++) { var breakpoint = _responsiveObserve.responsiveArray[i]; if (screens[breakpoint] && column[breakpoint] !== undefined) { return column[breakpoint] || DEFAULT_COLUMN_MAP[breakpoint]; } } } return 3; } function getFilledItem(node, span, rowRestCol) { var clone = node; if (span === undefined || span > rowRestCol) { clone = (0, _reactNode.cloneElement)(node, { span: rowRestCol }); (0, _devWarning["default"])(span === undefined, 'Descriptions', 'Sum of column `span` in a line not match `column` of Descriptions.'); } return clone; } function getRows(children, column) { var childNodes = (0, _toArray["default"])(children).filter(function (n) { return n; }); var rows = []; var tmpRow = []; var rowRestCol = column; childNodes.forEach(function (node, index) { var _a; var span = (_a = node.props) === null || _a === void 0 ? void 0 : _a.span; var mergedSpan = span || 1; // Additional handle last one if (index === childNodes.length - 1) { tmpRow.push(getFilledItem(node, span, rowRestCol)); rows.push(tmpRow); return; } if (mergedSpan < rowRestCol) { rowRestCol -= mergedSpan; tmpRow.push(node); } else { tmpRow.push(getFilledItem(node, mergedSpan, rowRestCol)); rows.push(tmpRow); rowRestCol = column; tmpRow = []; } }); return rows; } function Descriptions(_ref) { var _classNames; var customizePrefixCls = _ref.prefixCls, title = _ref.title, extra = _ref.extra, _ref$column = _ref.column, column = _ref$column === void 0 ? DEFAULT_COLUMN_MAP : _ref$column, _ref$colon = _ref.colon, colon = _ref$colon === void 0 ? true : _ref$colon, bordered = _ref.bordered, layout = _ref.layout, children = _ref.children, className = _ref.className, style = _ref.style, size = _ref.size; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var prefixCls = getPrefixCls('descriptions', customizePrefixCls); var _React$useState = React.useState({}), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), screens = _React$useState2[0], setScreens = _React$useState2[1]; var mergedColumn = getColumn(column, screens); // Responsive React.useEffect(function () { var token = _responsiveObserve["default"].subscribe(function (newScreens) { if ((0, _typeof2["default"])(column) !== 'object') { return; } setScreens(newScreens); }); return function () { _responsiveObserve["default"].unsubscribe(token); }; }, []); // Children var rows = getRows(children, mergedColumn); return /*#__PURE__*/React.createElement("div", { className: (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(size), size && size !== 'default'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-bordered"), !!bordered), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className), style: style }, (title || extra) && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-header") }, title && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-title") }, title), extra && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-extra") }, extra)), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-view") }, /*#__PURE__*/React.createElement("table", null, /*#__PURE__*/React.createElement("tbody", null, rows.map(function (row, index) { return /*#__PURE__*/React.createElement(_Row["default"], { key: index, index: index, colon: colon, prefixCls: prefixCls, vertical: layout === 'vertical', bordered: bordered, row: row }); }))))); } Descriptions.Item = _Item["default"]; var _default = Descriptions; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/reactNode":223,"../_util/responsiveObserve":225,"../config-provider":278,"./Item":289,"./Row":290,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"classnames":455,"rc-util/lib/Children/toArray":858,"react":"react"}],292:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Divider = function Divider(props) { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref) { var _classNames; var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var customizePrefixCls = props.prefixCls, _props$type = props.type, type = _props$type === void 0 ? 'horizontal' : _props$type, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? 'center' : _props$orientation, className = props.className, children = props.children, dashed = props.dashed, plain = props.plain, restProps = __rest(props, ["prefixCls", "type", "orientation", "className", "children", "dashed", "plain"]); var prefixCls = getPrefixCls('divider', customizePrefixCls); var orientationPrefix = orientation.length > 0 ? "-".concat(orientation) : orientation; var hasChildren = !!children; var classString = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-").concat(type), (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-with-text"), hasChildren), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-with-text").concat(orientationPrefix), hasChildren), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-dashed"), !!dashed), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-plain"), !!plain), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({ className: classString }, restProps, { role: "separator" }), children && /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-inner-text") }, children)); }); }; var _default = Divider; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],293:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _rcDrawer = _interopRequireDefault(require("rc-drawer")); var _getScrollBarSize = _interopRequireDefault(require("rc-util/lib/getScrollBarSize")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _context = require("../config-provider/context"); var _type = require("../_util/type"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var DrawerContext = /*#__PURE__*/React.createContext(null); var PlacementTypes = (0, _type.tuple)('top', 'right', 'bottom', 'left'); var defaultPushState = { distance: 180 }; var Drawer = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Drawer, _React$Component); var _super = (0, _createSuper2["default"])(Drawer); function Drawer() { var _this; (0, _classCallCheck2["default"])(this, Drawer); _this = _super.apply(this, arguments); _this.state = { push: false }; _this.push = function () { if (_this.props.push) { _this.setState({ push: true }); } }; _this.pull = function () { if (_this.props.push) { _this.setState({ push: false }); } }; _this.onDestroyTransitionEnd = function () { var isDestroyOnClose = _this.getDestroyOnClose(); if (!isDestroyOnClose) { return; } if (!_this.props.visible) { _this.destroyClose = true; _this.forceUpdate(); } }; _this.getDestroyOnClose = function () { return _this.props.destroyOnClose && !_this.props.visible; }; _this.getPushDistance = function () { var push = _this.props.push; var distance; if (typeof push === 'boolean') { distance = push ? defaultPushState.distance : 0; } else { distance = push.distance; } return parseFloat(String(distance || 0)); }; // get drawer push width or height _this.getPushTransform = function (placement) { var distance = _this.getPushDistance(); if (placement === 'left' || placement === 'right') { return "translateX(".concat(placement === 'left' ? distance : -distance, "px)"); } if (placement === 'top' || placement === 'bottom') { return "translateY(".concat(placement === 'top' ? distance : -distance, "px)"); } }; _this.getRcDrawerStyle = function () { var _this$props = _this.props, zIndex = _this$props.zIndex, placement = _this$props.placement, mask = _this$props.mask, style = _this$props.style; var push = _this.state.push; // 当无 mask 时,将 width 应用到外层容器上 // 解决 https://github.com/ant-design/ant-design/issues/12401 的问题 var offsetStyle = mask ? {} : _this.getOffsetStyle(); return (0, _extends2["default"])((0, _extends2["default"])({ zIndex: zIndex, transform: push ? _this.getPushTransform(placement) : undefined }, offsetStyle), style); }; // render drawer body dom _this.renderBody = function () { var _this$props2 = _this.props, bodyStyle = _this$props2.bodyStyle, drawerStyle = _this$props2.drawerStyle, prefixCls = _this$props2.prefixCls, visible = _this$props2.visible; if (_this.destroyClose && !visible) { return null; } _this.destroyClose = false; var containerStyle = {}; var isDestroyOnClose = _this.getDestroyOnClose(); if (isDestroyOnClose) { // Increase the opacity transition, delete children after closing. containerStyle.opacity = 0; containerStyle.transition = 'opacity .3s'; } return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-wrapper-body"), style: (0, _extends2["default"])((0, _extends2["default"])({}, containerStyle), drawerStyle), onTransitionEnd: _this.onDestroyTransitionEnd }, _this.renderHeader(), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-body"), style: bodyStyle }, _this.props.children), _this.renderFooter()); }; // render Provider for Multi-level drawer _this.renderProvider = function (value) { _this.parentDrawer = value; return /*#__PURE__*/React.createElement(_context.ConfigConsumer, null, function (_ref) { var getPopupContainer = _ref.getPopupContainer, getPrefixCls = _ref.getPrefixCls; var _a = _this.props, customizePrefixCls = _a.prefixCls, placement = _a.placement, className = _a.className, mask = _a.mask, direction = _a.direction, visible = _a.visible, rest = __rest(_a, ["prefixCls", "placement", "className", "mask", "direction", "visible"]); var prefixCls = getPrefixCls('select', customizePrefixCls); var drawerClassName = (0, _classnames["default"])((0, _defineProperty2["default"])({ 'no-mask': !mask }, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); var offsetStyle = mask ? _this.getOffsetStyle() : {}; return /*#__PURE__*/React.createElement(DrawerContext.Provider, { value: (0, _assertThisInitialized2["default"])(_this) }, /*#__PURE__*/React.createElement(_rcDrawer["default"], (0, _extends2["default"])({ handler: false }, (0, _omit["default"])(rest, ['zIndex', 'style', 'closable', 'closeIcon', 'destroyOnClose', 'drawerStyle', 'headerStyle', 'bodyStyle', 'footerStyle', 'footer', 'locale', 'title', 'push', 'visible', 'getPopupContainer', 'rootPrefixCls', 'getPrefixCls', 'renderEmpty', 'csp', 'pageHeader', 'autoInsertSpaceInButton', 'width', 'height', 'dropdownMatchSelectWidth', 'getTargetContainer']), { getContainer: // 有可能为 false,所以不能直接判断 rest.getContainer === undefined && getPopupContainer ? function () { return getPopupContainer(document.body); } : rest.getContainer }, offsetStyle, { prefixCls: prefixCls, open: visible, showMask: mask, placement: placement, style: _this.getRcDrawerStyle(), className: drawerClassName }), _this.renderBody())); }); }; return _this; } (0, _createClass2["default"])(Drawer, [{ key: "componentDidMount", value: function componentDidMount() { // fix: delete drawer in child and re-render, no push started. // {show && } var visible = this.props.visible; if (visible && this.parentDrawer) { this.parentDrawer.push(); } } }, { key: "componentDidUpdate", value: function componentDidUpdate(preProps) { var visible = this.props.visible; if (preProps.visible !== visible && this.parentDrawer) { if (visible) { this.parentDrawer.push(); } else { this.parentDrawer.pull(); } } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { // unmount drawer in child, clear push. if (this.parentDrawer) { this.parentDrawer.pull(); this.parentDrawer = null; } } }, { key: "getOffsetStyle", value: function getOffsetStyle() { var _this$props3 = this.props, placement = _this$props3.placement, width = _this$props3.width, height = _this$props3.height, visible = _this$props3.visible, mask = _this$props3.mask; // https://github.com/ant-design/ant-design/issues/24287 if (!visible && !mask) { return {}; } var offsetStyle = {}; if (placement === 'left' || placement === 'right') { offsetStyle.width = width; } else { offsetStyle.height = height; } return offsetStyle; } }, { key: "renderHeader", value: function renderHeader() { var _this$props4 = this.props, title = _this$props4.title, prefixCls = _this$props4.prefixCls, closable = _this$props4.closable, headerStyle = _this$props4.headerStyle; if (!title && !closable) { return null; } var headerClassName = title ? "".concat(prefixCls, "-header") : "".concat(prefixCls, "-header-no-title"); return /*#__PURE__*/React.createElement("div", { className: headerClassName, style: headerStyle }, title && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-title") }, title), closable && this.renderCloseIcon()); } }, { key: "renderFooter", value: function renderFooter() { var _this$props5 = this.props, footer = _this$props5.footer, footerStyle = _this$props5.footerStyle, prefixCls = _this$props5.prefixCls; if (!footer) { return null; } var footerClassName = "".concat(prefixCls, "-footer"); return /*#__PURE__*/React.createElement("div", { className: footerClassName, style: footerStyle }, footer); } }, { key: "renderCloseIcon", value: function renderCloseIcon() { var _this$props6 = this.props, closable = _this$props6.closable, _this$props6$closeIco = _this$props6.closeIcon, closeIcon = _this$props6$closeIco === void 0 ? /*#__PURE__*/React.createElement(_CloseOutlined["default"], null) : _this$props6$closeIco, prefixCls = _this$props6.prefixCls, onClose = _this$props6.onClose; return closable && /*#__PURE__*/ // eslint-disable-next-line react/button-has-type React.createElement("button", { onClick: onClose, "aria-label": "Close", className: "".concat(prefixCls, "-close"), style: { '--scroll-bar': "".concat((0, _getScrollBarSize["default"])(), "px") } }, closeIcon); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(DrawerContext.Consumer, null, this.renderProvider); } }]); return Drawer; }(React.Component); Drawer.defaultProps = { width: 256, height: 256, closable: true, placement: 'right', maskClosable: true, mask: true, level: null, keyboard: true, push: defaultPushState }; var _default = (0, _context.withConfigConsumer)({ prefixCls: 'drawer' })(Drawer); exports["default"] = _default; },{"../_util/type":230,"../config-provider/context":277,"@ant-design/icons/CloseOutlined":71,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"rc-drawer":608,"rc-util/lib/getScrollBarSize":869,"react":"react"}],294:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _EllipsisOutlined = _interopRequireDefault(require("@ant-design/icons/EllipsisOutlined")); var _button = _interopRequireDefault(require("../button")); var _configProvider = require("../config-provider"); var _dropdown = _interopRequireDefault(require("./dropdown")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var ButtonGroup = _button["default"].Group; var DropdownButton = function DropdownButton(props) { var _React$useContext = React.useContext(_configProvider.ConfigContext), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var customizePrefixCls = props.prefixCls, type = props.type, disabled = props.disabled, onClick = props.onClick, htmlType = props.htmlType, children = props.children, className = props.className, overlay = props.overlay, trigger = props.trigger, align = props.align, visible = props.visible, onVisibleChange = props.onVisibleChange, placement = props.placement, getPopupContainer = props.getPopupContainer, href = props.href, _props$icon = props.icon, icon = _props$icon === void 0 ? /*#__PURE__*/React.createElement(_EllipsisOutlined["default"], null) : _props$icon, title = props.title, buttonsRender = props.buttonsRender, restProps = __rest(props, ["prefixCls", "type", "disabled", "onClick", "htmlType", "children", "className", "overlay", "trigger", "align", "visible", "onVisibleChange", "placement", "getPopupContainer", "href", "icon", "title", "buttonsRender"]); var prefixCls = getPrefixCls('dropdown-button', customizePrefixCls); var dropdownProps = { align: align, overlay: overlay, disabled: disabled, trigger: disabled ? [] : trigger, onVisibleChange: onVisibleChange, getPopupContainer: getPopupContainer || getContextPopupContainer }; if ('visible' in props) { dropdownProps.visible = visible; } if ('placement' in props) { dropdownProps.placement = placement; } else { dropdownProps.placement = direction === 'rtl' ? 'bottomLeft' : 'bottomRight'; } var leftButton = /*#__PURE__*/React.createElement(_button["default"], { type: type, disabled: disabled, onClick: onClick, htmlType: htmlType, href: href, title: title }, children); var rightButton = /*#__PURE__*/React.createElement(_button["default"], { type: type, icon: icon }); var _buttonsRender = buttonsRender([leftButton, rightButton]), _buttonsRender2 = (0, _slicedToArray2["default"])(_buttonsRender, 2), leftButtonToRender = _buttonsRender2[0], rightButtonToRender = _buttonsRender2[1]; return /*#__PURE__*/React.createElement(ButtonGroup, (0, _extends2["default"])({}, restProps, { className: (0, _classnames["default"])(prefixCls, className) }), leftButtonToRender, /*#__PURE__*/React.createElement(_dropdown["default"], dropdownProps, rightButtonToRender)); }; DropdownButton.__ANT_BUTTON = true; DropdownButton.defaultProps = { type: 'default', buttonsRender: function buttonsRender(buttons) { return buttons; } }; var _default = DropdownButton; exports["default"] = _default; },{"../button":257,"../config-provider":278,"./dropdown":295,"@ant-design/icons/EllipsisOutlined":79,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"react":"react"}],295:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _rcDropdown = _interopRequireDefault(require("rc-dropdown")); var _classnames = _interopRequireDefault(require("classnames")); var _RightOutlined = _interopRequireDefault(require("@ant-design/icons/RightOutlined")); var _dropdownButton = _interopRequireDefault(require("./dropdown-button")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _type = require("../_util/type"); var _reactNode = require("../_util/reactNode"); var Placements = (0, _type.tuple)('topLeft', 'topCenter', 'topRight', 'bottomLeft', 'bottomCenter', 'bottomRight'); var Dropdown = function Dropdown(props) { var _React$useContext = React.useContext(_configProvider.ConfigContext), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var getTransitionName = function getTransitionName() { var _props$placement = props.placement, placement = _props$placement === void 0 ? '' : _props$placement, transitionName = props.transitionName; if (transitionName !== undefined) { return transitionName; } if (placement.indexOf('top') >= 0) { return 'slide-down'; } return 'slide-up'; }; var renderOverlay = function renderOverlay(prefixCls) { // rc-dropdown already can process the function of overlay, but we have check logic here. // So we need render the element to check and pass back to rc-dropdown. var overlay = props.overlay; var overlayNode; if (typeof overlay === 'function') { overlayNode = overlay(); } else { overlayNode = overlay; } overlayNode = React.Children.only(typeof overlayNode === 'string' ? /*#__PURE__*/React.createElement("span", null, overlayNode) : overlayNode); var overlayProps = overlayNode.props; // Warning if use other mode (0, _devWarning["default"])(!overlayProps.mode || overlayProps.mode === 'vertical', 'Dropdown', "mode=\"".concat(overlayProps.mode, "\" is not supported for Dropdown's Menu.")); // menu cannot be selectable in dropdown defaultly // menu should be focusable in dropdown defaultly var _overlayProps$selecta = overlayProps.selectable, selectable = _overlayProps$selecta === void 0 ? false : _overlayProps$selecta, _overlayProps$focusab = overlayProps.focusable, focusable = _overlayProps$focusab === void 0 ? true : _overlayProps$focusab; var expandIcon = /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-menu-submenu-arrow") }, /*#__PURE__*/React.createElement(_RightOutlined["default"], { className: "".concat(prefixCls, "-menu-submenu-arrow-icon") })); var fixedModeOverlay = typeof overlayNode.type === 'string' ? overlayNode : (0, _reactNode.cloneElement)(overlayNode, { mode: 'vertical', selectable: selectable, focusable: focusable, expandIcon: expandIcon }); return fixedModeOverlay; }; var getPlacement = function getPlacement() { var placement = props.placement; if (placement !== undefined) { return placement; } return direction === 'rtl' ? 'bottomRight' : 'bottomLeft'; }; var arrow = props.arrow, customizePrefixCls = props.prefixCls, children = props.children, trigger = props.trigger, disabled = props.disabled, getPopupContainer = props.getPopupContainer, overlayClassName = props.overlayClassName; var prefixCls = getPrefixCls('dropdown', customizePrefixCls); var child = React.Children.only(children); var dropdownTrigger = (0, _reactNode.cloneElement)(child, { className: (0, _classnames["default"])("".concat(prefixCls, "-trigger"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), child.props.className), disabled: disabled }); var overlayClassNameCustomized = (0, _classnames["default"])(overlayClassName, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl')); var triggerActions = disabled ? [] : trigger; var alignPoint; if (triggerActions && triggerActions.indexOf('contextMenu') !== -1) { alignPoint = true; } return /*#__PURE__*/React.createElement(_rcDropdown["default"], (0, _extends2["default"])({ arrow: arrow, alignPoint: alignPoint }, props, { overlayClassName: overlayClassNameCustomized, prefixCls: prefixCls, getPopupContainer: getPopupContainer || getContextPopupContainer, transitionName: getTransitionName(), trigger: triggerActions, overlay: function overlay() { return renderOverlay(prefixCls); }, placement: getPlacement() }), dropdownTrigger); }; Dropdown.Button = _dropdownButton["default"]; Dropdown.defaultProps = { mouseEnterDelay: 0.15, mouseLeaveDelay: 0.1 }; var _default = Dropdown; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/reactNode":223,"../_util/type":230,"../config-provider":278,"./dropdown-button":294,"@ant-design/icons/RightOutlined":100,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-dropdown":611,"react":"react"}],296:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _dropdown = _interopRequireDefault(require("./dropdown")); var _default = _dropdown["default"]; exports["default"] = _default; },{"./dropdown":295,"@babel/runtime/helpers/interopRequireDefault":192}],297:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _configProvider = require("../config-provider"); var Empty = function Empty() { var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('empty-img-default'); return /*#__PURE__*/React.createElement("svg", { className: prefixCls, width: "184", height: "152", viewBox: "0 0 184 152", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React.createElement("g", { fill: "none", fillRule: "evenodd" }, /*#__PURE__*/React.createElement("g", { transform: "translate(24 31.67)" }, /*#__PURE__*/React.createElement("ellipse", { className: "".concat(prefixCls, "-ellipse"), cx: "67.797", cy: "106.89", rx: "67.797", ry: "12.668" }), /*#__PURE__*/React.createElement("path", { className: "".concat(prefixCls, "-path-1"), d: "M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z" }), /*#__PURE__*/React.createElement("path", { className: "".concat(prefixCls, "-path-2"), d: "M101.537 86.214L80.63 61.102c-1.001-1.207-2.507-1.867-4.048-1.867H31.724c-1.54 0-3.047.66-4.048 1.867L6.769 86.214v13.792h94.768V86.214z", transform: "translate(13.56)" }), /*#__PURE__*/React.createElement("path", { className: "".concat(prefixCls, "-path-3"), d: "M33.83 0h67.933a4 4 0 0 1 4 4v93.344a4 4 0 0 1-4 4H33.83a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z" }), /*#__PURE__*/React.createElement("path", { className: "".concat(prefixCls, "-path-4"), d: "M42.678 9.953h50.237a2 2 0 0 1 2 2V36.91a2 2 0 0 1-2 2H42.678a2 2 0 0 1-2-2V11.953a2 2 0 0 1 2-2zM42.94 49.767h49.713a2.262 2.262 0 1 1 0 4.524H42.94a2.262 2.262 0 0 1 0-4.524zM42.94 61.53h49.713a2.262 2.262 0 1 1 0 4.525H42.94a2.262 2.262 0 0 1 0-4.525zM121.813 105.032c-.775 3.071-3.497 5.36-6.735 5.36H20.515c-3.238 0-5.96-2.29-6.734-5.36a7.309 7.309 0 0 1-.222-1.79V69.675h26.318c2.907 0 5.25 2.448 5.25 5.42v.04c0 2.971 2.37 5.37 5.277 5.37h34.785c2.907 0 5.277-2.421 5.277-5.393V75.1c0-2.972 2.343-5.426 5.25-5.426h26.318v33.569c0 .617-.077 1.216-.221 1.789z" })), /*#__PURE__*/React.createElement("path", { className: "".concat(prefixCls, "-path-5"), d: "M149.121 33.292l-6.83 2.65a1 1 0 0 1-1.317-1.23l1.937-6.207c-2.589-2.944-4.109-6.534-4.109-10.408C138.802 8.102 148.92 0 161.402 0 173.881 0 184 8.102 184 18.097c0 9.995-10.118 18.097-22.599 18.097-4.528 0-8.744-1.066-12.28-2.902z" }), /*#__PURE__*/React.createElement("g", { className: "".concat(prefixCls, "-g"), transform: "translate(149.65 15.383)" }, /*#__PURE__*/React.createElement("ellipse", { cx: "20.654", cy: "3.167", rx: "2.849", ry: "2.815" }), /*#__PURE__*/React.createElement("path", { d: "M5.698 5.63H0L2.898.704zM9.259.704h4.985V5.63H9.259z" })))); }; var _default = Empty; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],298:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _empty = _interopRequireDefault(require("./empty")); var _simple = _interopRequireDefault(require("./simple")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var defaultEmptyImg = /*#__PURE__*/React.createElement(_empty["default"], null); var simpleEmptyImg = /*#__PURE__*/React.createElement(_simple["default"], null); var Empty = function Empty(props) { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref) { var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var className = props.className, customizePrefixCls = props.prefixCls, _props$image = props.image, image = _props$image === void 0 ? defaultEmptyImg : _props$image, description = props.description, children = props.children, imageStyle = props.imageStyle, restProps = __rest(props, ["className", "prefixCls", "image", "description", "children", "imageStyle"]); return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Empty" }, function (locale) { var _classNames; var prefixCls = getPrefixCls('empty', customizePrefixCls); var des = typeof description !== 'undefined' ? description : locale.description; var alt = typeof des === 'string' ? des : 'empty'; var imageNode = null; if (typeof image === 'string') { imageNode = /*#__PURE__*/React.createElement("img", { alt: alt, src: image }); } else { imageNode = image; } return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({ className: (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-normal"), image === simpleEmptyImg), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className) }, restProps), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-image"), style: imageStyle }, imageNode), des && /*#__PURE__*/React.createElement("p", { className: "".concat(prefixCls, "-description") }, des), children && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-footer") }, children)); }); }); }; Empty.PRESENTED_IMAGE_DEFAULT = defaultEmptyImg; Empty.PRESENTED_IMAGE_SIMPLE = simpleEmptyImg; var _default = Empty; exports["default"] = _default; },{"../config-provider":278,"../locale-provider/LocaleReceiver":331,"./empty":297,"./simple":299,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],299:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _configProvider = require("../config-provider"); var Simple = function Simple() { var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('empty-img-simple'); return /*#__PURE__*/React.createElement("svg", { className: prefixCls, width: "64", height: "41", viewBox: "0 0 64 41", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React.createElement("g", { transform: "translate(0 1)", fill: "none", fillRule: "evenodd" }, /*#__PURE__*/React.createElement("ellipse", { className: "".concat(prefixCls, "-ellipse"), cx: "32", cy: "33", rx: "32", ry: "7" }), /*#__PURE__*/React.createElement("g", { className: "".concat(prefixCls, "-g"), fillRule: "nonzero" }, /*#__PURE__*/React.createElement("path", { d: "M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z" }), /*#__PURE__*/React.createElement("path", { d: "M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z", className: "".concat(prefixCls, "-path") })))); }; var _default = Simple; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],300:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "List", { enumerable: true, get: function get() { return _rcFieldForm.List; } }); Object.defineProperty(exports, "useForm", { enumerable: true, get: function get() { return _useForm3["default"]; } }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcFieldForm = _interopRequireWildcard(require("rc-field-form")); var _configProvider = require("../config-provider"); var _context = require("./context"); var _useForm3 = _interopRequireDefault(require("./hooks/useForm")); var _SizeContext = _interopRequireWildcard(require("../config-provider/SizeContext")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var InternalForm = function InternalForm(props, ref) { var _classNames; var contextSize = React.useContext(_SizeContext["default"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var name = props.name; var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? '' : _props$className, _props$size = props.size, size = _props$size === void 0 ? contextSize : _props$size, form = props.form, colon = props.colon, labelAlign = props.labelAlign, labelCol = props.labelCol, wrapperCol = props.wrapperCol, hideRequiredMark = props.hideRequiredMark, _props$layout = props.layout, layout = _props$layout === void 0 ? 'horizontal' : _props$layout, scrollToFirstError = props.scrollToFirstError, requiredMark = props.requiredMark, onFinishFailed = props.onFinishFailed, restFormProps = __rest(props, ["prefixCls", "className", "size", "form", "colon", "labelAlign", "labelCol", "wrapperCol", "hideRequiredMark", "layout", "scrollToFirstError", "requiredMark", "onFinishFailed"]); var mergedRequiredMark = (0, React.useMemo)(function () { if (requiredMark !== undefined) { return requiredMark; } if (hideRequiredMark) { return false; } return true; }, [hideRequiredMark, requiredMark]); var prefixCls = getPrefixCls('form', customizePrefixCls); var formClassName = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(layout), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-hide-required-mark"), mergedRequiredMark === false), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(size), size), _classNames), className); var _useForm = (0, _useForm3["default"])(form), _useForm2 = (0, _slicedToArray2["default"])(_useForm, 1), wrapForm = _useForm2[0]; var __INTERNAL__ = wrapForm.__INTERNAL__; __INTERNAL__.name = name; var formContextValue = (0, React.useMemo)(function () { return { name: name, labelAlign: labelAlign, labelCol: labelCol, wrapperCol: wrapperCol, vertical: layout === 'vertical', colon: colon, requiredMark: mergedRequiredMark, itemRef: __INTERNAL__.itemRef }; }, [name, labelAlign, labelCol, wrapperCol, layout, colon, mergedRequiredMark]); React.useImperativeHandle(ref, function () { return wrapForm; }); var onInternalFinishFailed = function onInternalFinishFailed(errorInfo) { if (onFinishFailed) { onFinishFailed(errorInfo); } if (scrollToFirstError && errorInfo.errorFields.length) { wrapForm.scrollToField(errorInfo.errorFields[0].name); } }; return /*#__PURE__*/React.createElement(_SizeContext.SizeContextProvider, { size: size }, /*#__PURE__*/React.createElement(_context.FormContext.Provider, { value: formContextValue }, /*#__PURE__*/React.createElement(_rcFieldForm["default"], (0, _extends2["default"])({ id: name }, restFormProps, { onFinishFailed: onInternalFinishFailed, form: wrapForm, className: formClassName })))); }; var Form = /*#__PURE__*/React.forwardRef(InternalForm); var _default = Form; exports["default"] = _default; },{"../config-provider":278,"../config-provider/SizeContext":276,"./context":305,"./hooks/useForm":307,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-field-form":618,"react":"react"}],301:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); var _classnames = _interopRequireDefault(require("classnames")); var _rcFieldForm = require("rc-field-form"); var _FieldContext = _interopRequireDefault(require("rc-field-form/lib/FieldContext")); var _ref2 = require("rc-util/lib/ref"); var _omit = _interopRequireDefault(require("omit.js")); var _row = _interopRequireDefault(require("../grid/row")); var _configProvider = require("../config-provider"); var _type = require("../_util/type"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _FormItemLabel = _interopRequireDefault(require("./FormItemLabel")); var _FormItemInput = _interopRequireDefault(require("./FormItemInput")); var _context = require("./context"); var _util = require("./util"); var _reactNode = require("../_util/reactNode"); var _useFrameState3 = _interopRequireDefault(require("./hooks/useFrameState")); var _useItemRef = _interopRequireDefault(require("./hooks/useItemRef")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var ValidateStatuses = (0, _type.tuple)('success', 'warning', 'error', 'validating', ''); var MemoInput = /*#__PURE__*/React.memo(function (_ref) { var children = _ref.children; return children; }, function (prev, next) { return prev.value === next.value && prev.update === next.update; }); function hasValidName(name) { if (name === null) { (0, _devWarning["default"])(false, 'Form.Item', '`null` is passed as `name` property'); } return !(name === undefined || name === null); } function FormItem(props) { var name = props.name, fieldKey = props.fieldKey, noStyle = props.noStyle, dependencies = props.dependencies, customizePrefixCls = props.prefixCls, style = props.style, className = props.className, shouldUpdate = props.shouldUpdate, hasFeedback = props.hasFeedback, help = props.help, rules = props.rules, validateStatus = props.validateStatus, children = props.children, required = props.required, label = props.label, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? 'onChange' : _props$trigger, validateTrigger = props.validateTrigger, hidden = props.hidden, restProps = __rest(props, ["name", "fieldKey", "noStyle", "dependencies", "prefixCls", "style", "className", "shouldUpdate", "hasFeedback", "help", "rules", "validateStatus", "children", "required", "label", "trigger", "validateTrigger", "hidden"]); var destroyRef = React.useRef(false); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var _React$useContext2 = React.useContext(_context.FormContext), formName = _React$useContext2.name, requiredMark = _React$useContext2.requiredMark; var _React$useContext3 = React.useContext(_context.FormItemContext), updateItemErrors = _React$useContext3.updateItemErrors; var _React$useState = React.useState(!!help), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), domErrorVisible = _React$useState2[0], innerSetDomErrorVisible = _React$useState2[1]; var prevValidateStatusRef = React.useRef(validateStatus); var _useFrameState = (0, _useFrameState3["default"])({}), _useFrameState2 = (0, _slicedToArray2["default"])(_useFrameState, 2), inlineErrors = _useFrameState2[0], setInlineErrors = _useFrameState2[1]; var _React$useContext4 = React.useContext(_FieldContext["default"]), contextValidateTrigger = _React$useContext4.validateTrigger; var mergedValidateTrigger = validateTrigger !== undefined ? validateTrigger : contextValidateTrigger; function setDomErrorVisible(visible) { if (!destroyRef.current) { innerSetDomErrorVisible(visible); } } var hasName = hasValidName(name); // Cache Field NamePath var nameRef = React.useRef([]); // Should clean up if Field removed React.useEffect(function () { return function () { destroyRef.current = true; updateItemErrors(nameRef.current.join('__SPLIT__'), []); }; }, []); var prefixCls = getPrefixCls('form', customizePrefixCls); // ======================== Errors ======================== // Collect noStyle Field error to the top FormItem var updateChildItemErrors = noStyle ? updateItemErrors : function (subName, subErrors) { setInlineErrors(function () { var prevInlineErrors = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (!(0, _isEqual["default"])(prevInlineErrors[subName], subErrors)) { return (0, _extends3["default"])((0, _extends3["default"])({}, prevInlineErrors), (0, _defineProperty2["default"])({}, subName, subErrors)); } return prevInlineErrors; }); }; // ===================== Children Ref ===================== var getItemRef = (0, _useItemRef["default"])(); function renderLayout(baseChildren, fieldId, meta, isRequired) { var _itemClassName; var _a; if (noStyle && !hidden) { return baseChildren; } // ======================== Errors ======================== // >>> collect sub errors var subErrorList = []; Object.keys(inlineErrors).forEach(function (subName) { subErrorList = [].concat((0, _toConsumableArray2["default"])(subErrorList), (0, _toConsumableArray2["default"])(inlineErrors[subName] || [])); }); // >>> merged errors var mergedErrors; if (help !== undefined && help !== null) { mergedErrors = (0, _util.toArray)(help); } else { mergedErrors = meta ? meta.errors : []; mergedErrors = [].concat((0, _toConsumableArray2["default"])(mergedErrors), (0, _toConsumableArray2["default"])(subErrorList)); } // ======================== Status ======================== var mergedValidateStatus = ''; if (validateStatus !== undefined) { mergedValidateStatus = validateStatus; } else if (meta === null || meta === void 0 ? void 0 : meta.validating) { mergedValidateStatus = 'validating'; } else if (((_a = meta === null || meta === void 0 ? void 0 : meta.errors) === null || _a === void 0 ? void 0 : _a.length) || subErrorList.length) { mergedValidateStatus = 'error'; } else if (meta === null || meta === void 0 ? void 0 : meta.touched) { mergedValidateStatus = 'success'; } if (domErrorVisible && help) { prevValidateStatusRef.current = mergedValidateStatus; } var itemClassName = (_itemClassName = {}, (0, _defineProperty2["default"])(_itemClassName, "".concat(prefixCls, "-item"), true), (0, _defineProperty2["default"])(_itemClassName, "".concat(prefixCls, "-item-with-help"), domErrorVisible || help), (0, _defineProperty2["default"])(_itemClassName, "".concat(className), !!className), (0, _defineProperty2["default"])(_itemClassName, "".concat(prefixCls, "-item-has-feedback"), mergedValidateStatus && hasFeedback), (0, _defineProperty2["default"])(_itemClassName, "".concat(prefixCls, "-item-has-success"), mergedValidateStatus === 'success'), (0, _defineProperty2["default"])(_itemClassName, "".concat(prefixCls, "-item-has-warning"), mergedValidateStatus === 'warning'), (0, _defineProperty2["default"])(_itemClassName, "".concat(prefixCls, "-item-has-error"), mergedValidateStatus === 'error'), (0, _defineProperty2["default"])(_itemClassName, "".concat(prefixCls, "-item-has-error-leave"), !help && domErrorVisible && prevValidateStatusRef.current === 'error'), (0, _defineProperty2["default"])(_itemClassName, "".concat(prefixCls, "-item-is-validating"), mergedValidateStatus === 'validating'), (0, _defineProperty2["default"])(_itemClassName, "".concat(prefixCls, "-item-hidden"), hidden), _itemClassName); // ======================= Children ======================= return /*#__PURE__*/React.createElement(_row["default"], (0, _extends3["default"])({ className: (0, _classnames["default"])(itemClassName), style: style, key: "row" }, (0, _omit["default"])(restProps, ['colon', 'extra', 'getValueFromEvent', 'getValueProps', 'hasFeedback', 'help', 'htmlFor', 'id', 'initialValue', 'isListField', 'label', 'labelAlign', 'labelCol', 'normalize', 'preserve', 'required', 'validateFirst', 'validateStatus', 'valuePropName', 'wrapperCol'])), /*#__PURE__*/React.createElement(_FormItemLabel["default"], (0, _extends3["default"])({ htmlFor: fieldId, required: isRequired, requiredMark: requiredMark }, props, { prefixCls: prefixCls })), /*#__PURE__*/React.createElement(_FormItemInput["default"], (0, _extends3["default"])({}, props, meta, { errors: mergedErrors, prefixCls: prefixCls, onDomErrorVisibleChange: setDomErrorVisible, validateStatus: mergedValidateStatus }), /*#__PURE__*/React.createElement(_context.FormItemContext.Provider, { value: { updateItemErrors: updateChildItemErrors } }, baseChildren))); } var isRenderProps = typeof children === 'function'; // Record for real component render var updateRef = React.useRef(0); updateRef.current += 1; if (!hasName && !isRenderProps && !dependencies) { return renderLayout(children); } var variables = {}; if (typeof label === 'string') { variables.label = label; } return /*#__PURE__*/React.createElement(_rcFieldForm.Field, (0, _extends3["default"])({}, props, { messageVariables: variables, trigger: trigger, validateTrigger: mergedValidateTrigger, onReset: function onReset() { setDomErrorVisible(false); } }), function (control, meta, context) { var errors = meta.errors; var mergedName = (0, _util.toArray)(name).length && meta ? meta.name : []; var fieldId = (0, _util.getFieldId)(mergedName, formName); if (noStyle) { nameRef.current = (0, _toConsumableArray2["default"])(mergedName); if (fieldKey) { var fieldKeys = Array.isArray(fieldKey) ? fieldKey : [fieldKey]; nameRef.current = [].concat((0, _toConsumableArray2["default"])(mergedName.slice(0, -1)), (0, _toConsumableArray2["default"])(fieldKeys)); } updateItemErrors(nameRef.current.join('__SPLIT__'), errors); } var isRequired = required !== undefined ? required : !!(rules && rules.some(function (rule) { if (rule && (0, _typeof2["default"])(rule) === 'object' && rule.required) { return true; } if (typeof rule === 'function') { var ruleEntity = rule(context); return ruleEntity && ruleEntity.required; } return false; })); // ======================= Children ======================= var mergedControl = (0, _extends3["default"])({}, control); var childNode = null; (0, _devWarning["default"])(!(shouldUpdate && dependencies), 'Form.Item', "`shouldUpdate` and `dependencies` shouldn't be used together. See https://ant.design/components/form/#dependencies."); if (Array.isArray(children) && hasName) { (0, _devWarning["default"])(false, 'Form.Item', '`children` is array of render props cannot have `name`.'); childNode = children; } else if (isRenderProps && (!(shouldUpdate || dependencies) || hasName)) { (0, _devWarning["default"])(!!(shouldUpdate || dependencies), 'Form.Item', '`children` of render props only work with `shouldUpdate` or `dependencies`.'); (0, _devWarning["default"])(!hasName, 'Form.Item', "Do not use `name` with `children` of render props since it's not a field."); } else if (dependencies && !isRenderProps && !hasName) { (0, _devWarning["default"])(false, 'Form.Item', 'Must set `name` or use render props when `dependencies` is set.'); } else if ((0, _reactNode.isValidElement)(children)) { (0, _devWarning["default"])(children.props.defaultValue === undefined, 'Form.Item', '`defaultValue` will not work on controlled Field. You should use `initialValues` of Form instead.'); var childProps = (0, _extends3["default"])((0, _extends3["default"])({}, children.props), mergedControl); if (!childProps.id) { childProps.id = fieldId; } if ((0, _ref2.supportRef)(children)) { childProps.ref = getItemRef(mergedName, children); } // We should keep user origin event handler var triggers = new Set([].concat((0, _toConsumableArray2["default"])((0, _util.toArray)(trigger)), (0, _toConsumableArray2["default"])((0, _util.toArray)(mergedValidateTrigger)))); triggers.forEach(function (eventName) { childProps[eventName] = function () { var _a2, _c2; var _a, _b, _c; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } (_a = mergedControl[eventName]) === null || _a === void 0 ? void 0 : (_a2 = _a).call.apply(_a2, [mergedControl].concat(args)); (_c = (_b = children.props)[eventName]) === null || _c === void 0 ? void 0 : (_c2 = _c).call.apply(_c2, [_b].concat(args)); }; }); childNode = /*#__PURE__*/React.createElement(MemoInput, { value: mergedControl[props.valuePropName || 'value'], update: updateRef.current }, (0, _reactNode.cloneElement)(children, childProps)); } else if (isRenderProps && (shouldUpdate || dependencies) && !hasName) { childNode = children(context); } else { (0, _devWarning["default"])(!mergedName.length, 'Form.Item', '`name` is only used for validate React element. If you are using Form.Item as layout display, please remove `name` instead.'); childNode = children; } return renderLayout(childNode, fieldId, meta, isRequired); }); } var _default = FormItem; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/reactNode":223,"../_util/type":230,"../config-provider":278,"../grid/row":316,"./FormItemInput":302,"./FormItemLabel":303,"./context":305,"./hooks/useFrameState":308,"./hooks/useItemRef":309,"./util":311,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"classnames":455,"lodash/isEqual":557,"omit.js":579,"rc-field-form":618,"rc-field-form/lib/FieldContext":614,"rc-util/lib/ref":874,"react":"react"}],302:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons/LoadingOutlined")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _CheckCircleFilled = _interopRequireDefault(require("@ant-design/icons/CheckCircleFilled")); var _ExclamationCircleFilled = _interopRequireDefault(require("@ant-design/icons/ExclamationCircleFilled")); var _useMemo = _interopRequireDefault(require("rc-util/lib/hooks/useMemo")); var _rcMotion = _interopRequireDefault(require("rc-motion")); var _col = _interopRequireDefault(require("../grid/col")); var _context = require("./context"); var _useCacheErrors3 = _interopRequireDefault(require("./hooks/useCacheErrors")); var _useForceUpdate = _interopRequireDefault(require("../_util/hooks/useForceUpdate")); var iconMap = { success: _CheckCircleFilled["default"], warning: _ExclamationCircleFilled["default"], error: _CloseCircleFilled["default"], validating: _LoadingOutlined["default"] }; var FormItemInput = function FormItemInput(_ref) { var prefixCls = _ref.prefixCls, wrapperCol = _ref.wrapperCol, children = _ref.children, help = _ref.help, errors = _ref.errors, onDomErrorVisibleChange = _ref.onDomErrorVisibleChange, hasFeedback = _ref.hasFeedback, validateStatus = _ref.validateStatus, extra = _ref.extra; var forceUpdate = (0, _useForceUpdate["default"])(); var baseClassName = "".concat(prefixCls, "-item"); var formContext = React.useContext(_context.FormContext); var mergedWrapperCol = wrapperCol || formContext.wrapperCol || {}; var className = (0, _classnames["default"])("".concat(baseClassName, "-control"), mergedWrapperCol.className); var _useCacheErrors = (0, _useCacheErrors3["default"])(errors, function (changedVisible) { if (changedVisible) { /** * We trigger in sync to avoid dom shaking but this get warning in react 16.13. * So use Promise to keep in micro async to handle this. * https://github.com/ant-design/ant-design/issues/21698#issuecomment-593743485 */ Promise.resolve().then(function () { onDomErrorVisibleChange(true); }); } forceUpdate(); }, !!help), _useCacheErrors2 = (0, _slicedToArray2["default"])(_useCacheErrors, 2), visible = _useCacheErrors2[0], cacheErrors = _useCacheErrors2[1]; React.useEffect(function () { return function () { onDomErrorVisibleChange(false); }; }, []); var memoErrors = (0, _useMemo["default"])(function () { return cacheErrors; }, visible, function (_, nextVisible) { return nextVisible; }); // Should provides additional icon if `hasFeedback` var IconNode = validateStatus && iconMap[validateStatus]; var icon = hasFeedback && IconNode ? /*#__PURE__*/React.createElement("span", { className: "".concat(baseClassName, "-children-icon") }, /*#__PURE__*/React.createElement(IconNode, null)) : null; // Pass to sub FormItem should not with col info var subFormContext = (0, _extends2["default"])({}, formContext); delete subFormContext.labelCol; delete subFormContext.wrapperCol; return /*#__PURE__*/React.createElement(_context.FormContext.Provider, { value: subFormContext }, /*#__PURE__*/React.createElement(_col["default"], (0, _extends2["default"])({}, mergedWrapperCol, { className: className }), /*#__PURE__*/React.createElement("div", { className: "".concat(baseClassName, "-control-input") }, /*#__PURE__*/React.createElement("div", { className: "".concat(baseClassName, "-control-input-content") }, children), icon), /*#__PURE__*/React.createElement(_rcMotion["default"], { motionDeadline: 500, visible: visible, motionName: "show-help", onLeaveEnd: function onLeaveEnd() { onDomErrorVisibleChange(false); }, motionAppear: true, removeOnLeave: true }, function (_ref2) { var motionClassName = _ref2.className; return /*#__PURE__*/React.createElement("div", { className: (0, _classnames["default"])("".concat(baseClassName, "-explain"), motionClassName), key: "help" }, memoErrors.map(function (error, index) { return ( /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key React.createElement("div", { key: index, role: "alert" }, error) ); })); }), extra && /*#__PURE__*/React.createElement("div", { className: "".concat(baseClassName, "-extra") }, extra))); }; var _default = FormItemInput; exports["default"] = _default; },{"../_util/hooks/useForceUpdate":217,"../grid/col":313,"./context":305,"./hooks/useCacheErrors":306,"@ant-design/icons/CheckCircleFilled":65,"@ant-design/icons/CloseCircleFilled":69,"@ant-design/icons/ExclamationCircleFilled":81,"@ant-design/icons/LoadingOutlined":93,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-motion":661,"rc-util/lib/hooks/useMemo":870,"react":"react"}],303:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _col = _interopRequireDefault(require("../grid/col")); var _context = require("./context"); var _LocaleReceiver = require("../locale-provider/LocaleReceiver"); var _default2 = _interopRequireDefault(require("../locale/default")); var FormItemLabel = function FormItemLabel(_ref) { var prefixCls = _ref.prefixCls, label = _ref.label, htmlFor = _ref.htmlFor, labelCol = _ref.labelCol, labelAlign = _ref.labelAlign, colon = _ref.colon, required = _ref.required, requiredMark = _ref.requiredMark; var _useLocaleReceiver = (0, _LocaleReceiver.useLocaleReceiver)('Form'), _useLocaleReceiver2 = (0, _slicedToArray2["default"])(_useLocaleReceiver, 1), formLocale = _useLocaleReceiver2[0]; if (!label) return null; return /*#__PURE__*/React.createElement(_context.FormContext.Consumer, { key: "label" }, function (_ref2) { var _classNames; var vertical = _ref2.vertical, contextLabelAlign = _ref2.labelAlign, contextLabelCol = _ref2.labelCol, contextColon = _ref2.colon; var _a; var mergedLabelCol = labelCol || contextLabelCol || {}; var mergedLabelAlign = labelAlign || contextLabelAlign; var labelClsBasic = "".concat(prefixCls, "-item-label"); var labelColClassName = (0, _classnames["default"])(labelClsBasic, mergedLabelAlign === 'left' && "".concat(labelClsBasic, "-left"), mergedLabelCol.className); var labelChildren = label; // Keep label is original where there should have no colon var computedColon = colon === true || contextColon !== false && colon !== false; var haveColon = computedColon && !vertical; // Remove duplicated user input colon if (haveColon && typeof label === 'string' && label.trim() !== '') { labelChildren = label.replace(/[:|:]\s*$/, ''); } // Add required mark if optional if (requiredMark === 'optional' && !required) { labelChildren = /*#__PURE__*/React.createElement(React.Fragment, null, labelChildren, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-item-optional") }, (formLocale === null || formLocale === void 0 ? void 0 : formLocale.optional) || ((_a = _default2["default"].Form) === null || _a === void 0 ? void 0 : _a.optional))); } var labelClassName = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-item-required"), required), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-item-required-mark-optional"), requiredMark === 'optional'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-item-no-colon"), !computedColon), _classNames)); return /*#__PURE__*/React.createElement(_col["default"], (0, _extends2["default"])({}, mergedLabelCol, { className: labelColClassName }), /*#__PURE__*/React.createElement("label", { htmlFor: htmlFor, className: labelClassName, title: typeof label === 'string' ? label : '' }, labelChildren)); }); }; var _default = FormItemLabel; exports["default"] = _default; },{"../grid/col":313,"../locale-provider/LocaleReceiver":331,"../locale/default":335,"./context":305,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"react":"react"}],304:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcFieldForm = require("rc-field-form"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var FormList = function FormList(_a) { var children = _a.children, props = __rest(_a, ["children"]); (0, _devWarning["default"])(!!props.name, 'Form.List', 'Miss `name` prop.'); return /*#__PURE__*/React.createElement(_rcFieldForm.List, props, function (fields, operation) { return children(fields.map(function (field) { return (0, _extends2["default"])((0, _extends2["default"])({}, field), { fieldKey: field.key }); }), operation); }); }; var _default = FormList; exports["default"] = _default; },{"../_util/devWarning":212,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-field-form":618,"react":"react"}],305:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.FormProvider = exports.FormItemContext = exports.FormContext = void 0; var React = _interopRequireWildcard(require("react")); var _omit = _interopRequireDefault(require("omit.js")); var _rcFieldForm = require("rc-field-form"); var FormContext = /*#__PURE__*/React.createContext({ labelAlign: 'right', vertical: false, itemRef: function itemRef() {} }); exports.FormContext = FormContext; var FormItemContext = /*#__PURE__*/React.createContext({ updateItemErrors: function updateItemErrors() {} }); exports.FormItemContext = FormItemContext; var FormProvider = function FormProvider(props) { var providerProps = (0, _omit["default"])(props, ['prefixCls']); return /*#__PURE__*/React.createElement(_rcFieldForm.FormProvider, providerProps); }; exports.FormProvider = FormProvider; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"omit.js":579,"rc-field-form":618,"react":"react"}],306:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useCacheErrors; var React = _interopRequireWildcard(require("react")); var _useForceUpdate = _interopRequireDefault(require("../../_util/hooks/useForceUpdate")); /** * Always debounce error to avoid [error -> null -> error] blink */ function useCacheErrors(errors, changeTrigger, directly) { var cacheRef = React.useRef({ errors: errors, visible: !!errors.length }); var forceUpdate = (0, _useForceUpdate["default"])(); var update = function update() { var prevVisible = cacheRef.current.visible; var newVisible = !!errors.length; var prevErrors = cacheRef.current.errors; cacheRef.current.errors = errors; cacheRef.current.visible = newVisible; if (prevVisible !== newVisible) { changeTrigger(newVisible); } else if (prevErrors.length !== errors.length || prevErrors.some(function (prevErr, index) { return prevErr !== errors[index]; })) { forceUpdate(); } }; React.useEffect(function () { if (!directly) { var timeout = setTimeout(update, 10); return function () { return clearTimeout(timeout); }; } }, [errors]); if (directly) { update(); } return [cacheRef.current.visible, cacheRef.current.errors]; } },{"../../_util/hooks/useForceUpdate":217,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],307:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useForm; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _rcFieldForm = require("rc-field-form"); var _scrollIntoViewIfNeeded = _interopRequireDefault(require("scroll-into-view-if-needed")); var _util = require("../util"); function toNamePathStr(name) { var namePath = (0, _util.toArray)(name); return namePath.join('_'); } function useForm(form) { var _useRcForm = (0, _rcFieldForm.useForm)(), _useRcForm2 = (0, _slicedToArray2["default"])(_useRcForm, 1), rcForm = _useRcForm2[0]; var itemsRef = React.useRef({}); var wrapForm = React.useMemo(function () { return form || (0, _extends2["default"])((0, _extends2["default"])({}, rcForm), { __INTERNAL__: { itemRef: function itemRef(name) { return function (node) { var namePathStr = toNamePathStr(name); if (node) { itemsRef.current[namePathStr] = node; } else { delete itemsRef.current[namePathStr]; } }; } }, scrollToField: function scrollToField(name) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var namePath = (0, _util.toArray)(name); var fieldId = (0, _util.getFieldId)(namePath, wrapForm.__INTERNAL__.name); var node = fieldId ? document.getElementById(fieldId) : null; if (node) { (0, _scrollIntoViewIfNeeded["default"])(node, (0, _extends2["default"])({ scrollMode: 'if-needed', block: 'nearest' }, options)); } }, getFieldInstance: function getFieldInstance(name) { var namePathStr = toNamePathStr(name); return itemsRef.current[namePathStr]; } }); }, [form, rcForm]); return [wrapForm]; } },{"../util":311,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"rc-field-form":618,"react":"react","scroll-into-view-if-needed":900}],308:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useFrameState; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _raf = _interopRequireDefault(require("raf")); function useFrameState(defaultValue) { var _React$useState = React.useState(defaultValue), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), value = _React$useState2[0], setValue = _React$useState2[1]; var frameRef = (0, React.useRef)(null); var batchRef = (0, React.useRef)([]); var destroyRef = (0, React.useRef)(false); React.useEffect(function () { return function () { destroyRef.current = true; _raf["default"].cancel(frameRef.current); }; }, []); function setFrameValue(updater) { if (destroyRef.current) { return; } if (frameRef.current === null) { batchRef.current = []; frameRef.current = (0, _raf["default"])(function () { frameRef.current = null; setValue(function (prevValue) { var current = prevValue; batchRef.current.forEach(function (func) { current = func(current); }); return current; }); }); } batchRef.current.push(updater); } return [value, setFrameValue]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"raf":581,"react":"react"}],309:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useItemRef; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _ref = require("rc-util/lib/ref"); var _context = require("../context"); function useItemRef() { var _React$useContext = React.useContext(_context.FormContext), itemRef = _React$useContext.itemRef; var cacheRef = React.useRef({}); function getRef(name, children) { var childrenRef = children && (0, _typeof2["default"])(children) === 'object' && children.ref; var nameStr = name.join('_'); if (cacheRef.current.name !== nameStr || cacheRef.current.originRef !== childrenRef) { cacheRef.current.name = nameStr; cacheRef.current.originRef = childrenRef; cacheRef.current.ref = (0, _ref.composeRef)(itemRef(name), childrenRef); } return cacheRef.current.ref; } return getRef; } },{"../context":305,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"rc-util/lib/ref":874,"react":"react"}],310:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Form = _interopRequireWildcard(require("./Form")); var _FormItem = _interopRequireDefault(require("./FormItem")); var _FormList = _interopRequireDefault(require("./FormList")); var _context = require("./context"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var Form = _Form["default"]; Form.Item = _FormItem["default"]; Form.List = _FormList["default"]; Form.useForm = _Form.useForm; Form.Provider = _context.FormProvider; Form.create = function () { (0, _devWarning["default"])(false, 'Form', 'antd v4 removed `Form.create`. Please remove or use `@ant-design/compatible` instead.'); }; var _default = Form; exports["default"] = _default; },{"../_util/devWarning":212,"./Form":300,"./FormItem":301,"./FormList":304,"./context":305,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193}],311:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.toArray = toArray; exports.getFieldId = getFieldId; function toArray(candidate) { if (candidate === undefined || candidate === false) return []; return Array.isArray(candidate) ? candidate : [candidate]; } function getFieldId(namePath, formName) { if (!namePath.length) return undefined; var mergedId = namePath.join('_'); return formName ? "".concat(formName, "_").concat(mergedId) : mergedId; } },{}],312:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = require("react"); var RowContext = /*#__PURE__*/(0, _react.createContext)({}); var _default = RowContext; exports["default"] = _default; },{"react":"react"}],313:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _RowContext = _interopRequireDefault(require("./RowContext")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; function parseFlex(flex) { if (typeof flex === 'number') { return "".concat(flex, " ").concat(flex, " auto"); } if (/^\d+(\.\d+)?(px|em|rem|%)$/.test(flex)) { return "0 0 ".concat(flex); } return flex; } var Col = /*#__PURE__*/React.forwardRef(function (props, ref) { var renderCol = function renderCol(_ref) { var _classNames; var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var customizePrefixCls = props.prefixCls, span = props.span, order = props.order, offset = props.offset, push = props.push, pull = props.pull, className = props.className, children = props.children, flex = props.flex, style = props.style, others = __rest(props, ["prefixCls", "span", "order", "offset", "push", "pull", "className", "children", "flex", "style"]); var prefixCls = getPrefixCls('col', customizePrefixCls); var sizeClassObj = {}; ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].forEach(function (size) { var _extends2; var sizeProps = {}; var propSize = props[size]; if (typeof propSize === 'number') { sizeProps.span = propSize; } else if ((0, _typeof2["default"])(propSize) === 'object') { sizeProps = propSize || {}; } delete others[size]; sizeClassObj = (0, _extends3["default"])((0, _extends3["default"])({}, sizeClassObj), (_extends2 = {}, (0, _defineProperty2["default"])(_extends2, "".concat(prefixCls, "-").concat(size, "-").concat(sizeProps.span), sizeProps.span !== undefined), (0, _defineProperty2["default"])(_extends2, "".concat(prefixCls, "-").concat(size, "-order-").concat(sizeProps.order), sizeProps.order || sizeProps.order === 0), (0, _defineProperty2["default"])(_extends2, "".concat(prefixCls, "-").concat(size, "-offset-").concat(sizeProps.offset), sizeProps.offset || sizeProps.offset === 0), (0, _defineProperty2["default"])(_extends2, "".concat(prefixCls, "-").concat(size, "-push-").concat(sizeProps.push), sizeProps.push || sizeProps.push === 0), (0, _defineProperty2["default"])(_extends2, "".concat(prefixCls, "-").concat(size, "-pull-").concat(sizeProps.pull), sizeProps.pull || sizeProps.pull === 0), (0, _defineProperty2["default"])(_extends2, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _extends2)); }); var classes = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(span), span !== undefined), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-order-").concat(order), order), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-offset-").concat(offset), offset), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-push-").concat(push), push), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-pull-").concat(pull), pull), _classNames), className, sizeClassObj); return /*#__PURE__*/React.createElement(_RowContext["default"].Consumer, null, function (_ref2) { var gutter = _ref2.gutter; var mergedStyle = (0, _extends3["default"])({}, style); if (gutter) { mergedStyle = (0, _extends3["default"])((0, _extends3["default"])((0, _extends3["default"])({}, gutter[0] > 0 ? { paddingLeft: gutter[0] / 2, paddingRight: gutter[0] / 2 } : {}), gutter[1] > 0 ? { paddingTop: gutter[1] / 2, paddingBottom: gutter[1] / 2 } : {}), mergedStyle); } if (flex) { mergedStyle.flex = parseFlex(flex); } return /*#__PURE__*/React.createElement("div", (0, _extends3["default"])({}, others, { style: mergedStyle, className: classes, ref: ref }), children); }); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderCol); }); Col.displayName = 'Col'; var _default = Col; exports["default"] = _default; },{"../config-provider":278,"./RowContext":312,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"classnames":455,"react":"react"}],314:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _responsiveObserve = _interopRequireDefault(require("../../_util/responsiveObserve")); function useBreakpoint() { var _useState = (0, _react.useState)({}), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), screens = _useState2[0], setScreens = _useState2[1]; (0, _react.useEffect)(function () { var token = _responsiveObserve["default"].subscribe(function (supportScreens) { setScreens(supportScreens); }); return function () { return _responsiveObserve["default"].unsubscribe(token); }; }, []); return screens; } var _default = useBreakpoint; exports["default"] = _default; },{"../../_util/responsiveObserve":225,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],315:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Row", { enumerable: true, get: function get() { return _row["default"]; } }); Object.defineProperty(exports, "Col", { enumerable: true, get: function get() { return _col["default"]; } }); exports["default"] = void 0; var _row = _interopRequireDefault(require("./row")); var _col = _interopRequireDefault(require("./col")); var _useBreakpoint = _interopRequireDefault(require("./hooks/useBreakpoint")); var _default = { useBreakpoint: _useBreakpoint["default"] }; exports["default"] = _default; },{"./col":313,"./hooks/useBreakpoint":314,"./row":316,"@babel/runtime/helpers/interopRequireDefault":192}],316:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _RowContext = _interopRequireDefault(require("./RowContext")); var _type = require("../_util/type"); var _responsiveObserve = _interopRequireWildcard(require("../_util/responsiveObserve")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var RowAligns = (0, _type.tuple)('top', 'middle', 'bottom', 'stretch'); var RowJustify = (0, _type.tuple)('start', 'end', 'center', 'space-around', 'space-between'); var Row = /*#__PURE__*/React.forwardRef(function (props, ref) { var _React$useState = React.useState({ xs: true, sm: true, md: true, lg: true, xl: true, xxl: true }), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), screens = _React$useState2[0], setScreens = _React$useState2[1]; var gutterRef = React.useRef(); gutterRef.current = props.gutter; React.useEffect(function () { var token = _responsiveObserve["default"].subscribe(function (screen) { var currentGutter = gutterRef.current || 0; if (!Array.isArray(currentGutter) && (0, _typeof2["default"])(currentGutter) === 'object' || Array.isArray(currentGutter) && ((0, _typeof2["default"])(currentGutter[0]) === 'object' || (0, _typeof2["default"])(currentGutter[1]) === 'object')) { setScreens(screen); } }); return function () { _responsiveObserve["default"].unsubscribe(token); }; }, []); var getGutter = function getGutter() { var results = [0, 0]; var _props$gutter = props.gutter, gutter = _props$gutter === void 0 ? 0 : _props$gutter; var normalizedGutter = Array.isArray(gutter) ? gutter : [gutter, 0]; normalizedGutter.forEach(function (g, index) { if ((0, _typeof2["default"])(g) === 'object') { for (var i = 0; i < _responsiveObserve.responsiveArray.length; i++) { var breakpoint = _responsiveObserve.responsiveArray[i]; if (screens[breakpoint] && g[breakpoint] !== undefined) { results[index] = g[breakpoint]; break; } } } else { results[index] = g || 0; } }); return results; }; var renderRow = function renderRow(_ref) { var _classNames; var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var customizePrefixCls = props.prefixCls, justify = props.justify, align = props.align, className = props.className, style = props.style, children = props.children, others = __rest(props, ["prefixCls", "justify", "align", "className", "style", "children"]); var prefixCls = getPrefixCls('row', customizePrefixCls); var gutter = getGutter(); var classes = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(justify), justify), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(align), align), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); var rowStyle = (0, _extends2["default"])((0, _extends2["default"])((0, _extends2["default"])({}, gutter[0] > 0 ? { marginLeft: gutter[0] / -2, marginRight: gutter[0] / -2 } : {}), gutter[1] > 0 ? { marginTop: gutter[1] / -2, marginBottom: gutter[1] / 2 } : {}), style); var otherProps = (0, _extends2["default"])({}, others); delete otherProps.gutter; return /*#__PURE__*/React.createElement(_RowContext["default"].Provider, { value: { gutter: gutter } }, /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, otherProps, { className: classes, style: rowStyle, ref: ref }), children)); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderRow); }); Row.displayName = 'Row'; var _default = Row; exports["default"] = _default; },{"../_util/responsiveObserve":225,"../_util/type":230,"../config-provider":278,"./RowContext":312,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"classnames":455,"react":"react"}],317:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcImage = _interopRequireDefault(require("rc-image")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Image = function Image(_a) { var customizePrefixCls = _a.prefixCls, otherProps = __rest(_a, ["prefixCls"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('image', customizePrefixCls); return /*#__PURE__*/React.createElement(_rcImage["default"], (0, _extends2["default"])({ prefixCls: prefixCls }, otherProps)); }; var _default = Image; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-image":630,"react":"react"}],318:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcInputNumber = _interopRequireDefault(require("rc-input-number")); var _UpOutlined = _interopRequireDefault(require("@ant-design/icons/UpOutlined")); var _DownOutlined = _interopRequireDefault(require("@ant-design/icons/DownOutlined")); var _configProvider = require("../config-provider"); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var InputNumber = /*#__PURE__*/React.forwardRef(function (props, ref) { var renderInputNumber = function renderInputNumber(_ref) { var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var className = props.className, customizeSize = props.size, customizePrefixCls = props.prefixCls, readOnly = props.readOnly, others = __rest(props, ["className", "size", "prefixCls", "readOnly"]); var prefixCls = getPrefixCls('input-number', customizePrefixCls); var upIcon = /*#__PURE__*/React.createElement(_UpOutlined["default"], { className: "".concat(prefixCls, "-handler-up-inner") }); var downIcon = /*#__PURE__*/React.createElement(_DownOutlined["default"], { className: "".concat(prefixCls, "-handler-down-inner") }); return /*#__PURE__*/React.createElement(_SizeContext["default"].Consumer, null, function (size) { var _classNames; var mergeSize = customizeSize || size; var inputNumberClass = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-lg"), mergeSize === 'large'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-sm"), mergeSize === 'small'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-readonly"), readOnly), _classNames), className); return /*#__PURE__*/React.createElement(_rcInputNumber["default"], (0, _extends2["default"])({ ref: ref, className: inputNumberClass, upHandler: upIcon, downHandler: downIcon, prefixCls: prefixCls, readOnly: readOnly }, others)); }); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderInputNumber); }); InputNumber.defaultProps = { step: 1 }; var _default = InputNumber; exports["default"] = _default; },{"../config-provider":278,"../config-provider/SizeContext":276,"@ant-design/icons/DownOutlined":76,"@ant-design/icons/UpOutlined":106,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-input-number":632,"react":"react"}],319:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.hasPrefixSuffix = hasPrefixSuffix; exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _type = require("../_util/type"); var _Input = require("./Input"); var _reactNode = require("../_util/reactNode"); var ClearableInputType = (0, _type.tuple)('text', 'input'); function hasPrefixSuffix(props) { return !!(props.prefix || props.suffix || props.allowClear); } var ClearableLabeledInput = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(ClearableLabeledInput, _React$Component); var _super = (0, _createSuper2["default"])(ClearableLabeledInput); function ClearableLabeledInput() { var _this; (0, _classCallCheck2["default"])(this, ClearableLabeledInput); _this = _super.apply(this, arguments); /** @private Do not use out of this class. We do not promise this is always keep. */ _this.containerRef = /*#__PURE__*/React.createRef(); _this.onInputMouseUp = function (e) { var _a; if ((_a = _this.containerRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target)) { var triggerFocus = _this.props.triggerFocus; triggerFocus(); } }; return _this; } (0, _createClass2["default"])(ClearableLabeledInput, [{ key: "renderClearIcon", value: function renderClearIcon(prefixCls) { var _this$props = this.props, allowClear = _this$props.allowClear, value = _this$props.value, disabled = _this$props.disabled, readOnly = _this$props.readOnly, inputType = _this$props.inputType, handleReset = _this$props.handleReset; if (!allowClear) { return null; } var needClear = !disabled && !readOnly && value; var className = inputType === ClearableInputType[0] ? "".concat(prefixCls, "-textarea-clear-icon") : "".concat(prefixCls, "-clear-icon"); return /*#__PURE__*/React.createElement(_CloseCircleFilled["default"], { onClick: handleReset, className: (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(className, "-hidden"), !needClear), className), role: "button" }); } }, { key: "renderSuffix", value: function renderSuffix(prefixCls) { var _this$props2 = this.props, suffix = _this$props2.suffix, allowClear = _this$props2.allowClear; if (suffix || allowClear) { return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-suffix") }, this.renderClearIcon(prefixCls), suffix); } return null; } }, { key: "renderLabeledIcon", value: function renderLabeledIcon(prefixCls, element) { var _classNames2; var _this$props3 = this.props, focused = _this$props3.focused, value = _this$props3.value, prefix = _this$props3.prefix, className = _this$props3.className, size = _this$props3.size, suffix = _this$props3.suffix, disabled = _this$props3.disabled, allowClear = _this$props3.allowClear, direction = _this$props3.direction, style = _this$props3.style, readOnly = _this$props3.readOnly, bordered = _this$props3.bordered; var suffixNode = this.renderSuffix(prefixCls); if (!hasPrefixSuffix(this.props)) { return (0, _reactNode.cloneElement)(element, { value: value }); } var prefixNode = prefix ? /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-prefix") }, prefix) : null; var affixWrapperCls = (0, _classnames["default"])("".concat(prefixCls, "-affix-wrapper"), (_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-affix-wrapper-focused"), focused), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-affix-wrapper-disabled"), disabled), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-affix-wrapper-sm"), size === 'small'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-affix-wrapper-lg"), size === 'large'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-affix-wrapper-input-with-clear-btn"), suffix && allowClear && value), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-affix-wrapper-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-affix-wrapper-readonly"), readOnly), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-affix-wrapper-borderless"), !bordered), _classNames2), className); return /*#__PURE__*/React.createElement("span", { ref: this.containerRef, className: affixWrapperCls, style: style, onMouseUp: this.onInputMouseUp }, prefixNode, (0, _reactNode.cloneElement)(element, { style: null, value: value, className: (0, _Input.getInputClassName)(prefixCls, bordered, size, disabled) }), suffixNode); } }, { key: "renderInputWithLabel", value: function renderInputWithLabel(prefixCls, labeledElement) { var _classNames3, _classNames4; var _this$props4 = this.props, addonBefore = _this$props4.addonBefore, addonAfter = _this$props4.addonAfter, style = _this$props4.style, size = _this$props4.size, className = _this$props4.className, direction = _this$props4.direction; // Not wrap when there is not addons if (!addonBefore && !addonAfter) { return labeledElement; } var wrapperClassName = "".concat(prefixCls, "-group"); var addonClassName = "".concat(wrapperClassName, "-addon"); var addonBeforeNode = addonBefore ? /*#__PURE__*/React.createElement("span", { className: addonClassName }, addonBefore) : null; var addonAfterNode = addonAfter ? /*#__PURE__*/React.createElement("span", { className: addonClassName }, addonAfter) : null; var mergedWrapperClassName = (0, _classnames["default"])("".concat(prefixCls, "-wrapper"), (_classNames3 = {}, (0, _defineProperty2["default"])(_classNames3, wrapperClassName, addonBefore || addonAfter), (0, _defineProperty2["default"])(_classNames3, "".concat(wrapperClassName, "-rtl"), direction === 'rtl'), _classNames3)); var mergedGroupClassName = (0, _classnames["default"])("".concat(prefixCls, "-group-wrapper"), (_classNames4 = {}, (0, _defineProperty2["default"])(_classNames4, "".concat(prefixCls, "-group-wrapper-sm"), size === 'small'), (0, _defineProperty2["default"])(_classNames4, "".concat(prefixCls, "-group-wrapper-lg"), size === 'large'), (0, _defineProperty2["default"])(_classNames4, "".concat(prefixCls, "-group-wrapper-rtl"), direction === 'rtl'), _classNames4), className); // Need another wrapper for changing display:table to display:inline-block // and put style prop in wrapper return /*#__PURE__*/React.createElement("span", { className: mergedGroupClassName, style: style }, /*#__PURE__*/React.createElement("span", { className: mergedWrapperClassName }, addonBeforeNode, (0, _reactNode.cloneElement)(labeledElement, { style: null }), addonAfterNode)); } }, { key: "renderTextAreaWithClearIcon", value: function renderTextAreaWithClearIcon(prefixCls, element) { var _classNames5; var _this$props5 = this.props, value = _this$props5.value, allowClear = _this$props5.allowClear, className = _this$props5.className, style = _this$props5.style, direction = _this$props5.direction, bordered = _this$props5.bordered; if (!allowClear) { return (0, _reactNode.cloneElement)(element, { value: value }); } var affixWrapperCls = (0, _classnames["default"])("".concat(prefixCls, "-affix-wrapper"), "".concat(prefixCls, "-affix-wrapper-textarea-with-clear-btn"), (_classNames5 = {}, (0, _defineProperty2["default"])(_classNames5, "".concat(prefixCls, "-affix-wrapper-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames5, "".concat(prefixCls, "-affix-wrapper-borderless"), !bordered), _classNames5), className); return /*#__PURE__*/React.createElement("span", { className: affixWrapperCls, style: style }, (0, _reactNode.cloneElement)(element, { style: null, value: value }), this.renderClearIcon(prefixCls)); } }, { key: "render", value: function render() { var _this$props6 = this.props, prefixCls = _this$props6.prefixCls, inputType = _this$props6.inputType, element = _this$props6.element; if (inputType === ClearableInputType[0]) { return this.renderTextAreaWithClearIcon(prefixCls, element); } return this.renderInputWithLabel(prefixCls, this.renderLabeledIcon(prefixCls, element)); } }]); return ClearableLabeledInput; }(React.Component); var _default = ClearableLabeledInput; exports["default"] = _default; },{"../_util/reactNode":223,"../_util/type":230,"./Input":321,"@ant-design/icons/CloseCircleFilled":69,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],320:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var Group = function Group(props) { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref) { var _classNames; var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? '' : _props$className; var prefixCls = getPrefixCls('input-group', customizePrefixCls); var cls = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-lg"), props.size === 'large'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-sm"), props.size === 'small'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-compact"), props.compact), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement("span", { className: cls, style: props.style, onMouseEnter: props.onMouseEnter, onMouseLeave: props.onMouseLeave, onFocus: props.onFocus, onBlur: props.onBlur }, props.children); }); }; var _default = Group; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],321:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.fixControlledValue = fixControlledValue; exports.resolveOnChange = resolveOnChange; exports.getInputClassName = getInputClassName; exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _ClearableLabeledInput = _interopRequireWildcard(require("./ClearableLabeledInput")); var _configProvider = require("../config-provider"); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); function fixControlledValue(value) { if (typeof value === 'undefined' || value === null) { return ''; } return value; } function resolveOnChange(target, e, onChange) { if (onChange) { var event = e; if (e.type === 'click') { // click clear icon event = Object.create(e); event.target = target; event.currentTarget = target; var originalInputValue = target.value; // change target ref value cause e.target.value should be '' when clear input target.value = ''; onChange(event); // reset target ref value target.value = originalInputValue; return; } onChange(event); } } function getInputClassName(prefixCls, bordered, size, disabled, direction) { var _classNames; return (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-sm"), size === 'small'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-lg"), size === 'large'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _classNames)); } var Input = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Input, _React$Component); var _super = (0, _createSuper2["default"])(Input); function Input(props) { var _this; (0, _classCallCheck2["default"])(this, Input); _this = _super.call(this, props); _this.direction = 'ltr'; _this.focus = function () { _this.input.focus(); }; _this.saveClearableInput = function (input) { _this.clearableInput = input; }; _this.saveInput = function (input) { _this.input = input; }; _this.onFocus = function (e) { var onFocus = _this.props.onFocus; _this.setState({ focused: true }, _this.clearPasswordValueAttribute); if (onFocus) { onFocus(e); } }; _this.onBlur = function (e) { var onBlur = _this.props.onBlur; _this.setState({ focused: false }, _this.clearPasswordValueAttribute); if (onBlur) { onBlur(e); } }; _this.handleReset = function (e) { _this.setValue('', function () { _this.focus(); }); resolveOnChange(_this.input, e, _this.props.onChange); }; _this.renderInput = function (prefixCls, size, bordered) { var input = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var _this$props = _this.props, className = _this$props.className, addonBefore = _this$props.addonBefore, addonAfter = _this$props.addonAfter, customizeSize = _this$props.size, disabled = _this$props.disabled; // Fix https://fb.me/react-unknown-prop var otherProps = (0, _omit["default"])(_this.props, ['prefixCls', 'onPressEnter', 'addonBefore', 'addonAfter', 'prefix', 'suffix', 'allowClear', // Input elements must be either controlled or uncontrolled, // specify either the value prop, or the defaultValue prop, but not both. 'defaultValue', 'size', 'inputType', 'bordered']); return /*#__PURE__*/React.createElement("input", (0, _extends2["default"])({ autoComplete: input.autoComplete }, otherProps, { onChange: _this.handleChange, onFocus: _this.onFocus, onBlur: _this.onBlur, onKeyDown: _this.handleKeyDown, className: (0, _classnames["default"])(getInputClassName(prefixCls, bordered, customizeSize || size, disabled, _this.direction), (0, _defineProperty2["default"])({}, className, className && !addonBefore && !addonAfter)), ref: _this.saveInput })); }; _this.clearPasswordValueAttribute = function () { // https://github.com/ant-design/ant-design/issues/20541 _this.removePasswordTimeout = setTimeout(function () { if (_this.input && _this.input.getAttribute('type') === 'password' && _this.input.hasAttribute('value')) { _this.input.removeAttribute('value'); } }); }; _this.handleChange = function (e) { _this.setValue(e.target.value, _this.clearPasswordValueAttribute); resolveOnChange(_this.input, e, _this.props.onChange); }; _this.handleKeyDown = function (e) { var _this$props2 = _this.props, onPressEnter = _this$props2.onPressEnter, onKeyDown = _this$props2.onKeyDown; if (e.keyCode === 13 && onPressEnter) { onPressEnter(e); } if (onKeyDown) { onKeyDown(e); } }; _this.renderComponent = function (_ref) { var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction, input = _ref.input; var _this$state = _this.state, value = _this$state.value, focused = _this$state.focused; var _this$props3 = _this.props, customizePrefixCls = _this$props3.prefixCls, _this$props3$bordered = _this$props3.bordered, bordered = _this$props3$bordered === void 0 ? true : _this$props3$bordered; var prefixCls = getPrefixCls('input', customizePrefixCls); _this.direction = direction; return /*#__PURE__*/React.createElement(_SizeContext["default"].Consumer, null, function (size) { return /*#__PURE__*/React.createElement(_ClearableLabeledInput["default"], (0, _extends2["default"])({ size: size }, _this.props, { prefixCls: prefixCls, inputType: "input", value: fixControlledValue(value), element: _this.renderInput(prefixCls, size, bordered, input), handleReset: _this.handleReset, ref: _this.saveClearableInput, direction: direction, focused: focused, triggerFocus: _this.focus, bordered: bordered })); }); }; var value = typeof props.value === 'undefined' ? props.defaultValue : props.value; _this.state = { value: value, focused: false, // eslint-disable-next-line react/no-unused-state prevValue: props.value }; return _this; } (0, _createClass2["default"])(Input, [{ key: "componentDidMount", value: function componentDidMount() { this.clearPasswordValueAttribute(); } // Since polyfill `getSnapshotBeforeUpdate` need work with `componentDidUpdate`. // We keep an empty function here. }, { key: "componentDidUpdate", value: function componentDidUpdate() {} }, { key: "getSnapshotBeforeUpdate", value: function getSnapshotBeforeUpdate(prevProps) { if ((0, _ClearableLabeledInput.hasPrefixSuffix)(prevProps) !== (0, _ClearableLabeledInput.hasPrefixSuffix)(this.props)) { (0, _devWarning["default"])(this.input !== document.activeElement, 'Input', "When Input is focused, dynamic add or remove prefix / suffix will make it lose focus caused by dom structure change. Read more: https://ant.design/components/input/#FAQ"); } return null; } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.removePasswordTimeout) { clearTimeout(this.removePasswordTimeout); } } }, { key: "blur", value: function blur() { this.input.blur(); } }, { key: "select", value: function select() { this.input.select(); } }, { key: "setValue", value: function setValue(value, callback) { if (this.props.value === undefined) { this.setState({ value: value }, callback); } } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderComponent); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, _ref2) { var prevValue = _ref2.prevValue; var newState = { prevValue: nextProps.value }; if (nextProps.value !== undefined || prevValue !== nextProps.value) { newState.value = nextProps.value; } return newState; } }]); return Input; }(React.Component); Input.defaultProps = { type: 'text' }; var _default = Input; exports["default"] = _default; },{"../_util/devWarning":212,"../config-provider":278,"../config-provider/SizeContext":276,"./ClearableLabeledInput":319,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"react":"react"}],322:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _EyeOutlined = _interopRequireDefault(require("@ant-design/icons/EyeOutlined")); var _EyeInvisibleOutlined = _interopRequireDefault(require("@ant-design/icons/EyeInvisibleOutlined")); var _configProvider = require("../config-provider"); var _Input = _interopRequireDefault(require("./Input")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var ActionMap = { click: 'onClick', hover: 'onMouseOver' }; var Password = /*#__PURE__*/React.forwardRef(function (props, ref) { var _useState = (0, React.useState)(false), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), visible = _useState2[0], setVisible = _useState2[1]; var onVisibleChange = function onVisibleChange() { var disabled = props.disabled; if (disabled) { return; } setVisible(!visible); }; var getIcon = function getIcon(prefixCls) { var _iconProps; var action = props.action, _props$iconRender = props.iconRender, iconRender = _props$iconRender === void 0 ? function () { return null; } : _props$iconRender; var iconTrigger = ActionMap[action] || ''; var icon = iconRender(visible); var iconProps = (_iconProps = {}, (0, _defineProperty2["default"])(_iconProps, iconTrigger, onVisibleChange), (0, _defineProperty2["default"])(_iconProps, "className", "".concat(prefixCls, "-icon")), (0, _defineProperty2["default"])(_iconProps, "key", 'passwordIcon'), (0, _defineProperty2["default"])(_iconProps, "onMouseDown", function onMouseDown(e) { // Prevent focused state lost // https://github.com/ant-design/ant-design/issues/15173 e.preventDefault(); }), (0, _defineProperty2["default"])(_iconProps, "onMouseUp", function onMouseUp(e) { // Prevent caret position change // https://github.com/ant-design/ant-design/issues/23524 e.preventDefault(); }), _iconProps); return /*#__PURE__*/React.cloneElement( /*#__PURE__*/React.isValidElement(icon) ? icon : /*#__PURE__*/React.createElement("span", null, icon), iconProps); }; var renderPassword = function renderPassword(_ref) { var getPrefixCls = _ref.getPrefixCls; var className = props.className, customizePrefixCls = props.prefixCls, customizeInputPrefixCls = props.inputPrefixCls, size = props.size, visibilityToggle = props.visibilityToggle, restProps = __rest(props, ["className", "prefixCls", "inputPrefixCls", "size", "visibilityToggle"]); var inputPrefixCls = getPrefixCls('input', customizeInputPrefixCls); var prefixCls = getPrefixCls('input-password', customizePrefixCls); var suffixIcon = visibilityToggle && getIcon(prefixCls); var inputClassName = (0, _classnames["default"])(prefixCls, className, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-").concat(size), !!size)); var omittedProps = (0, _extends2["default"])((0, _extends2["default"])({}, (0, _omit["default"])(restProps, ['suffix', 'iconRender'])), { type: visible ? 'text' : 'password', className: inputClassName, prefixCls: inputPrefixCls, suffix: suffixIcon }); if (size) { omittedProps.size = size; } return /*#__PURE__*/React.createElement(_Input["default"], (0, _extends2["default"])({ ref: ref }, omittedProps)); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderPassword); }); Password.defaultProps = { action: 'click', visibilityToggle: true, iconRender: function iconRender(visible) { return visible ? /*#__PURE__*/React.createElement(_EyeOutlined["default"], null) : /*#__PURE__*/React.createElement(_EyeInvisibleOutlined["default"], null); } }; Password.displayName = 'Password'; var _default = Password; exports["default"] = _default; },{"../config-provider":278,"./Input":321,"@ant-design/icons/EyeInvisibleOutlined":83,"@ant-design/icons/EyeOutlined":84,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"omit.js":579,"react":"react"}],323:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _ref2 = require("rc-util/lib/ref"); var _SearchOutlined = _interopRequireDefault(require("@ant-design/icons/SearchOutlined")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons/LoadingOutlined")); var _Input = _interopRequireDefault(require("./Input")); var _button = _interopRequireDefault(require("../button")); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var _configProvider = require("../config-provider"); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Search = /*#__PURE__*/React.forwardRef(function (props, ref) { var inputRef = React.useRef(null); var onChange = function onChange(e) { var customOnChange = props.onChange, customOnSearch = props.onSearch; if (e && e.target && e.type === 'click' && customOnSearch) { customOnSearch(e.target.value, e); } if (customOnChange) { customOnChange(e); } }; var onMouseDown = function onMouseDown(e) { var _a; if (document.activeElement === ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input)) { e.preventDefault(); } }; var onSearch = function onSearch(e) { var _a; var customOnSearch = props.onSearch, loading = props.loading, disabled = props.disabled; if (loading || disabled) { return; } if (customOnSearch) { customOnSearch((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input.value, e); } }; var renderLoading = function renderLoading(prefixCls) { var enterButton = props.enterButton, customizeSize = props.size; if (enterButton) { return /*#__PURE__*/React.createElement(_SizeContext["default"].Consumer, { key: "enterButton" }, function (size) { return /*#__PURE__*/React.createElement(_button["default"], { className: "".concat(prefixCls, "-button"), type: "primary", size: customizeSize || size }, /*#__PURE__*/React.createElement(_LoadingOutlined["default"], null)); }); } return /*#__PURE__*/React.createElement(_LoadingOutlined["default"], { className: "".concat(prefixCls, "-icon"), key: "loadingIcon" }); }; var renderSuffix = function renderSuffix(prefixCls) { var suffix = props.suffix, enterButton = props.enterButton, loading = props.loading; if (loading && !enterButton) { return [suffix, renderLoading(prefixCls)]; } if (enterButton) return suffix; var icon = /*#__PURE__*/React.createElement(_SearchOutlined["default"], { className: "".concat(prefixCls, "-icon"), key: "searchIcon", onClick: onSearch }); if (suffix) { return [(0, _reactNode.replaceElement)(suffix, null, { key: 'suffix' }), icon]; } return icon; }; var renderAddonAfter = function renderAddonAfter(prefixCls, size) { var enterButton = props.enterButton, disabled = props.disabled, addonAfter = props.addonAfter, loading = props.loading; var btnClassName = "".concat(prefixCls, "-button"); if (loading && enterButton) { return [renderLoading(prefixCls), addonAfter]; } if (!enterButton) return addonAfter; var button; var enterButtonAsElement = enterButton; var isAntdButton = enterButtonAsElement.type && enterButtonAsElement.type.__ANT_BUTTON === true; if (isAntdButton || enterButtonAsElement.type === 'button') { button = (0, _reactNode.cloneElement)(enterButtonAsElement, (0, _extends2["default"])({ onMouseDown: onMouseDown, onClick: onSearch, key: 'enterButton' }, isAntdButton ? { className: btnClassName, size: size } : {})); } else { button = /*#__PURE__*/React.createElement(_button["default"], { className: btnClassName, type: "primary", size: size, disabled: disabled, key: "enterButton", onMouseDown: onMouseDown, onClick: onSearch }, enterButton === true ? /*#__PURE__*/React.createElement(_SearchOutlined["default"], null) : enterButton); } if (addonAfter) { return [button, (0, _reactNode.replaceElement)(addonAfter, null, { key: 'addonAfter' })]; } return button; }; var renderSearch = function renderSearch(_ref) { var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var customizePrefixCls = props.prefixCls, customizeInputPrefixCls = props.inputPrefixCls, enterButton = props.enterButton, className = props.className, customizeSize = props.size, restProps = __rest(props, ["prefixCls", "inputPrefixCls", "enterButton", "className", "size"]); delete restProps.onSearch; delete restProps.loading; var prefixCls = getPrefixCls('input-search', customizePrefixCls); var inputPrefixCls = getPrefixCls('input', customizeInputPrefixCls); var getClassName = function getClassName(size) { var inputClassName; if (enterButton) { var _classNames; inputClassName = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-enter-button"), !!enterButton), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(size), !!size), _classNames), className); } else { inputClassName = (0, _classnames["default"])(prefixCls, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); } return inputClassName; }; return /*#__PURE__*/React.createElement(_SizeContext["default"].Consumer, null, function (size) { return /*#__PURE__*/React.createElement(_Input["default"], (0, _extends2["default"])({ ref: (0, _ref2.composeRef)(inputRef, ref), onPressEnter: onSearch }, restProps, { size: customizeSize || size, prefixCls: inputPrefixCls, addonAfter: renderAddonAfter(prefixCls, customizeSize || size), suffix: renderSuffix(prefixCls), onChange: onChange, className: getClassName(customizeSize || size) })); }); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderSearch); }); Search.defaultProps = { enterButton: false }; Search.displayName = 'Search'; var _default = Search; exports["default"] = _default; },{"../_util/reactNode":223,"../button":257,"../config-provider":278,"../config-provider/SizeContext":276,"./Input":321,"@ant-design/icons/LoadingOutlined":93,"@ant-design/icons/SearchOutlined":103,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-util/lib/ref":874,"react":"react"}],324:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _rcTextarea = _interopRequireDefault(require("rc-textarea")); var _omit = _interopRequireDefault(require("omit.js")); var _classnames = _interopRequireDefault(require("classnames")); var _ClearableLabeledInput = _interopRequireDefault(require("./ClearableLabeledInput")); var _configProvider = require("../config-provider"); var _Input = require("./Input"); var TextArea = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(TextArea, _React$Component); var _super = (0, _createSuper2["default"])(TextArea); function TextArea(props) { var _this; (0, _classCallCheck2["default"])(this, TextArea); _this = _super.call(this, props); _this.focus = function () { _this.resizableTextArea.textArea.focus(); }; _this.saveTextArea = function (textarea) { _this.resizableTextArea = textarea === null || textarea === void 0 ? void 0 : textarea.resizableTextArea; }; _this.saveClearableInput = function (clearableInput) { _this.clearableInput = clearableInput; }; _this.handleChange = function (e) { _this.setValue(e.target.value); (0, _Input.resolveOnChange)(_this.resizableTextArea.textArea, e, _this.props.onChange); }; _this.handleReset = function (e) { _this.setValue('', function () { _this.focus(); }); (0, _Input.resolveOnChange)(_this.resizableTextArea.textArea, e, _this.props.onChange); }; _this.renderTextArea = function (prefixCls, bordered) { return /*#__PURE__*/React.createElement(_rcTextarea["default"], (0, _extends2["default"])({}, (0, _omit["default"])(_this.props, ['allowClear', 'bordered']), { className: (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(prefixCls, "-borderless"), !bordered), _this.props.className), prefixCls: prefixCls, onChange: _this.handleChange, ref: _this.saveTextArea })); }; _this.renderComponent = function (_ref) { var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var value = _this.state.value; var _this$props = _this.props, customizePrefixCls = _this$props.prefixCls, _this$props$bordered = _this$props.bordered, bordered = _this$props$bordered === void 0 ? true : _this$props$bordered; var prefixCls = getPrefixCls('input', customizePrefixCls); return /*#__PURE__*/React.createElement(_ClearableLabeledInput["default"], (0, _extends2["default"])({}, _this.props, { prefixCls: prefixCls, direction: direction, inputType: "text", value: (0, _Input.fixControlledValue)(value), element: _this.renderTextArea(prefixCls, bordered), handleReset: _this.handleReset, ref: _this.saveClearableInput, triggerFocus: _this.focus, bordered: bordered })); }; var value = typeof props.value === 'undefined' ? props.defaultValue : props.value; _this.state = { value: value, // eslint-disable-next-line react/no-unused-state prevValue: props.value }; return _this; } (0, _createClass2["default"])(TextArea, [{ key: "setValue", value: function setValue(value, callback) { if (this.props.value === undefined) { this.setState({ value: value }, callback); } } }, { key: "blur", value: function blur() { this.resizableTextArea.textArea.blur(); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderComponent); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, _ref2) { var prevValue = _ref2.prevValue; var newState = { prevValue: nextProps.value }; if (nextProps.value !== undefined || prevValue !== nextProps.value) { newState.value = nextProps.value; } return newState; } }]); return TextArea; }(React.Component); var _default = TextArea; exports["default"] = _default; },{"../config-provider":278,"./ClearableLabeledInput":319,"./Input":321,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"rc-textarea":813,"react":"react"}],325:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Input = _interopRequireDefault(require("./Input")); var _Group = _interopRequireDefault(require("./Group")); var _Search = _interopRequireDefault(require("./Search")); var _TextArea = _interopRequireDefault(require("./TextArea")); var _Password = _interopRequireDefault(require("./Password")); _Input["default"].Group = _Group["default"]; _Input["default"].Search = _Search["default"]; _Input["default"].TextArea = _TextArea["default"]; _Input["default"].Password = _Password["default"]; var _default = _Input["default"]; exports["default"] = _default; },{"./Group":320,"./Input":321,"./Password":322,"./Search":323,"./TextArea":324,"@babel/runtime/helpers/interopRequireDefault":192}],326:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.SiderContext = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _BarsOutlined = _interopRequireDefault(require("@ant-design/icons/BarsOutlined")); var _RightOutlined = _interopRequireDefault(require("@ant-design/icons/RightOutlined")); var _LeftOutlined = _interopRequireDefault(require("@ant-design/icons/LeftOutlined")); var _layout = require("./layout"); var _configProvider = require("../config-provider"); var _isNumeric = _interopRequireDefault(require("../_util/isNumeric")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var dimensionMaxMap = { xs: '479.98px', sm: '575.98px', md: '767.98px', lg: '991.98px', xl: '1199.98px', xxl: '1599.98px' }; var SiderContext = /*#__PURE__*/React.createContext({}); exports.SiderContext = SiderContext; var generateId = function () { var i = 0; return function () { var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; i += 1; return "".concat(prefix).concat(i); }; }(); var InternalSider = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(InternalSider, _React$Component); var _super = (0, _createSuper2["default"])(InternalSider); function InternalSider(props) { var _this; (0, _classCallCheck2["default"])(this, InternalSider); _this = _super.call(this, props); _this.responsiveHandler = function (mql) { _this.setState({ below: mql.matches }); var onBreakpoint = _this.props.onBreakpoint; var collapsed = _this.state.collapsed; if (onBreakpoint) { onBreakpoint(mql.matches); } if (collapsed !== mql.matches) { _this.setCollapsed(mql.matches, 'responsive'); } }; _this.setCollapsed = function (collapsed, type) { if (!('collapsed' in _this.props)) { _this.setState({ collapsed: collapsed }); } var onCollapse = _this.props.onCollapse; if (onCollapse) { onCollapse(collapsed, type); } }; _this.toggle = function () { var collapsed = !_this.state.collapsed; _this.setCollapsed(collapsed, 'clickTrigger'); }; _this.renderSider = function (_ref) { var _classNames; var getPrefixCls = _ref.getPrefixCls; var _a = _this.props, customizePrefixCls = _a.prefixCls, className = _a.className, theme = _a.theme, collapsible = _a.collapsible, reverseArrow = _a.reverseArrow, trigger = _a.trigger, style = _a.style, width = _a.width, collapsedWidth = _a.collapsedWidth, zeroWidthTriggerStyle = _a.zeroWidthTriggerStyle, children = _a.children, others = __rest(_a, ["prefixCls", "className", "theme", "collapsible", "reverseArrow", "trigger", "style", "width", "collapsedWidth", "zeroWidthTriggerStyle", "children"]); var _this$state = _this.state, collapsed = _this$state.collapsed, below = _this$state.below; var prefixCls = getPrefixCls('layout-sider', customizePrefixCls); var divProps = (0, _omit["default"])(others, ['collapsed', 'defaultCollapsed', 'onCollapse', 'breakpoint', 'onBreakpoint', 'siderHook', 'zeroWidthTriggerStyle']); var rawWidth = collapsed ? collapsedWidth : width; // use "px" as fallback unit for width var siderWidth = (0, _isNumeric["default"])(rawWidth) ? "".concat(rawWidth, "px") : String(rawWidth); // special trigger when collapsedWidth == 0 var zeroWidthTrigger = parseFloat(String(collapsedWidth || 0)) === 0 ? /*#__PURE__*/React.createElement("span", { onClick: _this.toggle, className: (0, _classnames["default"])("".concat(prefixCls, "-zero-width-trigger"), "".concat(prefixCls, "-zero-width-trigger-").concat(reverseArrow ? 'right' : 'left')), style: zeroWidthTriggerStyle }, trigger || /*#__PURE__*/React.createElement(_BarsOutlined["default"], null)) : null; var iconObj = { expanded: reverseArrow ? /*#__PURE__*/React.createElement(_RightOutlined["default"], null) : /*#__PURE__*/React.createElement(_LeftOutlined["default"], null), collapsed: reverseArrow ? /*#__PURE__*/React.createElement(_LeftOutlined["default"], null) : /*#__PURE__*/React.createElement(_RightOutlined["default"], null) }; var status = collapsed ? 'collapsed' : 'expanded'; var defaultTrigger = iconObj[status]; var triggerDom = trigger !== null ? zeroWidthTrigger || /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-trigger"), onClick: _this.toggle, style: { width: siderWidth } }, trigger || defaultTrigger) : null; var divStyle = (0, _extends2["default"])((0, _extends2["default"])({}, style), { flex: "0 0 ".concat(siderWidth), maxWidth: siderWidth, minWidth: siderWidth, width: siderWidth }); var siderCls = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-").concat(theme), (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-collapsed"), !!collapsed), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-has-trigger"), collapsible && trigger !== null && !zeroWidthTrigger), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-below"), !!below), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-zero-width"), parseFloat(siderWidth) === 0), _classNames), className); return /*#__PURE__*/React.createElement("aside", (0, _extends2["default"])({ className: siderCls }, divProps, { style: divStyle }), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-children") }, children), collapsible || below && zeroWidthTrigger ? triggerDom : null); }; _this.uniqueId = generateId('ant-sider-'); var matchMedia; if (typeof window !== 'undefined') { matchMedia = window.matchMedia; } if (matchMedia && props.breakpoint && props.breakpoint in dimensionMaxMap) { _this.mql = matchMedia("(max-width: ".concat(dimensionMaxMap[props.breakpoint], ")")); } var collapsed; if ('collapsed' in props) { collapsed = props.collapsed; } else { collapsed = props.defaultCollapsed; } _this.state = { collapsed: collapsed, below: false }; return _this; } (0, _createClass2["default"])(InternalSider, [{ key: "componentDidMount", value: function componentDidMount() { var _a; if (this.mql) { this.mql.addListener(this.responsiveHandler); this.responsiveHandler(this.mql); } (_a = this.props) === null || _a === void 0 ? void 0 : _a.siderHook.addSider(this.uniqueId); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _a, _b; (_a = this === null || this === void 0 ? void 0 : this.mql) === null || _a === void 0 ? void 0 : _a.removeListener(this.responsiveHandler); (_b = this.props) === null || _b === void 0 ? void 0 : _b.siderHook.removeSider(this.uniqueId); } }, { key: "render", value: function render() { var collapsed = this.state.collapsed; var collapsedWidth = this.props.collapsedWidth; return /*#__PURE__*/React.createElement(SiderContext.Provider, { value: { siderCollapsed: collapsed, collapsedWidth: collapsedWidth } }, /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderSider)); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps) { if ('collapsed' in nextProps) { return { collapsed: nextProps.collapsed }; } return null; } }]); return InternalSider; }(React.Component); InternalSider.defaultProps = { collapsible: false, defaultCollapsed: false, reverseArrow: false, width: 200, collapsedWidth: 80, style: {}, theme: 'dark' }; // eslint-disable-next-line react/prefer-stateless-function var Sider = /*#__PURE__*/function (_React$Component2) { (0, _inherits2["default"])(Sider, _React$Component2); var _super2 = (0, _createSuper2["default"])(Sider); function Sider() { (0, _classCallCheck2["default"])(this, Sider); return _super2.apply(this, arguments); } (0, _createClass2["default"])(Sider, [{ key: "render", value: function render() { var _this2 = this; return /*#__PURE__*/React.createElement(_layout.LayoutContext.Consumer, null, function (context) { return /*#__PURE__*/React.createElement(InternalSider, (0, _extends2["default"])({}, context, _this2.props)); }); } }]); return Sider; }(React.Component); exports["default"] = Sider; },{"../_util/isNumeric":220,"../config-provider":278,"./layout":328,"@ant-design/icons/BarsOutlined":60,"@ant-design/icons/LeftOutlined":92,"@ant-design/icons/RightOutlined":100,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"react":"react"}],327:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _layout = _interopRequireDefault(require("./layout")); var _Sider = _interopRequireDefault(require("./Sider")); _layout["default"].Sider = _Sider["default"]; var _default = _layout["default"]; exports["default"] = _default; },{"./Sider":326,"./layout":328,"@babel/runtime/helpers/interopRequireDefault":192}],328:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.LayoutContext = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var LayoutContext = /*#__PURE__*/React.createContext({ siderHook: { addSider: function addSider() { return null; }, removeSider: function removeSider() { return null; } } }); exports.LayoutContext = LayoutContext; function generator(_ref) { var suffixCls = _ref.suffixCls, tagName = _ref.tagName, displayName = _ref.displayName; return function (BasicComponent) { var _a; return _a = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Adapter, _React$Component); var _super = (0, _createSuper2["default"])(Adapter); function Adapter() { var _this; (0, _classCallCheck2["default"])(this, Adapter); _this = _super.apply(this, arguments); _this.renderComponent = function (_ref2) { var getPrefixCls = _ref2.getPrefixCls; var customizePrefixCls = _this.props.prefixCls; var prefixCls = getPrefixCls(suffixCls, customizePrefixCls); return /*#__PURE__*/React.createElement(BasicComponent, (0, _extends2["default"])({ prefixCls: prefixCls, tagName: tagName }, _this.props)); }; return _this; } (0, _createClass2["default"])(Adapter, [{ key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderComponent); } }]); return Adapter; }(React.Component), _a.displayName = displayName, _a; }; } var Basic = function Basic(props) { var prefixCls = props.prefixCls, className = props.className, children = props.children, tagName = props.tagName, others = __rest(props, ["prefixCls", "className", "children", "tagName"]); var classString = (0, _classnames["default"])(prefixCls, className); return /*#__PURE__*/React.createElement(tagName, (0, _extends2["default"])({ className: classString }, others), children); }; var BasicLayout = /*#__PURE__*/function (_React$Component2) { (0, _inherits2["default"])(BasicLayout, _React$Component2); var _super2 = (0, _createSuper2["default"])(BasicLayout); function BasicLayout() { var _this2; (0, _classCallCheck2["default"])(this, BasicLayout); _this2 = _super2.apply(this, arguments); _this2.state = { siders: [] }; _this2.renderComponent = function (_ref3) { var _classNames; var direction = _ref3.direction; var _a = _this2.props, prefixCls = _a.prefixCls, className = _a.className, children = _a.children, hasSider = _a.hasSider, Tag = _a.tagName, others = __rest(_a, ["prefixCls", "className", "children", "hasSider", "tagName"]); var classString = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-has-sider"), typeof hasSider === 'boolean' ? hasSider : _this2.state.siders.length > 0), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement(LayoutContext.Provider, { value: { siderHook: _this2.getSiderHook() } }, /*#__PURE__*/React.createElement(Tag, (0, _extends2["default"])({ className: classString }, others), children)); }; return _this2; } (0, _createClass2["default"])(BasicLayout, [{ key: "getSiderHook", value: function getSiderHook() { var _this3 = this; return { addSider: function addSider(id) { _this3.setState(function (state) { return { siders: [].concat((0, _toConsumableArray2["default"])(state.siders), [id]) }; }); }, removeSider: function removeSider(id) { _this3.setState(function (state) { return { siders: state.siders.filter(function (currentId) { return currentId !== id; }) }; }); } }; } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderComponent); } }]); return BasicLayout; }(React.Component); var Layout = generator({ suffixCls: 'layout', tagName: 'section', displayName: 'Layout' })(BasicLayout); var Header = generator({ suffixCls: 'layout-header', tagName: 'header', displayName: 'Header' })(Basic); var Footer = generator({ suffixCls: 'layout-footer', tagName: 'footer', displayName: 'Footer' })(Basic); var Content = generator({ suffixCls: 'layout-content', tagName: 'main', displayName: 'Content' })(Basic); Layout.Header = Header; Layout.Footer = Footer; Layout.Content = Content; var _default = Layout; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"react":"react"}],329:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.Meta = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _index = require("./index"); var _grid = require("../grid"); var _configProvider = require("../config-provider"); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Meta = function Meta(_a) { var customizePrefixCls = _a.prefixCls, className = _a.className, avatar = _a.avatar, title = _a.title, description = _a.description, others = __rest(_a, ["prefixCls", "className", "avatar", "title", "description"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('list', customizePrefixCls); var classString = (0, _classnames["default"])("".concat(prefixCls, "-item-meta"), className); var content = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-meta-content") }, title && /*#__PURE__*/React.createElement("h4", { className: "".concat(prefixCls, "-item-meta-title") }, title), description && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-meta-description") }, description)); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, others, { className: classString }), avatar && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-meta-avatar") }, avatar), (title || description) && content); }; exports.Meta = Meta; var Item = function Item(_a) { var customizePrefixCls = _a.prefixCls, children = _a.children, actions = _a.actions, extra = _a.extra, className = _a.className, colStyle = _a.colStyle, others = __rest(_a, ["prefixCls", "children", "actions", "extra", "className", "colStyle"]); var _React$useContext2 = React.useContext(_index.ListContext), grid = _React$useContext2.grid, itemLayout = _React$useContext2.itemLayout; var _React$useContext3 = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext3.getPrefixCls; var isItemContainsTextNodeAndNotSingular = function isItemContainsTextNodeAndNotSingular() { var result; React.Children.forEach(children, function (element) { if (typeof element === 'string') { result = true; } }); return result && React.Children.count(children) > 1; }; var isFlexMode = function isFlexMode() { if (itemLayout === 'vertical') { return !!extra; } return !isItemContainsTextNodeAndNotSingular(); }; var prefixCls = getPrefixCls('list', customizePrefixCls); var actionsContent = actions && actions.length > 0 && /*#__PURE__*/React.createElement("ul", { className: "".concat(prefixCls, "-item-action"), key: "actions" }, actions.map(function (action, i) { return ( /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key React.createElement("li", { key: "".concat(prefixCls, "-item-action-").concat(i) }, action, i !== actions.length - 1 && /*#__PURE__*/React.createElement("em", { className: "".concat(prefixCls, "-item-action-split") })) ); })); var Element = grid ? 'div' : 'li'; var itemChildren = /*#__PURE__*/React.createElement(Element, (0, _extends2["default"])({}, others, { // `li` element `onCopy` prop args is not same as `div` className: (0, _classnames["default"])("".concat(prefixCls, "-item"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-item-no-flex"), !isFlexMode()), className) }), itemLayout === 'vertical' && extra ? [/*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-main"), key: "content" }, children, actionsContent), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-extra"), key: "extra" }, extra)] : [children, actionsContent, (0, _reactNode.cloneElement)(extra, { key: 'extra' })]); return grid ? /*#__PURE__*/React.createElement(_grid.Col, { flex: 1, style: colStyle }, itemChildren) : itemChildren; }; Item.Meta = Meta; var _default = Item; exports["default"] = _default; },{"../_util/reactNode":223,"../config-provider":278,"../grid":315,"./index":330,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],330:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.ListConsumer = exports.ListContext = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _spin = _interopRequireDefault(require("../spin")); var _useBreakpoint = _interopRequireDefault(require("../grid/hooks/useBreakpoint")); var _responsiveObserve = require("../_util/responsiveObserve"); var _configProvider = require("../config-provider"); var _pagination = _interopRequireDefault(require("../pagination")); var _grid = require("../grid"); var _Item = _interopRequireDefault(require("./Item")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var ListContext = /*#__PURE__*/React.createContext({}); exports.ListContext = ListContext; var ListConsumer = ListContext.Consumer; exports.ListConsumer = ListConsumer; function List(_a) { var _classNames; var _a$pagination = _a.pagination, pagination = _a$pagination === void 0 ? false : _a$pagination, customizePrefixCls = _a.prefixCls, _a$bordered = _a.bordered, bordered = _a$bordered === void 0 ? false : _a$bordered, _a$split = _a.split, split = _a$split === void 0 ? true : _a$split, className = _a.className, children = _a.children, itemLayout = _a.itemLayout, loadMore = _a.loadMore, grid = _a.grid, _a$dataSource = _a.dataSource, dataSource = _a$dataSource === void 0 ? [] : _a$dataSource, size = _a.size, header = _a.header, footer = _a.footer, _a$loading = _a.loading, loading = _a$loading === void 0 ? false : _a$loading, rowKey = _a.rowKey, renderItem = _a.renderItem, locale = _a.locale, rest = __rest(_a, ["pagination", "prefixCls", "bordered", "split", "className", "children", "itemLayout", "loadMore", "grid", "dataSource", "size", "header", "footer", "loading", "rowKey", "renderItem", "locale"]); var paginationObj = pagination && (0, _typeof2["default"])(pagination) === 'object' ? pagination : {}; var _React$useState = React.useState(paginationObj.defaultCurrent || 1), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), paginationCurrent = _React$useState2[0], setPaginationCurrent = _React$useState2[1]; var _React$useState3 = React.useState(paginationObj.defaultPageSize || 10), _React$useState4 = (0, _slicedToArray2["default"])(_React$useState3, 2), paginationSize = _React$useState4[0], setPaginationSize = _React$useState4[1]; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, renderEmpty = _React$useContext.renderEmpty, direction = _React$useContext.direction; var defaultPaginationProps = { current: 1, total: 0 }; var keys = {}; var triggerPaginationEvent = function triggerPaginationEvent(eventName) { return function (page, pageSize) { setPaginationCurrent(page); setPaginationSize(pageSize); if (pagination && pagination[eventName]) { pagination[eventName](page, pageSize); } }; }; var onPaginationChange = triggerPaginationEvent('onChange'); var onPaginationShowSizeChange = triggerPaginationEvent('onShowSizeChange'); var renderInnerItem = function renderInnerItem(item, index) { if (!renderItem) return null; var key; if (typeof rowKey === 'function') { key = rowKey(item); } else if (typeof rowKey === 'string') { key = item[rowKey]; } else { key = item.key; } if (!key) { key = "list-item-".concat(index); } keys[index] = key; return renderItem(item, index); }; var isSomethingAfterLastItem = function isSomethingAfterLastItem() { return !!(loadMore || pagination || footer); }; var renderEmptyFunc = function renderEmptyFunc(prefixCls, renderEmptyHandler) { return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-empty-text") }, locale && locale.emptyText || renderEmptyHandler('List')); }; var prefixCls = getPrefixCls('list', customizePrefixCls); var loadingProp = loading; if (typeof loadingProp === 'boolean') { loadingProp = { spinning: loadingProp }; } var isLoading = loadingProp && loadingProp.spinning; // large => lg // small => sm var sizeCls = ''; switch (size) { case 'large': sizeCls = 'lg'; break; case 'small': sizeCls = 'sm'; break; default: break; } var classString = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-vertical"), itemLayout === 'vertical'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(sizeCls), sizeCls), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-split"), split), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-bordered"), bordered), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-loading"), isLoading), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-grid"), grid), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-something-after-last-item"), isSomethingAfterLastItem()), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); var paginationProps = (0, _extends2["default"])((0, _extends2["default"])((0, _extends2["default"])({}, defaultPaginationProps), { total: dataSource.length, current: paginationCurrent, pageSize: paginationSize }), pagination || {}); var largestPage = Math.ceil(paginationProps.total / paginationProps.pageSize); if (paginationProps.current > largestPage) { paginationProps.current = largestPage; } var paginationContent = pagination ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-pagination") }, /*#__PURE__*/React.createElement(_pagination["default"], (0, _extends2["default"])({}, paginationProps, { onChange: onPaginationChange, onShowSizeChange: onPaginationShowSizeChange }))) : null; var splitDataSource = (0, _toConsumableArray2["default"])(dataSource); if (pagination) { if (dataSource.length > (paginationProps.current - 1) * paginationProps.pageSize) { splitDataSource = (0, _toConsumableArray2["default"])(dataSource).splice((paginationProps.current - 1) * paginationProps.pageSize, paginationProps.pageSize); } } var screens = (0, _useBreakpoint["default"])(); var currentBreakpoint = React.useMemo(function () { for (var i = 0; i < _responsiveObserve.responsiveArray.length; i += 1) { var breakpoint = _responsiveObserve.responsiveArray[i]; if (screens[breakpoint]) { return breakpoint; } } return undefined; }, [screens]); var colStyle = React.useMemo(function () { if (!grid) { return undefined; } var columnCount = currentBreakpoint && grid[currentBreakpoint] ? grid[currentBreakpoint] : grid.column; if (columnCount) { return { width: "".concat(100 / columnCount, "%"), maxWidth: "".concat(100 / columnCount, "%") }; } }, [grid === null || grid === void 0 ? void 0 : grid.column, currentBreakpoint]); var childrenContent = isLoading && /*#__PURE__*/React.createElement("div", { style: { minHeight: 53 } }); if (splitDataSource.length > 0) { var items = splitDataSource.map(function (item, index) { return renderInnerItem(item, index); }); var childrenList = React.Children.map(items, function (child, index) { return /*#__PURE__*/React.createElement("div", { key: keys[index], style: colStyle }, child); }); childrenContent = grid ? /*#__PURE__*/React.createElement(_grid.Row, { gutter: grid.gutter }, childrenList) : /*#__PURE__*/React.createElement("ul", { className: "".concat(prefixCls, "-items") }, items); } else if (!children && !isLoading) { childrenContent = renderEmptyFunc(prefixCls, renderEmpty); } var paginationPosition = paginationProps.position || 'bottom'; return /*#__PURE__*/React.createElement(ListContext.Provider, { value: { grid: grid, itemLayout: itemLayout } }, /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({ className: classString }, rest), (paginationPosition === 'top' || paginationPosition === 'both') && paginationContent, header && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-header") }, header), /*#__PURE__*/React.createElement(_spin["default"], loadingProp, childrenContent, children), footer && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-footer") }, footer), loadMore || (paginationPosition === 'bottom' || paginationPosition === 'both') && paginationContent)); } List.Item = _Item["default"]; var _default = List; exports["default"] = _default; },{"../_util/responsiveObserve":225,"../config-provider":278,"../grid":315,"../grid/hooks/useBreakpoint":314,"../pagination":357,"../spin":392,"./Item":329,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"classnames":455,"react":"react"}],331:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useLocaleReceiver = useLocaleReceiver; exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _default = _interopRequireDefault(require("./default")); var _context = _interopRequireDefault(require("./context")); var LocaleReceiver = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(LocaleReceiver, _React$Component); var _super = (0, _createSuper2["default"])(LocaleReceiver); function LocaleReceiver() { (0, _classCallCheck2["default"])(this, LocaleReceiver); return _super.apply(this, arguments); } (0, _createClass2["default"])(LocaleReceiver, [{ key: "getLocale", value: function getLocale() { var _this$props = this.props, componentName = _this$props.componentName, defaultLocale = _this$props.defaultLocale; var locale = defaultLocale || _default["default"][componentName || 'global']; var antLocale = this.context; var localeFromContext = componentName && antLocale ? antLocale[componentName] : {}; return (0, _extends2["default"])((0, _extends2["default"])({}, typeof locale === 'function' ? locale() : locale), localeFromContext || {}); } }, { key: "getLocaleCode", value: function getLocaleCode() { var antLocale = this.context; var localeCode = antLocale && antLocale.locale; // Had use LocaleProvide but didn't set locale if (antLocale && antLocale.exist && !localeCode) { return _default["default"].locale; } return localeCode; } }, { key: "render", value: function render() { return this.props.children(this.getLocale(), this.getLocaleCode(), this.context); } }]); return LocaleReceiver; }(React.Component); exports["default"] = LocaleReceiver; LocaleReceiver.defaultProps = { componentName: 'global' }; LocaleReceiver.contextType = _context["default"]; function useLocaleReceiver(componentName, defaultLocale) { var antLocale = React.useContext(_context["default"]); var componentLocale = React.useMemo(function () { var locale = defaultLocale || _default["default"][componentName || 'global']; var localeFromContext = componentName && antLocale ? antLocale[componentName] : {}; return (0, _extends2["default"])((0, _extends2["default"])({}, typeof locale === 'function' ? locale() : locale), localeFromContext || {}); }, [componentName, defaultLocale, antLocale]); return [componentLocale]; } },{"./context":332,"./default":333,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],332:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = require("react"); var LocaleContext = /*#__PURE__*/(0, _react.createContext)(undefined); var _default = LocaleContext; exports["default"] = _default; },{"react":"react"}],333:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _default2 = _interopRequireDefault(require("../locale/default")); var _default = _default2["default"]; exports["default"] = _default; },{"../locale/default":335,"@babel/runtime/helpers/interopRequireDefault":192}],334:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.ANT_MARK = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _locale = require("../modal/locale"); var _context = _interopRequireDefault(require("./context")); var ANT_MARK = 'internalMark'; exports.ANT_MARK = ANT_MARK; var LocaleProvider = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(LocaleProvider, _React$Component); var _super = (0, _createSuper2["default"])(LocaleProvider); function LocaleProvider(props) { var _this; (0, _classCallCheck2["default"])(this, LocaleProvider); _this = _super.call(this, props); (0, _locale.changeConfirmLocale)(props.locale && props.locale.Modal); (0, _devWarning["default"])(props._ANT_MARK__ === ANT_MARK, 'LocaleProvider', '`LocaleProvider` is deprecated. Please use `locale` with `ConfigProvider` instead: http://u.ant.design/locale'); return _this; } (0, _createClass2["default"])(LocaleProvider, [{ key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var locale = this.props.locale; if (prevProps.locale !== locale) { (0, _locale.changeConfirmLocale)(locale && locale.Modal); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { (0, _locale.changeConfirmLocale)(); } }, { key: "render", value: function render() { var _this$props = this.props, locale = _this$props.locale, children = _this$props.children; return /*#__PURE__*/React.createElement(_context["default"].Provider, { value: (0, _extends2["default"])((0, _extends2["default"])({}, locale), { exist: true }) }, children); } }]); return LocaleProvider; }(React.Component); exports["default"] = LocaleProvider; LocaleProvider.defaultProps = { locale: {} }; },{"../_util/devWarning":212,"../modal/locale":349,"./context":332,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],335:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _en_US = _interopRequireDefault(require("rc-pagination/lib/locale/en_US")); var _en_US2 = _interopRequireDefault(require("../date-picker/locale/en_US")); var _en_US3 = _interopRequireDefault(require("../time-picker/locale/en_US")); var _en_US4 = _interopRequireDefault(require("../calendar/locale/en_US")); /* eslint-disable no-template-curly-in-string */ var typeTemplate = '${label} is not a valid ${type}'; var localeValues = { locale: 'en', Pagination: _en_US["default"], DatePicker: _en_US2["default"], TimePicker: _en_US3["default"], Calendar: _en_US4["default"], global: { placeholder: 'Please select' }, Table: { filterTitle: 'Filter menu', filterConfirm: 'OK', filterReset: 'Reset', filterEmptyText: 'No filters', emptyText: 'No data', selectAll: 'Select current page', selectInvert: 'Invert current page', selectionAll: 'Select all data', sortTitle: 'Sort', expand: 'Expand row', collapse: 'Collapse row', triggerDesc: 'Click sort by descend', triggerAsc: 'Click sort by ascend', cancelSort: 'Click to cancel sort' }, Modal: { okText: 'OK', cancelText: 'Cancel', justOkText: 'OK' }, Popconfirm: { okText: 'OK', cancelText: 'Cancel' }, Transfer: { titles: ['', ''], searchPlaceholder: 'Search here', itemUnit: 'item', itemsUnit: 'items', remove: 'Remove', selectCurrent: 'Select current page', removeCurrent: 'Remove current page', selectAll: 'Select all data', removeAll: 'Remove all data', selectInvert: 'Invert current page' }, Upload: { uploading: 'Uploading...', removeFile: 'Remove file', uploadError: 'Upload error', previewFile: 'Preview file', downloadFile: 'Download file' }, Empty: { description: 'No Data' }, Icon: { icon: 'icon' }, Text: { edit: 'Edit', copy: 'Copy', copied: 'Copied', expand: 'Expand' }, PageHeader: { back: 'Back' }, Form: { optional: '(optional)', defaultValidateMessages: { "default": 'Field validation error ${label}', required: 'Please enter ${label}', "enum": '${label} must be one of [${enum}]', whitespace: '${label} cannot be a blank character', date: { format: '${label} date format is invalid', parse: '${label} cannot be converted to a date', invalid: '${label} is an invalid date' }, types: { string: typeTemplate, method: typeTemplate, array: typeTemplate, object: typeTemplate, number: typeTemplate, date: typeTemplate, "boolean": typeTemplate, integer: typeTemplate, "float": typeTemplate, regexp: typeTemplate, email: typeTemplate, url: typeTemplate, hex: typeTemplate }, string: { len: '${label} must be ${len} characters', min: '${label} at least ${min} characters', max: '${label} up to ${max} characters', range: '${label} must be between ${min}-${max} characters' }, number: { len: '${label} must be equal to ${len}', min: '${label} minimum value is ${min}', max: '${label} maximum value is ${max}', range: '${label} must be between ${min}-${max}' }, array: { len: 'Must be ${len} ${label}', min: 'At least ${min} ${label}', max: 'At most ${max} ${label}', range: 'The amount of ${label} must be between ${min}-${max}' }, pattern: { mismatch: '${label} does not match the pattern ${pattern}' } } } }; var _default = localeValues; exports["default"] = _default; },{"../calendar/locale/en_US":261,"../date-picker/locale/en_US":286,"../time-picker/locale/en_US":418,"@babel/runtime/helpers/interopRequireDefault":192,"rc-pagination/lib/locale/en_US":674}],336:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _default2 = _interopRequireDefault(require("./default")); var _default = _default2["default"]; exports["default"] = _default; },{"./default":335,"@babel/runtime/helpers/interopRequireDefault":192}],337:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.Option = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcMentions = _interopRequireDefault(require("rc-mentions")); var _spin = _interopRequireDefault(require("../spin")); var _configProvider = require("../config-provider"); var _ref2 = require("../_util/ref"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Option = _rcMentions["default"].Option; exports.Option = Option; function loadingFilterOption() { return true; } var InternalMentions = function InternalMentions(_a, ref) { var _classNames; var customizePrefixCls = _a.prefixCls, className = _a.className, disabled = _a.disabled, loading = _a.loading, filterOption = _a.filterOption, children = _a.children, notFoundContent = _a.notFoundContent, restProps = __rest(_a, ["prefixCls", "className", "disabled", "loading", "filterOption", "children", "notFoundContent"]); var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), focused = _React$useState2[0], setFocused = _React$useState2[1]; var innerRef = React.useRef(); var mergedRef = (0, _ref2.composeRef)(ref, innerRef); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, renderEmpty = _React$useContext.renderEmpty, direction = _React$useContext.direction; var onFocus = function onFocus() { if (restProps.onFocus) { restProps.onFocus.apply(restProps, arguments); } setFocused(true); }; var onBlur = function onBlur() { if (restProps.onBlur) { restProps.onBlur.apply(restProps, arguments); } setFocused(false); }; var getNotFoundContent = function getNotFoundContent() { if (notFoundContent !== undefined) { return notFoundContent; } return renderEmpty('Select'); }; var getOptions = function getOptions() { if (loading) { return /*#__PURE__*/React.createElement(Option, { value: "ANTD_SEARCHING", disabled: true }, /*#__PURE__*/React.createElement(_spin["default"], { size: "small" })); } return children; }; var getFilterOption = function getFilterOption() { if (loading) { return loadingFilterOption; } return filterOption; }; var prefixCls = getPrefixCls('mentions', customizePrefixCls); var mergedClassName = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-focused"), focused), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement(_rcMentions["default"], (0, _extends2["default"])({ prefixCls: prefixCls, notFoundContent: getNotFoundContent(), className: mergedClassName, disabled: disabled, direction: direction }, restProps, { filterOption: getFilterOption(), onFocus: onFocus, onBlur: onBlur, ref: mergedRef }), getOptions()); }; var Mentions = /*#__PURE__*/React.forwardRef(InternalMentions); Mentions.displayName = 'Mentions'; Mentions.Option = Option; Mentions.getMentions = function () { var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var config = arguments.length > 1 ? arguments[1] : undefined; var _ref = config || {}, _ref$prefix = _ref.prefix, prefix = _ref$prefix === void 0 ? '@' : _ref$prefix, _ref$split = _ref.split, split = _ref$split === void 0 ? ' ' : _ref$split; var prefixList = Array.isArray(prefix) ? prefix : [prefix]; return value.split(split).map(function () { var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var hitPrefix = null; prefixList.some(function (prefixStr) { var startStr = str.slice(0, prefixStr.length); if (startStr === prefixStr) { hitPrefix = prefixStr; return true; } return false; }); if (hitPrefix !== null) { return { prefix: hitPrefix, value: str.slice(hitPrefix.length) }; } return null; }).filter(function (entity) { return !!entity && !!entity.value; }); }; var _default = Mentions; exports["default"] = _default; },{"../_util/ref":224,"../config-provider":278,"../spin":392,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-mentions":638,"react":"react"}],338:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = require("react"); var MenuContext = /*#__PURE__*/(0, _react.createContext)({ inlineCollapsed: false }); var _default = MenuContext; exports["default"] = _default; },{"react":"react"}],339:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _rcMenu = require("rc-menu"); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _classnames = _interopRequireDefault(require("classnames")); var _MenuContext = _interopRequireDefault(require("./MenuContext")); var _tooltip = _interopRequireDefault(require("../tooltip")); var _Sider = require("../layout/Sider"); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var MenuItem = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(MenuItem, _React$Component); var _super = (0, _createSuper2["default"])(MenuItem); function MenuItem() { var _this; (0, _classCallCheck2["default"])(this, MenuItem); _this = _super.apply(this, arguments); _this.renderItem = function (_ref) { var siderCollapsed = _ref.siderCollapsed; var _this$props = _this.props, level = _this$props.level, className = _this$props.className, children = _this$props.children, rootPrefixCls = _this$props.rootPrefixCls; var _a = _this.props, title = _a.title, icon = _a.icon, danger = _a.danger, rest = __rest(_a, ["title", "icon", "danger"]); return /*#__PURE__*/React.createElement(_MenuContext["default"].Consumer, null, function (_ref2) { var _classNames; var inlineCollapsed = _ref2.inlineCollapsed, direction = _ref2.direction; var tooltipTitle = title; if (typeof title === 'undefined') { tooltipTitle = level === 1 ? children : ''; } else if (title === false) { tooltipTitle = ''; } var tooltipProps = { title: tooltipTitle }; if (!siderCollapsed && !inlineCollapsed) { tooltipProps.title = null; // Reset `visible` to fix control mode tooltip display not correct // ref: https://github.com/ant-design/ant-design/issues/16742 tooltipProps.visible = false; } var childrenLength = (0, _toArray["default"])(children).length; return /*#__PURE__*/React.createElement(_tooltip["default"], (0, _extends2["default"])({}, tooltipProps, { placement: direction === 'rtl' ? 'left' : 'right', overlayClassName: "".concat(rootPrefixCls, "-inline-collapsed-tooltip") }), /*#__PURE__*/React.createElement(_rcMenu.Item, (0, _extends2["default"])({}, rest, { className: (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(rootPrefixCls, "-item-danger"), danger), (0, _defineProperty2["default"])(_classNames, "".concat(rootPrefixCls, "-item-only-child"), (icon ? childrenLength + 1 : childrenLength) === 1), _classNames), className), title: title }), icon, _this.renderItemChildren(inlineCollapsed))); }); }; return _this; } (0, _createClass2["default"])(MenuItem, [{ key: "renderItemChildren", value: function renderItemChildren(inlineCollapsed) { var _this$props2 = this.props, icon = _this$props2.icon, children = _this$props2.children, level = _this$props2.level, rootPrefixCls = _this$props2.rootPrefixCls; // inline-collapsed.md demo 依赖 span 来隐藏文字,有 icon 属性,则内部包裹一个 span // ref: https://github.com/ant-design/ant-design/pull/23456 if (!icon || (0, _reactNode.isValidElement)(children) && children.type === 'span') { if (children && inlineCollapsed && level === 1 && typeof children === 'string') { return /*#__PURE__*/React.createElement("div", { className: "".concat(rootPrefixCls, "-inline-collapsed-noicon") }, children.charAt(0)); } return children; } return /*#__PURE__*/React.createElement("span", null, children); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_Sider.SiderContext.Consumer, null, this.renderItem); } }]); return MenuItem; }(React.Component); exports["default"] = MenuItem; MenuItem.isMenuItem = true; },{"../_util/reactNode":223,"../layout/Sider":326,"../tooltip":422,"./MenuContext":338,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-menu":647,"rc-util/lib/Children/toArray":858,"react":"react"}],340:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _rcMenu = require("rc-menu"); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _MenuContext = _interopRequireDefault(require("./MenuContext")); var _reactNode = require("../_util/reactNode"); var SubMenu = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(SubMenu, _React$Component); var _super = (0, _createSuper2["default"])(SubMenu); function SubMenu() { (0, _classCallCheck2["default"])(this, SubMenu); return _super.apply(this, arguments); } (0, _createClass2["default"])(SubMenu, [{ key: "renderTitle", value: function renderTitle(inlineCollapsed) { var _this$props = this.props, icon = _this$props.icon, title = _this$props.title, level = _this$props.level, rootPrefixCls = _this$props.rootPrefixCls; if (!icon) { return inlineCollapsed && level === 1 && title && typeof title === 'string' ? /*#__PURE__*/React.createElement("div", { className: "".concat(rootPrefixCls, "-inline-collapsed-noicon") }, title.charAt(0)) : title; } // inline-collapsed.md demo 依赖 span 来隐藏文字,有 icon 属性,则内部包裹一个 span // ref: https://github.com/ant-design/ant-design/pull/23456 var titleIsSpan = (0, _reactNode.isValidElement)(title) && title.type === 'span'; return /*#__PURE__*/React.createElement(React.Fragment, null, icon, titleIsSpan ? title : /*#__PURE__*/React.createElement("span", null, title)); } }, { key: "render", value: function render() { var _this = this; var _this$props2 = this.props, rootPrefixCls = _this$props2.rootPrefixCls, popupClassName = _this$props2.popupClassName; return /*#__PURE__*/React.createElement(_MenuContext["default"].Consumer, null, function (_ref) { var inlineCollapsed = _ref.inlineCollapsed, antdMenuTheme = _ref.antdMenuTheme; return /*#__PURE__*/React.createElement(_rcMenu.SubMenu, (0, _extends2["default"])({}, (0, _omit["default"])(_this.props, ['icon']), { title: _this.renderTitle(inlineCollapsed), popupClassName: (0, _classnames["default"])(rootPrefixCls, "".concat(rootPrefixCls, "-").concat(antdMenuTheme), popupClassName) })); }); } }]); return SubMenu; }(React.Component); SubMenu.contextType = _MenuContext["default"]; // fix issue:https://github.com/ant-design/ant-design/issues/8666 SubMenu.isSubMenu = 1; var _default = SubMenu; exports["default"] = _default; },{"../_util/reactNode":223,"./MenuContext":338,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"rc-menu":647,"react":"react"}],341:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _rcMenu = _interopRequireWildcard(require("rc-menu")); var _classnames = _interopRequireDefault(require("classnames")); var _SubMenu = _interopRequireDefault(require("./SubMenu")); var _MenuItem = _interopRequireDefault(require("./MenuItem")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _Sider = require("../layout/Sider"); var _motion = _interopRequireDefault(require("../_util/motion")); var _MenuContext = _interopRequireDefault(require("./MenuContext")); var InternalMenu = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(InternalMenu, _React$Component); var _super = (0, _createSuper2["default"])(InternalMenu); function InternalMenu(props) { var _this; (0, _classCallCheck2["default"])(this, InternalMenu); _this = _super.call(this, props); _this.renderMenu = function (_ref) { var getPopupContainer = _ref.getPopupContainer, getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var _this$props = _this.props, customizePrefixCls = _this$props.prefixCls, className = _this$props.className, theme = _this$props.theme; var defaultMotions = { horizontal: { motionName: 'slide-up' }, inline: _motion["default"], other: { motionName: 'zoom-big' } }; var prefixCls = getPrefixCls('menu', customizePrefixCls); var menuClassName = (0, _classnames["default"])("".concat(prefixCls, "-").concat(theme), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-inline-collapsed"), _this.getInlineCollapsed()), className); return /*#__PURE__*/React.createElement(_MenuContext["default"].Provider, { value: { inlineCollapsed: _this.getInlineCollapsed() || false, antdMenuTheme: theme, direction: direction } }, /*#__PURE__*/React.createElement(_rcMenu["default"], (0, _extends2["default"])({ getPopupContainer: getPopupContainer }, _this.props, { className: menuClassName, prefixCls: prefixCls, direction: direction, defaultMotions: defaultMotions }))); }; (0, _devWarning["default"])(!('inlineCollapsed' in props && props.mode !== 'inline'), 'Menu', '`inlineCollapsed` should only be used when `mode` is inline.'); (0, _devWarning["default"])(!(props.siderCollapsed !== undefined && 'inlineCollapsed' in props), 'Menu', '`inlineCollapsed` not control Menu under Sider. Should set `collapsed` on Sider instead.'); return _this; } (0, _createClass2["default"])(InternalMenu, [{ key: "getInlineCollapsed", value: function getInlineCollapsed() { var _this$props2 = this.props, inlineCollapsed = _this$props2.inlineCollapsed, siderCollapsed = _this$props2.siderCollapsed; if (siderCollapsed !== undefined) { return siderCollapsed; } return inlineCollapsed; } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderMenu); } }]); return InternalMenu; }(React.Component); InternalMenu.defaultProps = { className: '', theme: 'light', focusable: false }; // We should keep this as ref-able var Menu = /*#__PURE__*/function (_React$Component2) { (0, _inherits2["default"])(Menu, _React$Component2); var _super2 = (0, _createSuper2["default"])(Menu); function Menu() { (0, _classCallCheck2["default"])(this, Menu); return _super2.apply(this, arguments); } (0, _createClass2["default"])(Menu, [{ key: "render", value: function render() { var _this2 = this; return /*#__PURE__*/React.createElement(_Sider.SiderContext.Consumer, null, function (context) { return /*#__PURE__*/React.createElement(InternalMenu, (0, _extends2["default"])({}, _this2.props, context)); }); } }]); return Menu; }(React.Component); exports["default"] = Menu; Menu.Divider = _rcMenu.Divider; Menu.Item = _MenuItem["default"]; Menu.SubMenu = _SubMenu["default"]; Menu.ItemGroup = _rcMenu.ItemGroup; },{"../_util/devWarning":212,"../_util/motion":221,"../config-provider":278,"../layout/Sider":326,"./MenuContext":338,"./MenuItem":339,"./SubMenu":340,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-menu":647,"react":"react"}],342:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = createUseMessage; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _useNotification = _interopRequireDefault(require("rc-notification/lib/useNotification")); var _configProvider = require("../../config-provider"); var _ = require(".."); function createUseMessage(getRcNotificationInstance, getRCNoticeProps) { var useMessage = function useMessage() { // We can only get content by render var getPrefixCls; // We create a proxy to handle delay created instance var innerInstance = null; var proxy = { add: function add(noticeProps, holderCallback) { innerInstance === null || innerInstance === void 0 ? void 0 : innerInstance.component.add(noticeProps, holderCallback); } }; var _useRCNotification = (0, _useNotification["default"])(proxy), _useRCNotification2 = (0, _slicedToArray2["default"])(_useRCNotification, 2), hookNotify = _useRCNotification2[0], holder = _useRCNotification2[1]; function notify(args) { var customizePrefixCls = args.prefixCls; var mergedPrefixCls = getPrefixCls('message', customizePrefixCls); var target = args.key || (0, _.getKeyThenIncreaseKey)(); var closePromise = new Promise(function (resolve) { var callback = function callback() { if (typeof args.onClose === 'function') { args.onClose(); } return resolve(true); }; getRcNotificationInstance((0, _extends2["default"])((0, _extends2["default"])({}, args), { prefixCls: mergedPrefixCls }), function (_ref) { var prefixCls = _ref.prefixCls, instance = _ref.instance; innerInstance = instance; hookNotify(getRCNoticeProps((0, _extends2["default"])((0, _extends2["default"])({}, args), { key: target, onClose: callback }), prefixCls)); }); }); var result = function result() { if (innerInstance) { innerInstance.removeNotice(target); } }; result.then = function (filled, rejected) { return closePromise.then(filled, rejected); }; result.promise = closePromise; return result; } // Fill functions var hookApiRef = React.useRef({}); hookApiRef.current.open = notify; ['success', 'info', 'warning', 'error', 'loading'].forEach(function (type) { return (0, _.attachTypeApi)(hookApiRef.current, type); }); return [hookApiRef.current, /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, { key: "holder" }, function (context) { getPrefixCls = context.getPrefixCls; return holder; })]; }; return useMessage; } },{"..":343,"../../config-provider":278,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"rc-notification/lib/useNotification":668,"react":"react"}],343:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getKeyThenIncreaseKey = getKeyThenIncreaseKey; exports.attachTypeApi = attachTypeApi; exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcNotification = _interopRequireDefault(require("rc-notification")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons/LoadingOutlined")); var _ExclamationCircleFilled = _interopRequireDefault(require("@ant-design/icons/ExclamationCircleFilled")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _CheckCircleFilled = _interopRequireDefault(require("@ant-design/icons/CheckCircleFilled")); var _InfoCircleFilled = _interopRequireDefault(require("@ant-design/icons/InfoCircleFilled")); var _useMessage = _interopRequireDefault(require("./hooks/useMessage")); var messageInstance; var defaultDuration = 3; var defaultTop; var key = 1; var localPrefixCls = 'ant-message'; var transitionName = 'move-up'; var getContainer; var maxCount; var rtl = false; function getKeyThenIncreaseKey() { return key++; } function setMessageConfig(options) { if (options.top !== undefined) { defaultTop = options.top; messageInstance = null; // delete messageInstance for new defaultTop } if (options.duration !== undefined) { defaultDuration = options.duration; } if (options.prefixCls !== undefined) { localPrefixCls = options.prefixCls; } if (options.getContainer !== undefined) { getContainer = options.getContainer; } if (options.transitionName !== undefined) { transitionName = options.transitionName; messageInstance = null; // delete messageInstance for new transitionName } if (options.maxCount !== undefined) { maxCount = options.maxCount; messageInstance = null; } if (options.rtl !== undefined) { rtl = options.rtl; } } function getRCNotificationInstance(args, callback) { var prefixCls = args.prefixCls || localPrefixCls; if (messageInstance) { callback({ prefixCls: prefixCls, instance: messageInstance }); return; } _rcNotification["default"].newInstance({ prefixCls: prefixCls, transitionName: transitionName, style: { top: defaultTop }, getContainer: getContainer, maxCount: maxCount }, function (instance) { if (messageInstance) { callback({ prefixCls: prefixCls, instance: messageInstance }); return; } messageInstance = instance; callback({ prefixCls: prefixCls, instance: instance }); }); } var typeToIcon = { info: _InfoCircleFilled["default"], success: _CheckCircleFilled["default"], error: _CloseCircleFilled["default"], warning: _ExclamationCircleFilled["default"], loading: _LoadingOutlined["default"] }; function getRCNoticeProps(args, prefixCls) { var _classNames; var duration = args.duration !== undefined ? args.duration : defaultDuration; var IconComponent = typeToIcon[args.type]; var messageClass = (0, _classnames["default"])("".concat(prefixCls, "-custom-content"), (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(args.type), args.type), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), rtl === true), _classNames)); return { key: args.key, duration: duration, style: args.style || {}, className: args.className, content: /*#__PURE__*/React.createElement("div", { className: messageClass }, args.icon || IconComponent && /*#__PURE__*/React.createElement(IconComponent, null), /*#__PURE__*/React.createElement("span", null, args.content)), onClose: args.onClose }; } function notice(args) { var target = args.key || key++; var closePromise = new Promise(function (resolve) { var callback = function callback() { if (typeof args.onClose === 'function') { args.onClose(); } return resolve(true); }; getRCNotificationInstance(args, function (_ref) { var prefixCls = _ref.prefixCls, instance = _ref.instance; instance.notice(getRCNoticeProps((0, _extends2["default"])((0, _extends2["default"])({}, args), { key: target, onClose: callback }), prefixCls)); }); }); var result = function result() { if (messageInstance) { messageInstance.removeNotice(target); } }; result.then = function (filled, rejected) { return closePromise.then(filled, rejected); }; result.promise = closePromise; return result; } function isArgsProps(content) { return Object.prototype.toString.call(content) === '[object Object]' && !!content.content; } var api = { open: notice, config: setMessageConfig, destroy: function destroy(messageKey) { if (messageInstance) { if (messageKey) { var _messageInstance = messageInstance, removeNotice = _messageInstance.removeNotice; removeNotice(messageKey); } else { var _messageInstance2 = messageInstance, destroy = _messageInstance2.destroy; destroy(); messageInstance = null; } } } }; function attachTypeApi(originalApi, type) { originalApi[type] = function (content, duration, onClose) { if (isArgsProps(content)) { return originalApi.open((0, _extends2["default"])((0, _extends2["default"])({}, content), { type: type })); } if (typeof duration === 'function') { onClose = duration; duration = undefined; } return originalApi.open({ content: content, duration: duration, type: type, onClose: onClose }); }; } ['success', 'info', 'warning', 'error', 'loading'].forEach(function (type) { return attachTypeApi(api, type); }); api.warn = api.warning; api.useMessage = (0, _useMessage["default"])(getRCNotificationInstance, getRCNoticeProps); var _default = api; exports["default"] = _default; },{"./hooks/useMessage":342,"@ant-design/icons/CheckCircleFilled":65,"@ant-design/icons/CloseCircleFilled":69,"@ant-design/icons/ExclamationCircleFilled":81,"@ant-design/icons/InfoCircleFilled":90,"@ant-design/icons/LoadingOutlined":93,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-notification":667,"react":"react"}],344:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _button = _interopRequireDefault(require("../button")); var _button2 = require("../button/button"); var ActionButton = function ActionButton(props) { var clickedRef = React.useRef(false); var ref = React.useRef(); var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), loading = _React$useState2[0], setLoading = _React$useState2[1]; React.useEffect(function () { var timeoutId; if (props.autoFocus) { var $this = ref.current; timeoutId = setTimeout(function () { return $this.focus(); }); } return function () { if (timeoutId) { clearTimeout(timeoutId); } }; }, []); var handlePromiseOnOk = function handlePromiseOnOk(returnValueOfOnOk) { var closeModal = props.closeModal; if (!returnValueOfOnOk || !returnValueOfOnOk.then) { return; } setLoading(true); returnValueOfOnOk.then(function () { // It's unnecessary to set loading=false, for the Modal will be unmounted after close. // setState({ loading: false }); closeModal.apply(void 0, arguments); }, function (e) { // Emit error when catch promise reject // eslint-disable-next-line no-console console.error(e); // See: https://github.com/ant-design/ant-design/issues/6183 setLoading(false); clickedRef.current = false; }); }; var onClick = function onClick() { var actionFn = props.actionFn, closeModal = props.closeModal; if (clickedRef.current) { return; } clickedRef.current = true; if (!actionFn) { closeModal(); return; } var returnValueOfOnOk; if (actionFn.length) { returnValueOfOnOk = actionFn(closeModal); // https://github.com/ant-design/ant-design/issues/23358 clickedRef.current = false; } else { returnValueOfOnOk = actionFn(); if (!returnValueOfOnOk) { closeModal(); return; } } handlePromiseOnOk(returnValueOfOnOk); }; var type = props.type, children = props.children, prefixCls = props.prefixCls, buttonProps = props.buttonProps; return /*#__PURE__*/React.createElement(_button["default"], (0, _extends2["default"])({}, (0, _button2.convertLegacyProps)(type), { onClick: onClick, loading: loading, prefixCls: prefixCls }, buttonProps, { ref: ref }), children); }; var _default = ActionButton; exports["default"] = _default; },{"../button":257,"../button/button":256,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],345:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _Modal = _interopRequireDefault(require("./Modal")); var _ActionButton = _interopRequireDefault(require("./ActionButton")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var ConfirmDialog = function ConfirmDialog(props) { var icon = props.icon, onCancel = props.onCancel, onOk = props.onOk, close = props.close, zIndex = props.zIndex, afterClose = props.afterClose, visible = props.visible, keyboard = props.keyboard, centered = props.centered, getContainer = props.getContainer, maskStyle = props.maskStyle, okText = props.okText, okButtonProps = props.okButtonProps, cancelText = props.cancelText, cancelButtonProps = props.cancelButtonProps, direction = props.direction, prefixCls = props.prefixCls, rootPrefixCls = props.rootPrefixCls; (0, _devWarning["default"])(!(typeof icon === 'string' && icon.length > 2), 'Modal', "`icon` is using ReactNode instead of string naming in v4. Please check `".concat(icon, "` at https://ant.design/components/icon")); // 支持传入{ icon: null }来隐藏`Modal.confirm`默认的Icon var okType = props.okType || 'primary'; var contentPrefixCls = "".concat(prefixCls, "-confirm"); // 默认为 true,保持向下兼容 var okCancel = 'okCancel' in props ? props.okCancel : true; var width = props.width || 416; var style = props.style || {}; var mask = props.mask === undefined ? true : props.mask; // 默认为 false,保持旧版默认行为 var maskClosable = props.maskClosable === undefined ? false : props.maskClosable; var autoFocusButton = props.autoFocusButton === null ? false : props.autoFocusButton || 'ok'; var transitionName = props.transitionName || 'zoom'; var maskTransitionName = props.maskTransitionName || 'fade'; var classString = (0, _classnames["default"])(contentPrefixCls, "".concat(contentPrefixCls, "-").concat(props.type), (0, _defineProperty2["default"])({}, "".concat(contentPrefixCls, "-rtl"), direction === 'rtl'), props.className); var cancelButton = okCancel && /*#__PURE__*/React.createElement(_ActionButton["default"], { actionFn: onCancel, closeModal: close, autoFocus: autoFocusButton === 'cancel', buttonProps: cancelButtonProps, prefixCls: "".concat(rootPrefixCls, "-btn") }, cancelText); return /*#__PURE__*/React.createElement(_Modal["default"], { prefixCls: prefixCls, className: classString, wrapClassName: (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(contentPrefixCls, "-centered"), !!props.centered)), onCancel: function onCancel() { return close({ triggerCancel: true }); }, visible: visible, title: "", transitionName: transitionName, footer: "", maskTransitionName: maskTransitionName, mask: mask, maskClosable: maskClosable, maskStyle: maskStyle, style: style, width: width, zIndex: zIndex, afterClose: afterClose, keyboard: keyboard, centered: centered, getContainer: getContainer }, /*#__PURE__*/React.createElement("div", { className: "".concat(contentPrefixCls, "-body-wrapper") }, /*#__PURE__*/React.createElement("div", { className: "".concat(contentPrefixCls, "-body") }, icon, props.title === undefined ? null : /*#__PURE__*/React.createElement("span", { className: "".concat(contentPrefixCls, "-title") }, props.title), /*#__PURE__*/React.createElement("div", { className: "".concat(contentPrefixCls, "-content") }, props.content)), /*#__PURE__*/React.createElement("div", { className: "".concat(contentPrefixCls, "-btns") }, cancelButton, /*#__PURE__*/React.createElement(_ActionButton["default"], { type: okType, actionFn: onOk, closeModal: close, autoFocus: autoFocusButton === 'ok', buttonProps: okButtonProps, prefixCls: "".concat(rootPrefixCls, "-btn") }, okText)))); }; var _default = ConfirmDialog; exports["default"] = _default; },{"../_util/devWarning":212,"./ActionButton":344,"./Modal":346,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],346:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.destroyFns = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcDialog = _interopRequireDefault(require("rc-dialog")); var _classnames = _interopRequireDefault(require("classnames")); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _useModal = _interopRequireDefault(require("./useModal")); var _locale = require("./locale"); var _button = _interopRequireDefault(require("../button")); var _button2 = require("../button/button"); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var mousePosition; var destroyFns = []; // ref: https://github.com/ant-design/ant-design/issues/15795 exports.destroyFns = destroyFns; var getClickPosition = function getClickPosition(e) { mousePosition = { x: e.pageX, y: e.pageY }; // 100ms 内发生过点击事件,则从点击位置动画展示 // 否则直接 zoom 展示 // 这样可以兼容非点击方式展开 setTimeout(function () { mousePosition = null; }, 100); }; // 只有点击事件支持从鼠标位置动画展开 if (typeof window !== 'undefined' && window.document && window.document.documentElement) { (0, _addEventListener["default"])(document.documentElement, 'click', getClickPosition); } var Modal = function Modal(props) { var _classNames; var _React$useContext = React.useContext(_configProvider.ConfigContext), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var handleCancel = function handleCancel(e) { var onCancel = props.onCancel; if (onCancel) { onCancel(e); } }; var handleOk = function handleOk(e) { var onOk = props.onOk; if (onOk) { onOk(e); } }; var renderFooter = function renderFooter(locale) { var okText = props.okText, okType = props.okType, cancelText = props.cancelText, confirmLoading = props.confirmLoading; return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_button["default"], (0, _extends2["default"])({ onClick: handleCancel }, props.cancelButtonProps), cancelText || locale.cancelText), /*#__PURE__*/React.createElement(_button["default"], (0, _extends2["default"])({}, (0, _button2.convertLegacyProps)(okType), { loading: confirmLoading, onClick: handleOk }, props.okButtonProps), okText || locale.okText)); }; var customizePrefixCls = props.prefixCls, footer = props.footer, visible = props.visible, wrapClassName = props.wrapClassName, centered = props.centered, getContainer = props.getContainer, closeIcon = props.closeIcon, restProps = __rest(props, ["prefixCls", "footer", "visible", "wrapClassName", "centered", "getContainer", "closeIcon"]); var prefixCls = getPrefixCls('modal', customizePrefixCls); var defaultFooter = /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Modal", defaultLocale: (0, _locale.getConfirmLocale)() }, renderFooter); var closeIconToRender = /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-close-x") }, closeIcon || /*#__PURE__*/React.createElement(_CloseOutlined["default"], { className: "".concat(prefixCls, "-close-icon") })); var wrapClassNameExtended = (0, _classnames["default"])(wrapClassName, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-centered"), !!centered), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-wrap-rtl"), direction === 'rtl'), _classNames)); return /*#__PURE__*/React.createElement(_rcDialog["default"], (0, _extends2["default"])({}, restProps, { getContainer: getContainer === undefined ? getContextPopupContainer : getContainer, prefixCls: prefixCls, wrapClassName: wrapClassNameExtended, footer: footer === undefined ? defaultFooter : footer, visible: visible, mousePosition: mousePosition, onClose: handleCancel, closeIcon: closeIconToRender })); }; Modal.useModal = _useModal["default"]; Modal.defaultProps = { width: 520, transitionName: 'zoom', maskTransitionName: 'fade', confirmLoading: false, visible: false, okType: 'primary' }; var _default = Modal; exports["default"] = _default; },{"../button":257,"../button/button":256,"../config-provider":278,"../locale-provider/LocaleReceiver":331,"./locale":349,"./useModal":351,"@ant-design/icons/CloseOutlined":71,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-dialog":605,"rc-util/lib/Dom/addEventListener":859,"react":"react"}],347:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = confirm; exports.withWarn = withWarn; exports.withInfo = withInfo; exports.withSuccess = withSuccess; exports.withError = withError; exports.withConfirm = withConfirm; exports.globalConfig = globalConfig; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var ReactDOM = _interopRequireWildcard(require("react-dom")); var _InfoCircleOutlined = _interopRequireDefault(require("@ant-design/icons/InfoCircleOutlined")); var _CheckCircleOutlined = _interopRequireDefault(require("@ant-design/icons/CheckCircleOutlined")); var _CloseCircleOutlined = _interopRequireDefault(require("@ant-design/icons/CloseCircleOutlined")); var _ExclamationCircleOutlined = _interopRequireDefault(require("@ant-design/icons/ExclamationCircleOutlined")); var _locale = require("./locale"); var _Modal = require("./Modal"); var _ConfirmDialog = _interopRequireDefault(require("./ConfirmDialog")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var defaultRootPrefixCls = 'ant'; function getRootPrefixCls() { return defaultRootPrefixCls; } function confirm(config) { var div = document.createElement('div'); document.body.appendChild(div); // eslint-disable-next-line @typescript-eslint/no-use-before-define var currentConfig = (0, _extends2["default"])((0, _extends2["default"])({}, config), { close: close, visible: true }); function destroy() { var unmountResult = ReactDOM.unmountComponentAtNode(div); if (unmountResult && div.parentNode) { div.parentNode.removeChild(div); } for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var triggerCancel = args.some(function (param) { return param && param.triggerCancel; }); if (config.onCancel && triggerCancel) { config.onCancel.apply(config, args); } for (var i = 0; i < _Modal.destroyFns.length; i++) { var fn = _Modal.destroyFns[i]; // eslint-disable-next-line @typescript-eslint/no-use-before-define if (fn === close) { _Modal.destroyFns.splice(i, 1); break; } } } function render(_a) { var okText = _a.okText, cancelText = _a.cancelText, prefixCls = _a.prefixCls, props = __rest(_a, ["okText", "cancelText", "prefixCls"]); /** * https://github.com/ant-design/ant-design/issues/23623 * Sync render blocks React event. Let's make this async. */ setTimeout(function () { var runtimeLocale = (0, _locale.getConfirmLocale)(); ReactDOM.render( /*#__PURE__*/React.createElement(_ConfirmDialog["default"], (0, _extends2["default"])({}, props, { prefixCls: prefixCls || "".concat(getRootPrefixCls(), "-modal"), rootPrefixCls: getRootPrefixCls(), okText: okText || (props.okCancel ? runtimeLocale.okText : runtimeLocale.justOkText), cancelText: cancelText || runtimeLocale.cancelText })), div); }); } function close() { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } currentConfig = (0, _extends2["default"])((0, _extends2["default"])({}, currentConfig), { visible: false, afterClose: destroy.bind.apply(destroy, [this].concat(args)) }); render(currentConfig); } function update(newConfig) { currentConfig = (0, _extends2["default"])((0, _extends2["default"])({}, currentConfig), newConfig); render(currentConfig); } render(currentConfig); _Modal.destroyFns.push(close); return { destroy: close, update: update }; } function withWarn(props) { return (0, _extends2["default"])({ type: 'warning', icon: /*#__PURE__*/React.createElement(_ExclamationCircleOutlined["default"], null), okCancel: false }, props); } function withInfo(props) { return (0, _extends2["default"])({ type: 'info', icon: /*#__PURE__*/React.createElement(_InfoCircleOutlined["default"], null), okCancel: false }, props); } function withSuccess(props) { return (0, _extends2["default"])({ type: 'success', icon: /*#__PURE__*/React.createElement(_CheckCircleOutlined["default"], null), okCancel: false }, props); } function withError(props) { return (0, _extends2["default"])({ type: 'error', icon: /*#__PURE__*/React.createElement(_CloseCircleOutlined["default"], null), okCancel: false }, props); } function withConfirm(props) { return (0, _extends2["default"])({ type: 'confirm', icon: /*#__PURE__*/React.createElement(_ExclamationCircleOutlined["default"], null), okCancel: true }, props); } function globalConfig(_ref) { var rootPrefixCls = _ref.rootPrefixCls; if (rootPrefixCls) { defaultRootPrefixCls = rootPrefixCls; } } },{"./ConfirmDialog":345,"./Modal":346,"./locale":349,"@ant-design/icons/CheckCircleOutlined":66,"@ant-design/icons/CloseCircleOutlined":70,"@ant-design/icons/ExclamationCircleOutlined":82,"@ant-design/icons/InfoCircleOutlined":91,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react","react-dom":"react-dom"}],348:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Modal = _interopRequireWildcard(require("./Modal")); var _confirm = _interopRequireWildcard(require("./confirm")); function modalWarn(props) { return (0, _confirm["default"])((0, _confirm.withWarn)(props)); } var Modal = _Modal["default"]; Modal.info = function infoFn(props) { return (0, _confirm["default"])((0, _confirm.withInfo)(props)); }; Modal.success = function successFn(props) { return (0, _confirm["default"])((0, _confirm.withSuccess)(props)); }; Modal.error = function errorFn(props) { return (0, _confirm["default"])((0, _confirm.withError)(props)); }; Modal.warning = modalWarn; Modal.warn = modalWarn; Modal.confirm = function confirmFn(props) { return (0, _confirm["default"])((0, _confirm.withConfirm)(props)); }; Modal.destroyAll = function destroyAllFn() { while (_Modal.destroyFns.length) { var close = _Modal.destroyFns.pop(); if (close) { close(); } } }; Modal.config = _confirm.globalConfig; var _default = Modal; exports["default"] = _default; },{"./Modal":346,"./confirm":347,"@babel/runtime/helpers/interopRequireWildcard":193}],349:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.changeConfirmLocale = changeConfirmLocale; exports.getConfirmLocale = getConfirmLocale; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _default = _interopRequireDefault(require("../locale/default")); var runtimeLocale = (0, _extends2["default"])({}, _default["default"].Modal); function changeConfirmLocale(newLocale) { if (newLocale) { runtimeLocale = (0, _extends2["default"])((0, _extends2["default"])({}, runtimeLocale), newLocale); } else { runtimeLocale = (0, _extends2["default"])({}, _default["default"].Modal); } } function getConfirmLocale() { return runtimeLocale; } },{"../locale/default":335,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192}],350:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _ConfirmDialog = _interopRequireDefault(require("../ConfirmDialog")); var _default2 = _interopRequireDefault(require("../../locale/default")); var _LocaleReceiver = _interopRequireDefault(require("../../locale-provider/LocaleReceiver")); var _configProvider = require("../../config-provider"); var HookModal = function HookModal(_ref, ref) { var afterClose = _ref.afterClose, config = _ref.config; var _React$useState = React.useState(true), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1]; var _React$useState3 = React.useState(config), _React$useState4 = (0, _slicedToArray2["default"])(_React$useState3, 2), innerConfig = _React$useState4[0], setInnerConfig = _React$useState4[1]; var _React$useContext = React.useContext(_configProvider.ConfigContext), direction = _React$useContext.direction, getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('modal'); var rootPrefixCls = getPrefixCls(); function close() { setVisible(false); } React.useImperativeHandle(ref, function () { return { destroy: close, update: function update(newConfig) { setInnerConfig(function (originConfig) { return (0, _extends2["default"])((0, _extends2["default"])({}, originConfig), newConfig); }); } }; }); return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Modal", defaultLocale: _default2["default"].Modal }, function (modalLocale) { return /*#__PURE__*/React.createElement(_ConfirmDialog["default"], (0, _extends2["default"])({ prefixCls: prefixCls, rootPrefixCls: rootPrefixCls }, innerConfig, { close: close, visible: visible, afterClose: afterClose, okText: innerConfig.okText || (innerConfig.okCancel ? modalLocale.okText : modalLocale.justOkText), direction: direction, cancelText: innerConfig.cancelText || modalLocale.cancelText })); }); }; var _default = /*#__PURE__*/React.forwardRef(HookModal); exports["default"] = _default; },{"../../config-provider":278,"../../locale-provider/LocaleReceiver":331,"../../locale/default":335,"../ConfirmDialog":345,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],351:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useModal; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _usePatchElement3 = _interopRequireDefault(require("../../_util/hooks/usePatchElement")); var _HookModal = _interopRequireDefault(require("./HookModal")); var _confirm = require("../confirm"); var uuid = 0; function useModal() { var _usePatchElement = (0, _usePatchElement3["default"])(), _usePatchElement2 = (0, _slicedToArray2["default"])(_usePatchElement, 2), elements = _usePatchElement2[0], patchElement = _usePatchElement2[1]; function getConfirmFunc(withFunc) { return function hookConfirm(config) { uuid += 1; var modalRef = /*#__PURE__*/React.createRef(); var closeFunc; var modal = /*#__PURE__*/React.createElement(_HookModal["default"], { key: "modal-".concat(uuid), config: withFunc(config), ref: modalRef, afterClose: function afterClose() { closeFunc(); } }); closeFunc = patchElement(modal); return { destroy: function destroy() { if (modalRef.current) { modalRef.current.destroy(); } }, update: function update(newConfig) { if (modalRef.current) { modalRef.current.update(newConfig); } } }; }; } return [{ info: getConfirmFunc(_confirm.withInfo), success: getConfirmFunc(_confirm.withSuccess), error: getConfirmFunc(_confirm.withError), warning: getConfirmFunc(_confirm.withWarn), confirm: getConfirmFunc(_confirm.withConfirm) }, /*#__PURE__*/React.createElement(React.Fragment, null, elements)]; } },{"../../_util/hooks/usePatchElement":218,"../confirm":347,"./HookModal":350,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],352:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = createUseNotification; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _useNotification = _interopRequireDefault(require("rc-notification/lib/useNotification")); var _configProvider = require("../../config-provider"); function createUseNotification(getNotificationInstance, getRCNoticeProps) { var useNotification = function useNotification() { // We can only get content by render var getPrefixCls; // We create a proxy to handle delay created instance var innerInstance = null; var proxy = { add: function add(noticeProps, holderCallback) { innerInstance === null || innerInstance === void 0 ? void 0 : innerInstance.component.add(noticeProps, holderCallback); } }; var _useRCNotification = (0, _useNotification["default"])(proxy), _useRCNotification2 = (0, _slicedToArray2["default"])(_useRCNotification, 2), hookNotify = _useRCNotification2[0], holder = _useRCNotification2[1]; function notify(args) { var customizePrefixCls = args.prefixCls; var mergedPrefixCls = getPrefixCls('notification', customizePrefixCls); getNotificationInstance((0, _extends2["default"])((0, _extends2["default"])({}, args), { prefixCls: mergedPrefixCls }), function (_ref) { var prefixCls = _ref.prefixCls, instance = _ref.instance; innerInstance = instance; hookNotify(getRCNoticeProps(args, prefixCls)); }); } // Fill functions var hookApiRef = React.useRef({}); hookApiRef.current.open = notify; ['success', 'info', 'warning', 'error'].forEach(function (type) { hookApiRef.current[type] = function (args) { return hookApiRef.current.open((0, _extends2["default"])((0, _extends2["default"])({}, args), { type: type })); }; }); return [hookApiRef.current, /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, { key: "holder" }, function (context) { getPrefixCls = context.getPrefixCls; return holder; })]; }; return useNotification; } },{"../../config-provider":278,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"rc-notification/lib/useNotification":668,"react":"react"}],353:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _rcNotification = _interopRequireDefault(require("rc-notification")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _classnames = _interopRequireDefault(require("classnames")); var _CheckCircleOutlined = _interopRequireDefault(require("@ant-design/icons/CheckCircleOutlined")); var _CloseCircleOutlined = _interopRequireDefault(require("@ant-design/icons/CloseCircleOutlined")); var _ExclamationCircleOutlined = _interopRequireDefault(require("@ant-design/icons/ExclamationCircleOutlined")); var _InfoCircleOutlined = _interopRequireDefault(require("@ant-design/icons/InfoCircleOutlined")); var _useNotification = _interopRequireDefault(require("./hooks/useNotification")); var notificationInstance = {}; var defaultDuration = 4.5; var defaultTop = 24; var defaultBottom = 24; var defaultPrefixCls = 'ant-notification'; var defaultPlacement = 'topRight'; var defaultGetContainer; var defaultCloseIcon; var rtl = false; function setNotificationConfig(options) { var duration = options.duration, placement = options.placement, bottom = options.bottom, top = options.top, getContainer = options.getContainer, closeIcon = options.closeIcon, prefixCls = options.prefixCls; if (prefixCls !== undefined) { defaultPrefixCls = prefixCls; } if (duration !== undefined) { defaultDuration = duration; } if (placement !== undefined) { defaultPlacement = placement; } else if (options.rtl) { defaultPlacement = 'topLeft'; } if (bottom !== undefined) { defaultBottom = bottom; } if (top !== undefined) { defaultTop = top; } if (getContainer !== undefined) { defaultGetContainer = getContainer; } if (closeIcon !== undefined) { defaultCloseIcon = closeIcon; } if (options.rtl !== undefined) { rtl = options.rtl; } } function getPlacementStyle(placement) { var top = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultTop; var bottom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultBottom; var style; switch (placement) { case 'topLeft': style = { left: 0, top: top, bottom: 'auto' }; break; case 'topRight': style = { right: 0, top: top, bottom: 'auto' }; break; case 'bottomLeft': style = { left: 0, top: 'auto', bottom: bottom }; break; default: style = { right: 0, top: 'auto', bottom: bottom }; break; } return style; } function getNotificationInstance(args, callback) { var _args$placement = args.placement, placement = _args$placement === void 0 ? defaultPlacement : _args$placement, top = args.top, bottom = args.bottom, _args$getContainer = args.getContainer, getContainer = _args$getContainer === void 0 ? defaultGetContainer : _args$getContainer, _args$closeIcon = args.closeIcon, closeIcon = _args$closeIcon === void 0 ? defaultCloseIcon : _args$closeIcon; var outerPrefixCls = args.prefixCls || defaultPrefixCls; var prefixCls = "".concat(outerPrefixCls, "-notice"); var cacheKey = "".concat(outerPrefixCls, "-").concat(placement); var cacheInstance = notificationInstance[cacheKey]; if (cacheInstance) { Promise.resolve(cacheInstance).then(function (instance) { callback({ prefixCls: prefixCls, instance: instance }); }); return; } var closeIconToRender = /*#__PURE__*/React.createElement("span", { className: "".concat(outerPrefixCls, "-close-x") }, closeIcon || /*#__PURE__*/React.createElement(_CloseOutlined["default"], { className: "".concat(outerPrefixCls, "-close-icon") })); var notificationClass = (0, _classnames["default"])("".concat(outerPrefixCls, "-").concat(placement), (0, _defineProperty2["default"])({}, "".concat(outerPrefixCls, "-rtl"), rtl === true)); notificationInstance[cacheKey] = new Promise(function (resolve) { _rcNotification["default"].newInstance({ prefixCls: outerPrefixCls, className: notificationClass, style: getPlacementStyle(placement, top, bottom), getContainer: getContainer, closeIcon: closeIconToRender }, function (notification) { resolve(notification); callback({ prefixCls: prefixCls, instance: notification }); }); }); } var typeToIcon = { success: _CheckCircleOutlined["default"], info: _InfoCircleOutlined["default"], error: _CloseCircleOutlined["default"], warning: _ExclamationCircleOutlined["default"] }; function getRCNoticeProps(args, prefixCls) { var duration = args.duration === undefined ? defaultDuration : args.duration; var iconNode = null; if (args.icon) { iconNode = /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-icon") }, args.icon); } else if (args.type) { iconNode = /*#__PURE__*/React.createElement(typeToIcon[args.type] || null, { className: "".concat(prefixCls, "-icon ").concat(prefixCls, "-icon-").concat(args.type) }); } var autoMarginTag = !args.description && iconNode ? /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-message-single-line-auto-margin") }) : null; return { content: /*#__PURE__*/React.createElement("div", { className: iconNode ? "".concat(prefixCls, "-with-icon") : '', role: "alert" }, iconNode, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-message") }, autoMarginTag, args.message), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-description") }, args.description), args.btn ? /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-btn") }, args.btn) : null), duration: duration, closable: true, onClose: args.onClose, onClick: args.onClick, key: args.key, style: args.style || {}, className: args.className }; } function notice(args) { getNotificationInstance(args, function (_ref) { var prefixCls = _ref.prefixCls, instance = _ref.instance; instance.notice(getRCNoticeProps(args, prefixCls)); }); } var api = { open: notice, close: function close(key) { Object.keys(notificationInstance).forEach(function (cacheKey) { return Promise.resolve(notificationInstance[cacheKey]).then(function (instance) { instance.removeNotice(key); }); }); }, config: setNotificationConfig, destroy: function destroy() { Object.keys(notificationInstance).forEach(function (cacheKey) { Promise.resolve(notificationInstance[cacheKey]).then(function (instance) { instance.destroy(); }); delete notificationInstance[cacheKey]; // lgtm[js/missing-await] }); } }; ['success', 'info', 'warning', 'error'].forEach(function (type) { api[type] = function (args) { return api.open((0, _extends2["default"])((0, _extends2["default"])({}, args), { type: type })); }; }); api.warn = api.warning; api.useNotification = (0, _useNotification["default"])(getNotificationInstance, getRCNoticeProps); var _default = api; exports["default"] = _default; },{"./hooks/useNotification":352,"@ant-design/icons/CheckCircleOutlined":66,"@ant-design/icons/CloseCircleOutlined":70,"@ant-design/icons/CloseOutlined":71,"@ant-design/icons/ExclamationCircleOutlined":82,"@ant-design/icons/InfoCircleOutlined":91,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-notification":667,"react":"react"}],354:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _ArrowLeftOutlined = _interopRequireDefault(require("@ant-design/icons/ArrowLeftOutlined")); var _ArrowRightOutlined = _interopRequireDefault(require("@ant-design/icons/ArrowRightOutlined")); var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer")); var _configProvider = require("../config-provider"); var _breadcrumb = _interopRequireDefault(require("../breadcrumb")); var _avatar = _interopRequireDefault(require("../avatar")); var _transButton = _interopRequireDefault(require("../_util/transButton")); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var renderBack = function renderBack(prefixCls, backIcon, onBack) { if (!backIcon || !onBack) { return null; } return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "PageHeader" }, function (_ref) { var back = _ref.back; return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-back") }, /*#__PURE__*/React.createElement(_transButton["default"], { onClick: function onClick(e) { if (onBack) { onBack(e); } }, className: "".concat(prefixCls, "-back-button"), "aria-label": back }, backIcon)); }); }; var renderBreadcrumb = function renderBreadcrumb(breadcrumb) { return /*#__PURE__*/React.createElement(_breadcrumb["default"], breadcrumb); }; var getBackIcon = function getBackIcon(props) { var direction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'ltr'; if (props.backIcon !== undefined) { return props.backIcon; } return direction === 'rtl' ? /*#__PURE__*/React.createElement(_ArrowRightOutlined["default"], null) : /*#__PURE__*/React.createElement(_ArrowLeftOutlined["default"], null); }; var renderTitle = function renderTitle(prefixCls, props) { var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'ltr'; var title = props.title, avatar = props.avatar, subTitle = props.subTitle, tags = props.tags, extra = props.extra, onBack = props.onBack; var headingPrefixCls = "".concat(prefixCls, "-heading"); if (title || subTitle || tags || extra) { var backIcon = getBackIcon(props, direction); var backIconDom = renderBack(prefixCls, backIcon, onBack); return /*#__PURE__*/React.createElement("div", { className: headingPrefixCls }, /*#__PURE__*/React.createElement("div", { className: "".concat(headingPrefixCls, "-left") }, backIconDom, avatar && /*#__PURE__*/React.createElement(_avatar["default"], avatar), title && /*#__PURE__*/React.createElement("span", { className: "".concat(headingPrefixCls, "-title"), title: typeof title === 'string' ? title : undefined }, title), subTitle && /*#__PURE__*/React.createElement("span", { className: "".concat(headingPrefixCls, "-sub-title"), title: typeof subTitle === 'string' ? subTitle : undefined }, subTitle), tags && /*#__PURE__*/React.createElement("span", { className: "".concat(headingPrefixCls, "-tags") }, tags)), extra && /*#__PURE__*/React.createElement("span", { className: "".concat(headingPrefixCls, "-extra") }, extra)); } return null; }; var renderFooter = function renderFooter(prefixCls, footer) { if (footer) { return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-footer") }, footer); } return null; }; var renderChildren = function renderChildren(prefixCls, children) { return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-content") }, children); }; var PageHeader = function PageHeader(props) { var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), compact = _React$useState2[0], updateCompact = _React$useState2[1]; var onResize = function onResize(_ref2) { var width = _ref2.width; updateCompact(width < 768); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref3) { var _classNames; var getPrefixCls = _ref3.getPrefixCls, pageHeader = _ref3.pageHeader, direction = _ref3.direction; var customizePrefixCls = props.prefixCls, style = props.style, footer = props.footer, children = props.children, breadcrumb = props.breadcrumb, customizeClassName = props.className; var ghost = true; // Use `ghost` from `props` or from `ConfigProvider` instead. if ('ghost' in props) { ghost = props.ghost; } else if (pageHeader && 'ghost' in pageHeader) { ghost = pageHeader.ghost; } var prefixCls = getPrefixCls('page-header', customizePrefixCls); var breadcrumbDom = breadcrumb && breadcrumb.routes ? renderBreadcrumb(breadcrumb) : null; var className = (0, _classnames["default"])(prefixCls, customizeClassName, (_classNames = { 'has-breadcrumb': breadcrumbDom, 'has-footer': footer }, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-ghost"), ghost), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-compact"), compact), _classNames)); return /*#__PURE__*/React.createElement(_rcResizeObserver["default"], { onResize: onResize }, /*#__PURE__*/React.createElement("div", { className: className, style: style }, breadcrumbDom, renderTitle(prefixCls, props, direction), children && renderChildren(prefixCls, children), renderFooter(prefixCls, footer))); }); }; var _default = PageHeader; exports["default"] = _default; },{"../_util/transButton":229,"../avatar":244,"../breadcrumb":253,"../config-provider":278,"../locale-provider/LocaleReceiver":331,"@ant-design/icons/ArrowLeftOutlined":58,"@ant-design/icons/ArrowRightOutlined":59,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-resize-observer":729,"react":"react"}],355:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _select = _interopRequireDefault(require("../select")); var MiniSelect = function MiniSelect(props) { return /*#__PURE__*/React.createElement(_select["default"], (0, _extends2["default"])({ size: "small" }, props)); }; MiniSelect.Option = _select["default"].Option; var _default = MiniSelect; exports["default"] = _default; },{"../select":377,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],356:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcPagination = _interopRequireDefault(require("rc-pagination")); var _en_US = _interopRequireDefault(require("rc-pagination/lib/locale/en_US")); var _classnames = _interopRequireDefault(require("classnames")); var _LeftOutlined = _interopRequireDefault(require("@ant-design/icons/LeftOutlined")); var _RightOutlined = _interopRequireDefault(require("@ant-design/icons/RightOutlined")); var _DoubleLeftOutlined = _interopRequireDefault(require("@ant-design/icons/DoubleLeftOutlined")); var _DoubleRightOutlined = _interopRequireDefault(require("@ant-design/icons/DoubleRightOutlined")); var _MiniSelect = _interopRequireDefault(require("./MiniSelect")); var _select = _interopRequireDefault(require("../select")); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _configProvider = require("../config-provider"); var _useBreakpoint2 = _interopRequireDefault(require("../grid/hooks/useBreakpoint")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Pagination = function Pagination(_a) { var customizePrefixCls = _a.prefixCls, customizeSelectPrefixCls = _a.selectPrefixCls, className = _a.className, size = _a.size, customLocale = _a.locale, restProps = __rest(_a, ["prefixCls", "selectPrefixCls", "className", "size", "locale"]); var _useBreakpoint = (0, _useBreakpoint2["default"])(), xs = _useBreakpoint.xs; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var prefixCls = getPrefixCls('pagination', customizePrefixCls); var getIconsProps = function getIconsProps() { var ellipsis = /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-item-ellipsis") }, "\u2022\u2022\u2022"); var prevIcon = /*#__PURE__*/React.createElement("button", { className: "".concat(prefixCls, "-item-link"), type: "button", tabIndex: -1 }, /*#__PURE__*/React.createElement(_LeftOutlined["default"], null)); var nextIcon = /*#__PURE__*/React.createElement("button", { className: "".concat(prefixCls, "-item-link"), type: "button", tabIndex: -1 }, /*#__PURE__*/React.createElement(_RightOutlined["default"], null)); var jumpPrevIcon = /*#__PURE__*/React.createElement("a", { className: "".concat(prefixCls, "-item-link") }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-container") }, /*#__PURE__*/React.createElement(_DoubleLeftOutlined["default"], { className: "".concat(prefixCls, "-item-link-icon") }), ellipsis)); var jumpNextIcon = /*#__PURE__*/React.createElement("a", { className: "".concat(prefixCls, "-item-link") }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-container") }, /*#__PURE__*/React.createElement(_DoubleRightOutlined["default"], { className: "".concat(prefixCls, "-item-link-icon") }), ellipsis)); // change arrows direction in right-to-left direction if (direction === 'rtl') { var _ref = [nextIcon, prevIcon]; prevIcon = _ref[0]; nextIcon = _ref[1]; var _ref2 = [jumpNextIcon, jumpPrevIcon]; jumpPrevIcon = _ref2[0]; jumpNextIcon = _ref2[1]; } return { prevIcon: prevIcon, nextIcon: nextIcon, jumpPrevIcon: jumpPrevIcon, jumpNextIcon: jumpNextIcon }; }; var renderPagination = function renderPagination(contextLocale) { var locale = (0, _extends2["default"])((0, _extends2["default"])({}, contextLocale), customLocale); var isSmall = size === 'small' || !!(xs && !size && restProps.responsive); var selectPrefixCls = getPrefixCls('select', customizeSelectPrefixCls); var extendedClassName = (0, _classnames["default"])((0, _defineProperty2["default"])({ mini: isSmall }, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); return /*#__PURE__*/React.createElement(_rcPagination["default"], (0, _extends2["default"])({}, restProps, { prefixCls: prefixCls, selectPrefixCls: selectPrefixCls }, getIconsProps(), { className: extendedClassName, selectComponentClass: isSmall ? _MiniSelect["default"] : _select["default"], locale: locale })); }; return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Pagination", defaultLocale: _en_US["default"] }, renderPagination); }; var _default = Pagination; exports["default"] = _default; },{"../config-provider":278,"../grid/hooks/useBreakpoint":314,"../locale-provider/LocaleReceiver":331,"../select":377,"./MiniSelect":355,"@ant-design/icons/DoubleLeftOutlined":74,"@ant-design/icons/DoubleRightOutlined":75,"@ant-design/icons/LeftOutlined":92,"@ant-design/icons/RightOutlined":100,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-pagination":673,"rc-pagination/lib/locale/en_US":674,"react":"react"}],357:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Pagination = _interopRequireDefault(require("./Pagination")); var _default = _Pagination["default"]; exports["default"] = _default; },{"./Pagination":356,"@babel/runtime/helpers/interopRequireDefault":192}],358:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _ExclamationCircleFilled = _interopRequireDefault(require("@ant-design/icons/ExclamationCircleFilled")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _tooltip = _interopRequireDefault(require("../tooltip")); var _button = _interopRequireDefault(require("../button")); var _button2 = require("../button/button"); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _default2 = _interopRequireDefault(require("../locale/default")); var _configProvider = require("../config-provider"); var _getRenderPropValue = require("../_util/getRenderPropValue"); var _reactNode = require("../_util/reactNode"); var _this = void 0; var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Popconfirm = /*#__PURE__*/React.forwardRef(function (props, ref) { var _React$useState = React.useState(props.visible), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1]; React.useEffect(function () { if ('visible' in props) { setVisible(props.visible); } }, [props.visible]); React.useEffect(function () { if ('defaultVisible' in props) { setVisible(props.defaultVisible); } }, [props.defaultVisible]); var settingVisible = function settingVisible(value, e) { if (!('visible' in props)) { setVisible(value); } if (props.onVisibleChange) { props.onVisibleChange(value, e); } }; var onConfirm = function onConfirm(e) { settingVisible(false, e); if (props.onConfirm) { props.onConfirm.call(_this, e); } }; var onCancel = function onCancel(e) { settingVisible(false, e); if (props.onCancel) { props.onCancel.call(_this, e); } }; var _onKeyDown = function onKeyDown(e) { if (e.keyCode === _KeyCode["default"].ESC && visible) { settingVisible(false, e); } }; var onVisibleChange = function onVisibleChange(value) { var disabled = props.disabled; if (disabled) { return; } settingVisible(value); }; var renderOverlay = function renderOverlay(prefixCls, popconfirmLocale) { var okButtonProps = props.okButtonProps, cancelButtonProps = props.cancelButtonProps, title = props.title, cancelText = props.cancelText, okText = props.okText, okType = props.okType, icon = props.icon; return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-inner-content") }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-message") }, icon, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-message-title") }, (0, _getRenderPropValue.getRenderPropValue)(title))), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-buttons") }, /*#__PURE__*/React.createElement(_button["default"], (0, _extends2["default"])({ onClick: onCancel, size: "small" }, cancelButtonProps), cancelText || popconfirmLocale.cancelText), /*#__PURE__*/React.createElement(_button["default"], (0, _extends2["default"])({ onClick: onConfirm }, (0, _button2.convertLegacyProps)(okType), { size: "small" }, okButtonProps), okText || popconfirmLocale.okText))); }; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var customizePrefixCls = props.prefixCls, placement = props.placement, children = props.children, overlayClassName = props.overlayClassName, restProps = __rest(props, ["prefixCls", "placement", "children", "overlayClassName"]); var prefixCls = getPrefixCls('popover', customizePrefixCls); var prefixClsConfirm = getPrefixCls('popconfirm', customizePrefixCls); var overlayClassNames = (0, _classnames["default"])(prefixClsConfirm, overlayClassName); var overlay = /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Popconfirm", defaultLocale: _default2["default"].Popconfirm }, function (popconfirmLocale) { return renderOverlay(prefixCls, popconfirmLocale); }); return /*#__PURE__*/React.createElement(_tooltip["default"], (0, _extends2["default"])({}, restProps, { prefixCls: prefixCls, placement: placement, onVisibleChange: onVisibleChange, visible: visible, overlay: overlay, overlayClassName: overlayClassNames, ref: ref }), (0, _reactNode.cloneElement)(children, { onKeyDown: function onKeyDown(e) { var _a, _b; if ( /*#__PURE__*/React.isValidElement(children)) { (_b = children === null || children === void 0 ? void 0 : (_a = children.props).onKeyDown) === null || _b === void 0 ? void 0 : _b.call(_a, e); } _onKeyDown(e); } })); }); Popconfirm.defaultProps = { transitionName: 'zoom-big', placement: 'top', trigger: 'click', okType: 'primary', icon: /*#__PURE__*/React.createElement(_ExclamationCircleFilled["default"], null), disabled: false }; var _default = Popconfirm; exports["default"] = _default; },{"../_util/getRenderPropValue":215,"../_util/reactNode":223,"../button":257,"../button/button":256,"../config-provider":278,"../locale-provider/LocaleReceiver":331,"../locale/default":335,"../tooltip":422,"@ant-design/icons/ExclamationCircleFilled":81,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-util/lib/KeyCode":865,"react":"react"}],359:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _tooltip = _interopRequireDefault(require("../tooltip")); var _configProvider = require("../config-provider"); var _getRenderPropValue = require("../_util/getRenderPropValue"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Popover = /*#__PURE__*/React.forwardRef(function (_a, ref) { var customizePrefixCls = _a.prefixCls, title = _a.title, content = _a.content, otherProps = __rest(_a, ["prefixCls", "title", "content"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var getOverlay = function getOverlay(prefixCls) { return /*#__PURE__*/React.createElement(React.Fragment, null, title && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-title") }, (0, _getRenderPropValue.getRenderPropValue)(title)), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-inner-content") }, (0, _getRenderPropValue.getRenderPropValue)(content))); }; var prefixCls = getPrefixCls('popover', customizePrefixCls); return /*#__PURE__*/React.createElement(_tooltip["default"], (0, _extends2["default"])({}, otherProps, { prefixCls: prefixCls, ref: ref, overlay: getOverlay(prefixCls) })); }); Popover.displayName = 'Popover'; Popover.defaultProps = { placement: 'top', transitionName: 'zoom-big', trigger: 'hover', mouseEnterDelay: 0.1, mouseLeaveDelay: 0.1, overlayStyle: {} }; var _default = Popover; exports["default"] = _default; },{"../_util/getRenderPropValue":215,"../config-provider":278,"../tooltip":422,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],360:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _rcProgress = require("rc-progress"); var _colors = require("@ant-design/colors"); var _classnames = _interopRequireDefault(require("classnames")); var _utils = require("./utils"); function getPercentage(_ref) { var percent = _ref.percent, success = _ref.success, successPercent = _ref.successPercent; var ptg = (0, _utils.validProgress)(percent); var realSuccessPercent = (0, _utils.getSuccessPercent)({ success: success, successPercent: successPercent }); if (!realSuccessPercent) { return ptg; } return [(0, _utils.validProgress)(realSuccessPercent), (0, _utils.validProgress)(ptg - (0, _utils.validProgress)(realSuccessPercent))]; } function getStrokeColor(_ref2) { var success = _ref2.success, strokeColor = _ref2.strokeColor, successPercent = _ref2.successPercent; var color = strokeColor || null; var realSuccessPercent = (0, _utils.getSuccessPercent)({ success: success, successPercent: successPercent }); if (!realSuccessPercent) { return color; } return [_colors.presetPrimaryColors.green, color]; } var Circle = function Circle(props) { var prefixCls = props.prefixCls, width = props.width, strokeWidth = props.strokeWidth, trailColor = props.trailColor, strokeLinecap = props.strokeLinecap, gapPosition = props.gapPosition, gapDegree = props.gapDegree, type = props.type, children = props.children; var circleSize = width || 120; var circleStyle = { width: circleSize, height: circleSize, fontSize: circleSize * 0.15 + 6 }; var circleWidth = strokeWidth || 6; var gapPos = gapPosition || type === 'dashboard' && 'bottom' || 'top'; var getGapDegree = function getGapDegree() { // Support gapDeg = 0 when type = 'dashboard' if (gapDegree || gapDegree === 0) { return gapDegree; } if (type === 'dashboard') { return 75; } return undefined; }; // using className to style stroke color var strokeColor = getStrokeColor(props); var isGradient = Object.prototype.toString.call(strokeColor) === '[object Object]'; var wrapperClassName = (0, _classnames["default"])("".concat(prefixCls, "-inner"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-circle-gradient"), isGradient)); return /*#__PURE__*/React.createElement("div", { className: wrapperClassName, style: circleStyle }, /*#__PURE__*/React.createElement(_rcProgress.Circle, { percent: getPercentage(props), strokeWidth: circleWidth, trailWidth: circleWidth, strokeColor: strokeColor, strokeLinecap: strokeLinecap, trailColor: trailColor, prefixCls: prefixCls, gapDegree: getGapDegree(), gapPosition: gapPos }), children); }; var _default = Circle; exports["default"] = _default; },{"./utils":365,"@ant-design/colors":2,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-progress":724,"react":"react"}],361:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.handleGradient = exports.sortGradient = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _colors = require("@ant-design/colors"); var _utils = require("./utils"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; /** * { * '0%': '#afc163', * '75%': '#009900', * '50%': 'green', ====> '#afc163 0%, #66FF00 25%, #00CC00 50%, #009900 75%, #ffffff 100%' * '25%': '#66FF00', * '100%': '#ffffff' * } */ var sortGradient = function sortGradient(gradients) { var tempArr = []; Object.keys(gradients).forEach(function (key) { var formattedKey = parseFloat(key.replace(/%/g, '')); if (!isNaN(formattedKey)) { tempArr.push({ key: formattedKey, value: gradients[key] }); } }); tempArr = tempArr.sort(function (a, b) { return a.key - b.key; }); return tempArr.map(function (_ref) { var key = _ref.key, value = _ref.value; return "".concat(value, " ").concat(key, "%"); }).join(', '); }; /** * { * '0%': '#afc163', * '25%': '#66FF00', * '50%': '#00CC00', ====> linear-gradient(to right, #afc163 0%, #66FF00 25%, * '75%': '#009900', #00CC00 50%, #009900 75%, #ffffff 100%) * '100%': '#ffffff' * } * * Then this man came to realize the truth: * Besides six pence, there is the moon. * Besides bread and butter, there is the bug. * And... * Besides women, there is the code. */ exports.sortGradient = sortGradient; var handleGradient = function handleGradient(strokeColor) { var _strokeColor$from = strokeColor.from, from = _strokeColor$from === void 0 ? _colors.presetPrimaryColors.blue : _strokeColor$from, _strokeColor$to = strokeColor.to, to = _strokeColor$to === void 0 ? _colors.presetPrimaryColors.blue : _strokeColor$to, _strokeColor$directio = strokeColor.direction, direction = _strokeColor$directio === void 0 ? 'to right' : _strokeColor$directio, rest = __rest(strokeColor, ["from", "to", "direction"]); if (Object.keys(rest).length !== 0) { var sortedGradients = sortGradient(rest); return { backgroundImage: "linear-gradient(".concat(direction, ", ").concat(sortedGradients, ")") }; } return { backgroundImage: "linear-gradient(".concat(direction, ", ").concat(from, ", ").concat(to, ")") }; }; exports.handleGradient = handleGradient; var Line = function Line(props) { var prefixCls = props.prefixCls, percent = props.percent, strokeWidth = props.strokeWidth, size = props.size, strokeColor = props.strokeColor, strokeLinecap = props.strokeLinecap, children = props.children, trailColor = props.trailColor, success = props.success; var backgroundProps = strokeColor && typeof strokeColor !== 'string' ? handleGradient(strokeColor) : { background: strokeColor }; var trailStyle = trailColor ? { backgroundColor: trailColor } : undefined; var percentStyle = (0, _extends2["default"])({ width: "".concat((0, _utils.validProgress)(percent), "%"), height: strokeWidth || (size === 'small' ? 6 : 8), borderRadius: strokeLinecap === 'square' ? 0 : '' }, backgroundProps); var successPercent = (0, _utils.getSuccessPercent)(props); var successPercentStyle = { width: "".concat((0, _utils.validProgress)(successPercent), "%"), height: strokeWidth || (size === 'small' ? 6 : 8), borderRadius: strokeLinecap === 'square' ? 0 : '', backgroundColor: success === null || success === void 0 ? void 0 : success.strokeColor }; var successSegment = successPercent !== undefined ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-success-bg"), style: successPercentStyle }) : null; return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-outer") }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-inner"), style: trailStyle }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-bg"), style: percentStyle }), successSegment)), children); }; var _default = Line; exports["default"] = _default; },{"./utils":365,"@ant-design/colors":2,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],362:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var Steps = function Steps(props) { var size = props.size, steps = props.steps, _props$percent = props.percent, percent = _props$percent === void 0 ? 0 : _props$percent, _props$strokeWidth = props.strokeWidth, strokeWidth = _props$strokeWidth === void 0 ? 8 : _props$strokeWidth, strokeColor = props.strokeColor, trailColor = props.trailColor, prefixCls = props.prefixCls, children = props.children; var current = Math.floor(steps * (percent / 100)); var stepWidth = size === 'small' ? 2 : 14; var styledSteps = []; for (var i = 0; i < steps; i += 1) { styledSteps.push( /*#__PURE__*/React.createElement("div", { key: i, className: (0, _classnames["default"])("".concat(prefixCls, "-steps-item"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-steps-item-active"), i <= current - 1)), style: { backgroundColor: i <= current - 1 ? strokeColor : trailColor, width: stepWidth, height: strokeWidth } })); } return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-steps-outer") }, styledSteps, children); }; var _default = Steps; exports["default"] = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],363:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _progress = _interopRequireDefault(require("./progress")); var _default = _progress["default"]; exports["default"] = _default; },{"./progress":364,"@babel/runtime/helpers/interopRequireDefault":192}],364:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _CheckOutlined = _interopRequireDefault(require("@ant-design/icons/CheckOutlined")); var _CheckCircleFilled = _interopRequireDefault(require("@ant-design/icons/CheckCircleFilled")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _configProvider = require("../config-provider"); var _type = require("../_util/type"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _Line = _interopRequireDefault(require("./Line")); var _Circle = _interopRequireDefault(require("./Circle")); var _Steps = _interopRequireDefault(require("./Steps")); var _utils = require("./utils"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var ProgressTypes = (0, _type.tuple)('line', 'circle', 'dashboard'); var ProgressStatuses = (0, _type.tuple)('normal', 'exception', 'active', 'success'); var Progress = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Progress, _React$Component); var _super = (0, _createSuper2["default"])(Progress); function Progress() { var _this; (0, _classCallCheck2["default"])(this, Progress); _this = _super.apply(this, arguments); _this.renderProgress = function (_ref) { var _classNames; var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var _assertThisInitialize = (0, _assertThisInitialized2["default"])(_this), props = _assertThisInitialize.props; var customizePrefixCls = props.prefixCls, className = props.className, size = props.size, type = props.type, steps = props.steps, showInfo = props.showInfo, strokeColor = props.strokeColor, restProps = __rest(props, ["prefixCls", "className", "size", "type", "steps", "showInfo", "strokeColor"]); var prefixCls = getPrefixCls('progress', customizePrefixCls); var progressStatus = _this.getProgressStatus(); var progressInfo = _this.renderProcessInfo(prefixCls, progressStatus); (0, _devWarning["default"])(!('successPercent' in props), 'Progress', '`successPercent` is deprecated. Please use `success.percent` instead.'); var progress; // Render progress shape if (type === 'line') { progress = steps ? /*#__PURE__*/React.createElement(_Steps["default"], (0, _extends2["default"])({}, _this.props, { strokeColor: typeof strokeColor === 'string' ? strokeColor : undefined, prefixCls: prefixCls, steps: steps }), progressInfo) : /*#__PURE__*/React.createElement(_Line["default"], (0, _extends2["default"])({}, _this.props, { prefixCls: prefixCls }), progressInfo); } else if (type === 'circle' || type === 'dashboard') { progress = /*#__PURE__*/React.createElement(_Circle["default"], (0, _extends2["default"])({}, _this.props, { prefixCls: prefixCls, progressStatus: progressStatus }), progressInfo); } var classString = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(type === 'dashboard' && 'circle' || steps && 'steps' || type), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-status-").concat(progressStatus), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-show-info"), showInfo), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(size), size), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, (0, _omit["default"])(restProps, ['status', 'format', 'trailColor', 'strokeWidth', 'width', 'gapDegree', 'gapPosition', 'strokeColor', 'strokeLinecap', 'percent', 'steps', 'success', 'successPercent']), { className: classString }), progress); }; return _this; } (0, _createClass2["default"])(Progress, [{ key: "getPercentNumber", value: function getPercentNumber() { var _this$props$percent = this.props.percent, percent = _this$props$percent === void 0 ? 0 : _this$props$percent; var successPercent = (0, _utils.getSuccessPercent)(this.props); return parseInt(successPercent !== undefined ? successPercent.toString() : percent.toString(), 10); } }, { key: "getProgressStatus", value: function getProgressStatus() { var status = this.props.status; if (ProgressStatuses.indexOf(status) < 0 && this.getPercentNumber() >= 100) { return 'success'; } return status || 'normal'; } }, { key: "renderProcessInfo", value: function renderProcessInfo(prefixCls, progressStatus) { var _this$props = this.props, showInfo = _this$props.showInfo, format = _this$props.format, type = _this$props.type, percent = _this$props.percent; var successPercent = (0, _utils.getSuccessPercent)(this.props); if (!showInfo) return null; var text; var textFormatter = format || function (percentNumber) { return "".concat(percentNumber, "%"); }; var isLineType = type === 'line'; if (format || progressStatus !== 'exception' && progressStatus !== 'success') { text = textFormatter((0, _utils.validProgress)(percent), (0, _utils.validProgress)(successPercent)); } else if (progressStatus === 'exception') { text = isLineType ? /*#__PURE__*/React.createElement(_CloseCircleFilled["default"], null) : /*#__PURE__*/React.createElement(_CloseOutlined["default"], null); } else if (progressStatus === 'success') { text = isLineType ? /*#__PURE__*/React.createElement(_CheckCircleFilled["default"], null) : /*#__PURE__*/React.createElement(_CheckOutlined["default"], null); } return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-text"), title: typeof text === 'string' ? text : undefined }, text); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderProgress); } }]); return Progress; }(React.Component); exports["default"] = Progress; Progress.defaultProps = { type: 'line', percent: 0, showInfo: true, // null for different theme definition trailColor: null, size: 'default', gapDegree: undefined, strokeLinecap: 'round' }; },{"../_util/devWarning":212,"../_util/type":230,"../config-provider":278,"./Circle":360,"./Line":361,"./Steps":362,"./utils":365,"@ant-design/icons/CheckCircleFilled":65,"@ant-design/icons/CheckOutlined":67,"@ant-design/icons/CloseCircleFilled":69,"@ant-design/icons/CloseOutlined":71,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"react":"react"}],365:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.validProgress = validProgress; exports.getSuccessPercent = getSuccessPercent; var _devWarning = _interopRequireDefault(require("../_util/devWarning")); function validProgress(progress) { if (!progress || progress < 0) { return 0; } if (progress > 100) { return 100; } return progress; } function getSuccessPercent(_ref) { var success = _ref.success, successPercent = _ref.successPercent; var percent = successPercent; /** @deprecated Use `percent` instead */ if (success && 'progress' in success) { (0, _devWarning["default"])(false, 'Progress', '`success.progress` is deprecated. Please use `success.percent` instead.'); percent = success.progress; } if (success && 'percent' in success) { percent = success.percent; } return percent; } },{"../_util/devWarning":212,"@babel/runtime/helpers/interopRequireDefault":192}],366:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.RadioGroupContextProvider = void 0; var React = _interopRequireWildcard(require("react")); var RadioGroupContext = /*#__PURE__*/React.createContext(null); var RadioGroupContextProvider = RadioGroupContext.Provider; exports.RadioGroupContextProvider = RadioGroupContextProvider; var _default = RadioGroupContext; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],367:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _radio = _interopRequireDefault(require("./radio")); var _configProvider = require("../config-provider"); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var _context = require("./context"); var RadioGroup = /*#__PURE__*/React.forwardRef(function (props, ref) { var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var size = React.useContext(_SizeContext["default"]); var _useMergedState = (0, _useMergedState3["default"])(props.defaultValue, { value: props.value }), _useMergedState2 = (0, _slicedToArray2["default"])(_useMergedState, 2), value = _useMergedState2[0], setValue = _useMergedState2[1]; var onRadioChange = function onRadioChange(ev) { var lastValue = value; var val = ev.target.value; if (!('value' in props)) { setValue(val); } var onChange = props.onChange; if (onChange && val !== lastValue) { onChange(ev); } }; var renderGroup = function renderGroup() { var _classNames; var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? '' : _props$className, options = props.options, optionType = props.optionType, buttonStyle = props.buttonStyle, disabled = props.disabled, children = props.children, customizeSize = props.size, style = props.style, id = props.id, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave; var prefixCls = getPrefixCls('radio', customizePrefixCls); var groupPrefixCls = "".concat(prefixCls, "-group"); var childrenToRender = children; // 如果存在 options, 优先使用 if (options && options.length > 0) { var optionsPrefixCls = optionType === 'button' ? "".concat(prefixCls, "-button") : prefixCls; childrenToRender = options.map(function (option) { if (typeof option === 'string') { // 此处类型自动推导为 string return /*#__PURE__*/React.createElement(_radio["default"], { key: option, prefixCls: optionsPrefixCls, disabled: disabled, value: option, checked: value === option }, option); } // 此处类型自动推导为 { label: string value: string } return /*#__PURE__*/React.createElement(_radio["default"], { key: "radio-group-value-options-".concat(option.value), prefixCls: optionsPrefixCls, disabled: option.disabled || disabled, value: option.value, checked: value === option.value, style: option.style }, option.label); }); } var mergedSize = customizeSize || size; var classString = (0, _classnames["default"])(groupPrefixCls, "".concat(groupPrefixCls, "-").concat(buttonStyle), (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(groupPrefixCls, "-").concat(mergedSize), mergedSize), (0, _defineProperty2["default"])(_classNames, "".concat(groupPrefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement("div", { className: classString, style: style, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, id: id, ref: ref }, childrenToRender); }; return /*#__PURE__*/React.createElement(_context.RadioGroupContextProvider, { value: { onChange: onRadioChange, value: value, disabled: props.disabled, name: props.name } }, renderGroup()); }); RadioGroup.defaultProps = { buttonStyle: 'outline' }; var _default = /*#__PURE__*/React.memo(RadioGroup); exports["default"] = _default; },{"../config-provider":278,"../config-provider/SizeContext":276,"./context":366,"./radio":369,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-util/lib/hooks/useMergedState":871,"react":"react"}],368:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Group", { enumerable: true, get: function get() { return _group["default"]; } }); Object.defineProperty(exports, "Button", { enumerable: true, get: function get() { return _radioButton["default"]; } }); exports["default"] = void 0; var _radio = _interopRequireDefault(require("./radio")); var _group = _interopRequireDefault(require("./group")); var _radioButton = _interopRequireDefault(require("./radioButton")); var Radio = _radio["default"]; Radio.Button = _radioButton["default"]; Radio.Group = _group["default"]; var _default = Radio; exports["default"] = _default; },{"./group":367,"./radio":369,"./radioButton":370,"@babel/runtime/helpers/interopRequireDefault":192}],369:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcCheckbox = _interopRequireDefault(require("rc-checkbox")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _context = _interopRequireDefault(require("./context")); var _ref = require("../_util/ref"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var InternalRadio = function InternalRadio(props, ref) { var _classNames; var context = React.useContext(_context["default"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var innerRef = React.useRef(); var mergedRef = (0, _ref.composeRef)(ref, innerRef); React.useEffect(function () { (0, _devWarning["default"])(!('optionType' in props), 'Radio', '`optionType` is only support in Radio.Group.'); }, []); var onChange = function onChange(e) { if (props.onChange) { props.onChange(e); } if (context === null || context === void 0 ? void 0 : context.onChange) { context.onChange(e); } }; var customizePrefixCls = props.prefixCls, className = props.className, children = props.children, style = props.style, restProps = __rest(props, ["prefixCls", "className", "children", "style"]); var prefixCls = getPrefixCls('radio', customizePrefixCls); var radioProps = (0, _extends2["default"])({}, restProps); if (context) { radioProps.name = context.name; radioProps.onChange = onChange; radioProps.checked = props.value === context.value; radioProps.disabled = props.disabled || context.disabled; } var wrapperClassString = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-wrapper"), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-wrapper-checked"), radioProps.checked), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-wrapper-disabled"), radioProps.disabled), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-wrapper-rtl"), direction === 'rtl'), _classNames), className); return ( /*#__PURE__*/ // eslint-disable-next-line jsx-a11y/label-has-associated-control React.createElement("label", { className: wrapperClassString, style: style, onMouseEnter: props.onMouseEnter, onMouseLeave: props.onMouseLeave }, /*#__PURE__*/React.createElement(_rcCheckbox["default"], (0, _extends2["default"])({}, radioProps, { prefixCls: prefixCls, ref: mergedRef })), children !== undefined ? /*#__PURE__*/React.createElement("span", null, children) : null) ); }; var Radio = /*#__PURE__*/React.forwardRef(InternalRadio); Radio.displayName = 'Radio'; Radio.defaultProps = { type: 'radio' }; var _default = Radio; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/ref":224,"../config-provider":278,"./context":366,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-checkbox":596,"react":"react"}],370:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _radio = _interopRequireDefault(require("./radio")); var _configProvider = require("../config-provider"); var _context = _interopRequireDefault(require("./context")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var RadioButton = function RadioButton(props, ref) { var radioGroupContext = React.useContext(_context["default"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var customizePrefixCls = props.prefixCls, radioProps = __rest(props, ["prefixCls"]); var prefixCls = getPrefixCls('radio-button', customizePrefixCls); if (radioGroupContext) { radioProps.checked = props.value === radioGroupContext.value; radioProps.disabled = props.disabled || radioGroupContext.disabled; } return /*#__PURE__*/React.createElement(_radio["default"], (0, _extends2["default"])({ prefixCls: prefixCls }, radioProps, { type: "radio", ref: ref })); }; var _default = /*#__PURE__*/React.forwardRef(RadioButton); exports["default"] = _default; },{"../config-provider":278,"./context":366,"./radio":369,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],371:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcRate = _interopRequireDefault(require("rc-rate")); var _StarFilled = _interopRequireDefault(require("@ant-design/icons/StarFilled")); var _tooltip = _interopRequireDefault(require("../tooltip")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Rate = /*#__PURE__*/React.forwardRef(function (_a, ref) { var prefixCls = _a.prefixCls, tooltips = _a.tooltips, props = __rest(_a, ["prefixCls", "tooltips"]); var characterRender = function characterRender(node, _ref) { var index = _ref.index; if (!tooltips) return node; return /*#__PURE__*/React.createElement(_tooltip["default"], { title: tooltips[index] }, node); }; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var ratePrefixCls = getPrefixCls('rate', prefixCls); return /*#__PURE__*/React.createElement(_rcRate["default"], (0, _extends2["default"])({ ref: ref, characterRender: characterRender }, props, { prefixCls: ratePrefixCls, direction: direction })); }); Rate.displayName = 'Rate'; Rate.defaultProps = { character: /*#__PURE__*/React.createElement(_StarFilled["default"], null) }; var _default = Rate; exports["default"] = _default; },{"../config-provider":278,"../tooltip":422,"@ant-design/icons/StarFilled":104,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-rate":727,"react":"react"}],372:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.ExceptionMap = exports.IconMap = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _CheckCircleFilled = _interopRequireDefault(require("@ant-design/icons/CheckCircleFilled")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _ExclamationCircleFilled = _interopRequireDefault(require("@ant-design/icons/ExclamationCircleFilled")); var _WarningFilled = _interopRequireDefault(require("@ant-design/icons/WarningFilled")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _noFound = _interopRequireDefault(require("./noFound")); var _serverError = _interopRequireDefault(require("./serverError")); var _unauthorized = _interopRequireDefault(require("./unauthorized")); var IconMap = { success: _CheckCircleFilled["default"], error: _CloseCircleFilled["default"], info: _ExclamationCircleFilled["default"], warning: _WarningFilled["default"] }; exports.IconMap = IconMap; var ExceptionMap = { '404': _noFound["default"], '500': _serverError["default"], '403': _unauthorized["default"] }; // ExceptionImageMap keys exports.ExceptionMap = ExceptionMap; var ExceptionStatus = Object.keys(ExceptionMap); /** * render icon * if ExceptionStatus includes ,render svg image * else render iconNode * @param prefixCls * @param {status, icon} */ var renderIcon = function renderIcon(prefixCls, _ref) { var status = _ref.status, icon = _ref.icon; var className = (0, _classnames["default"])("".concat(prefixCls, "-icon")); (0, _devWarning["default"])(!(typeof icon === 'string' && icon.length > 2), 'Result', "`icon` is using ReactNode instead of string naming in v4. Please check `".concat(icon, "` at https://ant.design/components/icon")); if (ExceptionStatus.includes("".concat(status))) { var SVGComponent = ExceptionMap[status]; return /*#__PURE__*/React.createElement("div", { className: "".concat(className, " ").concat(prefixCls, "-image") }, /*#__PURE__*/React.createElement(SVGComponent, null)); } var iconNode = /*#__PURE__*/React.createElement(IconMap[status]); return /*#__PURE__*/React.createElement("div", { className: className }, icon || iconNode); }; var renderExtra = function renderExtra(prefixCls, _ref2) { var extra = _ref2.extra; return extra && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-extra") }, extra); }; var Result = function Result(props) { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref3) { var getPrefixCls = _ref3.getPrefixCls, direction = _ref3.direction; var customizePrefixCls = props.prefixCls, customizeClassName = props.className, subTitle = props.subTitle, title = props.title, style = props.style, children = props.children, status = props.status; var prefixCls = getPrefixCls('result', customizePrefixCls); var className = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-").concat(status), customizeClassName, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl')); return /*#__PURE__*/React.createElement("div", { className: className, style: style }, renderIcon(prefixCls, props), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-title") }, title), subTitle && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-subtitle") }, subTitle), renderExtra(prefixCls, props), children && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-content") }, children)); }); }; Result.defaultProps = { status: 'info' }; // eslint-disable-next-line prefer-destructuring Result.PRESENTED_IMAGE_403 = ExceptionMap[403]; // eslint-disable-next-line prefer-destructuring Result.PRESENTED_IMAGE_404 = ExceptionMap[404]; // eslint-disable-next-line prefer-destructuring Result.PRESENTED_IMAGE_500 = ExceptionMap[500]; var _default = Result; exports["default"] = _default; },{"../_util/devWarning":212,"../config-provider":278,"./noFound":373,"./serverError":374,"./unauthorized":375,"@ant-design/icons/CheckCircleFilled":65,"@ant-design/icons/CloseCircleFilled":69,"@ant-design/icons/ExclamationCircleFilled":81,"@ant-design/icons/WarningFilled":108,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],373:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var NoFound = function NoFound() { return /*#__PURE__*/React.createElement("svg", { width: "252", height: "294" }, /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/React.createElement("path", { d: "M0 .387h251.772v251.772H0z" })), /*#__PURE__*/React.createElement("g", { fill: "none", fillRule: "evenodd" }, /*#__PURE__*/React.createElement("g", { transform: "translate(0 .012)" }, /*#__PURE__*/React.createElement("mask", { fill: "#fff" }), /*#__PURE__*/React.createElement("path", { d: "M0 127.32v-2.095C0 56.279 55.892.387 124.838.387h2.096c68.946 0 124.838 55.892 124.838 124.838v2.096c0 68.946-55.892 124.838-124.838 124.838h-2.096C55.892 252.16 0 196.267 0 127.321", fill: "#E4EBF7", mask: "url(#b)" })), /*#__PURE__*/React.createElement("path", { d: "M39.755 130.84a8.276 8.276 0 1 1-16.468-1.66 8.276 8.276 0 0 1 16.468 1.66", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M36.975 134.297l10.482 5.943M48.373 146.508l-12.648 10.788", stroke: "#FFF", strokeWidth: "2" }), /*#__PURE__*/React.createElement("path", { d: "M39.875 159.352a5.667 5.667 0 1 1-11.277-1.136 5.667 5.667 0 0 1 11.277 1.136M57.588 143.247a5.708 5.708 0 1 1-11.358-1.145 5.708 5.708 0 0 1 11.358 1.145M99.018 26.875l29.82-.014a4.587 4.587 0 1 0-.003-9.175l-29.82.013a4.587 4.587 0 1 0 .003 9.176M110.424 45.211l29.82-.013a4.588 4.588 0 0 0-.004-9.175l-29.82.013a4.587 4.587 0 1 0 .004 9.175", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M112.798 26.861v-.002l15.784-.006a4.588 4.588 0 1 0 .003 9.175l-15.783.007v-.002a4.586 4.586 0 0 0-.004-9.172M184.523 135.668c-.553 5.485-5.447 9.483-10.931 8.93-5.485-.553-9.483-5.448-8.93-10.932.552-5.485 5.447-9.483 10.932-8.93 5.485.553 9.483 5.447 8.93 10.932", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M179.26 141.75l12.64 7.167M193.006 156.477l-15.255 13.011", stroke: "#FFF", strokeWidth: "2" }), /*#__PURE__*/React.createElement("path", { d: "M184.668 170.057a6.835 6.835 0 1 1-13.6-1.372 6.835 6.835 0 0 1 13.6 1.372M203.34 153.325a6.885 6.885 0 1 1-13.7-1.382 6.885 6.885 0 0 1 13.7 1.382", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M151.931 192.324a2.222 2.222 0 1 1-4.444 0 2.222 2.222 0 0 1 4.444 0zM225.27 116.056a2.222 2.222 0 1 1-4.445 0 2.222 2.222 0 0 1 4.444 0zM216.38 151.08a2.223 2.223 0 1 1-4.446-.001 2.223 2.223 0 0 1 4.446 0zM176.917 107.636a2.223 2.223 0 1 1-4.445 0 2.223 2.223 0 0 1 4.445 0zM195.291 92.165a2.223 2.223 0 1 1-4.445 0 2.223 2.223 0 0 1 4.445 0zM202.058 180.711a2.223 2.223 0 1 1-4.446 0 2.223 2.223 0 0 1 4.446 0z", stroke: "#FFF", strokeWidth: "2" }), /*#__PURE__*/React.createElement("path", { stroke: "#FFF", strokeWidth: "2", d: "M214.404 153.302l-1.912 20.184-10.928 5.99M173.661 174.792l-6.356 9.814h-11.36l-4.508 6.484M174.941 125.168v-15.804M220.824 117.25l-12.84 7.901-15.31-7.902V94.39" }), /*#__PURE__*/React.createElement("path", { d: "M166.588 65.936h-3.951a4.756 4.756 0 0 1-4.743-4.742 4.756 4.756 0 0 1 4.743-4.743h3.951a4.756 4.756 0 0 1 4.743 4.743 4.756 4.756 0 0 1-4.743 4.742", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M174.823 30.03c0-16.281 13.198-29.48 29.48-29.48 16.28 0 29.48 13.199 29.48 29.48 0 16.28-13.2 29.48-29.48 29.48-16.282 0-29.48-13.2-29.48-29.48", fill: "#1890FF" }), /*#__PURE__*/React.createElement("path", { d: "M205.952 38.387c.5.5.785 1.142.785 1.928s-.286 1.465-.785 1.964c-.572.5-1.214.75-2 .75-.785 0-1.429-.285-1.929-.785-.572-.5-.82-1.143-.82-1.929s.248-1.428.82-1.928c.5-.5 1.144-.75 1.93-.75.785 0 1.462.25 1.999.75m4.285-19.463c1.428 1.249 2.143 2.963 2.143 5.142 0 1.712-.427 3.13-1.219 4.25-.067.096-.137.18-.218.265-.416.429-1.41 1.346-2.956 2.699a5.07 5.07 0 0 0-1.428 1.75 5.207 5.207 0 0 0-.536 2.357v.5h-4.107v-.5c0-1.357.215-2.536.714-3.5.464-.964 1.857-2.464 4.178-4.536l.43-.5c.643-.785.964-1.643.964-2.535 0-1.18-.358-2.108-1-2.785-.678-.68-1.643-1.001-2.858-1.001-1.536 0-2.642.464-3.357 1.43-.37.5-.621 1.135-.76 1.904a1.999 1.999 0 0 1-1.971 1.63h-.004c-1.277 0-2.257-1.183-1.98-2.43.337-1.518 1.02-2.78 2.073-3.784 1.536-1.5 3.607-2.25 6.25-2.25 2.32 0 4.214.607 5.642 1.894", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M52.04 76.131s21.81 5.36 27.307 15.945c5.575 10.74-6.352 9.26-15.73 4.935-10.86-5.008-24.7-11.822-11.577-20.88", fill: "#FFB594" }), /*#__PURE__*/React.createElement("path", { d: "M90.483 67.504l-.449 2.893c-.753.49-4.748-2.663-4.748-2.663l-1.645.748-1.346-5.684s6.815-4.589 8.917-5.018c2.452-.501 9.884.94 10.7 2.278 0 0 1.32.486-2.227.69-3.548.203-5.043.447-6.79 3.132-1.747 2.686-2.412 3.624-2.412 3.624", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M128.055 111.367c-2.627-7.724-6.15-13.18-8.917-15.478-3.5-2.906-9.34-2.225-11.366-4.187-1.27-1.231-3.215-1.197-3.215-1.197s-14.98-3.158-16.828-3.479c-2.37-.41-2.124-.714-6.054-1.405-1.57-1.907-2.917-1.122-2.917-1.122l-7.11-1.383c-.853-1.472-2.423-1.023-2.423-1.023l-2.468-.897c-1.645 9.976-7.74 13.796-7.74 13.796 1.795 1.122 15.703 8.3 15.703 8.3l5.107 37.11s-3.321 5.694 1.346 9.109c0 0 19.883-3.743 34.921-.329 0 0 3.047-2.546.972-8.806.523-3.01 1.394-8.263 1.736-11.622.385.772 2.019 1.918 3.14 3.477 0 0 9.407-7.365 11.052-14.012-.832-.723-1.598-1.585-2.267-2.453-.567-.736-.358-2.056-.765-2.717-.669-1.084-1.804-1.378-1.907-1.682", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M101.09 289.998s4.295 2.041 7.354 1.021c2.821-.94 4.53.668 7.08 1.178 2.55.51 6.874 1.1 11.686-1.26-.103-5.51-6.889-3.98-11.96-6.713-2.563-1.38-3.784-4.722-3.598-8.799h-9.402s-1.392 10.52-1.16 14.573", fill: "#CBD1D1" }), /*#__PURE__*/React.createElement("path", { d: "M101.067 289.826s2.428 1.271 6.759.653c3.058-.437 3.712.481 7.423 1.031 3.712.55 10.724-.069 11.823-.894.413 1.1-.343 2.063-.343 2.063s-1.512.603-4.812.824c-2.03.136-5.8.291-7.607-.503-1.787-1.375-5.247-1.903-5.728-.241-3.918.95-7.355-.286-7.355-.286l-.16-2.647z", fill: "#2B0849" }), /*#__PURE__*/React.createElement("path", { d: "M108.341 276.044h3.094s-.103 6.702 4.536 8.558c-4.64.618-8.558-2.303-7.63-8.558", fill: "#A4AABA" }), /*#__PURE__*/React.createElement("path", { d: "M57.542 272.401s-2.107 7.416-4.485 12.306c-1.798 3.695-4.225 7.492 5.465 7.492 6.648 0 8.953-.48 7.423-6.599-1.53-6.12.266-13.199.266-13.199h-8.669z", fill: "#CBD1D1" }), /*#__PURE__*/React.createElement("path", { d: "M51.476 289.793s2.097 1.169 6.633 1.169c6.083 0 8.249-1.65 8.249-1.65s.602 1.114-.619 2.165c-.993.855-3.597 1.591-7.39 1.546-4.145-.048-5.832-.566-6.736-1.168-.825-.55-.687-1.58-.137-2.062", fill: "#2B0849" }), /*#__PURE__*/React.createElement("path", { d: "M58.419 274.304s.033 1.519-.314 2.93c-.349 1.42-1.078 3.104-1.13 4.139-.058 1.151 4.537 1.58 5.155.034.62-1.547 1.294-6.427 1.913-7.252.619-.825-4.903-2.119-5.624.15", fill: "#A4AABA" }), /*#__PURE__*/React.createElement("path", { d: "M99.66 278.514l13.378.092s1.298-54.52 1.853-64.403c.554-9.882 3.776-43.364 1.002-63.128l-12.547-.644-22.849.78s-.434 3.966-1.195 9.976c-.063.496-.682.843-.749 1.365-.075.585.423 1.354.32 1.966-2.364 14.08-6.377 33.104-8.744 46.677-.116.666-1.234 1.009-1.458 2.691-.04.302.211 1.525.112 1.795-6.873 18.744-10.949 47.842-14.277 61.885l14.607-.014s2.197-8.57 4.03-16.97c2.811-12.886 23.111-85.01 23.111-85.01l3.016-.521 1.043 46.35s-.224 1.234.337 2.02c.56.785-.56 1.123-.392 2.244l.392 1.794s-.449 7.178-.898 11.89c-.448 4.71-.092 39.165-.092 39.165", fill: "#7BB2F9" }), /*#__PURE__*/React.createElement("path", { d: "M76.085 221.626c1.153.094 4.038-2.019 6.955-4.935M106.36 225.142s2.774-1.11 6.103-3.883", stroke: "#648BD8", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M107.275 222.1s2.773-1.11 6.102-3.884", stroke: "#648BD8", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M74.74 224.767s2.622-.591 6.505-3.365M86.03 151.634c-.27 3.106.3 8.525-4.336 9.123M103.625 149.88s.11 14.012-1.293 15.065c-2.219 1.664-2.99 1.944-2.99 1.944M99.79 150.438s.035 12.88-1.196 24.377M93.673 175.911s7.212-1.664 9.431-1.664M74.31 205.861a212.013 212.013 0 0 1-.979 4.56s-1.458 1.832-1.009 3.776c.449 1.944-.947 2.045-4.985 15.355-1.696 5.59-4.49 18.591-6.348 27.597l-.231 1.12M75.689 197.807a320.934 320.934 0 0 1-.882 4.754M82.591 152.233L81.395 162.7s-1.097.15-.5 2.244c.113 1.346-2.674 15.775-5.18 30.43M56.12 274.418h13.31", stroke: "#648BD8", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M116.241 148.22s-17.047-3.104-35.893.2c.158 2.514-.003 4.15-.003 4.15s14.687-2.818 35.67-.312c.252-2.355.226-4.038.226-4.038", fill: "#192064" }), /*#__PURE__*/React.createElement("path", { d: "M106.322 151.165l.003-4.911a.81.81 0 0 0-.778-.815c-2.44-.091-5.066-.108-7.836-.014a.818.818 0 0 0-.789.815l-.003 4.906a.81.81 0 0 0 .831.813c2.385-.06 4.973-.064 7.73.017a.815.815 0 0 0 .842-.81", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M105.207 150.233l.002-3.076a.642.642 0 0 0-.619-.646 94.321 94.321 0 0 0-5.866-.01.65.65 0 0 0-.63.647v3.072a.64.64 0 0 0 .654.644 121.12 121.12 0 0 1 5.794.011c.362.01.665-.28.665-.642", fill: "#192064" }), /*#__PURE__*/React.createElement("path", { d: "M100.263 275.415h12.338M101.436 270.53c.006 3.387.042 5.79.111 6.506M101.451 264.548a915.75 915.75 0 0 0-.015 4.337M100.986 174.965l.898 44.642s.673 1.57-.225 2.692c-.897 1.122 2.468.673.898 2.243-1.57 1.57.897 1.122 0 3.365-.596 1.489-.994 21.1-1.096 35.146", stroke: "#648BD8", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M46.876 83.427s-.516 6.045 7.223 5.552c11.2-.712 9.218-9.345 31.54-21.655-.786-2.708-2.447-4.744-2.447-4.744s-11.068 3.11-22.584 8.046c-6.766 2.9-13.395 6.352-13.732 12.801M104.46 91.057l.941-5.372-8.884-11.43-5.037 5.372-1.74 7.834a.321.321 0 0 0 .108.32c.965.8 6.5 5.013 14.347 3.544a.332.332 0 0 0 .264-.268", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M93.942 79.387s-4.533-2.853-2.432-6.855c1.623-3.09 4.513 1.133 4.513 1.133s.52-3.642 3.121-3.642c.52-1.04 1.561-4.162 1.561-4.162s11.445 2.601 13.526 3.121c0 5.203-2.304 19.424-7.84 19.861-8.892.703-12.449-9.456-12.449-9.456", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M113.874 73.446c2.601-2.081 3.47-9.722 3.47-9.722s-2.479-.49-6.64-2.05c-4.683-2.081-12.798-4.747-17.48.976-9.668 3.223-2.05 19.823-2.05 19.823l2.713-3.021s-3.935-3.287-2.08-6.243c2.17-3.462 3.92 1.073 3.92 1.073s.637-2.387 3.581-3.342c.355-.71 1.036-2.674 1.432-3.85a1.073 1.073 0 0 1 1.263-.704c2.4.558 8.677 2.019 11.356 2.662.522.125.871.615.82 1.15l-.305 3.248z", fill: "#520038" }), /*#__PURE__*/React.createElement("path", { d: "M104.977 76.064c-.103.61-.582 1.038-1.07.956-.489-.083-.801-.644-.698-1.254.103-.61.582-1.038 1.07-.956.488.082.8.644.698 1.254M112.132 77.694c-.103.61-.582 1.038-1.07.956-.488-.083-.8-.644-.698-1.254.103-.61.582-1.038 1.07-.956.488.082.8.643.698 1.254", fill: "#552950" }), /*#__PURE__*/React.createElement("path", { stroke: "#DB836E", strokeWidth: "1.118", strokeLinecap: "round", strokeLinejoin: "round", d: "M110.13 74.84l-.896 1.61-.298 4.357h-2.228" }), /*#__PURE__*/React.createElement("path", { d: "M110.846 74.481s1.79-.716 2.506.537", stroke: "#5C2552", strokeWidth: "1.118", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M92.386 74.282s.477-1.114 1.113-.716c.637.398 1.274 1.433.558 1.99-.717.556.159 1.67.159 1.67", stroke: "#DB836E", strokeWidth: "1.118", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M103.287 72.93s1.83 1.113 4.137.954", stroke: "#5C2552", strokeWidth: "1.118", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M103.685 81.762s2.227 1.193 4.376 1.193M104.64 84.308s.954.398 1.511.318M94.693 81.205s2.308 7.4 10.424 7.639", stroke: "#DB836E", strokeWidth: "1.118", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M81.45 89.384s.45 5.647-4.935 12.787M69 82.654s-.726 9.282-8.204 14.206", stroke: "#E4EBF7", strokeWidth: "1.101", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M129.405 122.865s-5.272 7.403-9.422 10.768", stroke: "#E4EBF7", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M119.306 107.329s.452 4.366-2.127 32.062", stroke: "#E4EBF7", strokeWidth: "1.101", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M150.028 151.232h-49.837a1.01 1.01 0 0 1-1.01-1.01v-31.688c0-.557.452-1.01 1.01-1.01h49.837c.558 0 1.01.453 1.01 1.01v31.688a1.01 1.01 0 0 1-1.01 1.01", fill: "#F2D7AD" }), /*#__PURE__*/React.createElement("path", { d: "M150.29 151.232h-19.863v-33.707h20.784v32.786a.92.92 0 0 1-.92.92", fill: "#F4D19D" }), /*#__PURE__*/React.createElement("path", { d: "M123.554 127.896H92.917a.518.518 0 0 1-.425-.816l6.38-9.113c.193-.277.51-.442.85-.442h31.092l-7.26 10.371z", fill: "#F2D7AD" }), /*#__PURE__*/React.createElement("path", { fill: "#CC9B6E", d: "M123.689 128.447H99.25v-.519h24.169l7.183-10.26.424.298z" }), /*#__PURE__*/React.createElement("path", { d: "M158.298 127.896h-18.669a2.073 2.073 0 0 1-1.659-.83l-7.156-9.541h19.965c.49 0 .95.23 1.244.622l6.69 8.92a.519.519 0 0 1-.415.83", fill: "#F4D19D" }), /*#__PURE__*/React.createElement("path", { fill: "#CC9B6E", d: "M157.847 128.479h-19.384l-7.857-10.475.415-.31 7.7 10.266h19.126zM130.554 150.685l-.032-8.177.519-.002.032 8.177z" }), /*#__PURE__*/React.createElement("path", { fill: "#CC9B6E", d: "M130.511 139.783l-.08-21.414.519-.002.08 21.414zM111.876 140.932l-.498-.143 1.479-5.167.498.143zM108.437 141.06l-2.679-2.935 2.665-3.434.41.318-2.397 3.089 2.384 2.612zM116.607 141.06l-.383-.35 2.383-2.612-2.397-3.089.41-.318 2.665 3.434z" }), /*#__PURE__*/React.createElement("path", { d: "M154.316 131.892l-3.114-1.96.038 3.514-1.043.092c-1.682.115-3.634.23-4.789.23-1.902 0-2.693 2.258 2.23 2.648l-2.645-.596s-2.168 1.317.504 2.3c0 0-1.58 1.217.561 2.58-.584 3.504 5.247 4.058 7.122 3.59 1.876-.47 4.233-2.359 4.487-5.16.28-3.085-.89-5.432-3.35-7.238", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M153.686 133.577s-6.522.47-8.36.372c-1.836-.098-1.904 2.19 2.359 2.264 3.739.15 5.451-.044 5.451-.044", stroke: "#DB836E", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M145.16 135.877c-1.85 1.346.561 2.355.561 2.355s3.478.898 6.73.617", stroke: "#DB836E", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M151.89 141.71s-6.28.111-6.73-2.132c-.223-1.346.45-1.402.45-1.402M146.114 140.868s-1.103 3.16 5.44 3.533M151.202 129.932v3.477M52.838 89.286c3.533-.337 8.423-1.248 13.582-7.754", stroke: "#DB836E", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M168.567 248.318a6.647 6.647 0 0 1-6.647-6.647v-66.466a6.647 6.647 0 1 1 13.294 0v66.466a6.647 6.647 0 0 1-6.647 6.647", fill: "#5BA02E" }), /*#__PURE__*/React.createElement("path", { d: "M176.543 247.653a6.647 6.647 0 0 1-6.646-6.647v-33.232a6.647 6.647 0 1 1 13.293 0v33.232a6.647 6.647 0 0 1-6.647 6.647", fill: "#92C110" }), /*#__PURE__*/React.createElement("path", { d: "M186.443 293.613H158.92a3.187 3.187 0 0 1-3.187-3.187v-46.134a3.187 3.187 0 0 1 3.187-3.187h27.524a3.187 3.187 0 0 1 3.187 3.187v46.134a3.187 3.187 0 0 1-3.187 3.187", fill: "#F2D7AD" }), /*#__PURE__*/React.createElement("path", { d: "M88.979 89.48s7.776 5.384 16.6 2.842", stroke: "#E4EBF7", strokeWidth: "1.101", strokeLinecap: "round", strokeLinejoin: "round" }))); }; var _default = NoFound; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],374:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var ServerError = function ServerError() { return /*#__PURE__*/React.createElement("svg", { width: "254", height: "294" }, /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/React.createElement("path", { d: "M0 .335h253.49v253.49H0z" }), /*#__PURE__*/React.createElement("path", { d: "M0 293.665h253.49V.401H0z" })), /*#__PURE__*/React.createElement("g", { fill: "none", fillRule: "evenodd" }, /*#__PURE__*/React.createElement("g", { transform: "translate(0 .067)" }, /*#__PURE__*/React.createElement("mask", { fill: "#fff" }), /*#__PURE__*/React.createElement("path", { d: "M0 128.134v-2.11C0 56.608 56.273.334 125.69.334h2.11c69.416 0 125.69 56.274 125.69 125.69v2.11c0 69.417-56.274 125.69-125.69 125.69h-2.11C56.273 253.824 0 197.551 0 128.134", fill: "#E4EBF7", mask: "url(#b)" })), /*#__PURE__*/React.createElement("path", { d: "M39.989 132.108a8.332 8.332 0 1 1-16.581-1.671 8.332 8.332 0 0 1 16.58 1.671", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M37.19 135.59l10.553 5.983M48.665 147.884l-12.734 10.861", stroke: "#FFF", strokeWidth: "2" }), /*#__PURE__*/React.createElement("path", { d: "M40.11 160.816a5.706 5.706 0 1 1-11.354-1.145 5.706 5.706 0 0 1 11.354 1.145M57.943 144.6a5.747 5.747 0 1 1-11.436-1.152 5.747 5.747 0 0 1 11.436 1.153M99.656 27.434l30.024-.013a4.619 4.619 0 1 0-.004-9.238l-30.024.013a4.62 4.62 0 0 0 .004 9.238M111.14 45.896l30.023-.013a4.62 4.62 0 1 0-.004-9.238l-30.024.013a4.619 4.619 0 1 0 .004 9.238", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M113.53 27.421v-.002l15.89-.007a4.619 4.619 0 1 0 .005 9.238l-15.892.007v-.002a4.618 4.618 0 0 0-.004-9.234M150.167 70.091h-3.979a4.789 4.789 0 0 1-4.774-4.775 4.788 4.788 0 0 1 4.774-4.774h3.979a4.789 4.789 0 0 1 4.775 4.774 4.789 4.789 0 0 1-4.775 4.775", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M171.687 30.234c0-16.392 13.289-29.68 29.681-29.68 16.392 0 29.68 13.288 29.68 29.68 0 16.393-13.288 29.681-29.68 29.681s-29.68-13.288-29.68-29.68", fill: "#FF603B" }), /*#__PURE__*/React.createElement("path", { d: "M203.557 19.435l-.676 15.035a1.514 1.514 0 0 1-3.026 0l-.675-15.035a2.19 2.19 0 1 1 4.377 0m-.264 19.378c.513.477.77 1.1.77 1.87s-.257 1.393-.77 1.907c-.55.476-1.21.733-1.943.733a2.545 2.545 0 0 1-1.87-.77c-.55-.514-.806-1.136-.806-1.87 0-.77.256-1.393.806-1.87.513-.513 1.137-.733 1.87-.733.77 0 1.43.22 1.943.733", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M119.3 133.275c4.426-.598 3.612-1.204 4.079-4.778.675-5.18-3.108-16.935-8.262-25.118-1.088-10.72-12.598-11.24-12.598-11.24s4.312 4.895 4.196 16.199c1.398 5.243.804 14.45.804 14.45s5.255 11.369 11.78 10.487", fill: "#FFB594" }), /*#__PURE__*/React.createElement("path", { d: "M100.944 91.61s1.463-.583 3.211.582c8.08 1.398 10.368 6.706 11.3 11.368 1.864 1.282 1.864 2.33 1.864 3.496.365.777 1.515 3.03 1.515 3.03s-7.225 1.748-10.954 6.758c-1.399-6.41-6.936-25.235-6.936-25.235", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M94.008 90.5l1.019-5.815-9.23-11.874-5.233 5.581-2.593 9.863s8.39 5.128 16.037 2.246", fill: "#FFB594" }), /*#__PURE__*/React.createElement("path", { d: "M82.931 78.216s-4.557-2.868-2.445-6.892c1.632-3.107 4.537 1.139 4.537 1.139s.524-3.662 3.139-3.662c.523-1.046 1.569-4.184 1.569-4.184s11.507 2.615 13.6 3.138c-.001 5.23-2.317 19.529-7.884 19.969-8.94.706-12.516-9.508-12.516-9.508", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M102.971 72.243c2.616-2.093 3.489-9.775 3.489-9.775s-2.492-.492-6.676-2.062c-4.708-2.092-12.867-4.771-17.575.982-9.54 4.41-2.062 19.93-2.062 19.93l2.729-3.037s-3.956-3.304-2.092-6.277c2.183-3.48 3.943 1.08 3.943 1.08s.64-2.4 3.6-3.36c.356-.714 1.04-2.69 1.44-3.872a1.08 1.08 0 0 1 1.27-.707c2.41.56 8.723 2.03 11.417 2.676.524.126.876.619.825 1.156l-.308 3.266z", fill: "#520038" }), /*#__PURE__*/React.createElement("path", { d: "M101.22 76.514c-.104.613-.585 1.044-1.076.96-.49-.082-.805-.646-.702-1.26.104-.613.585-1.044 1.076-.961.491.083.805.647.702 1.26M94.26 75.074c-.104.613-.585 1.044-1.076.96-.49-.082-.805-.646-.702-1.26.104-.613.585-1.044 1.076-.96.491.082.805.646.702 1.26", fill: "#552950" }), /*#__PURE__*/React.createElement("path", { stroke: "#DB836E", strokeWidth: "1.063", strokeLinecap: "round", strokeLinejoin: "round", d: "M99.206 73.644l-.9 1.62-.3 4.38h-2.24" }), /*#__PURE__*/React.createElement("path", { d: "M99.926 73.284s1.8-.72 2.52.54", stroke: "#5C2552", strokeWidth: "1.117", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M81.367 73.084s.48-1.12 1.12-.72c.64.4 1.28 1.44.56 2s.16 1.68.16 1.68", stroke: "#DB836E", strokeWidth: "1.117", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M92.326 71.724s1.84 1.12 4.16.96", stroke: "#5C2552", strokeWidth: "1.117", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M92.726 80.604s2.24 1.2 4.4 1.2M93.686 83.164s.96.4 1.52.32M83.687 80.044s1.786 6.547 9.262 7.954", stroke: "#DB836E", strokeWidth: "1.063", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M95.548 91.663s-1.068 2.821-8.298 2.105c-7.23-.717-10.29-5.044-10.29-5.044", stroke: "#E4EBF7", strokeWidth: "1.136", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M78.126 87.478s6.526 4.972 16.47 2.486c0 0 9.577 1.02 11.536 5.322 5.36 11.77.543 36.835 0 39.962 3.496 4.055-.466 8.483-.466 8.483-15.624-3.548-35.81-.6-35.81-.6-4.849-3.546-1.223-9.044-1.223-9.044L62.38 110.32c-2.485-15.227.833-19.803 3.549-20.743 3.03-1.049 8.04-1.282 8.04-1.282.496-.058 1.08-.076 1.37-.233 2.36-1.282 2.787-.583 2.787-.583", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M65.828 89.81s-6.875.465-7.59 8.156c-.466 8.857 3.03 10.954 3.03 10.954s6.075 22.102 16.796 22.957c8.39-2.176 4.758-6.702 4.661-11.42-.233-11.304-7.108-16.897-7.108-16.897s-4.212-13.75-9.789-13.75", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M71.716 124.225s.855 11.264 9.828 6.486c4.765-2.536 7.581-13.828 9.789-22.568 1.456-5.768 2.58-12.197 2.58-12.197l-4.973-1.709s-2.408 5.516-7.769 12.275c-4.335 5.467-9.144 11.11-9.455 17.713", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M108.463 105.191s1.747 2.724-2.331 30.535c2.376 2.216 1.053 6.012-.233 7.51", stroke: "#E4EBF7", strokeWidth: "1.085", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M123.262 131.527s-.427 2.732-11.77 1.981c-15.187-1.006-25.326-3.25-25.326-3.25l.933-5.8s.723.215 9.71-.068c11.887-.373 18.714-6.07 24.964-1.022 4.039 3.263 1.489 8.16 1.489 8.16", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M70.24 90.974s-5.593-4.739-11.054 2.68c-3.318 7.223.517 15.284 2.664 19.578-.31 3.729 2.33 4.311 2.33 4.311s.108.895 1.516 2.68c4.078-7.03 6.72-9.166 13.711-12.546-.328-.656-1.877-3.265-1.825-3.767.175-1.69-1.282-2.623-1.282-2.623s-.286-.156-1.165-2.738c-.788-2.313-2.036-5.177-4.895-7.575", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M90.232 288.027s4.855 2.308 8.313 1.155c3.188-1.063 5.12.755 8.002 1.331 2.881.577 7.769 1.243 13.207-1.424-.117-6.228-7.786-4.499-13.518-7.588-2.895-1.56-4.276-5.336-4.066-9.944H91.544s-1.573 11.89-1.312 16.47", fill: "#CBD1D1" }), /*#__PURE__*/React.createElement("path", { d: "M90.207 287.833s2.745 1.437 7.639.738c3.456-.494 3.223.66 7.418 1.282 4.195.621 13.092-.194 14.334-1.126.466 1.242-.388 2.33-.388 2.33s-1.709.682-5.438.932c-2.295.154-8.098.276-10.14-.621-2.02-1.554-4.894-1.515-6.06-.234-4.427 1.075-7.184-.31-7.184-.31l-.181-2.991z", fill: "#2B0849" }), /*#__PURE__*/React.createElement("path", { d: "M98.429 272.257h3.496s-.117 7.574 5.127 9.671c-5.244.7-9.672-2.602-8.623-9.671", fill: "#A4AABA" }), /*#__PURE__*/React.createElement("path", { d: "M44.425 272.046s-2.208 7.774-4.702 12.899c-1.884 3.874-4.428 7.854 5.729 7.854 6.97 0 9.385-.503 7.782-6.917-1.604-6.415.279-13.836.279-13.836h-9.088z", fill: "#CBD1D1" }), /*#__PURE__*/React.createElement("path", { d: "M38.066 290.277s2.198 1.225 6.954 1.225c6.376 0 8.646-1.73 8.646-1.73s.63 1.168-.649 2.27c-1.04.897-3.77 1.668-7.745 1.621-4.347-.05-6.115-.593-7.062-1.224-.864-.577-.72-1.657-.144-2.162", fill: "#2B0849" }), /*#__PURE__*/React.createElement("path", { d: "M45.344 274.041s.035 1.592-.329 3.07c-.365 1.49-1.13 3.255-1.184 4.34-.061 1.206 4.755 1.657 5.403.036.65-1.622 1.357-6.737 2.006-7.602.648-.865-5.14-2.222-5.896.156", fill: "#A4AABA" }), /*#__PURE__*/React.createElement("path", { d: "M89.476 277.57l13.899.095s1.349-56.643 1.925-66.909c.576-10.267 3.923-45.052 1.042-65.585l-13.037-.669-23.737.81s-.452 4.12-1.243 10.365c-.065.515-.708.874-.777 1.417-.078.608.439 1.407.332 2.044-2.455 14.627-5.797 32.736-8.256 46.837-.121.693-1.282 1.048-1.515 2.796-.042.314.22 1.584.116 1.865-7.14 19.473-12.202 52.601-15.66 67.19l15.176-.015s2.282-10.145 4.185-18.871c2.922-13.389 24.012-88.32 24.012-88.32l3.133-.954-.158 48.568s-.233 1.282.35 2.098c.583.815-.581 1.167-.408 2.331l.408 1.864s-.466 7.458-.932 12.352c-.467 4.895 1.145 40.69 1.145 40.69", fill: "#7BB2F9" }), /*#__PURE__*/React.createElement("path", { d: "M64.57 218.881c1.197.099 4.195-2.097 7.225-5.127M96.024 222.534s2.881-1.152 6.34-4.034", stroke: "#648BD8", strokeWidth: "1.085", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M96.973 219.373s2.882-1.153 6.34-4.034", stroke: "#648BD8", strokeWidth: "1.032", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M63.172 222.144s2.724-.614 6.759-3.496M74.903 146.166c-.281 3.226.31 8.856-4.506 9.478M93.182 144.344s.115 14.557-1.344 15.65c-2.305 1.73-3.107 2.02-3.107 2.02M89.197 144.923s.269 13.144-1.01 25.088M83.525 170.71s6.81-1.051 9.116-1.051M46.026 270.045l-.892 4.538M46.937 263.289l-.815 4.157M62.725 202.503c-.33 1.618-.102 1.904-.449 3.438 0 0-2.756 1.903-2.29 3.923.466 2.02-.31 3.424-4.505 17.252-1.762 5.807-4.233 18.922-6.165 28.278-.03.144-.521 2.646-1.14 5.8M64.158 194.136c-.295 1.658-.6 3.31-.917 4.938M71.33 146.787l-1.244 10.877s-1.14.155-.519 2.33c.117 1.399-2.778 16.39-5.382 31.615M44.242 273.727H58.07", stroke: "#648BD8", strokeWidth: "1.085", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M106.18 142.117c-3.028-.489-18.825-2.744-36.219.2a.625.625 0 0 0-.518.644c.063 1.307.044 2.343.015 2.995a.617.617 0 0 0 .716.636c3.303-.534 17.037-2.412 35.664-.266.347.04.66-.214.692-.56.124-1.347.16-2.425.17-3.029a.616.616 0 0 0-.52-.62", fill: "#192064" }), /*#__PURE__*/React.createElement("path", { d: "M96.398 145.264l.003-5.102a.843.843 0 0 0-.809-.847 114.104 114.104 0 0 0-8.141-.014.85.85 0 0 0-.82.847l-.003 5.097c0 .476.388.857.864.845 2.478-.064 5.166-.067 8.03.017a.848.848 0 0 0 .876-.843", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M95.239 144.296l.002-3.195a.667.667 0 0 0-.643-.672c-1.9-.061-3.941-.073-6.094-.01a.675.675 0 0 0-.654.672l-.002 3.192c0 .376.305.677.68.669 1.859-.042 3.874-.043 6.02.012.376.01.69-.291.691-.668", fill: "#192064" }), /*#__PURE__*/React.createElement("path", { d: "M90.102 273.522h12.819M91.216 269.761c.006 3.519-.072 5.55 0 6.292M90.923 263.474c-.009 1.599-.016 2.558-.016 4.505M90.44 170.404l.932 46.38s.7 1.631-.233 2.796c-.932 1.166 2.564.7.932 2.33-1.63 1.633.933 1.166 0 3.497-.618 1.546-1.031 21.921-1.138 36.513", stroke: "#648BD8", strokeWidth: "1.085", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M73.736 98.665l2.214 4.312s2.098.816 1.865 2.68l.816 2.214M64.297 116.611c.233-.932 2.176-7.147 12.585-10.488M77.598 90.042s7.691 6.137 16.547 2.72", stroke: "#E4EBF7", strokeWidth: "1.085", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M91.974 86.954s5.476-.816 7.574-4.545c1.297-.345.72 2.212-.33 3.671-.7.971-1.01 1.554-1.01 1.554s.194.31.155.816c-.053.697-.175.653-.272 1.048-.081.335.108.657 0 1.049-.046.17-.198.5-.382.878-.12.249-.072.687-.2.948-.231.469-1.562 1.87-2.622 2.855-3.826 3.554-5.018 1.644-6.001-.408-.894-1.865-.661-5.127-.874-6.875-.35-2.914-2.622-3.03-1.923-4.429.343-.685 2.87.69 3.263 1.748.757 2.04 2.952 1.807 2.622 1.69", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M99.8 82.429c-.465.077-.35.272-.97 1.243-.622.971-4.817 2.932-6.39 3.224-2.589.48-2.278-1.56-4.254-2.855-1.69-1.107-3.562-.638-1.398 1.398.99.932.932 1.107 1.398 3.205.335 1.506-.64 3.67.7 5.593", stroke: "#DB836E", strokeWidth: ".774", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M79.543 108.673c-2.1 2.926-4.266 6.175-5.557 8.762", stroke: "#E59788", strokeWidth: ".774", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M87.72 124.768s-2.098-1.942-5.127-2.719c-3.03-.777-3.574-.155-5.516.078-1.942.233-3.885-.932-3.652.7.233 1.63 5.05 1.01 5.206 2.097.155 1.087-6.37 2.796-8.313 2.175-.777.777.466 1.864 2.02 2.175.233 1.554 2.253 1.554 2.253 1.554s.699 1.01 2.641 1.088c2.486 1.32 8.934-.7 10.954-1.554 2.02-.855-.466-5.594-.466-5.594", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M73.425 122.826s.66 1.127 3.167 1.418c2.315.27 2.563.583 2.563.583s-2.545 2.894-9.07 2.272M72.416 129.274s3.826.097 4.933-.718M74.98 130.75s1.961.136 3.36-.505M77.232 131.916s1.748.019 2.914-.505M73.328 122.321s-.595-1.032 1.262-.427c1.671.544 2.833.055 5.128.155 1.389.061 3.067-.297 3.982.15 1.606.784 3.632 2.181 3.632 2.181s10.526 1.204 19.033-1.127M78.864 108.104s-8.39 2.758-13.168 12.12", stroke: "#E59788", strokeWidth: ".774", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M109.278 112.533s3.38-3.613 7.575-4.662", stroke: "#E4EBF7", strokeWidth: "1.085", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M107.375 123.006s9.697-2.745 11.445-.88", stroke: "#E59788", strokeWidth: ".774", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M194.605 83.656l3.971-3.886M187.166 90.933l3.736-3.655M191.752 84.207l-4.462-4.56M198.453 91.057l-4.133-4.225M129.256 163.074l3.718-3.718M122.291 170.039l3.498-3.498M126.561 163.626l-4.27-4.27M132.975 170.039l-3.955-3.955", stroke: "#BFCDDD", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M190.156 211.779h-1.604a4.023 4.023 0 0 1-4.011-4.011V175.68a4.023 4.023 0 0 1 4.01-4.01h1.605a4.023 4.023 0 0 1 4.011 4.01v32.088a4.023 4.023 0 0 1-4.01 4.01", fill: "#A3B4C6" }), /*#__PURE__*/React.createElement("path", { d: "M237.824 212.977a4.813 4.813 0 0 1-4.813 4.813h-86.636a4.813 4.813 0 0 1 0-9.626h86.636a4.813 4.813 0 0 1 4.813 4.813", fill: "#A3B4C6" }), /*#__PURE__*/React.createElement("mask", { fill: "#fff" }), /*#__PURE__*/React.createElement("path", { fill: "#A3B4C6", mask: "url(#d)", d: "M154.098 190.096h70.513v-84.617h-70.513z" }), /*#__PURE__*/React.createElement("path", { d: "M224.928 190.096H153.78a3.219 3.219 0 0 1-3.208-3.209V167.92a3.219 3.219 0 0 1 3.208-3.21h71.148a3.219 3.219 0 0 1 3.209 3.21v18.967a3.219 3.219 0 0 1-3.21 3.209M224.928 130.832H153.78a3.218 3.218 0 0 1-3.208-3.208v-18.968a3.219 3.219 0 0 1 3.208-3.209h71.148a3.219 3.219 0 0 1 3.209 3.21v18.967a3.218 3.218 0 0 1-3.21 3.208", fill: "#BFCDDD", mask: "url(#d)" }), /*#__PURE__*/React.createElement("path", { d: "M159.563 120.546a2.407 2.407 0 1 1 0-4.813 2.407 2.407 0 0 1 0 4.813M166.98 120.546a2.407 2.407 0 1 1 0-4.813 2.407 2.407 0 0 1 0 4.813M174.397 120.546a2.407 2.407 0 1 1 0-4.813 2.407 2.407 0 0 1 0 4.813M222.539 120.546h-22.461a.802.802 0 0 1-.802-.802v-3.208c0-.443.359-.803.802-.803h22.46c.444 0 .803.36.803.803v3.208c0 .443-.36.802-.802.802", fill: "#FFF", mask: "url(#d)" }), /*#__PURE__*/React.createElement("path", { d: "M224.928 160.464H153.78a3.218 3.218 0 0 1-3.208-3.209v-18.967a3.219 3.219 0 0 1 3.208-3.209h71.148a3.219 3.219 0 0 1 3.209 3.209v18.967a3.218 3.218 0 0 1-3.21 3.209", fill: "#BFCDDD", mask: "url(#d)" }), /*#__PURE__*/React.createElement("path", { d: "M173.455 130.832h49.301M164.984 130.832h6.089M155.952 130.832h6.75M173.837 160.613h49.3M165.365 160.613h6.089M155.57 160.613h6.751", stroke: "#7C90A5", strokeWidth: "1.124", strokeLinecap: "round", strokeLinejoin: "round", mask: "url(#d)" }), /*#__PURE__*/React.createElement("path", { d: "M159.563 151.038a2.407 2.407 0 1 1 0-4.814 2.407 2.407 0 0 1 0 4.814M166.98 151.038a2.407 2.407 0 1 1 0-4.814 2.407 2.407 0 0 1 0 4.814M174.397 151.038a2.407 2.407 0 1 1 .001-4.814 2.407 2.407 0 0 1 0 4.814M222.539 151.038h-22.461a.802.802 0 0 1-.802-.802v-3.209c0-.443.359-.802.802-.802h22.46c.444 0 .803.36.803.802v3.209c0 .443-.36.802-.802.802M159.563 179.987a2.407 2.407 0 1 1 0-4.813 2.407 2.407 0 0 1 0 4.813M166.98 179.987a2.407 2.407 0 1 1 0-4.813 2.407 2.407 0 0 1 0 4.813M174.397 179.987a2.407 2.407 0 1 1 0-4.813 2.407 2.407 0 0 1 0 4.813M222.539 179.987h-22.461a.802.802 0 0 1-.802-.802v-3.209c0-.443.359-.802.802-.802h22.46c.444 0 .803.36.803.802v3.209c0 .443-.36.802-.802.802", fill: "#FFF", mask: "url(#d)" }), /*#__PURE__*/React.createElement("path", { d: "M203.04 221.108h-27.372a2.413 2.413 0 0 1-2.406-2.407v-11.448a2.414 2.414 0 0 1 2.406-2.407h27.372a2.414 2.414 0 0 1 2.407 2.407V218.7a2.413 2.413 0 0 1-2.407 2.407", fill: "#BFCDDD", mask: "url(#d)" }), /*#__PURE__*/React.createElement("path", { d: "M177.259 207.217v11.52M201.05 207.217v11.52", stroke: "#A3B4C6", strokeWidth: "1.124", strokeLinecap: "round", strokeLinejoin: "round", mask: "url(#d)" }), /*#__PURE__*/React.createElement("path", { d: "M162.873 267.894a9.422 9.422 0 0 1-9.422-9.422v-14.82a9.423 9.423 0 0 1 18.845 0v14.82a9.423 9.423 0 0 1-9.423 9.422", fill: "#5BA02E", mask: "url(#d)" }), /*#__PURE__*/React.createElement("path", { d: "M171.22 267.83a9.422 9.422 0 0 1-9.422-9.423v-3.438a9.423 9.423 0 0 1 18.845 0v3.438a9.423 9.423 0 0 1-9.422 9.423", fill: "#92C110", mask: "url(#d)" }), /*#__PURE__*/React.createElement("path", { d: "M181.31 293.666h-27.712a3.209 3.209 0 0 1-3.209-3.21V269.79a3.209 3.209 0 0 1 3.209-3.21h27.711a3.209 3.209 0 0 1 3.209 3.21v20.668a3.209 3.209 0 0 1-3.209 3.209", fill: "#F2D7AD", mask: "url(#d)" }))); }; var _default = ServerError; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],375:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var Unauthorized = function Unauthorized() { return /*#__PURE__*/React.createElement("svg", { width: "251", height: "294" }, /*#__PURE__*/React.createElement("g", { fill: "none", fillRule: "evenodd" }, /*#__PURE__*/React.createElement("path", { d: "M0 129.023v-2.084C0 58.364 55.591 2.774 124.165 2.774h2.085c68.574 0 124.165 55.59 124.165 124.165v2.084c0 68.575-55.59 124.166-124.165 124.166h-2.085C55.591 253.189 0 197.598 0 129.023", fill: "#E4EBF7" }), /*#__PURE__*/React.createElement("path", { d: "M41.417 132.92a8.231 8.231 0 1 1-16.38-1.65 8.231 8.231 0 0 1 16.38 1.65", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M38.652 136.36l10.425 5.91M49.989 148.505l-12.58 10.73", stroke: "#FFF", strokeWidth: "2" }), /*#__PURE__*/React.createElement("path", { d: "M41.536 161.28a5.636 5.636 0 1 1-11.216-1.13 5.636 5.636 0 0 1 11.216 1.13M59.154 145.261a5.677 5.677 0 1 1-11.297-1.138 5.677 5.677 0 0 1 11.297 1.138M100.36 29.516l29.66-.013a4.562 4.562 0 1 0-.004-9.126l-29.66.013a4.563 4.563 0 0 0 .005 9.126M111.705 47.754l29.659-.013a4.563 4.563 0 1 0-.004-9.126l-29.66.013a4.563 4.563 0 1 0 .005 9.126", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M114.066 29.503V29.5l15.698-.007a4.563 4.563 0 1 0 .004 9.126l-15.698.007v-.002a4.562 4.562 0 0 0-.004-9.122M185.405 137.723c-.55 5.455-5.418 9.432-10.873 8.882-5.456-.55-9.432-5.418-8.882-10.873.55-5.455 5.418-9.432 10.873-8.882 5.455.55 9.432 5.418 8.882 10.873", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M180.17 143.772l12.572 7.129M193.841 158.42L178.67 171.36", stroke: "#FFF", strokeWidth: "2" }), /*#__PURE__*/React.createElement("path", { d: "M185.55 171.926a6.798 6.798 0 1 1-13.528-1.363 6.798 6.798 0 0 1 13.527 1.363M204.12 155.285a6.848 6.848 0 1 1-13.627-1.375 6.848 6.848 0 0 1 13.626 1.375", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M152.988 194.074a2.21 2.21 0 1 1-4.42 0 2.21 2.21 0 0 1 4.42 0zM225.931 118.217a2.21 2.21 0 1 1-4.421 0 2.21 2.21 0 0 1 4.421 0zM217.09 153.051a2.21 2.21 0 1 1-4.421 0 2.21 2.21 0 0 1 4.42 0zM177.84 109.842a2.21 2.21 0 1 1-4.422 0 2.21 2.21 0 0 1 4.421 0zM196.114 94.454a2.21 2.21 0 1 1-4.421 0 2.21 2.21 0 0 1 4.421 0zM202.844 182.523a2.21 2.21 0 1 1-4.42 0 2.21 2.21 0 0 1 4.42 0z", stroke: "#FFF", strokeWidth: "2" }), /*#__PURE__*/React.createElement("path", { stroke: "#FFF", strokeWidth: "2", d: "M215.125 155.262l-1.902 20.075-10.87 5.958M174.601 176.636l-6.322 9.761H156.98l-4.484 6.449M175.874 127.28V111.56M221.51 119.404l-12.77 7.859-15.228-7.86V96.668" }), /*#__PURE__*/React.createElement("path", { d: "M180.68 29.32C180.68 13.128 193.806 0 210 0c16.193 0 29.32 13.127 29.32 29.32 0 16.194-13.127 29.322-29.32 29.322-16.193 0-29.32-13.128-29.32-29.321", fill: "#A26EF4" }), /*#__PURE__*/React.createElement("path", { d: "M221.45 41.706l-21.563-.125a1.744 1.744 0 0 1-1.734-1.754l.071-12.23a1.744 1.744 0 0 1 1.754-1.734l21.562.125c.964.006 1.74.791 1.735 1.755l-.071 12.229a1.744 1.744 0 0 1-1.754 1.734", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M215.106 29.192c-.015 2.577-2.049 4.654-4.543 4.64-2.494-.014-4.504-2.115-4.489-4.693l.04-6.925c.016-2.577 2.05-4.654 4.543-4.64 2.494.015 4.504 2.116 4.49 4.693l-.04 6.925zm-4.53-14.074a6.877 6.877 0 0 0-6.916 6.837l-.043 7.368a6.877 6.877 0 0 0 13.754.08l.042-7.368a6.878 6.878 0 0 0-6.837-6.917zM167.566 68.367h-3.93a4.73 4.73 0 0 1-4.717-4.717 4.73 4.73 0 0 1 4.717-4.717h3.93a4.73 4.73 0 0 1 4.717 4.717 4.73 4.73 0 0 1-4.717 4.717", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M168.214 248.838a6.611 6.611 0 0 1-6.61-6.611v-66.108a6.611 6.611 0 0 1 13.221 0v66.108a6.611 6.611 0 0 1-6.61 6.61", fill: "#5BA02E" }), /*#__PURE__*/React.createElement("path", { d: "M176.147 248.176a6.611 6.611 0 0 1-6.61-6.61v-33.054a6.611 6.611 0 1 1 13.221 0v33.053a6.611 6.611 0 0 1-6.61 6.611", fill: "#92C110" }), /*#__PURE__*/React.createElement("path", { d: "M185.994 293.89h-27.376a3.17 3.17 0 0 1-3.17-3.17v-45.887a3.17 3.17 0 0 1 3.17-3.17h27.376a3.17 3.17 0 0 1 3.17 3.17v45.886a3.17 3.17 0 0 1-3.17 3.17", fill: "#F2D7AD" }), /*#__PURE__*/React.createElement("path", { d: "M81.972 147.673s6.377-.927 17.566-1.28c11.729-.371 17.57 1.086 17.57 1.086s3.697-3.855.968-8.424c1.278-12.077 5.982-32.827.335-48.273-1.116-1.339-3.743-1.512-7.536-.62-1.337.315-7.147-.149-7.983-.1l-15.311-.347s-3.487-.17-8.035-.508c-1.512-.113-4.227-1.683-5.458-.338-.406.443-2.425 5.669-1.97 16.077l8.635 35.642s-3.141 3.61 1.219 7.085", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M75.768 73.325l-.9-6.397 11.982-6.52s7.302-.118 8.038 1.205c.737 1.324-5.616.993-5.616.993s-1.836 1.388-2.615 2.5c-1.654 2.363-.986 6.471-8.318 5.986-1.708.284-2.57 2.233-2.57 2.233", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M52.44 77.672s14.217 9.406 24.973 14.444c1.061.497-2.094 16.183-11.892 11.811-7.436-3.318-20.162-8.44-21.482-14.496-.71-3.258 2.543-7.643 8.401-11.76M141.862 80.113s-6.693 2.999-13.844 6.876c-3.894 2.11-10.137 4.704-12.33 7.988-6.224 9.314 3.536 11.22 12.947 7.503 6.71-2.651 28.999-12.127 13.227-22.367", fill: "#FFB594" }), /*#__PURE__*/React.createElement("path", { d: "M76.166 66.36l3.06 3.881s-2.783 2.67-6.31 5.747c-7.103 6.195-12.803 14.296-15.995 16.44-3.966 2.662-9.754 3.314-12.177-.118-3.553-5.032.464-14.628 31.422-25.95", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M64.674 85.116s-2.34 8.413-8.912 14.447c.652.548 18.586 10.51 22.144 10.056 5.238-.669 6.417-18.968 1.145-20.531-.702-.208-5.901-1.286-8.853-2.167-.87-.26-1.611-1.71-3.545-.936l-1.98-.869zM128.362 85.826s5.318 1.956 7.325 13.734c-.546.274-17.55 12.35-21.829 7.805-6.534-6.94-.766-17.393 4.275-18.61 4.646-1.121 5.03-1.37 10.23-2.929", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M78.18 94.656s.911 7.41-4.914 13.078", stroke: "#E4EBF7", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M87.397 94.68s3.124 2.572 10.263 2.572c7.14 0 9.074-3.437 9.074-3.437", stroke: "#E4EBF7", strokeWidth: ".932", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M117.184 68.639l-6.781-6.177s-5.355-4.314-9.223-.893c-3.867 3.422 4.463 2.083 5.653 4.165 1.19 2.082.848 1.143-2.083.446-5.603-1.331-2.082.893 2.975 5.355 2.091 1.845 6.992.955 6.992.955l2.467-3.851z", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M105.282 91.315l-.297-10.937-15.918-.027-.53 10.45c-.026.403.17.788.515.999 2.049 1.251 9.387 5.093 15.799.424.287-.21.443-.554.431-.91", fill: "#FFB594" }), /*#__PURE__*/React.createElement("path", { d: "M107.573 74.24c.817-1.147.982-9.118 1.015-11.928a1.046 1.046 0 0 0-.965-1.055l-4.62-.365c-7.71-1.044-17.071.624-18.253 6.346-5.482 5.813-.421 13.244-.421 13.244s1.963 3.566 4.305 6.791c.756 1.041.398-3.731 3.04-5.929 5.524-4.594 15.899-7.103 15.899-7.103", fill: "#5C2552" }), /*#__PURE__*/React.createElement("path", { d: "M88.426 83.206s2.685 6.202 11.602 6.522c7.82.28 8.973-7.008 7.434-17.505l-.909-5.483c-6.118-2.897-15.478.54-15.478.54s-.576 2.044-.19 5.504c-2.276 2.066-1.824 5.618-1.824 5.618s-.905-1.922-1.98-2.321c-.86-.32-1.897.089-2.322 1.98-1.04 4.632 3.667 5.145 3.667 5.145", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { stroke: "#DB836E", strokeWidth: "1.145", strokeLinecap: "round", strokeLinejoin: "round", d: "M100.843 77.099l1.701-.928-1.015-4.324.674-1.406" }), /*#__PURE__*/React.createElement("path", { d: "M105.546 74.092c-.022.713-.452 1.279-.96 1.263-.51-.016-.904-.607-.882-1.32.021-.713.452-1.278.96-1.263.51.016.904.607.882 1.32M97.592 74.349c-.022.713-.452 1.278-.961 1.263-.509-.016-.904-.607-.882-1.32.022-.713.452-1.279.961-1.263.51.016.904.606.882 1.32", fill: "#552950" }), /*#__PURE__*/React.createElement("path", { d: "M91.132 86.786s5.269 4.957 12.679 2.327", stroke: "#DB836E", strokeWidth: "1.145", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M99.776 81.903s-3.592.232-1.44-2.79c1.59-1.496 4.897-.46 4.897-.46s1.156 3.906-3.457 3.25", fill: "#DB836E" }), /*#__PURE__*/React.createElement("path", { d: "M102.88 70.6s2.483.84 3.402.715M93.883 71.975s2.492-1.144 4.778-1.073", stroke: "#5C2552", strokeWidth: "1.526", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M86.32 77.374s.961.879 1.458 2.106c-.377.48-1.033 1.152-.236 1.809M99.337 83.719s1.911.151 2.509-.254", stroke: "#DB836E", strokeWidth: "1.145", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M87.782 115.821l15.73-3.012M100.165 115.821l10.04-2.008", stroke: "#E4EBF7", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M66.508 86.763s-1.598 8.83-6.697 14.078", stroke: "#E4EBF7", strokeWidth: "1.114", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M128.31 87.934s3.013 4.121 4.06 11.785", stroke: "#E4EBF7", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M64.09 84.816s-6.03 9.912-13.607 9.903", stroke: "#DB836E", strokeWidth: ".795", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M112.366 65.909l-.142 5.32s5.993 4.472 11.945 9.202c4.482 3.562 8.888 7.455 10.985 8.662 4.804 2.766 8.9 3.355 11.076 1.808 4.071-2.894 4.373-9.878-8.136-15.263-4.271-1.838-16.144-6.36-25.728-9.73", fill: "#FFC6A0" }), /*#__PURE__*/React.createElement("path", { d: "M130.532 85.488s4.588 5.757 11.619 6.214", stroke: "#DB836E", strokeWidth: ".75", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M121.708 105.73s-.393 8.564-1.34 13.612", stroke: "#E4EBF7", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M115.784 161.512s-3.57-1.488-2.678-7.14", stroke: "#648BD8", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M101.52 290.246s4.326 2.057 7.408 1.03c2.842-.948 4.564.673 7.132 1.186 2.57.514 6.925 1.108 11.772-1.269-.104-5.551-6.939-4.01-12.048-6.763-2.582-1.39-3.812-4.757-3.625-8.863h-9.471s-1.402 10.596-1.169 14.68", fill: "#CBD1D1" }), /*#__PURE__*/React.createElement("path", { d: "M101.496 290.073s2.447 1.281 6.809.658c3.081-.44 3.74.485 7.479 1.039 3.739.554 10.802-.07 11.91-.9.415 1.108-.347 2.077-.347 2.077s-1.523.608-4.847.831c-2.045.137-5.843.293-7.663-.507-1.8-1.385-5.286-1.917-5.77-.243-3.947.958-7.41-.288-7.41-.288l-.16-2.667z", fill: "#2B0849" }), /*#__PURE__*/React.createElement("path", { d: "M108.824 276.19h3.116s-.103 6.751 4.57 8.62c-4.673.624-8.62-2.32-7.686-8.62", fill: "#A4AABA" }), /*#__PURE__*/React.createElement("path", { d: "M57.65 272.52s-2.122 7.47-4.518 12.396c-1.811 3.724-4.255 7.548 5.505 7.548 6.698 0 9.02-.483 7.479-6.648-1.541-6.164.268-13.296.268-13.296H57.65z", fill: "#CBD1D1" }), /*#__PURE__*/React.createElement("path", { d: "M51.54 290.04s2.111 1.178 6.682 1.178c6.128 0 8.31-1.662 8.31-1.662s.605 1.122-.624 2.18c-1 .862-3.624 1.603-7.444 1.559-4.177-.049-5.876-.57-6.786-1.177-.831-.554-.692-1.593-.138-2.078", fill: "#2B0849" }), /*#__PURE__*/React.createElement("path", { d: "M58.533 274.438s.034 1.529-.315 2.95c-.352 1.431-1.087 3.127-1.139 4.17-.058 1.16 4.57 1.592 5.194.035.623-1.559 1.303-6.475 1.927-7.306.622-.831-4.94-2.135-5.667.15", fill: "#A4AABA" }), /*#__PURE__*/React.createElement("path", { d: "M100.885 277.015l13.306.092s1.291-54.228 1.843-64.056c.552-9.828 3.756-43.13.997-62.788l-12.48-.64-22.725.776s-.433 3.944-1.19 9.921c-.062.493-.677.838-.744 1.358-.075.582.42 1.347.318 1.956-2.35 14.003-6.343 32.926-8.697 46.425-.116.663-1.227 1.004-1.45 2.677-.04.3.21 1.516.112 1.785-6.836 18.643-10.89 47.584-14.2 61.551l14.528-.014s2.185-8.524 4.008-16.878c2.796-12.817 22.987-84.553 22.987-84.553l3-.517 1.037 46.1s-.223 1.228.334 2.008c.558.782-.556 1.117-.39 2.233l.39 1.784s-.446 7.14-.892 11.826c-.446 4.685-.092 38.954-.092 38.954", fill: "#7BB2F9" }), /*#__PURE__*/React.createElement("path", { d: "M77.438 220.434c1.146.094 4.016-2.008 6.916-4.91M107.55 223.931s2.758-1.103 6.069-3.862", stroke: "#648BD8", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M108.459 220.905s2.759-1.104 6.07-3.863", stroke: "#648BD8", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M76.099 223.557s2.608-.587 6.47-3.346M87.33 150.82c-.27 3.088.297 8.478-4.315 9.073M104.829 149.075s.11 13.936-1.286 14.983c-2.207 1.655-2.975 1.934-2.975 1.934M101.014 149.63s.035 12.81-1.19 24.245M94.93 174.965s7.174-1.655 9.38-1.655M75.671 204.754c-.316 1.55-.64 3.067-.973 4.535 0 0-1.45 1.822-1.003 3.756.446 1.934-.943 2.034-4.96 15.273-1.686 5.559-4.464 18.49-6.313 27.447-.078.38-4.018 18.06-4.093 18.423M77.043 196.743a313.269 313.269 0 0 1-.877 4.729M83.908 151.414l-1.19 10.413s-1.091.148-.496 2.23c.111 1.34-2.66 15.692-5.153 30.267M57.58 272.94h13.238", stroke: "#648BD8", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }), /*#__PURE__*/React.createElement("path", { d: "M117.377 147.423s-16.955-3.087-35.7.199c.157 2.501-.002 4.128-.002 4.128s14.607-2.802 35.476-.31c.251-2.342.226-4.017.226-4.017", fill: "#192064" }), /*#__PURE__*/React.createElement("path", { d: "M107.511 150.353l.004-4.885a.807.807 0 0 0-.774-.81c-2.428-.092-5.04-.108-7.795-.014a.814.814 0 0 0-.784.81l-.003 4.88c0 .456.371.82.827.808a140.76 140.76 0 0 1 7.688.017.81.81 0 0 0 .837-.806", fill: "#FFF" }), /*#__PURE__*/React.createElement("path", { d: "M106.402 149.426l.002-3.06a.64.64 0 0 0-.616-.643 94.135 94.135 0 0 0-5.834-.009.647.647 0 0 0-.626.643l-.001 3.056c0 .36.291.648.651.64 1.78-.04 3.708-.041 5.762.012.36.009.662-.279.662-.64", fill: "#192064" }), /*#__PURE__*/React.createElement("path", { d: "M101.485 273.933h12.272M102.652 269.075c.006 3.368.04 5.759.11 6.47M102.667 263.125c-.009 1.53-.015 2.98-.016 4.313M102.204 174.024l.893 44.402s.669 1.561-.224 2.677c-.892 1.116 2.455.67.893 2.231-1.562 1.562.893 1.116 0 3.347-.592 1.48-.988 20.987-1.09 34.956", stroke: "#648BD8", strokeWidth: "1.051", strokeLinecap: "round", strokeLinejoin: "round" }))); }; var _default = Unauthorized; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],376:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _grid = require("../grid"); var _default = _grid.Row; exports["default"] = _default; },{"../grid":315}],377:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _omit = _interopRequireDefault(require("omit.js")); var _classnames = _interopRequireDefault(require("classnames")); var _rcSelect = _interopRequireWildcard(require("rc-select")); var _configProvider = require("../config-provider"); var _iconUtil = _interopRequireDefault(require("./utils/iconUtil")); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); // TODO: 4.0 - codemod should help to change `filterOption` to support node props. // We still use class here since `forwardRef` not support generic in typescript var Select = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Select, _React$Component); var _super = (0, _createSuper2["default"])(Select); function Select() { var _this; (0, _classCallCheck2["default"])(this, Select); _this = _super.apply(this, arguments); _this.selectRef = /*#__PURE__*/React.createRef(); _this.focus = function () { if (_this.selectRef.current) { _this.selectRef.current.focus(); } }; _this.blur = function () { if (_this.selectRef.current) { _this.selectRef.current.blur(); } }; _this.getMode = function () { var mode = _this.props.mode; if (mode === 'combobox') { return undefined; } if (mode === Select.SECRET_COMBOBOX_MODE_DO_NOT_USE) { return 'combobox'; } return mode; }; _this.renderSelect = function (_ref) { var getContextPopupContainer = _ref.getPopupContainer, getPrefixCls = _ref.getPrefixCls, renderEmpty = _ref.renderEmpty, direction = _ref.direction, virtual = _ref.virtual, dropdownMatchSelectWidth = _ref.dropdownMatchSelectWidth; var _this$props = _this.props, customizePrefixCls = _this$props.prefixCls, notFoundContent = _this$props.notFoundContent, className = _this$props.className, customizeSize = _this$props.size, _this$props$listHeigh = _this$props.listHeight, listHeight = _this$props$listHeigh === void 0 ? 256 : _this$props$listHeigh, _this$props$listItemH = _this$props.listItemHeight, listItemHeight = _this$props$listItemH === void 0 ? 24 : _this$props$listItemH, getPopupContainer = _this$props.getPopupContainer, dropdownClassName = _this$props.dropdownClassName, bordered = _this$props.bordered; var prefixCls = getPrefixCls('select', customizePrefixCls); var mode = _this.getMode(); var isMultiple = mode === 'multiple' || mode === 'tags'; // ===================== Empty ===================== var mergedNotFound; if (notFoundContent !== undefined) { mergedNotFound = notFoundContent; } else if (mode === 'combobox') { mergedNotFound = null; } else { mergedNotFound = renderEmpty('Select'); } // ===================== Icons ===================== var _getIcons = (0, _iconUtil["default"])((0, _extends2["default"])((0, _extends2["default"])({}, _this.props), { multiple: isMultiple, prefixCls: prefixCls })), suffixIcon = _getIcons.suffixIcon, itemIcon = _getIcons.itemIcon, removeIcon = _getIcons.removeIcon, clearIcon = _getIcons.clearIcon; var selectProps = (0, _omit["default"])(_this.props, ['prefixCls', 'suffixIcon', 'itemIcon', 'removeIcon', 'clearIcon', 'size', 'bordered']); var rcSelectRtlDropDownClassName = (0, _classnames["default"])(dropdownClassName, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-dropdown-").concat(direction), direction === 'rtl')); return /*#__PURE__*/React.createElement(_SizeContext["default"].Consumer, null, function (size) { var _classNames2; var mergedSize = customizeSize || size; var mergedClassName = (0, _classnames["default"])((_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-lg"), mergedSize === 'large'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-sm"), mergedSize === 'small'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-borderless"), !bordered), _classNames2), className); return /*#__PURE__*/React.createElement(_rcSelect["default"], (0, _extends2["default"])({ ref: _this.selectRef, virtual: virtual, dropdownMatchSelectWidth: dropdownMatchSelectWidth }, selectProps, { listHeight: listHeight, listItemHeight: listItemHeight, mode: mode, prefixCls: prefixCls, direction: direction, inputIcon: suffixIcon, menuItemSelectedIcon: itemIcon, removeIcon: removeIcon, clearIcon: clearIcon, notFoundContent: mergedNotFound, className: mergedClassName, getPopupContainer: getPopupContainer || getContextPopupContainer, dropdownClassName: rcSelectRtlDropDownClassName })); }); }; return _this; } (0, _createClass2["default"])(Select, [{ key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderSelect); } }]); return Select; }(React.Component); Select.Option = _rcSelect.Option; Select.OptGroup = _rcSelect.OptGroup; Select.SECRET_COMBOBOX_MODE_DO_NOT_USE = 'SECRET_COMBOBOX_MODE_DO_NOT_USE'; Select.defaultProps = { transitionName: 'slide-up', choiceTransitionName: '', bordered: true }; var _default = Select; exports["default"] = _default; },{"../config-provider":278,"../config-provider/SizeContext":276,"./utils/iconUtil":378,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"rc-select":747,"react":"react"}],378:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = getIcons; var React = _interopRequireWildcard(require("react")); var _DownOutlined = _interopRequireDefault(require("@ant-design/icons/DownOutlined")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons/LoadingOutlined")); var _CheckOutlined = _interopRequireDefault(require("@ant-design/icons/CheckOutlined")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _SearchOutlined = _interopRequireDefault(require("@ant-design/icons/SearchOutlined")); function getIcons(_ref) { var suffixIcon = _ref.suffixIcon, clearIcon = _ref.clearIcon, menuItemSelectedIcon = _ref.menuItemSelectedIcon, removeIcon = _ref.removeIcon, loading = _ref.loading, multiple = _ref.multiple, prefixCls = _ref.prefixCls; // Clear Icon var mergedClearIcon = clearIcon; if (!clearIcon) { mergedClearIcon = /*#__PURE__*/React.createElement(_CloseCircleFilled["default"], null); } // Arrow item icon var mergedSuffixIcon = null; if (suffixIcon !== undefined) { mergedSuffixIcon = suffixIcon; } else if (loading) { mergedSuffixIcon = /*#__PURE__*/React.createElement(_LoadingOutlined["default"], { spin: true }); } else { var iconCls = "".concat(prefixCls, "-suffix"); mergedSuffixIcon = function mergedSuffixIcon(_ref2) { var open = _ref2.open, showSearch = _ref2.showSearch; if (open && showSearch) { return /*#__PURE__*/React.createElement(_SearchOutlined["default"], { className: iconCls }); } return /*#__PURE__*/React.createElement(_DownOutlined["default"], { className: iconCls }); }; } // Checked item icon var mergedItemIcon = null; if (menuItemSelectedIcon !== undefined) { mergedItemIcon = menuItemSelectedIcon; } else if (multiple) { mergedItemIcon = /*#__PURE__*/React.createElement(_CheckOutlined["default"], null); } else { mergedItemIcon = null; } var mergedRemoveIcon = null; if (removeIcon !== undefined) { mergedRemoveIcon = removeIcon; } else { mergedRemoveIcon = /*#__PURE__*/React.createElement(_CloseOutlined["default"], null); } return { clearIcon: mergedClearIcon, suffixIcon: mergedSuffixIcon, itemIcon: mergedItemIcon, removeIcon: mergedRemoveIcon }; } },{"@ant-design/icons/CheckOutlined":67,"@ant-design/icons/CloseCircleFilled":69,"@ant-design/icons/CloseOutlined":71,"@ant-design/icons/DownOutlined":76,"@ant-design/icons/LoadingOutlined":93,"@ant-design/icons/SearchOutlined":103,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],379:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _omit = _interopRequireDefault(require("omit.js")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _Element = _interopRequireDefault(require("./Element")); var SkeletonAvatar = function SkeletonAvatar(props) { var renderSkeletonAvatar = function renderSkeletonAvatar(_ref) { var getPrefixCls = _ref.getPrefixCls; var customizePrefixCls = props.prefixCls, className = props.className, active = props.active; var prefixCls = getPrefixCls('skeleton', customizePrefixCls); var otherProps = (0, _omit["default"])(props, ['prefixCls']); var cls = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-element"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-active"), active), className); return /*#__PURE__*/React.createElement("div", { className: cls }, /*#__PURE__*/React.createElement(_Element["default"], (0, _extends2["default"])({ prefixCls: "".concat(prefixCls, "-avatar") }, otherProps))); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderSkeletonAvatar); }; SkeletonAvatar.defaultProps = { size: 'default', shape: 'circle' }; var _default = SkeletonAvatar; exports["default"] = _default; },{"../config-provider":278,"./Element":381,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"react":"react"}],380:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _omit = _interopRequireDefault(require("omit.js")); var _classnames = _interopRequireDefault(require("classnames")); var _Element = _interopRequireDefault(require("./Element")); var _configProvider = require("../config-provider"); var SkeletonButton = function SkeletonButton(props) { var renderSkeletonButton = function renderSkeletonButton(_ref) { var getPrefixCls = _ref.getPrefixCls; var customizePrefixCls = props.prefixCls, className = props.className, active = props.active; var prefixCls = getPrefixCls('skeleton', customizePrefixCls); var otherProps = (0, _omit["default"])(props, ['prefixCls']); var cls = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-element"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-active"), active), className); return /*#__PURE__*/React.createElement("div", { className: cls }, /*#__PURE__*/React.createElement(_Element["default"], (0, _extends2["default"])({ prefixCls: "".concat(prefixCls, "-button") }, otherProps))); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderSkeletonButton); }; SkeletonButton.defaultProps = { size: 'default' }; var _default = SkeletonButton; exports["default"] = _default; },{"../config-provider":278,"./Element":381,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"react":"react"}],381:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var Element = function Element(props) { var _classNames, _classNames2; var prefixCls = props.prefixCls, className = props.className, style = props.style, size = props.size, shape = props.shape; var sizeCls = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-lg"), size === 'large'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-sm"), size === 'small'), _classNames)); var shapeCls = (0, _classnames["default"])((_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-circle"), shape === 'circle'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-square"), shape === 'square'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-round"), shape === 'round'), _classNames2)); var sizeStyle = typeof size === 'number' ? { width: size, height: size, lineHeight: "".concat(size, "px") } : {}; return /*#__PURE__*/React.createElement("span", { className: (0, _classnames["default"])(prefixCls, sizeCls, shapeCls, className), style: (0, _extends2["default"])((0, _extends2["default"])({}, sizeStyle), style) }); }; var _default = Element; exports["default"] = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],382:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var path = 'M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z'; var SkeletonImage = function SkeletonImage(props) { var renderSkeletonImage = function renderSkeletonImage(_ref) { var getPrefixCls = _ref.getPrefixCls; var customizePrefixCls = props.prefixCls, className = props.className, style = props.style; var prefixCls = getPrefixCls('skeleton', customizePrefixCls); var cls = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-element"), className); return /*#__PURE__*/React.createElement("div", { className: cls }, /*#__PURE__*/React.createElement("div", { className: (0, _classnames["default"])("".concat(prefixCls, "-image"), className), style: style }, /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 1098 1024", xmlns: "http://www.w3.org/2000/svg", className: "".concat(prefixCls, "-image-svg") }, /*#__PURE__*/React.createElement("path", { d: path, className: "".concat(prefixCls, "-image-path") })))); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderSkeletonImage); }; var _default = SkeletonImage; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],383:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _omit = _interopRequireDefault(require("omit.js")); var _classnames = _interopRequireDefault(require("classnames")); var _Element = _interopRequireDefault(require("./Element")); var _configProvider = require("../config-provider"); var SkeletonInput = function SkeletonInput(props) { var renderSkeletonInput = function renderSkeletonInput(_ref) { var getPrefixCls = _ref.getPrefixCls; var customizePrefixCls = props.prefixCls, className = props.className, active = props.active; var prefixCls = getPrefixCls('skeleton', customizePrefixCls); var otherProps = (0, _omit["default"])(props, ['prefixCls']); var cls = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-element"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-active"), active), className); return /*#__PURE__*/React.createElement("div", { className: cls }, /*#__PURE__*/React.createElement(_Element["default"], (0, _extends2["default"])({ prefixCls: "".concat(prefixCls, "-input") }, otherProps))); }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderSkeletonInput); }; SkeletonInput.defaultProps = { size: 'default' }; var _default = SkeletonInput; exports["default"] = _default; },{"../config-provider":278,"./Element":381,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"react":"react"}],384:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var Paragraph = function Paragraph(props) { var getWidth = function getWidth(index) { var width = props.width, _props$rows = props.rows, rows = _props$rows === void 0 ? 2 : _props$rows; if (Array.isArray(width)) { return width[index]; } // last paragraph if (rows - 1 === index) { return width; } return undefined; }; var prefixCls = props.prefixCls, className = props.className, style = props.style, rows = props.rows; var rowList = (0, _toConsumableArray2["default"])(Array(rows)).map(function (_, index) { return ( /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key React.createElement("li", { key: index, style: { width: getWidth(index) } }) ); }); return /*#__PURE__*/React.createElement("ul", { className: (0, _classnames["default"])(prefixCls, className), style: style }, rowList); }; var _default = Paragraph; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"react":"react"}],385:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _Title = _interopRequireDefault(require("./Title")); var _Paragraph = _interopRequireDefault(require("./Paragraph")); var _configProvider = require("../config-provider"); var _Element = _interopRequireDefault(require("./Element")); var _Avatar = _interopRequireDefault(require("./Avatar")); var _Button = _interopRequireDefault(require("./Button")); var _Input = _interopRequireDefault(require("./Input")); var _Image = _interopRequireDefault(require("./Image")); function getComponentProps(prop) { if (prop && (0, _typeof2["default"])(prop) === 'object') { return prop; } return {}; } function getAvatarBasicProps(hasTitle, hasParagraph) { if (hasTitle && !hasParagraph) { // Square avatar return { size: 'large', shape: 'square' }; } return { size: 'large', shape: 'circle' }; } function getTitleBasicProps(hasAvatar, hasParagraph) { if (!hasAvatar && hasParagraph) { return { width: '38%' }; } if (hasAvatar && hasParagraph) { return { width: '50%' }; } return {}; } function getParagraphBasicProps(hasAvatar, hasTitle) { var basicProps = {}; // Width if (!hasAvatar || !hasTitle) { basicProps.width = '61%'; } // Rows if (!hasAvatar && hasTitle) { basicProps.rows = 3; } else { basicProps.rows = 2; } return basicProps; } var Skeleton = function Skeleton(props) { var renderSkeleton = function renderSkeleton(_ref) { var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var customizePrefixCls = props.prefixCls, loading = props.loading, className = props.className, children = props.children, avatar = props.avatar, title = props.title, paragraph = props.paragraph, active = props.active, round = props.round; var prefixCls = getPrefixCls('skeleton', customizePrefixCls); if (loading || !('loading' in props)) { var _classNames; var hasAvatar = !!avatar; var hasTitle = !!title; var hasParagraph = !!paragraph; // Avatar var avatarNode; if (hasAvatar) { var avatarProps = (0, _extends2["default"])((0, _extends2["default"])({ prefixCls: "".concat(prefixCls, "-avatar") }, getAvatarBasicProps(hasTitle, hasParagraph)), getComponentProps(avatar)); // We direct use SkeletonElement as avatar in skeleton internal. avatarNode = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-header") }, /*#__PURE__*/React.createElement(_Element["default"], avatarProps)); } var contentNode; if (hasTitle || hasParagraph) { // Title var $title; if (hasTitle) { var titleProps = (0, _extends2["default"])((0, _extends2["default"])({ prefixCls: "".concat(prefixCls, "-title") }, getTitleBasicProps(hasAvatar, hasParagraph)), getComponentProps(title)); $title = /*#__PURE__*/React.createElement(_Title["default"], titleProps); } // Paragraph var paragraphNode; if (hasParagraph) { var paragraphProps = (0, _extends2["default"])((0, _extends2["default"])({ prefixCls: "".concat(prefixCls, "-paragraph") }, getParagraphBasicProps(hasAvatar, hasTitle)), getComponentProps(paragraph)); paragraphNode = /*#__PURE__*/React.createElement(_Paragraph["default"], paragraphProps); } contentNode = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-content") }, $title, paragraphNode); } var cls = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-with-avatar"), hasAvatar), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-active"), active), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-round"), round), _classNames), className); return /*#__PURE__*/React.createElement("div", { className: cls }, avatarNode, contentNode); } return children; }; return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, renderSkeleton); }; Skeleton.defaultProps = { avatar: false, title: true, paragraph: true }; Skeleton.Button = _Button["default"]; Skeleton.Avatar = _Avatar["default"]; Skeleton.Input = _Input["default"]; Skeleton.Image = _Image["default"]; var _default = Skeleton; exports["default"] = _default; },{"../config-provider":278,"./Avatar":379,"./Button":380,"./Element":381,"./Image":382,"./Input":383,"./Paragraph":384,"./Title":386,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"classnames":455,"react":"react"}],386:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); /* eslint-disable jsx-a11y/heading-has-content */ var Title = function Title(_ref) { var prefixCls = _ref.prefixCls, className = _ref.className, width = _ref.width, style = _ref.style; return /*#__PURE__*/React.createElement("h3", { className: (0, _classnames["default"])(prefixCls, className), style: (0, _extends2["default"])({ width: width }, style) }); }; var _default = Title; exports["default"] = _default; },{"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],387:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Skeleton = _interopRequireDefault(require("./Skeleton")); var _default = _Skeleton["default"]; exports["default"] = _default; },{"./Skeleton":385,"@babel/runtime/helpers/interopRequireDefault":192}],388:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _tooltip = _interopRequireDefault(require("../tooltip")); function useCombinedRefs() { for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) { refs[_key] = arguments[_key]; } var targetRef = React.useRef(); React.useEffect(function () { refs.forEach(function (ref) { if (!ref) return; if (typeof ref === 'function') { ref(targetRef.current); } else { ref.current = targetRef.current; } }); }, [refs]); return targetRef; } var SliderTooltip = /*#__PURE__*/React.forwardRef(function (props, ref) { var visible = props.visible; var innerRef = React.useRef(null); var tooltipRef = useCombinedRefs(ref, innerRef); var rafRef = React.useRef(null); function cancelKeepAlign() { window.cancelAnimationFrame(rafRef.current); rafRef.current = null; } function keepAlign() { rafRef.current = window.requestAnimationFrame(function () { tooltipRef.current.forcePopupAlign(); rafRef.current = null; keepAlign(); }); } React.useEffect(function () { if (visible) { keepAlign(); } else { cancelKeepAlign(); } return cancelKeepAlign; }, [visible]); return /*#__PURE__*/React.createElement(_tooltip["default"], (0, _extends2["default"])({ ref: tooltipRef }, props)); }); var _default = SliderTooltip; exports["default"] = _default; },{"../tooltip":422,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],389:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _rcSlider = _interopRequireWildcard(require("rc-slider")); var _classnames = _interopRequireDefault(require("classnames")); var _SliderTooltip = _interopRequireDefault(require("./SliderTooltip")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Slider = /*#__PURE__*/React.forwardRef(function (props, ref) { var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, getPopupContainer = _React$useContext.getPopupContainer; var _React$useState = React.useState({}), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), visibles = _React$useState2[0], setVisibles = _React$useState2[1]; var toggleTooltipVisible = function toggleTooltipVisible(index, visible) { setVisibles(function (prev) { return (0, _extends3["default"])((0, _extends3["default"])({}, prev), (0, _defineProperty2["default"])({}, index, visible)); }); }; var getTooltipPlacement = function getTooltipPlacement(tooltipPlacement, vertical) { if (tooltipPlacement) { return tooltipPlacement; } if (!vertical) { return 'top'; } return direction === 'rtl' ? 'left' : 'right'; }; var handleWithTooltip = function handleWithTooltip(_a) { var tooltipPrefixCls = _a.tooltipPrefixCls, prefixCls = _a.prefixCls, _b = _a.info, value = _b.value, dragging = _b.dragging, index = _b.index, restProps = __rest(_b, ["value", "dragging", "index"]); var tipFormatter = props.tipFormatter, tooltipVisible = props.tooltipVisible, tooltipPlacement = props.tooltipPlacement, getTooltipPopupContainer = props.getTooltipPopupContainer, vertical = props.vertical; var isTipFormatter = tipFormatter ? visibles[index] || dragging : false; var visible = tooltipVisible || tooltipVisible === undefined && isTipFormatter; return /*#__PURE__*/React.createElement(_SliderTooltip["default"], { prefixCls: tooltipPrefixCls, title: tipFormatter ? tipFormatter(value) : '', visible: visible, placement: getTooltipPlacement(tooltipPlacement, vertical), transitionName: "zoom-down", key: index, overlayClassName: "".concat(prefixCls, "-tooltip"), getPopupContainer: getTooltipPopupContainer || getPopupContainer || function () { return document.body; } }, /*#__PURE__*/React.createElement(_rcSlider.Handle, (0, _extends3["default"])({}, restProps, { value: value, onMouseEnter: function onMouseEnter() { return toggleTooltipVisible(index, true); }, onMouseLeave: function onMouseLeave() { return toggleTooltipVisible(index, false); } }))); }; var customizePrefixCls = props.prefixCls, customizeTooltipPrefixCls = props.tooltipPrefixCls, range = props.range, className = props.className, restProps = __rest(props, ["prefixCls", "tooltipPrefixCls", "range", "className"]); var prefixCls = getPrefixCls('slider', customizePrefixCls); var tooltipPrefixCls = getPrefixCls('tooltip', customizeTooltipPrefixCls); var cls = (0, _classnames["default"])(className, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl')); // make reverse default on rtl direction if (direction === 'rtl' && !restProps.vertical) { restProps.reverse = !restProps.reverse; } if (range) { return /*#__PURE__*/React.createElement(_rcSlider.Range, (0, _extends3["default"])({}, restProps, { className: cls, ref: ref, handle: function handle(info) { return handleWithTooltip({ tooltipPrefixCls: tooltipPrefixCls, prefixCls: prefixCls, info: info }); }, prefixCls: prefixCls })); } return /*#__PURE__*/React.createElement(_rcSlider["default"], (0, _extends3["default"])({}, restProps, { className: cls, ref: ref, handle: function handle(info) { return handleWithTooltip({ tooltipPrefixCls: tooltipPrefixCls, prefixCls: prefixCls, info: info }); }, prefixCls: prefixCls })); }); Slider.displayName = 'Slider'; Slider.defaultProps = { tipFormatter: function tipFormatter(value) { return typeof value === 'number' ? value.toString() : ''; } }; var _default = Slider; exports["default"] = _default; },{"../config-provider":278,"./SliderTooltip":388,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-slider":761,"react":"react"}],390:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = Item; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _ = require("."); var spaceSize = { small: 8, middle: 16, large: 24 }; function Item(_ref) { var className = _ref.className, direction = _ref.direction, index = _ref.index, size = _ref.size, marginDirection = _ref.marginDirection, children = _ref.children; var latestIndex = React.useContext(_.LastIndexContext); if (children === null || children === undefined) { return null; } return /*#__PURE__*/React.createElement("div", { className: className, style: index >= latestIndex ? {} : (0, _defineProperty2["default"])({}, direction === 'vertical' ? 'marginBottom' : marginDirection, typeof size === 'string' ? spaceSize[size] : size) }, children); } },{".":391,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],391:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.LastIndexContext = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _configProvider = require("../config-provider"); var _Item = _interopRequireDefault(require("./Item")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var LastIndexContext = /*#__PURE__*/React.createContext(0); exports.LastIndexContext = LastIndexContext; var Space = function Space(props) { var _classNames; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, space = _React$useContext.space, directionConfig = _React$useContext.direction; var _props$size = props.size, size = _props$size === void 0 ? (space === null || space === void 0 ? void 0 : space.size) || 'small' : _props$size, align = props.align, className = props.className, children = props.children, _props$direction = props.direction, direction = _props$direction === void 0 ? 'horizontal' : _props$direction, customizePrefixCls = props.prefixCls, otherProps = __rest(props, ["size", "align", "className", "children", "direction", "prefixCls"]); var childNodes = (0, _toArray["default"])(children, { keepEmpty: true }); if (childNodes.length === 0) { return null; } var mergedAlign = align === undefined && direction === 'horizontal' ? 'center' : align; var prefixCls = getPrefixCls('space', customizePrefixCls); var cn = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-").concat(direction), (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), directionConfig === 'rtl'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-align-").concat(mergedAlign), mergedAlign), _classNames), className); var itemClassName = "".concat(prefixCls, "-item"); var marginDirection = directionConfig === 'rtl' ? 'marginLeft' : 'marginRight'; // Calculate latest one var latestIndex = 0; var nodes = childNodes.map(function (child, i) { if (child !== null && child !== undefined) { latestIndex = i; } /* eslint-disable react/no-array-index-key */ return /*#__PURE__*/React.createElement(_Item["default"], { className: itemClassName, key: "".concat(itemClassName, "-").concat(i), direction: direction, size: size, index: i, marginDirection: marginDirection }, child); /* eslint-enable */ }); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({ className: cn }, otherProps), /*#__PURE__*/React.createElement(LastIndexContext.Provider, { value: latestIndex }, nodes)); }; var _default = Space; exports["default"] = _default; },{"../config-provider":278,"./Item":390,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-util/lib/Children/toArray":858,"react":"react"}],392:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _configProvider = require("../config-provider"); var _type = require("../_util/type"); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var SpinSizes = (0, _type.tuple)('small', 'default', 'large'); // Render indicator var defaultIndicator = null; function renderIndicator(prefixCls, props) { var indicator = props.indicator; var dotClassName = "".concat(prefixCls, "-dot"); // should not be render default indicator when indicator value is null if (indicator === null) { return null; } if ((0, _reactNode.isValidElement)(indicator)) { return (0, _reactNode.cloneElement)(indicator, { className: (0, _classnames["default"])(indicator.props.className, dotClassName) }); } if ((0, _reactNode.isValidElement)(defaultIndicator)) { return (0, _reactNode.cloneElement)(defaultIndicator, { className: (0, _classnames["default"])(defaultIndicator.props.className, dotClassName) }); } return /*#__PURE__*/React.createElement("span", { className: (0, _classnames["default"])(dotClassName, "".concat(prefixCls, "-dot-spin")) }, /*#__PURE__*/React.createElement("i", { className: "".concat(prefixCls, "-dot-item") }), /*#__PURE__*/React.createElement("i", { className: "".concat(prefixCls, "-dot-item") }), /*#__PURE__*/React.createElement("i", { className: "".concat(prefixCls, "-dot-item") }), /*#__PURE__*/React.createElement("i", { className: "".concat(prefixCls, "-dot-item") })); } function shouldDelay(spinning, delay) { return !!spinning && !!delay && !isNaN(Number(delay)); } var Spin = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Spin, _React$Component); var _super = (0, _createSuper2["default"])(Spin); function Spin(props) { var _this; (0, _classCallCheck2["default"])(this, Spin); _this = _super.call(this, props); _this.debouncifyUpdateSpinning = function (props) { var _ref = props || _this.props, delay = _ref.delay; if (delay) { _this.cancelExistingSpin(); _this.updateSpinning = (0, _debounce["default"])(_this.originalUpdateSpinning, delay); } }; _this.updateSpinning = function () { var spinning = _this.props.spinning; var currentSpinning = _this.state.spinning; if (currentSpinning !== spinning) { _this.setState({ spinning: spinning }); } }; _this.renderSpin = function (_ref2) { var _classNames; var getPrefixCls = _ref2.getPrefixCls, direction = _ref2.direction; var _a = _this.props, customizePrefixCls = _a.prefixCls, className = _a.className, size = _a.size, tip = _a.tip, wrapperClassName = _a.wrapperClassName, style = _a.style, restProps = __rest(_a, ["prefixCls", "className", "size", "tip", "wrapperClassName", "style"]); var spinning = _this.state.spinning; var prefixCls = getPrefixCls('spin', customizePrefixCls); var spinClassName = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-sm"), size === 'small'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-lg"), size === 'large'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-spinning"), spinning), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-show-text"), !!tip), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); // fix https://fb.me/react-unknown-prop var divProps = (0, _omit["default"])(restProps, ['spinning', 'delay', 'indicator']); var spinElement = /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, divProps, { style: style, className: spinClassName }), renderIndicator(prefixCls, _this.props), tip ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-text") }, tip) : null); if (_this.isNestedPattern()) { var containerClassName = (0, _classnames["default"])("".concat(prefixCls, "-container"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-blur"), spinning)); return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, divProps, { className: (0, _classnames["default"])("".concat(prefixCls, "-nested-loading"), wrapperClassName) }), spinning && /*#__PURE__*/React.createElement("div", { key: "loading" }, spinElement), /*#__PURE__*/React.createElement("div", { className: containerClassName, key: "container" }, _this.props.children)); } return spinElement; }; var spinning = props.spinning, delay = props.delay; var shouldBeDelayed = shouldDelay(spinning, delay); _this.state = { spinning: spinning && !shouldBeDelayed }; _this.originalUpdateSpinning = _this.updateSpinning; _this.debouncifyUpdateSpinning(props); return _this; } (0, _createClass2["default"])(Spin, [{ key: "componentDidMount", value: function componentDidMount() { this.updateSpinning(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.debouncifyUpdateSpinning(); this.updateSpinning(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.cancelExistingSpin(); } }, { key: "cancelExistingSpin", value: function cancelExistingSpin() { var updateSpinning = this.updateSpinning; if (updateSpinning && updateSpinning.cancel) { updateSpinning.cancel(); } } }, { key: "isNestedPattern", value: function isNestedPattern() { return !!(this.props && this.props.children); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderSpin); } }], [{ key: "setDefaultIndicator", value: function setDefaultIndicator(indicator) { defaultIndicator = indicator; } }]); return Spin; }(React.Component); Spin.defaultProps = { spinning: true, size: 'default', wrapperClassName: '' }; var _default = Spin; exports["default"] = _default; },{"../_util/reactNode":223,"../_util/type":230,"../config-provider":278,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"lodash/debounce":551,"omit.js":579,"react":"react"}],393:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _Statistic = _interopRequireDefault(require("./Statistic")); var _utils = require("./utils"); var _reactNode = require("../_util/reactNode"); var REFRESH_INTERVAL = 1000 / 30; function getTime(value) { return new Date(value).getTime(); } var Countdown = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Countdown, _React$Component); var _super = (0, _createSuper2["default"])(Countdown); function Countdown() { var _this; (0, _classCallCheck2["default"])(this, Countdown); _this = _super.apply(this, arguments); _this.syncTimer = function () { var value = _this.props.value; var timestamp = getTime(value); if (timestamp >= Date.now()) { _this.startTimer(); } else { _this.stopTimer(); } }; _this.startTimer = function () { if (_this.countdownId) return; _this.countdownId = window.setInterval(function () { _this.forceUpdate(); }, REFRESH_INTERVAL); }; _this.stopTimer = function () { var _this$props = _this.props, onFinish = _this$props.onFinish, value = _this$props.value; if (_this.countdownId) { clearInterval(_this.countdownId); _this.countdownId = undefined; var timestamp = getTime(value); if (onFinish && timestamp < Date.now()) { onFinish(); } } }; _this.formatCountdown = function (value, config) { var format = _this.props.format; return (0, _utils.formatCountdown)(value, (0, _extends2["default"])((0, _extends2["default"])({}, config), { format: format })); }; // Countdown do not need display the timestamp _this.valueRender = function (node) { return (0, _reactNode.cloneElement)(node, { title: undefined }); }; return _this; } (0, _createClass2["default"])(Countdown, [{ key: "componentDidMount", value: function componentDidMount() { this.syncTimer(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.syncTimer(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.stopTimer(); } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_Statistic["default"], (0, _extends2["default"])({ valueRender: this.valueRender }, this.props, { formatter: this.formatCountdown })); } }]); return Countdown; }(React.Component); Countdown.defaultProps = { format: 'HH:mm:ss' }; var _default = Countdown; exports["default"] = _default; },{"../_util/reactNode":223,"./Statistic":395,"./utils":397,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],394:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _padEnd = _interopRequireDefault(require("lodash/padEnd")); var StatisticNumber = function StatisticNumber(props) { var value = props.value, formatter = props.formatter, precision = props.precision, decimalSeparator = props.decimalSeparator, _props$groupSeparator = props.groupSeparator, groupSeparator = _props$groupSeparator === void 0 ? '' : _props$groupSeparator, prefixCls = props.prefixCls; var valueNode; if (typeof formatter === 'function') { // Customize formatter valueNode = formatter(value); } else { // Internal formatter var val = String(value); var cells = val.match(/^(-?)(\d*)(\.(\d+))?$/); // Process if illegal number if (!cells || val === '-') { valueNode = val; } else { var negative = cells[1]; var _int = cells[2] || '0'; var decimal = cells[4] || ''; _int = _int.replace(/\B(?=(\d{3})+(?!\d))/g, groupSeparator); if (typeof precision === 'number') { decimal = (0, _padEnd["default"])(decimal, precision, '0').slice(0, precision); } if (decimal) { decimal = "".concat(decimalSeparator).concat(decimal); } valueNode = [/*#__PURE__*/React.createElement("span", { key: "int", className: "".concat(prefixCls, "-content-value-int") }, negative, _int), decimal && /*#__PURE__*/React.createElement("span", { key: "decimal", className: "".concat(prefixCls, "-content-value-decimal") }, decimal)]; } } return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-content-value") }, valueNode); }; var _default = StatisticNumber; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"lodash/padEnd":566,"react":"react"}],395:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _context = require("../config-provider/context"); var _Number = _interopRequireDefault(require("./Number")); var Statistic = function Statistic(props) { var prefixCls = props.prefixCls, className = props.className, style = props.style, valueStyle = props.valueStyle, _props$value = props.value, value = _props$value === void 0 ? 0 : _props$value, title = props.title, valueRender = props.valueRender, prefix = props.prefix, suffix = props.suffix, direction = props.direction, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave; var valueNode = /*#__PURE__*/React.createElement(_Number["default"], (0, _extends2["default"])({}, props, { value: value })); var cls = (0, _classnames["default"])(prefixCls, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); return /*#__PURE__*/React.createElement("div", { className: cls, style: style, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave }, title && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-title") }, title), /*#__PURE__*/React.createElement("div", { style: valueStyle, className: "".concat(prefixCls, "-content") }, prefix && /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-content-prefix") }, prefix), valueRender ? valueRender(valueNode) : valueNode, suffix && /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-content-suffix") }, suffix))); }; Statistic.defaultProps = { decimalSeparator: '.', groupSeparator: ',' }; var WrapperStatistic = (0, _context.withConfigConsumer)({ prefixCls: 'statistic' })(Statistic); var _default = WrapperStatistic; exports["default"] = _default; },{"../config-provider/context":277,"./Number":394,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],396:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Statistic = _interopRequireDefault(require("./Statistic")); var _Countdown = _interopRequireDefault(require("./Countdown")); _Statistic["default"].Countdown = _Countdown["default"]; var _default = _Statistic["default"]; exports["default"] = _default; },{"./Countdown":393,"./Statistic":395,"@babel/runtime/helpers/interopRequireDefault":192}],397:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.formatTimeStr = formatTimeStr; exports.formatCountdown = formatCountdown; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _padStart = _interopRequireDefault(require("lodash/padStart")); // Countdown var timeUnits = [['Y', 1000 * 60 * 60 * 24 * 365], ['M', 1000 * 60 * 60 * 24 * 30], ['D', 1000 * 60 * 60 * 24], ['H', 1000 * 60 * 60], ['m', 1000 * 60], ['s', 1000], ['S', 1]]; function formatTimeStr(duration, format) { var leftDuration = duration; var escapeRegex = /\[[^\]]*]/g; var keepList = (format.match(escapeRegex) || []).map(function (str) { return str.slice(1, -1); }); var templateText = format.replace(escapeRegex, '[]'); var replacedText = timeUnits.reduce(function (current, _ref) { var _ref2 = (0, _slicedToArray2["default"])(_ref, 2), name = _ref2[0], unit = _ref2[1]; if (current.indexOf(name) !== -1) { var value = Math.floor(leftDuration / unit); leftDuration -= value * unit; return current.replace(new RegExp("".concat(name, "+"), 'g'), function (match) { var len = match.length; return (0, _padStart["default"])(value.toString(), len, '0'); }); } return current; }, templateText); var index = 0; return replacedText.replace(escapeRegex, function () { var match = keepList[index]; index += 1; return match; }); } function formatCountdown(value, config) { var _config$format = config.format, format = _config$format === void 0 ? '' : _config$format; var target = new Date(value).getTime(); var current = Date.now(); var diff = Math.max(target - current, 0); return formatTimeStr(diff, format); } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"lodash/padStart":567}],398:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _omit = _interopRequireDefault(require("omit.js")); var _rcSteps = _interopRequireDefault(require("rc-steps")); var _CheckOutlined = _interopRequireDefault(require("@ant-design/icons/CheckOutlined")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _progress = _interopRequireDefault(require("../progress")); var Steps = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Steps, _React$Component); var _super = (0, _createSuper2["default"])(Steps); function Steps() { var _this; (0, _classCallCheck2["default"])(this, Steps); _this = _super.apply(this, arguments); _this.renderSteps = function (_ref) { var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var prefixCls = getPrefixCls('steps', _this.props.prefixCls); var iconPrefix = getPrefixCls('', _this.props.iconPrefix); var _this$props = _this.props, percent = _this$props.percent, size = _this$props.size; var className = (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _this.props.className); var icons = { finish: /*#__PURE__*/React.createElement(_CheckOutlined["default"], { className: "".concat(prefixCls, "-finish-icon") }), error: /*#__PURE__*/React.createElement(_CloseOutlined["default"], { className: "".concat(prefixCls, "-error-icon") }) }; var stepIconRender = function stepIconRender(_ref2) { var node = _ref2.node, status = _ref2.status; if (status === 'process' && percent !== undefined) { // currently it's hard-coded, since we can't easily read the actually width of icon var progressWidth = size === 'small' ? 32 : 40; var iconWithProgress = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-progress-icon") }, /*#__PURE__*/React.createElement(_progress["default"], { type: "circle", percent: percent, width: progressWidth, strokeWidth: 4, format: function format() { return null; } }), node); return iconWithProgress; } return node; }; return /*#__PURE__*/React.createElement(_rcSteps["default"], (0, _extends2["default"])({ icons: icons }, (0, _omit["default"])(_this.props, ['progress']), { stepIcon: stepIconRender, prefixCls: prefixCls, iconPrefix: iconPrefix, className: className })); }; return _this; } (0, _createClass2["default"])(Steps, [{ key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderSteps); } }]); return Steps; }(React.Component); exports["default"] = Steps; Steps.Step = _rcSteps["default"].Step; Steps.defaultProps = { current: 0 }; },{"../config-provider":278,"../progress":363,"@ant-design/icons/CheckOutlined":67,"@ant-design/icons/CloseOutlined":71,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"rc-steps":765,"react":"react"}],399:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _rcSwitch = _interopRequireDefault(require("rc-switch")); var _classnames = _interopRequireDefault(require("classnames")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons/LoadingOutlined")); var _wave = _interopRequireDefault(require("../_util/wave")); var _configProvider = require("../config-provider"); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Switch = /*#__PURE__*/React.forwardRef(function (_a, ref) { var _classNames; var customizePrefixCls = _a.prefixCls, customizeSize = _a.size, loading = _a.loading, _a$className = _a.className, className = _a$className === void 0 ? '' : _a$className, disabled = _a.disabled, props = __rest(_a, ["prefixCls", "size", "loading", "className", "disabled"]); (0, _devWarning["default"])('checked' in props || !('value' in props), 'Switch', '`value` is not a valid prop, do you mean `checked`?'); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var size = React.useContext(_SizeContext["default"]); var prefixCls = getPrefixCls('switch', customizePrefixCls); var loadingIcon = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-handle") }, loading && /*#__PURE__*/React.createElement(_LoadingOutlined["default"], { className: "".concat(prefixCls, "-loading-icon") })); var classes = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-small"), (customizeSize || size) === 'small'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-loading"), loading), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement(_wave["default"], { insertExtraNode: true }, /*#__PURE__*/React.createElement(_rcSwitch["default"], (0, _extends2["default"])({}, props, { prefixCls: prefixCls, className: classes, disabled: disabled || loading, ref: ref, loadingIcon: loadingIcon }))); }); Switch.__ANT_SWITCH = true; Switch.displayName = 'Switch'; var _default = Switch; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/wave":232,"../config-provider":278,"../config-provider/SizeContext":276,"@ant-design/icons/LoadingOutlined":93,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-switch":766,"react":"react"}],400:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; /* istanbul ignore next */ /** * This is a syntactic sugar for `columns` prop. * So HOC will not work on this. */ // eslint-disable-next-line no-unused-vars function Column(_) { return null; } var _default = Column; exports["default"] = _default; },{}],401:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; /* istanbul ignore next */ /** * This is a syntactic sugar for `columns` prop. * So HOC will not work on this. */ // eslint-disable-next-line no-unused-vars function ColumnGroup(_) { return null; } var _default = ColumnGroup; exports["default"] = _default; },{}],402:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); function renderExpandIcon(locale) { return function expandIcon(_ref) { var _classNames; var prefixCls = _ref.prefixCls, onExpand = _ref.onExpand, record = _ref.record, expanded = _ref.expanded, expandable = _ref.expandable; var iconPrefix = "".concat(prefixCls, "-row-expand-icon"); return /*#__PURE__*/React.createElement("button", { type: "button", onClick: function onClick(e) { onExpand(record, e); e.stopPropagation(); }, className: (0, _classnames["default"])(iconPrefix, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(iconPrefix, "-spaced"), !expandable), (0, _defineProperty2["default"])(_classNames, "".concat(iconPrefix, "-expanded"), expandable && expanded), (0, _defineProperty2["default"])(_classNames, "".concat(iconPrefix, "-collapsed"), expandable && !expanded), _classNames)), "aria-label": expanded ? locale.collapse : locale.expand }); }; } var _default = renderExpandIcon; exports["default"] = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],403:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _rcTable = _interopRequireWildcard(require("rc-table")); var _Table = require("rc-table/lib/Table"); var _useColumns = require("rc-table/lib/hooks/useColumns"); var _spin = _interopRequireDefault(require("../spin")); var _pagination = _interopRequireDefault(require("../pagination")); var _context = require("../config-provider/context"); var _usePagination3 = _interopRequireWildcard(require("./hooks/usePagination")); var _useLazyKVMap3 = _interopRequireDefault(require("./hooks/useLazyKVMap")); var _useSelection3 = _interopRequireWildcard(require("./hooks/useSelection")); var _useSorter3 = _interopRequireWildcard(require("./hooks/useSorter")); var _useFilter3 = _interopRequireWildcard(require("./hooks/useFilter")); var _useTitleColumns3 = _interopRequireDefault(require("./hooks/useTitleColumns")); var _ExpandIcon = _interopRequireDefault(require("./ExpandIcon")); var _scrollTo = _interopRequireDefault(require("../_util/scrollTo")); var _en_US = _interopRequireDefault(require("../locale/en_US")); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var _Column = _interopRequireDefault(require("./Column")); var _ColumnGroup = _interopRequireDefault(require("./ColumnGroup")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _useBreakpoint = _interopRequireDefault(require("../grid/hooks/useBreakpoint")); var EMPTY_LIST = []; function Table(props) { var _classNames3; var customizePrefixCls = props.prefixCls, className = props.className, style = props.style, customizeSize = props.size, bordered = props.bordered, customizeDropdownPrefixCls = props.dropdownPrefixCls, dataSource = props.dataSource, pagination = props.pagination, rowSelection = props.rowSelection, rowKey = props.rowKey, rowClassName = props.rowClassName, columns = props.columns, children = props.children, legacyChildrenColumnName = props.childrenColumnName, onChange = props.onChange, getPopupContainer = props.getPopupContainer, loading = props.loading, expandIcon = props.expandIcon, expandable = props.expandable, expandedRowRender = props.expandedRowRender, expandIconColumnIndex = props.expandIconColumnIndex, indentSize = props.indentSize, scroll = props.scroll, sortDirections = props.sortDirections, locale = props.locale, _props$showSorterTool = props.showSorterTooltip, showSorterTooltip = _props$showSorterTool === void 0 ? true : _props$showSorterTool; (0, _devWarning["default"])(!(typeof rowKey === 'function' && rowKey.length > 1), 'Table', '`index` parameter of `rowKey` function is deprecated. There is no guarantee that it will work as expected.'); var screens = (0, _useBreakpoint["default"])(); var mergedColumns = React.useMemo(function () { var matched = new Set(Object.keys(screens).filter(function (m) { return screens[m]; })); return (columns || (0, _useColumns.convertChildrenToColumns)(children)).filter(function (c) { return !c.responsive || c.responsive.some(function (r) { return matched.has(r); }); }); }, [children, columns, screens]); var tableProps = (0, _omit["default"])(props, ['className', 'style', 'columns']); var size = React.useContext(_SizeContext["default"]); var _React$useContext = React.useContext(_context.ConfigContext), _React$useContext$loc = _React$useContext.locale, contextLocale = _React$useContext$loc === void 0 ? _en_US["default"] : _React$useContext$loc, renderEmpty = _React$useContext.renderEmpty, direction = _React$useContext.direction; var mergedSize = customizeSize || size; var tableLocale = (0, _extends2["default"])((0, _extends2["default"])({}, contextLocale.Table), locale); var rawData = dataSource || EMPTY_LIST; var _React$useContext2 = React.useContext(_context.ConfigContext), getPrefixCls = _React$useContext2.getPrefixCls; var prefixCls = getPrefixCls('table', customizePrefixCls); var dropdownPrefixCls = getPrefixCls('dropdown', customizeDropdownPrefixCls); var mergedExpandable = (0, _extends2["default"])({ childrenColumnName: legacyChildrenColumnName, expandIconColumnIndex: expandIconColumnIndex }, expandable); var _mergedExpandable$chi = mergedExpandable.childrenColumnName, childrenColumnName = _mergedExpandable$chi === void 0 ? 'children' : _mergedExpandable$chi; var expandType = React.useMemo(function () { if (rawData.some(function (item) { var _a; return (_a = item) === null || _a === void 0 ? void 0 : _a[childrenColumnName]; })) { return 'nest'; } if (expandedRowRender || expandable && expandable.expandedRowRender) { return 'row'; } return null; }, [rawData]); var internalRefs = { body: React.useRef() }; // ============================ RowKey ============================ var getRowKey = React.useMemo(function () { if (typeof rowKey === 'function') { return rowKey; } return function (record) { var _a; return (_a = record) === null || _a === void 0 ? void 0 : _a[rowKey]; }; }, [rowKey]); var _useLazyKVMap = (0, _useLazyKVMap3["default"])(rawData, childrenColumnName, getRowKey), _useLazyKVMap2 = (0, _slicedToArray2["default"])(_useLazyKVMap, 1), getRecordByKey = _useLazyKVMap2[0]; // ============================ Events ============================= var changeEventInfo = {}; var triggerOnChange = function triggerOnChange(info, action) { var reset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var changeInfo = (0, _extends2["default"])((0, _extends2["default"])({}, changeEventInfo), info); if (reset) { changeEventInfo.resetPagination(); // Reset event param if (changeInfo.pagination.current) { changeInfo.pagination.current = 1; } // Trigger pagination events if (pagination && pagination.onChange) { pagination.onChange(1, changeInfo.pagination.pageSize); } } if (scroll && scroll.scrollToFirstRowOnChange !== false && internalRefs.body.current) { (0, _scrollTo["default"])(0, { getContainer: function getContainer() { return internalRefs.body.current; } }); } if (onChange) { onChange(changeInfo.pagination, changeInfo.filters, changeInfo.sorter, { currentDataSource: (0, _useFilter3.getFilterData)((0, _useSorter3.getSortData)(rawData, changeInfo.sorterStates, childrenColumnName), changeInfo.filterStates), action: action }); } }; /** * Controlled state in `columns` is not a good idea that makes too many code (1000+ line?) * to read state out and then put it back to title render. * Move these code into `hooks` but still too complex. * We should provides Table props like `sorter` & `filter` to handle control in next big version. */ // ============================ Sorter ============================= var onSorterChange = function onSorterChange(sorter, sorterStates) { triggerOnChange({ sorter: sorter, sorterStates: sorterStates }, 'sort', false); }; var _useSorter = (0, _useSorter3["default"])({ prefixCls: prefixCls, mergedColumns: mergedColumns, onSorterChange: onSorterChange, sortDirections: sortDirections || ['ascend', 'descend'], tableLocale: tableLocale, showSorterTooltip: showSorterTooltip }), _useSorter2 = (0, _slicedToArray2["default"])(_useSorter, 4), transformSorterColumns = _useSorter2[0], sortStates = _useSorter2[1], sorterTitleProps = _useSorter2[2], getSorters = _useSorter2[3]; var sortedData = React.useMemo(function () { return (0, _useSorter3.getSortData)(rawData, sortStates, childrenColumnName); }, [rawData, sortStates]); changeEventInfo.sorter = getSorters(); changeEventInfo.sorterStates = sortStates; // ============================ Filter ============================ var onFilterChange = function onFilterChange(filters, filterStates) { triggerOnChange({ filters: filters, filterStates: filterStates }, 'filter', true); }; var _useFilter = (0, _useFilter3["default"])({ prefixCls: prefixCls, locale: tableLocale, dropdownPrefixCls: dropdownPrefixCls, mergedColumns: mergedColumns, onFilterChange: onFilterChange, getPopupContainer: getPopupContainer }), _useFilter2 = (0, _slicedToArray2["default"])(_useFilter, 3), transformFilterColumns = _useFilter2[0], filterStates = _useFilter2[1], getFilters = _useFilter2[2]; var mergedData = (0, _useFilter3.getFilterData)(sortedData, filterStates); changeEventInfo.filters = getFilters(); changeEventInfo.filterStates = filterStates; // ============================ Column ============================ var columnTitleProps = React.useMemo(function () { return (0, _extends2["default"])({}, sorterTitleProps); }, [sorterTitleProps]); var _useTitleColumns = (0, _useTitleColumns3["default"])(columnTitleProps), _useTitleColumns2 = (0, _slicedToArray2["default"])(_useTitleColumns, 1), transformTitleColumns = _useTitleColumns2[0]; // ========================== Pagination ========================== var onPaginationChange = function onPaginationChange(current, pageSize) { triggerOnChange({ pagination: (0, _extends2["default"])((0, _extends2["default"])({}, changeEventInfo.pagination), { current: current, pageSize: pageSize }) }, 'paginate'); }; var _usePagination = (0, _usePagination3["default"])(mergedData.length, pagination, onPaginationChange), _usePagination2 = (0, _slicedToArray2["default"])(_usePagination, 2), mergedPagination = _usePagination2[0], resetPagination = _usePagination2[1]; changeEventInfo.pagination = pagination === false ? {} : (0, _usePagination3.getPaginationParam)(pagination, mergedPagination); changeEventInfo.resetPagination = resetPagination; // ============================= Data ============================= var pageData = React.useMemo(function () { if (pagination === false || !mergedPagination.pageSize) { return mergedData; } var _mergedPagination$cur = mergedPagination.current, current = _mergedPagination$cur === void 0 ? 1 : _mergedPagination$cur, total = mergedPagination.total, _mergedPagination$pag = mergedPagination.pageSize, pageSize = _mergedPagination$pag === void 0 ? _usePagination3.DEFAULT_PAGE_SIZE : _mergedPagination$pag; // Dynamic table data if (mergedData.length < total) { if (mergedData.length > pageSize) { (0, _devWarning["default"])(false, 'Table', '`dataSource` length is less than `pagination.total` but large than `pagination.pageSize`. Please make sure your config correct data with async mode.'); return mergedData.slice((current - 1) * pageSize, current * pageSize); } return mergedData; } return mergedData.slice((current - 1) * pageSize, current * pageSize); }, [!!pagination, mergedData, mergedPagination && mergedPagination.current, mergedPagination && mergedPagination.pageSize, mergedPagination && mergedPagination.total]); // ========================== Selections ========================== var _useSelection = (0, _useSelection3["default"])(rowSelection, { prefixCls: prefixCls, data: mergedData, pageData: pageData, getRowKey: getRowKey, getRecordByKey: getRecordByKey, expandType: expandType, childrenColumnName: childrenColumnName, locale: tableLocale, expandIconColumnIndex: mergedExpandable.expandIconColumnIndex, getPopupContainer: getPopupContainer }), _useSelection2 = (0, _slicedToArray2["default"])(_useSelection, 2), transformSelectionColumns = _useSelection2[0], selectedKeySet = _useSelection2[1]; var internalRowClassName = function internalRowClassName(record, index, indent) { var mergedRowClassName; if (typeof rowClassName === 'function') { mergedRowClassName = (0, _classnames["default"])(rowClassName(record, index, indent)); } else { mergedRowClassName = (0, _classnames["default"])(rowClassName); } return (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(prefixCls, "-row-selected"), selectedKeySet.has(getRowKey(record, index))), mergedRowClassName); }; // ========================== Expandable ========================== // Pass origin render status into `rc-table`, this can be removed when refactor with `rc-table` mergedExpandable.__PARENT_RENDER_ICON__ = mergedExpandable.expandIcon; // Customize expandable icon mergedExpandable.expandIcon = mergedExpandable.expandIcon || expandIcon || (0, _ExpandIcon["default"])(tableLocale); // Adjust expand icon index, no overwrite expandIconColumnIndex if set. if (expandType === 'nest' && mergedExpandable.expandIconColumnIndex === undefined) { mergedExpandable.expandIconColumnIndex = rowSelection ? 1 : 0; } else if (mergedExpandable.expandIconColumnIndex > 0 && rowSelection) { mergedExpandable.expandIconColumnIndex -= 1; } // Indent size if (typeof mergedExpandable.indentSize !== 'number') { mergedExpandable.indentSize = typeof indentSize === 'number' ? indentSize : 15; } // ============================ Render ============================ var transformColumns = React.useCallback(function (innerColumns) { return transformTitleColumns(transformSelectionColumns(transformFilterColumns(transformSorterColumns(innerColumns)))); }, [transformSorterColumns, transformFilterColumns, transformSelectionColumns]); var topPaginationNode; var bottomPaginationNode; if (pagination !== false && (mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.total)) { var paginationSize; if (mergedPagination.size) { paginationSize = mergedPagination.size; } else { paginationSize = mergedSize === 'small' || mergedSize === 'middle' ? 'small' : undefined; } var renderPagination = function renderPagination(position) { return /*#__PURE__*/React.createElement(_pagination["default"], (0, _extends2["default"])({ className: "".concat(prefixCls, "-pagination ").concat(prefixCls, "-pagination-").concat(position) }, mergedPagination, { size: paginationSize })); }; var defaultPosition = direction === 'rtl' ? 'left' : 'right'; if (mergedPagination.position !== null && Array.isArray(mergedPagination.position)) { var topPos = mergedPagination.position.find(function (p) { return p.indexOf('top') !== -1; }); var bottomPos = mergedPagination.position.find(function (p) { return p.indexOf('bottom') !== -1; }); if (!topPos && !bottomPos) { bottomPaginationNode = renderPagination(defaultPosition); } else { if (topPos) { topPaginationNode = renderPagination(topPos.toLowerCase().replace('top', '')); } if (bottomPos) { bottomPaginationNode = renderPagination(bottomPos.toLowerCase().replace('bottom', '')); } } } else { bottomPaginationNode = renderPagination(defaultPosition); } } // >>>>>>>>> Spinning var spinProps; if (typeof loading === 'boolean') { spinProps = { spinning: loading }; } else if ((0, _typeof2["default"])(loading) === 'object') { spinProps = (0, _extends2["default"])({ spinning: true }, loading); } var wrapperClassNames = (0, _classnames["default"])("".concat(prefixCls, "-wrapper"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-wrapper-rtl"), direction === 'rtl'), className); return /*#__PURE__*/React.createElement("div", { className: wrapperClassNames, style: style }, /*#__PURE__*/React.createElement(_spin["default"], (0, _extends2["default"])({ spinning: false }, spinProps), topPaginationNode, /*#__PURE__*/React.createElement(_rcTable["default"], (0, _extends2["default"])({}, tableProps, { columns: mergedColumns, direction: direction, expandable: mergedExpandable, prefixCls: prefixCls, className: (0, _classnames["default"])((_classNames3 = {}, (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-middle"), mergedSize === 'middle'), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-small"), mergedSize === 'small'), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-bordered"), bordered), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-empty"), rawData.length === 0), _classNames3)), data: pageData, rowKey: getRowKey, rowClassName: internalRowClassName, emptyText: locale && locale.emptyText || renderEmpty('Table') // Internal , internalHooks: _Table.INTERNAL_HOOKS, internalRefs: internalRefs, transformColumns: transformColumns })), bottomPaginationNode)); } Table.defaultProps = { rowKey: 'key' }; Table.SELECTION_ALL = _useSelection3.SELECTION_ALL; Table.SELECTION_INVERT = _useSelection3.SELECTION_INVERT; Table.Column = _Column["default"]; Table.ColumnGroup = _ColumnGroup["default"]; Table.Summary = _rcTable.Summary; var _default = Table; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/scrollTo":226,"../config-provider/SizeContext":276,"../config-provider/context":277,"../grid/hooks/useBreakpoint":314,"../locale/en_US":336,"../pagination":357,"../spin":392,"./Column":400,"./ColumnGroup":401,"./ExpandIcon":402,"./hooks/useFilter":406,"./hooks/useLazyKVMap":407,"./hooks/usePagination":408,"./hooks/useSelection":409,"./hooks/useSorter":410,"./hooks/useTitleColumns":411,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"classnames":455,"omit.js":579,"rc-table":788,"rc-table/lib/Table":780,"rc-table/lib/hooks/useColumns":784,"react":"react"}],404:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); var _FilterFilled = _interopRequireDefault(require("@ant-design/icons/FilterFilled")); var _button = _interopRequireDefault(require("../../../button")); var _menu = _interopRequireDefault(require("../../../menu")); var _checkbox = _interopRequireDefault(require("../../../checkbox")); var _radio = _interopRequireDefault(require("../../../radio")); var _dropdown = _interopRequireDefault(require("../../../dropdown")); var _empty = _interopRequireDefault(require("../../../empty")); var _FilterWrapper = _interopRequireDefault(require("./FilterWrapper")); var _useSyncState3 = _interopRequireDefault(require("../../../_util/hooks/useSyncState")); var _context = require("../../../config-provider/context"); var SubMenu = _menu["default"].SubMenu, MenuItem = _menu["default"].Item; function hasSubMenu(filters) { return filters.some(function (_ref) { var children = _ref.children; return children; }); } function renderFilterItems(_ref2) { var filters = _ref2.filters, prefixCls = _ref2.prefixCls, filteredKeys = _ref2.filteredKeys, filterMultiple = _ref2.filterMultiple, locale = _ref2.locale; if (filters.length === 0) { // wrapped with
to avoid react warning // https://github.com/ant-design/ant-design/issues/25979 return /*#__PURE__*/React.createElement("div", { style: { margin: '16px 0' } }, /*#__PURE__*/React.createElement(_empty["default"], { image: _empty["default"].PRESENTED_IMAGE_SIMPLE, description: locale.filterEmptyText, imageStyle: { height: 24 } })); } return filters.map(function (filter, index) { var key = String(filter.value); if (filter.children) { return /*#__PURE__*/React.createElement(SubMenu, { key: key || index, title: filter.text, popupClassName: "".concat(prefixCls, "-dropdown-submenu") }, renderFilterItems({ filters: filter.children, prefixCls: prefixCls, filteredKeys: filteredKeys, filterMultiple: filterMultiple, locale: locale })); } var Component = filterMultiple ? _checkbox["default"] : _radio["default"]; return /*#__PURE__*/React.createElement(MenuItem, { key: filter.value !== undefined ? key : index }, /*#__PURE__*/React.createElement(Component, { checked: filteredKeys.includes(key) }), /*#__PURE__*/React.createElement("span", null, filter.text)); }); } function FilterDropdown(props) { var _a; var prefixCls = props.prefixCls, column = props.column, dropdownPrefixCls = props.dropdownPrefixCls, columnKey = props.columnKey, filterMultiple = props.filterMultiple, filterState = props.filterState, triggerFilter = props.triggerFilter, locale = props.locale, children = props.children, getPopupContainer = props.getPopupContainer; var filterDropdownVisible = column.filterDropdownVisible, onFilterDropdownVisibleChange = column.onFilterDropdownVisibleChange; var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1]; var filtered = !!(filterState && (((_a = filterState.filteredKeys) === null || _a === void 0 ? void 0 : _a.length) || filterState.forceFiltered)); var triggerVisible = function triggerVisible(newVisible) { setVisible(newVisible); if (onFilterDropdownVisibleChange) { onFilterDropdownVisibleChange(newVisible); } }; var mergedVisible = typeof filterDropdownVisible === 'boolean' ? filterDropdownVisible : visible; // ===================== Select Keys ===================== var propFilteredKeys = filterState && filterState.filteredKeys; var _useSyncState = (0, _useSyncState3["default"])(propFilteredKeys || []), _useSyncState2 = (0, _slicedToArray2["default"])(_useSyncState, 2), getFilteredKeysSync = _useSyncState2[0], setFilteredKeysSync = _useSyncState2[1]; var onSelectKeys = function onSelectKeys(_ref3) { var selectedKeys = _ref3.selectedKeys; setFilteredKeysSync(selectedKeys); }; React.useEffect(function () { onSelectKeys({ selectedKeys: propFilteredKeys || [] }); }, [propFilteredKeys]); // ====================== Open Keys ====================== var _React$useState3 = React.useState([]), _React$useState4 = (0, _slicedToArray2["default"])(_React$useState3, 2), openKeys = _React$useState4[0], setOpenKeys = _React$useState4[1]; var openRef = React.useRef(); var onOpenChange = function onOpenChange(keys) { openRef.current = window.setTimeout(function () { setOpenKeys(keys); }); }; var onMenuClick = function onMenuClick() { window.clearTimeout(openRef.current); }; React.useEffect(function () { return function () { window.clearTimeout(openRef.current); }; }, []); // ======================= Submit ======================== var internalTriggerFilter = function internalTriggerFilter(keys) { triggerVisible(false); var mergedKeys = keys && keys.length ? keys : null; if (mergedKeys === null && (!filterState || !filterState.filteredKeys)) { return null; } if ((0, _isEqual["default"])(mergedKeys, filterState === null || filterState === void 0 ? void 0 : filterState.filteredKeys)) { return null; } triggerFilter({ column: column, key: columnKey, filteredKeys: mergedKeys }); }; var onConfirm = function onConfirm() { internalTriggerFilter(getFilteredKeysSync()); }; var onReset = function onReset() { setFilteredKeysSync([]); internalTriggerFilter([]); }; var onVisibleChange = function onVisibleChange(newVisible) { if (newVisible && propFilteredKeys !== undefined) { // Sync filteredKeys on appear in controlled mode (propFilteredKeys !== undefiend) setFilteredKeysSync(propFilteredKeys || []); } triggerVisible(newVisible); // Default will filter when closed if (!newVisible && !column.filterDropdown) { onConfirm(); } }; // ======================== Style ======================== var dropdownMenuClass = (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(dropdownPrefixCls, "-menu-without-submenu"), !hasSubMenu(column.filters || []))); var dropdownContent; if (typeof column.filterDropdown === 'function') { dropdownContent = column.filterDropdown({ prefixCls: "".concat(dropdownPrefixCls, "-custom"), setSelectedKeys: function setSelectedKeys(selectedKeys) { return onSelectKeys({ selectedKeys: selectedKeys }); }, selectedKeys: getFilteredKeysSync(), confirm: onConfirm, clearFilters: onReset, filters: column.filters, visible: mergedVisible }); } else if (column.filterDropdown) { dropdownContent = column.filterDropdown; } else { var selectedKeys = getFilteredKeysSync() || []; dropdownContent = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_menu["default"], { multiple: filterMultiple, prefixCls: "".concat(dropdownPrefixCls, "-menu"), className: dropdownMenuClass, onClick: onMenuClick, onSelect: onSelectKeys, onDeselect: onSelectKeys, selectedKeys: selectedKeys, getPopupContainer: getPopupContainer, openKeys: openKeys, onOpenChange: onOpenChange }, renderFilterItems({ filters: column.filters || [], prefixCls: prefixCls, filteredKeys: getFilteredKeysSync(), filterMultiple: filterMultiple, locale: locale })), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-dropdown-btns") }, /*#__PURE__*/React.createElement(_button["default"], { type: "link", size: "small", disabled: selectedKeys.length === 0, onClick: onReset }, locale.filterReset), /*#__PURE__*/React.createElement(_button["default"], { type: "primary", size: "small", onClick: onConfirm }, locale.filterConfirm))); } var menu = /*#__PURE__*/React.createElement(_FilterWrapper["default"], { className: "".concat(prefixCls, "-dropdown") }, dropdownContent); var filterIcon; if (typeof column.filterIcon === 'function') { filterIcon = column.filterIcon(filtered); } else if (column.filterIcon) { filterIcon = column.filterIcon; } else { filterIcon = /*#__PURE__*/React.createElement(_FilterFilled["default"], null); } var _React$useContext = React.useContext(_context.ConfigContext), direction = _React$useContext.direction; return /*#__PURE__*/React.createElement("div", { className: (0, _classnames["default"])("".concat(prefixCls, "-column")) }, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-column-title") }, children), /*#__PURE__*/React.createElement("span", { className: (0, _classnames["default"])("".concat(prefixCls, "-trigger-container"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-trigger-container-open"), mergedVisible)), onClick: function onClick(e) { e.stopPropagation(); } }, /*#__PURE__*/React.createElement(_dropdown["default"], { overlay: menu, trigger: ['click'], visible: mergedVisible, onVisibleChange: onVisibleChange, getPopupContainer: getPopupContainer, placement: direction === 'rtl' ? 'bottomLeft' : 'bottomRight' }, /*#__PURE__*/React.createElement("span", { role: "button", tabIndex: -1, className: (0, _classnames["default"])("".concat(prefixCls, "-trigger"), { active: filtered }) }, filterIcon)))); } var _default = FilterDropdown; exports["default"] = _default; },{"../../../_util/hooks/useSyncState":219,"../../../button":257,"../../../checkbox":269,"../../../config-provider/context":277,"../../../dropdown":296,"../../../empty":298,"../../../menu":341,"../../../radio":368,"./FilterWrapper":405,"@ant-design/icons/FilterFilled":87,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"lodash/isEqual":557,"react":"react"}],405:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var FilterDropdownMenuWrapper = function FilterDropdownMenuWrapper(props) { return /*#__PURE__*/React.createElement("div", { className: props.className, onClick: function onClick(e) { return e.stopPropagation(); } }, props.children); }; var _default = FilterDropdownMenuWrapper; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],406:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getFilterData = getFilterData; exports["default"] = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var React = _interopRequireWildcard(require("react")); var _util = require("../../util"); var _FilterDropdown = _interopRequireDefault(require("./FilterDropdown")); function collectFilterStates(columns, init, pos) { var filterStates = []; (columns || []).forEach(function (column, index) { var columnPos = (0, _util.getColumnPos)(index, pos); if ('children' in column) { filterStates = [].concat((0, _toConsumableArray2["default"])(filterStates), (0, _toConsumableArray2["default"])(collectFilterStates(column.children, init, columnPos))); } else if (column.filters || 'filterDropdown' in column || 'onFilter' in column) { if ('filteredValue' in column) { // Controlled filterStates.push({ column: column, key: (0, _util.getColumnKey)(column, columnPos), filteredKeys: column.filteredValue, forceFiltered: column.filtered }); } else { // Uncontrolled filterStates.push({ column: column, key: (0, _util.getColumnKey)(column, columnPos), filteredKeys: init && column.defaultFilteredValue ? column.defaultFilteredValue : undefined, forceFiltered: column.filtered }); } } }); return filterStates; } function injectFilter(prefixCls, dropdownPrefixCls, columns, filterStates, triggerFilter, getPopupContainer, locale, pos) { return columns.map(function (column, index) { var columnPos = (0, _util.getColumnPos)(index, pos); var _column$filterMultipl = column.filterMultiple, filterMultiple = _column$filterMultipl === void 0 ? true : _column$filterMultipl; if (column.filters || 'filterDropdown' in column) { var columnKey = (0, _util.getColumnKey)(column, columnPos); var filterState = filterStates.find(function (_ref) { var key = _ref.key; return columnKey === key; }); return (0, _extends2["default"])((0, _extends2["default"])({}, column), { title: function title(renderProps) { return /*#__PURE__*/React.createElement(_FilterDropdown["default"], { prefixCls: "".concat(prefixCls, "-filter"), dropdownPrefixCls: dropdownPrefixCls, column: column, columnKey: columnKey, filterState: filterState, filterMultiple: filterMultiple, triggerFilter: triggerFilter, locale: locale, getPopupContainer: getPopupContainer }, (0, _util.renderColumnTitle)(column.title, renderProps)); } }); } if ('children' in column) { return (0, _extends2["default"])((0, _extends2["default"])({}, column), { children: injectFilter(prefixCls, dropdownPrefixCls, column.children, filterStates, triggerFilter, getPopupContainer, locale, columnPos) }); } return column; }); } function generateFilterInfo(filterStates) { var currentFilters = {}; filterStates.forEach(function (_ref2) { var key = _ref2.key, filteredKeys = _ref2.filteredKeys; currentFilters[key] = filteredKeys || null; }); return currentFilters; } function flattenKeys(filters) { var keys = []; (filters || []).forEach(function (_ref3) { var value = _ref3.value, children = _ref3.children; keys.push(value); if (children) { keys = [].concat((0, _toConsumableArray2["default"])(keys), (0, _toConsumableArray2["default"])(flattenKeys(children))); } }); return keys; } function getFilterData(data, filterStates) { return filterStates.reduce(function (currentData, filterState) { var _filterState$column = filterState.column, onFilter = _filterState$column.onFilter, filters = _filterState$column.filters, filteredKeys = filterState.filteredKeys; if (onFilter && filteredKeys && filteredKeys.length) { return currentData.filter(function (record) { return filteredKeys.some(function (key) { var keys = flattenKeys(filters); var keyIndex = keys.findIndex(function (k) { return String(k) === String(key); }); var realKey = keyIndex !== -1 ? keys[keyIndex] : key; return onFilter(realKey, record); }); }); } return currentData; }, data); } function useFilter(_ref4) { var prefixCls = _ref4.prefixCls, dropdownPrefixCls = _ref4.dropdownPrefixCls, mergedColumns = _ref4.mergedColumns, onFilterChange = _ref4.onFilterChange, getPopupContainer = _ref4.getPopupContainer, tableLocale = _ref4.locale; var _React$useState = React.useState(collectFilterStates(mergedColumns, true)), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), filterStates = _React$useState2[0], setFilterStates = _React$useState2[1]; var mergedFilterStates = React.useMemo(function () { var collectedStates = collectFilterStates(mergedColumns, false); // Return if not controlled if (collectedStates.every(function (_ref5) { var filteredKeys = _ref5.filteredKeys; return filteredKeys === undefined; })) { return filterStates; } return collectedStates; }, [mergedColumns, filterStates]); var getFilters = React.useCallback(function () { return generateFilterInfo(mergedFilterStates); }, [mergedFilterStates]); var triggerFilter = function triggerFilter(filterState) { var newFilterStates = mergedFilterStates.filter(function (_ref6) { var key = _ref6.key; return key !== filterState.key; }); newFilterStates.push(filterState); setFilterStates(newFilterStates); onFilterChange(generateFilterInfo(newFilterStates), newFilterStates); }; var transformColumns = function transformColumns(innerColumns) { return injectFilter(prefixCls, dropdownPrefixCls, innerColumns, mergedFilterStates, triggerFilter, getPopupContainer, tableLocale); }; return [transformColumns, mergedFilterStates, getFilters]; } var _default = useFilter; exports["default"] = _default; },{"../../util":413,"./FilterDropdown":404,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"react":"react"}],407:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useLazyKVMap; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); function useLazyKVMap(data, childrenColumnName, getRowKey) { var mapCacheRef = React.useRef({}); function getRecordByKey(key) { if (!mapCacheRef.current || mapCacheRef.current.data !== data || mapCacheRef.current.childrenColumnName !== childrenColumnName || mapCacheRef.current.getRowKey !== getRowKey) { /* eslint-disable no-inner-declarations */ var dig = function dig(records) { records.forEach(function (record, index) { var rowKey = getRowKey(record, index); kvMap.set(rowKey, record); if (record && (0, _typeof2["default"])(record) === 'object' && childrenColumnName in record) { dig(record[childrenColumnName] || []); } }); }; /* eslint-enable */ var kvMap = new Map(); dig(data); mapCacheRef.current = { data: data, childrenColumnName: childrenColumnName, kvMap: kvMap, getRowKey: getRowKey }; } return mapCacheRef.current.kvMap.get(key); } return [getRecordByKey]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"react":"react"}],408:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getPaginationParam = getPaginationParam; exports["default"] = usePagination; exports.DEFAULT_PAGE_SIZE = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _react = require("react"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var DEFAULT_PAGE_SIZE = 10; exports.DEFAULT_PAGE_SIZE = DEFAULT_PAGE_SIZE; function getPaginationParam(pagination, mergedPagination) { var param = { current: mergedPagination.current, pageSize: mergedPagination.pageSize }; var paginationObj = pagination && (0, _typeof2["default"])(pagination) === 'object' ? pagination : {}; Object.keys(paginationObj).forEach(function (pageProp) { var value = mergedPagination[pageProp]; if (typeof value !== 'function') { param[pageProp] = value; } }); return param; } function extendsObject() { var result = {}; for (var _len = arguments.length, list = new Array(_len), _key = 0; _key < _len; _key++) { list[_key] = arguments[_key]; } list.forEach(function (obj) { if (obj) { Object.keys(obj).forEach(function (key) { var val = obj[key]; if (val !== undefined) { result[key] = val; } }); } }); return result; } function usePagination(total, pagination, onChange) { var _a = pagination && (0, _typeof2["default"])(pagination) === 'object' ? pagination : {}, _a$total = _a.total, paginationTotal = _a$total === void 0 ? 0 : _a$total, paginationObj = __rest(_a, ["total"]); var _useState = (0, _react.useState)(function () { return { current: 'defaultCurrent' in paginationObj ? paginationObj.defaultCurrent : 1, pageSize: 'defaultPageSize' in paginationObj ? paginationObj.defaultPageSize : DEFAULT_PAGE_SIZE }; }), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), innerPagination = _useState2[0], setInnerPagination = _useState2[1]; // ============ Basic Pagination Config ============ var mergedPagination = extendsObject(innerPagination, paginationObj, { total: paginationTotal > 0 ? paginationTotal : total }); if (!paginationTotal) { // Reset `current` if data length changed. Only reset when paginationObj do not have total var maxPage = Math.ceil(total / mergedPagination.pageSize); if (maxPage < mergedPagination.current) { mergedPagination.current = 1; } } var refreshPagination = function refreshPagination() { var current = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var pageSize = arguments.length > 1 ? arguments[1] : undefined; setInnerPagination((0, _extends2["default"])((0, _extends2["default"])({}, mergedPagination), { current: current, pageSize: pageSize || mergedPagination.pageSize })); }; var onInternalChange = function onInternalChange(current, pageSize) { var paginationPageSize = mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.pageSize; if (pageSize && pageSize !== paginationPageSize) { current = 1; if (pagination && pagination.onShowSizeChange) pagination.onShowSizeChange(current, pageSize); } if (pagination && pagination.onChange) pagination.onChange(current, pageSize); refreshPagination(current, pageSize); onChange(current, pageSize || paginationPageSize); }; if (pagination === false) { return [{}, function () {}]; } return [(0, _extends2["default"])((0, _extends2["default"])({}, mergedPagination), { onChange: onInternalChange }), refreshPagination]; } },{"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"react":"react"}],409:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useSelection; exports.SELECTION_INVERT = exports.SELECTION_ALL = void 0; var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _DownOutlined = _interopRequireDefault(require("@ant-design/icons/DownOutlined")); var _treeUtil = require("rc-tree/lib/utils/treeUtil"); var _conductUtil = require("rc-tree/lib/utils/conductUtil"); var _util = require("rc-tree/lib/util"); var _rcTable = require("rc-table"); var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _checkbox = _interopRequireDefault(require("../../checkbox")); var _dropdown = _interopRequireDefault(require("../../dropdown")); var _menu = _interopRequireDefault(require("../../menu")); var _radio = _interopRequireDefault(require("../../radio")); var _devWarning = _interopRequireDefault(require("../../_util/devWarning")); // TODO: warning if use ajax!!! var SELECTION_ALL = 'SELECT_ALL'; exports.SELECTION_ALL = SELECTION_ALL; var SELECTION_INVERT = 'SELECT_INVERT'; exports.SELECTION_INVERT = SELECTION_INVERT; function getFixedType(column) { return column && column.fixed; } function flattenData(data, childrenColumnName) { var list = []; (data || []).forEach(function (record) { list.push(record); if (record && (0, _typeof2["default"])(record) === 'object' && childrenColumnName in record) { list = [].concat((0, _toConsumableArray2["default"])(list), (0, _toConsumableArray2["default"])(flattenData(record[childrenColumnName], childrenColumnName))); } }); return list; } function useSelection(rowSelection, config) { var _ref = rowSelection || {}, preserveSelectedRowKeys = _ref.preserveSelectedRowKeys, selectedRowKeys = _ref.selectedRowKeys, getCheckboxProps = _ref.getCheckboxProps, onSelectionChange = _ref.onChange, onSelect = _ref.onSelect, onSelectAll = _ref.onSelectAll, onSelectInvert = _ref.onSelectInvert, onSelectMultiple = _ref.onSelectMultiple, selectionColWidth = _ref.columnWidth, selectionType = _ref.type, selections = _ref.selections, fixed = _ref.fixed, customizeRenderCell = _ref.renderCell, hideSelectAll = _ref.hideSelectAll, _ref$checkStrictly = _ref.checkStrictly, checkStrictly = _ref$checkStrictly === void 0 ? true : _ref$checkStrictly; var prefixCls = config.prefixCls, data = config.data, pageData = config.pageData, getRecordByKey = config.getRecordByKey, getRowKey = config.getRowKey, expandType = config.expandType, childrenColumnName = config.childrenColumnName, tableLocale = config.locale, expandIconColumnIndex = config.expandIconColumnIndex, getPopupContainer = config.getPopupContainer; // ======================== Caches ======================== var preserveRecordsRef = React.useRef(new Map()); // ========================= Keys ========================= var _useMergedState = (0, _useMergedState3["default"])(selectedRowKeys || [], { value: selectedRowKeys }), _useMergedState2 = (0, _slicedToArray2["default"])(_useMergedState, 2), mergedSelectedKeys = _useMergedState2[0], setMergedSelectedKeys = _useMergedState2[1]; var _useMemo = (0, React.useMemo)(function () { return checkStrictly ? { keyEntities: null } : (0, _treeUtil.convertDataToEntities)(data, undefined, getRowKey); }, [data, getRowKey, checkStrictly]), keyEntities = _useMemo.keyEntities; // Get flatten data var flattedData = (0, React.useMemo)(function () { return flattenData(pageData, childrenColumnName); }, [pageData, childrenColumnName]); // Get all checkbox props var checkboxPropsMap = (0, React.useMemo)(function () { var map = new Map(); flattedData.forEach(function (record, index) { var key = getRowKey(record, index); var checkboxProps = (getCheckboxProps ? getCheckboxProps(record) : null) || {}; map.set(key, checkboxProps); if (process.env.NODE_ENV !== 'production' && ('checked' in checkboxProps || 'defaultChecked' in checkboxProps)) { (0, _devWarning["default"])(false, 'Table', 'Do not set `checked` or `defaultChecked` in `getCheckboxProps`. Please use `selectedRowKeys` instead.'); } }); return map; }, [flattedData, getRowKey, getCheckboxProps]); var isCheckboxDisabled = (0, React.useCallback)(function (r) { var _a; return !!((_a = checkboxPropsMap.get(getRowKey(r))) === null || _a === void 0 ? void 0 : _a.disabled); }, [checkboxPropsMap, getRowKey]); var _useMemo2 = (0, React.useMemo)(function () { if (checkStrictly) { return [mergedSelectedKeys, []]; } var _conductCheck = (0, _conductUtil.conductCheck)(mergedSelectedKeys, true, keyEntities, isCheckboxDisabled), checkedKeys = _conductCheck.checkedKeys, halfCheckedKeys = _conductCheck.halfCheckedKeys; return [checkedKeys, halfCheckedKeys]; }, [mergedSelectedKeys, checkStrictly, keyEntities, isCheckboxDisabled]), _useMemo3 = (0, _slicedToArray2["default"])(_useMemo2, 2), derivedSelectedKeys = _useMemo3[0], derivedHalfSelectedKeys = _useMemo3[1]; var derivedSelectedKeySet = (0, React.useMemo)(function () { var keys = selectionType === 'radio' ? derivedSelectedKeys.slice(0, 1) : derivedSelectedKeys; return new Set(keys); }, [derivedSelectedKeys, selectionType]); var derivedHalfSelectedKeySet = (0, React.useMemo)(function () { return selectionType === 'radio' ? new Set() : new Set(derivedHalfSelectedKeys); }, [derivedHalfSelectedKeys, selectionType]); // Save last selected key to enable range selection var _useState = (0, React.useState)(null), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), lastSelectedKey = _useState2[0], setLastSelectedKey = _useState2[1]; // Reset if rowSelection reset React.useEffect(function () { if (!rowSelection) { setMergedSelectedKeys([]); } }, [!!rowSelection]); var setSelectedKeys = (0, React.useCallback)(function (keys) { var availableKeys; var records; if (preserveSelectedRowKeys) { // Keep key if mark as preserveSelectedRowKeys var newCache = new Map(); availableKeys = keys; records = keys.map(function (key) { var record = getRecordByKey(key); if (!record && preserveRecordsRef.current.has(key)) { record = preserveRecordsRef.current.get(key); } newCache.set(key, record); return record; }); // Refresh to new cache preserveRecordsRef.current = newCache; } else { // Filter key which not exist in the `dataSource` availableKeys = []; records = []; keys.forEach(function (key) { var record = getRecordByKey(key); if (record !== undefined) { availableKeys.push(key); records.push(record); } }); } setMergedSelectedKeys(availableKeys); if (onSelectionChange) { onSelectionChange(availableKeys, records); } }, [setMergedSelectedKeys, getRecordByKey, onSelectionChange, preserveSelectedRowKeys]); // ====================== Selections ====================== // Trigger single `onSelect` event var triggerSingleSelection = (0, React.useCallback)(function (key, selected, keys, event) { if (onSelect) { var rows = keys.map(function (k) { return getRecordByKey(k); }); onSelect(getRecordByKey(key), selected, rows, event); } setSelectedKeys(keys); }, [onSelect, getRecordByKey, setSelectedKeys]); var mergedSelections = (0, React.useMemo)(function () { if (!selections || hideSelectAll) { return null; } var selectionList = selections === true ? [SELECTION_ALL, SELECTION_INVERT] : selections; return selectionList.map(function (selection) { if (selection === SELECTION_ALL) { return { key: 'all', text: tableLocale.selectionAll, onSelect: function onSelect() { setSelectedKeys(data.map(function (record, index) { return getRowKey(record, index); })); } }; } if (selection === SELECTION_INVERT) { return { key: 'invert', text: tableLocale.selectInvert, onSelect: function onSelect() { var keySet = new Set(derivedSelectedKeySet); pageData.forEach(function (record, index) { var key = getRowKey(record, index); if (keySet.has(key)) { keySet["delete"](key); } else { keySet.add(key); } }); var keys = Array.from(keySet); setSelectedKeys(keys); if (onSelectInvert) { (0, _devWarning["default"])(false, 'Table', '`onSelectInvert` will be removed in future. Please use `onChange` instead.'); onSelectInvert(keys); } } }; } return selection; }); }, [selections, derivedSelectedKeySet, pageData, getRowKey, onSelectInvert, setSelectedKeys]); // ======================= Columns ======================== var transformColumns = (0, React.useCallback)(function (columns) { if (!rowSelection) { return columns; } // Support selection var keySet = new Set(derivedSelectedKeySet); // Record key only need check with enabled var recordKeys = flattedData.map(getRowKey).filter(function (key) { return !checkboxPropsMap.get(key).disabled; }); var checkedCurrentAll = recordKeys.every(function (key) { return keySet.has(key); }); var checkedCurrentSome = recordKeys.some(function (key) { return keySet.has(key); }); var onSelectAllChange = function onSelectAllChange() { var changeKeys = []; if (checkedCurrentAll) { recordKeys.forEach(function (key) { keySet["delete"](key); changeKeys.push(key); }); } else { recordKeys.forEach(function (key) { if (!keySet.has(key)) { keySet.add(key); changeKeys.push(key); } }); } var keys = Array.from(keySet); setSelectedKeys(keys); if (onSelectAll) { onSelectAll(!checkedCurrentAll, keys.map(function (k) { return getRecordByKey(k); }), changeKeys.map(function (k) { return getRecordByKey(k); })); } }; // ===================== Render ===================== // Title Cell var title; if (selectionType !== 'radio') { var customizeSelections; if (mergedSelections) { var menu = /*#__PURE__*/React.createElement(_menu["default"], { getPopupContainer: getPopupContainer }, mergedSelections.map(function (selection, index) { var key = selection.key, text = selection.text, onSelectionClick = selection.onSelect; return /*#__PURE__*/React.createElement(_menu["default"].Item, { key: key || index, onClick: function onClick() { if (onSelectionClick) { onSelectionClick(recordKeys); } } }, text); })); customizeSelections = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-selection-extra") }, /*#__PURE__*/React.createElement(_dropdown["default"], { overlay: menu, getPopupContainer: getPopupContainer }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(_DownOutlined["default"], null)))); } var allDisabled = flattedData.every(function (record, index) { var key = getRowKey(record, index); var checkboxProps = checkboxPropsMap.get(key) || {}; return checkboxProps.disabled; }); title = !hideSelectAll && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-selection") }, /*#__PURE__*/React.createElement(_checkbox["default"], { checked: !allDisabled && !!flattedData.length && checkedCurrentAll, indeterminate: !checkedCurrentAll && checkedCurrentSome, onChange: onSelectAllChange, disabled: flattedData.length === 0 || allDisabled }), customizeSelections); } // Body Cell var renderCell; if (selectionType === 'radio') { renderCell = function renderCell(_, record, index) { var key = getRowKey(record, index); var checked = keySet.has(key); return { node: /*#__PURE__*/React.createElement(_radio["default"], (0, _extends2["default"])({}, checkboxPropsMap.get(key), { checked: checked, onClick: function onClick(e) { return e.stopPropagation(); }, onChange: function onChange(event) { if (!keySet.has(key)) { triggerSingleSelection(key, true, [key], event.nativeEvent); } } })), checked: checked }; }; } else { renderCell = function renderCell(_, record, index) { var _a; var key = getRowKey(record, index); var checked = keySet.has(key); var indeterminate = derivedHalfSelectedKeySet.has(key); var checkboxProps = checkboxPropsMap.get(key); var mergedIndeterminate; if (expandType === 'nest') { mergedIndeterminate = indeterminate; (0, _devWarning["default"])(!(typeof (checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.indeterminate) === 'boolean'), 'Table', 'set `indeterminate` using `rowSelection.getCheckboxProps` is not allowed with tree structured dataSource.'); } else { mergedIndeterminate = (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.indeterminate) !== null && _a !== void 0 ? _a : indeterminate; } // Record checked return { node: /*#__PURE__*/React.createElement(_checkbox["default"], (0, _extends2["default"])({}, checkboxProps, { indeterminate: mergedIndeterminate, checked: checked, onClick: function onClick(e) { return e.stopPropagation(); }, onChange: function onChange(_ref2) { var nativeEvent = _ref2.nativeEvent; var shiftKey = nativeEvent.shiftKey; var startIndex = -1; var endIndex = -1; // Get range of this if (shiftKey && checkStrictly) { var pointKeys = new Set([lastSelectedKey, key]); recordKeys.some(function (recordKey, recordIndex) { if (pointKeys.has(recordKey)) { if (startIndex === -1) { startIndex = recordIndex; } else { endIndex = recordIndex; return true; } } return false; }); } if (endIndex !== -1 && startIndex !== endIndex && checkStrictly) { // Batch update selections var rangeKeys = recordKeys.slice(startIndex, endIndex + 1); var changedKeys = []; if (checked) { rangeKeys.forEach(function (recordKey) { if (keySet.has(recordKey)) { changedKeys.push(recordKey); keySet["delete"](recordKey); } }); } else { rangeKeys.forEach(function (recordKey) { if (!keySet.has(recordKey)) { changedKeys.push(recordKey); keySet.add(recordKey); } }); } var keys = Array.from(keySet); setSelectedKeys(keys); if (onSelectMultiple) { onSelectMultiple(!checked, keys.map(function (recordKey) { return getRecordByKey(recordKey); }), changedKeys.map(function (recordKey) { return getRecordByKey(recordKey); })); } } else { // Single record selected var originCheckedKeys = derivedSelectedKeys; if (checkStrictly) { var checkedKeys = checked ? (0, _util.arrDel)(originCheckedKeys, key) : (0, _util.arrAdd)(originCheckedKeys, key); triggerSingleSelection(key, !checked, checkedKeys, nativeEvent); } else { // Always fill first var result = (0, _conductUtil.conductCheck)([].concat((0, _toConsumableArray2["default"])(originCheckedKeys), [key]), true, keyEntities, isCheckboxDisabled); var _checkedKeys = result.checkedKeys, halfCheckedKeys = result.halfCheckedKeys; var nextCheckedKeys = _checkedKeys; // If remove, we do it again to correction if (checked) { var tempKeySet = new Set(_checkedKeys); tempKeySet["delete"](key); nextCheckedKeys = (0, _conductUtil.conductCheck)(Array.from(tempKeySet), { checked: false, halfCheckedKeys: halfCheckedKeys }, keyEntities, isCheckboxDisabled).checkedKeys; } triggerSingleSelection(key, !checked, nextCheckedKeys, nativeEvent); } } setLastSelectedKey(key); } })), checked: checked }; }; } var renderSelectionCell = function renderSelectionCell(_, record, index) { var _renderCell = renderCell(_, record, index), node = _renderCell.node, checked = _renderCell.checked; if (customizeRenderCell) { return customizeRenderCell(checked, record, index, node); } return node; }; // Columns var selectionColumn = (0, _defineProperty2["default"])({ width: selectionColWidth, className: "".concat(prefixCls, "-selection-column"), title: rowSelection.columnTitle || title, render: renderSelectionCell }, _rcTable.INTERNAL_COL_DEFINE, { className: "".concat(prefixCls, "-selection-col") }); if (expandType === 'row' && columns.length && !expandIconColumnIndex) { var _columns = (0, _toArray2["default"])(columns), expandColumn = _columns[0], restColumns = _columns.slice(1); var selectionFixed = fixed || getFixedType(restColumns[0]); if (selectionFixed) { expandColumn.fixed = selectionFixed; } return [expandColumn, (0, _extends2["default"])((0, _extends2["default"])({}, selectionColumn), { fixed: selectionFixed })].concat((0, _toConsumableArray2["default"])(restColumns)); } return [(0, _extends2["default"])((0, _extends2["default"])({}, selectionColumn), { fixed: fixed || getFixedType(columns[0]) })].concat((0, _toConsumableArray2["default"])(columns)); }, [getRowKey, flattedData, rowSelection, derivedSelectedKeys, derivedSelectedKeySet, derivedHalfSelectedKeySet, selectionColWidth, mergedSelections, expandType, lastSelectedKey, checkboxPropsMap, onSelectMultiple, triggerSingleSelection, isCheckboxDisabled]); return [transformColumns, derivedSelectedKeySet]; } }).call(this,require('_process')) },{"../../_util/devWarning":212,"../../checkbox":269,"../../dropdown":296,"../../menu":341,"../../radio":368,"@ant-design/icons/DownOutlined":76,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toArray":206,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"_process":1,"rc-table":788,"rc-tree/lib/util":838,"rc-tree/lib/utils/conductUtil":839,"rc-tree/lib/utils/treeUtil":841,"rc-util/lib/hooks/useMergedState":871,"react":"react"}],410:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getSortData = getSortData; exports["default"] = useFilterSorter; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _CaretDownOutlined = _interopRequireDefault(require("@ant-design/icons/CaretDownOutlined")); var _CaretUpOutlined = _interopRequireDefault(require("@ant-design/icons/CaretUpOutlined")); var _tooltip = _interopRequireDefault(require("../../tooltip")); var _util = require("../util"); var ASCEND = 'ascend'; var DESCEND = 'descend'; function getMultiplePriority(column) { if ((0, _typeof2["default"])(column.sorter) === 'object' && typeof column.sorter.multiple === 'number') { return column.sorter.multiple; } return false; } function getSortFunction(sorter) { if (typeof sorter === 'function') { return sorter; } if (sorter && (0, _typeof2["default"])(sorter) === 'object' && sorter.compare) { return sorter.compare; } return false; } function nextSortDirection(sortDirections, current) { if (!current) { return sortDirections[0]; } return sortDirections[sortDirections.indexOf(current) + 1]; } function collectSortStates(columns, init, pos) { var sortStates = []; function pushState(column, columnPos) { sortStates.push({ column: column, key: (0, _util.getColumnKey)(column, columnPos), multiplePriority: getMultiplePriority(column), sortOrder: column.sortOrder }); } (columns || []).forEach(function (column, index) { var columnPos = (0, _util.getColumnPos)(index, pos); if (column.children) { if ('sortOrder' in column) { // Controlled pushState(column, columnPos); } sortStates = [].concat((0, _toConsumableArray2["default"])(sortStates), (0, _toConsumableArray2["default"])(collectSortStates(column.children, init, columnPos))); } else if (column.sorter) { if ('sortOrder' in column) { // Controlled pushState(column, columnPos); } else if (init && column.defaultSortOrder) { // Default sorter sortStates.push({ column: column, key: (0, _util.getColumnKey)(column, columnPos), multiplePriority: getMultiplePriority(column), sortOrder: column.defaultSortOrder }); } } }); return sortStates; } function injectSorter(prefixCls, columns, sorterSates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, pos) { return (columns || []).map(function (column, index) { var columnPos = (0, _util.getColumnPos)(index, pos); var newColumn = column; if (newColumn.sorter) { var sortDirections = newColumn.sortDirections || defaultSortDirections; var showSorterTooltip = newColumn.showSorterTooltip === undefined ? tableShowSorterTooltip : newColumn.showSorterTooltip; var columnKey = (0, _util.getColumnKey)(newColumn, columnPos); var sorterState = sorterSates.find(function (_ref) { var key = _ref.key; return key === columnKey; }); var sorterOrder = sorterState ? sorterState.sortOrder : null; var nextSortOrder = nextSortDirection(sortDirections, sorterOrder); var upNode = sortDirections.includes(ASCEND) && /*#__PURE__*/React.createElement(_CaretUpOutlined["default"], { className: (0, _classnames["default"])("".concat(prefixCls, "-column-sorter-up"), { active: sorterOrder === ASCEND }) }); var downNode = sortDirections.includes(DESCEND) && /*#__PURE__*/React.createElement(_CaretDownOutlined["default"], { className: (0, _classnames["default"])("".concat(prefixCls, "-column-sorter-down"), { active: sorterOrder === DESCEND }) }); var _ref2 = tableLocale || {}, cancelSort = _ref2.cancelSort, triggerAsc = _ref2.triggerAsc, triggerDesc = _ref2.triggerDesc; var sortTip = cancelSort; if (nextSortOrder === DESCEND) { sortTip = triggerDesc; } else if (nextSortOrder === ASCEND) { sortTip = triggerAsc; } newColumn = (0, _extends3["default"])((0, _extends3["default"])({}, newColumn), { className: (0, _classnames["default"])(newColumn.className, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-column-sort"), sorterOrder)), title: function title(renderProps) { var renderSortTitle = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-column-sorters") }, /*#__PURE__*/React.createElement("span", null, (0, _util.renderColumnTitle)(column.title, renderProps)), /*#__PURE__*/React.createElement("span", { className: (0, _classnames["default"])("".concat(prefixCls, "-column-sorter"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-column-sorter-full"), upNode && downNode)) }, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-column-sorter-inner") }, upNode, downNode))); return showSorterTooltip ? /*#__PURE__*/React.createElement(_tooltip["default"], { title: sortTip }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-column-sorters-with-tooltip") }, renderSortTitle)) : renderSortTitle; }, onHeaderCell: function onHeaderCell(col) { var cell = column.onHeaderCell && column.onHeaderCell(col) || {}; var originOnClick = cell.onClick; cell.onClick = function (event) { triggerSorter({ column: column, key: columnKey, sortOrder: nextSortOrder, multiplePriority: getMultiplePriority(column) }); if (originOnClick) { originOnClick(event); } }; cell.className = (0, _classnames["default"])(cell.className, "".concat(prefixCls, "-column-has-sorters")); return cell; } }); } if ('children' in newColumn) { newColumn = (0, _extends3["default"])((0, _extends3["default"])({}, newColumn), { children: injectSorter(prefixCls, newColumn.children, sorterSates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, columnPos) }); } return newColumn; }); } function stateToInfo(sorterStates) { var column = sorterStates.column, sortOrder = sorterStates.sortOrder; return { column: column, order: sortOrder, field: column.dataIndex, columnKey: column.key }; } function generateSorterInfo(sorterStates) { var list = sorterStates.filter(function (_ref3) { var sortOrder = _ref3.sortOrder; return sortOrder; }).map(stateToInfo); // =========== Legacy compatible support =========== // https://github.com/ant-design/ant-design/pull/19226 if (list.length === 0 && sorterStates.length) { return (0, _extends3["default"])((0, _extends3["default"])({}, stateToInfo(sorterStates[sorterStates.length - 1])), { column: undefined }); } if (list.length <= 1) { return list[0] || {}; } return list; } function getSortData(data, sortStates, childrenColumnName) { var innerSorterStates = sortStates.slice().sort(function (a, b) { return b.multiplePriority - a.multiplePriority; }); var cloneData = data.slice(); var runningSorters = innerSorterStates.filter(function (_ref4) { var sorter = _ref4.column.sorter, sortOrder = _ref4.sortOrder; return getSortFunction(sorter) && sortOrder; }); // Skip if no sorter needed if (!runningSorters.length) { return cloneData; } return cloneData.sort(function (record1, record2) { for (var i = 0; i < runningSorters.length; i += 1) { var sorterState = runningSorters[i]; var sorter = sorterState.column.sorter, sortOrder = sorterState.sortOrder; var compareFn = getSortFunction(sorter); if (compareFn && sortOrder) { var compareResult = compareFn(record1, record2, sortOrder); if (compareResult !== 0) { return sortOrder === ASCEND ? compareResult : -compareResult; } } } return 0; }).map(function (record) { var subRecords = record[childrenColumnName]; if (subRecords) { return (0, _extends3["default"])((0, _extends3["default"])({}, record), (0, _defineProperty2["default"])({}, childrenColumnName, getSortData(subRecords, sortStates, childrenColumnName))); } return record; }); } function useFilterSorter(_ref5) { var prefixCls = _ref5.prefixCls, mergedColumns = _ref5.mergedColumns, onSorterChange = _ref5.onSorterChange, sortDirections = _ref5.sortDirections, tableLocale = _ref5.tableLocale, showSorterTooltip = _ref5.showSorterTooltip; var _React$useState = React.useState(collectSortStates(mergedColumns, true)), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), sortStates = _React$useState2[0], setSortStates = _React$useState2[1]; var mergedSorterStates = React.useMemo(function () { var validate = true; var collectedStates = collectSortStates(mergedColumns, false); // Return if not controlled if (!collectedStates.length) { return sortStates; } var validateStates = []; function patchStates(state) { if (validate) { validateStates.push(state); } else { validateStates.push((0, _extends3["default"])((0, _extends3["default"])({}, state), { sortOrder: null })); } } var multipleMode = null; collectedStates.forEach(function (state) { if (multipleMode === null) { patchStates(state); if (state.sortOrder) { if (state.multiplePriority === false) { validate = false; } else { multipleMode = true; } } } else if (multipleMode && state.multiplePriority !== false) { patchStates(state); } else { validate = false; patchStates(state); } }); return validateStates; }, [mergedColumns, sortStates]); // Get render columns title required props var columnTitleSorterProps = React.useMemo(function () { var sortColumns = mergedSorterStates.map(function (_ref6) { var column = _ref6.column, sortOrder = _ref6.sortOrder; return { column: column, order: sortOrder }; }); return { sortColumns: sortColumns, // Legacy sortColumn: sortColumns[0] && sortColumns[0].column, sortOrder: sortColumns[0] && sortColumns[0].order }; }, [mergedSorterStates]); function triggerSorter(sortState) { var newSorterStates; if (sortState.multiplePriority === false || !mergedSorterStates.length || mergedSorterStates[0].multiplePriority === false) { newSorterStates = [sortState]; } else { newSorterStates = [].concat((0, _toConsumableArray2["default"])(mergedSorterStates.filter(function (_ref7) { var key = _ref7.key; return key !== sortState.key; })), [sortState]); } setSortStates(newSorterStates); onSorterChange(generateSorterInfo(newSorterStates), newSorterStates); } var transformColumns = function transformColumns(innerColumns) { return injectSorter(prefixCls, innerColumns, mergedSorterStates, triggerSorter, sortDirections, tableLocale, showSorterTooltip); }; var getSorters = function getSorters() { return generateSorterInfo(mergedSorterStates); }; return [transformColumns, mergedSorterStates, columnTitleSorterProps, getSorters]; } },{"../../tooltip":422,"../util":413,"@ant-design/icons/CaretDownOutlined":63,"@ant-design/icons/CaretUpOutlined":64,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"classnames":455,"react":"react"}],411:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useTitleColumns; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _util = require("../util"); function fillTitle(columns, columnTitleProps) { return columns.map(function (column) { var cloneColumn = (0, _extends2["default"])({}, column); cloneColumn.title = (0, _util.renderColumnTitle)(column.title, columnTitleProps); if ('children' in cloneColumn) { cloneColumn.children = fillTitle(cloneColumn.children, columnTitleProps); } return cloneColumn; }); } function useTitleColumns(columnTitleProps) { var filledColumns = React.useCallback(function (columns) { return fillTitle(columns, columnTitleProps); }, [columnTitleProps]); return [filledColumns]; } },{"../util":413,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],412:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Table = _interopRequireDefault(require("./Table")); var _default = _Table["default"]; exports["default"] = _default; },{"./Table":403,"@babel/runtime/helpers/interopRequireDefault":192}],413:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getColumnKey = getColumnKey; exports.getColumnPos = getColumnPos; exports.renderColumnTitle = renderColumnTitle; function getColumnKey(column, defaultKey) { if ('key' in column && column.key !== undefined && column.key !== null) { return column.key; } if (column.dataIndex) { return Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex; } return defaultKey; } function getColumnPos(index, pos) { return pos ? "".concat(pos, "-").concat(index) : "".concat(index); } function renderColumnTitle(title, props) { if (typeof title === 'function') { return title(props); } return title; } },{}],414:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _rcTabs = _interopRequireWildcard(require("rc-tabs")); var _classnames = _interopRequireDefault(require("classnames")); var _EllipsisOutlined = _interopRequireDefault(require("@ant-design/icons/EllipsisOutlined")); var _PlusOutlined = _interopRequireDefault(require("@ant-design/icons/PlusOutlined")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; function Tabs(_a) { var _classNames; var type = _a.type, className = _a.className, size = _a.size, _onEdit = _a.onEdit, hideAdd = _a.hideAdd, centered = _a.centered, addIcon = _a.addIcon, props = __rest(_a, ["type", "className", "size", "onEdit", "hideAdd", "centered", "addIcon"]); var customizePrefixCls = props.prefixCls; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var prefixCls = getPrefixCls('tabs', customizePrefixCls); var editable; if (type === 'editable-card') { editable = { onEdit: function onEdit(editType, _ref) { var key = _ref.key, event = _ref.event; _onEdit === null || _onEdit === void 0 ? void 0 : _onEdit(editType === 'add' ? event : key, editType); }, removeIcon: /*#__PURE__*/React.createElement(_CloseOutlined["default"], null), addIcon: addIcon || /*#__PURE__*/React.createElement(_PlusOutlined["default"], null), showAdd: hideAdd !== true }; } (0, _devWarning["default"])(!('onPrevClick' in props) && !('onNextClick' in props), 'Tabs', '`onPrevClick` and `onNextClick` has been removed. Please use `onTabScroll` instead.'); return /*#__PURE__*/React.createElement(_rcTabs["default"], (0, _extends2["default"])({ direction: direction }, props, { moreTransitionName: "slide-up", className: (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(size), size), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-card"), ['card', 'editable-card'].includes(type)), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-editable-card"), type === 'editable-card'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-centered"), centered), _classNames), className), editable: editable, moreIcon: /*#__PURE__*/React.createElement(_EllipsisOutlined["default"], null), prefixCls: prefixCls })); } Tabs.TabPane = _rcTabs.TabPane; var _default = Tabs; exports["default"] = _default; },{"../_util/devWarning":212,"../config-provider":278,"@ant-design/icons/CloseOutlined":71,"@ant-design/icons/EllipsisOutlined":79,"@ant-design/icons/PlusOutlined":97,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-tabs":810,"react":"react"}],415:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var CheckableTag = function CheckableTag(props) { var _classNames; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var handleClick = function handleClick(e) { var checked = props.checked, onChange = props.onChange, onClick = props.onClick; if (onChange) { onChange(!checked); } if (onClick) { onClick(e); } }; var customizePrefixCls = props.prefixCls, className = props.className, checked = props.checked, restProps = __rest(props, ["prefixCls", "className", "checked"]); var prefixCls = getPrefixCls('tag', customizePrefixCls); var cls = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-checkable"), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-checkable-checked"), checked), _classNames), className); delete restProps.onChange; // TypeScript cannot check delete now. return /*#__PURE__*/React.createElement("span", (0, _extends2["default"])({}, restProps, { className: cls, onClick: handleClick })); }; var _default = CheckableTag; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],416:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _CheckableTag = _interopRequireDefault(require("./CheckableTag")); var _configProvider = require("../config-provider"); var _colors = require("../_util/colors"); var _wave = _interopRequireDefault(require("../_util/wave")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var PresetColorRegex = new RegExp("^(".concat(_colors.PresetColorTypes.join('|'), ")(-inverse)?$")); var PresetStatusColorRegex = new RegExp("^(".concat(_colors.PresetStatusColorTypes.join('|'), ")$")); var InternalTag = function InternalTag(_a, ref) { var _classNames; var customizePrefixCls = _a.prefixCls, className = _a.className, style = _a.style, children = _a.children, icon = _a.icon, color = _a.color, onClose = _a.onClose, closeIcon = _a.closeIcon, _a$closable = _a.closable, closable = _a$closable === void 0 ? false : _a$closable, props = __rest(_a, ["prefixCls", "className", "style", "children", "icon", "color", "onClose", "closeIcon", "closable"]); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var _React$useState = React.useState(true), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1]; React.useEffect(function () { if ('visible' in props) { setVisible(props.visible); } }, [props.visible]); var isPresetColor = function isPresetColor() { if (!color) { return false; } return PresetColorRegex.test(color) || PresetStatusColorRegex.test(color); }; var tagStyle = (0, _extends2["default"])({ backgroundColor: color && !isPresetColor() ? color : undefined }, style); var presetColor = isPresetColor(); var prefixCls = getPrefixCls('tag', customizePrefixCls); var tagClassName = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(color), presetColor), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-has-color"), color && !presetColor), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-hidden"), !visible), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); var handleCloseClick = function handleCloseClick(e) { e.stopPropagation(); if (onClose) { onClose(e); } if (e.defaultPrevented) { return; } if (!('visible' in props)) { setVisible(false); } }; var renderCloseIcon = function renderCloseIcon() { if (closable) { return closeIcon ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-close-icon"), onClick: handleCloseClick }, closeIcon) : /*#__PURE__*/React.createElement(_CloseOutlined["default"], { className: "".concat(prefixCls, "-close-icon"), onClick: handleCloseClick }); } return null; }; var isNeedWave = 'onClick' in props || children && children.type === 'a'; var tagProps = (0, _omit["default"])(props, ['visible']); var iconNode = icon || null; var kids = iconNode ? /*#__PURE__*/React.createElement(React.Fragment, null, iconNode, /*#__PURE__*/React.createElement("span", null, children)) : children; var tagNode = /*#__PURE__*/React.createElement("span", (0, _extends2["default"])({}, tagProps, { ref: ref, className: tagClassName, style: tagStyle }), kids, renderCloseIcon()); return isNeedWave ? /*#__PURE__*/React.createElement(_wave["default"], null, tagNode) : tagNode; }; var Tag = /*#__PURE__*/React.forwardRef(InternalTag); Tag.displayName = 'Tag'; Tag.CheckableTag = _CheckableTag["default"]; var _default = Tag; exports["default"] = _default; },{"../_util/colors":211,"../_util/wave":232,"../config-provider":278,"./CheckableTag":415,"@ant-design/icons/CloseOutlined":71,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"omit.js":579,"react":"react"}],417:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _datePicker = _interopRequireDefault(require("../date-picker")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var InternalTimePicker = _datePicker["default"].TimePicker, InternalRangePicker = _datePicker["default"].RangePicker; var RangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) { return /*#__PURE__*/React.createElement(InternalRangePicker, (0, _extends2["default"])({}, props, { picker: "time", mode: undefined, ref: ref })); }); var TimePicker = /*#__PURE__*/React.forwardRef(function (_a, ref) { var addon = _a.addon, renderExtraFooter = _a.renderExtraFooter, popupClassName = _a.popupClassName, restProps = __rest(_a, ["addon", "renderExtraFooter", "popupClassName"]); var internalRenderExtraFooter = React.useMemo(function () { if (renderExtraFooter) { return renderExtraFooter; } if (addon) { (0, _devWarning["default"])(false, 'TimePicker', '`addon` is deprecated. Please use `renderExtraFooter` instead.'); return addon; } return undefined; }, [addon, renderExtraFooter]); return /*#__PURE__*/React.createElement(InternalTimePicker, (0, _extends2["default"])({}, restProps, { dropdownClassName: popupClassName, mode: undefined, ref: ref, renderExtraFooter: internalRenderExtraFooter })); }); TimePicker.displayName = 'TimePicker'; TimePicker.RangePicker = RangePicker; var _default = TimePicker; exports["default"] = _default; },{"../_util/devWarning":212,"../date-picker":285,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],418:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var locale = { placeholder: 'Select time', rangePlaceholder: ['Start time', 'End time'] }; var _default = locale; exports["default"] = _default; },{}],419:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons/LoadingOutlined")); var _TimelineItem = _interopRequireDefault(require("./TimelineItem")); var _configProvider = require("../config-provider"); var _reactNode = require("../_util/reactNode"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Timeline = function Timeline(props) { var _classNames; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var customizePrefixCls = props.prefixCls, _props$pending = props.pending, pending = _props$pending === void 0 ? null : _props$pending, pendingDot = props.pendingDot, children = props.children, className = props.className, reverse = props.reverse, mode = props.mode, restProps = __rest(props, ["prefixCls", "pending", "pendingDot", "children", "className", "reverse", "mode"]); var prefixCls = getPrefixCls('timeline', customizePrefixCls); var pendingNode = typeof pending === 'boolean' ? null : pending; var pendingItem = pending ? /*#__PURE__*/React.createElement(_TimelineItem["default"], { pending: !!pending, dot: pendingDot || /*#__PURE__*/React.createElement(_LoadingOutlined["default"], null) }, pendingNode) : null; var timeLineItems = reverse ? [pendingItem].concat((0, _toConsumableArray2["default"])(React.Children.toArray(children).reverse())) : [].concat((0, _toConsumableArray2["default"])(React.Children.toArray(children)), [pendingItem]); var getPositionCls = function getPositionCls(ele, idx) { if (mode === 'alternate') { if (ele.props.position === 'right') return "".concat(prefixCls, "-item-right"); if (ele.props.position === 'left') return "".concat(prefixCls, "-item-left"); return idx % 2 === 0 ? "".concat(prefixCls, "-item-left") : "".concat(prefixCls, "-item-right"); } if (mode === 'left') return "".concat(prefixCls, "-item-left"); if (mode === 'right') return "".concat(prefixCls, "-item-right"); if (ele.props.position === 'right') return "".concat(prefixCls, "-item-right"); return ''; }; // Remove falsy items var truthyItems = timeLineItems.filter(function (item) { return !!item; }); var itemsCount = React.Children.count(truthyItems); var lastCls = "".concat(prefixCls, "-item-last"); var items = React.Children.map(truthyItems, function (ele, idx) { var pendingClass = idx === itemsCount - 2 ? lastCls : ''; var readyClass = idx === itemsCount - 1 ? lastCls : ''; return (0, _reactNode.cloneElement)(ele, { className: (0, _classnames["default"])([ele.props.className, !reverse && !!pending ? pendingClass : readyClass, getPositionCls(ele, idx)]) }); }); var hasLabelItem = timeLineItems.some(function (item) { var _a; return !!((_a = item === null || item === void 0 ? void 0 : item.props) === null || _a === void 0 ? void 0 : _a.label); }); var classString = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-pending"), !!pending), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-reverse"), !!reverse), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(mode), !!mode && !hasLabelItem), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-label"), hasLabelItem), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement("ul", (0, _extends2["default"])({}, restProps, { className: classString }), items); }; Timeline.Item = _TimelineItem["default"]; Timeline.defaultProps = { reverse: false, mode: '' }; var _default = Timeline; exports["default"] = _default; },{"../_util/reactNode":223,"../config-provider":278,"./TimelineItem":420,"@ant-design/icons/LoadingOutlined":93,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"react":"react"}],420:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _configProvider = require("../config-provider"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var TimelineItem = function TimelineItem(props) { var _classNames, _classNames2; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var customizePrefixCls = props.prefixCls, className = props.className, color = props.color, children = props.children, pending = props.pending, dot = props.dot, label = props.label, restProps = __rest(props, ["prefixCls", "className", "color", "children", "pending", "dot", "label"]); var prefixCls = getPrefixCls('timeline', customizePrefixCls); var itemClassName = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-item"), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-item-pending"), pending), _classNames), className); var dotClassName = (0, _classnames["default"])((_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-item-head"), true), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-item-head-custom"), dot), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-item-head-").concat(color), true), _classNames2)); return /*#__PURE__*/React.createElement("li", (0, _extends2["default"])({}, (0, _omit["default"])(restProps, ['position']), { className: itemClassName }), label && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-label") }, label), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-tail") }), /*#__PURE__*/React.createElement("div", { className: dotClassName, style: { borderColor: /blue|red|green|gray/.test(color || '') ? undefined : color } }, dot), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-item-content") }, children)); }; TimelineItem.defaultProps = { color: 'blue', pending: false, position: '' }; var _default = TimelineItem; exports["default"] = _default; },{"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"react":"react"}],421:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Timeline = _interopRequireDefault(require("./Timeline")); var _default = _Timeline["default"]; exports["default"] = _default; },{"./Timeline":419,"@babel/runtime/helpers/interopRequireDefault":192}],422:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcTooltip = _interopRequireDefault(require("rc-tooltip")); var _classnames = _interopRequireDefault(require("classnames")); var _placements = _interopRequireDefault(require("./placements")); var _reactNode = require("../_util/reactNode"); var _configProvider = require("../config-provider"); var _colors = require("../_util/colors"); var splitObject = function splitObject(obj, keys) { var picked = {}; var omitted = (0, _extends2["default"])({}, obj); keys.forEach(function (key) { if (obj && key in obj) { picked[key] = obj[key]; delete omitted[key]; } }); return { picked: picked, omitted: omitted }; }; var PresetColorRegex = new RegExp("^(".concat(_colors.PresetColorTypes.join('|'), ")(-inverse)?$")); // Fix Tooltip won't hide at disabled button // mouse events don't trigger at disabled button in Chrome // https://github.com/react-component/tooltip/issues/18 function getDisabledCompatibleChildren(element, prefixCls) { var elementType = element.type; if ((elementType.__ANT_BUTTON === true || elementType.__ANT_SWITCH === true || elementType.__ANT_CHECKBOX === true || element.type === 'button') && element.props.disabled) { // Pick some layout related style properties up to span // Prevent layout bugs like https://github.com/ant-design/ant-design/issues/5254 var _splitObject = splitObject(element.props.style, ['position', 'left', 'right', 'top', 'bottom', 'float', 'display', 'zIndex']), picked = _splitObject.picked, omitted = _splitObject.omitted; var spanStyle = (0, _extends2["default"])((0, _extends2["default"])({ display: 'inline-block' }, picked), { cursor: 'not-allowed', width: element.props.block ? '100%' : null }); var buttonStyle = (0, _extends2["default"])((0, _extends2["default"])({}, omitted), { pointerEvents: 'none' }); var child = (0, _reactNode.cloneElement)(element, { style: buttonStyle, className: null }); return /*#__PURE__*/React.createElement("span", { style: spanStyle, className: (0, _classnames["default"])(element.props.className, "".concat(prefixCls, "-disabled-compatible-wrapper")) }, child); } return element; } var Tooltip = /*#__PURE__*/React.forwardRef(function (props, ref) { var _classNames2; var _React$useContext = React.useContext(_configProvider.ConfigContext), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var _React$useState = React.useState(!!props.visible || !!props.defaultVisible), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1]; React.useEffect(function () { if ('visible' in props) { setVisible(props.visible); } }, [props.visible]); var isNoTitle = function isNoTitle() { var title = props.title, overlay = props.overlay; return !title && !overlay && title !== 0; // overlay for old version compatibility }; var onVisibleChange = function onVisibleChange(vis) { if (!('visible' in props)) { setVisible(isNoTitle() ? false : vis); } if (props.onVisibleChange && !isNoTitle()) { props.onVisibleChange(vis); } }; var getTooltipPlacements = function getTooltipPlacements() { var builtinPlacements = props.builtinPlacements, arrowPointAtCenter = props.arrowPointAtCenter, autoAdjustOverflow = props.autoAdjustOverflow; return builtinPlacements || (0, _placements["default"])({ arrowPointAtCenter: arrowPointAtCenter, autoAdjustOverflow: autoAdjustOverflow }); }; // 动态设置动画点 var onPopupAlign = function onPopupAlign(domNode, align) { var placements = getTooltipPlacements(); // 当前返回的位置 var placement = Object.keys(placements).filter(function (key) { return placements[key].points[0] === align.points[0] && placements[key].points[1] === align.points[1]; })[0]; if (!placement) { return; } // 根据当前坐标设置动画点 var rect = domNode.getBoundingClientRect(); var transformOrigin = { top: '50%', left: '50%' }; if (placement.indexOf('top') >= 0 || placement.indexOf('Bottom') >= 0) { transformOrigin.top = "".concat(rect.height - align.offset[1], "px"); } else if (placement.indexOf('Top') >= 0 || placement.indexOf('bottom') >= 0) { transformOrigin.top = "".concat(-align.offset[1], "px"); } if (placement.indexOf('left') >= 0 || placement.indexOf('Right') >= 0) { transformOrigin.left = "".concat(rect.width - align.offset[0], "px"); } else if (placement.indexOf('right') >= 0 || placement.indexOf('Left') >= 0) { transformOrigin.left = "".concat(-align.offset[0], "px"); } domNode.style.transformOrigin = "".concat(transformOrigin.left, " ").concat(transformOrigin.top); }; var getOverlay = function getOverlay() { var title = props.title, overlay = props.overlay; if (title === 0) { return title; } return overlay || title || ''; }; var customizePrefixCls = props.prefixCls, openClassName = props.openClassName, getPopupContainer = props.getPopupContainer, getTooltipContainer = props.getTooltipContainer, overlayClassName = props.overlayClassName, color = props.color, overlayInnerStyle = props.overlayInnerStyle, children = props.children; var prefixCls = getPrefixCls('tooltip', customizePrefixCls); var tempVisible = visible; // Hide tooltip when there is no title if (!('visible' in props) && isNoTitle()) { tempVisible = false; } var child = getDisabledCompatibleChildren((0, _reactNode.isValidElement)(children) ? children : /*#__PURE__*/React.createElement("span", null, children), prefixCls); var childProps = child.props; var childCls = (0, _classnames["default"])(childProps.className, (0, _defineProperty2["default"])({}, openClassName || "".concat(prefixCls, "-open"), true)); var customOverlayClassName = (0, _classnames["default"])(overlayClassName, (_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-").concat(color), color && PresetColorRegex.test(color)), _classNames2)); var formattedOverlayInnerStyle; var arrowContentStyle; if (color && !PresetColorRegex.test(color)) { formattedOverlayInnerStyle = (0, _extends2["default"])((0, _extends2["default"])({}, overlayInnerStyle), { background: color }); arrowContentStyle = { background: color }; } return /*#__PURE__*/React.createElement(_rcTooltip["default"], (0, _extends2["default"])({}, props, { prefixCls: prefixCls, overlayClassName: customOverlayClassName, getTooltipContainer: getPopupContainer || getTooltipContainer || getContextPopupContainer, ref: ref, builtinPlacements: getTooltipPlacements(), overlay: getOverlay(), visible: tempVisible, onVisibleChange: onVisibleChange, onPopupAlign: onPopupAlign, overlayInnerStyle: formattedOverlayInnerStyle, arrowContent: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-arrow-content"), style: arrowContentStyle }) }), tempVisible ? (0, _reactNode.cloneElement)(child, { className: childCls }) : child); }); Tooltip.displayName = 'Tooltip'; Tooltip.defaultProps = { placement: 'top', transitionName: 'zoom-big-fast', mouseEnterDelay: 0.1, mouseLeaveDelay: 0.1, arrowPointAtCenter: false, autoAdjustOverflow: true }; var _default = Tooltip; exports["default"] = _default; },{"../_util/colors":211,"../_util/reactNode":223,"../config-provider":278,"./placements":423,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-tooltip":816,"react":"react"}],423:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getOverflowOptions = getOverflowOptions; exports["default"] = getPlacements; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _placements = require("rc-tooltip/lib/placements"); var autoAdjustOverflowEnabled = { adjustX: 1, adjustY: 1 }; var autoAdjustOverflowDisabled = { adjustX: 0, adjustY: 0 }; var targetOffset = [0, 0]; function getOverflowOptions(autoAdjustOverflow) { if (typeof autoAdjustOverflow === 'boolean') { return autoAdjustOverflow ? autoAdjustOverflowEnabled : autoAdjustOverflowDisabled; } return (0, _extends2["default"])((0, _extends2["default"])({}, autoAdjustOverflowDisabled), autoAdjustOverflow); } function getPlacements(config) { var _config$arrowWidth = config.arrowWidth, arrowWidth = _config$arrowWidth === void 0 ? 5 : _config$arrowWidth, _config$horizontalArr = config.horizontalArrowShift, horizontalArrowShift = _config$horizontalArr === void 0 ? 16 : _config$horizontalArr, _config$verticalArrow = config.verticalArrowShift, verticalArrowShift = _config$verticalArrow === void 0 ? 8 : _config$verticalArrow, autoAdjustOverflow = config.autoAdjustOverflow; var placementMap = { left: { points: ['cr', 'cl'], offset: [-4, 0] }, right: { points: ['cl', 'cr'], offset: [4, 0] }, top: { points: ['bc', 'tc'], offset: [0, -4] }, bottom: { points: ['tc', 'bc'], offset: [0, 4] }, topLeft: { points: ['bl', 'tc'], offset: [-(horizontalArrowShift + arrowWidth), -4] }, leftTop: { points: ['tr', 'cl'], offset: [-4, -(verticalArrowShift + arrowWidth)] }, topRight: { points: ['br', 'tc'], offset: [horizontalArrowShift + arrowWidth, -4] }, rightTop: { points: ['tl', 'cr'], offset: [4, -(verticalArrowShift + arrowWidth)] }, bottomRight: { points: ['tr', 'bc'], offset: [horizontalArrowShift + arrowWidth, 4] }, rightBottom: { points: ['bl', 'cr'], offset: [4, verticalArrowShift + arrowWidth] }, bottomLeft: { points: ['tl', 'bc'], offset: [-(horizontalArrowShift + arrowWidth), 4] }, leftBottom: { points: ['br', 'cl'], offset: [-4, verticalArrowShift + arrowWidth] } }; Object.keys(placementMap).forEach(function (key) { placementMap[key] = config.arrowPointAtCenter ? (0, _extends2["default"])((0, _extends2["default"])({}, placementMap[key]), { overflow: getOverflowOptions(autoAdjustOverflow), targetOffset: targetOffset }) : (0, _extends2["default"])((0, _extends2["default"])({}, _placements.placements[key]), { overflow: getOverflowOptions(autoAdjustOverflow) }); placementMap[key].ignoreShake = true; }); return placementMap; } },{"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"rc-tooltip/lib/placements":817}],424:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.OmitProps = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _type = require("../_util/type"); var _pagination = _interopRequireDefault(require("../pagination")); var _ListItem = _interopRequireDefault(require("./ListItem")); var OmitProps = (0, _type.tuple)('handleFilter', 'handleClear', 'checkedKeys'); exports.OmitProps = OmitProps; function parsePagination(pagination) { if (!pagination) { return null; } var defaultPagination = { pageSize: 10 }; if ((0, _typeof2["default"])(pagination) === 'object') { return (0, _extends2["default"])((0, _extends2["default"])({}, defaultPagination), pagination); } return defaultPagination; } var ListBody = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(ListBody, _React$Component); var _super = (0, _createSuper2["default"])(ListBody); function ListBody() { var _this; (0, _classCallCheck2["default"])(this, ListBody); _this = _super.apply(this, arguments); _this.state = { current: 1 }; _this.onItemSelect = function (item) { var _this$props = _this.props, onItemSelect = _this$props.onItemSelect, selectedKeys = _this$props.selectedKeys; var checked = selectedKeys.indexOf(item.key) >= 0; onItemSelect(item.key, !checked); }; _this.onItemRemove = function (item) { var onItemRemove = _this.props.onItemRemove; onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove([item.key]); }; _this.onPageChange = function (current) { _this.setState({ current: current }); }; _this.getItems = function () { var current = _this.state.current; var _this$props2 = _this.props, pagination = _this$props2.pagination, filteredRenderItems = _this$props2.filteredRenderItems; var mergedPagination = parsePagination(pagination); var displayItems = filteredRenderItems; if (mergedPagination) { displayItems = filteredRenderItems.slice((current - 1) * mergedPagination.pageSize, current * mergedPagination.pageSize); } return displayItems; }; return _this; } (0, _createClass2["default"])(ListBody, [{ key: "render", value: function render() { var _this2 = this; var current = this.state.current; var _this$props3 = this.props, prefixCls = _this$props3.prefixCls, onScroll = _this$props3.onScroll, filteredRenderItems = _this$props3.filteredRenderItems, selectedKeys = _this$props3.selectedKeys, globalDisabled = _this$props3.disabled, showRemove = _this$props3.showRemove, pagination = _this$props3.pagination; var mergedPagination = parsePagination(pagination); var paginationNode = null; if (mergedPagination) { paginationNode = /*#__PURE__*/React.createElement(_pagination["default"], { simple: true, size: "small", disabled: globalDisabled, className: "".concat(prefixCls, "-pagination"), total: filteredRenderItems.length, pageSize: mergedPagination.pageSize, current: current, onChange: this.onPageChange }); } return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("ul", { className: (0, _classnames["default"])("".concat(prefixCls, "-content"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-content-show-remove"), showRemove)), onScroll: onScroll }, this.getItems().map(function (_ref) { var renderedEl = _ref.renderedEl, renderedText = _ref.renderedText, item = _ref.item; var disabled = item.disabled; var checked = selectedKeys.indexOf(item.key) >= 0; return /*#__PURE__*/React.createElement(_ListItem["default"], { disabled: globalDisabled || disabled, key: item.key, item: item, renderedText: renderedText, renderedEl: renderedEl, checked: checked, prefixCls: prefixCls, onClick: _this2.onItemSelect, onRemove: _this2.onItemRemove, showRemove: showRemove }); })), paginationNode); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(_ref2, _ref3) { var filteredRenderItems = _ref2.filteredRenderItems, pagination = _ref2.pagination; var current = _ref3.current; var mergedPagination = parsePagination(pagination); if (mergedPagination) { // Calculate the page number var maxPageCount = Math.ceil(filteredRenderItems.length / mergedPagination.pageSize); if (current > maxPageCount) { return { current: maxPageCount }; } } return null; } }]); return ListBody; }(React.Component); var _default = ListBody; exports["default"] = _default; },{"../_util/type":230,"../pagination":357,"./ListItem":425,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"classnames":455,"react":"react"}],425:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _DeleteOutlined = _interopRequireDefault(require("@ant-design/icons/DeleteOutlined")); var _default2 = _interopRequireDefault(require("../locale/default")); var _checkbox = _interopRequireDefault(require("../checkbox")); var _transButton = _interopRequireDefault(require("../_util/transButton")); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var ListItem = function ListItem(props) { var _classNames; var renderedText = props.renderedText, renderedEl = props.renderedEl, item = props.item, checked = props.checked, disabled = props.disabled, prefixCls = props.prefixCls, onClick = props.onClick, onRemove = props.onRemove, showRemove = props.showRemove; var className = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-content-item"), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-content-item-disabled"), disabled || item.disabled), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-content-item-checked"), checked), _classNames)); var title; if (typeof renderedText === 'string' || typeof renderedText === 'number') { title = String(renderedText); } return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Transfer", defaultLocale: _default2["default"].Transfer }, function (transferLocale) { var liProps = { className: className, title: title }; var labelNode = /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-content-item-text") }, renderedEl); // Show remove if (showRemove) { return /*#__PURE__*/React.createElement("li", liProps, labelNode, /*#__PURE__*/React.createElement(_transButton["default"], { disabled: disabled || item.disabled, className: "".concat(prefixCls, "-content-item-remove"), "aria-label": transferLocale.remove, onClick: function onClick() { onRemove === null || onRemove === void 0 ? void 0 : onRemove(item); } }, /*#__PURE__*/React.createElement(_DeleteOutlined["default"], null))); } // Default click to select liProps.onClick = disabled || item.disabled ? undefined : function () { return onClick(item); }; return /*#__PURE__*/React.createElement("li", liProps, /*#__PURE__*/React.createElement(_checkbox["default"], { checked: checked, disabled: disabled || item.disabled }), labelNode); }); }; var _default = /*#__PURE__*/React.memo(ListItem); exports["default"] = _default; },{"../_util/transButton":229,"../checkbox":269,"../locale-provider/LocaleReceiver":331,"../locale/default":335,"@ant-design/icons/DeleteOutlined":73,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],426:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _list = _interopRequireDefault(require("./list")); var _operation = _interopRequireDefault(require("./operation")); var _search = _interopRequireDefault(require("./search")); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _default2 = _interopRequireDefault(require("../locale/default")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var Transfer = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Transfer, _React$Component); var _super = (0, _createSuper2["default"])(Transfer); function Transfer(props) { var _this; (0, _classCallCheck2["default"])(this, Transfer); _this = _super.call(this, props); _this.separatedDataSource = null; _this.setStateKeys = function (direction, keys) { if (direction === 'left') { _this.setState(function (_ref) { var sourceSelectedKeys = _ref.sourceSelectedKeys; return { sourceSelectedKeys: typeof keys === 'function' ? keys(sourceSelectedKeys || []) : keys }; }); } else { _this.setState(function (_ref2) { var targetSelectedKeys = _ref2.targetSelectedKeys; return { targetSelectedKeys: typeof keys === 'function' ? keys(targetSelectedKeys || []) : keys }; }); } }; _this.getLocale = function (transferLocale, renderEmpty) { return (0, _extends2["default"])((0, _extends2["default"])((0, _extends2["default"])({}, transferLocale), { notFoundContent: renderEmpty('Transfer') }), _this.props.locale); }; _this.moveTo = function (direction) { var _this$props = _this.props, _this$props$targetKey = _this$props.targetKeys, targetKeys = _this$props$targetKey === void 0 ? [] : _this$props$targetKey, _this$props$dataSourc = _this$props.dataSource, dataSource = _this$props$dataSourc === void 0 ? [] : _this$props$dataSourc, onChange = _this$props.onChange; var _this$state = _this.state, sourceSelectedKeys = _this$state.sourceSelectedKeys, targetSelectedKeys = _this$state.targetSelectedKeys; var moveKeys = direction === 'right' ? sourceSelectedKeys : targetSelectedKeys; // filter the disabled options var newMoveKeys = moveKeys.filter(function (key) { return !dataSource.some(function (data) { return !!(key === data.key && data.disabled); }); }); // move items to target box var newTargetKeys = direction === 'right' ? newMoveKeys.concat(targetKeys) : targetKeys.filter(function (targetKey) { return newMoveKeys.indexOf(targetKey) === -1; }); // empty checked keys var oppositeDirection = direction === 'right' ? 'left' : 'right'; _this.setStateKeys(oppositeDirection, []); _this.handleSelectChange(oppositeDirection, []); if (onChange) { onChange(newTargetKeys, direction, newMoveKeys); } }; _this.moveToLeft = function () { return _this.moveTo('left'); }; _this.moveToRight = function () { return _this.moveTo('right'); }; _this.onItemSelectAll = function (direction, selectedKeys, checkAll) { _this.setStateKeys(direction, function (prevKeys) { var mergedCheckedKeys = []; if (checkAll) { // Merge current keys with origin key mergedCheckedKeys = Array.from(new Set([].concat((0, _toConsumableArray2["default"])(prevKeys), (0, _toConsumableArray2["default"])(selectedKeys)))); } else { // Remove current keys from origin keys mergedCheckedKeys = prevKeys.filter(function (key) { return selectedKeys.indexOf(key) === -1; }); } _this.handleSelectChange(direction, mergedCheckedKeys); return mergedCheckedKeys; }); }; _this.onLeftItemSelectAll = function (selectedKeys, checkAll) { return _this.onItemSelectAll('left', selectedKeys, checkAll); }; _this.onRightItemSelectAll = function (selectedKeys, checkAll) { return _this.onItemSelectAll('right', selectedKeys, checkAll); }; _this.handleFilter = function (direction, e) { var onSearch = _this.props.onSearch; var value = e.target.value; if (onSearch) { onSearch(direction, value); } }; _this.handleLeftFilter = function (e) { return _this.handleFilter('left', e); }; _this.handleRightFilter = function (e) { return _this.handleFilter('right', e); }; _this.handleClear = function (direction) { var onSearch = _this.props.onSearch; if (onSearch) { onSearch(direction, ''); } }; _this.handleLeftClear = function () { return _this.handleClear('left'); }; _this.handleRightClear = function () { return _this.handleClear('right'); }; _this.onItemSelect = function (direction, selectedKey, checked) { var _this$state2 = _this.state, sourceSelectedKeys = _this$state2.sourceSelectedKeys, targetSelectedKeys = _this$state2.targetSelectedKeys; var holder = direction === 'left' ? (0, _toConsumableArray2["default"])(sourceSelectedKeys) : (0, _toConsumableArray2["default"])(targetSelectedKeys); var index = holder.indexOf(selectedKey); if (index > -1) { holder.splice(index, 1); } if (checked) { holder.push(selectedKey); } _this.handleSelectChange(direction, holder); if (!_this.props.selectedKeys) { _this.setStateKeys(direction, holder); } }; _this.onLeftItemSelect = function (selectedKey, checked) { return _this.onItemSelect('left', selectedKey, checked); }; _this.onRightItemSelect = function (selectedKey, checked) { return _this.onItemSelect('right', selectedKey, checked); }; _this.onRightItemRemove = function (selectedKeys) { var _this$props2 = _this.props, _this$props2$targetKe = _this$props2.targetKeys, targetKeys = _this$props2$targetKe === void 0 ? [] : _this$props2$targetKe, onChange = _this$props2.onChange; _this.setStateKeys('right', []); if (onChange) { onChange(targetKeys.filter(function (key) { return !selectedKeys.includes(key); }), 'left', (0, _toConsumableArray2["default"])(selectedKeys)); } }; _this.handleScroll = function (direction, e) { var onScroll = _this.props.onScroll; if (onScroll) { onScroll(direction, e); } }; _this.handleLeftScroll = function (e) { return _this.handleScroll('left', e); }; _this.handleRightScroll = function (e) { return _this.handleScroll('right', e); }; _this.handleListStyle = function (listStyle, direction) { if (typeof listStyle === 'function') { return listStyle({ direction: direction }); } return listStyle; }; _this.renderTransfer = function (transferLocale) { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref3) { var _classNames; var getPrefixCls = _ref3.getPrefixCls, renderEmpty = _ref3.renderEmpty, direction = _ref3.direction; var _this$props3 = _this.props, customizePrefixCls = _this$props3.prefixCls, className = _this$props3.className, disabled = _this$props3.disabled, _this$props3$operatio = _this$props3.operations, operations = _this$props3$operatio === void 0 ? [] : _this$props3$operatio, showSearch = _this$props3.showSearch, footer = _this$props3.footer, style = _this$props3.style, listStyle = _this$props3.listStyle, operationStyle = _this$props3.operationStyle, filterOption = _this$props3.filterOption, render = _this$props3.render, children = _this$props3.children, showSelectAll = _this$props3.showSelectAll, oneWay = _this$props3.oneWay, pagination = _this$props3.pagination; var prefixCls = getPrefixCls('transfer', customizePrefixCls); var locale = _this.getLocale(transferLocale, renderEmpty); var _this$state3 = _this.state, sourceSelectedKeys = _this$state3.sourceSelectedKeys, targetSelectedKeys = _this$state3.targetSelectedKeys; var mergedPagination = !children && pagination; var _this$separateDataSou = _this.separateDataSource(), leftDataSource = _this$separateDataSou.leftDataSource, rightDataSource = _this$separateDataSou.rightDataSource; var leftActive = targetSelectedKeys.length > 0; var rightActive = sourceSelectedKeys.length > 0; var cls = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-customize-list"), !!children), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); var titles = _this.getTitles(locale); var selectAllLabels = _this.props.selectAllLabels || []; return /*#__PURE__*/React.createElement("div", { className: cls, style: style }, /*#__PURE__*/React.createElement(_list["default"], (0, _extends2["default"])({ prefixCls: "".concat(prefixCls, "-list"), titleText: titles[0], dataSource: leftDataSource, filterOption: filterOption, style: _this.handleListStyle(listStyle, 'left'), checkedKeys: sourceSelectedKeys, handleFilter: _this.handleLeftFilter, handleClear: _this.handleLeftClear, onItemSelect: _this.onLeftItemSelect, onItemSelectAll: _this.onLeftItemSelectAll, render: render, showSearch: showSearch, renderList: children, footer: footer, onScroll: _this.handleLeftScroll, disabled: disabled, direction: "left", showSelectAll: showSelectAll, selectAllLabel: selectAllLabels[0], pagination: mergedPagination }, locale)), /*#__PURE__*/React.createElement(_operation["default"], { className: "".concat(prefixCls, "-operation"), rightActive: rightActive, rightArrowText: operations[0], moveToRight: _this.moveToRight, leftActive: leftActive, leftArrowText: operations[1], moveToLeft: _this.moveToLeft, style: operationStyle, disabled: disabled, direction: direction, oneWay: oneWay }), /*#__PURE__*/React.createElement(_list["default"], (0, _extends2["default"])({ prefixCls: "".concat(prefixCls, "-list"), titleText: titles[1], dataSource: rightDataSource, filterOption: filterOption, style: _this.handleListStyle(listStyle, 'right'), checkedKeys: targetSelectedKeys, handleFilter: _this.handleRightFilter, handleClear: _this.handleRightClear, onItemSelect: _this.onRightItemSelect, onItemSelectAll: _this.onRightItemSelectAll, onItemRemove: _this.onRightItemRemove, render: render, showSearch: showSearch, renderList: children, footer: footer, onScroll: _this.handleRightScroll, disabled: disabled, direction: "right", showSelectAll: showSelectAll, selectAllLabel: selectAllLabels[1], showRemove: oneWay, pagination: mergedPagination }, locale))); }); }; var _props$selectedKeys = props.selectedKeys, selectedKeys = _props$selectedKeys === void 0 ? [] : _props$selectedKeys, _props$targetKeys = props.targetKeys, targetKeys = _props$targetKeys === void 0 ? [] : _props$targetKeys; _this.state = { sourceSelectedKeys: selectedKeys.filter(function (key) { return targetKeys.indexOf(key) === -1; }), targetSelectedKeys: selectedKeys.filter(function (key) { return targetKeys.indexOf(key) > -1; }) }; return _this; } (0, _createClass2["default"])(Transfer, [{ key: "getTitles", value: function getTitles(transferLocale) { var titles = this.props.titles; if (titles) { return titles; } return transferLocale.titles; } }, { key: "handleSelectChange", value: function handleSelectChange(direction, holder) { var _this$state4 = this.state, sourceSelectedKeys = _this$state4.sourceSelectedKeys, targetSelectedKeys = _this$state4.targetSelectedKeys; var onSelectChange = this.props.onSelectChange; if (!onSelectChange) { return; } if (direction === 'left') { onSelectChange(holder, targetSelectedKeys); } else { onSelectChange(sourceSelectedKeys, holder); } } }, { key: "separateDataSource", value: function separateDataSource() { var _this$props4 = this.props, dataSource = _this$props4.dataSource, rowKey = _this$props4.rowKey, _this$props4$targetKe = _this$props4.targetKeys, targetKeys = _this$props4$targetKe === void 0 ? [] : _this$props4$targetKe; var leftDataSource = []; var rightDataSource = new Array(targetKeys.length); dataSource.forEach(function (record) { if (rowKey) { record.key = rowKey(record); } // rightDataSource should be ordered by targetKeys // leftDataSource should be ordered by dataSource var indexOfKey = targetKeys.indexOf(record.key); if (indexOfKey !== -1) { rightDataSource[indexOfKey] = record; } else { leftDataSource.push(record); } }); return { leftDataSource: leftDataSource, rightDataSource: rightDataSource }; } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Transfer", defaultLocale: _default2["default"].Transfer }, this.renderTransfer); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(_ref4) { var selectedKeys = _ref4.selectedKeys, targetKeys = _ref4.targetKeys, pagination = _ref4.pagination, children = _ref4.children; if (selectedKeys) { var mergedTargetKeys = targetKeys || []; return { sourceSelectedKeys: selectedKeys.filter(function (key) { return !mergedTargetKeys.includes(key); }), targetSelectedKeys: selectedKeys.filter(function (key) { return mergedTargetKeys.includes(key); }) }; } (0, _devWarning["default"])(!pagination || !children, 'Transfer', '`pagination` not support customize render list.'); return null; } }]); return Transfer; }(React.Component); // For high-level customized Transfer @dqaria Transfer.List = _list["default"]; Transfer.Operation = _operation["default"]; Transfer.Search = _search["default"]; Transfer.defaultProps = { dataSource: [], locale: {}, showSearch: false, listStyle: function listStyle() {} }; var _default = Transfer; exports["default"] = _default; },{"../_util/devWarning":212,"../config-provider":278,"../locale-provider/LocaleReceiver":331,"../locale/default":335,"./list":427,"./operation":428,"./search":429,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"react":"react"}],427:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _omit = _interopRequireDefault(require("omit.js")); var _classnames = _interopRequireDefault(require("classnames")); var _DownOutlined = _interopRequireDefault(require("@ant-design/icons/DownOutlined")); var _checkbox = _interopRequireDefault(require("../checkbox")); var _menu = _interopRequireDefault(require("../menu")); var _dropdown = _interopRequireDefault(require("../dropdown")); var _search = _interopRequireDefault(require("./search")); var _ListBody = _interopRequireWildcard(require("./ListBody")); var _reactNode = require("../_util/reactNode"); var defaultRender = function defaultRender() { return null; }; function isRenderResultPlainObject(result) { return result && !(0, _reactNode.isValidElement)(result) && Object.prototype.toString.call(result) === '[object Object]'; } function getEnabledItemKeys(items) { return items.filter(function (data) { return !data.disabled; }).map(function (data) { return data.key; }); } var TransferList = /*#__PURE__*/function (_React$PureComponent) { (0, _inherits2["default"])(TransferList, _React$PureComponent); var _super = (0, _createSuper2["default"])(TransferList); function TransferList(props) { var _this; (0, _classCallCheck2["default"])(this, TransferList); _this = _super.call(this, props); _this.defaultListBodyRef = /*#__PURE__*/React.createRef(); // =============================== Filter =============================== _this.handleFilter = function (e) { var handleFilter = _this.props.handleFilter; var filterValue = e.target.value; _this.setState({ filterValue: filterValue }); handleFilter(e); }; _this.handleClear = function () { var handleClear = _this.props.handleClear; _this.setState({ filterValue: '' }); handleClear(); }; _this.matchFilter = function (text, item) { var filterValue = _this.state.filterValue; var filterOption = _this.props.filterOption; if (filterOption) { return filterOption(filterValue, item); } return text.indexOf(filterValue) >= 0; }; _this.getCurrentPageItems = function () {}; // =============================== Render =============================== _this.renderListBody = function (renderList, props) { var bodyContent = renderList ? renderList(props) : null; var customize = !!bodyContent; if (!customize) { bodyContent = /*#__PURE__*/React.createElement(_ListBody["default"], (0, _extends2["default"])({ ref: _this.defaultListBodyRef }, props)); } return { customize: customize, bodyContent: bodyContent }; }; _this.renderItem = function (item) { var _this$props$render = _this.props.render, render = _this$props$render === void 0 ? defaultRender : _this$props$render; var renderResult = render(item); var isRenderResultPlain = isRenderResultPlainObject(renderResult); return { renderedText: isRenderResultPlain ? renderResult.value : renderResult, renderedEl: isRenderResultPlain ? renderResult.label : renderResult, item: item }; }; _this.getSelectAllLabel = function (selectedCount, totalCount) { var _this$props = _this.props, itemsUnit = _this$props.itemsUnit, itemUnit = _this$props.itemUnit, selectAllLabel = _this$props.selectAllLabel; if (selectAllLabel) { return typeof selectAllLabel === 'function' ? selectAllLabel({ selectedCount: selectedCount, totalCount: totalCount }) : selectAllLabel; } var unit = totalCount > 1 ? itemsUnit : itemUnit; return /*#__PURE__*/React.createElement(React.Fragment, null, (selectedCount > 0 ? "".concat(selectedCount, "/") : '') + totalCount, " ", unit); }; _this.state = { filterValue: '' }; return _this; } (0, _createClass2["default"])(TransferList, [{ key: "componentWillUnmount", value: function componentWillUnmount() { clearTimeout(this.triggerScrollTimer); } }, { key: "getCheckStatus", value: function getCheckStatus(filteredItems) { var checkedKeys = this.props.checkedKeys; if (checkedKeys.length === 0) { return 'none'; } if (filteredItems.every(function (item) { return checkedKeys.indexOf(item.key) >= 0 || !!item.disabled; })) { return 'all'; } return 'part'; } // ================================ Item ================================ }, { key: "getFilteredItems", value: function getFilteredItems(dataSource, filterValue) { var _this2 = this; var filteredItems = []; var filteredRenderItems = []; dataSource.forEach(function (item) { var renderedItem = _this2.renderItem(item); var renderedText = renderedItem.renderedText; // Filter skip if (filterValue && !_this2.matchFilter(renderedText, item)) { return null; } filteredItems.push(item); filteredRenderItems.push(renderedItem); }); return { filteredItems: filteredItems, filteredRenderItems: filteredRenderItems }; } }, { key: "getListBody", value: function getListBody(prefixCls, searchPlaceholder, filterValue, filteredItems, notFoundContent, filteredRenderItems, checkedKeys, renderList, showSearch, disabled) { var search = showSearch ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-body-search-wrapper") }, /*#__PURE__*/React.createElement(_search["default"], { prefixCls: "".concat(prefixCls, "-search"), onChange: this.handleFilter, handleClear: this.handleClear, placeholder: searchPlaceholder, value: filterValue, disabled: disabled })) : null; var _this$renderListBody = this.renderListBody(renderList, (0, _extends2["default"])((0, _extends2["default"])({}, (0, _omit["default"])(this.props, _ListBody.OmitProps)), { filteredItems: filteredItems, filteredRenderItems: filteredRenderItems, selectedKeys: checkedKeys })), bodyContent = _this$renderListBody.bodyContent, customize = _this$renderListBody.customize; var bodyNode; // We should wrap customize list body in a classNamed div to use flex layout. if (customize) { bodyNode = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-body-customize-wrapper") }, bodyContent); } else { bodyNode = filteredItems.length ? bodyContent : /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-body-not-found") }, notFoundContent); } return /*#__PURE__*/React.createElement("div", { className: (0, _classnames["default"])(showSearch ? "".concat(prefixCls, "-body ").concat(prefixCls, "-body-with-search") : "".concat(prefixCls, "-body")) }, search, bodyNode); } }, { key: "getCheckBox", value: function getCheckBox(filteredItems, onItemSelectAll, showSelectAll, disabled) { var checkStatus = this.getCheckStatus(filteredItems); var checkedAll = checkStatus === 'all'; var checkAllCheckbox = showSelectAll !== false && /*#__PURE__*/React.createElement(_checkbox["default"], { disabled: disabled, checked: checkedAll, indeterminate: checkStatus === 'part', onChange: function onChange() { // Only select enabled items onItemSelectAll(filteredItems.filter(function (item) { return !item.disabled; }).map(function (_ref) { var key = _ref.key; return key; }), !checkedAll); } }); return checkAllCheckbox; } }, { key: "render", value: function render() { var _classNames, _this3 = this; var filterValue = this.state.filterValue; var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, dataSource = _this$props2.dataSource, titleText = _this$props2.titleText, checkedKeys = _this$props2.checkedKeys, disabled = _this$props2.disabled, footer = _this$props2.footer, showSearch = _this$props2.showSearch, style = _this$props2.style, searchPlaceholder = _this$props2.searchPlaceholder, notFoundContent = _this$props2.notFoundContent, selectAll = _this$props2.selectAll, selectCurrent = _this$props2.selectCurrent, selectInvert = _this$props2.selectInvert, removeAll = _this$props2.removeAll, removeCurrent = _this$props2.removeCurrent, renderList = _this$props2.renderList, onItemSelectAll = _this$props2.onItemSelectAll, onItemRemove = _this$props2.onItemRemove, showSelectAll = _this$props2.showSelectAll, showRemove = _this$props2.showRemove, pagination = _this$props2.pagination; // Custom Layout var footerDom = footer && footer(this.props); var listCls = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-with-pagination"), pagination), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-with-footer"), footerDom), _classNames)); // ====================== Get filtered, checked item list ====================== var _this$getFilteredItem = this.getFilteredItems(dataSource, filterValue), filteredItems = _this$getFilteredItem.filteredItems, filteredRenderItems = _this$getFilteredItem.filteredRenderItems; // ================================= List Body ================================= var listBody = this.getListBody(prefixCls, searchPlaceholder, filterValue, filteredItems, notFoundContent, filteredRenderItems, checkedKeys, renderList, showSearch, disabled); // ================================ List Footer ================================ var listFooter = footerDom ? /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-footer") }, footerDom) : null; var checkAllCheckbox = !showRemove && !pagination && this.getCheckBox(filteredItems, onItemSelectAll, showSelectAll, disabled); var menu = null; if (showRemove) { menu = /*#__PURE__*/React.createElement(_menu["default"], null, pagination && /*#__PURE__*/React.createElement(_menu["default"].Item, { onClick: function onClick() { var _a; var pageKeys = getEnabledItemKeys((((_a = _this3.defaultListBodyRef.current) === null || _a === void 0 ? void 0 : _a.getItems()) || []).map(function (entity) { return entity.item; })); onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(pageKeys); } }, removeCurrent), /*#__PURE__*/React.createElement(_menu["default"].Item, { onClick: function onClick() { onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(getEnabledItemKeys(filteredItems)); } }, removeAll)); } else { menu = /*#__PURE__*/React.createElement(_menu["default"], null, /*#__PURE__*/React.createElement(_menu["default"].Item, { onClick: function onClick() { var keys = getEnabledItemKeys(filteredItems); onItemSelectAll(keys, keys.length !== checkedKeys.length); } }, selectAll), pagination && /*#__PURE__*/React.createElement(_menu["default"].Item, { onClick: function onClick() { var _a; var pageItems = ((_a = _this3.defaultListBodyRef.current) === null || _a === void 0 ? void 0 : _a.getItems()) || []; onItemSelectAll(getEnabledItemKeys(pageItems.map(function (entity) { return entity.item; })), true); } }, selectCurrent), /*#__PURE__*/React.createElement(_menu["default"].Item, { onClick: function onClick() { var _a; var availableKeys; if (pagination) { availableKeys = getEnabledItemKeys((((_a = _this3.defaultListBodyRef.current) === null || _a === void 0 ? void 0 : _a.getItems()) || []).map(function (entity) { return entity.item; })); } else { availableKeys = getEnabledItemKeys(filteredItems); } var checkedKeySet = new Set(checkedKeys); var newCheckedKeys = []; var newUnCheckedKeys = []; availableKeys.forEach(function (key) { if (checkedKeySet.has(key)) { newUnCheckedKeys.push(key); } else { newCheckedKeys.push(key); } }); onItemSelectAll(newCheckedKeys, true); onItemSelectAll(newUnCheckedKeys, false); } }, selectInvert)); } var dropdown = /*#__PURE__*/React.createElement(_dropdown["default"], { className: "".concat(prefixCls, "-header-dropdown"), overlay: menu, disabled: disabled }, /*#__PURE__*/React.createElement(_DownOutlined["default"], null)); // ================================== Render =================================== return /*#__PURE__*/React.createElement("div", { className: listCls, style: style }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-header") }, checkAllCheckbox, dropdown, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-header-selected") }, this.getSelectAllLabel(checkedKeys.length, filteredItems.length)), /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-header-title") }, titleText)), listBody, listFooter); } }]); return TransferList; }(React.PureComponent); exports["default"] = TransferList; TransferList.defaultProps = { dataSource: [], titleText: '', showSearch: false }; },{"../_util/reactNode":223,"../checkbox":269,"../dropdown":296,"../menu":341,"./ListBody":424,"./search":429,"@ant-design/icons/DownOutlined":76,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"react":"react"}],428:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _LeftOutlined = _interopRequireDefault(require("@ant-design/icons/LeftOutlined")); var _RightOutlined = _interopRequireDefault(require("@ant-design/icons/RightOutlined")); var _button = _interopRequireDefault(require("../button")); var Operation = function Operation(_ref) { var disabled = _ref.disabled, moveToLeft = _ref.moveToLeft, moveToRight = _ref.moveToRight, _ref$leftArrowText = _ref.leftArrowText, leftArrowText = _ref$leftArrowText === void 0 ? '' : _ref$leftArrowText, _ref$rightArrowText = _ref.rightArrowText, rightArrowText = _ref$rightArrowText === void 0 ? '' : _ref$rightArrowText, leftActive = _ref.leftActive, rightActive = _ref.rightActive, className = _ref.className, style = _ref.style, direction = _ref.direction, oneWay = _ref.oneWay; return /*#__PURE__*/React.createElement("div", { className: className, style: style }, /*#__PURE__*/React.createElement(_button["default"], { type: "primary", size: "small", disabled: disabled || !rightActive, onClick: moveToRight, icon: direction !== 'rtl' ? /*#__PURE__*/React.createElement(_RightOutlined["default"], null) : /*#__PURE__*/React.createElement(_LeftOutlined["default"], null) }, rightArrowText), !oneWay && /*#__PURE__*/React.createElement(_button["default"], { type: "primary", size: "small", disabled: disabled || !leftActive, onClick: moveToLeft, icon: direction !== 'rtl' ? /*#__PURE__*/React.createElement(_LeftOutlined["default"], null) : /*#__PURE__*/React.createElement(_RightOutlined["default"], null) }, leftArrowText)); }; var _default = Operation; exports["default"] = _default; },{"../button":257,"@ant-design/icons/LeftOutlined":92,"@ant-design/icons/RightOutlined":100,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],429:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _CloseCircleFilled = _interopRequireDefault(require("@ant-design/icons/CloseCircleFilled")); var _SearchOutlined = _interopRequireDefault(require("@ant-design/icons/SearchOutlined")); var _input = _interopRequireDefault(require("../input")); var Search = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Search, _React$Component); var _super = (0, _createSuper2["default"])(Search); function Search() { var _this; (0, _classCallCheck2["default"])(this, Search); _this = _super.apply(this, arguments); _this.handleChange = function (e) { var onChange = _this.props.onChange; if (onChange) { onChange(e); } }; _this.handleClear = function (e) { e.preventDefault(); var _this$props = _this.props, handleClear = _this$props.handleClear, disabled = _this$props.disabled; if (!disabled && handleClear) { handleClear(e); } }; return _this; } (0, _createClass2["default"])(Search, [{ key: "render", value: function render() { var _this$props2 = this.props, placeholder = _this$props2.placeholder, value = _this$props2.value, prefixCls = _this$props2.prefixCls, disabled = _this$props2.disabled; var icon = value && value.length > 0 ? /*#__PURE__*/React.createElement("a", { className: "".concat(prefixCls, "-action"), onClick: this.handleClear }, /*#__PURE__*/React.createElement(_CloseCircleFilled["default"], null)) : /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-action") }, /*#__PURE__*/React.createElement(_SearchOutlined["default"], null)); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_input["default"], { placeholder: placeholder, className: prefixCls, value: value, onChange: this.handleChange, disabled: disabled }), icon); } }]); return Search; }(React.Component); exports["default"] = Search; Search.defaultProps = { placeholder: '' }; },{"../input":325,"@ant-design/icons/CloseCircleFilled":69,"@ant-design/icons/SearchOutlined":103,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],430:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "TreeNode", { enumerable: true, get: function get() { return _rcTreeSelect.TreeNode; } }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _rcTreeSelect = _interopRequireWildcard(require("rc-tree-select")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _iconUtil = _interopRequireDefault(require("../select/utils/iconUtil")); var _iconUtil2 = _interopRequireDefault(require("../tree/utils/iconUtil")); var _SizeContext = _interopRequireDefault(require("../config-provider/SizeContext")); var TreeSelect = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(TreeSelect, _React$Component); var _super = (0, _createSuper2["default"])(TreeSelect); function TreeSelect(props) { var _this; (0, _classCallCheck2["default"])(this, TreeSelect); _this = _super.call(this, props); _this.selectRef = /*#__PURE__*/React.createRef(); _this.renderTreeSelect = function (_ref) { var getContextPopupContainer = _ref.getPopupContainer, getPrefixCls = _ref.getPrefixCls, renderEmpty = _ref.renderEmpty, direction = _ref.direction, virtual = _ref.virtual, dropdownMatchSelectWidth = _ref.dropdownMatchSelectWidth; var _this$props = _this.props, customizePrefixCls = _this$props.prefixCls, customizeSize = _this$props.size, className = _this$props.className, treeCheckable = _this$props.treeCheckable, multiple = _this$props.multiple, _this$props$listHeigh = _this$props.listHeight, listHeight = _this$props$listHeigh === void 0 ? 256 : _this$props$listHeigh, _this$props$listItemH = _this$props.listItemHeight, listItemHeight = _this$props$listItemH === void 0 ? 26 : _this$props$listItemH, notFoundContent = _this$props.notFoundContent, _switcherIcon = _this$props.switcherIcon, treeLine = _this$props.treeLine, getPopupContainer = _this$props.getPopupContainer, dropdownClassName = _this$props.dropdownClassName, bordered = _this$props.bordered, _this$props$treeIcon = _this$props.treeIcon, treeIcon = _this$props$treeIcon === void 0 ? false : _this$props$treeIcon; var prefixCls = getPrefixCls('select', customizePrefixCls); var treePrefixCls = getPrefixCls('select-tree', customizePrefixCls); var treeSelectPrefixCls = getPrefixCls('tree-select', customizePrefixCls); var mergedDropdownClassName = (0, _classnames["default"])(dropdownClassName, "".concat(treeSelectPrefixCls, "-dropdown"), (0, _defineProperty2["default"])({}, "".concat(treeSelectPrefixCls, "-dropdown-rtl"), direction === 'rtl')); var isMultiple = !!(treeCheckable || multiple); // ===================== Icons ===================== var _getIcons = (0, _iconUtil["default"])((0, _extends2["default"])((0, _extends2["default"])({}, _this.props), { multiple: isMultiple, prefixCls: prefixCls })), suffixIcon = _getIcons.suffixIcon, itemIcon = _getIcons.itemIcon, removeIcon = _getIcons.removeIcon, clearIcon = _getIcons.clearIcon; // ===================== Empty ===================== var mergedNotFound; if (notFoundContent !== undefined) { mergedNotFound = notFoundContent; } else { mergedNotFound = renderEmpty('Select'); } // ==================== Render ===================== var selectProps = (0, _omit["default"])(_this.props, ['prefixCls', 'suffixIcon', 'itemIcon', 'removeIcon', 'clearIcon', 'switcherIcon', 'size', 'bordered']); return /*#__PURE__*/React.createElement(_SizeContext["default"].Consumer, null, function (size) { var _classNames2; var mergedSize = customizeSize || size; var mergedClassName = (0, _classnames["default"])(!customizePrefixCls && treeSelectPrefixCls, (_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-lg"), mergedSize === 'large'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-sm"), mergedSize === 'small'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-borderless"), !bordered), _classNames2), className); return /*#__PURE__*/React.createElement(_rcTreeSelect["default"], (0, _extends2["default"])({ virtual: virtual, dropdownMatchSelectWidth: dropdownMatchSelectWidth }, selectProps, { ref: _this.selectRef, prefixCls: prefixCls, className: mergedClassName, listHeight: listHeight, listItemHeight: listItemHeight, treeCheckable: treeCheckable ? /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-tree-checkbox-inner") }) : treeCheckable, inputIcon: suffixIcon, menuItemSelectedIcon: itemIcon, removeIcon: removeIcon, clearIcon: clearIcon, switcherIcon: function switcherIcon(nodeProps) { return (0, _iconUtil2["default"])(treePrefixCls, _switcherIcon, treeLine, nodeProps); }, showTreeIcon: treeIcon, notFoundContent: mergedNotFound, getPopupContainer: getPopupContainer || getContextPopupContainer, treeMotion: null, dropdownClassName: mergedDropdownClassName })); }); }; (0, _devWarning["default"])(props.multiple !== false || !props.treeCheckable, 'TreeSelect', '`multiple` will alway be `true` when `treeCheckable` is true'); return _this; } (0, _createClass2["default"])(TreeSelect, [{ key: "focus", value: function focus() { if (this.selectRef.current) { this.selectRef.current.focus(); } } }, { key: "blur", value: function blur() { if (this.selectRef.current) { this.selectRef.current.blur(); } } }, { key: "render", value: function render() { return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, this.renderTreeSelect); } }]); return TreeSelect; }(React.Component); TreeSelect.TreeNode = _rcTreeSelect.TreeNode; TreeSelect.SHOW_ALL = _rcTreeSelect.SHOW_ALL; TreeSelect.SHOW_PARENT = _rcTreeSelect.SHOW_PARENT; TreeSelect.SHOW_CHILD = _rcTreeSelect.SHOW_CHILD; TreeSelect.defaultProps = { transitionName: 'slide-up', choiceTransitionName: '', bordered: true }; var _default = TreeSelect; exports["default"] = _default; },{"../_util/devWarning":212,"../config-provider":278,"../config-provider/SizeContext":276,"../select/utils/iconUtil":378,"../tree/utils/iconUtil":435,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"omit.js":579,"rc-tree-select":826,"react":"react"}],431:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _util = require("rc-tree/lib/util"); var _treeUtil = require("rc-tree/lib/utils/treeUtil"); var _FileOutlined = _interopRequireDefault(require("@ant-design/icons/FileOutlined")); var _FolderOpenOutlined = _interopRequireDefault(require("@ant-design/icons/FolderOpenOutlined")); var _FolderOutlined = _interopRequireDefault(require("@ant-design/icons/FolderOutlined")); var _configProvider = require("../config-provider"); var _Tree = _interopRequireDefault(require("./Tree")); var _dictUtil = require("./utils/dictUtil"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; function getIcon(props) { var isLeaf = props.isLeaf, expanded = props.expanded; if (isLeaf) { return /*#__PURE__*/React.createElement(_FileOutlined["default"], null); } return expanded ? /*#__PURE__*/React.createElement(_FolderOpenOutlined["default"], null) : /*#__PURE__*/React.createElement(_FolderOutlined["default"], null); } function getTreeData(_ref) { var treeData = _ref.treeData, children = _ref.children; return treeData || (0, _treeUtil.convertTreeToData)(children); } var DirectoryTree = function DirectoryTree(_a, ref) { var defaultExpandAll = _a.defaultExpandAll, defaultExpandParent = _a.defaultExpandParent, defaultExpandedKeys = _a.defaultExpandedKeys, props = __rest(_a, ["defaultExpandAll", "defaultExpandParent", "defaultExpandedKeys"]); // Shift click usage var lastSelectedKey = React.useRef(); var cachedSelectedKeys = React.useRef(); var treeRef = /*#__PURE__*/React.createRef(); React.useImperativeHandle(ref, function () { return treeRef.current; }); var getInitExpandedKeys = function getInitExpandedKeys() { var _convertDataToEntitie = (0, _treeUtil.convertDataToEntities)(getTreeData(props)), keyEntities = _convertDataToEntitie.keyEntities; var initExpandedKeys; // Expanded keys if (defaultExpandAll) { initExpandedKeys = Object.keys(keyEntities); } else if (defaultExpandParent) { initExpandedKeys = (0, _util.conductExpandParent)(props.expandedKeys || defaultExpandedKeys, keyEntities); } else { initExpandedKeys = props.expandedKeys || defaultExpandedKeys; } return initExpandedKeys; }; var _React$useState = React.useState(props.selectedKeys || props.defaultSelectedKeys || []), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), selectedKeys = _React$useState2[0], setSelectedKeys = _React$useState2[1]; var _React$useState3 = React.useState(getInitExpandedKeys()), _React$useState4 = (0, _slicedToArray2["default"])(_React$useState3, 2), expandedKeys = _React$useState4[0], setExpandedKeys = _React$useState4[1]; React.useEffect(function () { if ('selectedKeys' in props) { setSelectedKeys(props.selectedKeys); } }, [props.selectedKeys]); React.useEffect(function () { if ('expandedKeys' in props) { setExpandedKeys(props.expandedKeys); } }, [props.expandedKeys]); var expandFolderNode = function expandFolderNode(event, node) { var isLeaf = node.isLeaf; if (isLeaf || event.shiftKey || event.metaKey || event.ctrlKey) { return; } // Call internal rc-tree expand function // https://github.com/ant-design/ant-design/issues/12567 treeRef.current.onNodeExpand(event, node); }; var onDebounceExpand = (0, _debounce["default"])(expandFolderNode, 200, { leading: true }); var onExpand = function onExpand(keys, info) { if (!('expandedKeys' in props)) { setExpandedKeys(keys); } // Call origin function if (props.onExpand) { return props.onExpand(keys, info); } return undefined; }; var onClick = function onClick(event, node) { var expandAction = props.expandAction; // Expand the tree if (expandAction === 'click') { onDebounceExpand(event, node); } if (props.onClick) { props.onClick(event, node); } }; var onDoubleClick = function onDoubleClick(event, node) { var expandAction = props.expandAction; // Expand the tree if (expandAction === 'doubleClick') { onDebounceExpand(event, node); } if (props.onDoubleClick) { props.onDoubleClick(event, node); } }; var onSelect = function onSelect(keys, event) { var multiple = props.multiple; var node = event.node, nativeEvent = event.nativeEvent; var _node$key = node.key, key = _node$key === void 0 ? '' : _node$key; var treeData = getTreeData(props); // const newState: DirectoryTreeState = {}; // We need wrap this event since some value is not same var newEvent = (0, _extends2["default"])((0, _extends2["default"])({}, event), { selected: true }); // Windows / Mac single pick var ctrlPick = nativeEvent.ctrlKey || nativeEvent.metaKey; var shiftPick = nativeEvent.shiftKey; // Generate new selected keys var newSelectedKeys; if (multiple && ctrlPick) { // Control click newSelectedKeys = keys; lastSelectedKey.current = key; cachedSelectedKeys.current = newSelectedKeys; newEvent.selectedNodes = (0, _dictUtil.convertDirectoryKeysToNodes)(treeData, newSelectedKeys); } else if (multiple && shiftPick) { // Shift click newSelectedKeys = Array.from(new Set([].concat((0, _toConsumableArray2["default"])(cachedSelectedKeys.current || []), (0, _toConsumableArray2["default"])((0, _dictUtil.calcRangeKeys)({ treeData: treeData, expandedKeys: expandedKeys, startKey: key, endKey: lastSelectedKey.current }))))); newEvent.selectedNodes = (0, _dictUtil.convertDirectoryKeysToNodes)(treeData, newSelectedKeys); } else { // Single click newSelectedKeys = [key]; lastSelectedKey.current = key; cachedSelectedKeys.current = newSelectedKeys; newEvent.selectedNodes = (0, _dictUtil.convertDirectoryKeysToNodes)(treeData, newSelectedKeys); } if (props.onSelect) { props.onSelect(newSelectedKeys, newEvent); } if (!('selectedKeys' in props)) { setSelectedKeys(newSelectedKeys); } }; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var customizePrefixCls = props.prefixCls, className = props.className, otherProps = __rest(props, ["prefixCls", "className"]); var prefixCls = getPrefixCls('tree', customizePrefixCls); var connectClassName = (0, _classnames["default"])("".concat(prefixCls, "-directory"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-directory-rtl"), direction === 'rtl'), className); return /*#__PURE__*/React.createElement(_Tree["default"], (0, _extends2["default"])({ icon: getIcon, ref: treeRef, blockNode: true }, otherProps, { prefixCls: prefixCls, className: connectClassName, expandedKeys: expandedKeys, selectedKeys: selectedKeys, onSelect: onSelect, onClick: onClick, onDoubleClick: onDoubleClick, onExpand: onExpand })); }; var ForwardDirectoryTree = /*#__PURE__*/React.forwardRef(DirectoryTree); ForwardDirectoryTree.displayName = 'DirectoryTree'; ForwardDirectoryTree.defaultProps = { showIcon: true, expandAction: 'click' }; var _default = ForwardDirectoryTree; exports["default"] = _default; },{"../config-provider":278,"./Tree":432,"./utils/dictUtil":434,"@ant-design/icons/FileOutlined":85,"@ant-design/icons/FolderOpenOutlined":88,"@ant-design/icons/FolderOutlined":89,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"lodash/debounce":551,"rc-tree/lib/util":838,"rc-tree/lib/utils/treeUtil":841,"react":"react"}],432:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcTree = _interopRequireWildcard(require("rc-tree")); var _classnames = _interopRequireDefault(require("classnames")); var _DirectoryTree = _interopRequireDefault(require("./DirectoryTree")); var _configProvider = require("../config-provider"); var _motion = _interopRequireDefault(require("../_util/motion")); var _iconUtil = _interopRequireDefault(require("./utils/iconUtil")); var Tree = /*#__PURE__*/React.forwardRef(function (props, ref) { var _classNames; var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, virtual = _React$useContext.virtual; var customizePrefixCls = props.prefixCls, className = props.className, showIcon = props.showIcon, showLine = props.showLine, _switcherIcon = props.switcherIcon, blockNode = props.blockNode, children = props.children, checkable = props.checkable; var newProps = (0, _extends2["default"])((0, _extends2["default"])({}, props), { showLine: Boolean(showLine) }); var prefixCls = getPrefixCls('tree', customizePrefixCls); return /*#__PURE__*/React.createElement(_rcTree["default"], (0, _extends2["default"])({ itemHeight: 20, ref: ref, virtual: virtual }, newProps, { prefixCls: prefixCls, className: (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-icon-hide"), !showIcon), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-block-node"), blockNode), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className), checkable: checkable ? /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-checkbox-inner") }) : checkable, switcherIcon: function switcherIcon(nodeProps) { return (0, _iconUtil["default"])(prefixCls, _switcherIcon, showLine, nodeProps); } }), children); }); Tree.TreeNode = _rcTree.TreeNode; Tree.DirectoryTree = _DirectoryTree["default"]; Tree.defaultProps = { checkable: false, showIcon: false, motion: (0, _extends2["default"])((0, _extends2["default"])({}, _motion["default"]), { motionAppear: false }), blockNode: false }; var _default = Tree; exports["default"] = _default; },{"../_util/motion":221,"../config-provider":278,"./DirectoryTree":431,"./utils/iconUtil":435,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-tree":837,"react":"react"}],433:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Tree = _interopRequireDefault(require("./Tree")); var _default = _Tree["default"]; exports["default"] = _default; },{"./Tree":432,"@babel/runtime/helpers/interopRequireDefault":192}],434:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.calcRangeKeys = calcRangeKeys; exports.convertDirectoryKeysToNodes = convertDirectoryKeysToNodes; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var Record; (function (Record) { Record[Record["None"] = 0] = "None"; Record[Record["Start"] = 1] = "Start"; Record[Record["End"] = 2] = "End"; })(Record || (Record = {})); function traverseNodesKey(treeData, callback) { function processNode(dataNode) { var key = dataNode.key, children = dataNode.children; if (callback(key, dataNode) !== false) { traverseNodesKey(children || [], callback); } } treeData.forEach(processNode); } /** 计算选中范围,只考虑expanded情况以优化性能 */ function calcRangeKeys(_ref) { var treeData = _ref.treeData, expandedKeys = _ref.expandedKeys, startKey = _ref.startKey, endKey = _ref.endKey; var keys = []; var record = Record.None; if (startKey && startKey === endKey) { return [startKey]; } if (!startKey || !endKey) { return []; } function matchKey(key) { return key === startKey || key === endKey; } traverseNodesKey(treeData, function (key) { if (record === Record.End) { return false; } if (matchKey(key)) { // Match test keys.push(key); if (record === Record.None) { record = Record.Start; } else if (record === Record.Start) { record = Record.End; return false; } } else if (record === Record.Start) { // Append selection keys.push(key); } if (expandedKeys.indexOf(key) === -1) { return false; } return true; }); return keys; } function convertDirectoryKeysToNodes(treeData, keys) { var restKeys = (0, _toConsumableArray2["default"])(keys); var nodes = []; traverseNodesKey(treeData, function (key, node) { var index = restKeys.indexOf(key); if (index !== -1) { nodes.push(node); restKeys.splice(index, 1); } return !!restKeys.length; }); return nodes; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/toConsumableArray":207}],435:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = renderSwitcherIcon; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons/LoadingOutlined")); var _FileOutlined = _interopRequireDefault(require("@ant-design/icons/FileOutlined")); var _MinusSquareOutlined = _interopRequireDefault(require("@ant-design/icons/MinusSquareOutlined")); var _PlusSquareOutlined = _interopRequireDefault(require("@ant-design/icons/PlusSquareOutlined")); var _CaretDownFilled = _interopRequireDefault(require("@ant-design/icons/CaretDownFilled")); var _reactNode = require("../../_util/reactNode"); function renderSwitcherIcon(prefixCls, switcherIcon, showLine, _ref) { var isLeaf = _ref.isLeaf, expanded = _ref.expanded, loading = _ref.loading; if (loading) { return /*#__PURE__*/React.createElement(_LoadingOutlined["default"], { className: "".concat(prefixCls, "-switcher-loading-icon") }); } var showLeafIcon; if (showLine && (0, _typeof2["default"])(showLine) === 'object') { showLeafIcon = showLine.showLeafIcon; } if (isLeaf) { if (showLine) { if ((0, _typeof2["default"])(showLine) === 'object' && !showLeafIcon) { return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-switcher-leaf-line") }); } return /*#__PURE__*/React.createElement(_FileOutlined["default"], { className: "".concat(prefixCls, "-switcher-line-icon") }); } return null; } var switcherCls = "".concat(prefixCls, "-switcher-icon"); if ((0, _reactNode.isValidElement)(switcherIcon)) { return (0, _reactNode.cloneElement)(switcherIcon, { className: (0, _classnames["default"])(switcherIcon.props.className || '', switcherCls) }); } if (switcherIcon) { return switcherIcon; } if (showLine) { return expanded ? /*#__PURE__*/React.createElement(_MinusSquareOutlined["default"], { className: "".concat(prefixCls, "-switcher-line-icon") }) : /*#__PURE__*/React.createElement(_PlusSquareOutlined["default"], { className: "".concat(prefixCls, "-switcher-line-icon") }); } return /*#__PURE__*/React.createElement(_CaretDownFilled["default"], { className: switcherCls }); } },{"../../_util/reactNode":223,"@ant-design/icons/CaretDownFilled":62,"@ant-design/icons/FileOutlined":85,"@ant-design/icons/LoadingOutlined":93,"@ant-design/icons/MinusSquareOutlined":94,"@ant-design/icons/PlusSquareOutlined":98,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"classnames":455,"react":"react"}],436:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _findDOMNode = _interopRequireDefault(require("rc-util/lib/Dom/findDOMNode")); var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard")); var _omit = _interopRequireDefault(require("omit.js")); var _EditOutlined = _interopRequireDefault(require("@ant-design/icons/EditOutlined")); var _CheckOutlined = _interopRequireDefault(require("@ant-design/icons/CheckOutlined")); var _CopyOutlined = _interopRequireDefault(require("@ant-design/icons/CopyOutlined")); var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer")); var _configProvider = require("../config-provider"); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _transButton = _interopRequireDefault(require("../_util/transButton")); var _raf = _interopRequireDefault(require("../_util/raf")); var _styleChecker = require("../_util/styleChecker"); var _tooltip = _interopRequireDefault(require("../tooltip")); var _Typography = _interopRequireDefault(require("./Typography")); var _Editable = _interopRequireDefault(require("./Editable")); var _util = _interopRequireDefault(require("./util")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var isLineClampSupport = (0, _styleChecker.isStyleSupport)('webkitLineClamp'); var isTextOverflowSupport = (0, _styleChecker.isStyleSupport)('textOverflow'); function wrapperDecorations(_ref, content) { var mark = _ref.mark, code = _ref.code, underline = _ref.underline, del = _ref["delete"], strong = _ref.strong, keyboard = _ref.keyboard; var currentContent = content; function wrap(needed, tag) { if (!needed) return; currentContent = /*#__PURE__*/React.createElement(tag, {}, currentContent); } wrap(strong, 'strong'); wrap(underline, 'u'); wrap(del, 'del'); wrap(code, 'code'); wrap(mark, 'mark'); wrap(keyboard, 'kbd'); return currentContent; } var ELLIPSIS_STR = '...'; var Base = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Base, _React$Component); var _super = (0, _createSuper2["default"])(Base); function Base() { var _this; (0, _classCallCheck2["default"])(this, Base); _this = _super.apply(this, arguments); _this.contentRef = /*#__PURE__*/React.createRef(); _this.state = { edit: false, copied: false, ellipsisText: '', ellipsisContent: null, isEllipsis: false, expanded: false, clientRendered: false }; _this.getPrefixCls = function () { var customizePrefixCls = _this.props.prefixCls; var getPrefixCls = _this.context.getPrefixCls; return getPrefixCls('typography', customizePrefixCls); }; // =============== Expand =============== _this.onExpandClick = function (e) { var _this$getEllipsis = _this.getEllipsis(), onExpand = _this$getEllipsis.onExpand; _this.setState({ expanded: true }); if (onExpand) { onExpand(e); } }; // ================ Edit ================ _this.onEditClick = function () { _this.triggerEdit(true); }; _this.onEditChange = function (value) { var _this$getEditable = _this.getEditable(), onChange = _this$getEditable.onChange; if (onChange) { onChange(value); } _this.triggerEdit(false); }; _this.onEditCancel = function () { _this.triggerEdit(false); }; // ================ Copy ================ _this.onCopyClick = function () { var _this$props = _this.props, children = _this$props.children, copyable = _this$props.copyable; var copyConfig = (0, _extends2["default"])({}, (0, _typeof2["default"])(copyable) === 'object' ? copyable : null); if (copyConfig.text === undefined) { copyConfig.text = String(children); } (0, _copyToClipboard["default"])(copyConfig.text || ''); _this.setState({ copied: true }, function () { if (copyConfig.onCopy) { copyConfig.onCopy(); } _this.copyId = window.setTimeout(function () { _this.setState({ copied: false }); }, 3000); }); }; _this.setEditRef = function (node) { _this.editIcon = node; }; _this.triggerEdit = function (edit) { var _this$getEditable2 = _this.getEditable(), onStart = _this$getEditable2.onStart; if (edit && onStart) { onStart(); } _this.setState({ edit: edit }, function () { if (!edit && _this.editIcon) { _this.editIcon.focus(); } }); }; // ============== Ellipsis ============== _this.resizeOnNextFrame = function () { _raf["default"].cancel(_this.rafId); _this.rafId = (0, _raf["default"])(function () { // Do not bind `syncEllipsis`. It need for test usage on prototype _this.syncEllipsis(); }); }; return _this; } (0, _createClass2["default"])(Base, [{ key: "componentDidMount", value: function componentDidMount() { this.setState({ clientRendered: true }); this.resizeOnNextFrame(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var children = this.props.children; var ellipsis = this.getEllipsis(); var prevEllipsis = this.getEllipsis(prevProps); if (children !== prevProps.children || ellipsis.rows !== prevEllipsis.rows) { this.resizeOnNextFrame(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { window.clearTimeout(this.copyId); _raf["default"].cancel(this.rafId); } }, { key: "getEditable", value: function getEditable(props) { var edit = this.state.edit; var _ref2 = props || this.props, editable = _ref2.editable; if (!editable) return { editing: edit }; return (0, _extends2["default"])({ editing: edit }, (0, _typeof2["default"])(editable) === 'object' ? editable : null); } }, { key: "getEllipsis", value: function getEllipsis(props) { var _ref3 = props || this.props, ellipsis = _ref3.ellipsis; if (!ellipsis) return {}; return (0, _extends2["default"])({ rows: 1, expandable: false }, (0, _typeof2["default"])(ellipsis) === 'object' ? ellipsis : null); } }, { key: "canUseCSSEllipsis", value: function canUseCSSEllipsis() { var clientRendered = this.state.clientRendered; var _this$props2 = this.props, editable = _this$props2.editable, copyable = _this$props2.copyable; var _this$getEllipsis2 = this.getEllipsis(), rows = _this$getEllipsis2.rows, expandable = _this$getEllipsis2.expandable, suffix = _this$getEllipsis2.suffix, onEllipsis = _this$getEllipsis2.onEllipsis; if (suffix) return false; // Can't use css ellipsis since we need to provide the place for button if (editable || copyable || expandable || !clientRendered || onEllipsis) { return false; } if (rows === 1) { return isTextOverflowSupport; } return isLineClampSupport; } }, { key: "syncEllipsis", value: function syncEllipsis() { var _this$state = this.state, ellipsisText = _this$state.ellipsisText, isEllipsis = _this$state.isEllipsis, expanded = _this$state.expanded; var _this$getEllipsis3 = this.getEllipsis(), rows = _this$getEllipsis3.rows, suffix = _this$getEllipsis3.suffix, onEllipsis = _this$getEllipsis3.onEllipsis; var children = this.props.children; if (!rows || rows < 0 || !this.contentRef.current || expanded) return; // Do not measure if css already support ellipsis if (this.canUseCSSEllipsis()) return; (0, _devWarning["default"])((0, _toArray["default"])(children).every(function (child) { return typeof child === 'string'; }), 'Typography', '`ellipsis` should use string as children only.'); var _measure = (0, _util["default"])((0, _findDOMNode["default"])(this.contentRef.current), { rows: rows, suffix: suffix }, children, this.renderOperations(true), ELLIPSIS_STR), content = _measure.content, text = _measure.text, ellipsis = _measure.ellipsis; if (ellipsisText !== text || isEllipsis !== ellipsis) { this.setState({ ellipsisText: text, ellipsisContent: content, isEllipsis: ellipsis }); if (isEllipsis !== ellipsis && onEllipsis) { onEllipsis(ellipsis); } } } }, { key: "renderExpand", value: function renderExpand(forceRender) { var _this$getEllipsis4 = this.getEllipsis(), expandable = _this$getEllipsis4.expandable, symbol = _this$getEllipsis4.symbol; var _this$state2 = this.state, expanded = _this$state2.expanded, isEllipsis = _this$state2.isEllipsis; if (!expandable) return null; // force render expand icon for measure usage or it will cause dead loop if (!forceRender && (expanded || !isEllipsis)) return null; var expandContent; if (symbol) { expandContent = symbol; } else { expandContent = this.expandStr; } return /*#__PURE__*/React.createElement("a", { key: "expand", className: "".concat(this.getPrefixCls(), "-expand"), onClick: this.onExpandClick, "aria-label": this.expandStr }, expandContent); } }, { key: "renderEdit", value: function renderEdit() { var editable = this.props.editable; if (!editable) return; var icon = editable.icon, tooltip = editable.tooltip; var title = (0, _toArray["default"])(tooltip)[0] || this.editStr; var ariaLabel = typeof title === 'string' ? title : ''; return /*#__PURE__*/React.createElement(_tooltip["default"], { key: "edit", title: tooltip === false ? '' : title }, /*#__PURE__*/React.createElement(_transButton["default"], { ref: this.setEditRef, className: "".concat(this.getPrefixCls(), "-edit"), onClick: this.onEditClick, "aria-label": ariaLabel }, icon || /*#__PURE__*/React.createElement(_EditOutlined["default"], { role: "button" }))); } }, { key: "renderCopy", value: function renderCopy() { var copied = this.state.copied; var copyable = this.props.copyable; if (!copyable) return; var prefixCls = this.getPrefixCls(); var tooltips = copyable.tooltips; var tooltipNodes = (0, _toArray["default"])(tooltips); if (tooltipNodes.length === 0) { tooltipNodes = [this.copyStr, this.copiedStr]; } var title = copied ? tooltipNodes[1] : tooltipNodes[0]; var ariaLabel = typeof title === 'string' ? title : ''; var icons = (0, _toArray["default"])(copyable.icon); return /*#__PURE__*/React.createElement(_tooltip["default"], { key: "copy", title: tooltips === false ? '' : title }, /*#__PURE__*/React.createElement(_transButton["default"], { className: (0, _classnames["default"])("".concat(prefixCls, "-copy"), copied && "".concat(prefixCls, "-copy-success")), onClick: this.onCopyClick, "aria-label": ariaLabel }, copied ? icons[1] || /*#__PURE__*/React.createElement(_CheckOutlined["default"], null) : icons[0] || /*#__PURE__*/React.createElement(_CopyOutlined["default"], null))); } }, { key: "renderEditInput", value: function renderEditInput() { var _this$props3 = this.props, children = _this$props3.children, className = _this$props3.className, style = _this$props3.style; var direction = this.context.direction; var _this$getEditable3 = this.getEditable(), maxLength = _this$getEditable3.maxLength, autoSize = _this$getEditable3.autoSize; return /*#__PURE__*/React.createElement(_Editable["default"], { value: typeof children === 'string' ? children : '', onSave: this.onEditChange, onCancel: this.onEditCancel, prefixCls: this.getPrefixCls(), className: className, style: style, direction: direction, maxLength: maxLength, autoSize: autoSize }); } }, { key: "renderOperations", value: function renderOperations(forceRenderExpanded) { return [this.renderExpand(forceRenderExpanded), this.renderEdit(), this.renderCopy()].filter(function (node) { return node; }); } }, { key: "renderContent", value: function renderContent() { var _this2 = this; var _this$state3 = this.state, ellipsisContent = _this$state3.ellipsisContent, isEllipsis = _this$state3.isEllipsis, expanded = _this$state3.expanded; var _a = this.props, component = _a.component, children = _a.children, className = _a.className, type = _a.type, disabled = _a.disabled, style = _a.style, restProps = __rest(_a, ["component", "children", "className", "type", "disabled", "style"]); var direction = this.context.direction; var _this$getEllipsis5 = this.getEllipsis(), rows = _this$getEllipsis5.rows, suffix = _this$getEllipsis5.suffix; var prefixCls = this.getPrefixCls(); var textProps = (0, _omit["default"])(restProps, ['prefixCls', 'editable', 'copyable', 'ellipsis', 'mark', 'code', 'delete', 'underline', 'strong', 'keyboard'].concat((0, _toConsumableArray2["default"])(_configProvider.configConsumerProps))); var cssEllipsis = this.canUseCSSEllipsis(); var cssTextOverflow = rows === 1 && cssEllipsis; var cssLineClamp = rows && rows > 1 && cssEllipsis; var textNode = children; var ariaLabel; // Only use js ellipsis when css ellipsis not support if (rows && isEllipsis && !expanded && !cssEllipsis) { var title = restProps.title; ariaLabel = title; if (!title && (typeof children === 'string' || typeof children === 'number')) { ariaLabel = String(children); } // We move full content to outer element to avoid repeat read the content by accessibility textNode = /*#__PURE__*/React.createElement("span", { title: ariaLabel, "aria-hidden": "true" }, ellipsisContent, ELLIPSIS_STR, suffix); } else { textNode = /*#__PURE__*/React.createElement(React.Fragment, null, children, suffix); } textNode = wrapperDecorations(this.props, textNode); return /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Text" }, function (_ref4) { var _classNames; var edit = _ref4.edit, copyStr = _ref4.copy, copied = _ref4.copied, expand = _ref4.expand; _this2.editStr = edit; _this2.copyStr = copyStr; _this2.copiedStr = copied; _this2.expandStr = expand; return /*#__PURE__*/React.createElement(_rcResizeObserver["default"], { onResize: _this2.resizeOnNextFrame, disabled: !rows }, /*#__PURE__*/React.createElement(_Typography["default"], (0, _extends2["default"])({ className: (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-").concat(type), type), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-ellipsis"), rows), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-ellipsis-single-line"), cssTextOverflow), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-ellipsis-multiple-line"), cssLineClamp), _classNames), className), style: (0, _extends2["default"])((0, _extends2["default"])({}, style), { WebkitLineClamp: cssLineClamp ? rows : null }), component: component, ref: _this2.contentRef, "aria-label": ariaLabel, direction: direction }, textProps), textNode, _this2.renderOperations())); }); } }, { key: "render", value: function render() { var _this$getEditable4 = this.getEditable(), editing = _this$getEditable4.editing; if (editing) { return this.renderEditInput(); } return this.renderContent(); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps) { var children = nextProps.children, editable = nextProps.editable; (0, _devWarning["default"])(!editable || typeof children === 'string', 'Typography', 'When `editable` is enabled, the `children` should use string.'); return {}; } }]); return Base; }(React.Component); Base.contextType = _configProvider.ConfigContext; Base.defaultProps = { children: '' }; var _default = Base; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/raf":222,"../_util/styleChecker":227,"../_util/transButton":229,"../config-provider":278,"../locale-provider/LocaleReceiver":331,"../tooltip":422,"./Editable":437,"./Typography":442,"./util":444,"@ant-design/icons/CheckOutlined":67,"@ant-design/icons/CopyOutlined":72,"@ant-design/icons/EditOutlined":78,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"classnames":455,"copy-to-clipboard":457,"omit.js":579,"rc-resize-observer":729,"rc-util/lib/Children/toArray":858,"rc-util/lib/Dom/findDOMNode":863,"react":"react"}],437:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _EnterOutlined = _interopRequireDefault(require("@ant-design/icons/EnterOutlined")); var _TextArea = _interopRequireDefault(require("../input/TextArea")); var Editable = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Editable, _React$Component); var _super = (0, _createSuper2["default"])(Editable); function Editable() { var _this; (0, _classCallCheck2["default"])(this, Editable); _this = _super.apply(this, arguments); _this.inComposition = false; _this.state = { current: '' }; _this.onChange = function (_ref) { var value = _ref.target.value; _this.setState({ current: value.replace(/[\n\r]/g, '') }); }; _this.onCompositionStart = function () { _this.inComposition = true; }; _this.onCompositionEnd = function () { _this.inComposition = false; }; _this.onKeyDown = function (_ref2) { var keyCode = _ref2.keyCode; // We don't record keyCode when IME is using if (_this.inComposition) return; _this.lastKeyCode = keyCode; }; _this.onKeyUp = function (_ref3) { var keyCode = _ref3.keyCode, ctrlKey = _ref3.ctrlKey, altKey = _ref3.altKey, metaKey = _ref3.metaKey, shiftKey = _ref3.shiftKey; var onCancel = _this.props.onCancel; // Check if it's a real key if (_this.lastKeyCode === keyCode && !_this.inComposition && !ctrlKey && !altKey && !metaKey && !shiftKey) { if (keyCode === _KeyCode["default"].ENTER) { _this.confirmChange(); } else if (keyCode === _KeyCode["default"].ESC) { onCancel(); } } }; _this.onBlur = function () { _this.confirmChange(); }; _this.confirmChange = function () { var current = _this.state.current; var onSave = _this.props.onSave; onSave(current.trim()); }; _this.setTextarea = function (textarea) { _this.textarea = textarea; }; return _this; } (0, _createClass2["default"])(Editable, [{ key: "componentDidMount", value: function componentDidMount() { if (this.textarea && this.textarea.resizableTextArea) { var textArea = this.textarea.resizableTextArea.textArea; textArea.focus(); var length = textArea.value.length; textArea.setSelectionRange(length, length); } } }, { key: "render", value: function render() { var current = this.state.current; var _this$props = this.props, prefixCls = _this$props.prefixCls, ariaLabel = _this$props['aria-label'], className = _this$props.className, style = _this$props.style, direction = _this$props.direction, maxLength = _this$props.maxLength, autoSize = _this$props.autoSize; var textAreaClassName = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-edit-content"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); return /*#__PURE__*/React.createElement("div", { className: textAreaClassName, style: style }, /*#__PURE__*/React.createElement(_TextArea["default"], { ref: this.setTextarea, maxLength: maxLength, value: current, onChange: this.onChange, onKeyDown: this.onKeyDown, onKeyUp: this.onKeyUp, onCompositionStart: this.onCompositionStart, onCompositionEnd: this.onCompositionEnd, onBlur: this.onBlur, "aria-label": ariaLabel, autoSize: autoSize === undefined || autoSize }), /*#__PURE__*/React.createElement(_EnterOutlined["default"], { className: "".concat(prefixCls, "-edit-content-confirm") })); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, prevState) { var prevValue = prevState.prevValue; var value = nextProps.value; var newState = { prevValue: value }; if (prevValue !== value) { newState.current = value; } return newState; } }]); return Editable; }(React.Component); var _default = Editable; exports["default"] = _default; },{"../input/TextArea":324,"@ant-design/icons/EnterOutlined":80,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-util/lib/KeyCode":865,"react":"react"}],438:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _Base = _interopRequireDefault(require("./Base")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Link = function Link(_a, ref) { var ellipsis = _a.ellipsis, rel = _a.rel, restProps = __rest(_a, ["ellipsis", "rel"]); (0, _devWarning["default"])((0, _typeof2["default"])(ellipsis) !== 'object', 'Typography.Link', '`ellipsis` only supports boolean value.'); var baseRef = React.useRef(null); React.useImperativeHandle(ref, function () { var _a; return (_a = baseRef.current) === null || _a === void 0 ? void 0 : _a.contentRef.current; }); var mergedProps = (0, _extends2["default"])((0, _extends2["default"])({}, restProps), { rel: rel === undefined && restProps.target === '_blank' ? 'noopener noreferrer' : rel }); // https://github.com/ant-design/ant-design/issues/26622 // @ts-ignore delete mergedProps.navigate; return /*#__PURE__*/React.createElement(_Base["default"], (0, _extends2["default"])({}, mergedProps, { ref: baseRef, ellipsis: !!ellipsis, component: "a" })); }; var _default = /*#__PURE__*/React.forwardRef(Link); exports["default"] = _default; },{"../_util/devWarning":212,"./Base":436,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"react":"react"}],439:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _Base = _interopRequireDefault(require("./Base")); var Paragraph = function Paragraph(props) { return /*#__PURE__*/React.createElement(_Base["default"], (0, _extends2["default"])({}, props, { component: "div" })); }; var _default = Paragraph; exports["default"] = _default; },{"./Base":436,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],440:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _Base = _interopRequireDefault(require("./Base")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Text = function Text(_a) { var ellipsis = _a.ellipsis, restProps = __rest(_a, ["ellipsis"]); (0, _devWarning["default"])((0, _typeof2["default"])(ellipsis) !== 'object', 'Typography.Text', '`ellipsis` only supports boolean value.'); return /*#__PURE__*/React.createElement(_Base["default"], (0, _extends2["default"])({}, restProps, { ellipsis: !!ellipsis, component: "span" })); }; var _default = Text; exports["default"] = _default; },{"../_util/devWarning":212,"./Base":436,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"react":"react"}],441:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _Base = _interopRequireDefault(require("./Base")); var _type = require("../_util/type"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var TITLE_ELE_LIST = (0, _type.tupleNum)(1, 2, 3, 4, 5); var Title = function Title(props) { var _props$level = props.level, level = _props$level === void 0 ? 1 : _props$level, restProps = __rest(props, ["level"]); var component; if (TITLE_ELE_LIST.indexOf(level) !== -1) { component = "h".concat(level); } else { (0, _devWarning["default"])(false, 'Typography.Title', 'Title only accept `1 | 2 | 3 | 4 | 5` as `level` value. And `5` need 4.6.0+ version.'); component = 'h1'; } return /*#__PURE__*/React.createElement(_Base["default"], (0, _extends2["default"])({}, restProps, { component: component })); }; var _default = Title; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/type":230,"./Base":436,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],442:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _ref2 = require("../_util/ref"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Typography = function Typography(_a, ref) { var customizePrefixCls = _a.prefixCls, _a$component = _a.component, component = _a$component === void 0 ? 'article' : _a$component, className = _a.className, ariaLabel = _a['aria-label'], setContentRef = _a.setContentRef, children = _a.children, restProps = __rest(_a, ["prefixCls", "component", "className", 'aria-label', "setContentRef", "children"]); var mergedRef = ref; if (setContentRef) { (0, _devWarning["default"])(false, 'Typography', '`setContentRef` is deprecated. Please use `ref` instead.'); mergedRef = (0, _ref2.composeRef)(ref, setContentRef); } return /*#__PURE__*/React.createElement(_configProvider.ConfigConsumer, null, function (_ref) { var getPrefixCls = _ref.getPrefixCls, direction = _ref.direction; var Component = component; var prefixCls = getPrefixCls('typography', customizePrefixCls); var componentClassName = (0, _classnames["default"])(prefixCls, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-rtl"), direction === 'rtl'), className); return /*#__PURE__*/React.createElement(Component, (0, _extends2["default"])({ className: componentClassName, "aria-label": ariaLabel, ref: mergedRef }, restProps), children); }); }; var RefTypography = /*#__PURE__*/React.forwardRef(Typography); RefTypography.displayName = 'Typography'; // es default export should use const instead of let var ExportTypography = RefTypography; var _default = ExportTypography; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/ref":224,"../config-provider":278,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],443:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Typography = _interopRequireDefault(require("./Typography")); var _Text = _interopRequireDefault(require("./Text")); var _Link = _interopRequireDefault(require("./Link")); var _Title = _interopRequireDefault(require("./Title")); var _Paragraph = _interopRequireDefault(require("./Paragraph")); var Typography = _Typography["default"]; Typography.Text = _Text["default"]; Typography.Link = _Link["default"]; Typography.Title = _Title["default"]; Typography.Paragraph = _Paragraph["default"]; var _default = Typography; exports["default"] = _default; },{"./Link":438,"./Paragraph":439,"./Text":440,"./Title":441,"./Typography":442,"@babel/runtime/helpers/interopRequireDefault":192}],444:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _reactDom = require("react-dom"); var React = _interopRequireWildcard(require("react")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); // We only handle element & text node. var ELEMENT_NODE = 1; var TEXT_NODE = 3; var COMMENT_NODE = 8; var ellipsisContainer; var wrapperStyle = { padding: 0, margin: 0, display: 'inline', lineHeight: 'inherit' }; function pxToNumber(value) { if (!value) return 0; var match = value.match(/^\d*(\.\d*)?/); return match ? Number(match[0]) : 0; } function styleToString(style) { // There are some different behavior between Firefox & Chrome. // We have to handle this ourself. var styleNames = Array.prototype.slice.apply(style); return styleNames.map(function (name) { return "".concat(name, ": ").concat(style.getPropertyValue(name), ";"); }).join(''); } function mergeChildren(children) { var childList = []; children.forEach(function (child) { var prevChild = childList[childList.length - 1]; if (typeof child === 'string' && typeof prevChild === 'string') { childList[childList.length - 1] += child; } else { childList.push(child); } }); return childList; } var _default = function _default(originEle, option, content, fixedContent, ellipsisStr) { if (!ellipsisContainer) { ellipsisContainer = document.createElement('div'); ellipsisContainer.setAttribute('aria-hidden', 'true'); document.body.appendChild(ellipsisContainer); } var rows = option.rows, _option$suffix = option.suffix, suffix = _option$suffix === void 0 ? '' : _option$suffix; // Get origin style var originStyle = window.getComputedStyle(originEle); var originCSS = styleToString(originStyle); var lineHeight = pxToNumber(originStyle.lineHeight); var maxHeight = Math.round(lineHeight * (rows + 1) + pxToNumber(originStyle.paddingTop) + pxToNumber(originStyle.paddingBottom)); // Set shadow ellipsisContainer.setAttribute('style', originCSS); ellipsisContainer.style.position = 'fixed'; ellipsisContainer.style.left = '0'; ellipsisContainer.style.height = 'auto'; ellipsisContainer.style.minHeight = 'auto'; ellipsisContainer.style.maxHeight = 'auto'; ellipsisContainer.style.top = '-999999px'; ellipsisContainer.style.zIndex = '-1000'; // clean up css overflow ellipsisContainer.style.textOverflow = 'clip'; ellipsisContainer.style.whiteSpace = 'normal'; ellipsisContainer.style.webkitLineClamp = 'none'; // Render in the fake container var contentList = mergeChildren((0, _toArray["default"])(content)); (0, _reactDom.render)( /*#__PURE__*/React.createElement("div", { style: wrapperStyle }, /*#__PURE__*/React.createElement("span", { style: wrapperStyle }, contentList, suffix), /*#__PURE__*/React.createElement("span", { style: wrapperStyle }, fixedContent)), ellipsisContainer); // wrap in an div for old version react // Check if ellipsis in measure div is height enough for content function inRange() { return ellipsisContainer.offsetHeight < maxHeight; } // Skip ellipsis if already match if (inRange()) { (0, _reactDom.unmountComponentAtNode)(ellipsisContainer); return { content: content, text: ellipsisContainer.innerHTML, ellipsis: false }; } // We should clone the childNode since they're controlled by React and we can't reuse it without warning var childNodes = Array.prototype.slice.apply(ellipsisContainer.childNodes[0].childNodes[0].cloneNode(true).childNodes).filter(function (_ref) { var nodeType = _ref.nodeType; return nodeType !== COMMENT_NODE; }); var fixedNodes = Array.prototype.slice.apply(ellipsisContainer.childNodes[0].childNodes[1].cloneNode(true).childNodes); (0, _reactDom.unmountComponentAtNode)(ellipsisContainer); // ========================= Find match ellipsis content ========================= var ellipsisChildren = []; ellipsisContainer.innerHTML = ''; // Create origin content holder var ellipsisContentHolder = document.createElement('span'); ellipsisContainer.appendChild(ellipsisContentHolder); var ellipsisTextNode = document.createTextNode(ellipsisStr + suffix); ellipsisContentHolder.appendChild(ellipsisTextNode); fixedNodes.forEach(function (childNode) { ellipsisContainer.appendChild(childNode); }); // Append before fixed nodes function appendChildNode(node) { ellipsisContentHolder.insertBefore(node, ellipsisTextNode); } // Get maximum text function measureText(textNode, fullText) { var startLoc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var endLoc = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : fullText.length; var lastSuccessLoc = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; var midLoc = Math.floor((startLoc + endLoc) / 2); var currentText = fullText.slice(0, midLoc); textNode.textContent = currentText; if (startLoc >= endLoc - 1) { // Loop when step is small for (var step = endLoc; step >= startLoc; step -= 1) { var currentStepText = fullText.slice(0, step); textNode.textContent = currentStepText; if (inRange() || !currentStepText) { return step === fullText.length ? { finished: false, reactNode: fullText } : { finished: true, reactNode: currentStepText }; } } } if (inRange()) { return measureText(textNode, fullText, midLoc, endLoc, midLoc); } return measureText(textNode, fullText, startLoc, midLoc, lastSuccessLoc); } function measureNode(childNode, index) { var type = childNode.nodeType; if (type === ELEMENT_NODE) { // We don't split element, it will keep if whole element can be displayed. appendChildNode(childNode); if (inRange()) { return { finished: false, reactNode: contentList[index] }; } // Clean up if can not pull in ellipsisContentHolder.removeChild(childNode); return { finished: true, reactNode: null }; } if (type === TEXT_NODE) { var fullText = childNode.textContent || ''; var textNode = document.createTextNode(fullText); appendChildNode(textNode); return measureText(textNode, fullText); } // Not handle other type of content // PS: This code should not be attached after react 16 /* istanbul ignore next */ return { finished: false, reactNode: null }; } childNodes.some(function (childNode, index) { var _measureNode = measureNode(childNode, index), finished = _measureNode.finished, reactNode = _measureNode.reactNode; if (reactNode) { ellipsisChildren.push(reactNode); } return finished; }); return { content: ellipsisChildren, text: ellipsisContainer.innerHTML, ellipsis: true }; }; exports["default"] = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-util/lib/Children/toArray":858,"react":"react","react-dom":"react-dom"}],445:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _Upload = _interopRequireDefault(require("./Upload")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var InternalDragger = function InternalDragger(_a, ref) { var style = _a.style, height = _a.height, restProps = __rest(_a, ["style", "height"]); return /*#__PURE__*/React.createElement(_Upload["default"], (0, _extends2["default"])({ ref: ref }, restProps, { type: "drag", style: (0, _extends2["default"])((0, _extends2["default"])({}, style), { height: height }) })); }; var Dragger = /*#__PURE__*/React.forwardRef(InternalDragger); Dragger.displayName = 'Dragger'; var _default = Dragger; exports["default"] = _default; },{"./Upload":446,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],446:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _rcUpload = _interopRequireDefault(require("rc-upload")); var _classnames = _interopRequireDefault(require("classnames")); var _Dragger = _interopRequireDefault(require("./Dragger")); var _UploadList = _interopRequireDefault(require("./UploadList")); var _utils = require("./utils"); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _default2 = _interopRequireDefault(require("../locale/default")); var _configProvider = require("../config-provider"); var _devWarning = _interopRequireDefault(require("../_util/devWarning")); var _useForceUpdate = _interopRequireDefault(require("../_util/hooks/useForceUpdate")); var _useFreshState3 = _interopRequireDefault(require("./useFreshState")); var InternalUpload = function InternalUpload(props, ref) { var _classNames2; var fileListProp = props.fileList, defaultFileList = props.defaultFileList, onRemove = props.onRemove, showUploadList = props.showUploadList, listType = props.listType, onPreview = props.onPreview, onDownload = props.onDownload, previewFile = props.previewFile, disabled = props.disabled, propLocale = props.locale, iconRender = props.iconRender, isImageUrl = props.isImageUrl, progress = props.progress, customizePrefixCls = props.prefixCls, className = props.className, type = props.type, children = props.children, style = props.style; var _React$useState = React.useState('drop'), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), dragState = _React$useState2[0], setDragState = _React$useState2[1]; var forceUpdate = (0, _useForceUpdate["default"])(); // Refresh always use fresh data var _useFreshState = (0, _useFreshState3["default"])(fileListProp || defaultFileList || [], fileListProp), _useFreshState2 = (0, _slicedToArray2["default"])(_useFreshState, 2), getFileList = _useFreshState2[0], setFileList = _useFreshState2[1]; var upload = React.useRef(); React.useEffect(function () { (0, _devWarning["default"])('fileList' in props || !('value' in props), 'Upload', '`value` is not a valid prop, do you mean `fileList`?'); }, []); var onChange = function onChange(info) { setFileList(info.fileList); var onChangeProp = props.onChange; if (onChangeProp) { onChangeProp((0, _extends2["default"])((0, _extends2["default"])({}, info), { fileList: (0, _toConsumableArray2["default"])(info.fileList) })); } }; var onStart = function onStart(file) { var targetItem = (0, _utils.fileToObject)(file); targetItem.status = 'uploading'; var nextFileList = getFileList().concat(); var fileIndex = nextFileList.findIndex(function (_ref) { var uid = _ref.uid; return uid === targetItem.uid; }); if (fileIndex === -1) { nextFileList.push(targetItem); } else { nextFileList[fileIndex] = targetItem; } onChange({ file: targetItem, fileList: nextFileList }); }; var onSuccess = function onSuccess(response, file, xhr) { try { if (typeof response === 'string') { response = JSON.parse(response); } } catch (e) { /* do nothing */ } var targetItem = (0, _utils.getFileItem)(file, getFileList()); // removed if (!targetItem) { return; } targetItem.status = 'done'; targetItem.response = response; targetItem.xhr = xhr; onChange({ file: (0, _extends2["default"])({}, targetItem), fileList: getFileList().concat() }); }; var onProgress = function onProgress(e, file) { var targetItem = (0, _utils.getFileItem)(file, getFileList()); // removed if (!targetItem) { return; } targetItem.percent = e.percent; onChange({ event: e, file: (0, _extends2["default"])({}, targetItem), fileList: getFileList().concat() }); }; var onError = function onError(error, response, file) { var targetItem = (0, _utils.getFileItem)(file, getFileList()); // removed if (!targetItem) { return; } targetItem.error = error; targetItem.response = response; targetItem.status = 'error'; onChange({ file: (0, _extends2["default"])({}, targetItem), fileList: getFileList().concat() }); }; var handleRemove = function handleRemove(file) { Promise.resolve(typeof onRemove === 'function' ? onRemove(file) : onRemove).then(function (ret) { // Prevent removing file if (ret === false) { return; } var removedFileList = (0, _utils.removeFileItem)(file, getFileList()); if (removedFileList) { file.status = 'removed'; if (upload.current) { upload.current.abort(file); } onChange({ file: file, fileList: removedFileList }); } }); }; var onFileDrop = function onFileDrop(e) { setDragState(e.type); }; var beforeUpload = function beforeUpload(file, fileListArgs) { var beforeUploadProp = props.beforeUpload; if (!beforeUploadProp) { return true; } var result = beforeUploadProp(file, fileListArgs); if (result === false) { // Get unique file list var uniqueList = []; getFileList().concat(fileListArgs.map(_utils.fileToObject)).forEach(function (f) { if (uniqueList.every(function (uf) { return uf.uid !== f.uid; })) { uniqueList.push(f); } }); onChange({ file: file, fileList: uniqueList }); return false; } if (result && result.then) { return result; } return true; }; // Test needs React.useImperativeHandle(ref, function () { return { onStart: onStart, onSuccess: onSuccess, onProgress: onProgress, onError: onError, fileList: getFileList(), upload: upload.current, forceUpdate: forceUpdate }; }); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var prefixCls = getPrefixCls('upload', customizePrefixCls); var rcUploadProps = (0, _extends2["default"])((0, _extends2["default"])({ onStart: onStart, onError: onError, onProgress: onProgress, onSuccess: onSuccess }, props), { prefixCls: prefixCls, beforeUpload: beforeUpload }); delete rcUploadProps.className; delete rcUploadProps.style; // Remove id to avoid open by label when trigger is hidden // !children: https://github.com/ant-design/ant-design/issues/14298 // disabled: https://github.com/ant-design/ant-design/issues/16478 // https://github.com/ant-design/ant-design/issues/24197 if (!children || disabled) { delete rcUploadProps.id; } var renderUploadList = function renderUploadList(button) { return showUploadList ? /*#__PURE__*/React.createElement(_LocaleReceiver["default"], { componentName: "Upload", defaultLocale: _default2["default"].Upload }, function (locale) { var _ref2 = typeof showUploadList === 'boolean' ? {} : showUploadList, showRemoveIcon = _ref2.showRemoveIcon, showPreviewIcon = _ref2.showPreviewIcon, showDownloadIcon = _ref2.showDownloadIcon, removeIcon = _ref2.removeIcon, downloadIcon = _ref2.downloadIcon; return /*#__PURE__*/React.createElement(_UploadList["default"], { listType: listType, items: getFileList(true), previewFile: previewFile, onPreview: onPreview, onDownload: onDownload, onRemove: handleRemove, showRemoveIcon: !disabled && showRemoveIcon, showPreviewIcon: showPreviewIcon, showDownloadIcon: showDownloadIcon, removeIcon: removeIcon, downloadIcon: downloadIcon, iconRender: iconRender, locale: (0, _extends2["default"])((0, _extends2["default"])({}, locale), propLocale), isImageUrl: isImageUrl, progress: progress, appendAction: button }); }) : button; }; if (type === 'drag') { var _classNames; var dragCls = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-drag"), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-drag-uploading"), getFileList().some(function (file) { return file.status === 'uploading'; })), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-drag-hover"), dragState === 'dragover'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className); return /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("div", { className: dragCls, onDrop: onFileDrop, onDragOver: onFileDrop, onDragLeave: onFileDrop, style: style }, /*#__PURE__*/React.createElement(_rcUpload["default"], (0, _extends2["default"])({}, rcUploadProps, { ref: upload, className: "".concat(prefixCls, "-btn") }), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-drag-container") }, children))), renderUploadList()); } var uploadButtonCls = (0, _classnames["default"])(prefixCls, (_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-select"), true), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-select-").concat(listType), true), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames2)); var uploadButton = /*#__PURE__*/React.createElement("div", { className: uploadButtonCls, style: children ? undefined : { display: 'none' } }, /*#__PURE__*/React.createElement(_rcUpload["default"], (0, _extends2["default"])({}, rcUploadProps, { ref: upload }))); if (listType === 'picture-card') { return /*#__PURE__*/React.createElement("span", { className: (0, _classnames["default"])("".concat(prefixCls, "-picture-card-wrapper"), className) }, renderUploadList(uploadButton)); } return /*#__PURE__*/React.createElement("span", { className: className }, uploadButton, renderUploadList()); }; var Upload = /*#__PURE__*/React.forwardRef(InternalUpload); Upload.Dragger = _Dragger["default"]; Upload.displayName = 'Upload'; Upload.defaultProps = { type: 'select', multiple: false, action: '', data: {}, accept: '', beforeUpload: _utils.T, showUploadList: true, listType: 'text', className: '', disabled: false, supportServerRender: true }; var _default = Upload; exports["default"] = _default; },{"../_util/devWarning":212,"../_util/hooks/useForceUpdate":217,"../config-provider":278,"../locale-provider/LocaleReceiver":331,"../locale/default":335,"./Dragger":445,"./UploadList":447,"./useFreshState":449,"./utils":450,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"rc-upload":854,"react":"react"}],447:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _rcAnimate = _interopRequireDefault(require("rc-animate")); var _classnames = _interopRequireDefault(require("classnames")); var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons/LoadingOutlined")); var _PaperClipOutlined = _interopRequireDefault(require("@ant-design/icons/PaperClipOutlined")); var _PictureTwoTone = _interopRequireDefault(require("@ant-design/icons/PictureTwoTone")); var _FileTwoTone = _interopRequireDefault(require("@ant-design/icons/FileTwoTone")); var _EyeOutlined = _interopRequireDefault(require("@ant-design/icons/EyeOutlined")); var _DeleteOutlined = _interopRequireDefault(require("@ant-design/icons/DeleteOutlined")); var _DownloadOutlined = _interopRequireDefault(require("@ant-design/icons/DownloadOutlined")); var _reactNode = require("../_util/reactNode"); var _utils = require("./utils"); var _tooltip = _interopRequireDefault(require("../tooltip")); var _progress = _interopRequireDefault(require("../progress")); var _configProvider = require("../config-provider"); var _button = _interopRequireDefault(require("../button")); var _useForceUpdate = _interopRequireDefault(require("../_util/hooks/useForceUpdate")); var InternalUploadList = function InternalUploadList(_ref, ref) { var _classNames6; var listType = _ref.listType, previewFile = _ref.previewFile, onPreview = _ref.onPreview, onDownload = _ref.onDownload, onRemove = _ref.onRemove, locale = _ref.locale, iconRender = _ref.iconRender, isImgUrl = _ref.isImageUrl, customizePrefixCls = _ref.prefixCls, _ref$items = _ref.items, items = _ref$items === void 0 ? [] : _ref$items, showPreviewIcon = _ref.showPreviewIcon, showRemoveIcon = _ref.showRemoveIcon, showDownloadIcon = _ref.showDownloadIcon, customRemoveIcon = _ref.removeIcon, customDownloadIcon = _ref.downloadIcon, progressProps = _ref.progress, appendAction = _ref.appendAction; var forceUpdate = (0, _useForceUpdate["default"])(); React.useEffect(function () { if (listType !== 'picture' && listType !== 'picture-card') { return; } (items || []).forEach(function (file) { if (typeof document === 'undefined' || typeof window === 'undefined' || !window.FileReader || !window.File || !(file.originFileObj instanceof File || file.originFileObj instanceof Blob) || file.thumbUrl !== undefined) { return; } file.thumbUrl = ''; if (previewFile) { previewFile(file.originFileObj).then(function (previewDataUrl) { // Need append '' to avoid dead loop file.thumbUrl = previewDataUrl || ''; forceUpdate(); }); } }); }, [listType, items, previewFile]); var handlePreview = function handlePreview(file, e) { if (!onPreview) { return; } e.preventDefault(); return onPreview(file); }; var handleDownload = function handleDownload(file) { if (typeof onDownload === 'function') { onDownload(file); } else if (file.url) { window.open(file.url); } }; var handleClose = function handleClose(file) { if (onRemove) { onRemove(file); } }; var handleIconRender = function handleIconRender(file) { if (iconRender) { return iconRender(file, listType); } var isLoading = file.status === 'uploading'; var fileIcon = isImgUrl && isImgUrl(file) ? /*#__PURE__*/React.createElement(_PictureTwoTone["default"], null) : /*#__PURE__*/React.createElement(_FileTwoTone["default"], null); var icon = isLoading ? /*#__PURE__*/React.createElement(_LoadingOutlined["default"], null) : /*#__PURE__*/React.createElement(_PaperClipOutlined["default"], null); if (listType === 'picture') { icon = isLoading ? /*#__PURE__*/React.createElement(_LoadingOutlined["default"], null) : fileIcon; } else if (listType === 'picture-card') { icon = isLoading ? locale.uploading : fileIcon; } return icon; }; var handleActionIconRender = function handleActionIconRender(customIcon, callback, prefixCls, title) { var btnProps = { type: 'text', size: 'small', title: title, onClick: function onClick(e) { callback(); if ((0, _reactNode.isValidElement)(customIcon) && customIcon.props.onClick) { customIcon.props.onClick(e); } }, className: "".concat(prefixCls, "-list-item-card-actions-btn") }; if ((0, _reactNode.isValidElement)(customIcon)) { var btnIcon = (0, _reactNode.cloneElement)(customIcon, (0, _extends2["default"])((0, _extends2["default"])({}, customIcon.props), { onClick: function onClick() {} })); return /*#__PURE__*/React.createElement(_button["default"], (0, _extends2["default"])({}, btnProps, { icon: btnIcon })); } return /*#__PURE__*/React.createElement(_button["default"], btnProps, /*#__PURE__*/React.createElement("span", null, customIcon)); }; // Test needs React.useImperativeHandle(ref, function () { return { handlePreview: handlePreview, handleDownload: handleDownload }; }); var _React$useContext = React.useContext(_configProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction; var prefixCls = getPrefixCls('upload', customizePrefixCls); var list = items.map(function (file) { var _classNames3, _classNames4; var progress; var iconNode = handleIconRender(file); var icon = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-text-icon") }, iconNode); if (listType === 'picture' || listType === 'picture-card') { if (file.status === 'uploading' || !file.thumbUrl && !file.url) { var _classNames; var uploadingClassName = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-list-item-thumbnail"), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-list-item-file"), file.status !== 'uploading'), _classNames)); icon = /*#__PURE__*/React.createElement("div", { className: uploadingClassName }, iconNode); } else { var _classNames2; var thumbnail = isImgUrl && isImgUrl(file) ? /*#__PURE__*/React.createElement("img", { src: file.thumbUrl || file.url, alt: file.name, className: "".concat(prefixCls, "-list-item-image") }) : iconNode; var aClassName = (0, _classnames["default"])((_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-list-item-thumbnail"), true), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-list-item-file"), isImgUrl && !isImgUrl(file)), _classNames2)); icon = /*#__PURE__*/React.createElement("a", { className: aClassName, onClick: function onClick(e) { return handlePreview(file, e); }, href: file.url || file.thumbUrl, target: "_blank", rel: "noopener noreferrer" }, thumbnail); } } if (file.status === 'uploading') { // show loading icon if upload progress listener is disabled var loadingProgress = 'percent' in file ? /*#__PURE__*/React.createElement(_progress["default"], (0, _extends2["default"])({}, progressProps, { type: "line", percent: file.percent })) : null; progress = /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-list-item-progress"), key: "progress" }, loadingProgress); } var infoUploadingClass = (0, _classnames["default"])((_classNames3 = {}, (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-list-item"), true), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-list-item-").concat(file.status), true), (0, _defineProperty2["default"])(_classNames3, "".concat(prefixCls, "-list-item-list-type-").concat(listType), true), _classNames3)); var linkProps = typeof file.linkProps === 'string' ? JSON.parse(file.linkProps) : file.linkProps; var removeIcon = showRemoveIcon ? handleActionIconRender(customRemoveIcon || /*#__PURE__*/React.createElement(_DeleteOutlined["default"], null), function () { return handleClose(file); }, prefixCls, locale.removeFile) : null; var downloadIcon = showDownloadIcon && file.status === 'done' ? handleActionIconRender(customDownloadIcon || /*#__PURE__*/React.createElement(_DownloadOutlined["default"], null), function () { return handleDownload(file); }, prefixCls, locale.downloadFile) : null; var downloadOrDelete = listType !== 'picture-card' && /*#__PURE__*/React.createElement("span", { key: "download-delete", className: "".concat(prefixCls, "-list-item-card-actions ").concat(listType === 'picture' ? 'picture' : '') }, downloadIcon, removeIcon); var listItemNameClass = (0, _classnames["default"])((_classNames4 = {}, (0, _defineProperty2["default"])(_classNames4, "".concat(prefixCls, "-list-item-name"), true), (0, _defineProperty2["default"])(_classNames4, "".concat(prefixCls, "-list-item-name-icon-count-").concat([downloadIcon, removeIcon].filter(function (x) { return x; }).length), true), _classNames4)); var preview = file.url ? [/*#__PURE__*/React.createElement("a", (0, _extends2["default"])({ key: "view", target: "_blank", rel: "noopener noreferrer", className: listItemNameClass, title: file.name }, linkProps, { href: file.url, onClick: function onClick(e) { return handlePreview(file, e); } }), file.name), downloadOrDelete] : [/*#__PURE__*/React.createElement("span", { key: "view", className: listItemNameClass, onClick: function onClick(e) { return handlePreview(file, e); }, title: file.name }, file.name), downloadOrDelete]; var style = { pointerEvents: 'none', opacity: 0.5 }; var previewIcon = showPreviewIcon ? /*#__PURE__*/React.createElement("a", { href: file.url || file.thumbUrl, target: "_blank", rel: "noopener noreferrer", style: file.url || file.thumbUrl ? undefined : style, onClick: function onClick(e) { return handlePreview(file, e); }, title: locale.previewFile }, /*#__PURE__*/React.createElement(_EyeOutlined["default"], null)) : null; var actions = listType === 'picture-card' && file.status !== 'uploading' && /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-list-item-actions") }, previewIcon, file.status === 'done' && downloadIcon, removeIcon); var message; if (file.response && typeof file.response === 'string') { message = file.response; } else { message = file.error && file.error.statusText || locale.uploadError; } var iconAndPreview = /*#__PURE__*/React.createElement("span", null, icon, preview); var dom = /*#__PURE__*/React.createElement("div", { className: infoUploadingClass }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-list-item-info") }, iconAndPreview), actions, /*#__PURE__*/React.createElement(_rcAnimate["default"], { transitionName: "fade", component: "" }, progress)); var listContainerNameClass = (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(prefixCls, "-list-picture-card-container"), listType === 'picture-card')); return /*#__PURE__*/React.createElement("div", { key: file.uid, className: listContainerNameClass }, file.status === 'error' ? /*#__PURE__*/React.createElement(_tooltip["default"], { title: message, getPopupContainer: function getPopupContainer(node) { return node.parentNode; } }, dom) : /*#__PURE__*/React.createElement("span", null, dom)); }); var listClassNames = (0, _classnames["default"])((_classNames6 = {}, (0, _defineProperty2["default"])(_classNames6, "".concat(prefixCls, "-list"), true), (0, _defineProperty2["default"])(_classNames6, "".concat(prefixCls, "-list-").concat(listType), true), (0, _defineProperty2["default"])(_classNames6, "".concat(prefixCls, "-list-rtl"), direction === 'rtl'), _classNames6)); var animationDirection = listType === 'picture-card' ? 'animate-inline' : 'animate'; var transitionName = list.length === 0 ? '' : "".concat(prefixCls, "-").concat(animationDirection); return /*#__PURE__*/React.createElement(_rcAnimate["default"], { transitionName: transitionName, component: "div", className: listClassNames }, list, /*#__PURE__*/React.isValidElement(appendAction) ? /*#__PURE__*/React.cloneElement(appendAction, { key: 'appendAction' }) : appendAction); }; var UploadList = /*#__PURE__*/React.forwardRef(InternalUploadList); UploadList.displayName = 'UploadList'; UploadList.defaultProps = { listType: 'text', progress: { strokeWidth: 2, showInfo: false }, showRemoveIcon: true, showDownloadIcon: false, showPreviewIcon: true, previewFile: _utils.previewImage, isImageUrl: _utils.isImageUrl }; var _default = UploadList; exports["default"] = _default; },{"../_util/hooks/useForceUpdate":217,"../_util/reactNode":223,"../button":257,"../config-provider":278,"../progress":363,"../tooltip":422,"./utils":450,"@ant-design/icons/DeleteOutlined":73,"@ant-design/icons/DownloadOutlined":77,"@ant-design/icons/EyeOutlined":84,"@ant-design/icons/FileTwoTone":86,"@ant-design/icons/LoadingOutlined":93,"@ant-design/icons/PaperClipOutlined":95,"@ant-design/icons/PictureTwoTone":96,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-animate":586,"react":"react"}],448:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _Upload = _interopRequireDefault(require("./Upload")); var _Dragger = _interopRequireDefault(require("./Dragger")); _Upload["default"].Dragger = _Dragger["default"]; var _default = _Upload["default"]; exports["default"] = _default; },{"./Dragger":445,"./Upload":446,"@babel/runtime/helpers/interopRequireDefault":192}],449:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useFreshState; var _react = require("react"); var _raf = _interopRequireDefault(require("rc-util/lib/raf")); var _useForceUpdate = _interopRequireDefault(require("../_util/hooks/useForceUpdate")); // Note. Only for upload usage. Do not export to global util hooks function useFreshState(defaultValue, propValue) { var valueRef = (0, _react.useRef)(defaultValue); var forceUpdate = (0, _useForceUpdate["default"])(); var rafRef = (0, _react.useRef)(); // Set value function setValue(newValue) { valueRef.current = newValue; forceUpdate(); } function cleanUp() { _raf["default"].cancel(rafRef.current); } function rafSyncValue(newValue) { cleanUp(); rafRef.current = (0, _raf["default"])(function () { setValue(newValue); }); } // Get value function getValue() { var displayValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (displayValue) { return propValue || valueRef.current; } return valueRef.current; } // Effect will always update in a next frame to avoid sync state overwrite current processing state (0, _react.useEffect)(function () { if (propValue) { rafSyncValue(propValue); } }, [propValue]); // Clean up (0, _react.useEffect)(function () { return function () { cleanUp(); }; }, []); return [getValue, setValue]; } },{"../_util/hooks/useForceUpdate":217,"@babel/runtime/helpers/interopRequireDefault":192,"rc-util/lib/raf":873,"react":"react"}],450:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.T = T; exports.fileToObject = fileToObject; exports.getFileItem = getFileItem; exports.removeFileItem = removeFileItem; exports.previewImage = previewImage; exports.isImageUrl = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); function T() { return true; } // Fix IE file.status problem // via coping a new Object function fileToObject(file) { return (0, _extends2["default"])((0, _extends2["default"])({}, file), { lastModified: file.lastModified, lastModifiedDate: file.lastModifiedDate, name: file.name, size: file.size, type: file.type, uid: file.uid, percent: 0, originFileObj: file }); } function getFileItem(file, fileList) { var matchKey = file.uid !== undefined ? 'uid' : 'name'; return fileList.filter(function (item) { return item[matchKey] === file[matchKey]; })[0]; } function removeFileItem(file, fileList) { var matchKey = file.uid !== undefined ? 'uid' : 'name'; var removed = fileList.filter(function (item) { return item[matchKey] !== file[matchKey]; }); if (removed.length === fileList.length) { return null; } return removed; } // ==================== Default Image Preview ==================== var extname = function extname() { var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var temp = url.split('/'); var filename = temp[temp.length - 1]; var filenameWithoutSuffix = filename.split(/#|\?/)[0]; return (/\.[^./\\]*$/.exec(filenameWithoutSuffix) || [''])[0]; }; var isImageFileType = function isImageFileType(type) { return type.indexOf('image/') === 0; }; var isImageUrl = function isImageUrl(file) { if (file.type && !file.thumbUrl) { return isImageFileType(file.type); } var url = file.thumbUrl || file.url; var extension = extname(url); if (/^data:image\//.test(url) || /(webp|svg|png|gif|jpg|jpeg|jfif|bmp|dpg|ico)$/i.test(extension)) { return true; } if (/^data:/.test(url)) { // other file types of base64 return false; } if (extension) { // other file types which have extension return false; } return true; }; exports.isImageUrl = isImageUrl; var MEASURE_SIZE = 200; function previewImage(file) { return new Promise(function (resolve) { if (!file.type || !isImageFileType(file.type)) { resolve(''); return; } var canvas = document.createElement('canvas'); canvas.width = MEASURE_SIZE; canvas.height = MEASURE_SIZE; canvas.style.cssText = "position: fixed; left: 0; top: 0; width: ".concat(MEASURE_SIZE, "px; height: ").concat(MEASURE_SIZE, "px; z-index: 9999; display: none;"); document.body.appendChild(canvas); var ctx = canvas.getContext('2d'); var img = new Image(); img.onload = function () { var width = img.width, height = img.height; var drawWidth = MEASURE_SIZE; var drawHeight = MEASURE_SIZE; var offsetX = 0; var offsetY = 0; if (width < height) { drawHeight = height * (MEASURE_SIZE / width); offsetY = -(drawHeight - drawWidth) / 2; } else { drawWidth = width * (MEASURE_SIZE / height); offsetX = -(drawWidth - drawHeight) / 2; } ctx.drawImage(img, offsetX, offsetY, drawWidth, drawHeight); var dataURL = canvas.toDataURL(); document.body.removeChild(canvas); resolve(dataURL); }; img.src = window.URL.createObjectURL(file); }); } },{"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192}],451:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _version = _interopRequireDefault(require("./version")); /* eslint import/no-unresolved: 0 */ // @ts-ignore var _default = _version["default"]; exports["default"] = _default; },{"./version":452,"@babel/runtime/helpers/interopRequireDefault":192}],452:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _default = '4.6.6'; exports["default"] = _default; },{}],453:[function(require,module,exports){ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.arrayTreeFilter = factory()); }(this, (function () { 'use strict'; function arrayTreeFilter(data, filterFn, options) { options = options || {}; options.childrenKeyName = options.childrenKeyName || "children"; var children = data || []; var result = []; var level = 0; do { var foundItem = children.filter(function (item) { return filterFn(item, level); })[0]; if (!foundItem) { break; } result.push(foundItem); children = foundItem[options.childrenKeyName] || []; level += 1; } while (children.length > 0); return result; } return arrayTreeFilter; }))); },{}],454:[function(require,module,exports){ (function (process){ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } /* eslint no-console:0 */ var formatRegExp = /%[sdj%]/g; var warning = function warning() {}; // don't print warning message when in production env or node runtime if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' && typeof document !== 'undefined') { warning = function warning(type, errors) { if (typeof console !== 'undefined' && console.warn) { if (errors.every(function (e) { return typeof e === 'string'; })) { console.warn(type, errors); } } }; } function convertFieldsError(errors) { if (!errors || !errors.length) return null; var fields = {}; errors.forEach(function (error) { var field = error.field; fields[field] = fields[field] || []; fields[field].push(error); }); return fields; } function format() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var i = 1; var f = args[0]; var len = args.length; if (typeof f === 'function') { return f.apply(null, args.slice(1)); } if (typeof f === 'string') { var str = String(f).replace(formatRegExp, function (x) { if (x === '%%') { return '%'; } if (i >= len) { return x; } switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } break; default: return x; } }); return str; } return f; } function isNativeStringType(type) { return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'date' || type === 'pattern'; } function isEmptyValue(value, type) { if (value === undefined || value === null) { return true; } if (type === 'array' && Array.isArray(value) && !value.length) { return true; } if (isNativeStringType(type) && typeof value === 'string' && !value) { return true; } return false; } function asyncParallelArray(arr, func, callback) { var results = []; var total = 0; var arrLength = arr.length; function count(errors) { results.push.apply(results, errors); total++; if (total === arrLength) { callback(results); } } arr.forEach(function (a) { func(a, count); }); } function asyncSerialArray(arr, func, callback) { var index = 0; var arrLength = arr.length; function next(errors) { if (errors && errors.length) { callback(errors); return; } var original = index; index = index + 1; if (original < arrLength) { func(arr[original], next); } else { callback([]); } } next([]); } function flattenObjArr(objArr) { var ret = []; Object.keys(objArr).forEach(function (k) { ret.push.apply(ret, objArr[k]); }); return ret; } var AsyncValidationError = /*#__PURE__*/function (_Error) { _inheritsLoose(AsyncValidationError, _Error); function AsyncValidationError(errors, fields) { var _this; _this = _Error.call(this, 'Async Validation Error') || this; _this.errors = errors; _this.fields = fields; return _this; } return AsyncValidationError; }( /*#__PURE__*/_wrapNativeSuper(Error)); function asyncMap(objArr, option, func, callback) { if (option.first) { var _pending = new Promise(function (resolve, reject) { var next = function next(errors) { callback(errors); return errors.length ? reject(new AsyncValidationError(errors, convertFieldsError(errors))) : resolve(); }; var flattenArr = flattenObjArr(objArr); asyncSerialArray(flattenArr, func, next); }); _pending["catch"](function (e) { return e; }); return _pending; } var firstFields = option.firstFields || []; if (firstFields === true) { firstFields = Object.keys(objArr); } var objArrKeys = Object.keys(objArr); var objArrLength = objArrKeys.length; var total = 0; var results = []; var pending = new Promise(function (resolve, reject) { var next = function next(errors) { results.push.apply(results, errors); total++; if (total === objArrLength) { callback(results); return results.length ? reject(new AsyncValidationError(results, convertFieldsError(results))) : resolve(); } }; if (!objArrKeys.length) { callback(results); resolve(); } objArrKeys.forEach(function (key) { var arr = objArr[key]; if (firstFields.indexOf(key) !== -1) { asyncSerialArray(arr, func, next); } else { asyncParallelArray(arr, func, next); } }); }); pending["catch"](function (e) { return e; }); return pending; } function complementError(rule) { return function (oe) { if (oe && oe.message) { oe.field = oe.field || rule.fullField; return oe; } return { message: typeof oe === 'function' ? oe() : oe, field: oe.field || rule.fullField }; }; } function deepMerge(target, source) { if (source) { for (var s in source) { if (source.hasOwnProperty(s)) { var value = source[s]; if (typeof value === 'object' && typeof target[s] === 'object') { target[s] = _extends(_extends({}, target[s]), value); } else { target[s] = value; } } } } return target; } /** * Rule for validating required fields. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param source The source object being validated. * @param errors An array of errors that this rule may add * validation errors to. * @param options The validation options. * @param options.messages The validation messages. */ function required(rule, value, source, errors, options, type) { if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) { errors.push(format(options.messages.required, rule.fullField)); } } /** * Rule for validating whitespace. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param source The source object being validated. * @param errors An array of errors that this rule may add * validation errors to. * @param options The validation options. * @param options.messages The validation messages. */ function whitespace(rule, value, source, errors, options) { if (/^\s+$/.test(value) || value === '') { errors.push(format(options.messages.whitespace, rule.fullField)); } } /* eslint max-len:0 */ var pattern = { // http://emailregex.com/ email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, url: new RegExp("^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$", 'i'), hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i }; var types = { integer: function integer(value) { return types.number(value) && parseInt(value, 10) === value; }, "float": function float(value) { return types.number(value) && !types.integer(value); }, array: function array(value) { return Array.isArray(value); }, regexp: function regexp(value) { if (value instanceof RegExp) { return true; } try { return !!new RegExp(value); } catch (e) { return false; } }, date: function date(value) { return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear === 'function' && !isNaN(value.getTime()); }, number: function number(value) { if (isNaN(value)) { return false; } return typeof value === 'number'; }, object: function object(value) { return typeof value === 'object' && !types.array(value); }, method: function method(value) { return typeof value === 'function'; }, email: function email(value) { return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255; }, url: function url(value) { return typeof value === 'string' && !!value.match(pattern.url); }, hex: function hex(value) { return typeof value === 'string' && !!value.match(pattern.hex); } }; /** * Rule for validating the type of a value. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param source The source object being validated. * @param errors An array of errors that this rule may add * validation errors to. * @param options The validation options. * @param options.messages The validation messages. */ function type(rule, value, source, errors, options) { if (rule.required && value === undefined) { required(rule, value, source, errors, options); return; } var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex']; var ruleType = rule.type; if (custom.indexOf(ruleType) > -1) { if (!types[ruleType](value)) { errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)); } // straight typeof check } else if (ruleType && typeof value !== rule.type) { errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)); } } /** * Rule for validating minimum and maximum allowed values. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param source The source object being validated. * @param errors An array of errors that this rule may add * validation errors to. * @param options The validation options. * @param options.messages The validation messages. */ function range(rule, value, source, errors, options) { var len = typeof rule.len === 'number'; var min = typeof rule.min === 'number'; var max = typeof rule.max === 'number'; // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane) var spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; var val = value; var key = null; var num = typeof value === 'number'; var str = typeof value === 'string'; var arr = Array.isArray(value); if (num) { key = 'number'; } else if (str) { key = 'string'; } else if (arr) { key = 'array'; } // if the value is not of a supported type for range validation // the validation rule rule should use the // type property to also test for a particular type if (!key) { return false; } if (arr) { val = value.length; } if (str) { // 处理码点大于U+010000的文字length属性不准确的bug,如"𠮷𠮷𠮷".lenght !== 3 val = value.replace(spRegexp, '_').length; } if (len) { if (val !== rule.len) { errors.push(format(options.messages[key].len, rule.fullField, rule.len)); } } else if (min && !max && val < rule.min) { errors.push(format(options.messages[key].min, rule.fullField, rule.min)); } else if (max && !min && val > rule.max) { errors.push(format(options.messages[key].max, rule.fullField, rule.max)); } else if (min && max && (val < rule.min || val > rule.max)) { errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max)); } } var ENUM = 'enum'; /** * Rule for validating a value exists in an enumerable list. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param source The source object being validated. * @param errors An array of errors that this rule may add * validation errors to. * @param options The validation options. * @param options.messages The validation messages. */ function enumerable(rule, value, source, errors, options) { rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : []; if (rule[ENUM].indexOf(value) === -1) { errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', '))); } } /** * Rule for validating a regular expression pattern. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param source The source object being validated. * @param errors An array of errors that this rule may add * validation errors to. * @param options The validation options. * @param options.messages The validation messages. */ function pattern$1(rule, value, source, errors, options) { if (rule.pattern) { if (rule.pattern instanceof RegExp) { // if a RegExp instance is passed, reset `lastIndex` in case its `global` // flag is accidentally set to `true`, which in a validation scenario // is not necessary and the result might be misleading rule.pattern.lastIndex = 0; if (!rule.pattern.test(value)) { errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)); } } else if (typeof rule.pattern === 'string') { var _pattern = new RegExp(rule.pattern); if (!_pattern.test(value)) { errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)); } } } } var rules = { required: required, whitespace: whitespace, type: type, range: range, "enum": enumerable, pattern: pattern$1 }; /** * Performs validation for string types. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function string(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value, 'string') && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options, 'string'); if (!isEmptyValue(value, 'string')) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); rules.pattern(rule, value, source, errors, options); if (rule.whitespace === true) { rules.whitespace(rule, value, source, errors, options); } } } callback(errors); } /** * Validates a function. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function method(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (value !== undefined) { rules.type(rule, value, source, errors, options); } } callback(errors); } /** * Validates a number. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function number(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (value === '') { value = undefined; } if (isEmptyValue(value) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (value !== undefined) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); } } callback(errors); } /** * Validates a boolean. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function _boolean(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (value !== undefined) { rules.type(rule, value, source, errors, options); } } callback(errors); } /** * Validates the regular expression type. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function regexp(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (!isEmptyValue(value)) { rules.type(rule, value, source, errors, options); } } callback(errors); } /** * Validates a number is an integer. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function integer(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (value !== undefined) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); } } callback(errors); } /** * Validates a number is a floating point number. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function floatFn(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (value !== undefined) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); } } callback(errors); } /** * Validates an array. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function array(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value, 'array') && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options, 'array'); if (!isEmptyValue(value, 'array')) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); } } callback(errors); } /** * Validates an object. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function object(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (value !== undefined) { rules.type(rule, value, source, errors, options); } } callback(errors); } var ENUM$1 = 'enum'; /** * Validates an enumerable list. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function enumerable$1(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (value !== undefined) { rules[ENUM$1](rule, value, source, errors, options); } } callback(errors); } /** * Validates a regular expression pattern. * * Performs validation when a rule only contains * a pattern property but is not declared as a string type. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function pattern$2(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value, 'string') && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (!isEmptyValue(value, 'string')) { rules.pattern(rule, value, source, errors, options); } } callback(errors); } function date(rule, value, callback, source, options) { // console.log('integer rule called %j', rule); var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); // console.log('validate on %s value', value); if (validate) { if (isEmptyValue(value, 'date') && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); if (!isEmptyValue(value, 'date')) { var dateObject; if (value instanceof Date) { dateObject = value; } else { dateObject = new Date(value); } rules.type(rule, dateObject, source, errors, options); if (dateObject) { rules.range(rule, dateObject.getTime(), source, errors, options); } } } callback(errors); } function required$1(rule, value, callback, source, options) { var errors = []; var type = Array.isArray(value) ? 'array' : typeof value; rules.required(rule, value, source, errors, options, type); callback(errors); } function type$1(rule, value, callback, source, options) { var ruleType = rule.type; var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value, ruleType) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options, ruleType); if (!isEmptyValue(value, ruleType)) { rules.type(rule, value, source, errors, options); } } callback(errors); } /** * Performs validation for any type. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param callback The callback function. * @param source The source object being validated. * @param options The validation options. * @param options.messages The validation messages. */ function any(rule, value, callback, source, options) { var errors = []; var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); if (validate) { if (isEmptyValue(value) && !rule.required) { return callback(); } rules.required(rule, value, source, errors, options); } callback(errors); } var validators = { string: string, method: method, number: number, "boolean": _boolean, regexp: regexp, integer: integer, "float": floatFn, array: array, object: object, "enum": enumerable$1, pattern: pattern$2, date: date, url: type$1, hex: type$1, email: type$1, required: required$1, any: any }; function newMessages() { return { "default": 'Validation error on field %s', required: '%s is required', "enum": '%s must be one of %s', whitespace: '%s cannot be empty', date: { format: '%s date %s is invalid for format %s', parse: '%s date could not be parsed, %s is invalid ', invalid: '%s date %s is invalid' }, types: { string: '%s is not a %s', method: '%s is not a %s (function)', array: '%s is not an %s', object: '%s is not an %s', number: '%s is not a %s', date: '%s is not a %s', "boolean": '%s is not a %s', integer: '%s is not an %s', "float": '%s is not a %s', regexp: '%s is not a valid %s', email: '%s is not a valid %s', url: '%s is not a valid %s', hex: '%s is not a valid %s' }, string: { len: '%s must be exactly %s characters', min: '%s must be at least %s characters', max: '%s cannot be longer than %s characters', range: '%s must be between %s and %s characters' }, number: { len: '%s must equal %s', min: '%s cannot be less than %s', max: '%s cannot be greater than %s', range: '%s must be between %s and %s' }, array: { len: '%s must be exactly %s in length', min: '%s cannot be less than %s in length', max: '%s cannot be greater than %s in length', range: '%s must be between %s and %s in length' }, pattern: { mismatch: '%s value %s does not match pattern %s' }, clone: function clone() { var cloned = JSON.parse(JSON.stringify(this)); cloned.clone = this.clone; return cloned; } }; } var messages = newMessages(); /** * Encapsulates a validation schema. * * @param descriptor An object declaring validation rules * for this schema. */ function Schema(descriptor) { this.rules = null; this._messages = messages; this.define(descriptor); } Schema.prototype = { messages: function messages(_messages) { if (_messages) { this._messages = deepMerge(newMessages(), _messages); } return this._messages; }, define: function define(rules) { if (!rules) { throw new Error('Cannot configure a schema with no rules'); } if (typeof rules !== 'object' || Array.isArray(rules)) { throw new Error('Rules must be an object'); } this.rules = {}; var z; var item; for (z in rules) { if (rules.hasOwnProperty(z)) { item = rules[z]; this.rules[z] = Array.isArray(item) ? item : [item]; } } }, validate: function validate(source_, o, oc) { var _this = this; if (o === void 0) { o = {}; } if (oc === void 0) { oc = function oc() {}; } var source = source_; var options = o; var callback = oc; if (typeof options === 'function') { callback = options; options = {}; } if (!this.rules || Object.keys(this.rules).length === 0) { if (callback) { callback(); } return Promise.resolve(); } function complete(results) { var i; var errors = []; var fields = {}; function add(e) { if (Array.isArray(e)) { var _errors; errors = (_errors = errors).concat.apply(_errors, e); } else { errors.push(e); } } for (i = 0; i < results.length; i++) { add(results[i]); } if (!errors.length) { errors = null; fields = null; } else { fields = convertFieldsError(errors); } callback(errors, fields); } if (options.messages) { var messages$1 = this.messages(); if (messages$1 === messages) { messages$1 = newMessages(); } deepMerge(messages$1, options.messages); options.messages = messages$1; } else { options.messages = this.messages(); } var arr; var value; var series = {}; var keys = options.keys || Object.keys(this.rules); keys.forEach(function (z) { arr = _this.rules[z]; value = source[z]; arr.forEach(function (r) { var rule = r; if (typeof rule.transform === 'function') { if (source === source_) { source = _extends({}, source); } value = source[z] = rule.transform(value); } if (typeof rule === 'function') { rule = { validator: rule }; } else { rule = _extends({}, rule); } rule.validator = _this.getValidationMethod(rule); rule.field = z; rule.fullField = rule.fullField || z; rule.type = _this.getType(rule); if (!rule.validator) { return; } series[z] = series[z] || []; series[z].push({ rule: rule, value: value, source: source, field: z }); }); }); var errorFields = {}; return asyncMap(series, options, function (data, doIt) { var rule = data.rule; var deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField === 'object'); deep = deep && (rule.required || !rule.required && data.value); rule.field = data.field; function addFullfield(key, schema) { return _extends(_extends({}, schema), {}, { fullField: rule.fullField + "." + key }); } function cb(e) { if (e === void 0) { e = []; } var errors = e; if (!Array.isArray(errors)) { errors = [errors]; } if (!options.suppressWarning && errors.length) { Schema.warning('async-validator:', errors); } if (errors.length && rule.message) { errors = [].concat(rule.message); } errors = errors.map(complementError(rule)); if (options.first && errors.length) { errorFields[rule.field] = 1; return doIt(errors); } if (!deep) { doIt(errors); } else { // if rule is required but the target object // does not exist fail at the rule level and don't // go deeper if (rule.required && !data.value) { if (rule.message) { errors = [].concat(rule.message).map(complementError(rule)); } else if (options.error) { errors = [options.error(rule, format(options.messages.required, rule.field))]; } return doIt(errors); } var fieldsSchema = {}; if (rule.defaultField) { for (var k in data.value) { if (data.value.hasOwnProperty(k)) { fieldsSchema[k] = rule.defaultField; } } } fieldsSchema = _extends(_extends({}, fieldsSchema), data.rule.fields); for (var f in fieldsSchema) { if (fieldsSchema.hasOwnProperty(f)) { var fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]]; fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f)); } } var schema = new Schema(fieldsSchema); schema.messages(options.messages); if (data.rule.options) { data.rule.options.messages = options.messages; data.rule.options.error = options.error; } schema.validate(data.value, data.rule.options || options, function (errs) { var finalErrors = []; if (errors && errors.length) { finalErrors.push.apply(finalErrors, errors); } if (errs && errs.length) { finalErrors.push.apply(finalErrors, errs); } doIt(finalErrors.length ? finalErrors : null); }); } } var res; if (rule.asyncValidator) { res = rule.asyncValidator(rule, data.value, cb, data.source, options); } else if (rule.validator) { res = rule.validator(rule, data.value, cb, data.source, options); if (res === true) { cb(); } else if (res === false) { cb(rule.message || rule.field + " fails"); } else if (res instanceof Array) { cb(res); } else if (res instanceof Error) { cb(res.message); } } if (res && res.then) { res.then(function () { return cb(); }, function (e) { return cb(e); }); } }, function (results) { complete(results); }); }, getType: function getType(rule) { if (rule.type === undefined && rule.pattern instanceof RegExp) { rule.type = 'pattern'; } if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) { throw new Error(format('Unknown rule type %s', rule.type)); } return rule.type || 'string'; }, getValidationMethod: function getValidationMethod(rule) { if (typeof rule.validator === 'function') { return rule.validator; } var keys = Object.keys(rule); var messageIndex = keys.indexOf('message'); if (messageIndex !== -1) { keys.splice(messageIndex, 1); } if (keys.length === 1 && keys[0] === 'required') { return validators.required; } return validators[this.getType(rule)] || false; } }; Schema.register = function register(type, validator) { if (typeof validator !== 'function') { throw new Error('Cannot register a validator by type, validator is not a function'); } validators[type] = validator; }; Schema.warning = warning; Schema.messages = messages; Schema.validators = validators; exports.default = Schema; }).call(this,require('_process')) },{"_process":1}],455:[function(require,module,exports){ /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames */ /* global define */ (function () { 'use strict'; var hasOwn = {}.hasOwnProperty; function classNames () { var classes = []; for (var i = 0; i < arguments.length; i++) { var arg = arguments[i]; if (!arg) continue; var argType = typeof arg; if (argType === 'string' || argType === 'number') { classes.push(arg); } else if (Array.isArray(arg) && arg.length) { var inner = classNames.apply(null, arg); if (inner) { classes.push(inner); } } else if (argType === 'object') { for (var key in arg) { if (hasOwn.call(arg, key) && arg[key]) { classes.push(key); } } } } return classes.join(' '); } if (typeof module !== 'undefined' && module.exports) { classNames.default = classNames; module.exports = classNames; } else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { // register as 'classnames', consistent with npm package name define('classnames', [], function () { return classNames; }); } else { window.classNames = classNames; } }()); },{}],456:[function(require,module,exports){ function t(t){return null!=t&&"object"==typeof t&&1===t.nodeType}function e(t,e){return(!e||"hidden"!==t)&&"visible"!==t&&"clip"!==t}function n(t,n){if(t.clientHeighte||o>t&&l=e&&d>=n?o-t-r:l>e&&dn?l-e+i:0}module.exports=function(e,i){var o=window,l=i.scrollMode,d=i.block,u=i.inline,h=i.boundary,c=i.skipOverflowHiddenElements,a="function"==typeof h?h:function(t){return t!==h};if(!t(e))throw new TypeError("Invalid target");for(var f=document.scrollingElement||document.documentElement,s=[],p=e;t(p)&&a(p);){if((p=p.parentNode)===f){s.push(p);break}p===document.body&&n(p)&&!n(document.documentElement)||n(p,c)&&s.push(p)}for(var m=o.visualViewport?o.visualViewport.width:innerWidth,g=o.visualViewport?o.visualViewport.height:innerHeight,w=window.scrollX||pageXOffset,v=window.scrollY||pageYOffset,W=e.getBoundingClientRect(),b=W.height,H=W.width,y=W.top,M=W.right,E=W.bottom,V=W.left,x="start"===d||"nearest"===d?y:"end"===d?E:y+b/2,I="center"===u?V+H/2:"end"===u?M:V,C=[],T=0;T=0&&V>=0&&E<=g&&M<=m&&y>=R&&E<=Y&&V>=L&&M<=X)return C;var S=getComputedStyle(k),j=parseInt(S.borderLeftWidth,10),N=parseInt(S.borderTopWidth,10),q=parseInt(S.borderRightWidth,10),z=parseInt(S.borderBottomWidth,10),A=0,F=0,G="offsetWidth"in k?k.offsetWidth-k.clientWidth-j-q:0,J="offsetHeight"in k?k.offsetHeight-k.clientHeight-N-z:0;if(f===k)A="start"===d?x:"end"===d?x-g:"nearest"===d?r(v,v+g,g,N,z,v+x,v+x+b,b):x-g/2,F="start"===u?I:"center"===u?I-m/2:"end"===u?I-m:r(w,w+m,m,j,q,w+I,w+I+H,H),A=Math.max(0,A+v),F=Math.max(0,F+w);else{A="start"===d?x-R-N:"end"===d?x-Y+z+J:"nearest"===d?r(R,Y,D,N,z+J,x,x+b,b):x-(R+D/2)+J/2,F="start"===u?I-L-j:"center"===u?I-(L+O/2)+G/2:"end"===u?I-X+q+G:r(L,X,O,j,q+G,I,I+H,H);var K=k.scrollLeft,P=k.scrollTop;x+=P-(A=Math.max(0,Math.min(P+A,k.scrollHeight-D+J))),I+=K-(F=Math.max(0,Math.min(K+F,k.scrollWidth-O+G)))}C.push({el:k,top:A,left:F})}return C}; },{}],457:[function(require,module,exports){ "use strict"; var deselectCurrent = require("toggle-selection"); var clipboardToIE11Formatting = { "text/plain": "Text", "text/html": "Url", "default": "Text" } var defaultMessage = "Copy to clipboard: #{key}, Enter"; function format(message) { var copyKey = (/mac os x/i.test(navigator.userAgent) ? "⌘" : "Ctrl") + "+C"; return message.replace(/#{\s*key\s*}/g, copyKey); } function copy(text, options) { var debug, message, reselectPrevious, range, selection, mark, success = false; if (!options) { options = {}; } debug = options.debug || false; try { reselectPrevious = deselectCurrent(); range = document.createRange(); selection = document.getSelection(); mark = document.createElement("span"); mark.textContent = text; // reset user styles for span element mark.style.all = "unset"; // prevents scrolling to the end of the page mark.style.position = "fixed"; mark.style.top = 0; mark.style.clip = "rect(0, 0, 0, 0)"; // used to preserve spaces and line breaks mark.style.whiteSpace = "pre"; // do not inherit user-select (it may be `none`) mark.style.webkitUserSelect = "text"; mark.style.MozUserSelect = "text"; mark.style.msUserSelect = "text"; mark.style.userSelect = "text"; mark.addEventListener("copy", function(e) { e.stopPropagation(); if (options.format) { e.preventDefault(); if (typeof e.clipboardData === "undefined") { // IE 11 debug && console.warn("unable to use e.clipboardData"); debug && console.warn("trying IE specific stuff"); window.clipboardData.clearData(); var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting["default"] window.clipboardData.setData(format, text); } else { // all other browsers e.clipboardData.clearData(); e.clipboardData.setData(options.format, text); } } if (options.onCopy) { e.preventDefault(); options.onCopy(e.clipboardData); } }); document.body.appendChild(mark); range.selectNodeContents(mark); selection.addRange(range); var successful = document.execCommand("copy"); if (!successful) { throw new Error("copy command was unsuccessful"); } success = true; } catch (err) { debug && console.error("unable to copy using execCommand: ", err); debug && console.warn("trying IE specific stuff"); try { window.clipboardData.setData(options.format || "text", text); options.onCopy && options.onCopy(window.clipboardData); success = true; } catch (err) { debug && console.error("unable to copy using clipboardData: ", err); debug && console.error("falling back to prompt"); message = format("message" in options ? options.message : defaultMessage); window.prompt(message, text); } } finally { if (selection) { if (typeof selection.removeRange == "function") { selection.removeRange(range); } else { selection.removeAllRanges(); } } if (mark) { document.body.removeChild(mark); } reselectPrevious(); } return success; } module.exports = copy; },{"toggle-selection":904}],458:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vendorPrefix; var jsCssMap = { Webkit: '-webkit-', Moz: '-moz-', // IE did it wrong again ... ms: '-ms-', O: '-o-' }; function getVendorPrefix() { if (vendorPrefix !== undefined) { return vendorPrefix; } vendorPrefix = ''; var style = document.createElement('p').style; var testProp = 'Transform'; for (var key in jsCssMap) { if (key + testProp in style) { vendorPrefix = key; } } return vendorPrefix; } function getTransitionName() { return getVendorPrefix() ? "".concat(getVendorPrefix(), "TransitionProperty") : 'transitionProperty'; } function getTransformName() { return getVendorPrefix() ? "".concat(getVendorPrefix(), "Transform") : 'transform'; } function setTransitionProperty(node, value) { var name = getTransitionName(); if (name) { node.style[name] = value; if (name !== 'transitionProperty') { node.style.transitionProperty = value; } } } function setTransform(node, value) { var name = getTransformName(); if (name) { node.style[name] = value; if (name !== 'transform') { node.style.transform = value; } } } function getTransitionProperty(node) { return node.style.transitionProperty || node.style[getTransitionName()]; } function getTransformXY(node) { var style = window.getComputedStyle(node, null); var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName()); if (transform && transform !== 'none') { var matrix = transform.replace(/[^0-9\-.,]/g, '').split(','); return { x: parseFloat(matrix[12] || matrix[4], 0), y: parseFloat(matrix[13] || matrix[5], 0) }; } return { x: 0, y: 0 }; } var matrix2d = /matrix\((.*)\)/; var matrix3d = /matrix3d\((.*)\)/; function setTransformXY(node, xy) { var style = window.getComputedStyle(node, null); var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName()); if (transform && transform !== 'none') { var arr; var match2d = transform.match(matrix2d); if (match2d) { match2d = match2d[1]; arr = match2d.split(',').map(function (item) { return parseFloat(item, 10); }); arr[4] = xy.x; arr[5] = xy.y; setTransform(node, "matrix(".concat(arr.join(','), ")")); } else { var match3d = transform.match(matrix3d)[1]; arr = match3d.split(',').map(function (item) { return parseFloat(item, 10); }); arr[12] = xy.x; arr[13] = xy.y; setTransform(node, "matrix3d(".concat(arr.join(','), ")")); } } else { setTransform(node, "translateX(".concat(xy.x, "px) translateY(").concat(xy.y, "px) translateZ(0)")); } } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var RE_NUM = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source; var getComputedStyleX; // https://stackoverflow.com/a/3485654/3040605 function forceRelayout(elem) { var originalStyle = elem.style.display; elem.style.display = 'none'; elem.offsetHeight; // eslint-disable-line elem.style.display = originalStyle; } function css(el, name, v) { var value = v; if (_typeof(name) === 'object') { for (var i in name) { if (name.hasOwnProperty(i)) { css(el, i, name[i]); } } return undefined; } if (typeof value !== 'undefined') { if (typeof value === 'number') { value = "".concat(value, "px"); } el.style[name] = value; return undefined; } return getComputedStyleX(el, name); } function getClientPosition(elem) { var box; var x; var y; var doc = elem.ownerDocument; var body = doc.body; var docElem = doc && doc.documentElement; // 根据 GBS 最新数据,A-Grade Browsers 都已支持 getBoundingClientRect 方法,不用再考虑传统的实现方式 box = elem.getBoundingClientRect(); // 注:jQuery 还考虑减去 docElem.clientLeft/clientTop // 但测试发现,这样反而会导致当 html 和 body 有边距/边框样式时,获取的值不正确 // 此外,ie6 会忽略 html 的 margin 值,幸运地是没有谁会去设置 html 的 margin x = box.left; y = box.top; // In IE, most of the time, 2 extra pixels are added to the top and left // due to the implicit 2-pixel inset border. In IE6/7 quirks mode and // IE6 standards mode, this border can be overridden by setting the // document element's border to zero -- thus, we cannot rely on the // offset always being 2 pixels. // In quirks mode, the offset can be determined by querying the body's // clientLeft/clientTop, but in standards mode, it is found by querying // the document element's clientLeft/clientTop. Since we already called // getClientBoundingRect we have already forced a reflow, so it is not // too expensive just to query them all. // ie 下应该减去窗口的边框吧,毕竟默认 absolute 都是相对窗口定位的 // 窗口边框标准是设 documentElement ,quirks 时设置 body // 最好禁止在 body 和 html 上边框 ,但 ie < 9 html 默认有 2px ,减去 // 但是非 ie 不可能设置窗口边框,body html 也不是窗口 ,ie 可以通过 html,body 设置 // 标准 ie 下 docElem.clientTop 就是 border-top // ie7 html 即窗口边框改变不了。永远为 2 // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框,即使设了 border-top 也为 0 x -= docElem.clientLeft || body.clientLeft || 0; y -= docElem.clientTop || body.clientTop || 0; return { left: x, top: y }; } function getScroll(w, top) { var ret = w["page".concat(top ? 'Y' : 'X', "Offset")]; var method = "scroll".concat(top ? 'Top' : 'Left'); if (typeof ret !== 'number') { var d = w.document; // ie6,7,8 standard mode ret = d.documentElement[method]; if (typeof ret !== 'number') { // quirks mode ret = d.body[method]; } } return ret; } function getScrollLeft(w) { return getScroll(w); } function getScrollTop(w) { return getScroll(w, true); } function getOffset(el) { var pos = getClientPosition(el); var doc = el.ownerDocument; var w = doc.defaultView || doc.parentWindow; pos.left += getScrollLeft(w); pos.top += getScrollTop(w); return pos; } /** * A crude way of determining if an object is a window * @member util */ function isWindow(obj) { // must use == for ie8 /* eslint eqeqeq:0 */ return obj !== null && obj !== undefined && obj == obj.window; } function getDocument(node) { if (isWindow(node)) { return node.document; } if (node.nodeType === 9) { return node; } return node.ownerDocument; } function _getComputedStyle(elem, name, cs) { var computedStyle = cs; var val = ''; var d = getDocument(elem); computedStyle = computedStyle || d.defaultView.getComputedStyle(elem, null); // https://github.com/kissyteam/kissy/issues/61 if (computedStyle) { val = computedStyle.getPropertyValue(name) || computedStyle[name]; } return val; } var _RE_NUM_NO_PX = new RegExp("^(".concat(RE_NUM, ")(?!px)[a-z%]+$"), 'i'); var RE_POS = /^(top|right|bottom|left)$/; var CURRENT_STYLE = 'currentStyle'; var RUNTIME_STYLE = 'runtimeStyle'; var LEFT = 'left'; var PX = 'px'; function _getComputedStyleIE(elem, name) { // currentStyle maybe null // http://msdn.microsoft.com/en-us/library/ms535231.aspx var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name]; // 当 width/height 设置为百分比时,通过 pixelLeft 方式转换的 width/height 值 // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19 // 在 ie 下不对,需要直接用 offset 方式 // borderWidth 等值也有问题,但考虑到 borderWidth 设为百分比的概率很小,这里就不考虑了 // From the awesome hack by Dean Edwards // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 // If we're not dealing with a regular pixel number // but a number that has a weird ending, we need to convert it to pixels // exclude left right for relativity if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) { // Remember the original values var style = elem.style; var left = style[LEFT]; var rsLeft = elem[RUNTIME_STYLE][LEFT]; // prevent flashing of content elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT]; // Put in the new values to get a computed value out style[LEFT] = name === 'fontSize' ? '1em' : ret || 0; ret = style.pixelLeft + PX; // Revert the changed values style[LEFT] = left; elem[RUNTIME_STYLE][LEFT] = rsLeft; } return ret === '' ? 'auto' : ret; } if (typeof window !== 'undefined') { getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE; } function getOffsetDirection(dir, option) { if (dir === 'left') { return option.useCssRight ? 'right' : dir; } return option.useCssBottom ? 'bottom' : dir; } function oppositeOffsetDirection(dir) { if (dir === 'left') { return 'right'; } else if (dir === 'right') { return 'left'; } else if (dir === 'top') { return 'bottom'; } else if (dir === 'bottom') { return 'top'; } } // 设置 elem 相对 elem.ownerDocument 的坐标 function setLeftTop(elem, offset, option) { // set position first, in-case top/left are set even on static elem if (css(elem, 'position') === 'static') { elem.style.position = 'relative'; } var presetH = -999; var presetV = -999; var horizontalProperty = getOffsetDirection('left', option); var verticalProperty = getOffsetDirection('top', option); var oppositeHorizontalProperty = oppositeOffsetDirection(horizontalProperty); var oppositeVerticalProperty = oppositeOffsetDirection(verticalProperty); if (horizontalProperty !== 'left') { presetH = 999; } if (verticalProperty !== 'top') { presetV = 999; } var originalTransition = ''; var originalOffset = getOffset(elem); if ('left' in offset || 'top' in offset) { originalTransition = getTransitionProperty(elem) || ''; setTransitionProperty(elem, 'none'); } if ('left' in offset) { elem.style[oppositeHorizontalProperty] = ''; elem.style[horizontalProperty] = "".concat(presetH, "px"); } if ('top' in offset) { elem.style[oppositeVerticalProperty] = ''; elem.style[verticalProperty] = "".concat(presetV, "px"); } // force relayout forceRelayout(elem); var old = getOffset(elem); var originalStyle = {}; for (var key in offset) { if (offset.hasOwnProperty(key)) { var dir = getOffsetDirection(key, option); var preset = key === 'left' ? presetH : presetV; var off = originalOffset[key] - old[key]; if (dir === key) { originalStyle[dir] = preset + off; } else { originalStyle[dir] = preset - off; } } } css(elem, originalStyle); // force relayout forceRelayout(elem); if ('left' in offset || 'top' in offset) { setTransitionProperty(elem, originalTransition); } var ret = {}; for (var _key in offset) { if (offset.hasOwnProperty(_key)) { var _dir = getOffsetDirection(_key, option); var _off = offset[_key] - originalOffset[_key]; if (_key === _dir) { ret[_dir] = originalStyle[_dir] + _off; } else { ret[_dir] = originalStyle[_dir] - _off; } } } css(elem, ret); } function setTransform$1(elem, offset) { var originalOffset = getOffset(elem); var originalXY = getTransformXY(elem); var resultXY = { x: originalXY.x, y: originalXY.y }; if ('left' in offset) { resultXY.x = originalXY.x + offset.left - originalOffset.left; } if ('top' in offset) { resultXY.y = originalXY.y + offset.top - originalOffset.top; } setTransformXY(elem, resultXY); } function setOffset(elem, offset, option) { if (option.ignoreShake) { var oriOffset = getOffset(elem); var oLeft = oriOffset.left.toFixed(0); var oTop = oriOffset.top.toFixed(0); var tLeft = offset.left.toFixed(0); var tTop = offset.top.toFixed(0); if (oLeft === tLeft && oTop === tTop) { return; } } if (option.useCssRight || option.useCssBottom) { setLeftTop(elem, offset, option); } else if (option.useCssTransform && getTransformName() in document.body.style) { setTransform$1(elem, offset); } else { setLeftTop(elem, offset, option); } } function each(arr, fn) { for (var i = 0; i < arr.length; i++) { fn(arr[i]); } } function isBorderBoxFn(elem) { return getComputedStyleX(elem, 'boxSizing') === 'border-box'; } var BOX_MODELS = ['margin', 'border', 'padding']; var CONTENT_INDEX = -1; var PADDING_INDEX = 2; var BORDER_INDEX = 1; var MARGIN_INDEX = 0; function swap(elem, options, callback) { var old = {}; var style = elem.style; var name; // Remember the old values, and insert the new ones for (name in options) { if (options.hasOwnProperty(name)) { old[name] = style[name]; style[name] = options[name]; } } callback.call(elem); // Revert the old values for (name in options) { if (options.hasOwnProperty(name)) { style[name] = old[name]; } } } function getPBMWidth(elem, props, which) { var value = 0; var prop; var j; var i; for (j = 0; j < props.length; j++) { prop = props[j]; if (prop) { for (i = 0; i < which.length; i++) { var cssProp = void 0; if (prop === 'border') { cssProp = "".concat(prop).concat(which[i], "Width"); } else { cssProp = prop + which[i]; } value += parseFloat(getComputedStyleX(elem, cssProp)) || 0; } } } return value; } var domUtils = { getParent: function getParent(element) { var parent = element; do { if (parent.nodeType === 11 && parent.host) { parent = parent.host; } else { parent = parent.parentNode; } } while (parent && parent.nodeType !== 1 && parent.nodeType !== 9); return parent; } }; each(['Width', 'Height'], function (name) { domUtils["doc".concat(name)] = function (refWin) { var d = refWin.document; return Math.max( // firefox chrome documentElement.scrollHeight< body.scrollHeight // ie standard mode : documentElement.scrollHeight> body.scrollHeight d.documentElement["scroll".concat(name)], // quirks : documentElement.scrollHeight 最大等于可视窗口多一点? d.body["scroll".concat(name)], domUtils["viewport".concat(name)](d)); }; domUtils["viewport".concat(name)] = function (win) { // pc browser includes scrollbar in window.innerWidth var prop = "client".concat(name); var doc = win.document; var body = doc.body; var documentElement = doc.documentElement; var documentElementProp = documentElement[prop]; // 标准模式取 documentElement // backcompat 取 body return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp; }; }); /* 得到元素的大小信息 @param elem @param name @param {String} [extra] 'padding' : (css width) + padding 'border' : (css width) + padding + border 'margin' : (css width) + padding + border + margin */ function getWH(elem, name, ex) { var extra = ex; if (isWindow(elem)) { return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem); } else if (elem.nodeType === 9) { return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem); } var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom']; var borderBoxValue = name === 'width' ? elem.getBoundingClientRect().width : elem.getBoundingClientRect().height; var computedStyle = getComputedStyleX(elem); var isBorderBox = isBorderBoxFn(elem); var cssBoxValue = 0; if (borderBoxValue === null || borderBoxValue === undefined || borderBoxValue <= 0) { borderBoxValue = undefined; // Fall back to computed then un computed css if necessary cssBoxValue = getComputedStyleX(elem, name); if (cssBoxValue === null || cssBoxValue === undefined || Number(cssBoxValue) < 0) { cssBoxValue = elem.style[name] || 0; } // Normalize '', auto, and prepare for extra cssBoxValue = parseFloat(cssBoxValue) || 0; } if (extra === undefined) { extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX; } var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox; var val = borderBoxValue || cssBoxValue; if (extra === CONTENT_INDEX) { if (borderBoxValueOrIsBorderBox) { return val - getPBMWidth(elem, ['border', 'padding'], which); } return cssBoxValue; } else if (borderBoxValueOrIsBorderBox) { if (extra === BORDER_INDEX) { return val; } return val + (extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which) : getPBMWidth(elem, ['margin'], which)); } return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which); } var cssShow = { position: 'absolute', visibility: 'hidden', display: 'block' }; // fix #119 : https://github.com/kissyteam/kissy/issues/119 function getWHIgnoreDisplay() { for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) { args[_key2] = arguments[_key2]; } var val; var elem = args[0]; // in case elem is window // elem.offsetWidth === undefined if (elem.offsetWidth !== 0) { val = getWH.apply(undefined, args); } else { swap(elem, cssShow, function () { val = getWH.apply(undefined, args); }); } return val; } each(['width', 'height'], function (name) { var first = name.charAt(0).toUpperCase() + name.slice(1); domUtils["outer".concat(first)] = function (el, includeMargin) { return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX); }; var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom']; domUtils[name] = function (elem, v) { var val = v; if (val !== undefined) { if (elem) { var computedStyle = getComputedStyleX(elem); var isBorderBox = isBorderBoxFn(elem); if (isBorderBox) { val += getPBMWidth(elem, ['padding', 'border'], which); } return css(elem, name, val); } return undefined; } return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX); }; }); function mix(to, from) { for (var i in from) { if (from.hasOwnProperty(i)) { to[i] = from[i]; } } return to; } var utils = { getWindow: function getWindow(node) { if (node && node.document && node.setTimeout) { return node; } var doc = node.ownerDocument || node; return doc.defaultView || doc.parentWindow; }, getDocument: getDocument, offset: function offset(el, value, option) { if (typeof value !== 'undefined') { setOffset(el, value, option || {}); } else { return getOffset(el); } }, isWindow: isWindow, each: each, css: css, clone: function clone(obj) { var i; var ret = {}; for (i in obj) { if (obj.hasOwnProperty(i)) { ret[i] = obj[i]; } } var overflow = obj.overflow; if (overflow) { for (i in obj) { if (obj.hasOwnProperty(i)) { ret.overflow[i] = obj.overflow[i]; } } } return ret; }, mix: mix, getWindowScrollLeft: function getWindowScrollLeft(w) { return getScrollLeft(w); }, getWindowScrollTop: function getWindowScrollTop(w) { return getScrollTop(w); }, merge: function merge() { var ret = {}; for (var i = 0; i < arguments.length; i++) { utils.mix(ret, i < 0 || arguments.length <= i ? undefined : arguments[i]); } return ret; }, viewportWidth: 0, viewportHeight: 0 }; mix(utils, domUtils); /** * 得到会导致元素显示不全的祖先元素 */ var getParent = utils.getParent; function getOffsetParent(element) { if (utils.isWindow(element) || element.nodeType === 9) { return null; } // ie 这个也不是完全可行 /*
元素 6 高 100px 宽 50px
*/ // element.offsetParent does the right thing in ie7 and below. Return parent with layout! // In other browsers it only includes elements with position absolute, relative or // fixed, not elements with overflow set to auto or scroll. // if (UA.ie && ieMode < 8) { // return element.offsetParent; // } // 统一的 offsetParent 方法 var doc = utils.getDocument(element); var body = doc.body; var parent; var positionStyle = utils.css(element, 'position'); var skipStatic = positionStyle === 'fixed' || positionStyle === 'absolute'; if (!skipStatic) { return element.nodeName.toLowerCase() === 'html' ? null : getParent(element); } for (parent = getParent(element); parent && parent !== body && parent.nodeType !== 9; parent = getParent(parent)) { positionStyle = utils.css(parent, 'position'); if (positionStyle !== 'static') { return parent; } } return null; } var getParent$1 = utils.getParent; function isAncestorFixed(element) { if (utils.isWindow(element) || element.nodeType === 9) { return false; } var doc = utils.getDocument(element); var body = doc.body; var parent = null; for (parent = getParent$1(element); parent && parent !== body; parent = getParent$1(parent)) { var positionStyle = utils.css(parent, 'position'); if (positionStyle === 'fixed') { return true; } } return false; } /** * 获得元素的显示部分的区域 */ function getVisibleRectForElement(element, alwaysByViewport) { var visibleRect = { left: 0, right: Infinity, top: 0, bottom: Infinity }; var el = getOffsetParent(element); var doc = utils.getDocument(element); var win = doc.defaultView || doc.parentWindow; var body = doc.body; var documentElement = doc.documentElement; // Determine the size of the visible rect by climbing the dom accounting for // all scrollable containers. while (el) { // clientWidth is zero for inline block elements in ie. if ((navigator.userAgent.indexOf('MSIE') === -1 || el.clientWidth !== 0) && // body may have overflow set on it, yet we still get the entire // viewport. In some browsers, el.offsetParent may be // document.documentElement, so check for that too. el !== body && el !== documentElement && utils.css(el, 'overflow') !== 'visible') { var pos = utils.offset(el); // add border pos.left += el.clientLeft; pos.top += el.clientTop; visibleRect.top = Math.max(visibleRect.top, pos.top); visibleRect.right = Math.min(visibleRect.right, // consider area without scrollBar pos.left + el.clientWidth); visibleRect.bottom = Math.min(visibleRect.bottom, pos.top + el.clientHeight); visibleRect.left = Math.max(visibleRect.left, pos.left); } else if (el === body || el === documentElement) { break; } el = getOffsetParent(el); } // Set element position to fixed // make sure absolute element itself don't affect it's visible area // https://github.com/ant-design/ant-design/issues/7601 var originalPosition = null; if (!utils.isWindow(element) && element.nodeType !== 9) { originalPosition = element.style.position; var position = utils.css(element, 'position'); if (position === 'absolute') { element.style.position = 'fixed'; } } var scrollX = utils.getWindowScrollLeft(win); var scrollY = utils.getWindowScrollTop(win); var viewportWidth = utils.viewportWidth(win); var viewportHeight = utils.viewportHeight(win); var documentWidth = documentElement.scrollWidth; var documentHeight = documentElement.scrollHeight; // scrollXXX on html is sync with body which means overflow: hidden on body gets wrong scrollXXX. // We should cut this ourself. var bodyStyle = window.getComputedStyle(body); if (bodyStyle.overflowX === 'hidden') { documentWidth = win.innerWidth; } if (bodyStyle.overflowY === 'hidden') { documentHeight = win.innerHeight; } // Reset element position after calculate the visible area if (element.style) { element.style.position = originalPosition; } if (alwaysByViewport || isAncestorFixed(element)) { // Clip by viewport's size. visibleRect.left = Math.max(visibleRect.left, scrollX); visibleRect.top = Math.max(visibleRect.top, scrollY); visibleRect.right = Math.min(visibleRect.right, scrollX + viewportWidth); visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + viewportHeight); } else { // Clip by document's size. var maxVisibleWidth = Math.max(documentWidth, scrollX + viewportWidth); visibleRect.right = Math.min(visibleRect.right, maxVisibleWidth); var maxVisibleHeight = Math.max(documentHeight, scrollY + viewportHeight); visibleRect.bottom = Math.min(visibleRect.bottom, maxVisibleHeight); } return visibleRect.top >= 0 && visibleRect.left >= 0 && visibleRect.bottom > visibleRect.top && visibleRect.right > visibleRect.left ? visibleRect : null; } function adjustForViewport(elFuturePos, elRegion, visibleRect, overflow) { var pos = utils.clone(elFuturePos); var size = { width: elRegion.width, height: elRegion.height }; if (overflow.adjustX && pos.left < visibleRect.left) { pos.left = visibleRect.left; } // Left edge inside and right edge outside viewport, try to resize it. if (overflow.resizeWidth && pos.left >= visibleRect.left && pos.left + size.width > visibleRect.right) { size.width -= pos.left + size.width - visibleRect.right; } // Right edge outside viewport, try to move it. if (overflow.adjustX && pos.left + size.width > visibleRect.right) { // 保证左边界和可视区域左边界对齐 pos.left = Math.max(visibleRect.right - size.width, visibleRect.left); } // Top edge outside viewport, try to move it. if (overflow.adjustY && pos.top < visibleRect.top) { pos.top = visibleRect.top; } // Top edge inside and bottom edge outside viewport, try to resize it. if (overflow.resizeHeight && pos.top >= visibleRect.top && pos.top + size.height > visibleRect.bottom) { size.height -= pos.top + size.height - visibleRect.bottom; } // Bottom edge outside viewport, try to move it. if (overflow.adjustY && pos.top + size.height > visibleRect.bottom) { // 保证上边界和可视区域上边界对齐 pos.top = Math.max(visibleRect.bottom - size.height, visibleRect.top); } return utils.mix(pos, size); } function getRegion(node) { var offset; var w; var h; if (!utils.isWindow(node) && node.nodeType !== 9) { offset = utils.offset(node); w = utils.outerWidth(node); h = utils.outerHeight(node); } else { var win = utils.getWindow(node); offset = { left: utils.getWindowScrollLeft(win), top: utils.getWindowScrollTop(win) }; w = utils.viewportWidth(win); h = utils.viewportHeight(win); } offset.width = w; offset.height = h; return offset; } /** * 获取 node 上的 align 对齐点 相对于页面的坐标 */ function getAlignOffset(region, align) { var V = align.charAt(0); var H = align.charAt(1); var w = region.width; var h = region.height; var x = region.left; var y = region.top; if (V === 'c') { y += h / 2; } else if (V === 'b') { y += h; } if (H === 'c') { x += w / 2; } else if (H === 'r') { x += w; } return { left: x, top: y }; } function getElFuturePos(elRegion, refNodeRegion, points, offset, targetOffset) { var p1 = getAlignOffset(refNodeRegion, points[1]); var p2 = getAlignOffset(elRegion, points[0]); var diff = [p2.left - p1.left, p2.top - p1.top]; return { left: Math.round(elRegion.left - diff[0] + offset[0] - targetOffset[0]), top: Math.round(elRegion.top - diff[1] + offset[1] - targetOffset[1]) }; } /** * align dom node flexibly * @author yiminghe@gmail.com */ function isFailX(elFuturePos, elRegion, visibleRect) { return elFuturePos.left < visibleRect.left || elFuturePos.left + elRegion.width > visibleRect.right; } function isFailY(elFuturePos, elRegion, visibleRect) { return elFuturePos.top < visibleRect.top || elFuturePos.top + elRegion.height > visibleRect.bottom; } function isCompleteFailX(elFuturePos, elRegion, visibleRect) { return elFuturePos.left > visibleRect.right || elFuturePos.left + elRegion.width < visibleRect.left; } function isCompleteFailY(elFuturePos, elRegion, visibleRect) { return elFuturePos.top > visibleRect.bottom || elFuturePos.top + elRegion.height < visibleRect.top; } function flip(points, reg, map) { var ret = []; utils.each(points, function (p) { ret.push(p.replace(reg, function (m) { return map[m]; })); }); return ret; } function flipOffset(offset, index) { offset[index] = -offset[index]; return offset; } function convertOffset(str, offsetLen) { var n; if (/%$/.test(str)) { n = parseInt(str.substring(0, str.length - 1), 10) / 100 * offsetLen; } else { n = parseInt(str, 10); } return n || 0; } function normalizeOffset(offset, el) { offset[0] = convertOffset(offset[0], el.width); offset[1] = convertOffset(offset[1], el.height); } /** * @param el * @param tgtRegion 参照节点所占的区域: { left, top, width, height } * @param align */ function doAlign(el, tgtRegion, align, isTgtRegionVisible) { var points = align.points; var offset = align.offset || [0, 0]; var targetOffset = align.targetOffset || [0, 0]; var overflow = align.overflow; var source = align.source || el; offset = [].concat(offset); targetOffset = [].concat(targetOffset); overflow = overflow || {}; var newOverflowCfg = {}; var fail = 0; var alwaysByViewport = !!(overflow && overflow.alwaysByViewport); // 当前节点可以被放置的显示区域 var visibleRect = getVisibleRectForElement(source, alwaysByViewport); // 当前节点所占的区域, left/top/width/height var elRegion = getRegion(source); // 将 offset 转换成数值,支持百分比 normalizeOffset(offset, elRegion); normalizeOffset(targetOffset, tgtRegion); // 当前节点将要被放置的位置 var elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset, targetOffset); // 当前节点将要所处的区域 var newElRegion = utils.merge(elRegion, elFuturePos); // 如果可视区域不能完全放置当前节点时允许调整 if (visibleRect && (overflow.adjustX || overflow.adjustY) && isTgtRegionVisible) { if (overflow.adjustX) { // 如果横向不能放下 if (isFailX(elFuturePos, elRegion, visibleRect)) { // 对齐位置反下 var newPoints = flip(points, /[lr]/gi, { l: 'r', r: 'l' }); // 偏移量也反下 var newOffset = flipOffset(offset, 0); var newTargetOffset = flipOffset(targetOffset, 0); var newElFuturePos = getElFuturePos(elRegion, tgtRegion, newPoints, newOffset, newTargetOffset); if (!isCompleteFailX(newElFuturePos, elRegion, visibleRect)) { fail = 1; points = newPoints; offset = newOffset; targetOffset = newTargetOffset; } } } if (overflow.adjustY) { // 如果纵向不能放下 if (isFailY(elFuturePos, elRegion, visibleRect)) { // 对齐位置反下 var _newPoints = flip(points, /[tb]/gi, { t: 'b', b: 't' }); // 偏移量也反下 var _newOffset = flipOffset(offset, 1); var _newTargetOffset = flipOffset(targetOffset, 1); var _newElFuturePos = getElFuturePos(elRegion, tgtRegion, _newPoints, _newOffset, _newTargetOffset); if (!isCompleteFailY(_newElFuturePos, elRegion, visibleRect)) { fail = 1; points = _newPoints; offset = _newOffset; targetOffset = _newTargetOffset; } } } // 如果失败,重新计算当前节点将要被放置的位置 if (fail) { elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset, targetOffset); utils.mix(newElRegion, elFuturePos); } var isStillFailX = isFailX(elFuturePos, elRegion, visibleRect); var isStillFailY = isFailY(elFuturePos, elRegion, visibleRect); // 检查反下后的位置是否可以放下了,如果仍然放不下: // 1. 复原修改过的定位参数 if (isStillFailX || isStillFailY) { var _newPoints2 = points; // 重置对应部分的翻转逻辑 if (isStillFailX) { _newPoints2 = flip(points, /[lr]/gi, { l: 'r', r: 'l' }); } if (isStillFailY) { _newPoints2 = flip(points, /[tb]/gi, { t: 'b', b: 't' }); } points = _newPoints2; offset = align.offset || [0, 0]; targetOffset = align.targetOffset || [0, 0]; } // 2. 只有指定了可以调整当前方向才调整 newOverflowCfg.adjustX = overflow.adjustX && isStillFailX; newOverflowCfg.adjustY = overflow.adjustY && isStillFailY; // 确实要调整,甚至可能会调整高度宽度 if (newOverflowCfg.adjustX || newOverflowCfg.adjustY) { newElRegion = adjustForViewport(elFuturePos, elRegion, visibleRect, newOverflowCfg); } } // need judge to in case set fixed with in css on height auto element if (newElRegion.width !== elRegion.width) { utils.css(source, 'width', utils.width(source) + newElRegion.width - elRegion.width); } if (newElRegion.height !== elRegion.height) { utils.css(source, 'height', utils.height(source) + newElRegion.height - elRegion.height); } // https://github.com/kissyteam/kissy/issues/190 // 相对于屏幕位置没变,而 left/top 变了 // 例如
utils.offset(source, { left: newElRegion.left, top: newElRegion.top }, { useCssRight: align.useCssRight, useCssBottom: align.useCssBottom, useCssTransform: align.useCssTransform, ignoreShake: align.ignoreShake }); return { points: points, offset: offset, targetOffset: targetOffset, overflow: newOverflowCfg }; } /** * 2012-04-26 yiminghe@gmail.com * - 优化智能对齐算法 * - 慎用 resizeXX * * 2011-07-13 yiminghe@gmail.com note: * - 增加智能对齐,以及大小调整选项 **/ function isOutOfVisibleRect(target, alwaysByViewport) { var visibleRect = getVisibleRectForElement(target, alwaysByViewport); var targetRegion = getRegion(target); return !visibleRect || targetRegion.left + targetRegion.width <= visibleRect.left || targetRegion.top + targetRegion.height <= visibleRect.top || targetRegion.left >= visibleRect.right || targetRegion.top >= visibleRect.bottom; } function alignElement(el, refNode, align) { var target = align.target || refNode; var refNodeRegion = getRegion(target); var isTargetNotOutOfVisible = !isOutOfVisibleRect(target, align.overflow && align.overflow.alwaysByViewport); return doAlign(el, refNodeRegion, align, isTargetNotOutOfVisible); } alignElement.__getOffsetParent = getOffsetParent; alignElement.__getVisibleRectForElement = getVisibleRectForElement; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /** * `tgtPoint`: { pageX, pageY } or { clientX, clientY }. * If client position provided, will internal convert to page position. */ function alignPoint(el, tgtPoint, align) { var pageX; var pageY; var doc = utils.getDocument(el); var win = doc.defaultView || doc.parentWindow; var scrollX = utils.getWindowScrollLeft(win); var scrollY = utils.getWindowScrollTop(win); var viewportWidth = utils.viewportWidth(win); var viewportHeight = utils.viewportHeight(win); if ('pageX' in tgtPoint) { pageX = tgtPoint.pageX; } else { pageX = scrollX + tgtPoint.clientX; } if ('pageY' in tgtPoint) { pageY = tgtPoint.pageY; } else { pageY = scrollY + tgtPoint.clientY; } var tgtRegion = { left: pageX, top: pageY, width: 0, height: 0 }; var pointInView = pageX >= 0 && pageX <= scrollX + viewportWidth && pageY >= 0 && pageY <= scrollY + viewportHeight; // Provide default target point var points = [align.points[0], 'cc']; return doAlign(el, tgtRegion, _objectSpread({}, align, { points: points }), pointInView); } exports.alignElement = alignElement; exports.alignPoint = alignPoint; exports.default = alignElement; },{}],459:[function(require,module,exports){ 'use strict'; var reactIs = require('react-is'); /** * Copyright 2015, Yahoo! Inc. * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. */ var REACT_STATICS = { childContextTypes: true, contextType: true, contextTypes: true, defaultProps: true, displayName: true, getDefaultProps: true, getDerivedStateFromError: true, getDerivedStateFromProps: true, mixins: true, propTypes: true, type: true }; var KNOWN_STATICS = { name: true, length: true, prototype: true, caller: true, callee: true, arguments: true, arity: true }; var FORWARD_REF_STATICS = { '$$typeof': true, render: true, defaultProps: true, displayName: true, propTypes: true }; var MEMO_STATICS = { '$$typeof': true, compare: true, defaultProps: true, displayName: true, propTypes: true, type: true }; var TYPE_STATICS = {}; TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS; TYPE_STATICS[reactIs.Memo] = MEMO_STATICS; function getStatics(component) { // React v16.11 and below if (reactIs.isMemo(component)) { return MEMO_STATICS; } // React v16.12 and above return TYPE_STATICS[component['$$typeof']] || REACT_STATICS; } var defineProperty = Object.defineProperty; var getOwnPropertyNames = Object.getOwnPropertyNames; var getOwnPropertySymbols = Object.getOwnPropertySymbols; var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var getPrototypeOf = Object.getPrototypeOf; var objectPrototype = Object.prototype; function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) { if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components if (objectPrototype) { var inheritedComponent = getPrototypeOf(sourceComponent); if (inheritedComponent && inheritedComponent !== objectPrototype) { hoistNonReactStatics(targetComponent, inheritedComponent, blacklist); } } var keys = getOwnPropertyNames(sourceComponent); if (getOwnPropertySymbols) { keys = keys.concat(getOwnPropertySymbols(sourceComponent)); } var targetStatics = getStatics(targetComponent); var sourceStatics = getStatics(sourceComponent); for (var i = 0; i < keys.length; ++i) { var key = keys[i]; if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) { var descriptor = getOwnPropertyDescriptor(sourceComponent, key); try { // Avoid failures from read-only properties defineProperty(targetComponent, key, descriptor); } catch (e) {} } } } return targetComponent; } module.exports = hoistNonReactStatics; },{"react-is":897}],460:[function(require,module,exports){ var containers = []; // will store container HTMLElement references var styleElements = []; // will store {prepend: HTMLElement, append: HTMLElement} var usage = 'insert-css: You need to provide a CSS string. Usage: insertCss(cssString[, options]).'; function insertCss(css, options) { options = options || {}; if (css === undefined) { throw new Error(usage); } var position = options.prepend === true ? 'prepend' : 'append'; var container = options.container !== undefined ? options.container : document.querySelector('head'); var containerId = containers.indexOf(container); // first time we see this container, create the necessary entries if (containerId === -1) { containerId = containers.push(container) - 1; styleElements[containerId] = {}; } // try to get the correponding container + position styleElement, create it otherwise var styleElement; if (styleElements[containerId] !== undefined && styleElements[containerId][position] !== undefined) { styleElement = styleElements[containerId][position]; } else { styleElement = styleElements[containerId][position] = createStyleElement(); if (position === 'prepend') { container.insertBefore(styleElement, container.childNodes[0]); } else { container.appendChild(styleElement); } } // strip potential UTF-8 BOM if css was read from a file if (css.charCodeAt(0) === 0xFEFF) { css = css.substr(1, css.length); } // actually add the stylesheet if (styleElement.styleSheet) { styleElement.styleSheet.cssText += css } else { styleElement.textContent += css; } return styleElement; }; function createStyleElement() { var styleElement = document.createElement('style'); styleElement.setAttribute('type', 'text/css'); return styleElement; } module.exports = insertCss; module.exports.insertCss = insertCss; },{}],461:[function(require,module,exports){ var camel2hyphen = require('string-convert/camel2hyphen'); var isDimension = function (feature) { var re = /[height|width]$/; return re.test(feature); }; var obj2mq = function (obj) { var mq = ''; var features = Object.keys(obj); features.forEach(function (feature, index) { var value = obj[feature]; feature = camel2hyphen(feature); // Add px to dimension features if (isDimension(feature) && typeof value === 'number') { value = value + 'px'; } if (value === true) { mq += feature; } else if (value === false) { mq += 'not ' + feature; } else { mq += '(' + feature + ': ' + value + ')'; } if (index < features.length-1) { mq += ' and ' } }); return mq; }; var json2mq = function (query) { var mq = ''; if (typeof query === 'string') { return query; } // Handling array of media queries if (query instanceof Array) { query.forEach(function (q, index) { mq += obj2mq(q); if (index < query.length-1) { mq += ', ' } }); return mq; } // Handling single media query return obj2mq(query); }; module.exports = json2mq; },{"string-convert/camel2hyphen":902}],462:[function(require,module,exports){ var getNative = require('./_getNative'), root = require('./_root'); /* Built-in method references that are verified to be native. */ var DataView = getNative(root, 'DataView'); module.exports = DataView; },{"./_getNative":506,"./_root":537}],463:[function(require,module,exports){ var hashClear = require('./_hashClear'), hashDelete = require('./_hashDelete'), hashGet = require('./_hashGet'), hashHas = require('./_hashHas'), hashSet = require('./_hashSet'); /** * Creates a hash object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Hash(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `Hash`. Hash.prototype.clear = hashClear; Hash.prototype['delete'] = hashDelete; Hash.prototype.get = hashGet; Hash.prototype.has = hashHas; Hash.prototype.set = hashSet; module.exports = Hash; },{"./_hashClear":512,"./_hashDelete":513,"./_hashGet":514,"./_hashHas":515,"./_hashSet":516}],464:[function(require,module,exports){ var listCacheClear = require('./_listCacheClear'), listCacheDelete = require('./_listCacheDelete'), listCacheGet = require('./_listCacheGet'), listCacheHas = require('./_listCacheHas'), listCacheSet = require('./_listCacheSet'); /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function ListCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `ListCache`. ListCache.prototype.clear = listCacheClear; ListCache.prototype['delete'] = listCacheDelete; ListCache.prototype.get = listCacheGet; ListCache.prototype.has = listCacheHas; ListCache.prototype.set = listCacheSet; module.exports = ListCache; },{"./_listCacheClear":521,"./_listCacheDelete":522,"./_listCacheGet":523,"./_listCacheHas":524,"./_listCacheSet":525}],465:[function(require,module,exports){ var getNative = require('./_getNative'), root = require('./_root'); /* Built-in method references that are verified to be native. */ var Map = getNative(root, 'Map'); module.exports = Map; },{"./_getNative":506,"./_root":537}],466:[function(require,module,exports){ var mapCacheClear = require('./_mapCacheClear'), mapCacheDelete = require('./_mapCacheDelete'), mapCacheGet = require('./_mapCacheGet'), mapCacheHas = require('./_mapCacheHas'), mapCacheSet = require('./_mapCacheSet'); /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function MapCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `MapCache`. MapCache.prototype.clear = mapCacheClear; MapCache.prototype['delete'] = mapCacheDelete; MapCache.prototype.get = mapCacheGet; MapCache.prototype.has = mapCacheHas; MapCache.prototype.set = mapCacheSet; module.exports = MapCache; },{"./_mapCacheClear":526,"./_mapCacheDelete":527,"./_mapCacheGet":528,"./_mapCacheHas":529,"./_mapCacheSet":530}],467:[function(require,module,exports){ var getNative = require('./_getNative'), root = require('./_root'); /* Built-in method references that are verified to be native. */ var Promise = getNative(root, 'Promise'); module.exports = Promise; },{"./_getNative":506,"./_root":537}],468:[function(require,module,exports){ var getNative = require('./_getNative'), root = require('./_root'); /* Built-in method references that are verified to be native. */ var Set = getNative(root, 'Set'); module.exports = Set; },{"./_getNative":506,"./_root":537}],469:[function(require,module,exports){ var MapCache = require('./_MapCache'), setCacheAdd = require('./_setCacheAdd'), setCacheHas = require('./_setCacheHas'); /** * * Creates an array cache object to store unique values. * * @private * @constructor * @param {Array} [values] The values to cache. */ function SetCache(values) { var index = -1, length = values == null ? 0 : values.length; this.__data__ = new MapCache; while (++index < length) { this.add(values[index]); } } // Add methods to `SetCache`. SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; SetCache.prototype.has = setCacheHas; module.exports = SetCache; },{"./_MapCache":466,"./_setCacheAdd":538,"./_setCacheHas":539}],470:[function(require,module,exports){ var ListCache = require('./_ListCache'), stackClear = require('./_stackClear'), stackDelete = require('./_stackDelete'), stackGet = require('./_stackGet'), stackHas = require('./_stackHas'), stackSet = require('./_stackSet'); /** * Creates a stack cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Stack(entries) { var data = this.__data__ = new ListCache(entries); this.size = data.size; } // Add methods to `Stack`. Stack.prototype.clear = stackClear; Stack.prototype['delete'] = stackDelete; Stack.prototype.get = stackGet; Stack.prototype.has = stackHas; Stack.prototype.set = stackSet; module.exports = Stack; },{"./_ListCache":464,"./_stackClear":541,"./_stackDelete":542,"./_stackGet":543,"./_stackHas":544,"./_stackSet":545}],471:[function(require,module,exports){ var root = require('./_root'); /** Built-in value references. */ var Symbol = root.Symbol; module.exports = Symbol; },{"./_root":537}],472:[function(require,module,exports){ var root = require('./_root'); /** Built-in value references. */ var Uint8Array = root.Uint8Array; module.exports = Uint8Array; },{"./_root":537}],473:[function(require,module,exports){ var getNative = require('./_getNative'), root = require('./_root'); /* Built-in method references that are verified to be native. */ var WeakMap = getNative(root, 'WeakMap'); module.exports = WeakMap; },{"./_getNative":506,"./_root":537}],474:[function(require,module,exports){ /** * A specialized version of `_.filter` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function arrayFilter(array, predicate) { var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { result[resIndex++] = value; } } return result; } module.exports = arrayFilter; },{}],475:[function(require,module,exports){ var baseTimes = require('./_baseTimes'), isArguments = require('./isArguments'), isArray = require('./isArray'), isBuffer = require('./isBuffer'), isIndex = require('./_isIndex'), isTypedArray = require('./isTypedArray'); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Creates an array of the enumerable property names of the array-like `value`. * * @private * @param {*} value The value to query. * @param {boolean} inherited Specify returning inherited property names. * @returns {Array} Returns the array of property names. */ function arrayLikeKeys(value, inherited) { var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length; for (var key in value) { if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode. key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers. (isBuff && (key == 'offset' || key == 'parent')) || // PhantomJS 2 has enumerable non-index properties on typed arrays. (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || // Skip index properties. isIndex(key, length) ))) { result.push(key); } } return result; } module.exports = arrayLikeKeys; },{"./_baseTimes":493,"./_isIndex":517,"./isArguments":553,"./isArray":554,"./isBuffer":556,"./isTypedArray":563}],476:[function(require,module,exports){ /** * A specialized version of `_.map` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function arrayMap(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } module.exports = arrayMap; },{}],477:[function(require,module,exports){ /** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */ function arrayPush(array, values) { var index = -1, length = values.length, offset = array.length; while (++index < length) { array[offset + index] = values[index]; } return array; } module.exports = arrayPush; },{}],478:[function(require,module,exports){ /** * A specialized version of `_.some` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {boolean} Returns `true` if any element passes the predicate check, * else `false`. */ function arraySome(array, predicate) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (predicate(array[index], index, array)) { return true; } } return false; } module.exports = arraySome; },{}],479:[function(require,module,exports){ var baseProperty = require('./_baseProperty'); /** * Gets the size of an ASCII `string`. * * @private * @param {string} string The string inspect. * @returns {number} Returns the string size. */ var asciiSize = baseProperty('length'); module.exports = asciiSize; },{"./_baseProperty":490}],480:[function(require,module,exports){ /** * Converts an ASCII `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function asciiToArray(string) { return string.split(''); } module.exports = asciiToArray; },{}],481:[function(require,module,exports){ var eq = require('./eq'); /** * Gets the index at which the `key` is found in `array` of key-value pairs. * * @private * @param {Array} array The array to inspect. * @param {*} key The key to search for. * @returns {number} Returns the index of the matched value, else `-1`. */ function assocIndexOf(array, key) { var length = array.length; while (length--) { if (eq(array[length][0], key)) { return length; } } return -1; } module.exports = assocIndexOf; },{"./eq":552}],482:[function(require,module,exports){ var arrayPush = require('./_arrayPush'), isArray = require('./isArray'); /** * The base implementation of `getAllKeys` and `getAllKeysIn` which uses * `keysFunc` and `symbolsFunc` to get the enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @param {Function} keysFunc The function to get the keys of `object`. * @param {Function} symbolsFunc The function to get the symbols of `object`. * @returns {Array} Returns the array of property names and symbols. */ function baseGetAllKeys(object, keysFunc, symbolsFunc) { var result = keysFunc(object); return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); } module.exports = baseGetAllKeys; },{"./_arrayPush":477,"./isArray":554}],483:[function(require,module,exports){ var Symbol = require('./_Symbol'), getRawTag = require('./_getRawTag'), objectToString = require('./_objectToString'); /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag(value) { if (value == null) { return value === undefined ? undefinedTag : nullTag; } return (symToStringTag && symToStringTag in Object(value)) ? getRawTag(value) : objectToString(value); } module.exports = baseGetTag; },{"./_Symbol":471,"./_getRawTag":507,"./_objectToString":535}],484:[function(require,module,exports){ var baseGetTag = require('./_baseGetTag'), isObjectLike = require('./isObjectLike'); /** `Object#toString` result references. */ var argsTag = '[object Arguments]'; /** * The base implementation of `_.isArguments`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, */ function baseIsArguments(value) { return isObjectLike(value) && baseGetTag(value) == argsTag; } module.exports = baseIsArguments; },{"./_baseGetTag":483,"./isObjectLike":561}],485:[function(require,module,exports){ var baseIsEqualDeep = require('./_baseIsEqualDeep'), isObjectLike = require('./isObjectLike'); /** * The base implementation of `_.isEqual` which supports partial comparisons * and tracks traversed objects. * * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. * @param {boolean} bitmask The bitmask flags. * 1 - Unordered comparison * 2 - Partial comparison * @param {Function} [customizer] The function to customize comparisons. * @param {Object} [stack] Tracks traversed `value` and `other` objects. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ function baseIsEqual(value, other, bitmask, customizer, stack) { if (value === other) { return true; } if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { return value !== value && other !== other; } return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } module.exports = baseIsEqual; },{"./_baseIsEqualDeep":486,"./isObjectLike":561}],486:[function(require,module,exports){ var Stack = require('./_Stack'), equalArrays = require('./_equalArrays'), equalByTag = require('./_equalByTag'), equalObjects = require('./_equalObjects'), getTag = require('./_getTag'), isArray = require('./isArray'), isBuffer = require('./isBuffer'), isTypedArray = require('./isTypedArray'); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1; /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', objectTag = '[object Object]'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * A specialized version of `baseIsEqual` for arrays and objects which performs * deep comparisons and tracks traversed objects enabling objects with circular * references to be compared. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} [stack] Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); objTag = objTag == argsTag ? objectTag : objTag; othTag = othTag == argsTag ? objectTag : othTag; var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; if (isSameTag && isBuffer(object)) { if (!isBuffer(other)) { return false; } objIsArr = true; objIsObj = false; } if (isSameTag && !objIsObj) { stack || (stack = new Stack); return (objIsArr || isTypedArray(object)) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); } if (!(bitmask & COMPARE_PARTIAL_FLAG)) { var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); if (objIsWrapped || othIsWrapped) { var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; stack || (stack = new Stack); return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); } } if (!isSameTag) { return false; } stack || (stack = new Stack); return equalObjects(object, other, bitmask, customizer, equalFunc, stack); } module.exports = baseIsEqualDeep; },{"./_Stack":470,"./_equalArrays":500,"./_equalByTag":501,"./_equalObjects":502,"./_getTag":509,"./isArray":554,"./isBuffer":556,"./isTypedArray":563}],487:[function(require,module,exports){ var isFunction = require('./isFunction'), isMasked = require('./_isMasked'), isObject = require('./isObject'), toSource = require('./_toSource'); /** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** Used for built-in method references. */ var funcProto = Function.prototype, objectProto = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Used to detect if a method is native. */ var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' ); /** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, * else `false`. */ function baseIsNative(value) { if (!isObject(value) || isMasked(value)) { return false; } var pattern = isFunction(value) ? reIsNative : reIsHostCtor; return pattern.test(toSource(value)); } module.exports = baseIsNative; },{"./_isMasked":519,"./_toSource":548,"./isFunction":558,"./isObject":560}],488:[function(require,module,exports){ var baseGetTag = require('./_baseGetTag'), isLength = require('./isLength'), isObjectLike = require('./isObjectLike'); /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', funcTag = '[object Function]', mapTag = '[object Map]', numberTag = '[object Number]', objectTag = '[object Object]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', weakMapTag = '[object WeakMap]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]'; /** Used to identify `toStringTag` values of typed arrays. */ var typedArrayTags = {}; typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; /** * The base implementation of `_.isTypedArray` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. */ function baseIsTypedArray(value) { return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; } module.exports = baseIsTypedArray; },{"./_baseGetTag":483,"./isLength":559,"./isObjectLike":561}],489:[function(require,module,exports){ var isPrototype = require('./_isPrototype'), nativeKeys = require('./_nativeKeys'); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeys(object) { if (!isPrototype(object)) { return nativeKeys(object); } var result = []; for (var key in Object(object)) { if (hasOwnProperty.call(object, key) && key != 'constructor') { result.push(key); } } return result; } module.exports = baseKeys; },{"./_isPrototype":520,"./_nativeKeys":533}],490:[function(require,module,exports){ /** * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. * @returns {Function} Returns the new accessor function. */ function baseProperty(key) { return function(object) { return object == null ? undefined : object[key]; }; } module.exports = baseProperty; },{}],491:[function(require,module,exports){ /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeFloor = Math.floor; /** * The base implementation of `_.repeat` which doesn't coerce arguments. * * @private * @param {string} string The string to repeat. * @param {number} n The number of times to repeat the string. * @returns {string} Returns the repeated string. */ function baseRepeat(string, n) { var result = ''; if (!string || n < 1 || n > MAX_SAFE_INTEGER) { return result; } // Leverage the exponentiation by squaring algorithm for a faster repeat. // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. do { if (n % 2) { result += string; } n = nativeFloor(n / 2); if (n) { string += string; } } while (n); return result; } module.exports = baseRepeat; },{}],492:[function(require,module,exports){ /** * The base implementation of `_.slice` without an iteratee call guard. * * @private * @param {Array} array The array to slice. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the slice of `array`. */ function baseSlice(array, start, end) { var index = -1, length = array.length; if (start < 0) { start = -start > length ? 0 : (length + start); } end = end > length ? length : end; if (end < 0) { end += length; } length = start > end ? 0 : ((end - start) >>> 0); start >>>= 0; var result = Array(length); while (++index < length) { result[index] = array[index + start]; } return result; } module.exports = baseSlice; },{}],493:[function(require,module,exports){ /** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. * * @private * @param {number} n The number of times to invoke `iteratee`. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the array of results. */ function baseTimes(n, iteratee) { var index = -1, result = Array(n); while (++index < n) { result[index] = iteratee(index); } return result; } module.exports = baseTimes; },{}],494:[function(require,module,exports){ var Symbol = require('./_Symbol'), arrayMap = require('./_arrayMap'), isArray = require('./isArray'), isSymbol = require('./isSymbol'); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString(value) { // Exit early for strings to avoid a performance hit in some environments. if (typeof value == 'string') { return value; } if (isArray(value)) { // Recursively convert values (susceptible to call stack limits). return arrayMap(value, baseToString) + ''; } if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : ''; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = baseToString; },{"./_Symbol":471,"./_arrayMap":476,"./isArray":554,"./isSymbol":562}],495:[function(require,module,exports){ /** * The base implementation of `_.unary` without support for storing metadata. * * @private * @param {Function} func The function to cap arguments for. * @returns {Function} Returns the new capped function. */ function baseUnary(func) { return function(value) { return func(value); }; } module.exports = baseUnary; },{}],496:[function(require,module,exports){ /** * Checks if a `cache` value for `key` exists. * * @private * @param {Object} cache The cache to query. * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function cacheHas(cache, key) { return cache.has(key); } module.exports = cacheHas; },{}],497:[function(require,module,exports){ var baseSlice = require('./_baseSlice'); /** * Casts `array` to a slice if it's needed. * * @private * @param {Array} array The array to inspect. * @param {number} start The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the cast slice. */ function castSlice(array, start, end) { var length = array.length; end = end === undefined ? length : end; return (!start && end >= length) ? array : baseSlice(array, start, end); } module.exports = castSlice; },{"./_baseSlice":492}],498:[function(require,module,exports){ var root = require('./_root'); /** Used to detect overreaching core-js shims. */ var coreJsData = root['__core-js_shared__']; module.exports = coreJsData; },{"./_root":537}],499:[function(require,module,exports){ var baseRepeat = require('./_baseRepeat'), baseToString = require('./_baseToString'), castSlice = require('./_castSlice'), hasUnicode = require('./_hasUnicode'), stringSize = require('./_stringSize'), stringToArray = require('./_stringToArray'); /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeCeil = Math.ceil; /** * Creates the padding for `string` based on `length`. The `chars` string * is truncated if the number of characters exceeds `length`. * * @private * @param {number} length The padding length. * @param {string} [chars=' '] The string used as padding. * @returns {string} Returns the padding for `string`. */ function createPadding(length, chars) { chars = chars === undefined ? ' ' : baseToString(chars); var charsLength = chars.length; if (charsLength < 2) { return charsLength ? baseRepeat(chars, length) : chars; } var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); return hasUnicode(chars) ? castSlice(stringToArray(result), 0, length).join('') : result.slice(0, length); } module.exports = createPadding; },{"./_baseRepeat":491,"./_baseToString":494,"./_castSlice":497,"./_hasUnicode":511,"./_stringSize":546,"./_stringToArray":547}],500:[function(require,module,exports){ var SetCache = require('./_SetCache'), arraySome = require('./_arraySome'), cacheHas = require('./_cacheHas'); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * A specialized version of `baseIsEqualDeep` for arrays with support for * partial deep comparisons. * * @private * @param {Array} array The array to compare. * @param {Array} other The other array to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `array` and `other` objects. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; if (arrLength != othLength && !(isPartial && othLength > arrLength)) { return false; } // Check that cyclic values are equal. var arrStacked = stack.get(array); var othStacked = stack.get(other); if (arrStacked && othStacked) { return arrStacked == other && othStacked == array; } var index = -1, result = true, seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; stack.set(array, other); stack.set(other, array); // Ignore non-index properties. while (++index < arrLength) { var arrValue = array[index], othValue = other[index]; if (customizer) { var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); } if (compared !== undefined) { if (compared) { continue; } result = false; break; } // Recursively compare arrays (susceptible to call stack limits). if (seen) { if (!arraySome(other, function(othValue, othIndex) { if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { return seen.push(othIndex); } })) { result = false; break; } } else if (!( arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack) )) { result = false; break; } } stack['delete'](array); stack['delete'](other); return result; } module.exports = equalArrays; },{"./_SetCache":469,"./_arraySome":478,"./_cacheHas":496}],501:[function(require,module,exports){ var Symbol = require('./_Symbol'), Uint8Array = require('./_Uint8Array'), eq = require('./eq'), equalArrays = require('./_equalArrays'), mapToArray = require('./_mapToArray'), setToArray = require('./_setToArray'); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** `Object#toString` result references. */ var boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', mapTag = '[object Map]', numberTag = '[object Number]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', symbolTag = '[object Symbol]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]'; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; /** * A specialized version of `baseIsEqualDeep` for comparing objects of * the same `toStringTag`. * * **Note:** This function only supports comparing values with tags of * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {string} tag The `toStringTag` of the objects to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { switch (tag) { case dataViewTag: if ((object.byteLength != other.byteLength) || (object.byteOffset != other.byteOffset)) { return false; } object = object.buffer; other = other.buffer; case arrayBufferTag: if ((object.byteLength != other.byteLength) || !equalFunc(new Uint8Array(object), new Uint8Array(other))) { return false; } return true; case boolTag: case dateTag: case numberTag: // Coerce booleans to `1` or `0` and dates to milliseconds. // Invalid dates are coerced to `NaN`. return eq(+object, +other); case errorTag: return object.name == other.name && object.message == other.message; case regexpTag: case stringTag: // Coerce regexes to strings and treat strings, primitives and objects, // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring // for more details. return object == (other + ''); case mapTag: var convert = mapToArray; case setTag: var isPartial = bitmask & COMPARE_PARTIAL_FLAG; convert || (convert = setToArray); if (object.size != other.size && !isPartial) { return false; } // Assume cyclic values are equal. var stacked = stack.get(object); if (stacked) { return stacked == other; } bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits). stack.set(object, other); var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); stack['delete'](object); return result; case symbolTag: if (symbolValueOf) { return symbolValueOf.call(object) == symbolValueOf.call(other); } } return false; } module.exports = equalByTag; },{"./_Symbol":471,"./_Uint8Array":472,"./_equalArrays":500,"./_mapToArray":531,"./_setToArray":540,"./eq":552}],502:[function(require,module,exports){ var getAllKeys = require('./_getAllKeys'); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * A specialized version of `baseIsEqualDeep` for objects with support for * partial deep comparisons. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; if (objLength != othLength && !isPartial) { return false; } var index = objLength; while (index--) { var key = objProps[index]; if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { return false; } } // Check that cyclic values are equal. var objStacked = stack.get(object); var othStacked = stack.get(other); if (objStacked && othStacked) { return objStacked == other && othStacked == object; } var result = true; stack.set(object, other); stack.set(other, object); var skipCtor = isPartial; while (++index < objLength) { key = objProps[index]; var objValue = object[key], othValue = other[key]; if (customizer) { var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); } // Recursively compare objects (susceptible to call stack limits). if (!(compared === undefined ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) : compared )) { result = false; break; } skipCtor || (skipCtor = key == 'constructor'); } if (result && !skipCtor) { var objCtor = object.constructor, othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal. if (objCtor != othCtor && ('constructor' in object && 'constructor' in other) && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) { result = false; } } stack['delete'](object); stack['delete'](other); return result; } module.exports = equalObjects; },{"./_getAllKeys":504}],503:[function(require,module,exports){ (function (global){ /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; module.exports = freeGlobal; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],504:[function(require,module,exports){ var baseGetAllKeys = require('./_baseGetAllKeys'), getSymbols = require('./_getSymbols'), keys = require('./keys'); /** * Creates an array of own enumerable property names and symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeys(object) { return baseGetAllKeys(object, keys, getSymbols); } module.exports = getAllKeys; },{"./_baseGetAllKeys":482,"./_getSymbols":508,"./keys":564}],505:[function(require,module,exports){ var isKeyable = require('./_isKeyable'); /** * Gets the data for `map`. * * @private * @param {Object} map The map to query. * @param {string} key The reference key. * @returns {*} Returns the map data. */ function getMapData(map, key) { var data = map.__data__; return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map; } module.exports = getMapData; },{"./_isKeyable":518}],506:[function(require,module,exports){ var baseIsNative = require('./_baseIsNative'), getValue = require('./_getValue'); /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = getValue(object, key); return baseIsNative(value) ? value : undefined; } module.exports = getNative; },{"./_baseIsNative":487,"./_getValue":510}],507:[function(require,module,exports){ var Symbol = require('./_Symbol'); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; try { value[symToStringTag] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString.call(value); if (unmasked) { if (isOwn) { value[symToStringTag] = tag; } else { delete value[symToStringTag]; } } return result; } module.exports = getRawTag; },{"./_Symbol":471}],508:[function(require,module,exports){ var arrayFilter = require('./_arrayFilter'), stubArray = require('./stubArray'); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeGetSymbols = Object.getOwnPropertySymbols; /** * Creates an array of the own enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbols = !nativeGetSymbols ? stubArray : function(object) { if (object == null) { return []; } object = Object(object); return arrayFilter(nativeGetSymbols(object), function(symbol) { return propertyIsEnumerable.call(object, symbol); }); }; module.exports = getSymbols; },{"./_arrayFilter":474,"./stubArray":568}],509:[function(require,module,exports){ var DataView = require('./_DataView'), Map = require('./_Map'), Promise = require('./_Promise'), Set = require('./_Set'), WeakMap = require('./_WeakMap'), baseGetTag = require('./_baseGetTag'), toSource = require('./_toSource'); /** `Object#toString` result references. */ var mapTag = '[object Map]', objectTag = '[object Object]', promiseTag = '[object Promise]', setTag = '[object Set]', weakMapTag = '[object WeakMap]'; var dataViewTag = '[object DataView]'; /** Used to detect maps, sets, and weakmaps. */ var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap); /** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || (Map && getTag(new Map) != mapTag) || (Promise && getTag(Promise.resolve()) != promiseTag) || (Set && getTag(new Set) != setTag) || (WeakMap && getTag(new WeakMap) != weakMapTag)) { getTag = function(value) { var result = baseGetTag(value), Ctor = result == objectTag ? value.constructor : undefined, ctorString = Ctor ? toSource(Ctor) : ''; if (ctorString) { switch (ctorString) { case dataViewCtorString: return dataViewTag; case mapCtorString: return mapTag; case promiseCtorString: return promiseTag; case setCtorString: return setTag; case weakMapCtorString: return weakMapTag; } } return result; }; } module.exports = getTag; },{"./_DataView":462,"./_Map":465,"./_Promise":467,"./_Set":468,"./_WeakMap":473,"./_baseGetTag":483,"./_toSource":548}],510:[function(require,module,exports){ /** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function getValue(object, key) { return object == null ? undefined : object[key]; } module.exports = getValue; },{}],511:[function(require,module,exports){ /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', rsComboMarksRange = '\\u0300-\\u036f', reComboHalfMarksRange = '\\ufe20-\\ufe2f', rsComboSymbolsRange = '\\u20d0-\\u20ff', rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsZWJ = '\\u200d'; /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); /** * Checks if `string` contains Unicode symbols. * * @private * @param {string} string The string to inspect. * @returns {boolean} Returns `true` if a symbol is found, else `false`. */ function hasUnicode(string) { return reHasUnicode.test(string); } module.exports = hasUnicode; },{}],512:[function(require,module,exports){ var nativeCreate = require('./_nativeCreate'); /** * Removes all key-value entries from the hash. * * @private * @name clear * @memberOf Hash */ function hashClear() { this.__data__ = nativeCreate ? nativeCreate(null) : {}; this.size = 0; } module.exports = hashClear; },{"./_nativeCreate":532}],513:[function(require,module,exports){ /** * Removes `key` and its value from the hash. * * @private * @name delete * @memberOf Hash * @param {Object} hash The hash to modify. * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function hashDelete(key) { var result = this.has(key) && delete this.__data__[key]; this.size -= result ? 1 : 0; return result; } module.exports = hashDelete; },{}],514:[function(require,module,exports){ var nativeCreate = require('./_nativeCreate'); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Gets the hash value for `key`. * * @private * @name get * @memberOf Hash * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function hashGet(key) { var data = this.__data__; if (nativeCreate) { var result = data[key]; return result === HASH_UNDEFINED ? undefined : result; } return hasOwnProperty.call(data, key) ? data[key] : undefined; } module.exports = hashGet; },{"./_nativeCreate":532}],515:[function(require,module,exports){ var nativeCreate = require('./_nativeCreate'); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Checks if a hash value for `key` exists. * * @private * @name has * @memberOf Hash * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function hashHas(key) { var data = this.__data__; return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); } module.exports = hashHas; },{"./_nativeCreate":532}],516:[function(require,module,exports){ var nativeCreate = require('./_nativeCreate'); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * Sets the hash `key` to `value`. * * @private * @name set * @memberOf Hash * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the hash instance. */ function hashSet(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; return this; } module.exports = hashSet; },{"./_nativeCreate":532}],517:[function(require,module,exports){ /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; /** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { var type = typeof value; length = length == null ? MAX_SAFE_INTEGER : length; return !!length && (type == 'number' || (type != 'symbol' && reIsUint.test(value))) && (value > -1 && value % 1 == 0 && value < length); } module.exports = isIndex; },{}],518:[function(require,module,exports){ /** * Checks if `value` is suitable for use as unique object key. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is suitable, else `false`. */ function isKeyable(value) { var type = typeof value; return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') ? (value !== '__proto__') : (value === null); } module.exports = isKeyable; },{}],519:[function(require,module,exports){ var coreJsData = require('./_coreJsData'); /** Used to detect methods masquerading as native. */ var maskSrcKey = (function() { var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); return uid ? ('Symbol(src)_1.' + uid) : ''; }()); /** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */ function isMasked(func) { return !!maskSrcKey && (maskSrcKey in func); } module.exports = isMasked; },{"./_coreJsData":498}],520:[function(require,module,exports){ /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */ function isPrototype(value) { var Ctor = value && value.constructor, proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; return value === proto; } module.exports = isPrototype; },{}],521:[function(require,module,exports){ /** * Removes all key-value entries from the list cache. * * @private * @name clear * @memberOf ListCache */ function listCacheClear() { this.__data__ = []; this.size = 0; } module.exports = listCacheClear; },{}],522:[function(require,module,exports){ var assocIndexOf = require('./_assocIndexOf'); /** Used for built-in method references. */ var arrayProto = Array.prototype; /** Built-in value references. */ var splice = arrayProto.splice; /** * Removes `key` and its value from the list cache. * * @private * @name delete * @memberOf ListCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function listCacheDelete(key) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { return false; } var lastIndex = data.length - 1; if (index == lastIndex) { data.pop(); } else { splice.call(data, index, 1); } --this.size; return true; } module.exports = listCacheDelete; },{"./_assocIndexOf":481}],523:[function(require,module,exports){ var assocIndexOf = require('./_assocIndexOf'); /** * Gets the list cache value for `key`. * * @private * @name get * @memberOf ListCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function listCacheGet(key) { var data = this.__data__, index = assocIndexOf(data, key); return index < 0 ? undefined : data[index][1]; } module.exports = listCacheGet; },{"./_assocIndexOf":481}],524:[function(require,module,exports){ var assocIndexOf = require('./_assocIndexOf'); /** * Checks if a list cache value for `key` exists. * * @private * @name has * @memberOf ListCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function listCacheHas(key) { return assocIndexOf(this.__data__, key) > -1; } module.exports = listCacheHas; },{"./_assocIndexOf":481}],525:[function(require,module,exports){ var assocIndexOf = require('./_assocIndexOf'); /** * Sets the list cache `key` to `value`. * * @private * @name set * @memberOf ListCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the list cache instance. */ function listCacheSet(key, value) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } module.exports = listCacheSet; },{"./_assocIndexOf":481}],526:[function(require,module,exports){ var Hash = require('./_Hash'), ListCache = require('./_ListCache'), Map = require('./_Map'); /** * Removes all key-value entries from the map. * * @private * @name clear * @memberOf MapCache */ function mapCacheClear() { this.size = 0; this.__data__ = { 'hash': new Hash, 'map': new (Map || ListCache), 'string': new Hash }; } module.exports = mapCacheClear; },{"./_Hash":463,"./_ListCache":464,"./_Map":465}],527:[function(require,module,exports){ var getMapData = require('./_getMapData'); /** * Removes `key` and its value from the map. * * @private * @name delete * @memberOf MapCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function mapCacheDelete(key) { var result = getMapData(this, key)['delete'](key); this.size -= result ? 1 : 0; return result; } module.exports = mapCacheDelete; },{"./_getMapData":505}],528:[function(require,module,exports){ var getMapData = require('./_getMapData'); /** * Gets the map value for `key`. * * @private * @name get * @memberOf MapCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function mapCacheGet(key) { return getMapData(this, key).get(key); } module.exports = mapCacheGet; },{"./_getMapData":505}],529:[function(require,module,exports){ var getMapData = require('./_getMapData'); /** * Checks if a map value for `key` exists. * * @private * @name has * @memberOf MapCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function mapCacheHas(key) { return getMapData(this, key).has(key); } module.exports = mapCacheHas; },{"./_getMapData":505}],530:[function(require,module,exports){ var getMapData = require('./_getMapData'); /** * Sets the map `key` to `value`. * * @private * @name set * @memberOf MapCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the map cache instance. */ function mapCacheSet(key, value) { var data = getMapData(this, key), size = data.size; data.set(key, value); this.size += data.size == size ? 0 : 1; return this; } module.exports = mapCacheSet; },{"./_getMapData":505}],531:[function(require,module,exports){ /** * Converts `map` to its key-value pairs. * * @private * @param {Object} map The map to convert. * @returns {Array} Returns the key-value pairs. */ function mapToArray(map) { var index = -1, result = Array(map.size); map.forEach(function(value, key) { result[++index] = [key, value]; }); return result; } module.exports = mapToArray; },{}],532:[function(require,module,exports){ var getNative = require('./_getNative'); /* Built-in method references that are verified to be native. */ var nativeCreate = getNative(Object, 'create'); module.exports = nativeCreate; },{"./_getNative":506}],533:[function(require,module,exports){ var overArg = require('./_overArg'); /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeKeys = overArg(Object.keys, Object); module.exports = nativeKeys; },{"./_overArg":536}],534:[function(require,module,exports){ var freeGlobal = require('./_freeGlobal'); /** Detect free variable `exports`. */ var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Detect free variable `process` from Node.js. */ var freeProcess = moduleExports && freeGlobal.process; /** Used to access faster Node.js helpers. */ var nodeUtil = (function() { try { // Use `util.types` for Node.js 10+. var types = freeModule && freeModule.require && freeModule.require('util').types; if (types) { return types; } // Legacy `process.binding('util')` for Node.js < 10. return freeProcess && freeProcess.binding && freeProcess.binding('util'); } catch (e) {} }()); module.exports = nodeUtil; },{"./_freeGlobal":503}],535:[function(require,module,exports){ /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString(value) { return nativeObjectToString.call(value); } module.exports = objectToString; },{}],536:[function(require,module,exports){ /** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */ function overArg(func, transform) { return function(arg) { return func(transform(arg)); }; } module.exports = overArg; },{}],537:[function(require,module,exports){ var freeGlobal = require('./_freeGlobal'); /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function('return this')(); module.exports = root; },{"./_freeGlobal":503}],538:[function(require,module,exports){ /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * Adds `value` to the array cache. * * @private * @name add * @memberOf SetCache * @alias push * @param {*} value The value to cache. * @returns {Object} Returns the cache instance. */ function setCacheAdd(value) { this.__data__.set(value, HASH_UNDEFINED); return this; } module.exports = setCacheAdd; },{}],539:[function(require,module,exports){ /** * Checks if `value` is in the array cache. * * @private * @name has * @memberOf SetCache * @param {*} value The value to search for. * @returns {number} Returns `true` if `value` is found, else `false`. */ function setCacheHas(value) { return this.__data__.has(value); } module.exports = setCacheHas; },{}],540:[function(require,module,exports){ /** * Converts `set` to an array of its values. * * @private * @param {Object} set The set to convert. * @returns {Array} Returns the values. */ function setToArray(set) { var index = -1, result = Array(set.size); set.forEach(function(value) { result[++index] = value; }); return result; } module.exports = setToArray; },{}],541:[function(require,module,exports){ var ListCache = require('./_ListCache'); /** * Removes all key-value entries from the stack. * * @private * @name clear * @memberOf Stack */ function stackClear() { this.__data__ = new ListCache; this.size = 0; } module.exports = stackClear; },{"./_ListCache":464}],542:[function(require,module,exports){ /** * Removes `key` and its value from the stack. * * @private * @name delete * @memberOf Stack * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function stackDelete(key) { var data = this.__data__, result = data['delete'](key); this.size = data.size; return result; } module.exports = stackDelete; },{}],543:[function(require,module,exports){ /** * Gets the stack value for `key`. * * @private * @name get * @memberOf Stack * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function stackGet(key) { return this.__data__.get(key); } module.exports = stackGet; },{}],544:[function(require,module,exports){ /** * Checks if a stack value for `key` exists. * * @private * @name has * @memberOf Stack * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function stackHas(key) { return this.__data__.has(key); } module.exports = stackHas; },{}],545:[function(require,module,exports){ var ListCache = require('./_ListCache'), Map = require('./_Map'), MapCache = require('./_MapCache'); /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** * Sets the stack `key` to `value`. * * @private * @name set * @memberOf Stack * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the stack cache instance. */ function stackSet(key, value) { var data = this.__data__; if (data instanceof ListCache) { var pairs = data.__data__; if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { pairs.push([key, value]); this.size = ++data.size; return this; } data = this.__data__ = new MapCache(pairs); } data.set(key, value); this.size = data.size; return this; } module.exports = stackSet; },{"./_ListCache":464,"./_Map":465,"./_MapCache":466}],546:[function(require,module,exports){ var asciiSize = require('./_asciiSize'), hasUnicode = require('./_hasUnicode'), unicodeSize = require('./_unicodeSize'); /** * Gets the number of symbols in `string`. * * @private * @param {string} string The string to inspect. * @returns {number} Returns the string size. */ function stringSize(string) { return hasUnicode(string) ? unicodeSize(string) : asciiSize(string); } module.exports = stringSize; },{"./_asciiSize":479,"./_hasUnicode":511,"./_unicodeSize":549}],547:[function(require,module,exports){ var asciiToArray = require('./_asciiToArray'), hasUnicode = require('./_hasUnicode'), unicodeToArray = require('./_unicodeToArray'); /** * Converts `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function stringToArray(string) { return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); } module.exports = stringToArray; },{"./_asciiToArray":480,"./_hasUnicode":511,"./_unicodeToArray":550}],548:[function(require,module,exports){ /** Used for built-in method references. */ var funcProto = Function.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** * Converts `func` to its source code. * * @private * @param {Function} func The function to convert. * @returns {string} Returns the source code. */ function toSource(func) { if (func != null) { try { return funcToString.call(func); } catch (e) {} try { return (func + ''); } catch (e) {} } return ''; } module.exports = toSource; },{}],549:[function(require,module,exports){ /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', rsComboMarksRange = '\\u0300-\\u036f', reComboHalfMarksRange = '\\ufe20-\\ufe2f', rsComboSymbolsRange = '\\u20d0-\\u20ff', rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsAstral = '[' + rsAstralRange + ']', rsCombo = '[' + rsComboRange + ']', rsFitz = '\\ud83c[\\udffb-\\udfff]', rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', rsNonAstral = '[^' + rsAstralRange + ']', rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', rsZWJ = '\\u200d'; /** Used to compose unicode regexes. */ var reOptMod = rsModifier + '?', rsOptVar = '[' + rsVarRange + ']?', rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', rsSeq = rsOptVar + reOptMod + rsOptJoin, rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); /** * Gets the size of a Unicode `string`. * * @private * @param {string} string The string inspect. * @returns {number} Returns the string size. */ function unicodeSize(string) { var result = reUnicode.lastIndex = 0; while (reUnicode.test(string)) { ++result; } return result; } module.exports = unicodeSize; },{}],550:[function(require,module,exports){ /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', rsComboMarksRange = '\\u0300-\\u036f', reComboHalfMarksRange = '\\ufe20-\\ufe2f', rsComboSymbolsRange = '\\u20d0-\\u20ff', rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsAstral = '[' + rsAstralRange + ']', rsCombo = '[' + rsComboRange + ']', rsFitz = '\\ud83c[\\udffb-\\udfff]', rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', rsNonAstral = '[^' + rsAstralRange + ']', rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', rsZWJ = '\\u200d'; /** Used to compose unicode regexes. */ var reOptMod = rsModifier + '?', rsOptVar = '[' + rsVarRange + ']?', rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', rsSeq = rsOptVar + reOptMod + rsOptJoin, rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); /** * Converts a Unicode `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function unicodeToArray(string) { return string.match(reUnicode) || []; } module.exports = unicodeToArray; },{}],551:[function(require,module,exports){ var isObject = require('./isObject'), now = require('./now'), toNumber = require('./toNumber'); /** Error message constants. */ var FUNC_ERROR_TEXT = 'Expected a function'; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeMax = Math.max, nativeMin = Math.min; /** * Creates a debounced function that delays invoking `func` until after `wait` * milliseconds have elapsed since the last time the debounced function was * invoked. The debounced function comes with a `cancel` method to cancel * delayed `func` invocations and a `flush` method to immediately invoke them. * Provide `options` to indicate whether `func` should be invoked on the * leading and/or trailing edge of the `wait` timeout. The `func` is invoked * with the last arguments provided to the debounced function. Subsequent * calls to the debounced function return the result of the last `func` * invocation. * * **Note:** If `leading` and `trailing` options are `true`, `func` is * invoked on the trailing edge of the timeout only if the debounced function * is invoked more than once during the `wait` timeout. * * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred * until to the next tick, similar to `setTimeout` with a timeout of `0`. * * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) * for details over the differences between `_.debounce` and `_.throttle`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to debounce. * @param {number} [wait=0] The number of milliseconds to delay. * @param {Object} [options={}] The options object. * @param {boolean} [options.leading=false] * Specify invoking on the leading edge of the timeout. * @param {number} [options.maxWait] * The maximum time `func` is allowed to be delayed before it's invoked. * @param {boolean} [options.trailing=true] * Specify invoking on the trailing edge of the timeout. * @returns {Function} Returns the new debounced function. * @example * * // Avoid costly calculations while the window size is in flux. * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); * * // Invoke `sendMail` when clicked, debouncing subsequent calls. * jQuery(element).on('click', _.debounce(sendMail, 300, { * 'leading': true, * 'trailing': false * })); * * // Ensure `batchLog` is invoked once after 1 second of debounced calls. * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); * var source = new EventSource('/stream'); * jQuery(source).on('message', debounced); * * // Cancel the trailing debounced invocation. * jQuery(window).on('popstate', debounced.cancel); */ function debounce(func, wait, options) { var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true; if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } wait = toNumber(wait) || 0; if (isObject(options)) { leading = !!options.leading; maxing = 'maxWait' in options; maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; trailing = 'trailing' in options ? !!options.trailing : trailing; } function invokeFunc(time) { var args = lastArgs, thisArg = lastThis; lastArgs = lastThis = undefined; lastInvokeTime = time; result = func.apply(thisArg, args); return result; } function leadingEdge(time) { // Reset any `maxWait` timer. lastInvokeTime = time; // Start the timer for the trailing edge. timerId = setTimeout(timerExpired, wait); // Invoke the leading edge. return leading ? invokeFunc(time) : result; } function remainingWait(time) { var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall; return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; } function shouldInvoke(time) { var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the // trailing edge, the system time has gone backwards and we're treating // it as the trailing edge, or we've hit the `maxWait` limit. return (lastCallTime === undefined || (timeSinceLastCall >= wait) || (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); } function timerExpired() { var time = now(); if (shouldInvoke(time)) { return trailingEdge(time); } // Restart the timer. timerId = setTimeout(timerExpired, remainingWait(time)); } function trailingEdge(time) { timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been // debounced at least once. if (trailing && lastArgs) { return invokeFunc(time); } lastArgs = lastThis = undefined; return result; } function cancel() { if (timerId !== undefined) { clearTimeout(timerId); } lastInvokeTime = 0; lastArgs = lastCallTime = lastThis = timerId = undefined; } function flush() { return timerId === undefined ? result : trailingEdge(now()); } function debounced() { var time = now(), isInvoking = shouldInvoke(time); lastArgs = arguments; lastThis = this; lastCallTime = time; if (isInvoking) { if (timerId === undefined) { return leadingEdge(lastCallTime); } if (maxing) { // Handle invocations in a tight loop. clearTimeout(timerId); timerId = setTimeout(timerExpired, wait); return invokeFunc(lastCallTime); } } if (timerId === undefined) { timerId = setTimeout(timerExpired, wait); } return result; } debounced.cancel = cancel; debounced.flush = flush; return debounced; } module.exports = debounce; },{"./isObject":560,"./now":565,"./toNumber":572}],552:[function(require,module,exports){ /** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */ function eq(value, other) { return value === other || (value !== value && other !== other); } module.exports = eq; },{}],553:[function(require,module,exports){ var baseIsArguments = require('./_baseIsArguments'), isObjectLike = require('./isObjectLike'); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */ var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); }; module.exports = isArguments; },{"./_baseIsArguments":484,"./isObjectLike":561}],554:[function(require,module,exports){ /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; module.exports = isArray; },{}],555:[function(require,module,exports){ var isFunction = require('./isFunction'), isLength = require('./isLength'); /** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return value != null && isLength(value.length) && !isFunction(value); } module.exports = isArrayLike; },{"./isFunction":558,"./isLength":559}],556:[function(require,module,exports){ var root = require('./_root'), stubFalse = require('./stubFalse'); /** Detect free variable `exports`. */ var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Built-in value references. */ var Buffer = moduleExports ? root.Buffer : undefined; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; /** * Checks if `value` is a buffer. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * * _.isBuffer(new Buffer(2)); * // => true * * _.isBuffer(new Uint8Array(2)); * // => false */ var isBuffer = nativeIsBuffer || stubFalse; module.exports = isBuffer; },{"./_root":537,"./stubFalse":569}],557:[function(require,module,exports){ var baseIsEqual = require('./_baseIsEqual'); /** * Performs a deep comparison between two values to determine if they are * equivalent. * * **Note:** This method supports comparing arrays, array buffers, booleans, * date objects, error objects, maps, numbers, `Object` objects, regexes, * sets, strings, symbols, and typed arrays. `Object` objects are compared * by their own, not inherited, enumerable properties. Functions and DOM * nodes are compared by strict equality, i.e. `===`. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.isEqual(object, other); * // => true * * object === other; * // => false */ function isEqual(value, other) { return baseIsEqual(value, other); } module.exports = isEqual; },{"./_baseIsEqual":485}],558:[function(require,module,exports){ var baseGetTag = require('./_baseGetTag'), isObject = require('./isObject'); /** `Object#toString` result references. */ var asyncTag = '[object AsyncFunction]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', proxyTag = '[object Proxy]'; /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { if (!isObject(value)) { return false; } // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 9 which returns 'object' for typed arrays and other constructors. var tag = baseGetTag(value); return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; } module.exports = isFunction; },{"./_baseGetTag":483,"./isObject":560}],559:[function(require,module,exports){ /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } module.exports = isLength; },{}],560:[function(require,module,exports){ /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return value != null && (type == 'object' || type == 'function'); } module.exports = isObject; },{}],561:[function(require,module,exports){ /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return value != null && typeof value == 'object'; } module.exports = isObjectLike; },{}],562:[function(require,module,exports){ var baseGetTag = require('./_baseGetTag'), isObjectLike = require('./isObjectLike'); /** `Object#toString` result references. */ var symbolTag = '[object Symbol]'; /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol(value) { return typeof value == 'symbol' || (isObjectLike(value) && baseGetTag(value) == symbolTag); } module.exports = isSymbol; },{"./_baseGetTag":483,"./isObjectLike":561}],563:[function(require,module,exports){ var baseIsTypedArray = require('./_baseIsTypedArray'), baseUnary = require('./_baseUnary'), nodeUtil = require('./_nodeUtil'); /* Node.js helper references. */ var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; /** * Checks if `value` is classified as a typed array. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. * @example * * _.isTypedArray(new Uint8Array); * // => true * * _.isTypedArray([]); * // => false */ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; module.exports = isTypedArray; },{"./_baseIsTypedArray":488,"./_baseUnary":495,"./_nodeUtil":534}],564:[function(require,module,exports){ var arrayLikeKeys = require('./_arrayLikeKeys'), baseKeys = require('./_baseKeys'), isArrayLike = require('./isArrayLike'); /** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * for more details. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */ function keys(object) { return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); } module.exports = keys; },{"./_arrayLikeKeys":475,"./_baseKeys":489,"./isArrayLike":555}],565:[function(require,module,exports){ var root = require('./_root'); /** * Gets the timestamp of the number of milliseconds that have elapsed since * the Unix epoch (1 January 1970 00:00:00 UTC). * * @static * @memberOf _ * @since 2.4.0 * @category Date * @returns {number} Returns the timestamp. * @example * * _.defer(function(stamp) { * console.log(_.now() - stamp); * }, _.now()); * // => Logs the number of milliseconds it took for the deferred invocation. */ var now = function() { return root.Date.now(); }; module.exports = now; },{"./_root":537}],566:[function(require,module,exports){ var createPadding = require('./_createPadding'), stringSize = require('./_stringSize'), toInteger = require('./toInteger'), toString = require('./toString'); /** * Pads `string` on the right side if it's shorter than `length`. Padding * characters are truncated if they exceed `length`. * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to pad. * @param {number} [length=0] The padding length. * @param {string} [chars=' '] The string used as padding. * @returns {string} Returns the padded string. * @example * * _.padEnd('abc', 6); * // => 'abc ' * * _.padEnd('abc', 6, '_-'); * // => 'abc_-_' * * _.padEnd('abc', 3); * // => 'abc' */ function padEnd(string, length, chars) { string = toString(string); length = toInteger(length); var strLength = length ? stringSize(string) : 0; return (length && strLength < length) ? (string + createPadding(length - strLength, chars)) : string; } module.exports = padEnd; },{"./_createPadding":499,"./_stringSize":546,"./toInteger":571,"./toString":573}],567:[function(require,module,exports){ var createPadding = require('./_createPadding'), stringSize = require('./_stringSize'), toInteger = require('./toInteger'), toString = require('./toString'); /** * Pads `string` on the left side if it's shorter than `length`. Padding * characters are truncated if they exceed `length`. * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to pad. * @param {number} [length=0] The padding length. * @param {string} [chars=' '] The string used as padding. * @returns {string} Returns the padded string. * @example * * _.padStart('abc', 6); * // => ' abc' * * _.padStart('abc', 6, '_-'); * // => '_-_abc' * * _.padStart('abc', 3); * // => 'abc' */ function padStart(string, length, chars) { string = toString(string); length = toInteger(length); var strLength = length ? stringSize(string) : 0; return (length && strLength < length) ? (createPadding(length - strLength, chars) + string) : string; } module.exports = padStart; },{"./_createPadding":499,"./_stringSize":546,"./toInteger":571,"./toString":573}],568:[function(require,module,exports){ /** * This method returns a new empty array. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {Array} Returns the new empty array. * @example * * var arrays = _.times(2, _.stubArray); * * console.log(arrays); * // => [[], []] * * console.log(arrays[0] === arrays[1]); * // => false */ function stubArray() { return []; } module.exports = stubArray; },{}],569:[function(require,module,exports){ /** * This method returns `false`. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {boolean} Returns `false`. * @example * * _.times(2, _.stubFalse); * // => [false, false] */ function stubFalse() { return false; } module.exports = stubFalse; },{}],570:[function(require,module,exports){ var toNumber = require('./toNumber'); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0, MAX_INTEGER = 1.7976931348623157e+308; /** * Converts `value` to a finite number. * * @static * @memberOf _ * @since 4.12.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted number. * @example * * _.toFinite(3.2); * // => 3.2 * * _.toFinite(Number.MIN_VALUE); * // => 5e-324 * * _.toFinite(Infinity); * // => 1.7976931348623157e+308 * * _.toFinite('3.2'); * // => 3.2 */ function toFinite(value) { if (!value) { return value === 0 ? value : 0; } value = toNumber(value); if (value === INFINITY || value === -INFINITY) { var sign = (value < 0 ? -1 : 1); return sign * MAX_INTEGER; } return value === value ? value : 0; } module.exports = toFinite; },{"./toNumber":572}],571:[function(require,module,exports){ var toFinite = require('./toFinite'); /** * Converts `value` to an integer. * * **Note:** This method is loosely based on * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toInteger(3.2); * // => 3 * * _.toInteger(Number.MIN_VALUE); * // => 0 * * _.toInteger(Infinity); * // => 1.7976931348623157e+308 * * _.toInteger('3.2'); * // => 3 */ function toInteger(value) { var result = toFinite(value), remainder = result % 1; return result === result ? (remainder ? result - remainder : result) : 0; } module.exports = toInteger; },{"./toFinite":570}],572:[function(require,module,exports){ var isObject = require('./isObject'), isSymbol = require('./isSymbol'); /** Used as references for various `Number` constants. */ var NAN = 0 / 0; /** Used to match leading and trailing whitespace. */ var reTrim = /^\s+|\s+$/g; /** Used to detect bad signed hexadecimal string values. */ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; /** Used to detect binary string values. */ var reIsBinary = /^0b[01]+$/i; /** Used to detect octal string values. */ var reIsOctal = /^0o[0-7]+$/i; /** Built-in method references without a dependency on `root`. */ var freeParseInt = parseInt; /** * Converts `value` to a number. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to process. * @returns {number} Returns the number. * @example * * _.toNumber(3.2); * // => 3.2 * * _.toNumber(Number.MIN_VALUE); * // => 5e-324 * * _.toNumber(Infinity); * // => Infinity * * _.toNumber('3.2'); * // => 3.2 */ function toNumber(value) { if (typeof value == 'number') { return value; } if (isSymbol(value)) { return NAN; } if (isObject(value)) { var other = typeof value.valueOf == 'function' ? value.valueOf() : value; value = isObject(other) ? (other + '') : other; } if (typeof value != 'string') { return value === 0 ? value : +value; } value = value.replace(reTrim, ''); var isBinary = reIsBinary.test(value); return (isBinary || reIsOctal.test(value)) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : (reIsBadHex.test(value) ? NAN : +value); } module.exports = toNumber; },{"./isObject":560,"./isSymbol":562}],573:[function(require,module,exports){ var baseToString = require('./_baseToString'); /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? '' : baseToString(value); } module.exports = toString; },{"./_baseToString":494}],574:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); var React = __importStar(require("react")); exports.MiniStoreContext = React.createContext(null); var Provider = /** @class */ (function (_super) { __extends(Provider, _super); function Provider() { return _super !== null && _super.apply(this, arguments) || this; } Provider.prototype.render = function () { return (React.createElement(exports.MiniStoreContext.Provider, { value: this.props.store }, this.props.children)); }; return Provider; }(React.Component)); exports.Provider = Provider; },{"react":"react"}],575:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var React = __importStar(require("react")); var shallowequal_1 = __importDefault(require("shallowequal")); var hoist_non_react_statics_1 = __importDefault(require("hoist-non-react-statics")); var Provider_1 = require("./Provider"); function getDisplayName(WrappedComponent) { return WrappedComponent.displayName || WrappedComponent.name || 'Component'; } var defaultMapStateToProps = function () { return ({}); }; function connect(mapStateToProps, options) { if (options === void 0) { options = {}; } var shouldSubscribe = !!mapStateToProps; var finalMapStateToProps = mapStateToProps || defaultMapStateToProps; return function wrapWithConnect(WrappedComponent) { var Connect = /** @class */ (function (_super) { __extends(Connect, _super); function Connect(props, context) { var _this = _super.call(this, props, context) || this; _this.unsubscribe = null; _this.handleChange = function () { if (!_this.unsubscribe) { return; } var nextState = finalMapStateToProps(_this.store.getState(), _this.props); _this.setState({ subscribed: nextState }); }; _this.store = _this.context; _this.state = { subscribed: finalMapStateToProps(_this.store.getState(), props), store: _this.store, props: props, }; return _this; } Connect.getDerivedStateFromProps = function (props, prevState) { // using ownProps if (mapStateToProps && mapStateToProps.length === 2 && props !== prevState.props) { return { subscribed: finalMapStateToProps(prevState.store.getState(), props), props: props, }; } return { props: props }; }; Connect.prototype.componentDidMount = function () { this.trySubscribe(); }; Connect.prototype.componentWillUnmount = function () { this.tryUnsubscribe(); }; Connect.prototype.shouldComponentUpdate = function (nextProps, nextState) { return (!shallowequal_1.default(this.props, nextProps) || !shallowequal_1.default(this.state.subscribed, nextState.subscribed)); }; Connect.prototype.trySubscribe = function () { if (shouldSubscribe) { this.unsubscribe = this.store.subscribe(this.handleChange); this.handleChange(); } }; Connect.prototype.tryUnsubscribe = function () { if (this.unsubscribe) { this.unsubscribe(); this.unsubscribe = null; } }; Connect.prototype.render = function () { var props = __assign(__assign(__assign({}, this.props), this.state.subscribed), { store: this.store }); return React.createElement(WrappedComponent, __assign({}, props, { ref: this.props.miniStoreForwardedRef })); }; Connect.displayName = "Connect(" + getDisplayName(WrappedComponent) + ")"; Connect.contextType = Provider_1.MiniStoreContext; return Connect; }(React.Component)); if (options.forwardRef) { var forwarded = React.forwardRef(function (props, ref) { return React.createElement(Connect, __assign({}, props, { miniStoreForwardedRef: ref })); }); return hoist_non_react_statics_1.default(forwarded, WrappedComponent); } return hoist_non_react_statics_1.default(Connect, WrappedComponent); }; } exports.connect = connect; },{"./Provider":574,"hoist-non-react-statics":459,"react":"react","shallowequal":901}],576:[function(require,module,exports){ "use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); function create(initialState) { var state = initialState; var listeners = []; function setState(partial) { state = __assign(__assign({}, state), partial); for (var i = 0; i < listeners.length; i++) { listeners[i](); } } function getState() { return state; } function subscribe(listener) { listeners.push(listener); return function unsubscribe() { var index = listeners.indexOf(listener); listeners.splice(index, 1); }; } return { setState: setState, getState: getState, subscribe: subscribe, }; } exports.create = create; },{}],577:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Provider_1 = require("./Provider"); exports.Provider = Provider_1.Provider; var connect_1 = require("./connect"); exports.connect = connect_1.connect; var create_1 = require("./create"); exports.create = create_1.create; },{"./Provider":574,"./connect":575,"./create":576}],578:[function(require,module,exports){ //! moment.js //! version : 2.29.0 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com ;(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.moment = factory() }(this, (function () { 'use strict'; var hookCallback; function hooks() { return hookCallback.apply(null, arguments); } // This is done to register the method called with moment() // without creating circular dependencies. function setHookCallback(callback) { hookCallback = callback; } function isArray(input) { return ( input instanceof Array || Object.prototype.toString.call(input) === '[object Array]' ); } function isObject(input) { // IE8 will treat undefined and null as object if it wasn't for // input != null return ( input != null && Object.prototype.toString.call(input) === '[object Object]' ); } function hasOwnProp(a, b) { return Object.prototype.hasOwnProperty.call(a, b); } function isObjectEmpty(obj) { if (Object.getOwnPropertyNames) { return Object.getOwnPropertyNames(obj).length === 0; } else { var k; for (k in obj) { if (hasOwnProp(obj, k)) { return false; } } return true; } } function isUndefined(input) { return input === void 0; } function isNumber(input) { return ( typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]' ); } function isDate(input) { return ( input instanceof Date || Object.prototype.toString.call(input) === '[object Date]' ); } function map(arr, fn) { var res = [], i; for (i = 0; i < arr.length; ++i) { res.push(fn(arr[i], i)); } return res; } function extend(a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i] = b[i]; } } if (hasOwnProp(b, 'toString')) { a.toString = b.toString; } if (hasOwnProp(b, 'valueOf')) { a.valueOf = b.valueOf; } return a; } function createUTC(input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, true).utc(); } function defaultParsingFlags() { // We need to deep clone this object. return { empty: false, unusedTokens: [], unusedInput: [], overflow: -2, charsLeftOver: 0, nullInput: false, invalidEra: null, invalidMonth: null, invalidFormat: false, userInvalidated: false, iso: false, parsedDateParts: [], era: null, meridiem: null, rfc2822: false, weekdayMismatch: false, }; } function getParsingFlags(m) { if (m._pf == null) { m._pf = defaultParsingFlags(); } return m._pf; } var some; if (Array.prototype.some) { some = Array.prototype.some; } else { some = function (fun) { var t = Object(this), len = t.length >>> 0, i; for (i = 0; i < len; i++) { if (i in t && fun.call(this, t[i], i, t)) { return true; } } return false; }; } function isValid(m) { if (m._isValid == null) { var flags = getParsingFlags(m), parsedParts = some.call(flags.parsedDateParts, function (i) { return i != null; }), isNowValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || (flags.meridiem && parsedParts)); if (m._strict) { isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined; } if (Object.isFrozen == null || !Object.isFrozen(m)) { m._isValid = isNowValid; } else { return isNowValid; } } return m._isValid; } function createInvalid(flags) { var m = createUTC(NaN); if (flags != null) { extend(getParsingFlags(m), flags); } else { getParsingFlags(m).userInvalidated = true; } return m; } // Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. var momentProperties = (hooks.momentProperties = []), updateInProgress = false; function copyConfig(to, from) { var i, prop, val; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } if (!isUndefined(from._i)) { to._i = from._i; } if (!isUndefined(from._f)) { to._f = from._f; } if (!isUndefined(from._l)) { to._l = from._l; } if (!isUndefined(from._strict)) { to._strict = from._strict; } if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } if (!isUndefined(from._offset)) { to._offset = from._offset; } if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } if (!isUndefined(from._locale)) { to._locale = from._locale; } if (momentProperties.length > 0) { for (i = 0; i < momentProperties.length; i++) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { to[prop] = val; } } } return to; } // Moment prototype object function Moment(config) { copyConfig(this, config); this._d = new Date(config._d != null ? config._d.getTime() : NaN); if (!this.isValid()) { this._d = new Date(NaN); } // Prevent infinite loop in case updateOffset creates new moment // objects. if (updateInProgress === false) { updateInProgress = true; hooks.updateOffset(this); updateInProgress = false; } } function isMoment(obj) { return ( obj instanceof Moment || (obj != null && obj._isAMomentObject != null) ); } function warn(msg) { if ( hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn ) { console.warn('Deprecation warning: ' + msg); } } function deprecate(msg, fn) { var firstTime = true; return extend(function () { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(null, msg); } if (firstTime) { var args = [], arg, i, key; for (i = 0; i < arguments.length; i++) { arg = ''; if (typeof arguments[i] === 'object') { arg += '\n[' + i + '] '; for (key in arguments[0]) { if (hasOwnProp(arguments[0], key)) { arg += key + ': ' + arguments[0][key] + ', '; } } arg = arg.slice(0, -2); // Remove trailing comma and space } else { arg = arguments[i]; } args.push(arg); } warn( msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + new Error().stack ); firstTime = false; } return fn.apply(this, arguments); }, fn); } var deprecations = {}; function deprecateSimple(name, msg) { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(name, msg); } if (!deprecations[name]) { warn(msg); deprecations[name] = true; } } hooks.suppressDeprecationWarnings = false; hooks.deprecationHandler = null; function isFunction(input) { return ( (typeof Function !== 'undefined' && input instanceof Function) || Object.prototype.toString.call(input) === '[object Function]' ); } function set(config) { var prop, i; for (i in config) { if (hasOwnProp(config, i)) { prop = config[i]; if (isFunction(prop)) { this[i] = prop; } else { this['_' + i] = prop; } } } this._config = config; // Lenient ordinal parsing accepts just a number in addition to // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. // TODO: Remove "ordinalParse" fallback in next major release. this._dayOfMonthOrdinalParseLenient = new RegExp( (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + '|' + /\d{1,2}/.source ); } function mergeConfigs(parentConfig, childConfig) { var res = extend({}, parentConfig), prop; for (prop in childConfig) { if (hasOwnProp(childConfig, prop)) { if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { res[prop] = {}; extend(res[prop], parentConfig[prop]); extend(res[prop], childConfig[prop]); } else if (childConfig[prop] != null) { res[prop] = childConfig[prop]; } else { delete res[prop]; } } } for (prop in parentConfig) { if ( hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop]) ) { // make sure changes to properties don't modify parent config res[prop] = extend({}, res[prop]); } } return res; } function Locale(config) { if (config != null) { this.set(config); } } var keys; if (Object.keys) { keys = Object.keys; } else { keys = function (obj) { var i, res = []; for (i in obj) { if (hasOwnProp(obj, i)) { res.push(i); } } return res; }; } var defaultCalendar = { sameDay: '[Today at] LT', nextDay: '[Tomorrow at] LT', nextWeek: 'dddd [at] LT', lastDay: '[Yesterday at] LT', lastWeek: '[Last] dddd [at] LT', sameElse: 'L', }; function calendar(key, mom, now) { var output = this._calendar[key] || this._calendar['sameElse']; return isFunction(output) ? output.call(mom, now) : output; } function zeroFill(number, targetLength, forceSign) { var absNumber = '' + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign = number >= 0; return ( (sign ? (forceSign ? '+' : '') : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber ); } var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, formatFunctions = {}, formatTokenFunctions = {}; // token: 'M' // padded: ['MM', 2] // ordinal: 'Mo' // callback: function () { this.month() + 1 } function addFormatToken(token, padded, ordinal, callback) { var func = callback; if (typeof callback === 'string') { func = function () { return this[callback](); }; } if (token) { formatTokenFunctions[token] = func; } if (padded) { formatTokenFunctions[padded[0]] = function () { return zeroFill(func.apply(this, arguments), padded[1], padded[2]); }; } if (ordinal) { formatTokenFunctions[ordinal] = function () { return this.localeData().ordinal( func.apply(this, arguments), token ); }; } } function removeFormattingTokens(input) { if (input.match(/\[[\s\S]/)) { return input.replace(/^\[|\]$/g, ''); } return input.replace(/\\/g, ''); } function makeFormatFunction(format) { var array = format.match(formattingTokens), i, length; for (i = 0, length = array.length; i < length; i++) { if (formatTokenFunctions[array[i]]) { array[i] = formatTokenFunctions[array[i]]; } else { array[i] = removeFormattingTokens(array[i]); } } return function (mom) { var output = '', i; for (i = 0; i < length; i++) { output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; } return output; }; } // format date using native date object function formatMoment(m, format) { if (!m.isValid()) { return m.localeData().invalidDate(); } format = expandFormat(format, m.localeData()); formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); return formatFunctions[format](m); } function expandFormat(format, locale) { var i = 5; function replaceLongDateFormatTokens(input) { return locale.longDateFormat(input) || input; } localFormattingTokens.lastIndex = 0; while (i >= 0 && localFormattingTokens.test(format)) { format = format.replace( localFormattingTokens, replaceLongDateFormatTokens ); localFormattingTokens.lastIndex = 0; i -= 1; } return format; } var defaultLongDateFormat = { LTS: 'h:mm:ss A', LT: 'h:mm A', L: 'MM/DD/YYYY', LL: 'MMMM D, YYYY', LLL: 'MMMM D, YYYY h:mm A', LLLL: 'dddd, MMMM D, YYYY h:mm A', }; function longDateFormat(key) { var format = this._longDateFormat[key], formatUpper = this._longDateFormat[key.toUpperCase()]; if (format || !formatUpper) { return format; } this._longDateFormat[key] = formatUpper .match(formattingTokens) .map(function (tok) { if ( tok === 'MMMM' || tok === 'MM' || tok === 'DD' || tok === 'dddd' ) { return tok.slice(1); } return tok; }) .join(''); return this._longDateFormat[key]; } var defaultInvalidDate = 'Invalid date'; function invalidDate() { return this._invalidDate; } var defaultOrdinal = '%d', defaultDayOfMonthOrdinalParse = /\d{1,2}/; function ordinal(number) { return this._ordinal.replace('%d', number); } var defaultRelativeTime = { future: 'in %s', past: '%s ago', s: 'a few seconds', ss: '%d seconds', m: 'a minute', mm: '%d minutes', h: 'an hour', hh: '%d hours', d: 'a day', dd: '%d days', w: 'a week', ww: '%d weeks', M: 'a month', MM: '%d months', y: 'a year', yy: '%d years', }; function relativeTime(number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; return isFunction(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); } function pastFuture(diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; return isFunction(format) ? format(output) : format.replace(/%s/i, output); } var aliases = {}; function addUnitAlias(unit, shorthand) { var lowerCase = unit.toLowerCase(); aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; } function normalizeUnits(units) { return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; } function normalizeObjectUnits(inputObject) { var normalizedInput = {}, normalizedProp, prop; for (prop in inputObject) { if (hasOwnProp(inputObject, prop)) { normalizedProp = normalizeUnits(prop); if (normalizedProp) { normalizedInput[normalizedProp] = inputObject[prop]; } } } return normalizedInput; } var priorities = {}; function addUnitPriority(unit, priority) { priorities[unit] = priority; } function getPrioritizedUnits(unitsObj) { var units = [], u; for (u in unitsObj) { if (hasOwnProp(unitsObj, u)) { units.push({ unit: u, priority: priorities[u] }); } } units.sort(function (a, b) { return a.priority - b.priority; }); return units; } function isLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; } function absFloor(number) { if (number < 0) { // -0 -> 0 return Math.ceil(number) || 0; } else { return Math.floor(number); } } function toInt(argumentForCoercion) { var coercedNumber = +argumentForCoercion, value = 0; if (coercedNumber !== 0 && isFinite(coercedNumber)) { value = absFloor(coercedNumber); } return value; } function makeGetSet(unit, keepTime) { return function (value) { if (value != null) { set$1(this, unit, value); hooks.updateOffset(this, keepTime); return this; } else { return get(this, unit); } }; } function get(mom, unit) { return mom.isValid() ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; } function set$1(mom, unit, value) { if (mom.isValid() && !isNaN(value)) { if ( unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29 ) { value = toInt(value); mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit]( value, mom.month(), daysInMonth(value, mom.month()) ); } else { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); } } } // MOMENTS function stringGet(units) { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](); } return this; } function stringSet(units, value) { if (typeof units === 'object') { units = normalizeObjectUnits(units); var prioritized = getPrioritizedUnits(units), i; for (i = 0; i < prioritized.length; i++) { this[prioritized[i].unit](units[prioritized[i].unit]); } } else { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](value); } } return this; } var match1 = /\d/, // 0 - 9 match2 = /\d\d/, // 00 - 99 match3 = /\d{3}/, // 000 - 999 match4 = /\d{4}/, // 0000 - 9999 match6 = /[+-]?\d{6}/, // -999999 - 999999 match1to2 = /\d\d?/, // 0 - 99 match3to4 = /\d\d\d\d?/, // 999 - 9999 match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999 match1to3 = /\d{1,3}/, // 0 - 999 match1to4 = /\d{1,4}/, // 0 - 9999 match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999 matchUnsigned = /\d+/, // 0 - inf matchSigned = /[+-]?\d+/, // -inf - inf matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. // includes scottish gaelic two word and hyphenated months matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, regexes; regexes = {}; function addRegexToken(token, regex, strictRegex) { regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { return isStrict && strictRegex ? strictRegex : regex; }; } function getParseRegexForToken(token, config) { if (!hasOwnProp(regexes, token)) { return new RegExp(unescapeFormat(token)); } return regexes[token](config._strict, config._locale); } // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript function unescapeFormat(s) { return regexEscape( s .replace('\\', '') .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function ( matched, p1, p2, p3, p4 ) { return p1 || p2 || p3 || p4; }) ); } function regexEscape(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } var tokens = {}; function addParseToken(token, callback) { var i, func = callback; if (typeof token === 'string') { token = [token]; } if (isNumber(callback)) { func = function (input, array) { array[callback] = toInt(input); }; } for (i = 0; i < token.length; i++) { tokens[token[i]] = func; } } function addWeekParseToken(token, callback) { addParseToken(token, function (input, array, config, token) { config._w = config._w || {}; callback(input, config._w, config, token); }); } function addTimeToArrayFromToken(token, input, config) { if (input != null && hasOwnProp(tokens, token)) { tokens[token](input, config._a, config, token); } } var YEAR = 0, MONTH = 1, DATE = 2, HOUR = 3, MINUTE = 4, SECOND = 5, MILLISECOND = 6, WEEK = 7, WEEKDAY = 8; function mod(n, x) { return ((n % x) + x) % x; } var indexOf; if (Array.prototype.indexOf) { indexOf = Array.prototype.indexOf; } else { indexOf = function (o) { // I know var i; for (i = 0; i < this.length; ++i) { if (this[i] === o) { return i; } } return -1; }; } function daysInMonth(year, month) { if (isNaN(year) || isNaN(month)) { return NaN; } var modMonth = mod(month, 12); year += (month - modMonth) / 12; return modMonth === 1 ? isLeapYear(year) ? 29 : 28 : 31 - ((modMonth % 7) % 2); } // FORMATTING addFormatToken('M', ['MM', 2], 'Mo', function () { return this.month() + 1; }); addFormatToken('MMM', 0, 0, function (format) { return this.localeData().monthsShort(this, format); }); addFormatToken('MMMM', 0, 0, function (format) { return this.localeData().months(this, format); }); // ALIASES addUnitAlias('month', 'M'); // PRIORITY addUnitPriority('month', 8); // PARSING addRegexToken('M', match1to2); addRegexToken('MM', match1to2, match2); addRegexToken('MMM', function (isStrict, locale) { return locale.monthsShortRegex(isStrict); }); addRegexToken('MMMM', function (isStrict, locale) { return locale.monthsRegex(isStrict); }); addParseToken(['M', 'MM'], function (input, array) { array[MONTH] = toInt(input) - 1; }); addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { var month = config._locale.monthsParse(input, token, config._strict); // if we didn't find a month name, mark the date as invalid. if (month != null) { array[MONTH] = month; } else { getParsingFlags(config).invalidMonth = input; } }); // LOCALES var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split( '_' ), defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split( '_' ), MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, defaultMonthsShortRegex = matchWord, defaultMonthsRegex = matchWord; function localeMonths(m, format) { if (!m) { return isArray(this._months) ? this._months : this._months['standalone']; } return isArray(this._months) ? this._months[m.month()] : this._months[ (this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone' ][m.month()]; } function localeMonthsShort(m, format) { if (!m) { return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort['standalone']; } return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[ MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone' ][m.month()]; } function handleStrictParse(monthName, format, strict) { var i, ii, mom, llc = monthName.toLocaleLowerCase(); if (!this._monthsParse) { // this is not used this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; for (i = 0; i < 12; ++i) { mom = createUTC([2000, i]); this._shortMonthsParse[i] = this.monthsShort( mom, '' ).toLocaleLowerCase(); this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } } } function localeMonthsParse(monthName, format, strict) { var i, mom, regex; if (this._monthsParseExact) { return handleStrictParse.call(this, monthName, format, strict); } if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; } // TODO: add sorting // Sorting makes sure if one month (or abbr) is a prefix of another // see sorting in computeMonthsParse for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); if (strict && !this._longMonthsParse[i]) { this._longMonthsParse[i] = new RegExp( '^' + this.months(mom, '').replace('.', '') + '$', 'i' ); this._shortMonthsParse[i] = new RegExp( '^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i' ); } if (!strict && !this._monthsParse[i]) { regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if ( strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName) ) { return i; } else if ( strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName) ) { return i; } else if (!strict && this._monthsParse[i].test(monthName)) { return i; } } } // MOMENTS function setMonth(mom, value) { var dayOfMonth; if (!mom.isValid()) { // No op return mom; } if (typeof value === 'string') { if (/^\d+$/.test(value)) { value = toInt(value); } else { value = mom.localeData().monthsParse(value); // TODO: Another silent failure? if (!isNumber(value)) { return mom; } } } dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); return mom; } function getSetMonth(value) { if (value != null) { setMonth(this, value); hooks.updateOffset(this, true); return this; } else { return get(this, 'Month'); } } function getDaysInMonth() { return daysInMonth(this.year(), this.month()); } function monthsShortRegex(isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsShortStrictRegex; } else { return this._monthsShortRegex; } } else { if (!hasOwnProp(this, '_monthsShortRegex')) { this._monthsShortRegex = defaultMonthsShortRegex; } return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex; } } function monthsRegex(isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsStrictRegex; } else { return this._monthsRegex; } } else { if (!hasOwnProp(this, '_monthsRegex')) { this._monthsRegex = defaultMonthsRegex; } return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex; } } function computeMonthsParse() { function cmpLenRev(a, b) { return b.length - a.length; } var shortPieces = [], longPieces = [], mixedPieces = [], i, mom; for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); shortPieces.push(this.monthsShort(mom, '')); longPieces.push(this.months(mom, '')); mixedPieces.push(this.months(mom, '')); mixedPieces.push(this.monthsShort(mom, '')); } // Sorting makes sure if one month (or abbr) is a prefix of another it // will match the longer piece. shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 12; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); } for (i = 0; i < 24; i++) { mixedPieces[i] = regexEscape(mixedPieces[i]); } this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._monthsShortRegex = this._monthsRegex; this._monthsStrictRegex = new RegExp( '^(' + longPieces.join('|') + ')', 'i' ); this._monthsShortStrictRegex = new RegExp( '^(' + shortPieces.join('|') + ')', 'i' ); } // FORMATTING addFormatToken('Y', 0, 0, function () { var y = this.year(); return y <= 9999 ? zeroFill(y, 4) : '+' + y; }); addFormatToken(0, ['YY', 2], 0, function () { return this.year() % 100; }); addFormatToken(0, ['YYYY', 4], 0, 'year'); addFormatToken(0, ['YYYYY', 5], 0, 'year'); addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); // ALIASES addUnitAlias('year', 'y'); // PRIORITIES addUnitPriority('year', 1); // PARSING addRegexToken('Y', matchSigned); addRegexToken('YY', match1to2, match2); addRegexToken('YYYY', match1to4, match4); addRegexToken('YYYYY', match1to6, match6); addRegexToken('YYYYYY', match1to6, match6); addParseToken(['YYYYY', 'YYYYYY'], YEAR); addParseToken('YYYY', function (input, array) { array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); }); addParseToken('YY', function (input, array) { array[YEAR] = hooks.parseTwoDigitYear(input); }); addParseToken('Y', function (input, array) { array[YEAR] = parseInt(input, 10); }); // HELPERS function daysInYear(year) { return isLeapYear(year) ? 366 : 365; } // HOOKS hooks.parseTwoDigitYear = function (input) { return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); }; // MOMENTS var getSetYear = makeGetSet('FullYear', true); function getIsLeapYear() { return isLeapYear(this.year()); } function createDate(y, m, d, h, M, s, ms) { // can't just apply() to create a date: // https://stackoverflow.com/q/181348 var date; // the date constructor remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { // preserve leap years using a full 400 year cycle, then reset date = new Date(y + 400, m, d, h, M, s, ms); if (isFinite(date.getFullYear())) { date.setFullYear(y); } } else { date = new Date(y, m, d, h, M, s, ms); } return date; } function createUTCDate(y) { var date, args; // the Date.UTC function remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { args = Array.prototype.slice.call(arguments); // preserve leap years using a full 400 year cycle, then reset args[0] = y + 400; date = new Date(Date.UTC.apply(null, args)); if (isFinite(date.getUTCFullYear())) { date.setUTCFullYear(y); } } else { date = new Date(Date.UTC.apply(null, arguments)); } return date; } // start-of-first-week - start-of-year function firstWeekOffset(year, dow, doy) { var // first-week day -- which january is always in the first week (4 for iso, 1 for other) fwd = 7 + dow - doy, // first-week day local weekday -- which local weekday is fwd fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; return -fwdlw + fwd - 1; } // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday function dayOfYearFromWeeks(year, week, weekday, dow, doy) { var localWeekday = (7 + weekday - dow) % 7, weekOffset = firstWeekOffset(year, dow, doy), dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, resYear, resDayOfYear; if (dayOfYear <= 0) { resYear = year - 1; resDayOfYear = daysInYear(resYear) + dayOfYear; } else if (dayOfYear > daysInYear(year)) { resYear = year + 1; resDayOfYear = dayOfYear - daysInYear(year); } else { resYear = year; resDayOfYear = dayOfYear; } return { year: resYear, dayOfYear: resDayOfYear, }; } function weekOfYear(mom, dow, doy) { var weekOffset = firstWeekOffset(mom.year(), dow, doy), week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, resWeek, resYear; if (week < 1) { resYear = mom.year() - 1; resWeek = week + weeksInYear(resYear, dow, doy); } else if (week > weeksInYear(mom.year(), dow, doy)) { resWeek = week - weeksInYear(mom.year(), dow, doy); resYear = mom.year() + 1; } else { resYear = mom.year(); resWeek = week; } return { week: resWeek, year: resYear, }; } function weeksInYear(year, dow, doy) { var weekOffset = firstWeekOffset(year, dow, doy), weekOffsetNext = firstWeekOffset(year + 1, dow, doy); return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; } // FORMATTING addFormatToken('w', ['ww', 2], 'wo', 'week'); addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); // ALIASES addUnitAlias('week', 'w'); addUnitAlias('isoWeek', 'W'); // PRIORITIES addUnitPriority('week', 5); addUnitPriority('isoWeek', 5); // PARSING addRegexToken('w', match1to2); addRegexToken('ww', match1to2, match2); addRegexToken('W', match1to2); addRegexToken('WW', match1to2, match2); addWeekParseToken(['w', 'ww', 'W', 'WW'], function ( input, week, config, token ) { week[token.substr(0, 1)] = toInt(input); }); // HELPERS // LOCALES function localeWeek(mom) { return weekOfYear(mom, this._week.dow, this._week.doy).week; } var defaultLocaleWeek = { dow: 0, // Sunday is the first day of the week. doy: 6, // The week that contains Jan 6th is the first week of the year. }; function localeFirstDayOfWeek() { return this._week.dow; } function localeFirstDayOfYear() { return this._week.doy; } // MOMENTS function getSetWeek(input) { var week = this.localeData().week(this); return input == null ? week : this.add((input - week) * 7, 'd'); } function getSetISOWeek(input) { var week = weekOfYear(this, 1, 4).week; return input == null ? week : this.add((input - week) * 7, 'd'); } // FORMATTING addFormatToken('d', 0, 'do', 'day'); addFormatToken('dd', 0, 0, function (format) { return this.localeData().weekdaysMin(this, format); }); addFormatToken('ddd', 0, 0, function (format) { return this.localeData().weekdaysShort(this, format); }); addFormatToken('dddd', 0, 0, function (format) { return this.localeData().weekdays(this, format); }); addFormatToken('e', 0, 0, 'weekday'); addFormatToken('E', 0, 0, 'isoWeekday'); // ALIASES addUnitAlias('day', 'd'); addUnitAlias('weekday', 'e'); addUnitAlias('isoWeekday', 'E'); // PRIORITY addUnitPriority('day', 11); addUnitPriority('weekday', 11); addUnitPriority('isoWeekday', 11); // PARSING addRegexToken('d', match1to2); addRegexToken('e', match1to2); addRegexToken('E', match1to2); addRegexToken('dd', function (isStrict, locale) { return locale.weekdaysMinRegex(isStrict); }); addRegexToken('ddd', function (isStrict, locale) { return locale.weekdaysShortRegex(isStrict); }); addRegexToken('dddd', function (isStrict, locale) { return locale.weekdaysRegex(isStrict); }); addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid if (weekday != null) { week.d = weekday; } else { getParsingFlags(config).invalidWeekday = input; } }); addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { week[token] = toInt(input); }); // HELPERS function parseWeekday(input, locale) { if (typeof input !== 'string') { return input; } if (!isNaN(input)) { return parseInt(input, 10); } input = locale.weekdaysParse(input); if (typeof input === 'number') { return input; } return null; } function parseIsoWeekday(input, locale) { if (typeof input === 'string') { return locale.weekdaysParse(input) % 7 || 7; } return isNaN(input) ? null : input; } // LOCALES function shiftWeekdays(ws, n) { return ws.slice(n, 7).concat(ws.slice(0, n)); } var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split( '_' ), defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), defaultWeekdaysRegex = matchWord, defaultWeekdaysShortRegex = matchWord, defaultWeekdaysMinRegex = matchWord; function localeWeekdays(m, format) { var weekdays = isArray(this._weekdays) ? this._weekdays : this._weekdays[ m && m !== true && this._weekdays.isFormat.test(format) ? 'format' : 'standalone' ]; return m === true ? shiftWeekdays(weekdays, this._week.dow) : m ? weekdays[m.day()] : weekdays; } function localeWeekdaysShort(m) { return m === true ? shiftWeekdays(this._weekdaysShort, this._week.dow) : m ? this._weekdaysShort[m.day()] : this._weekdaysShort; } function localeWeekdaysMin(m) { return m === true ? shiftWeekdays(this._weekdaysMin, this._week.dow) : m ? this._weekdaysMin[m.day()] : this._weekdaysMin; } function handleStrictParse$1(weekdayName, format, strict) { var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); if (!this._weekdaysParse) { this._weekdaysParse = []; this._shortWeekdaysParse = []; this._minWeekdaysParse = []; for (i = 0; i < 7; ++i) { mom = createUTC([2000, 1]).day(i); this._minWeekdaysParse[i] = this.weekdaysMin( mom, '' ).toLocaleLowerCase(); this._shortWeekdaysParse[i] = this.weekdaysShort( mom, '' ).toLocaleLowerCase(); this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } } } function localeWeekdaysParse(weekdayName, format, strict) { var i, mom, regex; if (this._weekdaysParseExact) { return handleStrictParse$1.call(this, weekdayName, format, strict); } if (!this._weekdaysParse) { this._weekdaysParse = []; this._minWeekdaysParse = []; this._shortWeekdaysParse = []; this._fullWeekdaysParse = []; } for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); if (strict && !this._fullWeekdaysParse[i]) { this._fullWeekdaysParse[i] = new RegExp( '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i' ); this._shortWeekdaysParse[i] = new RegExp( '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i' ); this._minWeekdaysParse[i] = new RegExp( '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i' ); } if (!this._weekdaysParse[i]) { regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if ( strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName) ) { return i; } else if ( strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName) ) { return i; } else if ( strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName) ) { return i; } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { return i; } } } // MOMENTS function getSetDayOfWeek(input) { if (!this.isValid()) { return input != null ? this : NaN; } var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); return this.add(input - day, 'd'); } else { return day; } } function getSetLocaleDayOfWeek(input) { if (!this.isValid()) { return input != null ? this : NaN; } var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); } function getSetISODayOfWeek(input) { if (!this.isValid()) { return input != null ? this : NaN; } // behaves the same as moment#day except // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) // as a setter, sunday should belong to the previous week. if (input != null) { var weekday = parseIsoWeekday(input, this.localeData()); return this.day(this.day() % 7 ? weekday : weekday - 7); } else { return this.day() || 7; } } function weekdaysRegex(isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysStrictRegex; } else { return this._weekdaysRegex; } } else { if (!hasOwnProp(this, '_weekdaysRegex')) { this._weekdaysRegex = defaultWeekdaysRegex; } return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex; } } function weekdaysShortRegex(isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysShortStrictRegex; } else { return this._weekdaysShortRegex; } } else { if (!hasOwnProp(this, '_weekdaysShortRegex')) { this._weekdaysShortRegex = defaultWeekdaysShortRegex; } return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex; } } function weekdaysMinRegex(isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysMinStrictRegex; } else { return this._weekdaysMinRegex; } } else { if (!hasOwnProp(this, '_weekdaysMinRegex')) { this._weekdaysMinRegex = defaultWeekdaysMinRegex; } return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex; } } function computeWeekdaysParse() { function cmpLenRev(a, b) { return b.length - a.length; } var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], i, mom, minp, shortp, longp; for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); minp = regexEscape(this.weekdaysMin(mom, '')); shortp = regexEscape(this.weekdaysShort(mom, '')); longp = regexEscape(this.weekdays(mom, '')); minPieces.push(minp); shortPieces.push(shortp); longPieces.push(longp); mixedPieces.push(minp); mixedPieces.push(shortp); mixedPieces.push(longp); } // Sorting makes sure if one weekday (or abbr) is a prefix of another it // will match the longer piece. minPieces.sort(cmpLenRev); shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._weekdaysShortRegex = this._weekdaysRegex; this._weekdaysMinRegex = this._weekdaysRegex; this._weekdaysStrictRegex = new RegExp( '^(' + longPieces.join('|') + ')', 'i' ); this._weekdaysShortStrictRegex = new RegExp( '^(' + shortPieces.join('|') + ')', 'i' ); this._weekdaysMinStrictRegex = new RegExp( '^(' + minPieces.join('|') + ')', 'i' ); } // FORMATTING function hFormat() { return this.hours() % 12 || 12; } function kFormat() { return this.hours() || 24; } addFormatToken('H', ['HH', 2], 0, 'hour'); addFormatToken('h', ['hh', 2], 0, hFormat); addFormatToken('k', ['kk', 2], 0, kFormat); addFormatToken('hmm', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); }); addFormatToken('hmmss', 0, 0, function () { return ( '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2) ); }); addFormatToken('Hmm', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2); }); addFormatToken('Hmmss', 0, 0, function () { return ( '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2) ); }); function meridiem(token, lowercase) { addFormatToken(token, 0, 0, function () { return this.localeData().meridiem( this.hours(), this.minutes(), lowercase ); }); } meridiem('a', true); meridiem('A', false); // ALIASES addUnitAlias('hour', 'h'); // PRIORITY addUnitPriority('hour', 13); // PARSING function matchMeridiem(isStrict, locale) { return locale._meridiemParse; } addRegexToken('a', matchMeridiem); addRegexToken('A', matchMeridiem); addRegexToken('H', match1to2); addRegexToken('h', match1to2); addRegexToken('k', match1to2); addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); addRegexToken('kk', match1to2, match2); addRegexToken('hmm', match3to4); addRegexToken('hmmss', match5to6); addRegexToken('Hmm', match3to4); addRegexToken('Hmmss', match5to6); addParseToken(['H', 'HH'], HOUR); addParseToken(['k', 'kk'], function (input, array, config) { var kInput = toInt(input); array[HOUR] = kInput === 24 ? 0 : kInput; }); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); config._meridiem = input; }); addParseToken(['h', 'hh'], function (input, array, config) { array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); addParseToken('hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); getParsingFlags(config).bigHour = true; }); addParseToken('hmmss', function (input, array, config) { var pos1 = input.length - 4, pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); getParsingFlags(config).bigHour = true; }); addParseToken('Hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); }); addParseToken('Hmmss', function (input, array, config) { var pos1 = input.length - 4, pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); }); // LOCALES function localeIsPM(input) { // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays // Using charAt should be more compatible. return (input + '').toLowerCase().charAt(0) === 'p'; } var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, // Setting the hour should keep the time, because the user explicitly // specified which hour they want. So trying to maintain the same hour (in // a new timezone) makes sense. Adding/subtracting hours does not follow // this rule. getSetHour = makeGetSet('Hours', true); function localeMeridiem(hours, minutes, isLower) { if (hours > 11) { return isLower ? 'pm' : 'PM'; } else { return isLower ? 'am' : 'AM'; } } var baseConfig = { calendar: defaultCalendar, longDateFormat: defaultLongDateFormat, invalidDate: defaultInvalidDate, ordinal: defaultOrdinal, dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, relativeTime: defaultRelativeTime, months: defaultLocaleMonths, monthsShort: defaultLocaleMonthsShort, week: defaultLocaleWeek, weekdays: defaultLocaleWeekdays, weekdaysMin: defaultLocaleWeekdaysMin, weekdaysShort: defaultLocaleWeekdaysShort, meridiemParse: defaultLocaleMeridiemParse, }; // internal storage for locale config files var locales = {}, localeFamilies = {}, globalLocale; function commonPrefix(arr1, arr2) { var i, minl = Math.min(arr1.length, arr2.length); for (i = 0; i < minl; i += 1) { if (arr1[i] !== arr2[i]) { return i; } } return minl; } function normalizeLocale(key) { return key ? key.toLowerCase().replace('_', '-') : key; } // pick the locale from the array // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root function chooseLocale(names) { var i = 0, j, next, locale, split; while (i < names.length) { split = normalizeLocale(names[i]).split('-'); j = split.length; next = normalizeLocale(names[i + 1]); next = next ? next.split('-') : null; while (j > 0) { locale = loadLocale(split.slice(0, j).join('-')); if (locale) { return locale; } if ( next && next.length >= j && commonPrefix(split, next) >= j - 1 ) { //the next array item is better than a shallower substring of this one break; } j--; } i++; } return globalLocale; } function loadLocale(name) { var oldLocale = null, aliasedRequire; // TODO: Find a better way to register and load all the locales in Node if ( locales[name] === undefined && typeof module !== 'undefined' && module && module.exports ) { try { oldLocale = globalLocale._abbr; aliasedRequire = require; aliasedRequire('./locale/' + name); getSetGlobalLocale(oldLocale); } catch (e) { // mark as not found to avoid repeating expensive file require call causing high CPU // when trying to find en-US, en_US, en-us for every format call locales[name] = null; // null means not found } } return locales[name]; } // This function will load locale and then set the global locale. If // no arguments are passed in, it will simply return the current global // locale key. function getSetGlobalLocale(key, values) { var data; if (key) { if (isUndefined(values)) { data = getLocale(key); } else { data = defineLocale(key, values); } if (data) { // moment.duration._locale = moment._locale = data; globalLocale = data; } else { if (typeof console !== 'undefined' && console.warn) { //warn user if arguments are passed but the locale could not be set console.warn( 'Locale ' + key + ' not found. Did you forget to load it?' ); } } } return globalLocale._abbr; } function defineLocale(name, config) { if (config !== null) { var locale, parentConfig = baseConfig; config.abbr = name; if (locales[name] != null) { deprecateSimple( 'defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.' ); parentConfig = locales[name]._config; } else if (config.parentLocale != null) { if (locales[config.parentLocale] != null) { parentConfig = locales[config.parentLocale]._config; } else { locale = loadLocale(config.parentLocale); if (locale != null) { parentConfig = locale._config; } else { if (!localeFamilies[config.parentLocale]) { localeFamilies[config.parentLocale] = []; } localeFamilies[config.parentLocale].push({ name: name, config: config, }); return null; } } } locales[name] = new Locale(mergeConfigs(parentConfig, config)); if (localeFamilies[name]) { localeFamilies[name].forEach(function (x) { defineLocale(x.name, x.config); }); } // backwards compat for now: also set the locale // make sure we set the locale AFTER all child locales have been // created, so we won't end up with the child locale set. getSetGlobalLocale(name); return locales[name]; } else { // useful for testing delete locales[name]; return null; } } function updateLocale(name, config) { if (config != null) { var locale, tmpLocale, parentConfig = baseConfig; if (locales[name] != null && locales[name].parentLocale != null) { // Update existing child locale in-place to avoid memory-leaks locales[name].set(mergeConfigs(locales[name]._config, config)); } else { // MERGE tmpLocale = loadLocale(name); if (tmpLocale != null) { parentConfig = tmpLocale._config; } config = mergeConfigs(parentConfig, config); if (tmpLocale == null) { // updateLocale is called for creating a new locale // Set abbr so it will have a name (getters return // undefined otherwise). config.abbr = name; } locale = new Locale(config); locale.parentLocale = locales[name]; locales[name] = locale; } // backwards compat for now: also set the locale getSetGlobalLocale(name); } else { // pass null for config to unupdate, useful for tests if (locales[name] != null) { if (locales[name].parentLocale != null) { locales[name] = locales[name].parentLocale; if (name === getSetGlobalLocale()) { getSetGlobalLocale(name); } } else if (locales[name] != null) { delete locales[name]; } } } return locales[name]; } // returns locale data function getLocale(key) { var locale; if (key && key._locale && key._locale._abbr) { key = key._locale._abbr; } if (!key) { return globalLocale; } if (!isArray(key)) { //short-circuit everything else locale = loadLocale(key); if (locale) { return locale; } key = [key]; } return chooseLocale(key); } function listLocales() { return keys(locales); } function checkOverflow(m) { var overflow, a = m._a; if (a && getParsingFlags(m).overflow === -2) { overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1; if ( getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE) ) { overflow = DATE; } if (getParsingFlags(m)._overflowWeeks && overflow === -1) { overflow = WEEK; } if (getParsingFlags(m)._overflowWeekday && overflow === -1) { overflow = WEEKDAY; } getParsingFlags(m).overflow = overflow; } return m; } // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, isoDates = [ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], ['GGGG-[W]WW', /\d{4}-W\d\d/, false], ['YYYY-DDD', /\d{4}-\d{3}/], ['YYYY-MM', /\d{4}-\d\d/, false], ['YYYYYYMMDD', /[+-]\d{10}/], ['YYYYMMDD', /\d{8}/], ['GGGG[W]WWE', /\d{4}W\d{3}/], ['GGGG[W]WW', /\d{4}W\d{2}/, false], ['YYYYDDD', /\d{7}/], ['YYYYMM', /\d{6}/, false], ['YYYY', /\d{4}/, false], ], // iso time formats and regexes isoTimes = [ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], ['HH:mm:ss', /\d\d:\d\d:\d\d/], ['HH:mm', /\d\d:\d\d/], ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], ['HHmmss', /\d\d\d\d\d\d/], ['HHmm', /\d\d\d\d/], ['HH', /\d\d/], ], aspNetJsonRegex = /^\/?Date\((-?\d+)/i, // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, obsOffsets = { UT: 0, GMT: 0, EDT: -4 * 60, EST: -5 * 60, CDT: -5 * 60, CST: -6 * 60, MDT: -6 * 60, MST: -7 * 60, PDT: -7 * 60, PST: -8 * 60, }; // date from iso format function configFromISO(config) { var i, l, string = config._i, match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), allowTime, dateFormat, timeFormat, tzFormat; if (match) { getParsingFlags(config).iso = true; for (i = 0, l = isoDates.length; i < l; i++) { if (isoDates[i][1].exec(match[1])) { dateFormat = isoDates[i][0]; allowTime = isoDates[i][2] !== false; break; } } if (dateFormat == null) { config._isValid = false; return; } if (match[3]) { for (i = 0, l = isoTimes.length; i < l; i++) { if (isoTimes[i][1].exec(match[3])) { // match[2] should be 'T' or space timeFormat = (match[2] || ' ') + isoTimes[i][0]; break; } } if (timeFormat == null) { config._isValid = false; return; } } if (!allowTime && timeFormat != null) { config._isValid = false; return; } if (match[4]) { if (tzRegex.exec(match[4])) { tzFormat = 'Z'; } else { config._isValid = false; return; } } config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); configFromStringAndFormat(config); } else { config._isValid = false; } } function extractFromRFC2822Strings( yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr ) { var result = [ untruncateYear(yearStr), defaultLocaleMonthsShort.indexOf(monthStr), parseInt(dayStr, 10), parseInt(hourStr, 10), parseInt(minuteStr, 10), ]; if (secondStr) { result.push(parseInt(secondStr, 10)); } return result; } function untruncateYear(yearStr) { var year = parseInt(yearStr, 10); if (year <= 49) { return 2000 + year; } else if (year <= 999) { return 1900 + year; } return year; } function preprocessRFC2822(s) { // Remove comments and folding whitespace and replace multiple-spaces with a single space return s .replace(/\([^)]*\)|[\n\t]/g, ' ') .replace(/(\s\s+)/g, ' ') .replace(/^\s\s*/, '') .replace(/\s\s*$/, ''); } function checkWeekday(weekdayStr, parsedInput, config) { if (weekdayStr) { // TODO: Replace the vanilla JS Date object with an independent day-of-week check. var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), weekdayActual = new Date( parsedInput[0], parsedInput[1], parsedInput[2] ).getDay(); if (weekdayProvided !== weekdayActual) { getParsingFlags(config).weekdayMismatch = true; config._isValid = false; return false; } } return true; } function calculateOffset(obsOffset, militaryOffset, numOffset) { if (obsOffset) { return obsOffsets[obsOffset]; } else if (militaryOffset) { // the only allowed military tz is Z return 0; } else { var hm = parseInt(numOffset, 10), m = hm % 100, h = (hm - m) / 100; return h * 60 + m; } } // date and time from ref 2822 format function configFromRFC2822(config) { var match = rfc2822.exec(preprocessRFC2822(config._i)), parsedArray; if (match) { parsedArray = extractFromRFC2822Strings( match[4], match[3], match[2], match[5], match[6], match[7] ); if (!checkWeekday(match[1], parsedArray, config)) { return; } config._a = parsedArray; config._tzm = calculateOffset(match[8], match[9], match[10]); config._d = createUTCDate.apply(null, config._a); config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); getParsingFlags(config).rfc2822 = true; } else { config._isValid = false; } } // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict function configFromString(config) { var matched = aspNetJsonRegex.exec(config._i); if (matched !== null) { config._d = new Date(+matched[1]); return; } configFromISO(config); if (config._isValid === false) { delete config._isValid; } else { return; } configFromRFC2822(config); if (config._isValid === false) { delete config._isValid; } else { return; } if (config._strict) { config._isValid = false; } else { // Final attempt, use Input Fallback hooks.createFromInputFallback(config); } } hooks.createFromInputFallback = deprecate( 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 'discouraged and will be removed in an upcoming major release. Please refer to ' + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) { config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); } ); // Pick the first defined of two or three arguments. function defaults(a, b, c) { if (a != null) { return a; } if (b != null) { return b; } return c; } function currentDateArray(config) { // hooks is actually the exported moment object var nowValue = new Date(hooks.now()); if (config._useUTC) { return [ nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate(), ]; } return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; } // convert an array to a date. // the array should mirror the parameters below // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function configFromArray(config) { var i, date, input = [], currentDate, expectedWeekday, yearToUse; if (config._d) { return; } currentDate = currentDateArray(config); //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { dayOfYearFromWeekInfo(config); } //if the day of the year is set, figure out what it is if (config._dayOfYear != null) { yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); if ( config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0 ) { getParsingFlags(config)._overflowDayOfYear = true; } date = createUTCDate(yearToUse, 0, config._dayOfYear); config._a[MONTH] = date.getUTCMonth(); config._a[DATE] = date.getUTCDate(); } // Default to current date. // * if no year, month, day of month are given, default to today // * if day of month is given, default month and year // * if month is given, default only year // * if year is given, don't default anything for (i = 0; i < 3 && config._a[i] == null; ++i) { config._a[i] = input[i] = currentDate[i]; } // Zero out whatever was not defaulted, including time for (; i < 7; i++) { config._a[i] = input[i] = config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i]; } // Check for 24:00:00.000 if ( config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0 ) { config._nextDay = true; config._a[HOUR] = 0; } config._d = (config._useUTC ? createUTCDate : createDate).apply( null, input ); expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); // Apply timezone offset from input. The actual utcOffset can be changed // with parseZone. if (config._tzm != null) { config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } if (config._nextDay) { config._a[HOUR] = 24; } // check for mismatching day of week if ( config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday ) { getParsingFlags(config).weekdayMismatch = true; } } function dayOfYearFromWeekInfo(config) { var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek; w = config._w; if (w.GG != null || w.W != null || w.E != null) { dow = 1; doy = 4; // TODO: We need to take the current isoWeekYear, but that depends on // how we interpret now (local, utc, fixed offset). So create // a now version of current config (take local/utc/offset flags, and // create now). weekYear = defaults( w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year ); week = defaults(w.W, 1); weekday = defaults(w.E, 1); if (weekday < 1 || weekday > 7) { weekdayOverflow = true; } } else { dow = config._locale._week.dow; doy = config._locale._week.doy; curWeek = weekOfYear(createLocal(), dow, doy); weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); // Default to current week. week = defaults(w.w, curWeek.week); if (w.d != null) { // weekday -- low day numbers are considered next week weekday = w.d; if (weekday < 0 || weekday > 6) { weekdayOverflow = true; } } else if (w.e != null) { // local weekday -- counting starts from beginning of week weekday = w.e + dow; if (w.e < 0 || w.e > 6) { weekdayOverflow = true; } } else { // default to beginning of week weekday = dow; } } if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { getParsingFlags(config)._overflowWeeks = true; } else if (weekdayOverflow != null) { getParsingFlags(config)._overflowWeekday = true; } else { temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); config._a[YEAR] = temp.year; config._dayOfYear = temp.dayOfYear; } } // constant that refers to the ISO standard hooks.ISO_8601 = function () {}; // constant that refers to the RFC 2822 form hooks.RFC_2822 = function () {}; // date from string and format string function configFromStringAndFormat(config) { // TODO: Move this to another part of the creation flow to prevent circular deps if (config._f === hooks.ISO_8601) { configFromISO(config); return; } if (config._f === hooks.RFC_2822) { configFromRFC2822(config); return; } config._a = []; getParsingFlags(config).empty = true; // This array is used to make a Date, either with `new Date` or `Date.UTC` var string = '' + config._i, i, parsedInput, tokens, token, skipped, stringLength = string.length, totalParsedInputLength = 0, era; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { getParsingFlags(config).unusedInput.push(skipped); } string = string.slice( string.indexOf(parsedInput) + parsedInput.length ); totalParsedInputLength += parsedInput.length; } // don't parse if it's not a known token if (formatTokenFunctions[token]) { if (parsedInput) { getParsingFlags(config).empty = false; } else { getParsingFlags(config).unusedTokens.push(token); } addTimeToArrayFromToken(token, parsedInput, config); } else if (config._strict && !parsedInput) { getParsingFlags(config).unusedTokens.push(token); } } // add remaining unparsed input length to the string getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; if (string.length > 0) { getParsingFlags(config).unusedInput.push(string); } // clear _12h flag if hour is <= 12 if ( config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0 ) { getParsingFlags(config).bigHour = undefined; } getParsingFlags(config).parsedDateParts = config._a.slice(0); getParsingFlags(config).meridiem = config._meridiem; // handle meridiem config._a[HOUR] = meridiemFixWrap( config._locale, config._a[HOUR], config._meridiem ); // handle era era = getParsingFlags(config).era; if (era !== null) { config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]); } configFromArray(config); checkOverflow(config); } function meridiemFixWrap(locale, hour, meridiem) { var isPm; if (meridiem == null) { // nothing to do return hour; } if (locale.meridiemHour != null) { return locale.meridiemHour(hour, meridiem); } else if (locale.isPM != null) { // Fallback isPm = locale.isPM(meridiem); if (isPm && hour < 12) { hour += 12; } if (!isPm && hour === 12) { hour = 0; } return hour; } else { // this is not supposed to happen return hour; } } // date from string and array of format strings function configFromStringAndArray(config) { var tempConfig, bestMoment, scoreToBeat, i, currentScore, validFormatFound, bestFormatIsValid = false; if (config._f.length === 0) { getParsingFlags(config).invalidFormat = true; config._d = new Date(NaN); return; } for (i = 0; i < config._f.length; i++) { currentScore = 0; validFormatFound = false; tempConfig = copyConfig({}, config); if (config._useUTC != null) { tempConfig._useUTC = config._useUTC; } tempConfig._f = config._f[i]; configFromStringAndFormat(tempConfig); if (isValid(tempConfig)) { validFormatFound = true; } // if there is any input that was not parsed add a penalty for that format currentScore += getParsingFlags(tempConfig).charsLeftOver; //or tokens currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; getParsingFlags(tempConfig).score = currentScore; if (!bestFormatIsValid) { if ( scoreToBeat == null || currentScore < scoreToBeat || validFormatFound ) { scoreToBeat = currentScore; bestMoment = tempConfig; if (validFormatFound) { bestFormatIsValid = true; } } } else { if (currentScore < scoreToBeat) { scoreToBeat = currentScore; bestMoment = tempConfig; } } } extend(config, bestMoment || tempConfig); } function configFromObject(config) { if (config._d) { return; } var i = normalizeObjectUnits(config._i), dayOrDate = i.day === undefined ? i.date : i.day; config._a = map( [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], function (obj) { return obj && parseInt(obj, 10); } ); configFromArray(config); } function createFromConfig(config) { var res = new Moment(checkOverflow(prepareConfig(config))); if (res._nextDay) { // Adding is smart enough around DST res.add(1, 'd'); res._nextDay = undefined; } return res; } function prepareConfig(config) { var input = config._i, format = config._f; config._locale = config._locale || getLocale(config._l); if (input === null || (format === undefined && input === '')) { return createInvalid({ nullInput: true }); } if (typeof input === 'string') { config._i = input = config._locale.preparse(input); } if (isMoment(input)) { return new Moment(checkOverflow(input)); } else if (isDate(input)) { config._d = input; } else if (isArray(format)) { configFromStringAndArray(config); } else if (format) { configFromStringAndFormat(config); } else { configFromInput(config); } if (!isValid(config)) { config._d = null; } return config; } function configFromInput(config) { var input = config._i; if (isUndefined(input)) { config._d = new Date(hooks.now()); } else if (isDate(input)) { config._d = new Date(input.valueOf()); } else if (typeof input === 'string') { configFromString(config); } else if (isArray(input)) { config._a = map(input.slice(0), function (obj) { return parseInt(obj, 10); }); configFromArray(config); } else if (isObject(input)) { configFromObject(config); } else if (isNumber(input)) { // from milliseconds config._d = new Date(input); } else { hooks.createFromInputFallback(config); } } function createLocalOrUTC(input, format, locale, strict, isUTC) { var c = {}; if (format === true || format === false) { strict = format; format = undefined; } if (locale === true || locale === false) { strict = locale; locale = undefined; } if ( (isObject(input) && isObjectEmpty(input)) || (isArray(input) && input.length === 0) ) { input = undefined; } // object construction must be done this way. // https://github.com/moment/moment/issues/1423 c._isAMomentObject = true; c._useUTC = c._isUTC = isUTC; c._l = locale; c._i = input; c._f = format; c._strict = strict; return createFromConfig(c); } function createLocal(input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, false); } var prototypeMin = deprecate( 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other < this ? this : other; } else { return createInvalid(); } } ), prototypeMax = deprecate( 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other > this ? this : other; } else { return createInvalid(); } } ); // Pick a moment m from moments so that m[fn](other) is true for all // other. This relies on the function fn to be transitive. // // moments should either be an array of moment objects or an array, whose // first element is an array of moment objects. function pickBy(fn, moments) { var res, i; if (moments.length === 1 && isArray(moments[0])) { moments = moments[0]; } if (!moments.length) { return createLocal(); } res = moments[0]; for (i = 1; i < moments.length; ++i) { if (!moments[i].isValid() || moments[i][fn](res)) { res = moments[i]; } } return res; } // TODO: Use [].sort instead? function min() { var args = [].slice.call(arguments, 0); return pickBy('isBefore', args); } function max() { var args = [].slice.call(arguments, 0); return pickBy('isAfter', args); } var now = function () { return Date.now ? Date.now() : +new Date(); }; var ordering = [ 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond', ]; function isDurationValid(m) { var key, unitHasDecimal = false, i; for (key in m) { if ( hasOwnProp(m, key) && !( indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])) ) ) { return false; } } for (i = 0; i < ordering.length; ++i) { if (m[ordering[i]]) { if (unitHasDecimal) { return false; // only allow non-integers for smallest unit } if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { unitHasDecimal = true; } } } return true; } function isValid$1() { return this._isValid; } function createInvalid$1() { return createDuration(NaN); } function Duration(duration) { var normalizedInput = normalizeObjectUnits(duration), years = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months = normalizedInput.month || 0, weeks = normalizedInput.week || normalizedInput.isoWeek || 0, days = normalizedInput.day || 0, hours = normalizedInput.hour || 0, minutes = normalizedInput.minute || 0, seconds = normalizedInput.second || 0, milliseconds = normalizedInput.millisecond || 0; this._isValid = isDurationValid(normalizedInput); // representation for dateAddRemove this._milliseconds = +milliseconds + seconds * 1e3 + // 1000 minutes * 6e4 + // 1000 * 60 hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 // Because of dateAddRemove treats 24 hours as different from a // day when working around DST, we need to store them separately this._days = +days + weeks * 7; // It is impossible to translate months into days without knowing // which months you are are talking about, so we have to store // it separately. this._months = +months + quarters * 3 + years * 12; this._data = {}; this._locale = getLocale(); this._bubble(); } function isDuration(obj) { return obj instanceof Duration; } function absRound(number) { if (number < 0) { return Math.round(-1 * number) * -1; } else { return Math.round(number); } } // compare two arrays, return the number of differences function compareArrays(array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i; for (i = 0; i < len; i++) { if ( (dontConvert && array1[i] !== array2[i]) || (!dontConvert && toInt(array1[i]) !== toInt(array2[i])) ) { diffs++; } } return diffs + lengthDiff; } // FORMATTING function offset(token, separator) { addFormatToken(token, 0, 0, function () { var offset = this.utcOffset(), sign = '+'; if (offset < 0) { offset = -offset; sign = '-'; } return ( sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~offset % 60, 2) ); }); } offset('Z', ':'); offset('ZZ', ''); // PARSING addRegexToken('Z', matchShortOffset); addRegexToken('ZZ', matchShortOffset); addParseToken(['Z', 'ZZ'], function (input, array, config) { config._useUTC = true; config._tzm = offsetFromString(matchShortOffset, input); }); // HELPERS // timezone chunker // '+10:00' > ['10', '00'] // '-1530' > ['-15', '30'] var chunkOffset = /([\+\-]|\d\d)/gi; function offsetFromString(matcher, string) { var matches = (string || '').match(matcher), chunk, parts, minutes; if (matches === null) { return null; } chunk = matches[matches.length - 1] || []; parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; minutes = +(parts[1] * 60) + toInt(parts[2]); return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; } // Return a moment from input, that is local/utc/zone equivalent to model. function cloneWithOffset(input, model) { var res, diff; if (model._isUTC) { res = model.clone(); diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); // Use low-level api, because this fn is low-level api. res._d.setTime(res._d.valueOf() + diff); hooks.updateOffset(res, false); return res; } else { return createLocal(input).local(); } } function getDateOffset(m) { // On Firefox.24 Date#getTimezoneOffset returns a floating point. // https://github.com/moment/moment/pull/1871 return -Math.round(m._d.getTimezoneOffset()); } // HOOKS // This function will be called whenever a moment is mutated. // It is intended to keep the offset in sync with the timezone. hooks.updateOffset = function () {}; // MOMENTS // keepLocalTime = true means only change the timezone, without // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset // +0200, so we adjust the time as needed, to be valid. // // Keeping the time actually adds/subtracts (one hour) // from the actual represented time. That is why we call updateOffset // a second time. In case it wants us to change the offset again // _changeInProgress == true case, then we have to adjust, because // there is no such time in the given timezone. function getSetOffset(input, keepLocalTime, keepMinutes) { var offset = this._offset || 0, localAdjust; if (!this.isValid()) { return input != null ? this : NaN; } if (input != null) { if (typeof input === 'string') { input = offsetFromString(matchShortOffset, input); if (input === null) { return this; } } else if (Math.abs(input) < 16 && !keepMinutes) { input = input * 60; } if (!this._isUTC && keepLocalTime) { localAdjust = getDateOffset(this); } this._offset = input; this._isUTC = true; if (localAdjust != null) { this.add(localAdjust, 'm'); } if (offset !== input) { if (!keepLocalTime || this._changeInProgress) { addSubtract( this, createDuration(input - offset, 'm'), 1, false ); } else if (!this._changeInProgress) { this._changeInProgress = true; hooks.updateOffset(this, true); this._changeInProgress = null; } } return this; } else { return this._isUTC ? offset : getDateOffset(this); } } function getSetZone(input, keepLocalTime) { if (input != null) { if (typeof input !== 'string') { input = -input; } this.utcOffset(input, keepLocalTime); return this; } else { return -this.utcOffset(); } } function setOffsetToUTC(keepLocalTime) { return this.utcOffset(0, keepLocalTime); } function setOffsetToLocal(keepLocalTime) { if (this._isUTC) { this.utcOffset(0, keepLocalTime); this._isUTC = false; if (keepLocalTime) { this.subtract(getDateOffset(this), 'm'); } } return this; } function setOffsetToParsedOffset() { if (this._tzm != null) { this.utcOffset(this._tzm, false, true); } else if (typeof this._i === 'string') { var tZone = offsetFromString(matchOffset, this._i); if (tZone != null) { this.utcOffset(tZone); } else { this.utcOffset(0, true); } } return this; } function hasAlignedHourOffset(input) { if (!this.isValid()) { return false; } input = input ? createLocal(input).utcOffset() : 0; return (this.utcOffset() - input) % 60 === 0; } function isDaylightSavingTime() { return ( this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset() ); } function isDaylightSavingTimeShifted() { if (!isUndefined(this._isDSTShifted)) { return this._isDSTShifted; } var c = {}, other; copyConfig(c, this); c = prepareConfig(c); if (c._a) { other = c._isUTC ? createUTC(c._a) : createLocal(c._a); this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0; } else { this._isDSTShifted = false; } return this._isDSTShifted; } function isLocal() { return this.isValid() ? !this._isUTC : false; } function isUtcOffset() { return this.isValid() ? this._isUTC : false; } function isUtc() { return this.isValid() ? this._isUTC && this._offset === 0 : false; } // ASP.NET json date format regex var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere // and further modified to allow for strings containing both week and day isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; function createDuration(input, key) { var duration = input, // matching against regexp is expensive, do it on demand match = null, sign, ret, diffRes; if (isDuration(input)) { duration = { ms: input._milliseconds, d: input._days, M: input._months, }; } else if (isNumber(input) || !isNaN(+input)) { duration = {}; if (key) { duration[key] = +input; } else { duration.milliseconds = +input; } } else if ((match = aspNetRegex.exec(input))) { sign = match[1] === '-' ? -1 : 1; duration = { y: 0, d: toInt(match[DATE]) * sign, h: toInt(match[HOUR]) * sign, m: toInt(match[MINUTE]) * sign, s: toInt(match[SECOND]) * sign, ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match }; } else if ((match = isoRegex.exec(input))) { sign = match[1] === '-' ? -1 : 1; duration = { y: parseIso(match[2], sign), M: parseIso(match[3], sign), w: parseIso(match[4], sign), d: parseIso(match[5], sign), h: parseIso(match[6], sign), m: parseIso(match[7], sign), s: parseIso(match[8], sign), }; } else if (duration == null) { // checks for null or undefined duration = {}; } else if ( typeof duration === 'object' && ('from' in duration || 'to' in duration) ) { diffRes = momentsDifference( createLocal(duration.from), createLocal(duration.to) ); duration = {}; duration.ms = diffRes.milliseconds; duration.M = diffRes.months; } ret = new Duration(duration); if (isDuration(input) && hasOwnProp(input, '_locale')) { ret._locale = input._locale; } if (isDuration(input) && hasOwnProp(input, '_isValid')) { ret._isValid = input._isValid; } return ret; } createDuration.fn = Duration.prototype; createDuration.invalid = createInvalid$1; function parseIso(inp, sign) { // We'd normally use ~~inp for this, but unfortunately it also // converts floats to ints. // inp may be undefined, so careful calling replace on it. var res = inp && parseFloat(inp.replace(',', '.')); // apply sign while we're at it return (isNaN(res) ? 0 : res) * sign; } function positiveMomentsDifference(base, other) { var res = {}; res.months = other.month() - base.month() + (other.year() - base.year()) * 12; if (base.clone().add(res.months, 'M').isAfter(other)) { --res.months; } res.milliseconds = +other - +base.clone().add(res.months, 'M'); return res; } function momentsDifference(base, other) { var res; if (!(base.isValid() && other.isValid())) { return { milliseconds: 0, months: 0 }; } other = cloneWithOffset(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); } else { res = positiveMomentsDifference(other, base); res.milliseconds = -res.milliseconds; res.months = -res.months; } return res; } // TODO: remove 'name' arg after deprecation is removed function createAdder(direction, name) { return function (val, period) { var dur, tmp; //invert the arguments, but complain about it if (period !== null && !isNaN(+period)) { deprecateSimple( name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.' ); tmp = val; val = period; period = tmp; } dur = createDuration(val, period); addSubtract(this, dur, direction); return this; }; } function addSubtract(mom, duration, isAdding, updateOffset) { var milliseconds = duration._milliseconds, days = absRound(duration._days), months = absRound(duration._months); if (!mom.isValid()) { // No op return; } updateOffset = updateOffset == null ? true : updateOffset; if (months) { setMonth(mom, get(mom, 'Month') + months * isAdding); } if (days) { set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); } if (milliseconds) { mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); } if (updateOffset) { hooks.updateOffset(mom, days || months); } } var add = createAdder(1, 'add'), subtract = createAdder(-1, 'subtract'); function isString(input) { return typeof input === 'string' || input instanceof String; } // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined function isMomentInput(input) { return ( isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === undefined ); } function isMomentInputObject(input) { var objectTest = isObject(input) && !isObjectEmpty(input), propertyTest = false, properties = [ 'years', 'year', 'y', 'months', 'month', 'M', 'days', 'day', 'd', 'dates', 'date', 'D', 'hours', 'hour', 'h', 'minutes', 'minute', 'm', 'seconds', 'second', 's', 'milliseconds', 'millisecond', 'ms', ], i, property; for (i = 0; i < properties.length; i += 1) { property = properties[i]; propertyTest = propertyTest || hasOwnProp(input, property); } return objectTest && propertyTest; } function isNumberOrStringArray(input) { var arrayTest = isArray(input), dataTypeTest = false; if (arrayTest) { dataTypeTest = input.filter(function (item) { return !isNumber(item) && isString(input); }).length === 0; } return arrayTest && dataTypeTest; } function isCalendarSpec(input) { var objectTest = isObject(input) && !isObjectEmpty(input), propertyTest = false, properties = [ 'sameDay', 'nextDay', 'lastDay', 'nextWeek', 'lastWeek', 'sameElse', ], i, property; for (i = 0; i < properties.length; i += 1) { property = properties[i]; propertyTest = propertyTest || hasOwnProp(input, property); } return objectTest && propertyTest; } function getCalendarFormat(myMoment, now) { var diff = myMoment.diff(now, 'days', true); return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; } function calendar$1(time, formats) { // Support for single parameter, formats only overload to the calendar function if (arguments.length === 1) { if (!arguments[0]) { time = undefined; formats = undefined; } else if (isMomentInput(arguments[0])) { time = arguments[0]; formats = undefined; } else if (isCalendarSpec(arguments[0])) { formats = arguments[0]; time = undefined; } } // We want to compare the start of today, vs this. // Getting start-of-today depends on whether we're local/utc/offset or not. var now = time || createLocal(), sod = cloneWithOffset(now, this).startOf('day'), format = hooks.calendarFormat(this, sod) || 'sameElse', output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); return this.format( output || this.localeData().calendar(format, this, createLocal(now)) ); } function clone() { return new Moment(this); } function isAfter(input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() > localInput.valueOf(); } else { return localInput.valueOf() < this.clone().startOf(units).valueOf(); } } function isBefore(input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() < localInput.valueOf(); } else { return this.clone().endOf(units).valueOf() < localInput.valueOf(); } } function isBetween(from, to, units, inclusivity) { var localFrom = isMoment(from) ? from : createLocal(from), localTo = isMoment(to) ? to : createLocal(to); if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { return false; } inclusivity = inclusivity || '()'; return ( (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)) ); } function isSame(input, units) { var localInput = isMoment(input) ? input : createLocal(input), inputMs; if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() === localInput.valueOf(); } else { inputMs = localInput.valueOf(); return ( this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf() ); } } function isSameOrAfter(input, units) { return this.isSame(input, units) || this.isAfter(input, units); } function isSameOrBefore(input, units) { return this.isSame(input, units) || this.isBefore(input, units); } function diff(input, units, asFloat) { var that, zoneDelta, output; if (!this.isValid()) { return NaN; } that = cloneWithOffset(input, this); if (!that.isValid()) { return NaN; } zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; units = normalizeUnits(units); switch (units) { case 'year': output = monthDiff(this, that) / 12; break; case 'month': output = monthDiff(this, that); break; case 'quarter': output = monthDiff(this, that) / 3; break; case 'second': output = (this - that) / 1e3; break; // 1000 case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst default: output = this - that; } return asFloat ? output : absFloor(output); } function monthDiff(a, b) { if (a.date() < b.date()) { // end-of-month calculations work correct when the start month has more // days than the end month. return -monthDiff(b, a); } // difference in months var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), // b is in (anchor - 1 month, anchor + 1 month) anchor = a.clone().add(wholeMonthDiff, 'months'), anchor2, adjust; if (b - anchor < 0) { anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor - anchor2); } else { anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor2 - anchor); } //check for negative zero, return zero if negative zero return -(wholeMonthDiff + adjust) || 0; } hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; function toString() { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); } function toISOString(keepOffset) { if (!this.isValid()) { return null; } var utc = keepOffset !== true, m = utc ? this.clone().utc() : this; if (m.year() < 0 || m.year() > 9999) { return formatMoment( m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ' ); } if (isFunction(Date.prototype.toISOString)) { // native implementation is ~50x faster, use it when we can if (utc) { return this.toDate().toISOString(); } else { return new Date(this.valueOf() + this.utcOffset() * 60 * 1000) .toISOString() .replace('Z', formatMoment(m, 'Z')); } } return formatMoment( m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ' ); } /** * Return a human readable representation of a moment that can * also be evaluated to get a new moment which is the same * * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects */ function inspect() { if (!this.isValid()) { return 'moment.invalid(/* ' + this._i + ' */)'; } var func = 'moment', zone = '', prefix, year, datetime, suffix; if (!this.isLocal()) { func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; zone = 'Z'; } prefix = '[' + func + '("]'; year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY'; datetime = '-MM-DD[T]HH:mm:ss.SSS'; suffix = zone + '[")]'; return this.format(prefix + year + datetime + suffix); } function format(inputString) { if (!inputString) { inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; } var output = formatMoment(this, inputString); return this.localeData().postformat(output); } function from(time, withoutSuffix) { if ( this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) ) { return createDuration({ to: this, from: time }) .locale(this.locale()) .humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function fromNow(withoutSuffix) { return this.from(createLocal(), withoutSuffix); } function to(time, withoutSuffix) { if ( this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) ) { return createDuration({ from: this, to: time }) .locale(this.locale()) .humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function toNow(withoutSuffix) { return this.to(createLocal(), withoutSuffix); } // If passed a locale key, it will set the locale for this // instance. Otherwise, it will return the locale configuration // variables for this instance. function locale(key) { var newLocaleData; if (key === undefined) { return this._locale._abbr; } else { newLocaleData = getLocale(key); if (newLocaleData != null) { this._locale = newLocaleData; } return this; } } var lang = deprecate( 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) { if (key === undefined) { return this.localeData(); } else { return this.locale(key); } } ); function localeData() { return this._locale; } var MS_PER_SECOND = 1000, MS_PER_MINUTE = 60 * MS_PER_SECOND, MS_PER_HOUR = 60 * MS_PER_MINUTE, MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; // actual modulo - handles negative numbers (for dates before 1970): function mod$1(dividend, divisor) { return ((dividend % divisor) + divisor) % divisor; } function localStartOfDate(y, m, d) { // the date constructor remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { // preserve leap years using a full 400 year cycle, then reset return new Date(y + 400, m, d) - MS_PER_400_YEARS; } else { return new Date(y, m, d).valueOf(); } } function utcStartOfDate(y, m, d) { // Date.UTC remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { // preserve leap years using a full 400 year cycle, then reset return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; } else { return Date.UTC(y, m, d); } } function startOf(units) { var time, startOfDate; units = normalizeUnits(units); if (units === undefined || units === 'millisecond' || !this.isValid()) { return this; } startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; switch (units) { case 'year': time = startOfDate(this.year(), 0, 1); break; case 'quarter': time = startOfDate( this.year(), this.month() - (this.month() % 3), 1 ); break; case 'month': time = startOfDate(this.year(), this.month(), 1); break; case 'week': time = startOfDate( this.year(), this.month(), this.date() - this.weekday() ); break; case 'isoWeek': time = startOfDate( this.year(), this.month(), this.date() - (this.isoWeekday() - 1) ); break; case 'day': case 'date': time = startOfDate(this.year(), this.month(), this.date()); break; case 'hour': time = this._d.valueOf(); time -= mod$1( time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR ); break; case 'minute': time = this._d.valueOf(); time -= mod$1(time, MS_PER_MINUTE); break; case 'second': time = this._d.valueOf(); time -= mod$1(time, MS_PER_SECOND); break; } this._d.setTime(time); hooks.updateOffset(this, true); return this; } function endOf(units) { var time, startOfDate; units = normalizeUnits(units); if (units === undefined || units === 'millisecond' || !this.isValid()) { return this; } startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; switch (units) { case 'year': time = startOfDate(this.year() + 1, 0, 1) - 1; break; case 'quarter': time = startOfDate( this.year(), this.month() - (this.month() % 3) + 3, 1 ) - 1; break; case 'month': time = startOfDate(this.year(), this.month() + 1, 1) - 1; break; case 'week': time = startOfDate( this.year(), this.month(), this.date() - this.weekday() + 7 ) - 1; break; case 'isoWeek': time = startOfDate( this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7 ) - 1; break; case 'day': case 'date': time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; break; case 'hour': time = this._d.valueOf(); time += MS_PER_HOUR - mod$1( time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR ) - 1; break; case 'minute': time = this._d.valueOf(); time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; break; case 'second': time = this._d.valueOf(); time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; break; } this._d.setTime(time); hooks.updateOffset(this, true); return this; } function valueOf() { return this._d.valueOf() - (this._offset || 0) * 60000; } function unix() { return Math.floor(this.valueOf() / 1000); } function toDate() { return new Date(this.valueOf()); } function toArray() { var m = this; return [ m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond(), ]; } function toObject() { var m = this; return { years: m.year(), months: m.month(), date: m.date(), hours: m.hours(), minutes: m.minutes(), seconds: m.seconds(), milliseconds: m.milliseconds(), }; } function toJSON() { // new Date(NaN).toJSON() === null return this.isValid() ? this.toISOString() : null; } function isValid$2() { return isValid(this); } function parsingFlags() { return extend({}, getParsingFlags(this)); } function invalidAt() { return getParsingFlags(this).overflow; } function creationData() { return { input: this._i, format: this._f, locale: this._locale, isUTC: this._isUTC, strict: this._strict, }; } addFormatToken('N', 0, 0, 'eraAbbr'); addFormatToken('NN', 0, 0, 'eraAbbr'); addFormatToken('NNN', 0, 0, 'eraAbbr'); addFormatToken('NNNN', 0, 0, 'eraName'); addFormatToken('NNNNN', 0, 0, 'eraNarrow'); addFormatToken('y', ['y', 1], 'yo', 'eraYear'); addFormatToken('y', ['yy', 2], 0, 'eraYear'); addFormatToken('y', ['yyy', 3], 0, 'eraYear'); addFormatToken('y', ['yyyy', 4], 0, 'eraYear'); addRegexToken('N', matchEraAbbr); addRegexToken('NN', matchEraAbbr); addRegexToken('NNN', matchEraAbbr); addRegexToken('NNNN', matchEraName); addRegexToken('NNNNN', matchEraNarrow); addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function ( input, array, config, token ) { var era = config._locale.erasParse(input, token, config._strict); if (era) { getParsingFlags(config).era = era; } else { getParsingFlags(config).invalidEra = input; } }); addRegexToken('y', matchUnsigned); addRegexToken('yy', matchUnsigned); addRegexToken('yyy', matchUnsigned); addRegexToken('yyyy', matchUnsigned); addRegexToken('yo', matchEraYearOrdinal); addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR); addParseToken(['yo'], function (input, array, config, token) { var match; if (config._locale._eraYearOrdinalRegex) { match = input.match(config._locale._eraYearOrdinalRegex); } if (config._locale.eraYearOrdinalParse) { array[YEAR] = config._locale.eraYearOrdinalParse(input, match); } else { array[YEAR] = parseInt(input, 10); } }); function localeEras(m, format) { var i, l, date, eras = this._eras || getLocale('en')._eras; for (i = 0, l = eras.length; i < l; ++i) { switch (typeof eras[i].since) { case 'string': // truncate time date = hooks(eras[i].since).startOf('day'); eras[i].since = date.valueOf(); break; } switch (typeof eras[i].until) { case 'undefined': eras[i].until = +Infinity; break; case 'string': // truncate time date = hooks(eras[i].until).startOf('day').valueOf(); eras[i].until = date.valueOf(); break; } } return eras; } function localeErasParse(eraName, format, strict) { var i, l, eras = this.eras(), name, abbr, narrow; eraName = eraName.toUpperCase(); for (i = 0, l = eras.length; i < l; ++i) { name = eras[i].name.toUpperCase(); abbr = eras[i].abbr.toUpperCase(); narrow = eras[i].narrow.toUpperCase(); if (strict) { switch (format) { case 'N': case 'NN': case 'NNN': if (abbr === eraName) { return eras[i]; } break; case 'NNNN': if (name === eraName) { return eras[i]; } break; case 'NNNNN': if (narrow === eraName) { return eras[i]; } break; } } else if ([name, abbr, narrow].indexOf(eraName) >= 0) { return eras[i]; } } } function localeErasConvertYear(era, year) { var dir = era.since <= era.until ? +1 : -1; if (year === undefined) { return hooks(era.since).year(); } else { return hooks(era.since).year() + (year - era.offset) * dir; } } function getEraName() { var i, l, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { // truncate time val = this.clone().startOf('day').valueOf(); if (eras[i].since <= val && val <= eras[i].until) { return eras[i].name; } if (eras[i].until <= val && val <= eras[i].since) { return eras[i].name; } } return ''; } function getEraNarrow() { var i, l, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { // truncate time val = this.clone().startOf('day').valueOf(); if (eras[i].since <= val && val <= eras[i].until) { return eras[i].narrow; } if (eras[i].until <= val && val <= eras[i].since) { return eras[i].narrow; } } return ''; } function getEraAbbr() { var i, l, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { // truncate time val = this.clone().startOf('day').valueOf(); if (eras[i].since <= val && val <= eras[i].until) { return eras[i].abbr; } if (eras[i].until <= val && val <= eras[i].since) { return eras[i].abbr; } } return ''; } function getEraYear() { var i, l, dir, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { dir = eras[i].since <= eras[i].until ? +1 : -1; // truncate time val = this.clone().startOf('day').valueOf(); if ( (eras[i].since <= val && val <= eras[i].until) || (eras[i].until <= val && val <= eras[i].since) ) { return ( (this.year() - hooks(eras[i].since).year()) * dir + eras[i].offset ); } } return this.year(); } function erasNameRegex(isStrict) { if (!hasOwnProp(this, '_erasNameRegex')) { computeErasParse.call(this); } return isStrict ? this._erasNameRegex : this._erasRegex; } function erasAbbrRegex(isStrict) { if (!hasOwnProp(this, '_erasAbbrRegex')) { computeErasParse.call(this); } return isStrict ? this._erasAbbrRegex : this._erasRegex; } function erasNarrowRegex(isStrict) { if (!hasOwnProp(this, '_erasNarrowRegex')) { computeErasParse.call(this); } return isStrict ? this._erasNarrowRegex : this._erasRegex; } function matchEraAbbr(isStrict, locale) { return locale.erasAbbrRegex(isStrict); } function matchEraName(isStrict, locale) { return locale.erasNameRegex(isStrict); } function matchEraNarrow(isStrict, locale) { return locale.erasNarrowRegex(isStrict); } function matchEraYearOrdinal(isStrict, locale) { return locale._eraYearOrdinalRegex || matchUnsigned; } function computeErasParse() { var abbrPieces = [], namePieces = [], narrowPieces = [], mixedPieces = [], i, l, eras = this.eras(); for (i = 0, l = eras.length; i < l; ++i) { namePieces.push(regexEscape(eras[i].name)); abbrPieces.push(regexEscape(eras[i].abbr)); narrowPieces.push(regexEscape(eras[i].narrow)); mixedPieces.push(regexEscape(eras[i].name)); mixedPieces.push(regexEscape(eras[i].abbr)); mixedPieces.push(regexEscape(eras[i].narrow)); } this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i'); this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i'); this._erasNarrowRegex = new RegExp( '^(' + narrowPieces.join('|') + ')', 'i' ); } // FORMATTING addFormatToken(0, ['gg', 2], 0, function () { return this.weekYear() % 100; }); addFormatToken(0, ['GG', 2], 0, function () { return this.isoWeekYear() % 100; }); function addWeekYearFormatToken(token, getter) { addFormatToken(0, [token, token.length], 0, getter); } addWeekYearFormatToken('gggg', 'weekYear'); addWeekYearFormatToken('ggggg', 'weekYear'); addWeekYearFormatToken('GGGG', 'isoWeekYear'); addWeekYearFormatToken('GGGGG', 'isoWeekYear'); // ALIASES addUnitAlias('weekYear', 'gg'); addUnitAlias('isoWeekYear', 'GG'); // PRIORITY addUnitPriority('weekYear', 1); addUnitPriority('isoWeekYear', 1); // PARSING addRegexToken('G', matchSigned); addRegexToken('g', matchSigned); addRegexToken('GG', match1to2, match2); addRegexToken('gg', match1to2, match2); addRegexToken('GGGG', match1to4, match4); addRegexToken('gggg', match1to4, match4); addRegexToken('GGGGG', match1to6, match6); addRegexToken('ggggg', match1to6, match6); addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function ( input, week, config, token ) { week[token.substr(0, 2)] = toInt(input); }); addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { week[token] = hooks.parseTwoDigitYear(input); }); // MOMENTS function getSetWeekYear(input) { return getSetWeekYearHelper.call( this, input, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy ); } function getSetISOWeekYear(input) { return getSetWeekYearHelper.call( this, input, this.isoWeek(), this.isoWeekday(), 1, 4 ); } function getISOWeeksInYear() { return weeksInYear(this.year(), 1, 4); } function getISOWeeksInISOWeekYear() { return weeksInYear(this.isoWeekYear(), 1, 4); } function getWeeksInYear() { var weekInfo = this.localeData()._week; return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } function getWeeksInWeekYear() { var weekInfo = this.localeData()._week; return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy); } function getSetWeekYearHelper(input, week, weekday, dow, doy) { var weeksTarget; if (input == null) { return weekOfYear(this, dow, doy).year; } else { weeksTarget = weeksInYear(input, dow, doy); if (week > weeksTarget) { week = weeksTarget; } return setWeekAll.call(this, input, week, weekday, dow, doy); } } function setWeekAll(weekYear, week, weekday, dow, doy) { var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); this.year(date.getUTCFullYear()); this.month(date.getUTCMonth()); this.date(date.getUTCDate()); return this; } // FORMATTING addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES addUnitAlias('quarter', 'Q'); // PRIORITY addUnitPriority('quarter', 7); // PARSING addRegexToken('Q', match1); addParseToken('Q', function (input, array) { array[MONTH] = (toInt(input) - 1) * 3; }); // MOMENTS function getSetQuarter(input) { return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + (this.month() % 3)); } // FORMATTING addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES addUnitAlias('date', 'D'); // PRIORITY addUnitPriority('date', 9); // PARSING addRegexToken('D', match1to2); addRegexToken('DD', match1to2, match2); addRegexToken('Do', function (isStrict, locale) { // TODO: Remove "ordinalParse" fallback in next major release. return isStrict ? locale._dayOfMonthOrdinalParse || locale._ordinalParse : locale._dayOfMonthOrdinalParseLenient; }); addParseToken(['D', 'DD'], DATE); addParseToken('Do', function (input, array) { array[DATE] = toInt(input.match(match1to2)[0]); }); // MOMENTS var getSetDayOfMonth = makeGetSet('Date', true); // FORMATTING addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); // ALIASES addUnitAlias('dayOfYear', 'DDD'); // PRIORITY addUnitPriority('dayOfYear', 4); // PARSING addRegexToken('DDD', match1to3); addRegexToken('DDDD', match3); addParseToken(['DDD', 'DDDD'], function (input, array, config) { config._dayOfYear = toInt(input); }); // HELPERS // MOMENTS function getSetDayOfYear(input) { var dayOfYear = Math.round( (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5 ) + 1; return input == null ? dayOfYear : this.add(input - dayOfYear, 'd'); } // FORMATTING addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES addUnitAlias('minute', 'm'); // PRIORITY addUnitPriority('minute', 14); // PARSING addRegexToken('m', match1to2); addRegexToken('mm', match1to2, match2); addParseToken(['m', 'mm'], MINUTE); // MOMENTS var getSetMinute = makeGetSet('Minutes', false); // FORMATTING addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES addUnitAlias('second', 's'); // PRIORITY addUnitPriority('second', 15); // PARSING addRegexToken('s', match1to2); addRegexToken('ss', match1to2, match2); addParseToken(['s', 'ss'], SECOND); // MOMENTS var getSetSecond = makeGetSet('Seconds', false); // FORMATTING addFormatToken('S', 0, 0, function () { return ~~(this.millisecond() / 100); }); addFormatToken(0, ['SS', 2], 0, function () { return ~~(this.millisecond() / 10); }); addFormatToken(0, ['SSS', 3], 0, 'millisecond'); addFormatToken(0, ['SSSS', 4], 0, function () { return this.millisecond() * 10; }); addFormatToken(0, ['SSSSS', 5], 0, function () { return this.millisecond() * 100; }); addFormatToken(0, ['SSSSSS', 6], 0, function () { return this.millisecond() * 1000; }); addFormatToken(0, ['SSSSSSS', 7], 0, function () { return this.millisecond() * 10000; }); addFormatToken(0, ['SSSSSSSS', 8], 0, function () { return this.millisecond() * 100000; }); addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { return this.millisecond() * 1000000; }); // ALIASES addUnitAlias('millisecond', 'ms'); // PRIORITY addUnitPriority('millisecond', 16); // PARSING addRegexToken('S', match1to3, match1); addRegexToken('SS', match1to3, match2); addRegexToken('SSS', match1to3, match3); var token, getSetMillisecond; for (token = 'SSSS'; token.length <= 9; token += 'S') { addRegexToken(token, matchUnsigned); } function parseMs(input, array) { array[MILLISECOND] = toInt(('0.' + input) * 1000); } for (token = 'S'; token.length <= 9; token += 'S') { addParseToken(token, parseMs); } getSetMillisecond = makeGetSet('Milliseconds', false); // FORMATTING addFormatToken('z', 0, 0, 'zoneAbbr'); addFormatToken('zz', 0, 0, 'zoneName'); // MOMENTS function getZoneAbbr() { return this._isUTC ? 'UTC' : ''; } function getZoneName() { return this._isUTC ? 'Coordinated Universal Time' : ''; } var proto = Moment.prototype; proto.add = add; proto.calendar = calendar$1; proto.clone = clone; proto.diff = diff; proto.endOf = endOf; proto.format = format; proto.from = from; proto.fromNow = fromNow; proto.to = to; proto.toNow = toNow; proto.get = stringGet; proto.invalidAt = invalidAt; proto.isAfter = isAfter; proto.isBefore = isBefore; proto.isBetween = isBetween; proto.isSame = isSame; proto.isSameOrAfter = isSameOrAfter; proto.isSameOrBefore = isSameOrBefore; proto.isValid = isValid$2; proto.lang = lang; proto.locale = locale; proto.localeData = localeData; proto.max = prototypeMax; proto.min = prototypeMin; proto.parsingFlags = parsingFlags; proto.set = stringSet; proto.startOf = startOf; proto.subtract = subtract; proto.toArray = toArray; proto.toObject = toObject; proto.toDate = toDate; proto.toISOString = toISOString; proto.inspect = inspect; if (typeof Symbol !== 'undefined' && Symbol.for != null) { proto[Symbol.for('nodejs.util.inspect.custom')] = function () { return 'Moment<' + this.format() + '>'; }; } proto.toJSON = toJSON; proto.toString = toString; proto.unix = unix; proto.valueOf = valueOf; proto.creationData = creationData; proto.eraName = getEraName; proto.eraNarrow = getEraNarrow; proto.eraAbbr = getEraAbbr; proto.eraYear = getEraYear; proto.year = getSetYear; proto.isLeapYear = getIsLeapYear; proto.weekYear = getSetWeekYear; proto.isoWeekYear = getSetISOWeekYear; proto.quarter = proto.quarters = getSetQuarter; proto.month = getSetMonth; proto.daysInMonth = getDaysInMonth; proto.week = proto.weeks = getSetWeek; proto.isoWeek = proto.isoWeeks = getSetISOWeek; proto.weeksInYear = getWeeksInYear; proto.weeksInWeekYear = getWeeksInWeekYear; proto.isoWeeksInYear = getISOWeeksInYear; proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear; proto.date = getSetDayOfMonth; proto.day = proto.days = getSetDayOfWeek; proto.weekday = getSetLocaleDayOfWeek; proto.isoWeekday = getSetISODayOfWeek; proto.dayOfYear = getSetDayOfYear; proto.hour = proto.hours = getSetHour; proto.minute = proto.minutes = getSetMinute; proto.second = proto.seconds = getSetSecond; proto.millisecond = proto.milliseconds = getSetMillisecond; proto.utcOffset = getSetOffset; proto.utc = setOffsetToUTC; proto.local = setOffsetToLocal; proto.parseZone = setOffsetToParsedOffset; proto.hasAlignedHourOffset = hasAlignedHourOffset; proto.isDST = isDaylightSavingTime; proto.isLocal = isLocal; proto.isUtcOffset = isUtcOffset; proto.isUtc = isUtc; proto.isUTC = isUtc; proto.zoneAbbr = getZoneAbbr; proto.zoneName = getZoneName; proto.dates = deprecate( 'dates accessor is deprecated. Use date instead.', getSetDayOfMonth ); proto.months = deprecate( 'months accessor is deprecated. Use month instead', getSetMonth ); proto.years = deprecate( 'years accessor is deprecated. Use year instead', getSetYear ); proto.zone = deprecate( 'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone ); proto.isDSTShifted = deprecate( 'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted ); function createUnix(input) { return createLocal(input * 1000); } function createInZone() { return createLocal.apply(null, arguments).parseZone(); } function preParsePostFormat(string) { return string; } var proto$1 = Locale.prototype; proto$1.calendar = calendar; proto$1.longDateFormat = longDateFormat; proto$1.invalidDate = invalidDate; proto$1.ordinal = ordinal; proto$1.preparse = preParsePostFormat; proto$1.postformat = preParsePostFormat; proto$1.relativeTime = relativeTime; proto$1.pastFuture = pastFuture; proto$1.set = set; proto$1.eras = localeEras; proto$1.erasParse = localeErasParse; proto$1.erasConvertYear = localeErasConvertYear; proto$1.erasAbbrRegex = erasAbbrRegex; proto$1.erasNameRegex = erasNameRegex; proto$1.erasNarrowRegex = erasNarrowRegex; proto$1.months = localeMonths; proto$1.monthsShort = localeMonthsShort; proto$1.monthsParse = localeMonthsParse; proto$1.monthsRegex = monthsRegex; proto$1.monthsShortRegex = monthsShortRegex; proto$1.week = localeWeek; proto$1.firstDayOfYear = localeFirstDayOfYear; proto$1.firstDayOfWeek = localeFirstDayOfWeek; proto$1.weekdays = localeWeekdays; proto$1.weekdaysMin = localeWeekdaysMin; proto$1.weekdaysShort = localeWeekdaysShort; proto$1.weekdaysParse = localeWeekdaysParse; proto$1.weekdaysRegex = weekdaysRegex; proto$1.weekdaysShortRegex = weekdaysShortRegex; proto$1.weekdaysMinRegex = weekdaysMinRegex; proto$1.isPM = localeIsPM; proto$1.meridiem = localeMeridiem; function get$1(format, index, field, setter) { var locale = getLocale(), utc = createUTC().set(setter, index); return locale[field](utc, format); } function listMonthsImpl(format, index, field) { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; if (index != null) { return get$1(format, index, field, 'month'); } var i, out = []; for (i = 0; i < 12; i++) { out[i] = get$1(format, i, field, 'month'); } return out; } // () // (5) // (fmt, 5) // (fmt) // (true) // (true, 5) // (true, fmt, 5) // (true, fmt) function listWeekdaysImpl(localeSorted, format, index, field) { if (typeof localeSorted === 'boolean') { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } else { format = localeSorted; index = format; localeSorted = false; if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } var locale = getLocale(), shift = localeSorted ? locale._week.dow : 0, i, out = []; if (index != null) { return get$1(format, (index + shift) % 7, field, 'day'); } for (i = 0; i < 7; i++) { out[i] = get$1(format, (i + shift) % 7, field, 'day'); } return out; } function listMonths(format, index) { return listMonthsImpl(format, index, 'months'); } function listMonthsShort(format, index) { return listMonthsImpl(format, index, 'monthsShort'); } function listWeekdays(localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } function listWeekdaysShort(localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } function listWeekdaysMin(localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); } getSetGlobalLocale('en', { eras: [ { since: '0001-01-01', until: +Infinity, offset: 1, name: 'Anno Domini', narrow: 'AD', abbr: 'AD', }, { since: '0000-12-31', until: -Infinity, offset: 1, name: 'Before Christ', narrow: 'BC', abbr: 'BC', }, ], dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: function (number) { var b = number % 10, output = toInt((number % 100) / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th'; return number + output; }, }); // Side effect imports hooks.lang = deprecate( 'moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale ); hooks.langData = deprecate( 'moment.langData is deprecated. Use moment.localeData instead.', getLocale ); var mathAbs = Math.abs; function abs() { var data = this._data; this._milliseconds = mathAbs(this._milliseconds); this._days = mathAbs(this._days); this._months = mathAbs(this._months); data.milliseconds = mathAbs(data.milliseconds); data.seconds = mathAbs(data.seconds); data.minutes = mathAbs(data.minutes); data.hours = mathAbs(data.hours); data.months = mathAbs(data.months); data.years = mathAbs(data.years); return this; } function addSubtract$1(duration, input, value, direction) { var other = createDuration(input, value); duration._milliseconds += direction * other._milliseconds; duration._days += direction * other._days; duration._months += direction * other._months; return duration._bubble(); } // supports only 2.0-style add(1, 's') or add(duration) function add$1(input, value) { return addSubtract$1(this, input, value, 1); } // supports only 2.0-style subtract(1, 's') or subtract(duration) function subtract$1(input, value) { return addSubtract$1(this, input, value, -1); } function absCeil(number) { if (number < 0) { return Math.floor(number); } else { return Math.ceil(number); } } function bubble() { var milliseconds = this._milliseconds, days = this._days, months = this._months, data = this._data, seconds, minutes, hours, years, monthsFromDays; // if we have a mix of positive and negative values, bubble down first // check: https://github.com/moment/moment/issues/2166 if ( !( (milliseconds >= 0 && days >= 0 && months >= 0) || (milliseconds <= 0 && days <= 0 && months <= 0) ) ) { milliseconds += absCeil(monthsToDays(months) + days) * 864e5; days = 0; months = 0; } // The following code bubbles up values, see the tests for // examples of what that means. data.milliseconds = milliseconds % 1000; seconds = absFloor(milliseconds / 1000); data.seconds = seconds % 60; minutes = absFloor(seconds / 60); data.minutes = minutes % 60; hours = absFloor(minutes / 60); data.hours = hours % 24; days += absFloor(hours / 24); // convert days to months monthsFromDays = absFloor(daysToMonths(days)); months += monthsFromDays; days -= absCeil(monthsToDays(monthsFromDays)); // 12 months -> 1 year years = absFloor(months / 12); months %= 12; data.days = days; data.months = months; data.years = years; return this; } function daysToMonths(days) { // 400 years have 146097 days (taking into account leap year rules) // 400 years have 12 months === 4800 return (days * 4800) / 146097; } function monthsToDays(months) { // the reverse of daysToMonths return (months * 146097) / 4800; } function as(units) { if (!this.isValid()) { return NaN; } var days, months, milliseconds = this._milliseconds; units = normalizeUnits(units); if (units === 'month' || units === 'quarter' || units === 'year') { days = this._days + milliseconds / 864e5; months = this._months + daysToMonths(days); switch (units) { case 'month': return months; case 'quarter': return months / 3; case 'year': return months / 12; } } else { // handle milliseconds separately because of floating point math errors (issue #1867) days = this._days + Math.round(monthsToDays(this._months)); switch (units) { case 'week': return days / 7 + milliseconds / 6048e5; case 'day': return days + milliseconds / 864e5; case 'hour': return days * 24 + milliseconds / 36e5; case 'minute': return days * 1440 + milliseconds / 6e4; case 'second': return days * 86400 + milliseconds / 1000; // Math.floor prevents floating point math errors here case 'millisecond': return Math.floor(days * 864e5) + milliseconds; default: throw new Error('Unknown unit ' + units); } } } // TODO: Use this.as('ms')? function valueOf$1() { if (!this.isValid()) { return NaN; } return ( this._milliseconds + this._days * 864e5 + (this._months % 12) * 2592e6 + toInt(this._months / 12) * 31536e6 ); } function makeAs(alias) { return function () { return this.as(alias); }; } var asMilliseconds = makeAs('ms'), asSeconds = makeAs('s'), asMinutes = makeAs('m'), asHours = makeAs('h'), asDays = makeAs('d'), asWeeks = makeAs('w'), asMonths = makeAs('M'), asQuarters = makeAs('Q'), asYears = makeAs('y'); function clone$1() { return createDuration(this); } function get$2(units) { units = normalizeUnits(units); return this.isValid() ? this[units + 's']() : NaN; } function makeGetter(name) { return function () { return this.isValid() ? this._data[name] : NaN; }; } var milliseconds = makeGetter('milliseconds'), seconds = makeGetter('seconds'), minutes = makeGetter('minutes'), hours = makeGetter('hours'), days = makeGetter('days'), months = makeGetter('months'), years = makeGetter('years'); function weeks() { return absFloor(this.days() / 7); } var round = Math.round, thresholds = { ss: 44, // a few seconds to seconds s: 45, // seconds to minute m: 45, // minutes to hour h: 22, // hours to day d: 26, // days to month/week w: null, // weeks to month M: 11, // months to year }; // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); } function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) { var duration = createDuration(posNegDuration).abs(), seconds = round(duration.as('s')), minutes = round(duration.as('m')), hours = round(duration.as('h')), days = round(duration.as('d')), months = round(duration.as('M')), weeks = round(duration.as('w')), years = round(duration.as('y')), a = (seconds <= thresholds.ss && ['s', seconds]) || (seconds < thresholds.s && ['ss', seconds]) || (minutes <= 1 && ['m']) || (minutes < thresholds.m && ['mm', minutes]) || (hours <= 1 && ['h']) || (hours < thresholds.h && ['hh', hours]) || (days <= 1 && ['d']) || (days < thresholds.d && ['dd', days]); if (thresholds.w != null) { a = a || (weeks <= 1 && ['w']) || (weeks < thresholds.w && ['ww', weeks]); } a = a || (months <= 1 && ['M']) || (months < thresholds.M && ['MM', months]) || (years <= 1 && ['y']) || ['yy', years]; a[2] = withoutSuffix; a[3] = +posNegDuration > 0; a[4] = locale; return substituteTimeAgo.apply(null, a); } // This function allows you to set the rounding function for relative time strings function getSetRelativeTimeRounding(roundingFunction) { if (roundingFunction === undefined) { return round; } if (typeof roundingFunction === 'function') { round = roundingFunction; return true; } return false; } // This function allows you to set a threshold for relative time strings function getSetRelativeTimeThreshold(threshold, limit) { if (thresholds[threshold] === undefined) { return false; } if (limit === undefined) { return thresholds[threshold]; } thresholds[threshold] = limit; if (threshold === 's') { thresholds.ss = limit - 1; } return true; } function humanize(argWithSuffix, argThresholds) { if (!this.isValid()) { return this.localeData().invalidDate(); } var withSuffix = false, th = thresholds, locale, output; if (typeof argWithSuffix === 'object') { argThresholds = argWithSuffix; argWithSuffix = false; } if (typeof argWithSuffix === 'boolean') { withSuffix = argWithSuffix; } if (typeof argThresholds === 'object') { th = Object.assign({}, thresholds, argThresholds); if (argThresholds.s != null && argThresholds.ss == null) { th.ss = argThresholds.s - 1; } } locale = this.localeData(); output = relativeTime$1(this, !withSuffix, th, locale); if (withSuffix) { output = locale.pastFuture(+this, output); } return locale.postformat(output); } var abs$1 = Math.abs; function sign(x) { return (x > 0) - (x < 0) || +x; } function toISOString$1() { // for ISO strings we do not use the normal bubbling rules: // * milliseconds bubble up until they become hours // * days do not bubble at all // * months bubble up until they become years // This is because there is no context-free conversion between hours and days // (think of clock changes) // and also not between days and months (28-31 days per month) if (!this.isValid()) { return this.localeData().invalidDate(); } var seconds = abs$1(this._milliseconds) / 1000, days = abs$1(this._days), months = abs$1(this._months), minutes, hours, years, s, total = this.asSeconds(), totalSign, ymSign, daysSign, hmsSign; if (!total) { // this is the same as C#'s (Noda) and python (isodate)... // but not other JS (goog.date) return 'P0D'; } // 3600 seconds -> 60 minutes -> 1 hour minutes = absFloor(seconds / 60); hours = absFloor(minutes / 60); seconds %= 60; minutes %= 60; // 12 months -> 1 year years = absFloor(months / 12); months %= 12; // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; totalSign = total < 0 ? '-' : ''; ymSign = sign(this._months) !== sign(total) ? '-' : ''; daysSign = sign(this._days) !== sign(total) ? '-' : ''; hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; return ( totalSign + 'P' + (years ? ymSign + years + 'Y' : '') + (months ? ymSign + months + 'M' : '') + (days ? daysSign + days + 'D' : '') + (hours || minutes || seconds ? 'T' : '') + (hours ? hmsSign + hours + 'H' : '') + (minutes ? hmsSign + minutes + 'M' : '') + (seconds ? hmsSign + s + 'S' : '') ); } var proto$2 = Duration.prototype; proto$2.isValid = isValid$1; proto$2.abs = abs; proto$2.add = add$1; proto$2.subtract = subtract$1; proto$2.as = as; proto$2.asMilliseconds = asMilliseconds; proto$2.asSeconds = asSeconds; proto$2.asMinutes = asMinutes; proto$2.asHours = asHours; proto$2.asDays = asDays; proto$2.asWeeks = asWeeks; proto$2.asMonths = asMonths; proto$2.asQuarters = asQuarters; proto$2.asYears = asYears; proto$2.valueOf = valueOf$1; proto$2._bubble = bubble; proto$2.clone = clone$1; proto$2.get = get$2; proto$2.milliseconds = milliseconds; proto$2.seconds = seconds; proto$2.minutes = minutes; proto$2.hours = hours; proto$2.days = days; proto$2.weeks = weeks; proto$2.months = months; proto$2.years = years; proto$2.humanize = humanize; proto$2.toISOString = toISOString$1; proto$2.toString = toISOString$1; proto$2.toJSON = toISOString$1; proto$2.locale = locale; proto$2.localeData = localeData; proto$2.toIsoString = deprecate( 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1 ); proto$2.lang = lang; // FORMATTING addFormatToken('X', 0, 0, 'unix'); addFormatToken('x', 0, 0, 'valueOf'); // PARSING addRegexToken('x', matchSigned); addRegexToken('X', matchTimestamp); addParseToken('X', function (input, array, config) { config._d = new Date(parseFloat(input) * 1000); }); addParseToken('x', function (input, array, config) { config._d = new Date(toInt(input)); }); //! moment.js hooks.version = '2.29.0'; setHookCallback(createLocal); hooks.fn = proto; hooks.min = min; hooks.max = max; hooks.now = now; hooks.utc = createUTC; hooks.unix = createUnix; hooks.months = listMonths; hooks.isDate = isDate; hooks.locale = getSetGlobalLocale; hooks.invalid = createInvalid; hooks.duration = createDuration; hooks.isMoment = isMoment; hooks.weekdays = listWeekdays; hooks.parseZone = createInZone; hooks.localeData = getLocale; hooks.isDuration = isDuration; hooks.monthsShort = listMonthsShort; hooks.weekdaysMin = listWeekdaysMin; hooks.defineLocale = defineLocale; hooks.updateLocale = updateLocale; hooks.locales = listLocales; hooks.weekdaysShort = listWeekdaysShort; hooks.normalizeUnits = normalizeUnits; hooks.relativeTimeRounding = getSetRelativeTimeRounding; hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; hooks.calendarFormat = getCalendarFormat; hooks.prototype = proto; // currently HTML5 input type only supports 24-hour formats hooks.HTML5_FMT = { DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // DATE: 'YYYY-MM-DD', // TIME: 'HH:mm', // TIME_SECONDS: 'HH:mm:ss', // TIME_MS: 'HH:mm:ss.SSS', // WEEK: 'GGGG-[W]WW', // MONTH: 'YYYY-MM', // }; return hooks; }))); },{}],579:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function omit(obj, fields) { // eslint-disable-next-line prefer-object-spread var shallowCopy = Object.assign({}, obj); for (var i = 0; i < fields.length; i += 1) { var key = fields[i]; delete shallowCopy[key]; } return shallowCopy; } var _default = omit; exports.default = _default; },{}],580:[function(require,module,exports){ (function (process){ // Generated by CoffeeScript 1.12.2 (function() { var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime; if ((typeof performance !== "undefined" && performance !== null) && performance.now) { module.exports = function() { return performance.now(); }; } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) { module.exports = function() { return (getNanoSeconds() - nodeLoadTime) / 1e6; }; hrtime = process.hrtime; getNanoSeconds = function() { var hr; hr = hrtime(); return hr[0] * 1e9 + hr[1]; }; moduleLoadTime = getNanoSeconds(); upTime = process.uptime() * 1e9; nodeLoadTime = moduleLoadTime - upTime; } else if (Date.now) { module.exports = function() { return Date.now() - loadTime; }; loadTime = Date.now(); } else { module.exports = function() { return new Date().getTime() - loadTime; }; loadTime = new Date().getTime(); } }).call(this); }).call(this,require('_process')) },{"_process":1}],581:[function(require,module,exports){ (function (global){ var now = require('performance-now') , root = typeof window === 'undefined' ? global : window , vendors = ['moz', 'webkit'] , suffix = 'AnimationFrame' , raf = root['request' + suffix] , caf = root['cancel' + suffix] || root['cancelRequest' + suffix] for(var i = 0; !raf && i < vendors.length; i++) { raf = root[vendors[i] + 'Request' + suffix] caf = root[vendors[i] + 'Cancel' + suffix] || root[vendors[i] + 'CancelRequest' + suffix] } // Some versions of FF have rAF but not cAF if(!raf || !caf) { var last = 0 , id = 0 , queue = [] , frameDuration = 1000 / 60 raf = function(callback) { if(queue.length === 0) { var _now = now() , next = Math.max(0, frameDuration - (_now - last)) last = next + _now setTimeout(function() { var cp = queue.slice(0) // Clear queue here to prevent // callbacks from appending listeners // to the current frame's queue queue.length = 0 for(var i = 0; i < cp.length; i++) { if(!cp[i].cancelled) { try{ cp[i].callback(last) } catch(e) { setTimeout(function() { throw e }, 0) } } } }, Math.round(next)) } queue.push({ handle: ++id, callback: callback, cancelled: false }) return id } caf = function(handle) { for(var i = 0; i < queue.length; i++) { if(queue[i].handle === handle) { queue[i].cancelled = true } } } } module.exports = function(fn) { // Wrap in a new function to prevent // `cancel` potentially being assigned // to the native rAF function return raf.call(root, fn) } module.exports.cancel = function() { caf.apply(root, arguments) } module.exports.polyfill = function(object) { if (!object) { object = root; } object.requestAnimationFrame = raf object.cancelAnimationFrame = caf } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"performance-now":580}],582:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _react = _interopRequireDefault(require("react")); var _ref2 = require("rc-util/lib/ref"); var _isVisible = _interopRequireDefault(require("rc-util/lib/Dom/isVisible")); var _domAlign = require("dom-align"); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var _util = require("./util"); var _useBuffer3 = _interopRequireDefault(require("./hooks/useBuffer")); /** * Removed props: * - childrenProps */ function getElement(func) { if (typeof func !== 'function') return null; return func(); } function getPoint(point) { if ((0, _typeof2.default)(point) !== 'object' || !point) return null; return point; } var Align = function Align(_ref, ref) { var children = _ref.children, disabled = _ref.disabled, target = _ref.target, align = _ref.align, onAlign = _ref.onAlign, monitorWindowResize = _ref.monitorWindowResize, _ref$monitorBufferTim = _ref.monitorBufferTime, monitorBufferTime = _ref$monitorBufferTim === void 0 ? 0 : _ref$monitorBufferTim; var cacheRef = _react.default.useRef({}); var nodeRef = _react.default.useRef(); var childNode = _react.default.Children.only(children); // ===================== Align ====================== // We save the props here to avoid closure makes props ood var forceAlignPropsRef = _react.default.useRef({}); forceAlignPropsRef.current.disabled = disabled; forceAlignPropsRef.current.target = target; forceAlignPropsRef.current.onAlign = onAlign; var _useBuffer = (0, _useBuffer3.default)(function () { var _forceAlignPropsRef$c = forceAlignPropsRef.current, latestDisabled = _forceAlignPropsRef$c.disabled, latestTarget = _forceAlignPropsRef$c.target; if (!latestDisabled && latestTarget) { var source = nodeRef.current; var result; var element = getElement(latestTarget); var point = getPoint(latestTarget); cacheRef.current.element = element; cacheRef.current.point = point; // IE lose focus after element realign // We should record activeElement and restore later var _document = document, activeElement = _document.activeElement; // We only align when element is visible if (element && (0, _isVisible.default)(element)) { result = (0, _domAlign.alignElement)(source, element, align); } else if (point) { result = (0, _domAlign.alignPoint)(source, point, align); } (0, _util.restoreFocus)(activeElement, source); if (onAlign && result) { onAlign(source, result); } return true; } return false; }, monitorBufferTime), _useBuffer2 = (0, _slicedToArray2.default)(_useBuffer, 2), _forceAlign = _useBuffer2[0], cancelForceAlign = _useBuffer2[1]; // ===================== Effect ===================== // Listen for target updated var resizeMonitor = _react.default.useRef({ cancel: function cancel() {} }); // Listen for source updated var sourceResizeMonitor = _react.default.useRef({ cancel: function cancel() {} }); _react.default.useEffect(function () { var element = getElement(target); var point = getPoint(target); if (nodeRef.current !== sourceResizeMonitor.current.element) { sourceResizeMonitor.current.cancel(); sourceResizeMonitor.current.element = nodeRef.current; sourceResizeMonitor.current.cancel = (0, _util.monitorResize)(nodeRef.current, _forceAlign); } if (cacheRef.current.element !== element || !(0, _util.isSamePoint)(cacheRef.current.point, point)) { _forceAlign(); // Add resize observer if (resizeMonitor.current.element !== element) { resizeMonitor.current.cancel(); resizeMonitor.current.element = element; resizeMonitor.current.cancel = (0, _util.monitorResize)(element, _forceAlign); } } }); // Listen for disabled change _react.default.useEffect(function () { if (!disabled) { _forceAlign(); } else { cancelForceAlign(); } }, [disabled]); // Listen for window resize var winResizeRef = _react.default.useRef(null); _react.default.useEffect(function () { if (monitorWindowResize) { if (!winResizeRef.current) { winResizeRef.current = (0, _addEventListener.default)(window, 'resize', _forceAlign); } } else if (winResizeRef.current) { winResizeRef.current.remove(); winResizeRef.current = null; } }, [monitorWindowResize]); // Clear all if unmount _react.default.useEffect(function () { return function () { resizeMonitor.current.cancel(); sourceResizeMonitor.current.cancel(); if (winResizeRef.current) winResizeRef.current.remove(); cancelForceAlign(); }; }, []); // ====================== Ref ======================= _react.default.useImperativeHandle(ref, function () { return { forceAlign: function forceAlign() { return _forceAlign(true); } }; }); // ===================== Render ===================== if (_react.default.isValidElement(childNode)) { childNode = _react.default.cloneElement(childNode, { ref: (0, _ref2.composeRef)(childNode.ref, nodeRef) }); } return childNode; }; var RefAlign = _react.default.forwardRef(Align); RefAlign.displayName = 'Align'; var _default = RefAlign; exports.default = _default; },{"./hooks/useBuffer":583,"./util":585,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"dom-align":458,"rc-util/lib/Dom/addEventListener":859,"rc-util/lib/Dom/isVisible":864,"rc-util/lib/ref":874,"react":"react"}],583:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _default = function _default(callback, buffer) { var calledRef = _react.default.useRef(false); var timeoutRef = _react.default.useRef(null); function cancelTrigger() { window.clearTimeout(timeoutRef.current); } function trigger(force) { if (!calledRef.current || force === true) { if (callback() === false) { // Not delay since callback cancelled self return; } calledRef.current = true; cancelTrigger(); timeoutRef.current = window.setTimeout(function () { calledRef.current = false; }, buffer); } else { cancelTrigger(); timeoutRef.current = window.setTimeout(function () { calledRef.current = false; trigger(); }, buffer); } } return [trigger, function () { calledRef.current = false; cancelTrigger(); }]; }; exports.default = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"react":"react"}],584:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Align = _interopRequireDefault(require("./Align")); // export this package's api var _default = _Align.default; exports.default = _default; },{"./Align":582,"@babel/runtime/helpers/interopRequireDefault":192}],585:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.isSamePoint = isSamePoint; exports.restoreFocus = restoreFocus; exports.monitorResize = monitorResize; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill")); var _contains = _interopRequireDefault(require("rc-util/lib/Dom/contains")); function isSamePoint(prev, next) { if (prev === next) return true; if (!prev || !next) return false; if ('pageX' in next && 'pageY' in next) { return prev.pageX === next.pageX && prev.pageY === next.pageY; } if ('clientX' in next && 'clientY' in next) { return prev.clientX === next.clientX && prev.clientY === next.clientY; } return false; } function restoreFocus(activeElement, container) { // Focus back if is in the container if (activeElement !== document.activeElement && (0, _contains.default)(container, activeElement) && typeof activeElement.focus === 'function') { activeElement.focus(); } } function monitorResize(element, callback) { var prevWidth = null; var prevHeight = null; function onResize(_ref) { var _ref2 = (0, _slicedToArray2.default)(_ref, 1), target = _ref2[0].target; if (!document.documentElement.contains(target)) return; var _target$getBoundingCl = target.getBoundingClientRect(), width = _target$getBoundingCl.width, height = _target$getBoundingCl.height; var fixedWidth = Math.floor(width); var fixedHeight = Math.floor(height); if (prevWidth !== fixedWidth || prevHeight !== fixedHeight) { // https://webkit.org/blog/9997/resizeobserver-in-webkit/ Promise.resolve().then(function () { callback({ width: fixedWidth, height: fixedHeight }); }); } prevWidth = fixedWidth; prevHeight = fixedHeight; } var resizeObserver = new _resizeObserverPolyfill.default(onResize); if (element) { resizeObserver.observe(element); } return function () { resizeObserver.disconnect(); }; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"rc-util/lib/Dom/contains":861,"resize-observer-polyfill":899}],586:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _unsafeLifecyclesPolyfill = require('rc-util/lib/unsafeLifecyclesPolyfill'); var _unsafeLifecyclesPolyfill2 = _interopRequireDefault(_unsafeLifecyclesPolyfill); var _ChildrenUtils = require('./ChildrenUtils'); var _AnimateChild = require('./AnimateChild'); var _AnimateChild2 = _interopRequireDefault(_AnimateChild); var _animate = require('./util/animate'); var _animate2 = _interopRequireDefault(_animate); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/prop-types: 0 */ var defaultKey = 'rc_animate_' + Date.now(); function getChildrenFromProps(props) { var children = props.children; if (_react2['default'].isValidElement(children)) { if (!children.key) { return _react2['default'].cloneElement(children, { key: defaultKey }); } } return children; } function noop() {} var Animate = function (_React$Component) { _inherits(Animate, _React$Component); function Animate(props) { _classCallCheck(this, Animate); var _this = _possibleConstructorReturn(this, (Animate.__proto__ || Object.getPrototypeOf(Animate)).call(this, props)); _initialiseProps.call(_this); _this.currentlyAnimatingKeys = {}; _this.keysToEnter = []; _this.keysToLeave = []; _this.state = { children: (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props)) }; _this.childrenRefs = {}; return _this; } // eslint-disable-line _createClass(Animate, [{ key: 'componentDidMount', value: function componentDidMount() { var _this2 = this; var showProp = this.props.showProp; var children = this.state.children; if (showProp) { children = children.filter(function (child) { return !!child.props[showProp]; }); } children.forEach(function (child) { if (child) { _this2.performAppear(child.key); } }); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { var _this3 = this; this.nextProps = nextProps; var nextChildren = (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(nextProps)); var props = this.props; // exclusive needs immediate response if (props.exclusive) { Object.keys(this.currentlyAnimatingKeys).forEach(function (key) { _this3.stop(key); }); } var showProp = props.showProp; var currentlyAnimatingKeys = this.currentlyAnimatingKeys; // last props children if exclusive var currentChildren = props.exclusive ? (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props)) : this.state.children; // in case destroy in showProp mode var newChildren = []; if (showProp) { currentChildren.forEach(function (currentChild) { var nextChild = currentChild && (0, _ChildrenUtils.findChildInChildrenByKey)(nextChildren, currentChild.key); var newChild = void 0; if ((!nextChild || !nextChild.props[showProp]) && currentChild.props[showProp]) { newChild = _react2['default'].cloneElement(nextChild || currentChild, _defineProperty({}, showProp, true)); } else { newChild = nextChild; } if (newChild) { newChildren.push(newChild); } }); nextChildren.forEach(function (nextChild) { if (!nextChild || !(0, _ChildrenUtils.findChildInChildrenByKey)(currentChildren, nextChild.key)) { newChildren.push(nextChild); } }); } else { newChildren = (0, _ChildrenUtils.mergeChildren)(currentChildren, nextChildren); } // need render to avoid update this.setState({ children: newChildren }); nextChildren.forEach(function (child) { var key = child && child.key; if (child && currentlyAnimatingKeys[key]) { return; } var hasPrev = child && (0, _ChildrenUtils.findChildInChildrenByKey)(currentChildren, key); if (showProp) { var showInNext = child.props[showProp]; if (hasPrev) { var showInNow = (0, _ChildrenUtils.findShownChildInChildrenByKey)(currentChildren, key, showProp); if (!showInNow && showInNext) { _this3.keysToEnter.push(key); } } else if (showInNext) { _this3.keysToEnter.push(key); } } else if (!hasPrev) { _this3.keysToEnter.push(key); } }); currentChildren.forEach(function (child) { var key = child && child.key; if (child && currentlyAnimatingKeys[key]) { return; } var hasNext = child && (0, _ChildrenUtils.findChildInChildrenByKey)(nextChildren, key); if (showProp) { var showInNow = child.props[showProp]; if (hasNext) { var showInNext = (0, _ChildrenUtils.findShownChildInChildrenByKey)(nextChildren, key, showProp); if (!showInNext && showInNow) { _this3.keysToLeave.push(key); } } else if (showInNow) { _this3.keysToLeave.push(key); } } else if (!hasNext) { _this3.keysToLeave.push(key); } }); } }, { key: 'componentDidUpdate', value: function componentDidUpdate() { var keysToEnter = this.keysToEnter; this.keysToEnter = []; keysToEnter.forEach(this.performEnter); var keysToLeave = this.keysToLeave; this.keysToLeave = []; keysToLeave.forEach(this.performLeave); } }, { key: 'isValidChildByKey', value: function isValidChildByKey(currentChildren, key) { var showProp = this.props.showProp; if (showProp) { return (0, _ChildrenUtils.findShownChildInChildrenByKey)(currentChildren, key, showProp); } return (0, _ChildrenUtils.findChildInChildrenByKey)(currentChildren, key); } }, { key: 'stop', value: function stop(key) { delete this.currentlyAnimatingKeys[key]; var component = this.childrenRefs[key]; if (component) { component.stop(); } } }, { key: 'render', value: function render() { var _this4 = this; var props = this.props; this.nextProps = props; var stateChildren = this.state.children; var children = null; if (stateChildren) { children = stateChildren.map(function (child) { if (child === null || child === undefined) { return child; } if (!child.key) { throw new Error('must set key for children'); } return _react2['default'].createElement( _AnimateChild2['default'], { key: child.key, ref: function ref(node) { _this4.childrenRefs[child.key] = node; }, animation: props.animation, transitionName: props.transitionName, transitionEnter: props.transitionEnter, transitionAppear: props.transitionAppear, transitionLeave: props.transitionLeave }, child ); }); } var Component = props.component; if (Component) { var passedProps = props; if (typeof Component === 'string') { passedProps = _extends({ className: props.className, style: props.style }, props.componentProps); } return _react2['default'].createElement( Component, passedProps, children ); } return children[0] || null; } }]); return Animate; }(_react2['default'].Component); Animate.isAnimate = true; Animate.defaultProps = { animation: {}, component: 'span', componentProps: {}, transitionEnter: true, transitionLeave: true, transitionAppear: false, onEnd: noop, onEnter: noop, onLeave: noop, onAppear: noop }; var _initialiseProps = function _initialiseProps() { var _this5 = this; this.performEnter = function (key) { // may already remove by exclusive if (_this5.childrenRefs[key]) { _this5.currentlyAnimatingKeys[key] = true; _this5.childrenRefs[key].componentWillEnter(_this5.handleDoneAdding.bind(_this5, key, 'enter')); } }; this.performAppear = function (key) { if (_this5.childrenRefs[key]) { _this5.currentlyAnimatingKeys[key] = true; _this5.childrenRefs[key].componentWillAppear(_this5.handleDoneAdding.bind(_this5, key, 'appear')); } }; this.handleDoneAdding = function (key, type) { var props = _this5.props; delete _this5.currentlyAnimatingKeys[key]; // if update on exclusive mode, skip check if (props.exclusive && props !== _this5.nextProps) { return; } var currentChildren = (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props)); if (!_this5.isValidChildByKey(currentChildren, key)) { // exclusive will not need this _this5.performLeave(key); } else if (type === 'appear') { if (_animate2['default'].allowAppearCallback(props)) { props.onAppear(key); props.onEnd(key, true); } } else if (_animate2['default'].allowEnterCallback(props)) { props.onEnter(key); props.onEnd(key, true); } }; this.performLeave = function (key) { // may already remove by exclusive if (_this5.childrenRefs[key]) { _this5.currentlyAnimatingKeys[key] = true; _this5.childrenRefs[key].componentWillLeave(_this5.handleDoneLeaving.bind(_this5, key)); } }; this.handleDoneLeaving = function (key) { var props = _this5.props; delete _this5.currentlyAnimatingKeys[key]; // if update on exclusive mode, skip check if (props.exclusive && props !== _this5.nextProps) { return; } var currentChildren = (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props)); // in case state change is too fast if (_this5.isValidChildByKey(currentChildren, key)) { _this5.performEnter(key); } else { var end = function end() { if (_animate2['default'].allowLeaveCallback(props)) { props.onLeave(key); props.onEnd(key, false); } }; if (!(0, _ChildrenUtils.isSameChildren)(_this5.state.children, currentChildren, props.showProp)) { _this5.setState({ children: currentChildren }, end); } else { end(); } } }; }; exports['default'] = (0, _unsafeLifecyclesPolyfill2['default'])(Animate); module.exports = exports['default']; },{"./AnimateChild":587,"./ChildrenUtils":588,"./util/animate":589,"rc-util/lib/unsafeLifecyclesPolyfill":590,"react":"react"}],587:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _cssAnimation = require('@ant-design/css-animation'); var _cssAnimation2 = _interopRequireDefault(_cssAnimation); var _animate = require('./util/animate'); var _animate2 = _interopRequireDefault(_animate); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/prop-types: 0 */ var transitionMap = { enter: 'transitionEnter', appear: 'transitionAppear', leave: 'transitionLeave' }; var AnimateChild = function (_React$Component) { _inherits(AnimateChild, _React$Component); function AnimateChild() { _classCallCheck(this, AnimateChild); return _possibleConstructorReturn(this, (AnimateChild.__proto__ || Object.getPrototypeOf(AnimateChild)).apply(this, arguments)); } _createClass(AnimateChild, [{ key: 'componentWillUnmount', value: function componentWillUnmount() { this.stop(); } }, { key: 'componentWillEnter', value: function componentWillEnter(done) { if (_animate2['default'].isEnterSupported(this.props)) { this.transition('enter', done); } else { done(); } } }, { key: 'componentWillAppear', value: function componentWillAppear(done) { if (_animate2['default'].isAppearSupported(this.props)) { this.transition('appear', done); } else { done(); } } }, { key: 'componentWillLeave', value: function componentWillLeave(done) { if (_animate2['default'].isLeaveSupported(this.props)) { this.transition('leave', done); } else { // always sync, do not interupt with react component life cycle // update hidden -> animate hidden -> // didUpdate -> animate leave -> unmount (if animate is none) done(); } } }, { key: 'transition', value: function transition(animationType, finishCallback) { var _this2 = this; var node = _reactDom2['default'].findDOMNode(this); var props = this.props; var transitionName = props.transitionName; var nameIsObj = typeof transitionName === 'object'; this.stop(); var end = function end() { _this2.stopper = null; finishCallback(); }; if ((_cssAnimation.isCssAnimationSupported || !props.animation[animationType]) && transitionName && props[transitionMap[animationType]]) { var name = nameIsObj ? transitionName[animationType] : transitionName + '-' + animationType; var activeName = name + '-active'; if (nameIsObj && transitionName[animationType + 'Active']) { activeName = transitionName[animationType + 'Active']; } this.stopper = (0, _cssAnimation2['default'])(node, { name: name, active: activeName }, end); } else { this.stopper = props.animation[animationType](node, end); } } }, { key: 'stop', value: function stop() { var stopper = this.stopper; if (stopper) { this.stopper = null; stopper.stop(); } } }, { key: 'render', value: function render() { return this.props.children; } }]); return AnimateChild; }(_react2['default'].Component); exports['default'] = AnimateChild; module.exports = exports['default']; },{"./util/animate":589,"@ant-design/css-animation":4,"react":"react","react-dom":"react-dom"}],588:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.toArrayChildren = toArrayChildren; exports.findChildInChildrenByKey = findChildInChildrenByKey; exports.findShownChildInChildrenByKey = findShownChildInChildrenByKey; exports.findHiddenChildInChildrenByKey = findHiddenChildInChildrenByKey; exports.isSameChildren = isSameChildren; exports.mergeChildren = mergeChildren; var _react = require('react'); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function toArrayChildren(children) { var ret = []; _react2['default'].Children.forEach(children, function (child) { ret.push(child); }); return ret; } function findChildInChildrenByKey(children, key) { var ret = null; if (children) { children.forEach(function (child) { if (ret) { return; } if (child && child.key === key) { ret = child; } }); } return ret; } function findShownChildInChildrenByKey(children, key, showProp) { var ret = null; if (children) { children.forEach(function (child) { if (child && child.key === key && child.props[showProp]) { if (ret) { throw new Error('two child with same key for children'); } ret = child; } }); } return ret; } function findHiddenChildInChildrenByKey(children, key, showProp) { var found = 0; if (children) { children.forEach(function (child) { if (found) { return; } found = child && child.key === key && !child.props[showProp]; }); } return found; } function isSameChildren(c1, c2, showProp) { var same = c1.length === c2.length; if (same) { c1.forEach(function (child, index) { var child2 = c2[index]; if (child && child2) { if (child && !child2 || !child && child2) { same = false; } else if (child.key !== child2.key) { same = false; } else if (showProp && child.props[showProp] !== child2.props[showProp]) { same = false; } } }); } return same; } function mergeChildren(prev, next) { var ret = []; // For each key of `next`, the list of keys to insert before that key in // the combined list var nextChildrenPending = {}; var pendingChildren = []; prev.forEach(function (child) { if (child && findChildInChildrenByKey(next, child.key)) { if (pendingChildren.length) { nextChildrenPending[child.key] = pendingChildren; pendingChildren = []; } } else { pendingChildren.push(child); } }); next.forEach(function (child) { if (child && Object.prototype.hasOwnProperty.call(nextChildrenPending, child.key)) { ret = ret.concat(nextChildrenPending[child.key]); } ret.push(child); }); ret = ret.concat(pendingChildren); return ret; } },{"react":"react"}],589:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util = { isAppearSupported: function isAppearSupported(props) { return props.transitionName && props.transitionAppear || props.animation.appear; }, isEnterSupported: function isEnterSupported(props) { return props.transitionName && props.transitionEnter || props.animation.enter; }, isLeaveSupported: function isLeaveSupported(props) { return props.transitionName && props.transitionLeave || props.animation.leave; }, allowAppearCallback: function allowAppearCallback(props) { return props.transitionAppear || props.animation.appear; }, allowEnterCallback: function allowEnterCallback(props) { return props.transitionEnter || props.animation.enter; }, allowLeaveCallback: function allowLeaveCallback(props) { return props.transitionLeave || props.animation.leave; } }; exports["default"] = util; module.exports = exports['default']; },{}],590:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var unsafeLifecyclesPolyfill = function unsafeLifecyclesPolyfill(Component) { var prototype = Component.prototype; if (!prototype || !prototype.isReactComponent) { throw new Error('Can only polyfill class components'); } // only handle componentWillReceiveProps if (typeof prototype.componentWillReceiveProps !== 'function') { return Component; } // In React 16.9, React.Profiler was introduced together with UNSAFE_componentWillReceiveProps // https://reactjs.org/blog/2019/08/08/react-v16.9.0.html#performance-measurements-with-reactprofiler if (!_react.default.Profiler) { return Component; } // Here polyfill get started prototype.UNSAFE_componentWillReceiveProps = prototype.componentWillReceiveProps; delete prototype.componentWillReceiveProps; return Component; }; var _default = unsafeLifecyclesPolyfill; exports.default = _default; },{"react":"react"}],591:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _rcTrigger = _interopRequireDefault(require("rc-trigger")); var _warning = _interopRequireDefault(require("warning")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _arrayTreeFilter = _interopRequireDefault(require("array-tree-filter")); var _utils = require("./utils"); var _Menus = _interopRequireDefault(require("./Menus")); var _placements = _interopRequireDefault(require("./placements")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var Cascader = /*#__PURE__*/function (_React$Component) { _inherits(Cascader, _React$Component); var _super = _createSuper(Cascader); function Cascader(props) { var _this; _classCallCheck(this, Cascader); _this = _super.call(this, props); _this.setPopupVisible = function (popupVisible) { var value = _this.state.value; if (!('popupVisible' in _this.props)) { _this.setState({ popupVisible: popupVisible }); } // sync activeValue with value when panel open if (popupVisible && !_this.state.popupVisible) { _this.setState({ activeValue: value }); } _this.props.onPopupVisibleChange(popupVisible); }; _this.handleChange = function (options, _ref, e) { var visible = _ref.visible; if (e.type !== 'keydown' || e.keyCode === _KeyCode.default.ENTER) { _this.props.onChange(options.map(function (o) { return o[_this.getFieldName('value')]; }), options); _this.setPopupVisible(visible); } }; _this.handlePopupVisibleChange = function (popupVisible) { _this.setPopupVisible(popupVisible); }; _this.handleMenuSelect = function (targetOption, menuIndex, e) { // Keep focused state for keyboard support var triggerNode = _this.trigger.getRootDomNode(); if (triggerNode && triggerNode.focus) { triggerNode.focus(); } var _this$props = _this.props, changeOnSelect = _this$props.changeOnSelect, loadData = _this$props.loadData, expandTrigger = _this$props.expandTrigger; if (!targetOption || targetOption.disabled) { return; } var activeValue = _this.state.activeValue; activeValue = activeValue.slice(0, menuIndex + 1); activeValue[menuIndex] = targetOption[_this.getFieldName('value')]; var activeOptions = _this.getActiveOptions(activeValue); if (targetOption.isLeaf === false && !targetOption[_this.getFieldName('children')] && loadData) { if (changeOnSelect) { _this.handleChange(activeOptions, { visible: true }, e); } _this.setState({ activeValue: activeValue }); loadData(activeOptions); return; } var newState = {}; if (!targetOption[_this.getFieldName('children')] || !targetOption[_this.getFieldName('children')].length) { _this.handleChange(activeOptions, { visible: false }, e); // set value to activeValue when select leaf option newState.value = activeValue; // add e.type judgement to prevent `onChange` being triggered by mouseEnter } else if (changeOnSelect && (e.type === 'click' || e.type === 'keydown')) { if (expandTrigger === 'hover') { _this.handleChange(activeOptions, { visible: false }, e); } else { _this.handleChange(activeOptions, { visible: true }, e); } // set value to activeValue on every select newState.value = activeValue; } newState.activeValue = activeValue; // not change the value by keyboard if ('value' in _this.props || e.type === 'keydown' && e.keyCode !== _KeyCode.default.ENTER) { delete newState.value; } _this.setState(newState); }; _this.handleItemDoubleClick = function () { var changeOnSelect = _this.props.changeOnSelect; if (changeOnSelect) { _this.setPopupVisible(false); } }; _this.handleKeyDown = function (e) { var children = _this.props.children; // https://github.com/ant-design/ant-design/issues/6717 // Don't bind keyboard support when children specify the onKeyDown if (children && children.props.onKeyDown) { children.props.onKeyDown(e); return; } var activeValue = _toConsumableArray(_this.state.activeValue); var currentLevel = activeValue.length - 1 < 0 ? 0 : activeValue.length - 1; var currentOptions = _this.getCurrentLevelOptions(); var currentIndex = currentOptions.map(function (o) { return o[_this.getFieldName('value')]; }).indexOf(activeValue[currentLevel]); if (e.keyCode !== _KeyCode.default.DOWN && e.keyCode !== _KeyCode.default.UP && e.keyCode !== _KeyCode.default.LEFT && e.keyCode !== _KeyCode.default.RIGHT && e.keyCode !== _KeyCode.default.ENTER && e.keyCode !== _KeyCode.default.SPACE && e.keyCode !== _KeyCode.default.BACKSPACE && e.keyCode !== _KeyCode.default.ESC && e.keyCode !== _KeyCode.default.TAB) { return; } // Press any keys above to reopen menu if (!_this.state.popupVisible && e.keyCode !== _KeyCode.default.BACKSPACE && e.keyCode !== _KeyCode.default.LEFT && e.keyCode !== _KeyCode.default.RIGHT && e.keyCode !== _KeyCode.default.ESC && e.keyCode !== _KeyCode.default.TAB) { _this.setPopupVisible(true); return; } if (e.keyCode === _KeyCode.default.DOWN || e.keyCode === _KeyCode.default.UP) { e.preventDefault(); var nextIndex = currentIndex; if (nextIndex !== -1) { if (e.keyCode === _KeyCode.default.DOWN) { nextIndex += 1; nextIndex = nextIndex >= currentOptions.length ? 0 : nextIndex; } else { nextIndex -= 1; nextIndex = nextIndex < 0 ? currentOptions.length - 1 : nextIndex; } } else { nextIndex = 0; } activeValue[currentLevel] = currentOptions[nextIndex][_this.getFieldName('value')]; } else if (e.keyCode === _KeyCode.default.LEFT || e.keyCode === _KeyCode.default.BACKSPACE) { e.preventDefault(); activeValue.splice(activeValue.length - 1, 1); } else if (e.keyCode === _KeyCode.default.RIGHT) { e.preventDefault(); if (currentOptions[currentIndex] && currentOptions[currentIndex][_this.getFieldName('children')]) { activeValue.push(currentOptions[currentIndex][_this.getFieldName('children')][0][_this.getFieldName('value')]); } } else if (e.keyCode === _KeyCode.default.ESC || e.keyCode === _KeyCode.default.TAB) { _this.setPopupVisible(false); return; } if (!activeValue || activeValue.length === 0) { _this.setPopupVisible(false); } var activeOptions = _this.getActiveOptions(activeValue); var targetOption = activeOptions[activeOptions.length - 1]; _this.handleMenuSelect(targetOption, activeOptions.length - 1, e); if (_this.props.onKeyDown) { _this.props.onKeyDown(e); } }; _this.saveTrigger = function (node) { _this.trigger = node; }; var initialValue = []; if ('value' in props) { initialValue = props.value || []; } else if ('defaultValue' in props) { initialValue = props.defaultValue || []; } (0, _warning.default)(!('filedNames' in props), '`filedNames` of Cascader is a typo usage and deprecated, please use `fieldNames` instead.'); _this.state = { popupVisible: props.popupVisible, activeValue: initialValue, value: initialValue, prevProps: props }; _this.defaultFieldNames = { label: 'label', value: 'value', children: 'children' }; return _this; } _createClass(Cascader, [{ key: "getPopupDOMNode", value: function getPopupDOMNode() { return this.trigger.getPopupDomNode(); } }, { key: "getFieldName", value: function getFieldName(name) { var defaultFieldNames = this.defaultFieldNames; var _this$props2 = this.props, fieldNames = _this$props2.fieldNames, filedNames = _this$props2.filedNames; if ('filedNames' in this.props) { return filedNames[name] || defaultFieldNames[name]; // For old compatibility } return fieldNames[name] || defaultFieldNames[name]; } }, { key: "getFieldNames", value: function getFieldNames() { var _this$props3 = this.props, fieldNames = _this$props3.fieldNames, filedNames = _this$props3.filedNames; if ('filedNames' in this.props) { return filedNames; // For old compatibility } return fieldNames; } }, { key: "getCurrentLevelOptions", value: function getCurrentLevelOptions() { var _this2 = this; var _this$props$options = this.props.options, options = _this$props$options === void 0 ? [] : _this$props$options; var _this$state$activeVal = this.state.activeValue, activeValue = _this$state$activeVal === void 0 ? [] : _this$state$activeVal; var result = (0, _arrayTreeFilter.default)(options, function (o, level) { return o[_this2.getFieldName('value')] === activeValue[level]; }, { childrenKeyName: this.getFieldName('children') }); if (result[result.length - 2]) { return result[result.length - 2][this.getFieldName('children')]; } return _toConsumableArray(options).filter(function (o) { return !o.disabled; }); } }, { key: "getActiveOptions", value: function getActiveOptions(activeValue) { var _this3 = this; return (0, _arrayTreeFilter.default)(this.props.options || [], function (o, level) { return o[_this3.getFieldName('value')] === activeValue[level]; }, { childrenKeyName: this.getFieldName('children') }); } }, { key: "render", value: function render() { var _this$props4 = this.props, prefixCls = _this$props4.prefixCls, transitionName = _this$props4.transitionName, popupClassName = _this$props4.popupClassName, _this$props4$options = _this$props4.options, options = _this$props4$options === void 0 ? [] : _this$props4$options, disabled = _this$props4.disabled, builtinPlacements = _this$props4.builtinPlacements, popupPlacement = _this$props4.popupPlacement, children = _this$props4.children, dropdownRender = _this$props4.dropdownRender, restProps = _objectWithoutProperties(_this$props4, ["prefixCls", "transitionName", "popupClassName", "options", "disabled", "builtinPlacements", "popupPlacement", "children", "dropdownRender"]); // Did not show popup when there is no options var menus = React.createElement("div", null); var emptyMenuClassName = ''; if (options && options.length > 0) { menus = React.createElement(_Menus.default, Object.assign({}, this.props, { fieldNames: this.getFieldNames(), defaultFieldNames: this.defaultFieldNames, activeValue: this.state.activeValue, onSelect: this.handleMenuSelect, onItemDoubleClick: this.handleItemDoubleClick, visible: this.state.popupVisible })); } else { emptyMenuClassName = " ".concat(prefixCls, "-menus-empty"); } var popupNode = menus; if (dropdownRender) { popupNode = dropdownRender(menus); } return React.createElement(_rcTrigger.default, Object.assign({ ref: this.saveTrigger }, restProps, { popupPlacement: popupPlacement, builtinPlacements: builtinPlacements, popupTransitionName: transitionName, action: disabled ? [] : ['click'], popupVisible: disabled ? false : this.state.popupVisible, onPopupVisibleChange: this.handlePopupVisibleChange, prefixCls: "".concat(prefixCls, "-menus"), popupClassName: popupClassName + emptyMenuClassName, popup: popupNode }), React.cloneElement(children, { onKeyDown: this.handleKeyDown, tabIndex: disabled ? undefined : 0 })); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, prevState) { var _prevState$prevProps = prevState.prevProps, prevProps = _prevState$prevProps === void 0 ? {} : _prevState$prevProps; var newState = { prevProps: nextProps }; if ('value' in nextProps && !(0, _utils.isEqualArrays)(prevProps.value, nextProps.value)) { newState.value = nextProps.value || []; // allow activeValue diff from value // https://github.com/ant-design/ant-design/issues/2767 if (!('loadData' in nextProps)) { newState.activeValue = nextProps.value || []; } } if ('popupVisible' in nextProps) { newState.popupVisible = nextProps.popupVisible; } return newState; } }]); return Cascader; }(React.Component); Cascader.defaultProps = { onChange: function onChange() {}, onPopupVisibleChange: function onPopupVisibleChange() {}, disabled: false, transitionName: '', prefixCls: 'rc-cascader', popupClassName: '', popupPlacement: 'bottomLeft', builtinPlacements: _placements.default, expandTrigger: 'click', fieldNames: { label: 'label', value: 'value', children: 'children' }, expandIcon: '>' }; var _default = Cascader; exports.default = _default; },{"./Menus":592,"./placements":594,"./utils":595,"array-tree-filter":453,"rc-trigger":848,"rc-util/lib/KeyCode":865,"react":"react","warning":905}],592:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _arrayTreeFilter = _interopRequireDefault(require("array-tree-filter")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var Menus = /*#__PURE__*/function (_React$Component) { _inherits(Menus, _React$Component); var _super = _createSuper(Menus); function Menus() { var _this; _classCallCheck(this, Menus); _this = _super.apply(this, arguments); _this.menuItems = {}; _this.saveMenuItem = function (index) { return function (node) { _this.menuItems[index] = node; }; }; return _this; } _createClass(Menus, [{ key: "componentDidMount", value: function componentDidMount() { this.scrollActiveItemToView(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { if (!prevProps.visible && this.props.visible) { this.scrollActiveItemToView(); } } }, { key: "getFieldName", value: function getFieldName(name) { var _this$props = this.props, fieldNames = _this$props.fieldNames, defaultFieldNames = _this$props.defaultFieldNames; // 防止只设置单个属性的名字 return fieldNames[name] || defaultFieldNames[name]; } }, { key: "getOption", value: function getOption(option, menuIndex) { var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, expandTrigger = _this$props2.expandTrigger, expandIcon = _this$props2.expandIcon, loadingIcon = _this$props2.loadingIcon; var onSelect = this.props.onSelect.bind(this, option, menuIndex); var onItemDoubleClick = this.props.onItemDoubleClick.bind(this, option, menuIndex); var expandProps = { onClick: onSelect, onDoubleClick: onItemDoubleClick }; var menuItemCls = "".concat(prefixCls, "-menu-item"); var expandIconNode = null; var hasChildren = option[this.getFieldName('children')] && option[this.getFieldName('children')].length > 0; if (hasChildren || option.isLeaf === false) { menuItemCls += " ".concat(prefixCls, "-menu-item-expand"); if (!option.loading) { expandIconNode = React.createElement("span", { className: "".concat(prefixCls, "-menu-item-expand-icon") }, expandIcon); } } if (expandTrigger === 'hover' && (hasChildren || option.isLeaf === false)) { expandProps = { onMouseEnter: this.delayOnSelect.bind(this, onSelect), onMouseLeave: this.delayOnSelect.bind(this), onClick: onSelect }; } if (this.isActiveOption(option, menuIndex)) { menuItemCls += " ".concat(prefixCls, "-menu-item-active"); expandProps.ref = this.saveMenuItem(menuIndex); } if (option.disabled) { menuItemCls += " ".concat(prefixCls, "-menu-item-disabled"); } var loadingIconNode = null; if (option.loading) { menuItemCls += " ".concat(prefixCls, "-menu-item-loading"); loadingIconNode = loadingIcon || null; } var title = ''; if ('title' in option) { // eslint-disable-next-line prefer-destructuring title = option.title; } else if (typeof option[this.getFieldName('label')] === 'string') { title = option[this.getFieldName('label')]; } return React.createElement("li", Object.assign({ key: option[this.getFieldName('value')], className: menuItemCls, title: title }, expandProps, { role: "menuitem", onMouseDown: function onMouseDown(e) { return e.preventDefault(); } }), option[this.getFieldName('label')], expandIconNode, loadingIconNode); } }, { key: "getActiveOptions", value: function getActiveOptions(values) { var _this2 = this; var options = this.props.options; var activeValue = values || this.props.activeValue; return (0, _arrayTreeFilter.default)(options, function (o, level) { return o[_this2.getFieldName('value')] === activeValue[level]; }, { childrenKeyName: this.getFieldName('children') }); } }, { key: "getShowOptions", value: function getShowOptions() { var _this3 = this; var options = this.props.options; var result = this.getActiveOptions().map(function (activeOption) { return activeOption[_this3.getFieldName('children')]; }).filter(function (activeOption) { return !!activeOption; }); result.unshift(options); return result; } }, { key: "delayOnSelect", value: function delayOnSelect(onSelect) { var _this4 = this; for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } if (this.delayTimer) { clearTimeout(this.delayTimer); this.delayTimer = null; } if (typeof onSelect === 'function') { this.delayTimer = window.setTimeout(function () { onSelect(args); _this4.delayTimer = null; }, 150); } } }, { key: "scrollActiveItemToView", value: function scrollActiveItemToView() { // scroll into view var optionsLength = this.getShowOptions().length; // eslint-disable-next-line no-plusplus for (var i = 0; i < optionsLength; i++) { var itemComponent = this.menuItems[i]; if (itemComponent && itemComponent.parentElement) { itemComponent.parentElement.scrollTop = itemComponent.offsetTop; } } } }, { key: "isActiveOption", value: function isActiveOption(option, menuIndex) { var _this$props$activeVal = this.props.activeValue, activeValue = _this$props$activeVal === void 0 ? [] : _this$props$activeVal; return activeValue[menuIndex] === option[this.getFieldName('value')]; } }, { key: "render", value: function render() { var _this5 = this; var _this$props3 = this.props, prefixCls = _this$props3.prefixCls, dropdownMenuColumnStyle = _this$props3.dropdownMenuColumnStyle; return React.createElement("div", null, this.getShowOptions().map(function (options, menuIndex) { return React.createElement("ul", { className: "".concat(prefixCls, "-menu"), key: menuIndex, style: dropdownMenuColumnStyle }, options.map(function (option) { return _this5.getOption(option, menuIndex); })); })); } }]); return Menus; }(React.Component); Menus.defaultProps = { options: [], value: [], activeValue: [], onSelect: function onSelect() {}, prefixCls: 'rc-cascader-menus', visible: false, expandTrigger: 'click' }; var _default = Menus; exports.default = _default; },{"array-tree-filter":453,"react":"react"}],593:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Cascader = _interopRequireDefault(require("./Cascader")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _default = _Cascader.default; exports.default = _default; },{"./Cascader":591}],594:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var BUILT_IN_PLACEMENTS = { bottomLeft: { points: ['tl', 'bl'], offset: [0, 4], overflow: { adjustX: 1, adjustY: 1 } }, topLeft: { points: ['bl', 'tl'], offset: [0, -4], overflow: { adjustX: 1, adjustY: 1 } }, bottomRight: { points: ['tr', 'br'], offset: [0, 4], overflow: { adjustX: 1, adjustY: 1 } }, topRight: { points: ['br', 'tr'], offset: [0, -4], overflow: { adjustX: 1, adjustY: 1 } } }; var _default = BUILT_IN_PLACEMENTS; exports.default = _default; },{}],595:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isEqualArrays = isEqualArrays; function isEqualArrays(arrA, arrB) { if (arrA === arrB) { return true; } if (!arrA || !arrB) { return false; } var len = arrA.length; if (arrB.length !== len) { return false; } // eslint-disable-next-line no-plusplus for (var i = 0; i < len; i++) { if (arrA[i] !== arrB[i]) { return false; } } return true; } },{}],596:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var Checkbox = /*#__PURE__*/function (_Component) { (0, _inherits2.default)(Checkbox, _Component); var _super = _createSuper(Checkbox); function Checkbox(props) { var _this; (0, _classCallCheck2.default)(this, Checkbox); _this = _super.call(this, props); _this.handleChange = function (e) { var _this$props = _this.props, disabled = _this$props.disabled, onChange = _this$props.onChange; if (disabled) { return; } if (!('checked' in _this.props)) { _this.setState({ checked: e.target.checked }); } if (onChange) { onChange({ target: _objectSpread(_objectSpread({}, _this.props), {}, { checked: e.target.checked }), stopPropagation: function stopPropagation() { e.stopPropagation(); }, preventDefault: function preventDefault() { e.preventDefault(); }, nativeEvent: e.nativeEvent }); } }; _this.saveInput = function (node) { _this.input = node; }; var checked = 'checked' in props ? props.checked : props.defaultChecked; _this.state = { checked: checked }; return _this; } (0, _createClass2.default)(Checkbox, [{ key: "focus", value: function focus() { this.input.focus(); } }, { key: "blur", value: function blur() { this.input.blur(); } }, { key: "render", value: function render() { var _classNames; var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, style = _this$props2.style, name = _this$props2.name, id = _this$props2.id, type = _this$props2.type, disabled = _this$props2.disabled, readOnly = _this$props2.readOnly, tabIndex = _this$props2.tabIndex, onClick = _this$props2.onClick, onFocus = _this$props2.onFocus, onBlur = _this$props2.onBlur, autoFocus = _this$props2.autoFocus, value = _this$props2.value, required = _this$props2.required, others = (0, _objectWithoutProperties2.default)(_this$props2, ["prefixCls", "className", "style", "name", "id", "type", "disabled", "readOnly", "tabIndex", "onClick", "onFocus", "onBlur", "autoFocus", "value", "required"]); var globalProps = Object.keys(others).reduce(function (prev, key) { if (key.substr(0, 5) === 'aria-' || key.substr(0, 5) === 'data-' || key === 'role') { // eslint-disable-next-line no-param-reassign prev[key] = others[key]; } return prev; }, {}); var checked = this.state.checked; var classString = (0, _classnames.default)(prefixCls, className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-checked"), checked), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-disabled"), disabled), _classNames)); return /*#__PURE__*/_react.default.createElement("span", { className: classString, style: style }, /*#__PURE__*/_react.default.createElement("input", (0, _extends2.default)({ name: name, id: id, type: type, required: required, readOnly: readOnly, disabled: disabled, tabIndex: tabIndex, className: "".concat(prefixCls, "-input"), checked: !!checked, onClick: onClick, onFocus: onFocus, onBlur: onBlur, onChange: this.handleChange, autoFocus: autoFocus, ref: this.saveInput, value: value }, globalProps)), /*#__PURE__*/_react.default.createElement("span", { className: "".concat(prefixCls, "-inner") })); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, state) { if ('checked' in props) { return _objectSpread(_objectSpread({}, state), {}, { checked: props.checked }); } return null; } }]); return Checkbox; }(_react.Component); Checkbox.defaultProps = { prefixCls: 'rc-checkbox', className: '', style: {}, type: 'checkbox', defaultChecked: false, onFocus: function onFocus() {}, onBlur: function onBlur() {}, onChange: function onChange() {} }; var _default = Checkbox; exports.default = _default; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/possibleConstructorReturn":202,"classnames":455,"react":"react"}],597:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _shallowequal = require('shallowequal'); var _shallowequal2 = _interopRequireDefault(_shallowequal); var _toArray = require('rc-util/lib/Children/toArray'); var _toArray2 = _interopRequireDefault(_toArray); var _Panel = require('./Panel'); var _Panel2 = _interopRequireDefault(_Panel); var _openAnimationFactory = require('./openAnimationFactory'); var _openAnimationFactory2 = _interopRequireDefault(_openAnimationFactory); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint-disable react/prop-types */ function getActiveKeysArray(activeKey) { var currentActiveKey = activeKey; if (!Array.isArray(currentActiveKey)) { currentActiveKey = currentActiveKey ? [currentActiveKey] : []; } return currentActiveKey.map(function (key) { return String(key); }); } var Collapse = function (_Component) { _inherits(Collapse, _Component); function Collapse(props) { _classCallCheck(this, Collapse); var _this = _possibleConstructorReturn(this, (Collapse.__proto__ || Object.getPrototypeOf(Collapse)).call(this, props)); _initialiseProps.call(_this); var activeKey = props.activeKey, defaultActiveKey = props.defaultActiveKey; var currentActiveKey = defaultActiveKey; if ('activeKey' in props) { currentActiveKey = activeKey; } _this.state = { openAnimation: props.openAnimation || (0, _openAnimationFactory2['default'])(props.prefixCls), activeKey: getActiveKeysArray(currentActiveKey) }; return _this; } _createClass(Collapse, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate(nextProps, nextState) { return !(0, _shallowequal2['default'])(this.props, nextProps) || !(0, _shallowequal2['default'])(this.state, nextState); } }, { key: 'render', value: function render() { var _classNames; var _props = this.props, prefixCls = _props.prefixCls, className = _props.className, style = _props.style, accordion = _props.accordion; var collapseClassName = (0, _classnames2['default'])((_classNames = {}, _defineProperty(_classNames, prefixCls, true), _defineProperty(_classNames, className, !!className), _classNames)); return _react2['default'].createElement( 'div', { className: collapseClassName, style: style, role: accordion ? 'tablist' : null }, this.getItems() ); } }], [{ key: 'getDerivedStateFromProps', value: function getDerivedStateFromProps(nextProps) { var newState = {}; if ('activeKey' in nextProps) { newState.activeKey = getActiveKeysArray(nextProps.activeKey); } if ('openAnimation' in nextProps) { newState.openAnimation = nextProps.openAnimation; } return newState.activeKey || newState.openAnimation ? newState : null; } }]); return Collapse; }(_react.Component); var _initialiseProps = function _initialiseProps() { var _this2 = this; this.onClickItem = function (key) { var activeKey = _this2.state.activeKey; if (_this2.props.accordion) { activeKey = activeKey[0] === key ? [] : [key]; } else { activeKey = [].concat(_toConsumableArray(activeKey)); var index = activeKey.indexOf(key); var isActive = index > -1; if (isActive) { // remove active state activeKey.splice(index, 1); } else { activeKey.push(key); } } _this2.setActiveKey(activeKey); }; this.getNewChild = function (child, index) { if (!child) return null; var activeKey = _this2.state.activeKey; var _props2 = _this2.props, prefixCls = _props2.prefixCls, accordion = _props2.accordion, destroyInactivePanel = _props2.destroyInactivePanel, expandIcon = _props2.expandIcon; // If there is no key provide, use the panel order as default key var key = child.key || String(index); var _child$props = child.props, header = _child$props.header, headerClass = _child$props.headerClass, disabled = _child$props.disabled; var isActive = false; if (accordion) { isActive = activeKey[0] === key; } else { isActive = activeKey.indexOf(key) > -1; } var props = { key: key, panelKey: key, header: header, headerClass: headerClass, isActive: isActive, prefixCls: prefixCls, destroyInactivePanel: destroyInactivePanel, openAnimation: _this2.state.openAnimation, accordion: accordion, children: child.props.children, onItemClick: disabled ? null : _this2.onClickItem, expandIcon: expandIcon }; // https://github.com/ant-design/ant-design/issues/20479 if (typeof child.type === 'string') { return child; } return _react2['default'].cloneElement(child, props); }; this.getItems = function () { var children = _this2.props.children; return (0, _toArray2['default'])(children).map(_this2.getNewChild); }; this.setActiveKey = function (activeKey) { if (!('activeKey' in _this2.props)) { _this2.setState({ activeKey: activeKey }); } _this2.props.onChange(_this2.props.accordion ? activeKey[0] : activeKey); }; }; Collapse.defaultProps = { prefixCls: 'rc-collapse', onChange: function onChange() {}, accordion: false, destroyInactivePanel: false }; Collapse.Panel = _Panel2['default']; exports['default'] = Collapse; module.exports = exports['default']; },{"./Panel":598,"./openAnimationFactory":601,"classnames":455,"rc-util/lib/Children/toArray":858,"react":"react","shallowequal":901}],598:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _PanelContent = require('./PanelContent'); var _PanelContent2 = _interopRequireDefault(_PanelContent); var _rcAnimate = require('rc-animate'); var _rcAnimate2 = _interopRequireDefault(_rcAnimate); var _shallowequal = require('shallowequal'); var _shallowequal2 = _interopRequireDefault(_shallowequal); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint-disable react/prop-types */ var CollapsePanel = function (_Component) { _inherits(CollapsePanel, _Component); function CollapsePanel() { var _ref; var _temp, _this, _ret; _classCallCheck(this, CollapsePanel); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = CollapsePanel.__proto__ || Object.getPrototypeOf(CollapsePanel)).call.apply(_ref, [this].concat(args))), _this), _this.handleItemClick = function () { var _this$props = _this.props, onItemClick = _this$props.onItemClick, panelKey = _this$props.panelKey; if (typeof onItemClick === 'function') { onItemClick(panelKey); } }, _this.handleKeyPress = function (e) { if (e.key === 'Enter' || e.keyCode === 13 || e.which === 13) { _this.handleItemClick(); } }, _temp), _possibleConstructorReturn(_this, _ret); } _createClass(CollapsePanel, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate(nextProps) { return !(0, _shallowequal2['default'])(this.props, nextProps); } }, { key: 'render', value: function render() { var _classNames2; var _props = this.props, className = _props.className, id = _props.id, style = _props.style, prefixCls = _props.prefixCls, header = _props.header, headerClass = _props.headerClass, children = _props.children, isActive = _props.isActive, showArrow = _props.showArrow, destroyInactivePanel = _props.destroyInactivePanel, disabled = _props.disabled, accordion = _props.accordion, forceRender = _props.forceRender, expandIcon = _props.expandIcon, extra = _props.extra; var headerCls = (0, _classnames2['default'])(prefixCls + '-header', _defineProperty({}, headerClass, headerClass)); var itemCls = (0, _classnames2['default'])((_classNames2 = {}, _defineProperty(_classNames2, prefixCls + '-item', true), _defineProperty(_classNames2, prefixCls + '-item-active', isActive), _defineProperty(_classNames2, prefixCls + '-item-disabled', disabled), _classNames2), className); var icon = _react2['default'].createElement('i', { className: 'arrow' }); if (showArrow && typeof expandIcon === 'function') { icon = expandIcon(this.props); } return _react2['default'].createElement( 'div', { className: itemCls, style: style, id: id }, _react2['default'].createElement( 'div', { className: headerCls, onClick: this.handleItemClick, role: accordion ? 'tab' : 'button', tabIndex: disabled ? -1 : 0, 'aria-expanded': '' + isActive, onKeyPress: this.handleKeyPress }, showArrow && icon, header, extra && _react2['default'].createElement( 'div', { className: prefixCls + '-extra' }, extra ) ), _react2['default'].createElement( _rcAnimate2['default'], { showProp: 'isActive', exclusive: true, component: '', animation: this.props.openAnimation }, _react2['default'].createElement( _PanelContent2['default'], { prefixCls: prefixCls, isActive: isActive, destroyInactivePanel: destroyInactivePanel, forceRender: forceRender, role: accordion ? 'tabpanel' : null }, children ) ) ); } }]); return CollapsePanel; }(_react.Component); CollapsePanel.defaultProps = { showArrow: true, isActive: false, destroyInactivePanel: false, onItemClick: function onItemClick() {}, headerClass: '', forceRender: false }; exports['default'] = CollapsePanel; module.exports = exports['default']; },{"./PanelContent":599,"classnames":455,"rc-animate":586,"react":"react","shallowequal":901}],599:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _classnames2 = require('classnames'); var _classnames3 = _interopRequireDefault(_classnames2); var _shallowequal = require('shallowequal'); var _shallowequal2 = _interopRequireDefault(_shallowequal); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint-disable react/prop-types */ var PanelContent = function (_Component) { _inherits(PanelContent, _Component); function PanelContent() { _classCallCheck(this, PanelContent); return _possibleConstructorReturn(this, (PanelContent.__proto__ || Object.getPrototypeOf(PanelContent)).apply(this, arguments)); } _createClass(PanelContent, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate(nextProps) { return this.props.forceRender || !(0, _shallowequal2['default'])(this.props, nextProps); } }, { key: 'render', value: function render() { var _classnames; this._isActived = this.props.forceRender || this._isActived || this.props.isActive; if (!this._isActived) { return null; } var _props = this.props, prefixCls = _props.prefixCls, isActive = _props.isActive, children = _props.children, destroyInactivePanel = _props.destroyInactivePanel, forceRender = _props.forceRender, role = _props.role; var contentCls = (0, _classnames3['default'])(prefixCls + '-content', (_classnames = {}, _defineProperty(_classnames, prefixCls + '-content-active', isActive), _defineProperty(_classnames, prefixCls + '-content-inactive', !isActive), _classnames)); var child = !forceRender && !isActive && destroyInactivePanel ? null : _react2['default'].createElement( 'div', { className: prefixCls + '-content-box' }, children ); return _react2['default'].createElement( 'div', { className: contentCls, role: role }, child ); } }]); return PanelContent; }(_react.Component); exports['default'] = PanelContent; module.exports = exports['default']; },{"classnames":455,"react":"react","shallowequal":901}],600:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.Panel = undefined; var _Collapse = require('./Collapse'); var _Collapse2 = _interopRequireDefault(_Collapse); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } exports['default'] = _Collapse2['default']; var Panel = exports.Panel = _Collapse2['default'].Panel; },{"./Collapse":597}],601:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _cssAnimation = require('@ant-design/css-animation'); var _cssAnimation2 = _interopRequireDefault(_cssAnimation); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function animate(node, show, transitionName, done) { var height = void 0; return (0, _cssAnimation2['default'])(node, transitionName, { start: function start() { if (!show) { node.style.height = node.offsetHeight + 'px'; } else { height = node.offsetHeight; node.style.height = 0; } }, active: function active() { node.style.height = (show ? height : 0) + 'px'; }, end: function end() { node.style.height = ''; done(); } }); } function animation(prefixCls) { return { enter: function enter(node, done) { return animate(node, true, prefixCls + '-anim', done); }, leave: function leave(node, done) { return animate(node, false, prefixCls + '-anim', done); } }; } exports['default'] = animation; module.exports = exports['default']; },{"@ant-design/css-animation":4}],602:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var ReactDOM = _interopRequireWildcard(require("react-dom")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _contains = _interopRequireDefault(require("rc-util/lib/Dom/contains")); var _rcAnimate = _interopRequireDefault(require("rc-animate")); var _LazyRenderBox = _interopRequireDefault(require("./LazyRenderBox")); var uuid = 0; /* eslint react/no-is-mounted:0 */ function getScroll(w, top) { var ret = w["page".concat(top ? 'Y' : 'X', "Offset")]; var method = "scroll".concat(top ? 'Top' : 'Left'); if (typeof ret !== 'number') { var d = w.document; ret = d.documentElement[method]; if (typeof ret !== 'number') { ret = d.body[method]; } } return ret; } function setTransformOrigin(node, value) { var style = node.style; ['Webkit', 'Moz', 'Ms', 'ms'].forEach(function (prefix) { style["".concat(prefix, "TransformOrigin")] = value; }); style.transformOrigin = value; } function offset(el) { var rect = el.getBoundingClientRect(); var pos = { left: rect.left, top: rect.top }; var doc = el.ownerDocument; var w = doc.defaultView || doc.parentWindow; pos.left += getScroll(w); pos.top += getScroll(w, true); return pos; } var Dialog = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Dialog, _React$Component); var _super = (0, _createSuper2.default)(Dialog); function Dialog(props) { var _this; (0, _classCallCheck2.default)(this, Dialog); _this = _super.call(this, props); _this.inTransition = false; _this.onAnimateLeave = function () { var _this$props = _this.props, afterClose = _this$props.afterClose, getOpenCount = _this$props.getOpenCount, focusTriggerAfterClose = _this$props.focusTriggerAfterClose, mask = _this$props.mask; // need demo? // https://github.com/react-component/dialog/pull/28 if (_this.wrap) { _this.wrap.style.display = 'none'; } _this.inTransition = false; // 如果没有打开的状态,则清除 effect 和 overflow: hidden; // https://github.com/ant-design/ant-design/issues/21539 if (!getOpenCount()) { _this.switchScrollingEffect(); } if (mask && _this.lastOutSideFocusNode && focusTriggerAfterClose) { try { _this.lastOutSideFocusNode.focus({ preventScroll: true }); } catch (e) { _this.lastOutSideFocusNode = null; } _this.lastOutSideFocusNode = null; } if (afterClose) { afterClose(); } }; _this.onDialogMouseDown = function () { _this.dialogMouseDown = true; }; _this.onMaskMouseUp = function () { if (_this.dialogMouseDown) { _this.timeoutId = setTimeout(function () { _this.dialogMouseDown = false; }, 0); } }; _this.onMaskClick = function (e) { // android trigger click on open (fastclick??) if (Date.now() - _this.openTime < 300) { return; } if (e.target === e.currentTarget && !_this.dialogMouseDown) { _this.close(e); } }; _this.onKeyDown = function (e) { var _this$props2 = _this.props, keyboard = _this$props2.keyboard, visible = _this$props2.visible; if (keyboard && e.keyCode === _KeyCode.default.ESC) { e.stopPropagation(); _this.close(e); return; } // keep focus inside dialog if (visible) { if (e.keyCode === _KeyCode.default.TAB) { var _document = document, activeElement = _document.activeElement; if (e.shiftKey) { if (activeElement === _this.sentinelStart) { _this.sentinelEnd.focus(); } } else if (activeElement === _this.sentinelEnd) { _this.sentinelStart.focus(); } } } }; _this.getDialogElement = function () { var _this$props3 = _this.props, closable = _this$props3.closable, prefixCls = _this$props3.prefixCls, width = _this$props3.width, height = _this$props3.height, footer = _this$props3.footer, title = _this$props3.title, closeIcon = _this$props3.closeIcon, style = _this$props3.style, className = _this$props3.className, visible = _this$props3.visible, forceRender = _this$props3.forceRender, bodyStyle = _this$props3.bodyStyle, bodyProps = _this$props3.bodyProps, children = _this$props3.children, destroyOnClose = _this$props3.destroyOnClose; var dest = {}; if (width !== undefined) { dest.width = width; } if (height !== undefined) { dest.height = height; } var footerNode; if (footer) { footerNode = React.createElement("div", { className: "".concat(prefixCls, "-footer"), ref: _this.saveRef('footer') }, footer); } var headerNode; if (title) { headerNode = React.createElement("div", { className: "".concat(prefixCls, "-header"), ref: _this.saveRef('header') }, React.createElement("div", { className: "".concat(prefixCls, "-title"), id: _this.titleId }, title)); } var closer; if (closable) { closer = React.createElement("button", { type: "button", onClick: _this.close, "aria-label": "Close", className: "".concat(prefixCls, "-close") }, closeIcon || React.createElement("span", { className: "".concat(prefixCls, "-close-x") })); } var styleBox = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), dest); var sentinelStyle = { width: 0, height: 0, overflow: 'hidden', outline: 'none' }; var transitionName = _this.getTransitionName(); var dialogElement = React.createElement(_LazyRenderBox.default, { key: "dialog-element", role: "document", ref: _this.saveRef('dialog'), style: styleBox, className: "".concat(prefixCls, " ").concat(className || ''), visible: visible, forceRender: forceRender, onMouseDown: _this.onDialogMouseDown }, React.createElement("div", { tabIndex: 0, ref: _this.saveRef('sentinelStart'), style: sentinelStyle, "aria-hidden": "true" }), React.createElement("div", { className: "".concat(prefixCls, "-content") }, closer, headerNode, React.createElement("div", Object.assign({ className: "".concat(prefixCls, "-body"), style: bodyStyle, ref: _this.saveRef('body') }, bodyProps), children), footerNode), React.createElement("div", { tabIndex: 0, ref: _this.saveRef('sentinelEnd'), style: sentinelStyle, "aria-hidden": "true" })); return React.createElement(_rcAnimate.default, { key: "dialog", showProp: "visible", onLeave: _this.onAnimateLeave, transitionName: transitionName, component: "", transitionAppear: true }, visible || !destroyOnClose ? dialogElement : null); }; _this.getZIndexStyle = function () { var style = {}; var zIndex = _this.props.zIndex; if (zIndex !== undefined) { style.zIndex = zIndex; } return style; }; _this.getWrapStyle = function () { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, _this.getZIndexStyle()), _this.props.wrapStyle); }; _this.getMaskStyle = function () { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, _this.getZIndexStyle()), _this.props.maskStyle); }; _this.getMaskElement = function () { var _this$props4 = _this.props, mask = _this$props4.mask, prefixCls = _this$props4.prefixCls, visible = _this$props4.visible, maskProps = _this$props4.maskProps; var maskElement; if (mask) { var maskTransition = _this.getMaskTransitionName(); maskElement = React.createElement(_LazyRenderBox.default, Object.assign({ style: _this.getMaskStyle(), key: "mask", className: "".concat(prefixCls, "-mask"), hiddenClassName: "".concat(prefixCls, "-mask-hidden"), visible: visible }, maskProps)); if (maskTransition) { maskElement = React.createElement(_rcAnimate.default, { key: "mask", showProp: "visible", transitionAppear: true, component: "", transitionName: maskTransition }, maskElement); } } return maskElement; }; _this.getMaskTransitionName = function () { var _this$props5 = _this.props, maskTransitionName = _this$props5.maskTransitionName, maskAnimation = _this$props5.maskAnimation, prefixCls = _this$props5.prefixCls; var transitionName = maskTransitionName; var animation = maskAnimation; if (!transitionName && animation) { transitionName = "".concat(prefixCls, "-").concat(animation); } return transitionName; }; _this.getTransitionName = function () { var _this$props6 = _this.props, transitionName = _this$props6.transitionName, animation = _this$props6.animation, prefixCls = _this$props6.prefixCls; var transitionNameResult = transitionName; if (!transitionName && animation) { transitionNameResult = "".concat(prefixCls, "-").concat(animation); } return transitionNameResult; }; _this.close = function (e) { var onClose = _this.props.onClose; if (onClose) { onClose(e); } }; _this.saveRef = function (name) { return function (node) { _this[name] = node; }; }; _this.titleId = "rcDialogTitle".concat(uuid); uuid += 1; _this.switchScrollingEffect = props.switchScrollingEffect || function () {}; return _this; } (0, _createClass2.default)(Dialog, [{ key: "componentDidMount", value: function componentDidMount() { this.componentDidUpdate({}); // if forceRender is true, set element style display to be none; if (this.props.forceRender && this.props.visible) { return; } if ((this.props.forceRender || this.props.getContainer === false && !this.props.visible) && this.wrap) { this.wrap.style.display = 'none'; } } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var visible = this.props.visible; var mousePosition = this.props.mousePosition; if (visible) { // first show if (!prevProps.visible) { this.openTime = Date.now(); this.switchScrollingEffect(); this.tryFocus(); // eslint-disable-next-line react/no-find-dom-node var dialogNode = ReactDOM.findDOMNode(this.dialog); if (mousePosition) { var elOffset = offset(dialogNode); setTransformOrigin(dialogNode, "".concat(mousePosition.x - elOffset.left, "px ").concat(mousePosition.y - elOffset.top, "px")); } else { setTransformOrigin(dialogNode, ''); } } } else if (prevProps.visible) { this.inTransition = true; } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _this$props7 = this.props, visible = _this$props7.visible, getOpenCount = _this$props7.getOpenCount; if ((visible || this.inTransition) && !getOpenCount()) { this.switchScrollingEffect(); } clearTimeout(this.timeoutId); } }, { key: "tryFocus", value: function tryFocus() { if (!(0, _contains.default)(this.wrap, document.activeElement)) { this.lastOutSideFocusNode = document.activeElement; this.sentinelStart.focus(); } } }, { key: "render", value: function render() { var props = this.props; var prefixCls = props.prefixCls, maskClosable = props.maskClosable; var style = this.getWrapStyle(); // clear hide display // and only set display after async anim, not here for hide if (props.visible) { style.display = null; } return React.createElement("div", { className: "".concat(prefixCls, "-root") }, this.getMaskElement(), React.createElement("div", Object.assign({ tabIndex: -1, onKeyDown: this.onKeyDown, className: "".concat(prefixCls, "-wrap ").concat(props.wrapClassName || ''), ref: this.saveRef('wrap'), onClick: maskClosable ? this.onMaskClick : null, onMouseUp: maskClosable ? this.onMaskMouseUp : null, role: "dialog", "aria-labelledby": props.title ? this.titleId : null, style: style }, props.wrapProps), this.getDialogElement())); } }]); return Dialog; }(React.Component); exports.default = Dialog; Dialog.defaultProps = { className: '', mask: true, visible: false, keyboard: true, closable: true, maskClosable: true, destroyOnClose: false, prefixCls: 'rc-dialog', focusTriggerAfterClose: true }; },{"./LazyRenderBox":604,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"rc-animate":586,"rc-util/lib/Dom/contains":861,"rc-util/lib/KeyCode":865,"react":"react","react-dom":"react-dom"}],603:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _PortalWrapper = _interopRequireDefault(require("rc-util/lib/PortalWrapper")); var _Dialog = _interopRequireDefault(require("./Dialog")); // fix issue #10656 /* * getContainer remarks * Custom container should not be return, because in the Portal component, it will remove the * return container element here, if the custom container is the only child of it's component, * like issue #10656, It will has a conflict with removeChild method in react-dom. * So here should add a child (div element) to custom container. * */ var _default = function _default(props) { var visible = props.visible, getContainer = props.getContainer, forceRender = props.forceRender; // 渲染在当前 dom 里; if (getContainer === false) { return React.createElement(_Dialog.default, Object.assign({}, props, { getOpenCount: function getOpenCount() { return 2; } })); } return React.createElement(_PortalWrapper.default, { visible: visible, forceRender: forceRender, getContainer: getContainer }, function (childProps) { return React.createElement(_Dialog.default, Object.assign({}, props, childProps)); }); }; exports.default = _default; },{"./Dialog":602,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-util/lib/PortalWrapper":867,"react":"react"}],604:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var LazyRenderBox = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(LazyRenderBox, _React$Component); var _super = (0, _createSuper2.default)(LazyRenderBox); function LazyRenderBox() { (0, _classCallCheck2.default)(this, LazyRenderBox); return _super.apply(this, arguments); } (0, _createClass2.default)(LazyRenderBox, [{ key: "shouldComponentUpdate", value: function shouldComponentUpdate(nextProps) { if (nextProps.forceRender) { return true; } return !!nextProps.hiddenClassName || !!nextProps.visible; } }, { key: "render", value: function render() { var _this$props = this.props, className = _this$props.className, hiddenClassName = _this$props.hiddenClassName, visible = _this$props.visible, forceRender = _this$props.forceRender, restProps = (0, _objectWithoutProperties2.default)(_this$props, ["className", "hiddenClassName", "visible", "forceRender"]); var useClassName = className; if (!!hiddenClassName && !visible) { useClassName += " ".concat(hiddenClassName); } return React.createElement("div", Object.assign({}, restProps, { className: useClassName })); } }]); return LazyRenderBox; }(React.Component); exports.default = LazyRenderBox; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"react":"react"}],605:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _DialogWrap = _interopRequireDefault(require("./DialogWrap")); var _default = _DialogWrap.default; exports.default = _default; },{"./DialogWrap":603,"@babel/runtime/helpers/interopRequireDefault":192}],606:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _classnames2 = _interopRequireDefault(require("classnames")); var _getScrollBarSize = _interopRequireDefault(require("rc-util/lib/getScrollBarSize")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var React = _interopRequireWildcard(require("react")); var _utils = require("./utils"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var currentDrawer = {}; var DrawerChild = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(DrawerChild, _React$Component); var _super = _createSuper(DrawerChild); function DrawerChild(props) { var _this; (0, _classCallCheck2.default)(this, DrawerChild); _this = _super.call(this, props); _this.domFocus = function () { if (_this.dom) { _this.dom.focus(); } }; _this.removeStartHandler = function (e) { if (e.touches.length > 1) { return; } _this.startPos = { x: e.touches[0].clientX, y: e.touches[0].clientY }; }; _this.removeMoveHandler = function (e) { if (e.changedTouches.length > 1) { return; } var currentTarget = e.currentTarget; var differX = e.changedTouches[0].clientX - _this.startPos.x; var differY = e.changedTouches[0].clientY - _this.startPos.y; if ((currentTarget === _this.maskDom || currentTarget === _this.handlerDom || currentTarget === _this.contentDom && (0, _utils.getTouchParentScroll)(currentTarget, e.target, differX, differY)) && e.cancelable) { e.preventDefault(); } }; _this.transitionEnd = function (e) { var dom = e.target; (0, _utils.removeEventListener)(dom, _utils.transitionEnd, _this.transitionEnd); dom.style.transition = ''; }; _this.onKeyDown = function (e) { if (e.keyCode === _KeyCode.default.ESC) { var onClose = _this.props.onClose; e.stopPropagation(); if (onClose) { onClose(e); } } }; _this.onWrapperTransitionEnd = function (e) { var _this$props = _this.props, open = _this$props.open, afterVisibleChange = _this$props.afterVisibleChange; if (e.target === _this.contentWrapper && e.propertyName.match(/transform$/)) { _this.dom.style.transition = ''; if (!open && _this.getCurrentDrawerSome()) { document.body.style.overflowX = ''; if (_this.maskDom) { _this.maskDom.style.left = ''; _this.maskDom.style.width = ''; } } if (afterVisibleChange) { afterVisibleChange(!!open); } } }; _this.openLevelTransition = function () { var _this$props2 = _this.props, open = _this$props2.open, width = _this$props2.width, height = _this$props2.height; var _this$getHorizontalBo = _this.getHorizontalBoolAndPlacementName(), isHorizontal = _this$getHorizontalBo.isHorizontal, placementName = _this$getHorizontalBo.placementName; var contentValue = _this.contentDom ? _this.contentDom.getBoundingClientRect()[isHorizontal ? 'width' : 'height'] : 0; var value = (isHorizontal ? width : height) || contentValue; _this.setLevelAndScrolling(open, placementName, value); }; _this.setLevelTransform = function (open, placementName, value, right) { var _this$props3 = _this.props, placement = _this$props3.placement, levelMove = _this$props3.levelMove, duration = _this$props3.duration, ease = _this$props3.ease, showMask = _this$props3.showMask; // router 切换时可能会导至页面失去滚动条,所以需要时时获取。 _this.levelDom.forEach(function (dom) { dom.style.transition = "transform ".concat(duration, " ").concat(ease); (0, _utils.addEventListener)(dom, _utils.transitionEnd, _this.transitionEnd); var levelValue = open ? value : 0; if (levelMove) { var $levelMove = (0, _utils.transformArguments)(levelMove, { target: dom, open: open }); levelValue = open ? $levelMove[0] : $levelMove[1] || 0; } var $value = typeof levelValue === 'number' ? "".concat(levelValue, "px") : levelValue; var placementPos = placement === 'left' || placement === 'top' ? $value : "-".concat($value); placementPos = showMask && placement === 'right' && right ? "calc(".concat(placementPos, " + ").concat(right, "px)") : placementPos; dom.style.transform = levelValue ? "".concat(placementName, "(").concat(placementPos, ")") : ''; }); }; _this.setLevelAndScrolling = function (open, placementName, value) { var onChange = _this.props.onChange; if (!_utils.windowIsUndefined) { var right = document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight) && window.innerWidth > document.body.offsetWidth ? (0, _getScrollBarSize.default)(true) : 0; _this.setLevelTransform(open, placementName, value, right); _this.toggleScrollingToDrawerAndBody(right); } if (onChange) { onChange(open); } }; _this.toggleScrollingToDrawerAndBody = function (right) { var _this$props4 = _this.props, getOpenCount = _this$props4.getOpenCount, getContainer = _this$props4.getContainer, showMask = _this$props4.showMask, open = _this$props4.open; var container = getContainer && getContainer(); var openCount = getOpenCount && getOpenCount(); // 处理 body 滚动 if (container && container.parentNode === document.body && showMask) { var eventArray = ['touchstart']; var domArray = [document.body, _this.maskDom, _this.handlerDom, _this.contentDom]; if (open && document.body.style.overflow !== 'hidden') { if (right) { _this.addScrollingEffect(right); } if (openCount === 1) { document.body.style.overflow = 'hidden'; } document.body.style.touchAction = 'none'; // 手机禁滚 domArray.forEach(function (item, i) { if (!item) { return; } (0, _utils.addEventListener)(item, eventArray[i] || 'touchmove', i ? _this.removeMoveHandler : _this.removeStartHandler, _this.passive); }); } else if (_this.getCurrentDrawerSome()) { // 没有弹框的状态下清除 overflow; if (!openCount) { document.body.style.overflow = ''; } document.body.style.touchAction = ''; if (right) { _this.remScrollingEffect(right); } // 恢复事件 domArray.forEach(function (item, i) { if (!item) { return; } (0, _utils.removeEventListener)(item, eventArray[i] || 'touchmove', i ? _this.removeMoveHandler : _this.removeStartHandler, _this.passive); }); } } }; _this.addScrollingEffect = function (right) { var _this$props5 = _this.props, placement = _this$props5.placement, duration = _this$props5.duration, ease = _this$props5.ease, getOpenCount = _this$props5.getOpenCount, switchScrollingEffect = _this$props5.switchScrollingEffect; var openCount = getOpenCount && getOpenCount(); if (openCount === 1) { switchScrollingEffect(); } var widthTransition = "width ".concat(duration, " ").concat(ease); var transformTransition = "transform ".concat(duration, " ").concat(ease); _this.dom.style.transition = 'none'; switch (placement) { case 'right': _this.dom.style.transform = "translateX(-".concat(right, "px)"); break; case 'top': case 'bottom': _this.dom.style.width = "calc(100% - ".concat(right, "px)"); _this.dom.style.transform = 'translateZ(0)'; break; default: break; } clearTimeout(_this.timeout); _this.timeout = setTimeout(function () { if (_this.dom) { _this.dom.style.transition = "".concat(transformTransition, ",").concat(widthTransition); _this.dom.style.width = ''; _this.dom.style.transform = ''; } }); }; _this.remScrollingEffect = function (right) { var _this$props6 = _this.props, placement = _this$props6.placement, duration = _this$props6.duration, ease = _this$props6.ease, getOpenCount = _this$props6.getOpenCount, switchScrollingEffect = _this$props6.switchScrollingEffect; var openCount = getOpenCount && getOpenCount(); if (!openCount) { switchScrollingEffect(true); } if (_utils.transitionStr) { document.body.style.overflowX = 'hidden'; } _this.dom.style.transition = 'none'; var heightTransition; var widthTransition = "width ".concat(duration, " ").concat(ease); var transformTransition = "transform ".concat(duration, " ").concat(ease); switch (placement) { case 'left': { _this.dom.style.width = '100%'; widthTransition = "width 0s ".concat(ease, " ").concat(duration); break; } case 'right': { _this.dom.style.transform = "translateX(".concat(right, "px)"); _this.dom.style.width = '100%'; widthTransition = "width 0s ".concat(ease, " ").concat(duration); if (_this.maskDom) { _this.maskDom.style.left = "-".concat(right, "px"); _this.maskDom.style.width = "calc(100% + ".concat(right, "px)"); } break; } case 'top': case 'bottom': { _this.dom.style.width = "calc(100% + ".concat(right, "px)"); _this.dom.style.height = '100%'; _this.dom.style.transform = 'translateZ(0)'; heightTransition = "height 0s ".concat(ease, " ").concat(duration); break; } default: break; } clearTimeout(_this.timeout); _this.timeout = setTimeout(function () { if (_this.dom) { _this.dom.style.transition = "".concat(transformTransition, ",").concat(heightTransition ? "".concat(heightTransition, ",") : '').concat(widthTransition); _this.dom.style.transform = ''; _this.dom.style.width = ''; _this.dom.style.height = ''; } }); }; _this.getCurrentDrawerSome = function () { return !Object.keys(currentDrawer).some(function (key) { return currentDrawer[key]; }); }; _this.getLevelDom = function (_ref) { var level = _ref.level, getContainer = _ref.getContainer; if (_utils.windowIsUndefined) { return; } var container = getContainer && getContainer(); var parent = container ? container.parentNode : null; _this.levelDom = []; if (level === 'all') { var children = parent ? Array.prototype.slice.call(parent.children) : []; children.forEach(function (child) { if (child.nodeName !== 'SCRIPT' && child.nodeName !== 'STYLE' && child.nodeName !== 'LINK' && child !== container) { _this.levelDom.push(child); } }); } else if (level) { (0, _utils.dataToArray)(level).forEach(function (key) { document.querySelectorAll(key).forEach(function (item) { _this.levelDom.push(item); }); }); } }; _this.getHorizontalBoolAndPlacementName = function () { var placement = _this.props.placement; var isHorizontal = placement === 'left' || placement === 'right'; var placementName = "translate".concat(isHorizontal ? 'X' : 'Y'); return { isHorizontal: isHorizontal, placementName: placementName }; }; _this.state = { _self: (0, _assertThisInitialized2.default)(_this) }; return _this; } (0, _createClass2.default)(DrawerChild, [{ key: "componentDidMount", value: function componentDidMount() { var _this2 = this; if (!_utils.windowIsUndefined) { var passiveSupported = false; try { window.addEventListener('test', null, Object.defineProperty({}, 'passive', { get: function get() { passiveSupported = true; return null; } })); } catch (err) {} this.passive = passiveSupported ? { passive: false } : false; } var _this$props7 = this.props, open = _this$props7.open, getContainer = _this$props7.getContainer; var container = getContainer && getContainer(); this.drawerId = "drawer_id_".concat(Number((Date.now() + Math.random()).toString().replace('.', Math.round(Math.random() * 9).toString())).toString(16)); this.getLevelDom(this.props); if (open) { if (container && container.parentNode === document.body) { currentDrawer[this.drawerId] = open; } // 默认打开状态时推出 level; this.openLevelTransition(); this.forceUpdate(function () { _this2.domFocus(); }); } } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this$props8 = this.props, open = _this$props8.open, getContainer = _this$props8.getContainer; var container = getContainer && getContainer(); if (open !== prevProps.open) { if (open) { this.domFocus(); } if (container && container.parentNode === document.body) { currentDrawer[this.drawerId] = !!open; } this.openLevelTransition(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _this$props9 = this.props, getOpenCount = _this$props9.getOpenCount, open = _this$props9.open, switchScrollingEffect = _this$props9.switchScrollingEffect; var openCount = typeof getOpenCount === 'function' && getOpenCount(); delete currentDrawer[this.drawerId]; if (open) { this.setLevelTransform(false); document.body.style.touchAction = ''; } if (!openCount) { document.body.style.overflow = ''; switchScrollingEffect(true); } } // tslint:disable-next-line:member-ordering }, { key: "render", value: function render() { var _classnames, _this3 = this; var _this$props10 = this.props, className = _this$props10.className, children = _this$props10.children, style = _this$props10.style, width = _this$props10.width, height = _this$props10.height, defaultOpen = _this$props10.defaultOpen, $open = _this$props10.open, prefixCls = _this$props10.prefixCls, placement = _this$props10.placement, level = _this$props10.level, levelMove = _this$props10.levelMove, ease = _this$props10.ease, duration = _this$props10.duration, getContainer = _this$props10.getContainer, handler = _this$props10.handler, onChange = _this$props10.onChange, afterVisibleChange = _this$props10.afterVisibleChange, showMask = _this$props10.showMask, maskClosable = _this$props10.maskClosable, maskStyle = _this$props10.maskStyle, onClose = _this$props10.onClose, onHandleClick = _this$props10.onHandleClick, keyboard = _this$props10.keyboard, getOpenCount = _this$props10.getOpenCount, switchScrollingEffect = _this$props10.switchScrollingEffect, props = (0, _objectWithoutProperties2.default)(_this$props10, ["className", "children", "style", "width", "height", "defaultOpen", "open", "prefixCls", "placement", "level", "levelMove", "ease", "duration", "getContainer", "handler", "onChange", "afterVisibleChange", "showMask", "maskClosable", "maskStyle", "onClose", "onHandleClick", "keyboard", "getOpenCount", "switchScrollingEffect"]); // 首次渲染都将是关闭状态。 var open = this.dom ? $open : false; var wrapperClassName = (0, _classnames2.default)(prefixCls, (_classnames = {}, (0, _defineProperty2.default)(_classnames, "".concat(prefixCls, "-").concat(placement), true), (0, _defineProperty2.default)(_classnames, "".concat(prefixCls, "-open"), open), (0, _defineProperty2.default)(_classnames, className || '', !!className), (0, _defineProperty2.default)(_classnames, 'no-mask', !showMask), _classnames)); var _this$getHorizontalBo2 = this.getHorizontalBoolAndPlacementName(), placementName = _this$getHorizontalBo2.placementName; // 百分比与像素动画不同步,第一次打用后全用像素动画。 // const defaultValue = !this.contentDom || !level ? '100%' : `${value}px`; var placementPos = placement === 'left' || placement === 'top' ? '-100%' : '100%'; var transform = open ? '' : "".concat(placementName, "(").concat(placementPos, ")"); var handlerChildren = handler && React.cloneElement(handler, { onClick: function onClick(e) { if (handler.props.onClick) { handler.props.onClick(); } if (onHandleClick) { onHandleClick(e); } }, ref: function ref(c) { _this3.handlerDom = c; } }); return React.createElement("div", Object.assign({}, props, { tabIndex: -1, className: wrapperClassName, style: style, ref: function ref(c) { _this3.dom = c; }, onKeyDown: open && keyboard ? this.onKeyDown : undefined, onTransitionEnd: this.onWrapperTransitionEnd }), showMask && React.createElement("div", { className: "".concat(prefixCls, "-mask"), onClick: maskClosable ? onClose : undefined, style: maskStyle, ref: function ref(c) { _this3.maskDom = c; } }), React.createElement("div", { className: "".concat(prefixCls, "-content-wrapper"), style: { transform: transform, msTransform: transform, width: (0, _utils.isNumeric)(width) ? "".concat(width, "px") : width, height: (0, _utils.isNumeric)(height) ? "".concat(height, "px") : height }, ref: function ref(c) { _this3.contentWrapper = c; } }, React.createElement("div", { className: "".concat(prefixCls, "-content"), ref: function ref(c) { _this3.contentDom = c; }, onTouchStart: open && showMask ? this.removeStartHandler : undefined, onTouchMove: open && showMask ? this.removeMoveHandler : undefined }, children), handlerChildren)); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, _ref2) { var prevProps = _ref2.prevProps, _self = _ref2._self; var nextState = { prevProps: props }; if (prevProps !== undefined) { var placement = props.placement, level = props.level; if (placement !== prevProps.placement) { // test 的 bug, 有动画过场,删除 dom _self.contentDom = null; } if (level !== prevProps.level) { _self.getLevelDom(props); } } return nextState; } }]); return DrawerChild; }(React.Component); DrawerChild.defaultProps = { switchScrollingEffect: function switchScrollingEffect() {} }; var _default = DrawerChild; exports.default = _default; },{"./utils":609,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/possibleConstructorReturn":202,"classnames":455,"rc-util/lib/KeyCode":865,"rc-util/lib/getScrollBarSize":869,"react":"react"}],607:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _PortalWrapper = _interopRequireDefault(require("rc-util/lib/PortalWrapper")); var React = _interopRequireWildcard(require("react")); var _DrawerChild = _interopRequireDefault(require("./DrawerChild")); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var DrawerWrapper = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(DrawerWrapper, _React$Component); var _super = _createSuper(DrawerWrapper); function DrawerWrapper(props) { var _this; (0, _classCallCheck2.default)(this, DrawerWrapper); _this = _super.call(this, props); _this.onHandleClick = function (e) { var _this$props = _this.props, onHandleClick = _this$props.onHandleClick, $open = _this$props.open; if (onHandleClick) { onHandleClick(e); } if (typeof $open === 'undefined') { var _open = _this.state.open; _this.setState({ open: !_open }); } }; _this.onClose = function (e) { var _this$props2 = _this.props, onClose = _this$props2.onClose, open = _this$props2.open; if (onClose) { onClose(e); } if (typeof open === 'undefined') { _this.setState({ open: false }); } }; var open = typeof props.open !== 'undefined' ? props.open : !!props.defaultOpen; _this.state = { open: open }; if ('onMaskClick' in props) { console.warn('`onMaskClick` are removed, please use `onClose` instead.'); } return _this; } (0, _createClass2.default)(DrawerWrapper, [{ key: "render", // tslint:disable-next-line:member-ordering value: function render() { var _this2 = this; var _this$props3 = this.props, defaultOpen = _this$props3.defaultOpen, getContainer = _this$props3.getContainer, wrapperClassName = _this$props3.wrapperClassName, forceRender = _this$props3.forceRender, handler = _this$props3.handler, props = (0, _objectWithoutProperties2.default)(_this$props3, ["defaultOpen", "getContainer", "wrapperClassName", "forceRender", "handler"]); var open = this.state.open; // 渲染在当前 dom 里; if (!getContainer) { return React.createElement("div", { className: wrapperClassName, ref: function ref(c) { _this2.dom = c; } }, React.createElement(_DrawerChild.default, Object.assign({}, props, { open: open, handler: handler, getContainer: function getContainer() { return _this2.dom; }, onClose: this.onClose, onHandleClick: this.onHandleClick }))); } // 如果有 handler 为内置强制渲染; var $forceRender = !!handler || forceRender; return React.createElement(_PortalWrapper.default, { visible: open, forceRender: $forceRender, getContainer: getContainer, wrapperClassName: wrapperClassName }, function (_ref) { var visible = _ref.visible, afterClose = _ref.afterClose, rest = (0, _objectWithoutProperties2.default)(_ref, ["visible", "afterClose"]); return (// react 15,componentWillUnmount 时 Portal 返回 afterClose, visible. React.createElement(_DrawerChild.default, Object.assign({}, props, rest, { open: visible !== undefined ? visible : open, afterVisibleChange: afterClose !== undefined ? afterClose : props.afterVisibleChange, handler: handler, onClose: _this2.onClose, onHandleClick: _this2.onHandleClick })) ); }); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, _ref2) { var prevProps = _ref2.prevProps; var newState = { prevProps: props }; if (typeof prevProps !== 'undefined' && props.open !== prevProps.open) { newState.open = props.open; } return newState; } }]); return DrawerWrapper; }(React.Component); DrawerWrapper.defaultProps = { prefixCls: 'drawer', placement: 'left', getContainer: 'body', defaultOpen: false, level: 'all', duration: '.3s', ease: 'cubic-bezier(0.78, 0.14, 0.15, 0.86)', onChange: function onChange() {}, afterVisibleChange: function afterVisibleChange() {}, handler: React.createElement("div", { className: "drawer-handle" }, React.createElement("i", { className: "drawer-handle-icon" })), showMask: true, maskClosable: true, maskStyle: {}, wrapperClassName: '', className: '', keyboard: true, forceRender: false }; var _default = DrawerWrapper; exports.default = _default; },{"./DrawerChild":606,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/possibleConstructorReturn":202,"rc-util/lib/PortalWrapper":867,"react":"react"}],608:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _DrawerWrapper = _interopRequireDefault(require("./DrawerWrapper")); // export this package's api var _default = _DrawerWrapper.default; exports.default = _default; },{"./DrawerWrapper":607,"@babel/runtime/helpers/interopRequireDefault":192}],609:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.dataToArray = dataToArray; exports.addEventListener = addEventListener; exports.removeEventListener = removeEventListener; exports.transformArguments = transformArguments; exports.getTouchParentScroll = exports.windowIsUndefined = exports.isNumeric = exports.transitionEnd = exports.transitionStr = void 0; function dataToArray(vars) { if (Array.isArray(vars)) { return vars; } return [vars]; } var transitionEndObject = { transition: 'transitionend', WebkitTransition: 'webkitTransitionEnd', MozTransition: 'transitionend', OTransition: 'oTransitionEnd otransitionend' }; var transitionStr = Object.keys(transitionEndObject).filter(function (key) { if (typeof document === 'undefined') { return false; } var html = document.getElementsByTagName('html')[0]; return key in (html ? html.style : {}); })[0]; exports.transitionStr = transitionStr; var transitionEnd = transitionEndObject[transitionStr]; exports.transitionEnd = transitionEnd; function addEventListener(target, eventType, callback, options) { if (target.addEventListener) { target.addEventListener(eventType, callback, options); } else if (target.attachEvent) { // tslint:disable-line target.attachEvent("on".concat(eventType), callback); // tslint:disable-line } } function removeEventListener(target, eventType, callback, options) { if (target.removeEventListener) { target.removeEventListener(eventType, callback, options); } else if (target.attachEvent) { // tslint:disable-line target.detachEvent("on".concat(eventType), callback); // tslint:disable-line } } function transformArguments(arg, cb) { var result = typeof arg === 'function' ? arg(cb) : arg; if (Array.isArray(result)) { if (result.length === 2) { return result; } return [result[0], result[1]]; } return [result]; } var isNumeric = function isNumeric(value) { return !isNaN(parseFloat(value)) && isFinite(value); }; exports.isNumeric = isNumeric; var windowIsUndefined = !(typeof window !== 'undefined' && window.document && window.document.createElement); exports.windowIsUndefined = windowIsUndefined; var getTouchParentScroll = function getTouchParentScroll(root, currentTarget, differX, differY) { if (!currentTarget || currentTarget === document || currentTarget instanceof Document) { return false; } // root 为 drawer-content 设定了 overflow, 判断为 root 的 parent 时结束滚动; if (currentTarget === root.parentNode) { return true; } var isY = Math.max(Math.abs(differX), Math.abs(differY)) === Math.abs(differY); var isX = Math.max(Math.abs(differX), Math.abs(differY)) === Math.abs(differX); var scrollY = currentTarget.scrollHeight - currentTarget.clientHeight; var scrollX = currentTarget.scrollWidth - currentTarget.clientWidth; var style = document.defaultView.getComputedStyle(currentTarget); var overflowY = style.overflowY === 'auto' || style.overflowY === 'scroll'; var overflowX = style.overflowX === 'auto' || style.overflowX === 'scroll'; var y = scrollY && overflowY; var x = scrollX && overflowX; if (isY && (!y || y && (currentTarget.scrollTop >= scrollY && differY < 0 || currentTarget.scrollTop <= 0 && differY > 0)) || isX && (!x || x && (currentTarget.scrollLeft >= scrollX && differX < 0 || currentTarget.scrollLeft <= 0 && differX > 0))) { return getTouchParentScroll(root, currentTarget.parentNode, differX, differY); } return false; }; exports.getTouchParentScroll = getTouchParentScroll; },{}],610:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _rcTrigger = _interopRequireDefault(require("rc-trigger")); var _classnames = _interopRequireDefault(require("classnames")); var _placements = _interopRequireDefault(require("./placements")); function Dropdown(props, ref) { var _props$arrow = props.arrow, arrow = _props$arrow === void 0 ? false : _props$arrow, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-dropdown' : _props$prefixCls, transitionName = props.transitionName, animation = props.animation, align = props.align, _props$placement = props.placement, placement = _props$placement === void 0 ? 'bottomLeft' : _props$placement, _props$placements = props.placements, placements = _props$placements === void 0 ? _placements.default : _props$placements, getPopupContainer = props.getPopupContainer, showAction = props.showAction, hideAction = props.hideAction, overlayClassName = props.overlayClassName, overlayStyle = props.overlayStyle, visible = props.visible, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? ['hover'] : _props$trigger, otherProps = (0, _objectWithoutProperties2.default)(props, ["arrow", "prefixCls", "transitionName", "animation", "align", "placement", "placements", "getPopupContainer", "showAction", "hideAction", "overlayClassName", "overlayStyle", "visible", "trigger"]); var _React$useState = React.useState(), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), triggerVisible = _React$useState2[0], setTriggerVisible = _React$useState2[1]; var mergedVisible = 'visible' in props ? visible : triggerVisible; var triggerRef = React.useRef(null); React.useImperativeHandle(ref, function () { return triggerRef.current; }); var getOverlayElement = function getOverlayElement() { var overlay = props.overlay; var overlayElement; if (typeof overlay === 'function') { overlayElement = overlay(); } else { overlayElement = overlay; } return overlayElement; }; var onClick = function onClick(e) { var onOverlayClick = props.onOverlayClick; var overlayProps = getOverlayElement().props; setTriggerVisible(false); if (onOverlayClick) { onOverlayClick(e); } if (overlayProps.onClick) { overlayProps.onClick(e); } }; var onVisibleChange = function onVisibleChange(visible) { var onVisibleChange = props.onVisibleChange; setTriggerVisible(visible); if (typeof onVisibleChange === 'function') { onVisibleChange(visible); } }; var getMenuElement = function getMenuElement() { var overlayElement = getOverlayElement(); var extraOverlayProps = { prefixCls: "".concat(prefixCls, "-menu"), onClick: onClick }; if (typeof overlayElement.type === 'string') { delete extraOverlayProps.prefixCls; } return React.createElement(React.Fragment, null, arrow && React.createElement("div", { className: "".concat(prefixCls, "-arrow") }), React.cloneElement(overlayElement, extraOverlayProps)); }; var getMenuElementOrLambda = function getMenuElementOrLambda() { var overlay = props.overlay; if (typeof overlay === 'function') { return getMenuElement; } return getMenuElement(); }; var getMinOverlayWidthMatchTrigger = function getMinOverlayWidthMatchTrigger() { var minOverlayWidthMatchTrigger = props.minOverlayWidthMatchTrigger, alignPoint = props.alignPoint; if ('minOverlayWidthMatchTrigger' in props) { return minOverlayWidthMatchTrigger; } return !alignPoint; }; var getOpenClassName = function getOpenClassName() { var openClassName = props.openClassName; if (openClassName !== undefined) { return openClassName; } return "".concat(prefixCls, "-open"); }; var renderChildren = function renderChildren() { var children = props.children; var childrenProps = children.props ? children.props : {}; var childClassName = (0, _classnames.default)(childrenProps.className, getOpenClassName()); return triggerVisible && children ? React.cloneElement(children, { className: childClassName }) : children; }; var triggerHideAction = hideAction; if (!triggerHideAction && trigger.indexOf('contextMenu') !== -1) { triggerHideAction = ['click']; } return React.createElement(_rcTrigger.default, Object.assign({}, otherProps, { prefixCls: prefixCls, ref: triggerRef, popupClassName: (0, _classnames.default)(overlayClassName, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-show-arrow"), arrow)), popupStyle: overlayStyle, builtinPlacements: placements, action: trigger, showAction: showAction, hideAction: triggerHideAction || [], popupPlacement: placement, popupAlign: align, popupTransitionName: transitionName, popupAnimation: animation, popupVisible: mergedVisible, stretch: getMinOverlayWidthMatchTrigger() ? 'minWidth' : '', popup: getMenuElementOrLambda(), onPopupVisibleChange: onVisibleChange, getPopupContainer: getPopupContainer }), renderChildren()); } var _default = React.forwardRef(Dropdown); exports.default = _default; },{"./placements":612,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-trigger":848,"react":"react"}],611:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Dropdown = _interopRequireDefault(require("./Dropdown")); var _default = _Dropdown.default; exports.default = _default; },{"./Dropdown":610,"@babel/runtime/helpers/interopRequireDefault":192}],612:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var autoAdjustOverflow = { adjustX: 1, adjustY: 1 }; var targetOffset = [0, 0]; var placements = { topLeft: { points: ['bl', 'tl'], overflow: autoAdjustOverflow, offset: [0, -4], targetOffset: targetOffset }, topCenter: { points: ['bc', 'tc'], overflow: autoAdjustOverflow, offset: [0, -4], targetOffset: targetOffset }, topRight: { points: ['br', 'tr'], overflow: autoAdjustOverflow, offset: [0, -4], targetOffset: targetOffset }, bottomLeft: { points: ['tl', 'bl'], overflow: autoAdjustOverflow, offset: [0, 4], targetOffset: targetOffset }, bottomCenter: { points: ['tc', 'bc'], overflow: autoAdjustOverflow, offset: [0, 4], targetOffset: targetOffset }, bottomRight: { points: ['tr', 'br'], overflow: autoAdjustOverflow, offset: [0, 4], targetOffset: targetOffset } }; var _default = placements; exports.default = _default; },{}],613:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var React = _interopRequireWildcard(require("react")); var _FieldContext = _interopRequireWildcard(require("./FieldContext")); var _typeUtil = require("./utils/typeUtil"); var _validateUtil = require("./utils/validateUtil"); var _valueUtil = require("./utils/valueUtil"); function requireUpdate(shouldUpdate, prev, next, prevValue, nextValue, info) { if (typeof shouldUpdate === 'function') { return shouldUpdate(prev, next, 'source' in info ? { source: info.source } : {}); } return prevValue !== nextValue; } // We use Class instead of Hooks here since it will cost much code by using Hooks. var Field = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Field, _React$Component); var _super = (0, _createSuper2.default)(Field); function Field() { var _this; (0, _classCallCheck2.default)(this, Field); _this = _super.apply(this, arguments); _this.state = { resetCount: 0 }; _this.cancelRegisterFunc = null; _this.destroy = false; /** * Follow state should not management in State since it will async update by React. * This makes first render of form can not get correct state value. */ _this.touched = false; /** Mark when touched & validated. Currently only used for `dependencies` */ _this.dirty = false; _this.validatePromise = null; _this.errors = []; _this.cancelRegister = function () { var _this$props = _this.props, preserve = _this$props.preserve, isListField = _this$props.isListField; if (_this.cancelRegisterFunc) { _this.cancelRegisterFunc(isListField, preserve); } _this.cancelRegisterFunc = null; }; // ================================== Utils ================================== _this.getNamePath = function () { var name = _this.props.name; var _this$context$prefixN = _this.context.prefixName, prefixName = _this$context$prefixN === void 0 ? [] : _this$context$prefixN; return name !== undefined ? [].concat((0, _toConsumableArray2.default)(prefixName), (0, _toConsumableArray2.default)(name)) : []; }; _this.getRules = function () { var _this$props$rules = _this.props.rules, rules = _this$props$rules === void 0 ? [] : _this$props$rules; return rules.map(function (rule) { if (typeof rule === 'function') { return rule(_this.context); } return rule; }); }; _this.refresh = function () { if (_this.destroy) return; /** * Clean up current node. */ _this.setState(function (_ref) { var resetCount = _ref.resetCount; return { resetCount: resetCount + 1 }; }); }; // ========================= Field Entity Interfaces ========================= // Trigger by store update. Check if need update the component _this.onStoreChange = function (prevStore, namePathList, info) { var _this$props2 = _this.props, shouldUpdate = _this$props2.shouldUpdate, _this$props2$dependen = _this$props2.dependencies, dependencies = _this$props2$dependen === void 0 ? [] : _this$props2$dependen, onReset = _this$props2.onReset; var store = info.store; var namePath = _this.getNamePath(); var prevValue = _this.getValue(prevStore); var curValue = _this.getValue(store); var namePathMatch = namePathList && (0, _valueUtil.containsNamePath)(namePathList, namePath); // `setFieldsValue` is a quick access to update related status if (info.type === 'valueUpdate' && info.source === 'external' && prevValue !== curValue) { _this.touched = true; _this.dirty = true; _this.validatePromise = null; _this.errors = []; } switch (info.type) { case 'reset': if (!namePathList || namePathMatch) { // Clean up state _this.touched = false; _this.dirty = false; _this.validatePromise = null; _this.errors = []; if (onReset) { onReset(); } _this.refresh(); return; } break; case 'setField': { if (namePathMatch) { var data = info.data; if ('touched' in data) { _this.touched = data.touched; } if ('validating' in data && !('originRCField' in data)) { _this.validatePromise = data.validating ? Promise.resolve([]) : null; } if ('errors' in data) { _this.errors = data.errors || []; } _this.dirty = true; _this.reRender(); return; } // Handle update by `setField` with `shouldUpdate` if (shouldUpdate && !namePath.length && requireUpdate(shouldUpdate, prevStore, store, prevValue, curValue, info)) { _this.reRender(); return; } break; } case 'dependenciesUpdate': { /** * Trigger when marked `dependencies` updated. Related fields will all update */ var dependencyList = dependencies.map(_valueUtil.getNamePath); // No need for `namePathMath` check and `shouldUpdate` check, since `valueUpdate` will be // emitted earlier and they will work there // If set it may cause unnecessary twice rerendering if (dependencyList.some(function (dependency) { return (0, _valueUtil.containsNamePath)(info.relatedFields, dependency); })) { _this.reRender(); return; } break; } default: // 1. If `namePath` exists in `namePathList`, means it's related value and should update // For example // If `namePathList` is [['list']] (List value update), Field should be updated // If `namePathList` is [['list', 0]] (Field value update), List shouldn't be updated // 2. // 2.1 If `dependencies` is set, `name` is not set and `shouldUpdate` is not set, // don't use `shouldUpdate`. `dependencies` is view as a shortcut if `shouldUpdate` // is not provided // 2.2 If `shouldUpdate` provided, use customize logic to update the field // else to check if value changed if (namePathMatch || (!dependencies.length || namePath.length || shouldUpdate) && requireUpdate(shouldUpdate, prevStore, store, prevValue, curValue, info)) { _this.reRender(); return; } break; } if (shouldUpdate === true) { _this.reRender(); } }; _this.validateRules = function (options) { var _this$props3 = _this.props, _this$props3$validate = _this$props3.validateFirst, validateFirst = _this$props3$validate === void 0 ? false : _this$props3$validate, messageVariables = _this$props3.messageVariables; var _ref2 = options || {}, triggerName = _ref2.triggerName; var namePath = _this.getNamePath(); var filteredRules = _this.getRules(); if (triggerName) { filteredRules = filteredRules.filter(function (rule) { var validateTrigger = rule.validateTrigger; if (!validateTrigger) { return true; } var triggerList = (0, _typeUtil.toArray)(validateTrigger); return triggerList.includes(triggerName); }); } var promise = (0, _validateUtil.validateRules)(namePath, _this.getValue(), filteredRules, options, validateFirst, messageVariables); _this.dirty = true; _this.validatePromise = promise; _this.errors = []; promise.catch(function (e) { return e; }).then(function () { var errors = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; if (_this.validatePromise === promise) { _this.validatePromise = null; _this.errors = errors; _this.reRender(); } }); return promise; }; _this.isFieldValidating = function () { return !!_this.validatePromise; }; _this.isFieldTouched = function () { return _this.touched; }; _this.isFieldDirty = function () { return _this.dirty; }; _this.getErrors = function () { return _this.errors; }; // ============================= Child Component ============================= _this.getMeta = function () { // Make error & validating in cache to save perf _this.prevValidating = _this.isFieldValidating(); var meta = { touched: _this.isFieldTouched(), validating: _this.prevValidating, errors: _this.errors, name: _this.getNamePath() }; return meta; }; // Only return validate child node. If invalidate, will do nothing about field. _this.getOnlyChild = function (children) { // Support render props if (typeof children === 'function') { var meta = _this.getMeta(); return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, _this.getOnlyChild(children(_this.getControlled(), meta, _this.context))), {}, { isFunction: true }); } // Filed element only var childList = (0, _toArray.default)(children); if (childList.length !== 1 || !React.isValidElement(childList[0])) { return { child: childList, isFunction: false }; } return { child: childList[0], isFunction: false }; }; // ============================== Field Control ============================== _this.getValue = function (store) { var getFieldsValue = _this.context.getFieldsValue; var namePath = _this.getNamePath(); return (0, _valueUtil.getValue)(store || getFieldsValue(true), namePath); }; _this.getControlled = function () { var childProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var _this$props4 = _this.props, trigger = _this$props4.trigger, validateTrigger = _this$props4.validateTrigger, getValueFromEvent = _this$props4.getValueFromEvent, normalize = _this$props4.normalize, valuePropName = _this$props4.valuePropName, getValueProps = _this$props4.getValueProps; var mergedValidateTrigger = validateTrigger !== undefined ? validateTrigger : _this.context.validateTrigger; var namePath = _this.getNamePath(); var _this$context = _this.context, getInternalHooks = _this$context.getInternalHooks, getFieldsValue = _this$context.getFieldsValue; var _getInternalHooks = getInternalHooks(_FieldContext.HOOK_MARK), dispatch = _getInternalHooks.dispatch; var value = _this.getValue(); var mergedGetValueProps = getValueProps || function (val) { return (0, _defineProperty2.default)({}, valuePropName, val); }; // eslint-disable-next-line @typescript-eslint/no-explicit-any var originTriggerFunc = childProps[trigger]; var control = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, childProps), mergedGetValueProps(value)); // Add trigger control[trigger] = function () { // Mark as touched _this.touched = true; _this.dirty = true; var newValue; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (getValueFromEvent) { newValue = getValueFromEvent.apply(void 0, args); } else { newValue = _valueUtil.defaultGetValueFromEvent.apply(void 0, [valuePropName].concat(args)); } if (normalize) { newValue = normalize(newValue, value, getFieldsValue(true)); } dispatch({ type: 'updateValue', namePath: namePath, value: newValue }); if (originTriggerFunc) { originTriggerFunc.apply(void 0, args); } }; // Add validateTrigger var validateTriggerList = (0, _typeUtil.toArray)(mergedValidateTrigger || []); validateTriggerList.forEach(function (triggerName) { // Wrap additional function of component, so that we can get latest value from store var originTrigger = control[triggerName]; control[triggerName] = function () { if (originTrigger) { originTrigger.apply(void 0, arguments); } // Always use latest rules var rules = _this.props.rules; if (rules && rules.length) { // We dispatch validate to root, // since it will update related data with other field with same name dispatch({ type: 'validateField', namePath: namePath, triggerName: triggerName }); } }; }); return control; }; return _this; } // ============================== Subscriptions ============================== (0, _createClass2.default)(Field, [{ key: "componentDidMount", value: function componentDidMount() { var shouldUpdate = this.props.shouldUpdate; var getInternalHooks = this.context.getInternalHooks; var _getInternalHooks2 = getInternalHooks(_FieldContext.HOOK_MARK), registerField = _getInternalHooks2.registerField; this.cancelRegisterFunc = registerField(this); // One more render for component in case fields not ready if (shouldUpdate === true) { this.reRender(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.cancelRegister(); this.destroy = true; } }, { key: "reRender", value: function reRender() { if (this.destroy) return; this.forceUpdate(); } }, { key: "render", value: function render() { var resetCount = this.state.resetCount; var children = this.props.children; var _this$getOnlyChild = this.getOnlyChild(children), child = _this$getOnlyChild.child, isFunction = _this$getOnlyChild.isFunction; // Not need to `cloneElement` since user can handle this in render function self var returnChildNode; if (isFunction) { returnChildNode = child; } else if (React.isValidElement(child)) { returnChildNode = React.cloneElement(child, this.getControlled(child.props)); } else { (0, _warning.default)(!child, '`children` of Field is not validate ReactElement.'); returnChildNode = child; } return React.createElement(React.Fragment, { key: resetCount }, returnChildNode); } }]); return Field; }(React.Component); Field.contextType = _FieldContext.default; Field.defaultProps = { trigger: 'onChange', valuePropName: 'value' }; var WrapperField = function WrapperField(_ref4) { var name = _ref4.name, restProps = (0, _objectWithoutProperties2.default)(_ref4, ["name"]); var namePath = name !== undefined ? (0, _valueUtil.getNamePath)(name) : undefined; var key = 'keep'; if (!restProps.isListField) { key = "_".concat((namePath || []).join('_')); } if (process.env.NODE_ENV !== 'production') { (0, _warning.default)(restProps.preserve !== false || !restProps.isListField, '`preserve` should not apply on Form.List fields.'); } return React.createElement(Field, Object.assign({ key: key, name: namePath }, restProps)); }; var _default = WrapperField; exports.default = _default; }).call(this,require('_process')) },{"./FieldContext":614,"./utils/typeUtil":623,"./utils/validateUtil":624,"./utils/valueUtil":625,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/toConsumableArray":207,"_process":1,"rc-util/lib/Children/toArray":858,"rc-util/lib/warning":879,"react":"react"}],614:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.HOOK_MARK = void 0; var React = _interopRequireWildcard(require("react")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var HOOK_MARK = 'RC_FORM_INTERNAL_HOOKS'; // eslint-disable-next-line @typescript-eslint/no-explicit-any exports.HOOK_MARK = HOOK_MARK; var warningFunc = function warningFunc() { (0, _warning.default)(false, 'Can not find FormContext. Please make sure you wrap Field under Form.'); }; var Context = React.createContext({ getFieldValue: warningFunc, getFieldsValue: warningFunc, getFieldError: warningFunc, getFieldsError: warningFunc, isFieldsTouched: warningFunc, isFieldTouched: warningFunc, isFieldValidating: warningFunc, isFieldsValidating: warningFunc, resetFields: warningFunc, setFields: warningFunc, setFieldsValue: warningFunc, validateFields: warningFunc, submit: warningFunc, getInternalHooks: function getInternalHooks() { warningFunc(); return { dispatch: warningFunc, registerField: warningFunc, useSubscribe: warningFunc, setInitialValues: warningFunc, setCallbacks: warningFunc, getFields: warningFunc, setValidateMessages: warningFunc, setPreserve: warningFunc }; } }); var _default = Context; exports.default = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-util/lib/warning":879,"react":"react"}],615:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _useForm3 = _interopRequireDefault(require("./useForm")); var _FieldContext = _interopRequireWildcard(require("./FieldContext")); var _FormContext = _interopRequireDefault(require("./FormContext")); var _valueUtil = require("./utils/valueUtil"); var Form = function Form(_ref, ref) { var name = _ref.name, initialValues = _ref.initialValues, fields = _ref.fields, form = _ref.form, preserve = _ref.preserve, children = _ref.children, _ref$component = _ref.component, Component = _ref$component === void 0 ? 'form' : _ref$component, validateMessages = _ref.validateMessages, _ref$validateTrigger = _ref.validateTrigger, validateTrigger = _ref$validateTrigger === void 0 ? 'onChange' : _ref$validateTrigger, onValuesChange = _ref.onValuesChange, _onFieldsChange = _ref.onFieldsChange, _onFinish = _ref.onFinish, onFinishFailed = _ref.onFinishFailed, restProps = (0, _objectWithoutProperties2.default)(_ref, ["name", "initialValues", "fields", "form", "preserve", "children", "component", "validateMessages", "validateTrigger", "onValuesChange", "onFieldsChange", "onFinish", "onFinishFailed"]); var formContext = React.useContext(_FormContext.default); // We customize handle event since Context will makes all the consumer re-render: // https://reactjs.org/docs/context.html#contextprovider var _useForm = (0, _useForm3.default)(form), _useForm2 = (0, _slicedToArray2.default)(_useForm, 1), formInstance = _useForm2[0]; var _formInstance$getInte = formInstance.getInternalHooks(_FieldContext.HOOK_MARK), useSubscribe = _formInstance$getInte.useSubscribe, setInitialValues = _formInstance$getInte.setInitialValues, setCallbacks = _formInstance$getInte.setCallbacks, setValidateMessages = _formInstance$getInte.setValidateMessages, setPreserve = _formInstance$getInte.setPreserve; // Pass ref with form instance React.useImperativeHandle(ref, function () { return formInstance; }); // Register form into Context React.useEffect(function () { formContext.registerForm(name, formInstance); return function () { formContext.unregisterForm(name); }; }, [formContext, formInstance, name]); // Pass props to store setValidateMessages((0, _objectSpread2.default)((0, _objectSpread2.default)({}, formContext.validateMessages), validateMessages)); setCallbacks({ onValuesChange: onValuesChange, onFieldsChange: function onFieldsChange(changedFields) { formContext.triggerFormChange(name, changedFields); if (_onFieldsChange) { for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { rest[_key - 1] = arguments[_key]; } _onFieldsChange.apply(void 0, [changedFields].concat(rest)); } }, onFinish: function onFinish(values) { formContext.triggerFormFinish(name, values); if (_onFinish) { _onFinish(values); } }, onFinishFailed: onFinishFailed }); setPreserve(preserve); // Set initial value, init store value when first mount var mountRef = React.useRef(null); setInitialValues(initialValues, !mountRef.current); if (!mountRef.current) { mountRef.current = true; } // Prepare children by `children` type var childrenNode = children; var childrenRenderProps = typeof children === 'function'; if (childrenRenderProps) { var values = formInstance.getFieldsValue(true); childrenNode = children(values, formInstance); } // Not use subscribe when using render props useSubscribe(!childrenRenderProps); // Listen if fields provided. We use ref to save prev data here to avoid additional render var prevFieldsRef = React.useRef(); React.useEffect(function () { if (!(0, _valueUtil.isSimilar)(prevFieldsRef.current || [], fields || [])) { formInstance.setFields(fields || []); } prevFieldsRef.current = fields; }, [fields, formInstance]); var formContextValue = React.useMemo(function () { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, formInstance), {}, { validateTrigger: validateTrigger }); }, [formInstance, validateTrigger]); var wrapperNode = React.createElement(_FieldContext.default.Provider, { value: formContextValue }, childrenNode); if (Component === false) { return wrapperNode; } return React.createElement(Component, Object.assign({}, restProps, { onSubmit: function onSubmit(event) { event.preventDefault(); event.stopPropagation(); formInstance.submit(); } }), wrapperNode); }; var _default = Form; exports.default = _default; },{"./FieldContext":614,"./FormContext":616,"./useForm":619,"./utils/valueUtil":625,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],616:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.FormProvider = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var FormContext = React.createContext({ triggerFormChange: function triggerFormChange() {}, triggerFormFinish: function triggerFormFinish() {}, registerForm: function registerForm() {}, unregisterForm: function unregisterForm() {} }); var FormProvider = function FormProvider(_ref) { var validateMessages = _ref.validateMessages, onFormChange = _ref.onFormChange, onFormFinish = _ref.onFormFinish, children = _ref.children; var formContext = React.useContext(FormContext); var formsRef = React.useRef({}); return React.createElement(FormContext.Provider, { value: (0, _objectSpread3.default)((0, _objectSpread3.default)({}, formContext), {}, { validateMessages: (0, _objectSpread3.default)((0, _objectSpread3.default)({}, formContext.validateMessages), validateMessages), // ========================================================= // = Global Form Control = // ========================================================= triggerFormChange: function triggerFormChange(name, changedFields) { if (onFormChange) { onFormChange(name, { changedFields: changedFields, forms: formsRef.current }); } formContext.triggerFormChange(name, changedFields); }, triggerFormFinish: function triggerFormFinish(name, values) { if (onFormFinish) { onFormFinish(name, { values: values, forms: formsRef.current }); } formContext.triggerFormFinish(name, values); }, registerForm: function registerForm(name, form) { if (name) { formsRef.current = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, formsRef.current), {}, (0, _defineProperty2.default)({}, name, form)); } formContext.registerForm(name, form); }, unregisterForm: function unregisterForm(name) { var newForms = (0, _objectSpread3.default)({}, formsRef.current); delete newForms[name]; formsRef.current = newForms; formContext.unregisterForm(name); } }) }, children); }; exports.FormProvider = FormProvider; var _default = FormContext; exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"react":"react"}],617:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var React = _interopRequireWildcard(require("react")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _FieldContext = _interopRequireDefault(require("./FieldContext")); var _Field = _interopRequireDefault(require("./Field")); var _valueUtil = require("./utils/valueUtil"); var List = function List(_ref) { var name = _ref.name, children = _ref.children; var context = React.useContext(_FieldContext.default); var keyRef = React.useRef({ keys: [], id: 0 }); var keyManager = keyRef.current; // User should not pass `children` as other type. if (typeof children !== 'function') { (0, _warning.default)(false, 'Form.List only accepts function as children.'); return null; } var parentPrefixName = (0, _valueUtil.getNamePath)(context.prefixName) || []; var prefixName = [].concat((0, _toConsumableArray2.default)(parentPrefixName), (0, _toConsumableArray2.default)((0, _valueUtil.getNamePath)(name))); var shouldUpdate = function shouldUpdate(prevValue, nextValue, _ref2) { var source = _ref2.source; if (source === 'internal') { return false; } return prevValue !== nextValue; }; return React.createElement(_FieldContext.default.Provider, { value: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, context), {}, { prefixName: prefixName }) }, React.createElement(_Field.default, { name: [], shouldUpdate: shouldUpdate }, function (_ref3) { var _ref3$value = _ref3.value, value = _ref3$value === void 0 ? [] : _ref3$value, onChange = _ref3.onChange; var getFieldValue = context.getFieldValue; var getNewValue = function getNewValue() { var values = getFieldValue(prefixName || []); return values || []; }; /** * Always get latest value in case user update fields by `form` api. */ var operations = { add: function add(defaultValue, index) { // Mapping keys var newValue = getNewValue(); if (index >= 0 && index <= newValue.length) { keyManager.keys = [].concat((0, _toConsumableArray2.default)(keyManager.keys.slice(0, index)), [keyManager.id], (0, _toConsumableArray2.default)(keyManager.keys.slice(index))); onChange([].concat((0, _toConsumableArray2.default)(newValue.slice(0, index)), [defaultValue], (0, _toConsumableArray2.default)(newValue.slice(index)))); } else { if (process.env.NODE_ENV !== 'production' && (index < 0 || index > newValue.length)) { (0, _warning.default)(false, 'The second parameter of the add function should be a valid positive number.'); } keyManager.keys = [].concat((0, _toConsumableArray2.default)(keyManager.keys), [keyManager.id]); onChange([].concat((0, _toConsumableArray2.default)(newValue), [defaultValue])); } keyManager.id += 1; }, remove: function remove(index) { var newValue = getNewValue(); var indexSet = new Set(Array.isArray(index) ? index : [index]); if (indexSet.size <= 0) { return; } keyManager.keys = keyManager.keys.filter(function (_, keysIndex) { return !indexSet.has(keysIndex); }); // Trigger store change onChange(newValue.filter(function (_, valueIndex) { return !indexSet.has(valueIndex); })); }, move: function move(from, to) { if (from === to) { return; } var newValue = getNewValue(); // Do not handle out of range if (from < 0 || from >= newValue.length || to < 0 || to >= newValue.length) { return; } keyManager.keys = (0, _valueUtil.move)(keyManager.keys, from, to); // Trigger store change onChange((0, _valueUtil.move)(newValue, from, to)); } }; var listValue = value || []; if (!Array.isArray(listValue)) { listValue = []; if (process.env.NODE_ENV !== 'production') { (0, _warning.default)(false, "Current value of '".concat(prefixName.join(' > '), "' is not an array type.")); } } return children(listValue.map(function (__, index) { var key = keyManager.keys[index]; if (key === undefined) { keyManager.keys[index] = keyManager.id; key = keyManager.keys[index]; keyManager.id += 1; } return { name: index, key: key, isListField: true }; }), operations); })); }; var _default = List; exports.default = _default; }).call(this,require('_process')) },{"./Field":613,"./FieldContext":614,"./utils/valueUtil":625,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/toConsumableArray":207,"_process":1,"rc-util/lib/warning":879,"react":"react"}],618:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Field", { enumerable: true, get: function get() { return _Field.default; } }); Object.defineProperty(exports, "List", { enumerable: true, get: function get() { return _List.default; } }); Object.defineProperty(exports, "useForm", { enumerable: true, get: function get() { return _useForm.default; } }); Object.defineProperty(exports, "FormProvider", { enumerable: true, get: function get() { return _FormContext.FormProvider; } }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _Field = _interopRequireDefault(require("./Field")); var _List = _interopRequireDefault(require("./List")); var _useForm = _interopRequireDefault(require("./useForm")); var _Form = _interopRequireDefault(require("./Form")); var _FormContext = require("./FormContext"); var InternalForm = React.forwardRef(_Form.default); var RefForm = InternalForm; RefForm.FormProvider = _FormContext.FormProvider; RefForm.Field = _Field.default; RefForm.List = _List.default; RefForm.useForm = _useForm.default; var _default = RefForm; exports.default = _default; },{"./Field":613,"./Form":615,"./FormContext":616,"./List":617,"./useForm":619,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],619:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.FormStore = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var React = _interopRequireWildcard(require("react")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _FieldContext = require("./FieldContext"); var _asyncUtil = require("./utils/asyncUtil"); var _NameMap = _interopRequireDefault(require("./utils/NameMap")); var _messages = require("./utils/messages"); var _valueUtil = require("./utils/valueUtil"); var FormStore = function FormStore(forceRootUpdate) { var _this = this; (0, _classCallCheck2.default)(this, FormStore); this.formHooked = false; this.subscribable = true; this.store = {}; this.fieldEntities = []; this.initialValues = {}; this.callbacks = {}; this.validateMessages = null; this.preserve = null; this.lastValidatePromise = null; this.getForm = function () { return { getFieldValue: _this.getFieldValue, getFieldsValue: _this.getFieldsValue, getFieldError: _this.getFieldError, getFieldsError: _this.getFieldsError, isFieldsTouched: _this.isFieldsTouched, isFieldTouched: _this.isFieldTouched, isFieldValidating: _this.isFieldValidating, isFieldsValidating: _this.isFieldsValidating, resetFields: _this.resetFields, setFields: _this.setFields, setFieldsValue: _this.setFieldsValue, validateFields: _this.validateFields, submit: _this.submit, getInternalHooks: _this.getInternalHooks }; }; // ======================== Internal Hooks ======================== this.getInternalHooks = function (key) { if (key === _FieldContext.HOOK_MARK) { _this.formHooked = true; return { dispatch: _this.dispatch, registerField: _this.registerField, useSubscribe: _this.useSubscribe, setInitialValues: _this.setInitialValues, setCallbacks: _this.setCallbacks, setValidateMessages: _this.setValidateMessages, getFields: _this.getFields, setPreserve: _this.setPreserve }; } (0, _warning.default)(false, '`getInternalHooks` is internal usage. Should not call directly.'); return null; }; this.useSubscribe = function (subscribable) { _this.subscribable = subscribable; }; /** * First time `setInitialValues` should update store with initial value */ this.setInitialValues = function (initialValues, init) { _this.initialValues = initialValues || {}; if (init) { _this.store = (0, _valueUtil.setValues)({}, initialValues, _this.store); } }; this.getInitialValue = function (namePath) { return (0, _valueUtil.getValue)(_this.initialValues, namePath); }; this.setCallbacks = function (callbacks) { _this.callbacks = callbacks; }; this.setValidateMessages = function (validateMessages) { _this.validateMessages = validateMessages; }; this.setPreserve = function (preserve) { _this.preserve = preserve; }; // ========================== Dev Warning ========================= this.timeoutId = null; this.warningUnhooked = function () { if (process.env.NODE_ENV !== 'production' && !_this.timeoutId && typeof window !== 'undefined') { _this.timeoutId = window.setTimeout(function () { _this.timeoutId = null; if (!_this.formHooked) { (0, _warning.default)(false, 'Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?'); } }); } }; // ============================ Fields ============================ /** * Get registered field entities. * @param pure Only return field which has a `name`. Default: false */ this.getFieldEntities = function () { var pure = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (!pure) { return _this.fieldEntities; } return _this.fieldEntities.filter(function (field) { return field.getNamePath().length; }); }; this.getFieldsMap = function () { var pure = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var cache = new _NameMap.default(); _this.getFieldEntities(pure).forEach(function (field) { var namePath = field.getNamePath(); cache.set(namePath, field); }); return cache; }; this.getFieldEntitiesForNamePathList = function (nameList) { if (!nameList) { return _this.getFieldEntities(true); } var cache = _this.getFieldsMap(true); return nameList.map(function (name) { var namePath = (0, _valueUtil.getNamePath)(name); return cache.get(namePath) || { INVALIDATE_NAME_PATH: (0, _valueUtil.getNamePath)(name) }; }); }; this.getFieldsValue = function (nameList, filterFunc) { _this.warningUnhooked(); if (nameList === true && !filterFunc) { return _this.store; } var fieldEntities = _this.getFieldEntitiesForNamePathList(Array.isArray(nameList) ? nameList : null); var filteredNameList = []; fieldEntities.forEach(function (entity) { var namePath = 'INVALIDATE_NAME_PATH' in entity ? entity.INVALIDATE_NAME_PATH : entity.getNamePath(); if (!filterFunc) { filteredNameList.push(namePath); } else { var meta = 'getMeta' in entity ? entity.getMeta() : null; if (filterFunc(meta)) { filteredNameList.push(namePath); } } }); return (0, _valueUtil.cloneByNamePathList)(_this.store, filteredNameList.map(_valueUtil.getNamePath)); }; this.getFieldValue = function (name) { _this.warningUnhooked(); var namePath = (0, _valueUtil.getNamePath)(name); return (0, _valueUtil.getValue)(_this.store, namePath); }; this.getFieldsError = function (nameList) { _this.warningUnhooked(); var fieldEntities = _this.getFieldEntitiesForNamePathList(nameList); return fieldEntities.map(function (entity, index) { if (entity && !('INVALIDATE_NAME_PATH' in entity)) { return { name: entity.getNamePath(), errors: entity.getErrors() }; } return { name: (0, _valueUtil.getNamePath)(nameList[index]), errors: [] }; }); }; this.getFieldError = function (name) { _this.warningUnhooked(); var namePath = (0, _valueUtil.getNamePath)(name); var fieldError = _this.getFieldsError([namePath])[0]; return fieldError.errors; }; this.isFieldsTouched = function () { _this.warningUnhooked(); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var arg0 = args[0], arg1 = args[1]; var namePathList; var isAllFieldsTouched = false; if (args.length === 0) { namePathList = null; } else if (args.length === 1) { if (Array.isArray(arg0)) { namePathList = arg0.map(_valueUtil.getNamePath); isAllFieldsTouched = false; } else { namePathList = null; isAllFieldsTouched = arg0; } } else { namePathList = arg0.map(_valueUtil.getNamePath); isAllFieldsTouched = arg1; } var testTouched = function testTouched(field) { // Not provide `nameList` will check all the fields if (!namePathList) { return field.isFieldTouched(); } var fieldNamePath = field.getNamePath(); if ((0, _valueUtil.containsNamePath)(namePathList, fieldNamePath)) { return field.isFieldTouched(); } return isAllFieldsTouched; }; return isAllFieldsTouched ? _this.getFieldEntities(true).every(testTouched) : _this.getFieldEntities(true).some(testTouched); }; this.isFieldTouched = function (name) { _this.warningUnhooked(); return _this.isFieldsTouched([name]); }; this.isFieldsValidating = function (nameList) { _this.warningUnhooked(); var fieldEntities = _this.getFieldEntities(); if (!nameList) { return fieldEntities.some(function (testField) { return testField.isFieldValidating(); }); } var namePathList = nameList.map(_valueUtil.getNamePath); return fieldEntities.some(function (testField) { var fieldNamePath = testField.getNamePath(); return (0, _valueUtil.containsNamePath)(namePathList, fieldNamePath) && testField.isFieldValidating(); }); }; this.isFieldValidating = function (name) { _this.warningUnhooked(); return _this.isFieldsValidating([name]); }; /** * Reset Field with field `initialValue` prop. * Can pass `entities` or `namePathList` or just nothing. */ this.resetWithFieldInitialValue = function () { var info = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; // Create cache var cache = new _NameMap.default(); var fieldEntities = _this.getFieldEntities(true); fieldEntities.forEach(function (field) { var initialValue = field.props.initialValue; var namePath = field.getNamePath(); // Record only if has `initialValue` if (initialValue !== undefined) { var records = cache.get(namePath) || new Set(); records.add({ entity: field, value: initialValue }); cache.set(namePath, records); } }); // Reset var resetWithFields = function resetWithFields(entities) { entities.forEach(function (field) { var initialValue = field.props.initialValue; if (initialValue !== undefined) { var namePath = field.getNamePath(); var formInitialValue = _this.getInitialValue(namePath); if (formInitialValue !== undefined) { // Warning if conflict with form initialValues and do not modify value (0, _warning.default)(false, "Form already set 'initialValues' with path '".concat(namePath.join('.'), "'. Field can not overwrite it.")); } else { var records = cache.get(namePath); if (records && records.size > 1) { // Warning if multiple field set `initialValue`and do not modify value (0, _warning.default)(false, "Multiple Field with path '".concat(namePath.join('.'), "' set 'initialValue'. Can not decide which one to pick.")); } else if (records) { var originValue = _this.getFieldValue(namePath); // Set `initialValue` if (!info.skipExist || originValue === undefined) { _this.store = (0, _valueUtil.setValue)(_this.store, namePath, (0, _toConsumableArray2.default)(records)[0].value); } } } } }); }; var requiredFieldEntities; if (info.entities) { requiredFieldEntities = info.entities; } else if (info.namePathList) { requiredFieldEntities = []; info.namePathList.forEach(function (namePath) { var records = cache.get(namePath); if (records) { var _requiredFieldEntitie; (_requiredFieldEntitie = requiredFieldEntities).push.apply(_requiredFieldEntitie, (0, _toConsumableArray2.default)((0, _toConsumableArray2.default)(records).map(function (r) { return r.entity; }))); } }); } else { requiredFieldEntities = fieldEntities; } resetWithFields(requiredFieldEntities); }; this.resetFields = function (nameList) { _this.warningUnhooked(); var prevStore = _this.store; if (!nameList) { _this.store = (0, _valueUtil.setValues)({}, _this.initialValues); _this.resetWithFieldInitialValue(); _this.notifyObservers(prevStore, null, { type: 'reset' }); return; } // Reset by `nameList` var namePathList = nameList.map(_valueUtil.getNamePath); namePathList.forEach(function (namePath) { var initialValue = _this.getInitialValue(namePath); _this.store = (0, _valueUtil.setValue)(_this.store, namePath, initialValue); }); _this.resetWithFieldInitialValue({ namePathList: namePathList }); _this.notifyObservers(prevStore, namePathList, { type: 'reset' }); }; this.setFields = function (fields) { _this.warningUnhooked(); var prevStore = _this.store; fields.forEach(function (fieldData) { var name = fieldData.name, errors = fieldData.errors, data = (0, _objectWithoutProperties2.default)(fieldData, ["name", "errors"]); var namePath = (0, _valueUtil.getNamePath)(name); // Value if ('value' in data) { _this.store = (0, _valueUtil.setValue)(_this.store, namePath, data.value); } _this.notifyObservers(prevStore, [namePath], { type: 'setField', data: fieldData }); }); }; this.getFields = function () { var entities = _this.getFieldEntities(true); var fields = entities.map(function (field) { var namePath = field.getNamePath(); var meta = field.getMeta(); var fieldData = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, meta), {}, { name: namePath, value: _this.getFieldValue(namePath) }); Object.defineProperty(fieldData, 'originRCField', { value: true }); return fieldData; }); return fields; }; // =========================== Observer =========================== this.registerField = function (entity) { _this.fieldEntities.push(entity); // Set initial values if (entity.props.initialValue !== undefined) { var prevStore = _this.store; _this.resetWithFieldInitialValue({ entities: [entity], skipExist: true }); _this.notifyObservers(prevStore, [entity.getNamePath()], { type: 'valueUpdate', source: 'internal' }); } // un-register field callback return function (isListField, preserve) { _this.fieldEntities = _this.fieldEntities.filter(function (item) { return item !== entity; }); // Clean up store value if preserve var mergedPreserve = preserve !== undefined ? preserve : _this.preserve; if (mergedPreserve === false && !isListField) { var namePath = entity.getNamePath(); if (_this.getFieldValue(namePath) !== undefined) { _this.store = (0, _valueUtil.setValue)(_this.store, namePath, undefined); } } }; }; this.dispatch = function (action) { switch (action.type) { case 'updateValue': { var namePath = action.namePath, value = action.value; _this.updateValue(namePath, value); break; } case 'validateField': { var _namePath = action.namePath, triggerName = action.triggerName; _this.validateFields([_namePath], { triggerName: triggerName }); break; } default: // Currently we don't have other action. Do nothing. } }; this.notifyObservers = function (prevStore, namePathList, info) { if (_this.subscribable) { var mergedInfo = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, info), {}, { store: _this.getFieldsValue(true) }); _this.getFieldEntities().forEach(function (_ref) { var onStoreChange = _ref.onStoreChange; onStoreChange(prevStore, namePathList, mergedInfo); }); } else { _this.forceRootUpdate(); } }; this.updateValue = function (name, value) { var namePath = (0, _valueUtil.getNamePath)(name); var prevStore = _this.store; _this.store = (0, _valueUtil.setValue)(_this.store, namePath, value); _this.notifyObservers(prevStore, [namePath], { type: 'valueUpdate', source: 'internal' }); // Notify dependencies children with parent update var childrenFields = _this.getDependencyChildrenFields(namePath); _this.validateFields(childrenFields); _this.notifyObservers(prevStore, childrenFields, { type: 'dependenciesUpdate', relatedFields: [namePath].concat((0, _toConsumableArray2.default)(childrenFields)) }); // trigger callback function var onValuesChange = _this.callbacks.onValuesChange; if (onValuesChange) { var changedValues = (0, _valueUtil.cloneByNamePathList)(_this.store, [namePath]); onValuesChange(changedValues, _this.store); } _this.triggerOnFieldsChange([namePath].concat((0, _toConsumableArray2.default)(childrenFields))); }; // Let all child Field get update. this.setFieldsValue = function (store) { _this.warningUnhooked(); var prevStore = _this.store; if (store) { _this.store = (0, _valueUtil.setValues)(_this.store, store); } _this.notifyObservers(prevStore, null, { type: 'valueUpdate', source: 'external' }); }; this.getDependencyChildrenFields = function (rootNamePath) { var children = new Set(); var childrenFields = []; var dependencies2fields = new _NameMap.default(); /** * Generate maps * Can use cache to save perf if user report performance issue with this */ _this.getFieldEntities().forEach(function (field) { var dependencies = field.props.dependencies; (dependencies || []).forEach(function (dependency) { var dependencyNamePath = (0, _valueUtil.getNamePath)(dependency); dependencies2fields.update(dependencyNamePath, function () { var fields = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Set(); fields.add(field); return fields; }); }); }); var fillChildren = function fillChildren(namePath) { var fields = dependencies2fields.get(namePath) || new Set(); fields.forEach(function (field) { if (!children.has(field)) { children.add(field); var fieldNamePath = field.getNamePath(); if (field.isFieldDirty() && fieldNamePath.length) { childrenFields.push(fieldNamePath); fillChildren(fieldNamePath); } } }); }; fillChildren(rootNamePath); return childrenFields; }; this.triggerOnFieldsChange = function (namePathList, filedErrors) { var onFieldsChange = _this.callbacks.onFieldsChange; if (onFieldsChange) { var fields = _this.getFields(); /** * Fill errors since `fields` may be replaced by controlled fields */ if (filedErrors) { var cache = new _NameMap.default(); filedErrors.forEach(function (_ref2) { var name = _ref2.name, errors = _ref2.errors; cache.set(name, errors); }); fields.forEach(function (field) { // eslint-disable-next-line no-param-reassign field.errors = cache.get(field.name) || field.errors; }); } var changedFields = fields.filter(function (_ref3) { var fieldName = _ref3.name; return (0, _valueUtil.containsNamePath)(namePathList, fieldName); }); onFieldsChange(changedFields, fields); } }; // =========================== Validate =========================== this.validateFields = function (nameList, options) { _this.warningUnhooked(); var provideNameList = !!nameList; var namePathList = provideNameList ? nameList.map(_valueUtil.getNamePath) : []; // Collect result in promise list var promiseList = []; _this.getFieldEntities(true).forEach(function (field) { // Add field if not provide `nameList` if (!provideNameList) { namePathList.push(field.getNamePath()); } // Skip if without rule if (!field.props.rules || !field.props.rules.length) { return; } var fieldNamePath = field.getNamePath(); // Add field validate rule in to promise list if (!provideNameList || (0, _valueUtil.containsNamePath)(namePathList, fieldNamePath)) { var promise = field.validateRules((0, _objectSpread2.default)({ validateMessages: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, _messages.defaultValidateMessages), _this.validateMessages) }, options)); // Wrap promise with field promiseList.push(promise.then(function () { return { name: fieldNamePath, errors: [] }; }).catch(function (errors) { return Promise.reject({ name: fieldNamePath, errors: errors }); })); } }); var summaryPromise = (0, _asyncUtil.allPromiseFinish)(promiseList); _this.lastValidatePromise = summaryPromise; // Notify fields with rule that validate has finished and need update summaryPromise.catch(function (results) { return results; }).then(function (results) { var resultNamePathList = results.map(function (_ref4) { var name = _ref4.name; return name; }); _this.notifyObservers(_this.store, resultNamePathList, { type: 'validateFinish' }); _this.triggerOnFieldsChange(resultNamePathList, results); }); var returnPromise = summaryPromise.then(function () { if (_this.lastValidatePromise === summaryPromise) { return Promise.resolve(_this.getFieldsValue(namePathList)); } return Promise.reject([]); }).catch(function (results) { var errorList = results.filter(function (result) { return result && result.errors.length; }); return Promise.reject({ values: _this.getFieldsValue(namePathList), errorFields: errorList, outOfDate: _this.lastValidatePromise !== summaryPromise }); }); // Do not throw in console returnPromise.catch(function (e) { return e; }); return returnPromise; }; // ============================ Submit ============================ this.submit = function () { _this.warningUnhooked(); _this.validateFields().then(function (values) { var onFinish = _this.callbacks.onFinish; if (onFinish) { try { onFinish(values); } catch (err) { // Should print error if user `onFinish` callback failed console.error(err); } } }).catch(function (e) { var onFinishFailed = _this.callbacks.onFinishFailed; if (onFinishFailed) { onFinishFailed(e); } }); }; this.forceRootUpdate = forceRootUpdate; }; exports.FormStore = FormStore; function useForm(form) { var formRef = React.useRef(); var _React$useState = React.useState(), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), forceUpdate = _React$useState2[1]; if (!formRef.current) { if (form) { formRef.current = form; } else { // Create a new FormStore if not provided var forceReRender = function forceReRender() { forceUpdate({}); }; var formStore = new FormStore(forceReRender); formRef.current = formStore.getForm(); } } return [formRef.current]; } var _default = useForm; exports.default = _default; }).call(this,require('_process')) },{"./FieldContext":614,"./utils/NameMap":620,"./utils/asyncUtil":621,"./utils/messages":622,"./utils/valueUtil":625,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"_process":1,"rc-util/lib/warning":879,"react":"react"}],620:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _valueUtil = require("./valueUtil"); /** * NameMap like a `Map` but accepts `string[]` as key. */ var NameMap = /*#__PURE__*/function () { function NameMap() { (0, _classCallCheck2.default)(this, NameMap); this.list = []; } (0, _createClass2.default)(NameMap, [{ key: "set", value: function set(key, value) { var index = this.list.findIndex(function (item) { return (0, _valueUtil.matchNamePath)(item.key, key); }); if (index !== -1) { this.list[index].value = value; } else { this.list.push({ key: key, value: value }); } } }, { key: "get", value: function get(key) { var result = this.list.find(function (item) { return (0, _valueUtil.matchNamePath)(item.key, key); }); return result && result.value; } }, { key: "update", value: function update(key, updater) { var origin = this.get(key); var next = updater(origin); if (!next) { this.delete(key); } else { this.set(key, next); } } }, { key: "delete", value: function _delete(key) { this.list = this.list.filter(function (item) { return !(0, _valueUtil.matchNamePath)(item.key, key); }); } }, { key: "map", value: function map(callback) { return this.list.map(callback); } }, { key: "toJSON", value: function toJSON() { var json = {}; this.map(function (_ref) { var key = _ref.key, value = _ref.value; json[key.join('.')] = value; return null; }); return json; } }]); return NameMap; }(); var _default = NameMap; exports.default = _default; },{"./valueUtil":625,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/interopRequireDefault":192}],621:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.allPromiseFinish = allPromiseFinish; function allPromiseFinish(promiseList) { var hasError = false; var count = promiseList.length; var results = []; if (!promiseList.length) { return Promise.resolve([]); } return new Promise(function (resolve, reject) { promiseList.forEach(function (promise, index) { promise.catch(function (e) { hasError = true; return e; }).then(function (result) { count -= 1; results[index] = result; if (count > 0) { return; } if (hasError) { reject(results); } resolve(results); }); }); }); } },{}],622:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultValidateMessages = void 0; var typeTemplate = "'${name}' is not a valid ${type}"; var defaultValidateMessages = { default: "Validation error on field '${name}'", required: "'${name}' is required", enum: "'${name}' must be one of [${enum}]", whitespace: "'${name}' cannot be empty", date: { format: "'${name}' is invalid for format date", parse: "'${name}' could not be parsed as date", invalid: "'${name}' is invalid date" }, types: { string: typeTemplate, method: typeTemplate, array: typeTemplate, object: typeTemplate, number: typeTemplate, date: typeTemplate, boolean: typeTemplate, integer: typeTemplate, float: typeTemplate, regexp: typeTemplate, email: typeTemplate, url: typeTemplate, hex: typeTemplate }, string: { len: "'${name}' must be exactly ${len} characters", min: "'${name}' must be at least ${min} characters", max: "'${name}' cannot be longer than ${max} characters", range: "'${name}' must be between ${min} and ${max} characters" }, number: { len: "'${name}' must equal ${len}", min: "'${name}' cannot be less than ${min}", max: "'${name}' cannot be greater than ${max}", range: "'${name}' must be between ${min} and ${max}" }, array: { len: "'${name}' must be exactly ${len} in length", min: "'${name}' cannot be less than ${min} in length", max: "'${name}' cannot be greater than ${max} in length", range: "'${name}' must be between ${min} and ${max} in length" }, pattern: { mismatch: "'${name}' does not match pattern ${pattern}" } }; exports.defaultValidateMessages = defaultValidateMessages; },{}],623:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.toArray = toArray; function toArray(value) { if (value === undefined || value === null) { return []; } return Array.isArray(value) ? value : [value]; } },{}],624:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.validateRules = validateRules; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _asyncValidator = _interopRequireDefault(require("async-validator")); var React = _interopRequireWildcard(require("react")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _valueUtil = require("./valueUtil"); var _messages = require("./messages"); // Remove incorrect original ts define var AsyncValidator = _asyncValidator.default; /** * Replace with template. * `I'm ${name}` + { name: 'bamboo' } = I'm bamboo */ function replaceMessage(template, kv) { return template.replace(/\$\{\w+\}/g, function (str) { var key = str.slice(2, -1); return kv[key]; }); } /** * We use `async-validator` to validate rules. So have to hot replace the message with validator. * { required: '${name} is required' } => { required: () => 'field is required' } */ function convertMessages(messages, name, rule, messageVariables) { var kv = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rule), {}, { name: name, enum: (rule.enum || []).join(', ') }); var replaceFunc = function replaceFunc(template, additionalKV) { return function () { return replaceMessage(template, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, kv), additionalKV)); }; }; /* eslint-disable no-param-reassign */ function fillTemplate(source) { var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; Object.keys(source).forEach(function (ruleName) { var value = source[ruleName]; if (typeof value === 'string') { target[ruleName] = replaceFunc(value, messageVariables); } else if (value && (0, _typeof2.default)(value) === 'object') { target[ruleName] = {}; fillTemplate(value, target[ruleName]); } else { target[ruleName] = value; } }); return target; } /* eslint-enable */ return fillTemplate((0, _valueUtil.setValues)({}, _messages.defaultValidateMessages, messages)); } function validateRule(_x, _x2, _x3, _x4, _x5) { return _validateRule.apply(this, arguments); } /** * We use `async-validator` to validate the value. * But only check one value in a time to avoid namePath validate issue. */ function _validateRule() { _validateRule = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(name, value, rule, options, messageVariables) { var cloneRule, subRuleField, validator, messages, result, subResults; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: cloneRule = (0, _objectSpread2.default)({}, rule); // We should special handle array validate subRuleField = null; if (cloneRule && cloneRule.type === 'array' && cloneRule.defaultField) { subRuleField = cloneRule.defaultField; delete cloneRule.defaultField; } validator = new AsyncValidator((0, _defineProperty2.default)({}, name, [cloneRule])); messages = convertMessages(options.validateMessages, name, cloneRule, messageVariables); validator.messages(messages); result = []; _context2.prev = 7; _context2.next = 10; return Promise.resolve(validator.validate((0, _defineProperty2.default)({}, name, value), (0, _objectSpread2.default)({}, options))); case 10: _context2.next = 15; break; case 12: _context2.prev = 12; _context2.t0 = _context2["catch"](7); if (_context2.t0.errors) { result = _context2.t0.errors.map(function (_ref2, index) { var message = _ref2.message; return (// Wrap ReactNode with `key` React.isValidElement(message) ? React.cloneElement(message, { key: "error_".concat(index) }) : message ); }); } else { console.error(_context2.t0); result = [messages.default()]; } case 15: if (!(!result.length && subRuleField)) { _context2.next = 20; break; } _context2.next = 18; return Promise.all(value.map(function (subValue, i) { return validateRule("".concat(name, ".").concat(i), subValue, subRuleField, options, messageVariables); })); case 18: subResults = _context2.sent; return _context2.abrupt("return", subResults.reduce(function (prev, errors) { return [].concat((0, _toConsumableArray2.default)(prev), (0, _toConsumableArray2.default)(errors)); }, [])); case 20: return _context2.abrupt("return", result); case 21: case "end": return _context2.stop(); } } }, _callee2, null, [[7, 12]]); })); return _validateRule.apply(this, arguments); } function validateRules(namePath, value, rules, options, validateFirst, messageVariables) { var name = namePath.join('.'); // Fill rule with context var filledRules = rules.map(function (currentRule) { var originValidatorFunc = currentRule.validator; if (!originValidatorFunc) { return currentRule; } return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, currentRule), {}, { validator: function validator(rule, val, callback) { var hasPromise = false; // Wrap callback only accept when promise not provided var wrappedCallback = function wrappedCallback() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } // Wait a tick to make sure return type is a promise Promise.resolve().then(function () { (0, _warning.default)(!hasPromise, 'Your validator function has already return a promise. `callback` will be ignored.'); if (!hasPromise) { callback.apply(void 0, args); } }); }; // Get promise var promise = originValidatorFunc(rule, val, wrappedCallback); hasPromise = promise && typeof promise.then === 'function' && typeof promise.catch === 'function'; /** * 1. Use promise as the first priority. * 2. If promise not exist, use callback with warning instead */ (0, _warning.default)(hasPromise, '`callback` is deprecated. Please return a promise instead.'); if (hasPromise) { promise.then(function () { callback(); }).catch(function (err) { callback(err); }); } } }); }); var summaryPromise; if (validateFirst === true) { // >>>>> Validate by serialization summaryPromise = new Promise( /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(resolve, reject) { var i, errors; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: i = 0; case 1: if (!(i < filledRules.length)) { _context.next = 11; break; } _context.next = 4; return validateRule(name, value, filledRules[i], options, messageVariables); case 4: errors = _context.sent; if (!errors.length) { _context.next = 8; break; } reject(errors); return _context.abrupt("return"); case 8: i += 1; _context.next = 1; break; case 11: /* eslint-enable */ resolve([]); case 12: case "end": return _context.stop(); } } }, _callee); })); return function (_x6, _x7) { return _ref.apply(this, arguments); }; }()); } else { // >>>>> Validate by parallel var rulePromises = filledRules.map(function (rule) { return validateRule(name, value, rule, options, messageVariables); }); summaryPromise = (validateFirst ? finishOnFirstFailed(rulePromises) : finishOnAllFailed(rulePromises)).then(function (errors) { if (!errors.length) { return []; } return Promise.reject(errors); }); } // Internal catch error to avoid console error log. summaryPromise.catch(function (e) { return e; }); return summaryPromise; } function finishOnAllFailed(_x8) { return _finishOnAllFailed.apply(this, arguments); } function _finishOnAllFailed() { _finishOnAllFailed = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(rulePromises) { return _regenerator.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: return _context3.abrupt("return", Promise.all(rulePromises).then(function (errorsList) { var _ref3; var errors = (_ref3 = []).concat.apply(_ref3, (0, _toConsumableArray2.default)(errorsList)); return errors; })); case 1: case "end": return _context3.stop(); } } }, _callee3); })); return _finishOnAllFailed.apply(this, arguments); } function finishOnFirstFailed(_x9) { return _finishOnFirstFailed.apply(this, arguments); } function _finishOnFirstFailed() { _finishOnFirstFailed = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(rulePromises) { var count; return _regenerator.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: count = 0; return _context4.abrupt("return", new Promise(function (resolve) { rulePromises.forEach(function (promise) { promise.then(function (errors) { if (errors.length) { resolve(errors); } count += 1; if (count === rulePromises.length) { resolve([]); } }); }); })); case 2: case "end": return _context4.stop(); } } }, _callee4); })); return _finishOnFirstFailed.apply(this, arguments); } },{"./messages":622,"./valueUtil":625,"@babel/runtime/helpers/asyncToGenerator":183,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"@babel/runtime/regenerator":210,"async-validator":454,"rc-util/lib/warning":879,"react":"react"}],625:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getNamePath = getNamePath; exports.getValue = getValue; exports.setValue = setValue; exports.cloneByNamePathList = cloneByNamePathList; exports.containsNamePath = containsNamePath; exports.setValues = setValues; exports.matchNamePath = matchNamePath; exports.isSimilar = isSimilar; exports.defaultGetValueFromEvent = defaultGetValueFromEvent; exports.move = move; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _get = _interopRequireDefault(require("rc-util/lib/utils/get")); var _set = _interopRequireDefault(require("rc-util/lib/utils/set")); var _typeUtil = require("./typeUtil"); /** * Convert name to internal supported format. * This function should keep since we still thinking if need support like `a.b.c` format. * 'a' => ['a'] * 123 => [123] * ['a', 123] => ['a', 123] */ function getNamePath(path) { return (0, _typeUtil.toArray)(path); } function getValue(store, namePath) { var value = (0, _get.default)(store, namePath); return value; } function setValue(store, namePath, value) { var newStore = (0, _set.default)(store, namePath, value); return newStore; } function cloneByNamePathList(store, namePathList) { var newStore = {}; namePathList.forEach(function (namePath) { var value = getValue(store, namePath); newStore = setValue(newStore, namePath, value); }); return newStore; } function containsNamePath(namePathList, namePath) { return namePathList && namePathList.some(function (path) { return matchNamePath(path, namePath); }); } function isObject(obj) { return (0, _typeof2.default)(obj) === 'object' && obj !== null && Object.getPrototypeOf(obj) === Object.prototype; } /** * Copy values into store and return a new values object * ({ a: 1, b: { c: 2 } }, { a: 4, b: { d: 5 } }) => { a: 4, b: { c: 2, d: 5 } } */ function internalSetValues(store, values) { var newStore = Array.isArray(store) ? (0, _toConsumableArray2.default)(store) : (0, _objectSpread2.default)({}, store); if (!values) { return newStore; } Object.keys(values).forEach(function (key) { var prevValue = newStore[key]; var value = values[key]; // If both are object (but target is not array), we use recursion to set deep value var recursive = isObject(prevValue) && isObject(value); newStore[key] = recursive ? internalSetValues(prevValue, value || {}) : value; }); return newStore; } function setValues(store) { for (var _len = arguments.length, restValues = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { restValues[_key - 1] = arguments[_key]; } return restValues.reduce(function (current, newStore) { return internalSetValues(current, newStore); }, store); } function matchNamePath(namePath, changedNamePath) { if (!namePath || !changedNamePath || namePath.length !== changedNamePath.length) { return false; } return namePath.every(function (nameUnit, i) { return changedNamePath[i] === nameUnit; }); } function isSimilar(source, target) { if (source === target) { return true; } if (!source && target || source && !target) { return false; } if (!source || !target || (0, _typeof2.default)(source) !== 'object' || (0, _typeof2.default)(target) !== 'object') { return false; } var sourceKeys = Object.keys(source); var targetKeys = Object.keys(target); var keys = new Set([].concat((0, _toConsumableArray2.default)(sourceKeys), (0, _toConsumableArray2.default)(targetKeys))); return (0, _toConsumableArray2.default)(keys).every(function (key) { var sourceValue = source[key]; var targetValue = target[key]; if (typeof sourceValue === 'function' && typeof targetValue === 'function') { return true; } return sourceValue === targetValue; }); } function defaultGetValueFromEvent(valuePropName) { var event = arguments.length <= 1 ? undefined : arguments[1]; if (event && event.target && valuePropName in event.target) { return event.target[valuePropName]; } return event; } /** * Moves an array item from one position in an array to another. * * Note: This is a pure function so a new array will be returned, instead * of altering the array argument. * * @param array Array in which to move an item. (required) * @param moveIndex The index of the item to move. (required) * @param toIndex The index to move item at moveIndex to. (required) */ function move(array, moveIndex, toIndex) { var length = array.length; if (moveIndex < 0 || moveIndex >= length || toIndex < 0 || toIndex >= length) { return array; } var item = array[moveIndex]; var diff = moveIndex - toIndex; if (diff > 0) { // move left return [].concat((0, _toConsumableArray2.default)(array.slice(0, toIndex)), [item], (0, _toConsumableArray2.default)(array.slice(toIndex, moveIndex)), (0, _toConsumableArray2.default)(array.slice(moveIndex + 1, length))); } if (diff < 0) { // move right return [].concat((0, _toConsumableArray2.default)(array.slice(0, moveIndex)), (0, _toConsumableArray2.default)(array.slice(moveIndex + 1, toIndex + 1)), [item], (0, _toConsumableArray2.default)(array.slice(toIndex + 1, length))); } return array; } },{"./typeUtil":623,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"rc-util/lib/utils/get":877,"rc-util/lib/utils/set":878}],626:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _css = require("rc-util/lib/Dom/css"); var _Preview = _interopRequireDefault(require("./Preview")); var ImageInternal = function ImageInternal(_ref) { var src = _ref.src, alt = _ref.alt, onInitialPreviewClose = _ref.onPreviewClose, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? 'rc-image' : _ref$prefixCls, _ref$previewPrefixCls = _ref.previewPrefixCls, previewPrefixCls = _ref$previewPrefixCls === void 0 ? "".concat(prefixCls, "-preview") : _ref$previewPrefixCls, placeholder = _ref.placeholder, fallback = _ref.fallback, width = _ref.width, height = _ref.height, style = _ref.style, _ref$preview = _ref.preview, preview = _ref$preview === void 0 ? true : _ref$preview, originalClassName = _ref.className, onClick = _ref.onClick, crossOrigin = _ref.crossOrigin, decoding = _ref.decoding, loading = _ref.loading, referrerPolicy = _ref.referrerPolicy, sizes = _ref.sizes, srcSet = _ref.srcSet, useMap = _ref.useMap, otherProps = (0, _objectWithoutProperties2.default)(_ref, ["src", "alt", "onPreviewClose", "prefixCls", "previewPrefixCls", "placeholder", "fallback", "width", "height", "style", "preview", "className", "onClick", "crossOrigin", "decoding", "loading", "referrerPolicy", "sizes", "srcSet", "useMap"]); var isCustomPlaceholder = placeholder && placeholder !== true; var _useState = (0, React.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), isShowPreview = _useState2[0], setShowPreview = _useState2[1]; var _useState3 = (0, React.useState)(isCustomPlaceholder ? 'loading' : 'normal'), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), status = _useState4[0], setStatus = _useState4[1]; var _useState5 = (0, React.useState)(null), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), mousePosition = _useState6[0], setMousePosition = _useState6[1]; var isError = status === 'error'; var onLoad = function onLoad() { setStatus('normal'); }; var onError = function onError() { setStatus('error'); }; var onPreview = function onPreview(e) { var _getOffset = (0, _css.getOffset)(e.target), left = _getOffset.left, top = _getOffset.top; setShowPreview(true); setMousePosition({ x: left, y: top }); if (onClick) onClick(e); }; var onPreviewClose = function onPreviewClose(e) { e.stopPropagation(); setShowPreview(false); setMousePosition(null); if (onInitialPreviewClose) onInitialPreviewClose(e); }; React.useEffect(function () { if (isCustomPlaceholder) { setStatus('loading'); } }, [src]); var className = (0, _classnames.default)(prefixCls, originalClassName, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-error"), isError)); var mergedSrc = isError && fallback ? fallback : src; var imgCommonProps = { crossOrigin: crossOrigin, decoding: decoding, loading: loading, referrerPolicy: referrerPolicy, sizes: sizes, srcSet: srcSet, useMap: useMap, alt: alt, className: (0, _classnames.default)("".concat(prefixCls, "-img"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-img-placeholder"), placeholder === true)), style: height !== undefined ? { height: height } : undefined }; return React.createElement(React.Fragment, null, React.createElement("div", Object.assign({}, otherProps, { className: className, onClick: preview && !isError ? onPreview : onClick, style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), {}, { width: width, height: height }) }), isError && fallback ? React.createElement("img", Object.assign({}, imgCommonProps, { src: fallback })) : React.createElement("img", Object.assign({}, imgCommonProps, { onLoad: onLoad, onError: onError, src: src })), status === 'loading' && React.createElement("div", { "aria-hidden": "true", className: "".concat(prefixCls, "-placeholder") }, placeholder)), preview && !isError && React.createElement(_Preview.default, { "aria-hidden": !isShowPreview, visible: isShowPreview, prefixCls: previewPrefixCls, onClose: onPreviewClose, mousePosition: mousePosition, src: mergedSrc, alt: alt })); }; ImageInternal.displayName = 'Image'; var _default = ImageInternal; exports.default = _default; },{"./Preview":627,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-util/lib/Dom/css":862,"react":"react"}],627:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _rcDialog = _interopRequireDefault(require("rc-dialog")); var _RotateLeftOutlined = _interopRequireDefault(require("@ant-design/icons/RotateLeftOutlined")); var _RotateRightOutlined = _interopRequireDefault(require("@ant-design/icons/RotateRightOutlined")); var _ZoomInOutlined = _interopRequireDefault(require("@ant-design/icons/ZoomInOutlined")); var _ZoomOutOutlined = _interopRequireDefault(require("@ant-design/icons/ZoomOutOutlined")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined")); var _classnames3 = _interopRequireDefault(require("classnames")); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var _css = require("rc-util/lib/Dom/css"); var _warning = require("rc-util/lib/warning"); var _useFrameSetState3 = _interopRequireDefault(require("./hooks/useFrameSetState")); var _getFixScaleEleTransPosition = _interopRequireDefault(require("./getFixScaleEleTransPosition")); var useState = React.useState; var initialPosition = { x: 0, y: 0 }; var Preview = function Preview(props) { var prefixCls = props.prefixCls, src = props.src, alt = props.alt, onClose = props.onClose, afterClose = props.afterClose, visible = props.visible, restProps = (0, _objectWithoutProperties2.default)(props, ["prefixCls", "src", "alt", "onClose", "afterClose", "visible"]); var _useState = useState(1), _useState2 = (0, _slicedToArray2.default)(_useState, 2), scale = _useState2[0], setScale = _useState2[1]; var _useState3 = useState(0), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), rotate = _useState4[0], setRotate = _useState4[1]; var _useFrameSetState = (0, _useFrameSetState3.default)(initialPosition), _useFrameSetState2 = (0, _slicedToArray2.default)(_useFrameSetState, 2), position = _useFrameSetState2[0], setPosition = _useFrameSetState2[1]; var imgRef = React.useRef(); var originPositionRef = React.useRef({ originX: 0, originY: 0, deltaX: 0, deltaY: 0 }); var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), isMoving = _React$useState2[0], setMoving = _React$useState2[1]; var onAfterClose = function onAfterClose() { setScale(1); setRotate(0); setPosition(initialPosition); }; var onZoomIn = function onZoomIn() { setScale(function (value) { return value + 1; }); setPosition(initialPosition); }; var onZoomOut = function onZoomOut() { if (scale > 1) { setScale(function (value) { return value - 1; }); } setPosition(initialPosition); }; var onRotateRight = function onRotateRight() { setRotate(function (value) { return value + 90; }); }; var onRotateLeft = function onRotateLeft() { setRotate(function (value) { return value - 90; }); }; var wrapClassName = (0, _classnames3.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-moving"), isMoving)); var toolClassName = "".concat(prefixCls, "-operations-operation"); var iconClassName = "".concat(prefixCls, "-operations-icon"); var tools = [{ Icon: _CloseOutlined.default, onClick: onClose, type: 'close' }, { Icon: _ZoomInOutlined.default, onClick: onZoomIn, type: 'zoomIn' }, { Icon: _ZoomOutOutlined.default, onClick: onZoomOut, type: 'zoomOut', disabled: scale === 1 }, { Icon: _RotateRightOutlined.default, onClick: onRotateRight, type: 'rotateRight' }, { Icon: _RotateLeftOutlined.default, onClick: onRotateLeft, type: 'rotateLeft' }]; var onMouseUp = function onMouseUp() { if (visible && isMoving) { var width = imgRef.current.offsetWidth * scale; var height = imgRef.current.offsetHeight * scale; var _getOffset = (0, _css.getOffset)(imgRef.current), left = _getOffset.left, top = _getOffset.top; var isRotate = rotate % 180 !== 0; setMoving(false); var fixState = (0, _getFixScaleEleTransPosition.default)(isRotate ? height : width, isRotate ? width : height, left, top); if (fixState) { setPosition((0, _objectSpread2.default)({}, fixState)); } } }; var onMouseDown = function onMouseDown(event) { event.preventDefault(); // Without this mask close will abnormal event.stopPropagation(); originPositionRef.current.deltaX = event.pageX - position.x; originPositionRef.current.deltaY = event.pageY - position.y; originPositionRef.current.originX = position.x; originPositionRef.current.originY = position.y; setMoving(true); }; var onMouseMove = function onMouseMove(event) { if (visible && isMoving) { setPosition({ x: event.pageX - originPositionRef.current.deltaX, y: event.pageY - originPositionRef.current.deltaY }); } }; React.useEffect(function () { var onTopMouseUpListener; var onTopMouseMoveListener; var onMouseUpListener = (0, _addEventListener.default)(window, 'mouseup', onMouseUp, false); var onMouseMoveListener = (0, _addEventListener.default)(window, 'mousemove', onMouseMove, false); try { // Resolve if in iframe lost event /* istanbul ignore next */ if (window.top !== window.self) { onTopMouseUpListener = (0, _addEventListener.default)(window.top, 'mouseup', onMouseUp, false); onTopMouseMoveListener = (0, _addEventListener.default)(window.top, 'mousemove', onMouseMove, false); } } catch (error) { /* istanbul ignore next */ (0, _warning.warning)(false, "[rc-image] ".concat(error)); } return function () { onMouseUpListener.remove(); onMouseMoveListener.remove(); /* istanbul ignore next */ if (onTopMouseUpListener) onTopMouseUpListener.remove(); /* istanbul ignore next */ if (onTopMouseMoveListener) onTopMouseMoveListener.remove(); }; }, [visible, isMoving]); return React.createElement(_rcDialog.default, Object.assign({}, restProps, { transitionName: "zoom", maskTransitionName: "fade", closable: false, keyboard: true, prefixCls: prefixCls, onClose: onClose, afterClose: onAfterClose, visible: visible, wrapClassName: wrapClassName }), React.createElement("ul", { className: "".concat(prefixCls, "-operations") }, tools.map(function (_ref) { var Icon = _ref.Icon, onClick = _ref.onClick, type = _ref.type, disabled = _ref.disabled; return React.createElement("li", { className: (0, _classnames3.default)(toolClassName, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-operations-operation-disabled"), !!disabled)), onClick: onClick, key: type }, React.createElement(Icon, { className: iconClassName })); })), React.createElement("div", { className: "".concat(prefixCls, "-img-wrapper"), style: { transform: "translate3d(".concat(position.x, "px, ").concat(position.y, "px, 0)") } }, React.createElement("img", { onMouseDown: onMouseDown, ref: imgRef, className: "".concat(prefixCls, "-img"), src: src, alt: alt, style: { transform: "scale3d(".concat(scale, ", ").concat(scale, ", 1) rotate(").concat(rotate, "deg)") } }))); }; var _default = Preview; exports.default = _default; },{"./getFixScaleEleTransPosition":628,"./hooks/useFrameSetState":629,"@ant-design/icons/CloseOutlined":71,"@ant-design/icons/RotateLeftOutlined":101,"@ant-design/icons/RotateRightOutlined":102,"@ant-design/icons/ZoomInOutlined":109,"@ant-design/icons/ZoomOutOutlined":110,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-dialog":605,"rc-util/lib/Dom/addEventListener":859,"rc-util/lib/Dom/css":862,"rc-util/lib/warning":879,"react":"react"}],628:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = getFixScaleEleTransPosition; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _css = require("rc-util/lib/Dom/css"); function fixPoint(key, start, width, clientWidth) { var startAddWidth = start + width; var offsetStart = (width - clientWidth) / 2; if (width > clientWidth) { if (start > 0) { return (0, _defineProperty2.default)({}, key, offsetStart); } if (start < 0 && startAddWidth < clientWidth) { return (0, _defineProperty2.default)({}, key, -offsetStart); } } else if (start < 0 || startAddWidth > clientWidth) { return (0, _defineProperty2.default)({}, key, start < 0 ? offsetStart : -offsetStart); } return {}; } /** * Fix positon x,y point when * * Ele width && height < client * - Back origin * * - Ele width | height > clientWidth | clientHeight * - left | top > 0 -> Back 0 * - left | top + width | height < clientWidth | clientHeight -> Back left | top + width | height === clientWidth | clientHeight * * Regardless of other */ function getFixScaleEleTransPosition(width, height, left, top) { var _getClientSize = (0, _css.getClientSize)(), clientWidth = _getClientSize.width, clientHeight = _getClientSize.height; var fixPos = null; if (width <= clientWidth && height <= clientHeight) { fixPos = { x: 0, y: 0 }; } else if (width > clientWidth || height > clientHeight) { fixPos = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, fixPoint('x', left, width, clientWidth)), fixPoint('y', top, height, clientHeight)); } return fixPos; } },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"rc-util/lib/Dom/css":862}],629:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useFrameSetState; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _raf = _interopRequireDefault(require("rc-util/lib/raf")); function useFrameSetState(initial) { var frame = React.useRef(null); var _React$useState = React.useState(initial), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), state = _React$useState2[0], setState = _React$useState2[1]; var queue = React.useRef([]); var setFrameState = function setFrameState(newState) { if (frame.current === null) { queue.current = []; frame.current = (0, _raf.default)(function () { setState(function (preState) { var memoState = preState; queue.current.forEach(function (queueState) { memoState = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, memoState), queueState); }); frame.current = null; return memoState; }); }); } queue.current.push(newState); }; React.useEffect(function () { return function () { return frame.current && _raf.default.cancel(frame.current); }; }, []); return [state, setFrameState]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"rc-util/lib/raf":873,"react":"react"}],630:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); var _exportNames = {}; exports.default = void 0; var _Image = _interopRequireWildcard(require("./Image")); Object.keys(_Image).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _Image[key]; } }); }); var _default = _Image.default; exports.default = _default; },{"./Image":626,"@babel/runtime/helpers/interopRequireWildcard":193}],631:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function noop() {} function preventDefault(e) { e.preventDefault(); } var defaultParser = function defaultParser(input) { return input.replace(/[^\w.-]+/g, ''); }; /** * When click and hold on a button - the speed of auto changin the value. */ var SPEED = 200; /** * When click and hold on a button - the delay before auto changin the value. */ var DELAY = 600; /** * Max Safe Integer -- on IE this is not available, so manually set the number in that case. * The reason this is used, instead of Infinity is because numbers above the MSI are unstable */ var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1; var isValidProps = function isValidProps(value) { return value !== undefined && value !== null; }; var isEqual = function isEqual(oldValue, newValue) { return newValue === oldValue || typeof newValue === 'number' && typeof oldValue === 'number' && isNaN(newValue) && isNaN(oldValue); }; var InputNumber = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(InputNumber, _React$Component); var _super = _createSuper(InputNumber); function InputNumber(props) { var _this; (0, _classCallCheck2.default)(this, InputNumber); _this = _super.call(this, props); _this.onKeyDown = function (e) { var _this$props = _this.props, onKeyDown = _this$props.onKeyDown, onPressEnter = _this$props.onPressEnter; if (e.keyCode === _KeyCode.default.UP) { var ratio = _this.getRatio(e); _this.up(e, ratio, null); _this.stop(); } else if (e.keyCode === _KeyCode.default.DOWN) { var _ratio = _this.getRatio(e); _this.down(e, _ratio, null); _this.stop(); } else if (e.keyCode === _KeyCode.default.ENTER && onPressEnter) { onPressEnter(e); } // Trigger user key down _this.recordCursorPosition(); _this.lastKeyCode = e.keyCode; if (onKeyDown) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } onKeyDown.apply(void 0, [e].concat(args)); } }; _this.onKeyUp = function (e) { var onKeyUp = _this.props.onKeyUp; _this.stop(); _this.recordCursorPosition(); // Trigger user key up if (onKeyUp) { for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } onKeyUp.apply(void 0, [e].concat(args)); } }; _this.onChange = function (e) { var onChange = _this.props.onChange; if (_this.state.focused) { _this.inputting = true; } _this.rawInput = _this.props.parser(_this.getValueFromEvent(e)); _this.setState({ inputValue: _this.rawInput }); onChange(_this.toNumber(_this.rawInput)); // valid number or invalid string }; _this.onMouseUp = function () { var onMouseUp = _this.props.onMouseUp; _this.recordCursorPosition(); if (onMouseUp) { onMouseUp.apply(void 0, arguments); } }; _this.onFocus = function () { var _this$props2; _this.setState({ focused: true }); (_this$props2 = _this.props).onFocus.apply(_this$props2, arguments); }; _this.onBlur = function () { var onBlur = _this.props.onBlur; _this.inputting = false; _this.setState({ focused: false }); var value = _this.getCurrentValidValue(_this.state.inputValue); var newValue = _this.setValue(value, noop); if (onBlur) { var originValue = _this.input.value; var displayValue = _this.getInputDisplayValue({ focus: false, value: newValue }); _this.input.value = displayValue ? Number(displayValue) : displayValue; onBlur.apply(void 0, arguments); _this.input.value = originValue; } }; _this.getRatio = function (e) { var ratio = 1; if (e.metaKey || e.ctrlKey) { ratio = 0.1; } else if (e.shiftKey) { ratio = 10; } return ratio; }; _this.getFullNum = function (num) { if (isNaN(num)) { return num; } if (!/e/i.test(String(num))) { return num; } return Number(num).toFixed(18).replace(/\.?0+$/, ''); }; _this.getPrecision = function (value) { if (isValidProps(_this.props.precision)) { return _this.props.precision; } var valueString = String(value); if (valueString.indexOf('e-') >= 0) { return parseInt(valueString.slice(valueString.indexOf('e-') + 2), 10); } var precision = 0; if (valueString.indexOf('.') >= 0) { precision = valueString.length - valueString.indexOf('.') - 1; } return precision; }; _this.getInputDisplayValue = function (state) { var _ref = state || _this.state, focused = _ref.focused, inputValue = _ref.inputValue, value = _ref.value; var inputDisplayValue; if (focused) { inputDisplayValue = inputValue; } else { inputDisplayValue = _this.toPrecisionAsStep(value); } if (inputDisplayValue === undefined || inputDisplayValue === null) { inputDisplayValue = ''; } var inputDisplayValueFormat = _this.formatWrapper(inputDisplayValue); if (isValidProps(_this.props.decimalSeparator)) { inputDisplayValueFormat = inputDisplayValueFormat.toString().replace('.', _this.props.decimalSeparator); } return inputDisplayValueFormat; }; _this.recordCursorPosition = function () { // Record position try { _this.cursorStart = _this.input.selectionStart; _this.cursorEnd = _this.input.selectionEnd; _this.currentValue = _this.input.value; _this.cursorBefore = _this.input.value.substring(0, _this.cursorStart); _this.cursorAfter = _this.input.value.substring(_this.cursorEnd); } catch (e) {// Fix error in Chrome: // Failed to read the 'selectionStart' property from 'HTMLInputElement' // http://stackoverflow.com/q/21177489/3040605 } }; _this.restoreByAfter = function (str) { if (str === undefined) return false; var fullStr = _this.input.value; var index = fullStr.lastIndexOf(str); if (index === -1) return false; var prevCursorPos = _this.cursorBefore.length; if (_this.lastKeyCode === _KeyCode.default.DELETE && _this.cursorBefore.charAt(prevCursorPos - 1) === str[0]) { _this.fixCaret(prevCursorPos, prevCursorPos); return true; } if (index + str.length === fullStr.length) { _this.fixCaret(index, index); return true; } return false; }; _this.partRestoreByAfter = function (str) { if (str === undefined) return false; // For loop from full str to the str with last char to map. e.g. 123 // -> 123 // -> 23 // -> 3 return Array.prototype.some.call(str, function (_, start) { var partStr = str.substring(start); return _this.restoreByAfter(partStr); }); }; // '1.' '1x' 'xx' '' => are not complete numbers _this.isNotCompleteNumber = function (num) { return isNaN(num) || num === '' || num === null || num && num.toString().indexOf('.') === num.toString().length - 1; }; _this.stop = function () { if (_this.autoStepTimer) { clearTimeout(_this.autoStepTimer); } }; _this.down = function (e, ratio, recursive) { _this.pressingUpOrDown = true; _this.step('down', e, ratio, recursive); }; _this.up = function (e, ratio, recursive) { _this.pressingUpOrDown = true; _this.step('up', e, ratio, recursive); }; _this.saveInput = function (node) { _this.input = node; }; var value = props.value; if (value === undefined) { value = props.defaultValue; } _this.state = { focused: props.autoFocus }; var validValue = _this.getValidValue(_this.toNumber(value)); _this.state = _objectSpread(_objectSpread({}, _this.state), {}, { inputValue: _this.toPrecisionAsStep(validValue), value: validValue }); return _this; } (0, _createClass2.default)(InputNumber, [{ key: "componentDidMount", value: function componentDidMount() { this.componentDidUpdate(null); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this$props3 = this.props, value = _this$props3.value, onChange = _this$props3.onChange, max = _this$props3.max, min = _this$props3.min; var focused = this.state.focused; // Don't trigger in componentDidMount if (prevProps) { if (!isEqual(prevProps.value, value) || !isEqual(prevProps.max, max) || !isEqual(prevProps.min, min)) { var validValue = focused ? value : this.getValidValue(value); var nextInputValue; if (this.pressingUpOrDown) { nextInputValue = validValue; } else if (this.inputting) { nextInputValue = this.rawInput; } else { nextInputValue = this.toPrecisionAsStep(validValue); } this.setState({ // eslint-disable-line value: validValue, inputValue: nextInputValue }); } // Trigger onChange when max or min change // https://github.com/ant-design/ant-design/issues/11574 var nextValue = 'value' in this.props ? value : this.state.value; // ref: null < 20 === true // https://github.com/ant-design/ant-design/issues/14277 if ('max' in this.props && prevProps.max !== max && typeof nextValue === 'number' && nextValue > max && onChange) { onChange(max); } if ('min' in this.props && prevProps.min !== min && typeof nextValue === 'number' && nextValue < min && onChange) { onChange(min); } } // Restore cursor try { // Firefox set the input cursor after it get focused. // This caused that if an input didn't init with the selection, // set will cause cursor not correct when first focus. // Safari will focus input if set selection. We need skip this. if (this.cursorStart !== undefined && this.state.focused) { // In most cases, the string after cursor is stable. // We can move the cursor before it if ( // If not match full str, try to match part of str !this.partRestoreByAfter(this.cursorAfter) && this.state.value !== this.props.value) { // If not match any of then, let's just keep the position // TODO: Logic should not reach here, need check if happens var pos = this.cursorStart + 1; // If not have last string, just position to the end if (!this.cursorAfter) { pos = this.input.value.length; } else if (this.lastKeyCode === _KeyCode.default.BACKSPACE) { pos = this.cursorStart - 1; } else if (this.lastKeyCode === _KeyCode.default.DELETE) { pos = this.cursorStart; } this.fixCaret(pos, pos); } else if (this.currentValue === this.input.value) { // Handle some special key code switch (this.lastKeyCode) { case _KeyCode.default.BACKSPACE: this.fixCaret(this.cursorStart - 1, this.cursorStart - 1); break; case _KeyCode.default.DELETE: this.fixCaret(this.cursorStart + 1, this.cursorStart + 1); break; default: // Do nothing } } } } catch (e) {// Do nothing } // Reset last key this.lastKeyCode = null; // pressingUpOrDown is true means that someone just click up or down button if (!this.pressingUpOrDown) { return; } if (this.props.focusOnUpDown && this.state.focused) { if (document.activeElement !== this.input) { this.focus(); } } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.stop(); } }, { key: "getCurrentValidValue", value: function getCurrentValidValue(value) { var val = value; if (val === '') { val = ''; } else if (!this.isNotCompleteNumber(parseFloat(val))) { val = this.getValidValue(val); } else { val = this.state.value; } return this.toNumber(val); } }, { key: "getValueFromEvent", value: function getValueFromEvent(e) { // optimize for chinese input expierence // https://github.com/ant-design/ant-design/issues/8196 var value = e.target.value.trim().replace(/。/g, '.'); if (isValidProps(this.props.decimalSeparator)) { value = value.replace(this.props.decimalSeparator, '.'); } return value; } }, { key: "getValidValue", value: function getValidValue(value) { var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.props.min; var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.props.max; var val = parseFloat(value); // https://github.com/ant-design/ant-design/issues/7358 if (isNaN(val)) { return value; } if (val < min) { val = min; } if (val > max) { val = max; } return val; } }, { key: "setValue", value: function setValue(v, callback) { // trigger onChange var precision = this.props.precision; var newValue = this.isNotCompleteNumber(parseFloat(v)) ? null : parseFloat(v); var _this$state$value = this.state.value, value = _this$state$value === void 0 ? null : _this$state$value; var _this$state$inputValu = this.state.inputValue, inputValue = _this$state$inputValu === void 0 ? null : _this$state$inputValu; // https://github.com/ant-design/ant-design/issues/7363 // https://github.com/ant-design/ant-design/issues/16622 var newValueInString = typeof newValue === 'number' ? newValue.toFixed(precision) : "".concat(newValue); var changed = newValue !== value || newValueInString !== "".concat(inputValue); if (!('value' in this.props)) { this.setState({ value: newValue, inputValue: this.toPrecisionAsStep(v) }, callback); } else { // always set input value same as value inputValue = this.toPrecisionAsStep(this.state.value); this.setState({ inputValue: inputValue }, callback); } if (changed) { this.props.onChange(newValue); } return newValue; } // step={1.0} value={1.51} // press + // then value should be 2.51, rather than 2.5 // if this.props.precision is undefined // https://github.com/react-component/input-number/issues/39 }, { key: "getMaxPrecision", value: function getMaxPrecision(currentValue) { var ratio = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var _this$props4 = this.props, precision = _this$props4.precision, step = _this$props4.step; if (isValidProps(precision)) { return precision; } var ratioPrecision = this.getPrecision(ratio); var stepPrecision = this.getPrecision(step); var currentValuePrecision = this.getPrecision(currentValue); if (!currentValue) { return ratioPrecision + stepPrecision; } return Math.max(currentValuePrecision, ratioPrecision + stepPrecision); } }, { key: "getPrecisionFactor", value: function getPrecisionFactor(currentValue) { var ratio = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var precision = this.getMaxPrecision(currentValue, ratio); return Math.pow(10, precision); } }, { key: "focus", value: function focus() { this.input.focus(); this.recordCursorPosition(); } }, { key: "blur", value: function blur() { this.input.blur(); } }, { key: "select", value: function select() { this.input.select(); } }, { key: "formatWrapper", value: function formatWrapper(num) { // http://2ality.com/2012/03/signedzero.html // https://github.com/ant-design/ant-design/issues/9439 if (this.props.formatter) { return this.props.formatter(num); } return num; } }, { key: "toPrecisionAsStep", value: function toPrecisionAsStep(num) { if (this.isNotCompleteNumber(num) || num === '') { return num; } var precision = Math.abs(this.getMaxPrecision(num)); if (!isNaN(precision)) { return Number(num).toFixed(precision); } return num.toString(); } }, { key: "toNumber", value: function toNumber(num) { var precision = this.props.precision; var focused = this.state.focused; // num.length > 16 => This is to prevent input of large numbers var numberIsTooLarge = num && num.length > 16 && focused; if (this.isNotCompleteNumber(num) || numberIsTooLarge) { return num; } if (isValidProps(precision)) { return Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision); } return Number(num); } }, { key: "upStep", value: function upStep(val, rat) { var step = this.props.step; var precisionFactor = this.getPrecisionFactor(val, rat); var precision = Math.abs(this.getMaxPrecision(val, rat)); var result = ((precisionFactor * val + precisionFactor * step * rat) / precisionFactor).toFixed(precision); return this.toNumber(result); } }, { key: "downStep", value: function downStep(val, rat) { var step = this.props.step; var precisionFactor = this.getPrecisionFactor(val, rat); var precision = Math.abs(this.getMaxPrecision(val, rat)); var result = ((precisionFactor * val - precisionFactor * step * rat) / precisionFactor).toFixed(precision); return this.toNumber(result); } }, { key: "step", value: function step(type, e) { var _this2 = this; var ratio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; var recursive = arguments.length > 3 ? arguments[3] : undefined; this.stop(); if (e) { e.persist(); e.preventDefault(); } var props = this.props; if (props.disabled) { return; } var value = this.getCurrentValidValue(this.state.inputValue) || 0; if (this.isNotCompleteNumber(value)) { return; } var val = this["".concat(type, "Step")](value, ratio); var outOfRange = val > props.max || val < props.min; if (val > props.max) { val = props.max; } else if (val < props.min) { val = props.min; } this.setValue(val, null); this.setState({ focused: true }, function () { _this2.pressingUpOrDown = false; }); if (outOfRange) { return; } this.autoStepTimer = setTimeout(function () { _this2[type](e, ratio, true); }, recursive ? SPEED : DELAY); } }, { key: "fixCaret", value: function fixCaret(start, end) { if (start === undefined || end === undefined || !this.input || !this.input.value) { return; } try { var currentStart = this.input.selectionStart; var currentEnd = this.input.selectionEnd; if (start !== currentStart || end !== currentEnd) { this.input.setSelectionRange(start, end); } } catch (e) {// Fix error in Chrome: // Failed to read the 'selectionStart' property from 'HTMLInputElement' // http://stackoverflow.com/q/21177489/3040605 } } }, { key: "render", value: function render() { var _classNames; var _this$props5 = this.props, prefixCls = _this$props5.prefixCls, disabled = _this$props5.disabled, readOnly = _this$props5.readOnly, useTouch = _this$props5.useTouch, autoComplete = _this$props5.autoComplete, upHandler = _this$props5.upHandler, downHandler = _this$props5.downHandler, className = _this$props5.className, max = _this$props5.max, min = _this$props5.min, style = _this$props5.style, title = _this$props5.title, onMouseEnter = _this$props5.onMouseEnter, onMouseLeave = _this$props5.onMouseLeave, onMouseOver = _this$props5.onMouseOver, onMouseOut = _this$props5.onMouseOut, required = _this$props5.required, onClick = _this$props5.onClick, tabIndex = _this$props5.tabIndex, type = _this$props5.type, placeholder = _this$props5.placeholder, id = _this$props5.id, inputMode = _this$props5.inputMode, pattern = _this$props5.pattern, step = _this$props5.step, maxLength = _this$props5.maxLength, autoFocus = _this$props5.autoFocus, name = _this$props5.name, onPaste = _this$props5.onPaste, onInput = _this$props5.onInput, rest = (0, _objectWithoutProperties2.default)(_this$props5, ["prefixCls", "disabled", "readOnly", "useTouch", "autoComplete", "upHandler", "downHandler", "className", "max", "min", "style", "title", "onMouseEnter", "onMouseLeave", "onMouseOver", "onMouseOut", "required", "onClick", "tabIndex", "type", "placeholder", "id", "inputMode", "pattern", "step", "maxLength", "autoFocus", "name", "onPaste", "onInput"]); var _this$state = this.state, value = _this$state.value, focused = _this$state.focused; var classes = (0, _classnames.default)(prefixCls, (_classNames = {}, (0, _defineProperty2.default)(_classNames, className, !!className), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-focused"), focused), _classNames)); var dataOrAriaAttributeProps = {}; Object.keys(rest).forEach(function (key) { if (key.substr(0, 5) === 'data-' || key.substr(0, 5) === 'aria-' || key === 'role') { dataOrAriaAttributeProps[key] = rest[key]; } }); var editable = !readOnly && !disabled; // focus state, show input value // unfocus state, show valid value var inputDisplayValue = this.getInputDisplayValue(null); var upDisabled = (value || value === 0) && (isNaN(value) || Number(value) >= max); var downDisabled = (value || value === 0) && (isNaN(value) || Number(value) <= min); var isUpDisabled = upDisabled || disabled || readOnly; var isDownDisabled = downDisabled || disabled || readOnly; var upClassName = (0, _classnames.default)("".concat(prefixCls, "-handler"), "".concat(prefixCls, "-handler-up"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-handler-up-disabled"), isUpDisabled)); var downClassName = (0, _classnames.default)("".concat(prefixCls, "-handler"), "".concat(prefixCls, "-handler-down"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-handler-down-disabled"), isDownDisabled)); var upEvents = useTouch ? { onTouchStart: isUpDisabled ? noop : this.up, onTouchEnd: this.stop } : { onMouseDown: isUpDisabled ? noop : this.up, onMouseUp: this.stop, onMouseLeave: this.stop }; var downEvents = useTouch ? { onTouchStart: isDownDisabled ? noop : this.down, onTouchEnd: this.stop } : { onMouseDown: isDownDisabled ? noop : this.down, onMouseUp: this.stop, onMouseLeave: this.stop }; return _react.default.createElement("div", { className: classes, style: style, title: title, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onMouseOver: onMouseOver, onMouseOut: onMouseOut, onFocus: function onFocus() { return null; }, onBlur: function onBlur() { return null; } }, _react.default.createElement("div", { className: "".concat(prefixCls, "-handler-wrap") }, _react.default.createElement("span", Object.assign({ unselectable: "on" }, upEvents, { role: "button", "aria-label": "Increase Value", "aria-disabled": isUpDisabled, className: upClassName }), upHandler || _react.default.createElement("span", { unselectable: "on", className: "".concat(prefixCls, "-handler-up-inner"), onClick: preventDefault })), _react.default.createElement("span", Object.assign({ unselectable: "on" }, downEvents, { role: "button", "aria-label": "Decrease Value", "aria-disabled": isDownDisabled, className: downClassName }), downHandler || _react.default.createElement("span", { unselectable: "on", className: "".concat(prefixCls, "-handler-down-inner"), onClick: preventDefault }))), _react.default.createElement("div", { className: "".concat(prefixCls, "-input-wrap") }, _react.default.createElement("input", Object.assign({ role: "spinbutton", "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": value, required: required, type: type, placeholder: placeholder, onPaste: onPaste, onClick: onClick, onMouseUp: this.onMouseUp, className: "".concat(prefixCls, "-input"), tabIndex: tabIndex, autoComplete: autoComplete, onFocus: this.onFocus, onBlur: this.onBlur, onKeyDown: editable ? this.onKeyDown : noop, onKeyUp: editable ? this.onKeyUp : noop, autoFocus: autoFocus, maxLength: maxLength, readOnly: readOnly, disabled: disabled, max: max, min: min, step: step, name: name, title: title, id: id, onChange: this.onChange, ref: this.saveInput, value: this.getFullNum(inputDisplayValue), pattern: pattern, inputMode: inputMode, onInput: onInput }, dataOrAriaAttributeProps)))); } }]); return InputNumber; }(_react.default.Component); InputNumber.defaultProps = { focusOnUpDown: true, useTouch: false, prefixCls: 'rc-input-number', max: MAX_SAFE_INTEGER, min: -MAX_SAFE_INTEGER, step: 1, style: {}, onChange: noop, onKeyDown: noop, onPressEnter: noop, onFocus: noop, onBlur: noop, parser: defaultParser, required: false, autoComplete: 'off' }; var _default = InputNumber; exports.default = _default; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/possibleConstructorReturn":202,"classnames":455,"rc-util/lib/KeyCode":865,"react":"react"}],632:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _InputNumber = _interopRequireDefault(require("./InputNumber")); var _default = _InputNumber.default; exports.default = _default; },{"./InputNumber":631,"@babel/runtime/helpers/interopRequireDefault":192}],633:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _rcMenu = _interopRequireWildcard(require("rc-menu")); var React = _interopRequireWildcard(require("react")); var _MentionsContext = require("./MentionsContext"); /** * We only use Menu to display the candidate. * The focus is controlled by textarea to make accessibility easy. */ var DropdownMenu = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(DropdownMenu, _React$Component); var _super = (0, _createSuper2.default)(DropdownMenu); function DropdownMenu() { var _this; (0, _classCallCheck2.default)(this, DropdownMenu); _this = _super.apply(this, arguments); _this.renderDropdown = function (_ref) { var notFoundContent = _ref.notFoundContent, activeIndex = _ref.activeIndex, setActiveIndex = _ref.setActiveIndex, selectOption = _ref.selectOption, onFocus = _ref.onFocus, onBlur = _ref.onBlur; var _this$props = _this.props, prefixCls = _this$props.prefixCls, options = _this$props.options; var activeOption = options[activeIndex] || {}; return React.createElement(_rcMenu.default, { prefixCls: "".concat(prefixCls, "-menu"), activeKey: activeOption.key, onSelect: function onSelect(_ref2) { var key = _ref2.key; var option = options.find(function (_ref3) { var optionKey = _ref3.key; return optionKey === key; }); selectOption(option); }, onFocus: onFocus, onBlur: onBlur }, options.map(function (option, index) { var key = option.key, disabled = option.disabled, children = option.children, className = option.className, style = option.style; return React.createElement(_rcMenu.MenuItem, { key: key, disabled: disabled, className: className, style: style, onMouseEnter: function onMouseEnter() { setActiveIndex(index); } }, children); }), !options.length && React.createElement(_rcMenu.MenuItem, { disabled: true }, notFoundContent)); }; return _this; } (0, _createClass2.default)(DropdownMenu, [{ key: "render", value: function render() { return React.createElement(_MentionsContext.MentionsContextConsumer, null, this.renderDropdown); } }]); return DropdownMenu; }(React.Component); var _default = DropdownMenu; exports.default = _default; },{"./MentionsContext":636,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-menu":647,"react":"react"}],634:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _rcTrigger = _interopRequireDefault(require("rc-trigger")); var React = _interopRequireWildcard(require("react")); var _DropdownMenu = _interopRequireDefault(require("./DropdownMenu")); var BUILT_IN_PLACEMENTS = { bottomRight: { points: ['tl', 'br'], offset: [0, 4], overflow: { adjustX: 0, adjustY: 1 } }, bottomLeft: { points: ['tr', 'bl'], offset: [0, 4], overflow: { adjustX: 0, adjustY: 1 } }, topRight: { points: ['bl', 'tr'], offset: [0, -4], overflow: { adjustX: 0, adjustY: 1 } }, topLeft: { points: ['br', 'tl'], offset: [0, -4], overflow: { adjustX: 0, adjustY: 1 } } }; var KeywordTrigger = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(KeywordTrigger, _React$Component); var _super = (0, _createSuper2.default)(KeywordTrigger); function KeywordTrigger() { var _this; (0, _classCallCheck2.default)(this, KeywordTrigger); _this = _super.apply(this, arguments); _this.getDropdownPrefix = function () { return "".concat(_this.props.prefixCls, "-dropdown"); }; _this.getDropdownElement = function () { var options = _this.props.options; return React.createElement(_DropdownMenu.default, { prefixCls: _this.getDropdownPrefix(), options: options }); }; _this.getDropDownPlacement = function () { var _this$props = _this.props, placement = _this$props.placement, direction = _this$props.direction; var popupPlacement = 'topRight'; if (direction === 'rtl') { popupPlacement = placement === 'top' ? 'topLeft' : 'bottomLeft'; } else { popupPlacement = placement === 'top' ? 'topRight' : 'bottomRight'; } return popupPlacement; }; return _this; } (0, _createClass2.default)(KeywordTrigger, [{ key: "render", value: function render() { var _this$props2 = this.props, children = _this$props2.children, visible = _this$props2.visible, transitionName = _this$props2.transitionName, getPopupContainer = _this$props2.getPopupContainer; var popupElement = this.getDropdownElement(); return React.createElement(_rcTrigger.default, { prefixCls: this.getDropdownPrefix(), popupVisible: visible, popup: popupElement, popupPlacement: this.getDropDownPlacement(), popupTransitionName: transitionName, builtinPlacements: BUILT_IN_PLACEMENTS, getPopupContainer: getPopupContainer }, children); } }]); return KeywordTrigger; }(React.Component); var _default = KeywordTrigger; exports.default = _default; },{"./DropdownMenu":633,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-trigger":848,"react":"react"}],635:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _classnames = _interopRequireDefault(require("classnames")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var React = _interopRequireWildcard(require("react")); var _rcTextarea = _interopRequireDefault(require("rc-textarea")); var _KeywordTrigger = _interopRequireDefault(require("./KeywordTrigger")); var _MentionsContext = require("./MentionsContext"); var _Option = _interopRequireDefault(require("./Option")); var _util = require("./util"); var Mentions = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Mentions, _React$Component); var _super = (0, _createSuper2.default)(Mentions); function Mentions(props) { var _this; (0, _classCallCheck2.default)(this, Mentions); _this = _super.call(this, props); _this.focusId = undefined; _this.triggerChange = function (value) { var onChange = _this.props.onChange; if (!('value' in _this.props)) { _this.setState({ value: value }); } if (onChange) { onChange(value); } }; _this.onChange = function (_ref) { var value = _ref.target.value; _this.triggerChange(value); }; // Check if hit the measure keyword _this.onKeyDown = function (event) { var which = event.which; var _this$state = _this.state, activeIndex = _this$state.activeIndex, measuring = _this$state.measuring; // Skip if not measuring if (!measuring) { return; } if (which === _KeyCode.default.UP || which === _KeyCode.default.DOWN) { // Control arrow function var optionLen = _this.getOptions().length; var offset = which === _KeyCode.default.UP ? -1 : 1; var newActiveIndex = (activeIndex + offset + optionLen) % optionLen; _this.setState({ activeIndex: newActiveIndex }); event.preventDefault(); } else if (which === _KeyCode.default.ESC) { _this.stopMeasure(); } else if (which === _KeyCode.default.ENTER) { // Measure hit event.preventDefault(); var options = _this.getOptions(); if (!options.length) { _this.stopMeasure(); return; } var option = options[activeIndex]; _this.selectOption(option); } }; /** * When to start measure: * 1. When user press `prefix` * 2. When measureText !== prevMeasureText * - If measure hit * - If measuring * * When to stop measure: * 1. Selection is out of range * 2. Contains `space` * 3. ESC or select one */ _this.onKeyUp = function (event) { var key = event.key, which = event.which; var _this$state2 = _this.state, prevMeasureText = _this$state2.measureText, measuring = _this$state2.measuring; var _this$props = _this.props, _this$props$prefix = _this$props.prefix, prefix = _this$props$prefix === void 0 ? '' : _this$props$prefix, onSearch = _this$props.onSearch, validateSearch = _this$props.validateSearch; var target = event.target; var selectionStartText = (0, _util.getBeforeSelectionText)(target); var _getLastMeasureIndex = (0, _util.getLastMeasureIndex)(selectionStartText, prefix), measureIndex = _getLastMeasureIndex.location, measurePrefix = _getLastMeasureIndex.prefix; // Skip if match the white key list if ([_KeyCode.default.ESC, _KeyCode.default.UP, _KeyCode.default.DOWN, _KeyCode.default.ENTER].indexOf(which) !== -1) { return; } if (measureIndex !== -1) { var measureText = selectionStartText.slice(measureIndex + measurePrefix.length); var validateMeasure = validateSearch(measureText, _this.props); var matchOption = !!_this.getOptions(measureText).length; if (validateMeasure) { if (key === measurePrefix || key === 'Shift' || measuring || measureText !== prevMeasureText && matchOption) { _this.startMeasure(measureText, measurePrefix, measureIndex); } } else if (measuring) { // Stop if measureText is invalidate _this.stopMeasure(); } /** * We will trigger `onSearch` to developer since they may use for async update. * If met `space` means user finished searching. */ if (onSearch && validateMeasure) { onSearch(measureText, measurePrefix); } } else if (measuring) { _this.stopMeasure(); } }; _this.onPressEnter = function (event) { var measuring = _this.state.measuring; var onPressEnter = _this.props.onPressEnter; if (!measuring && onPressEnter) { onPressEnter(event); } }; _this.onInputFocus = function (event) { _this.onFocus(event); }; _this.onInputBlur = function (event) { _this.onBlur(event); }; _this.onDropdownFocus = function () { _this.onFocus(); }; _this.onDropdownBlur = function () { _this.onBlur(); }; _this.onFocus = function (event) { window.clearTimeout(_this.focusId); var isFocus = _this.state.isFocus; var onFocus = _this.props.onFocus; if (!isFocus && event && onFocus) { onFocus(event); } _this.setState({ isFocus: true }); }; _this.onBlur = function (event) { _this.focusId = window.setTimeout(function () { var onBlur = _this.props.onBlur; _this.setState({ isFocus: false }); _this.stopMeasure(); if (onBlur) { onBlur(event); } }, 0); }; _this.selectOption = function (option) { var _this$state3 = _this.state, value = _this$state3.value, measureLocation = _this$state3.measureLocation, measurePrefix = _this$state3.measurePrefix; var _this$props2 = _this.props, split = _this$props2.split, onSelect = _this$props2.onSelect; var _option$value = option.value, mentionValue = _option$value === void 0 ? '' : _option$value; var _replaceWithMeasure = (0, _util.replaceWithMeasure)(value, { measureLocation: measureLocation, targetText: mentionValue, prefix: measurePrefix, selectionStart: _this.textarea.selectionStart, split: split }), text = _replaceWithMeasure.text, selectionLocation = _replaceWithMeasure.selectionLocation; _this.triggerChange(text); _this.stopMeasure(function () { // We need restore the selection position (0, _util.setInputSelection)(_this.textarea, selectionLocation); }); if (onSelect) { onSelect(option, measurePrefix); } }; _this.setActiveIndex = function (activeIndex) { _this.setState({ activeIndex: activeIndex }); }; _this.setTextAreaRef = function (element) { var _element$resizableTex; _this.textarea = element === null || element === void 0 ? void 0 : (_element$resizableTex = element.resizableTextArea) === null || _element$resizableTex === void 0 ? void 0 : _element$resizableTex.textArea; }; _this.setMeasureRef = function (element) { _this.measure = element; }; _this.getOptions = function (measureText) { var targetMeasureText = measureText || _this.state.measureText || ''; var _this$props3 = _this.props, children = _this$props3.children, filterOption = _this$props3.filterOption; var list = (0, _toArray.default)(children).map(function (_ref2) { var props = _ref2.props, key = _ref2.key; return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, { key: key || props.value }); }).filter(function (option) { /** Return all result if `filterOption` is false. */ if (filterOption === false) { return true; } return filterOption(targetMeasureText, option); }); return list; }; _this.state = { value: props.defaultValue || props.value || '', measuring: false, measureLocation: 0, measureText: null, measurePrefix: '', activeIndex: 0, isFocus: false }; return _this; } (0, _createClass2.default)(Mentions, [{ key: "componentDidUpdate", value: function componentDidUpdate() { var measuring = this.state.measuring; // Sync measure div top with textarea for rc-trigger usage if (measuring) { this.measure.scrollTop = this.textarea.scrollTop; } } }, { key: "startMeasure", value: function startMeasure(measureText, measurePrefix, measureLocation) { this.setState({ measuring: true, measureText: measureText, measurePrefix: measurePrefix, measureLocation: measureLocation, activeIndex: 0 }); } }, { key: "stopMeasure", value: function stopMeasure(callback) { this.setState({ measuring: false, measureLocation: 0, measureText: null }, callback); } }, { key: "focus", value: function focus() { this.textarea.focus(); } }, { key: "blur", value: function blur() { this.textarea.blur(); } }, { key: "render", value: function render() { var _this$state4 = this.state, value = _this$state4.value, measureLocation = _this$state4.measureLocation, measurePrefix = _this$state4.measurePrefix, measuring = _this$state4.measuring, activeIndex = _this$state4.activeIndex; var _this$props4 = this.props, prefixCls = _this$props4.prefixCls, placement = _this$props4.placement, direction = _this$props4.direction, transitionName = _this$props4.transitionName, className = _this$props4.className, style = _this$props4.style, autoFocus = _this$props4.autoFocus, notFoundContent = _this$props4.notFoundContent, getPopupContainer = _this$props4.getPopupContainer, restProps = (0, _objectWithoutProperties2.default)(_this$props4, ["prefixCls", "placement", "direction", "transitionName", "className", "style", "autoFocus", "notFoundContent", "getPopupContainer"]); var inputProps = (0, _util.omit)(restProps, 'value', 'defaultValue', 'prefix', 'split', 'children', 'validateSearch', 'filterOption', 'onSelect', 'onSearch'); var options = measuring ? this.getOptions() : []; return React.createElement("div", { className: (0, _classnames.default)(prefixCls, className), style: style }, React.createElement(_rcTextarea.default, Object.assign({ autoFocus: autoFocus, ref: this.setTextAreaRef, value: value }, inputProps, { onChange: this.onChange, onKeyDown: this.onKeyDown, onKeyUp: this.onKeyUp, onPressEnter: this.onPressEnter, onFocus: this.onInputFocus, onBlur: this.onInputBlur })), measuring && React.createElement("div", { ref: this.setMeasureRef, className: "".concat(prefixCls, "-measure") }, value.slice(0, measureLocation), React.createElement(_MentionsContext.MentionsContextProvider, { value: { notFoundContent: notFoundContent, activeIndex: activeIndex, setActiveIndex: this.setActiveIndex, selectOption: this.selectOption, onFocus: this.onDropdownFocus, onBlur: this.onDropdownBlur } }, React.createElement(_KeywordTrigger.default, { prefixCls: prefixCls, transitionName: transitionName, placement: placement, direction: direction, options: options, visible: true, getPopupContainer: getPopupContainer }, React.createElement("span", null, measurePrefix))), value.slice(measureLocation + measurePrefix.length))); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, prevState) { var newState = {}; if ('value' in props && props.value !== prevState.value) { newState.value = props.value || ''; } return newState; } }]); return Mentions; }(React.Component); Mentions.Option = _Option.default; Mentions.defaultProps = { prefixCls: 'rc-mentions', prefix: '@', split: ' ', validateSearch: _util.validateSearch, filterOption: _util.filterOption, notFoundContent: 'Not Found', rows: 1 }; var _default = Mentions; exports.default = _default; },{"./KeywordTrigger":634,"./MentionsContext":636,"./Option":637,"./util":639,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"classnames":455,"rc-textarea":813,"rc-util/lib/Children/toArray":858,"rc-util/lib/KeyCode":865,"react":"react"}],636:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.MentionsContextConsumer = exports.MentionsContextProvider = void 0; var React = _interopRequireWildcard(require("react")); /* tslint:disable: no-object-literal-type-assertion */ // We will never use default, here only to fix TypeScript warning var MentionsContext = React.createContext(null); var MentionsContextProvider = MentionsContext.Provider; exports.MentionsContextProvider = MentionsContextProvider; var MentionsContextConsumer = MentionsContext.Consumer; exports.MentionsContextConsumer = MentionsContextConsumer; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],637:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var Option = function Option() { return null; }; var _default = Option; exports.default = _default; },{}],638:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Mentions = _interopRequireDefault(require("./Mentions")); var _default = _Mentions.default; exports.default = _default; },{"./Mentions":635,"@babel/runtime/helpers/interopRequireDefault":192}],639:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getBeforeSelectionText = getBeforeSelectionText; exports.getLastMeasureIndex = getLastMeasureIndex; exports.replaceWithMeasure = replaceWithMeasure; exports.setInputSelection = setInputSelection; exports.validateSearch = validateSearch; exports.filterOption = filterOption; exports.omit = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var omit = function omit(obj) { var clone = (0, _objectSpread2.default)({}, obj); for (var _len = arguments.length, keys = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { keys[_key - 1] = arguments[_key]; } keys.forEach(function (key) { delete clone[key]; }); return clone; }; /** * Cut input selection into 2 part and return text before selection start */ exports.omit = omit; function getBeforeSelectionText(input) { var selectionStart = input.selectionStart; return input.value.slice(0, selectionStart); } /** * Find the last match prefix index */ function getLastMeasureIndex(text) { var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var prefixList = Array.isArray(prefix) ? prefix : [prefix]; return prefixList.reduce(function (lastMatch, prefixStr) { var lastIndex = text.lastIndexOf(prefixStr); if (lastIndex > lastMatch.location) { return { location: lastIndex, prefix: prefixStr }; } return lastMatch; }, { location: -1, prefix: '' }); } function lower(char) { return (char || '').toLowerCase(); } function reduceText(text, targetText, split) { var firstChar = text[0]; if (!firstChar || firstChar === split) { return text; } // Reuse rest text as it can var restText = text; var targetTextLen = targetText.length; for (var i = 0; i < targetTextLen; i += 1) { if (lower(restText[i]) !== lower(targetText[i])) { restText = restText.slice(i); break; } else if (i === targetTextLen - 1) { restText = restText.slice(targetTextLen); } } return restText; } /** * Paint targetText into current text: * text: little@litest * targetText: light * => little @light test */ function replaceWithMeasure(text, measureConfig) { var measureLocation = measureConfig.measureLocation, prefix = measureConfig.prefix, targetText = measureConfig.targetText, selectionStart = measureConfig.selectionStart, split = measureConfig.split; // Before text will append one space if have other text var beforeMeasureText = text.slice(0, measureLocation); if (beforeMeasureText[beforeMeasureText.length - split.length] === split) { beforeMeasureText = beforeMeasureText.slice(0, beforeMeasureText.length - split.length); } if (beforeMeasureText) { beforeMeasureText = "".concat(beforeMeasureText).concat(split); } // Cut duplicate string with current targetText var restText = reduceText(text.slice(selectionStart), targetText.slice(selectionStart - measureLocation - prefix.length), split); if (restText.slice(0, split.length) === split) { restText = restText.slice(split.length); } var connectedStartText = "".concat(beforeMeasureText).concat(prefix).concat(targetText).concat(split); return { text: "".concat(connectedStartText).concat(restText), selectionLocation: connectedStartText.length }; } function setInputSelection(input, location) { input.setSelectionRange(location, location); /** * Reset caret into view. * Since this function always called by user control, it's safe to focus element. */ input.blur(); input.focus(); } function validateSearch(text, props) { var split = props.split; return !split || text.indexOf(split) === -1; } function filterOption(input, _ref) { var _ref$value = _ref.value, value = _ref$value === void 0 ? '' : _ref$value; var lowerCase = input.toLowerCase(); return value.toLowerCase().indexOf(lowerCase) !== -1; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199}],640:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var ReactDOM = _interopRequireWildcard(require("react-dom")); var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill")); var _SubMenu = _interopRequireDefault(require("./SubMenu")); var _util = require("./util"); var MENUITEM_OVERFLOWED_CLASSNAME = 'menuitem-overflowed'; var FLOAT_PRECISION_ADJUST = 0.5; var DOMWrap = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(DOMWrap, _React$Component); var _super = (0, _createSuper2.default)(DOMWrap); function DOMWrap() { var _this; (0, _classCallCheck2.default)(this, DOMWrap); _this = _super.apply(this, arguments); _this.resizeObserver = null; _this.mutationObserver = null; // original scroll size of the list _this.originalTotalWidth = 0; // copy of overflowed items _this.overflowedItems = []; // cache item of the original items (so we can track the size and order) _this.menuItemSizes = []; _this.cancelFrameId = null; _this.state = { lastVisibleIndex: undefined }; // get all valid menuItem nodes _this.getMenuItemNodes = function () { var prefixCls = _this.props.prefixCls; var ul = ReactDOM.findDOMNode((0, _assertThisInitialized2.default)(_this)); if (!ul) { return []; } // filter out all overflowed indicator placeholder return [].slice.call(ul.children).filter(function (node) { return node.className.split(' ').indexOf("".concat(prefixCls, "-overflowed-submenu")) < 0; }); }; _this.getOverflowedSubMenuItem = function (keyPrefix, overflowedItems, renderPlaceholder) { var _this$props = _this.props, overflowedIndicator = _this$props.overflowedIndicator, level = _this$props.level, mode = _this$props.mode, prefixCls = _this$props.prefixCls, theme = _this$props.theme; if (level !== 1 || mode !== 'horizontal') { return null; } // put all the overflowed item inside a submenu // with a title of overflow indicator ('...') var copy = _this.props.children[0]; var _copy$props = copy.props, throwAway = _copy$props.children, title = _copy$props.title, propStyle = _copy$props.style, rest = (0, _objectWithoutProperties2.default)(_copy$props, ["children", "title", "style"]); var style = (0, _objectSpread2.default)({}, propStyle); var key = "".concat(keyPrefix, "-overflowed-indicator"); var eventKey = "".concat(keyPrefix, "-overflowed-indicator"); if (overflowedItems.length === 0 && renderPlaceholder !== true) { style = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), {}, { display: 'none' }); } else if (renderPlaceholder) { style = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), {}, { visibility: 'hidden', // prevent from taking normal dom space position: 'absolute' }); key = "".concat(key, "-placeholder"); eventKey = "".concat(eventKey, "-placeholder"); } var popupClassName = theme ? "".concat(prefixCls, "-").concat(theme) : ''; var props = {}; _util.menuAllProps.forEach(function (k) { if (rest[k] !== undefined) { props[k] = rest[k]; } }); return React.createElement(_SubMenu.default, Object.assign({ title: overflowedIndicator, className: "".concat(prefixCls, "-overflowed-submenu"), popupClassName: popupClassName }, props, { key: key, eventKey: eventKey, disabled: false, style: style }), overflowedItems); }; // memorize rendered menuSize _this.setChildrenWidthAndResize = function () { if (_this.props.mode !== 'horizontal') { return; } var ul = ReactDOM.findDOMNode((0, _assertThisInitialized2.default)(_this)); if (!ul) { return; } var ulChildrenNodes = ul.children; if (!ulChildrenNodes || ulChildrenNodes.length === 0) { return; } var lastOverflowedIndicatorPlaceholder = ul.children[ulChildrenNodes.length - 1]; // need last overflowed indicator for calculating length; (0, _util.setStyle)(lastOverflowedIndicatorPlaceholder, 'display', 'inline-block'); var menuItemNodes = _this.getMenuItemNodes(); // reset display attribute for all hidden elements caused by overflow to calculate updated width // and then reset to original state after width calculation var overflowedItems = menuItemNodes.filter(function (c) { return c.className.split(' ').indexOf(MENUITEM_OVERFLOWED_CLASSNAME) >= 0; }); overflowedItems.forEach(function (c) { (0, _util.setStyle)(c, 'display', 'inline-block'); }); _this.menuItemSizes = menuItemNodes.map(function (c) { return (0, _util.getWidth)(c, true); }); overflowedItems.forEach(function (c) { (0, _util.setStyle)(c, 'display', 'none'); }); _this.overflowedIndicatorWidth = (0, _util.getWidth)(ul.children[ul.children.length - 1], true); _this.originalTotalWidth = _this.menuItemSizes.reduce(function (acc, cur) { return acc + cur; }, 0); _this.handleResize(); // prevent the overflowed indicator from taking space; (0, _util.setStyle)(lastOverflowedIndicatorPlaceholder, 'display', 'none'); }; _this.handleResize = function () { if (_this.props.mode !== 'horizontal') { return; } var ul = ReactDOM.findDOMNode((0, _assertThisInitialized2.default)(_this)); if (!ul) { return; } var width = (0, _util.getWidth)(ul); _this.overflowedItems = []; var currentSumWidth = 0; // index for last visible child in horizontal mode var lastVisibleIndex; // float number comparison could be problematic // e.g. 0.1 + 0.2 > 0.3 =====> true // thus using FLOAT_PRECISION_ADJUST as buffer to help the situation if (_this.originalTotalWidth > width + FLOAT_PRECISION_ADJUST) { lastVisibleIndex = -1; _this.menuItemSizes.forEach(function (liWidth) { currentSumWidth += liWidth; if (currentSumWidth + _this.overflowedIndicatorWidth <= width) { lastVisibleIndex += 1; } }); } _this.setState({ lastVisibleIndex: lastVisibleIndex }); }; return _this; } (0, _createClass2.default)(DOMWrap, [{ key: "componentDidMount", value: function componentDidMount() { var _this2 = this; this.setChildrenWidthAndResize(); if (this.props.level === 1 && this.props.mode === 'horizontal') { var menuUl = ReactDOM.findDOMNode(this); if (!menuUl) { return; } this.resizeObserver = new _resizeObserverPolyfill.default(function (entries) { entries.forEach(function () { var cancelFrameId = _this2.cancelFrameId; cancelAnimationFrame(cancelFrameId); _this2.cancelFrameId = requestAnimationFrame(_this2.setChildrenWidthAndResize); }); }); [].slice.call(menuUl.children).concat(menuUl).forEach(function (el) { _this2.resizeObserver.observe(el); }); if (typeof MutationObserver !== 'undefined') { this.mutationObserver = new MutationObserver(function () { _this2.resizeObserver.disconnect(); [].slice.call(menuUl.children).concat(menuUl).forEach(function (el) { _this2.resizeObserver.observe(el); }); _this2.setChildrenWidthAndResize(); }); this.mutationObserver.observe(menuUl, { attributes: false, childList: true, subTree: false }); } } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.resizeObserver) { this.resizeObserver.disconnect(); } if (this.mutationObserver) { this.mutationObserver.disconnect(); } cancelAnimationFrame(this.cancelFrameId); } }, { key: "renderChildren", value: function renderChildren(children) { var _this3 = this; // need to take care of overflowed items in horizontal mode var lastVisibleIndex = this.state.lastVisibleIndex; return (children || []).reduce(function (acc, childNode, index) { var item = childNode; if (_this3.props.mode === 'horizontal') { var overflowed = _this3.getOverflowedSubMenuItem(childNode.props.eventKey, []); if (lastVisibleIndex !== undefined && _this3.props.className.indexOf("".concat(_this3.props.prefixCls, "-root")) !== -1) { if (index > lastVisibleIndex) { item = React.cloneElement(childNode, // 这里修改 eventKey 是为了防止隐藏状态下还会触发 openkeys 事件 { style: { display: 'none' }, eventKey: "".concat(childNode.props.eventKey, "-hidden"), /** * Legacy code. Here `className` never used: * https://github.com/react-component/menu/commit/4cd6b49fce9d116726f4ea00dda85325d6f26500#diff-e2fa48f75c2dd2318295cde428556a76R240 */ className: "".concat(MENUITEM_OVERFLOWED_CLASSNAME) }); } if (index === lastVisibleIndex + 1) { _this3.overflowedItems = children.slice(lastVisibleIndex + 1).map(function (c) { return React.cloneElement(c, // children[index].key will become '.$key' in clone by default, // we have to overwrite with the correct key explicitly { key: c.props.eventKey, mode: 'vertical-left' }); }); overflowed = _this3.getOverflowedSubMenuItem(childNode.props.eventKey, _this3.overflowedItems); } } var ret = [].concat((0, _toConsumableArray2.default)(acc), [overflowed, item]); if (index === children.length - 1) { // need a placeholder for calculating overflowed indicator width ret.push(_this3.getOverflowedSubMenuItem(childNode.props.eventKey, [], true)); } return ret; } return [].concat((0, _toConsumableArray2.default)(acc), [item]); }, []); } }, { key: "render", value: function render() { var _this$props2 = this.props, visible = _this$props2.visible, prefixCls = _this$props2.prefixCls, overflowedIndicator = _this$props2.overflowedIndicator, mode = _this$props2.mode, level = _this$props2.level, tag = _this$props2.tag, children = _this$props2.children, theme = _this$props2.theme, rest = (0, _objectWithoutProperties2.default)(_this$props2, ["visible", "prefixCls", "overflowedIndicator", "mode", "level", "tag", "children", "theme"]); var Tag = tag; return React.createElement(Tag, Object.assign({}, rest), this.renderChildren(children)); } }]); return DOMWrap; }(React.Component); DOMWrap.defaultProps = { tag: 'div', className: '' }; var _default = DOMWrap; exports.default = _default; },{"./SubMenu":645,"./util":649,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/toConsumableArray":207,"react":"react","react-dom":"react-dom","resize-observer-polyfill":899}],641:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var Divider = function Divider(_ref) { var className = _ref.className, rootPrefixCls = _ref.rootPrefixCls, style = _ref.style; return React.createElement("li", { className: "".concat(className, " ").concat(rootPrefixCls, "-item-divider"), style: style }); }; Divider.defaultProps = { // To fix keyboard UX. disabled: true, className: '', style: {} }; var _default = Divider; exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],642:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _miniStore = require("mini-store"); var _omit = _interopRequireDefault(require("omit.js")); var _SubPopupMenu = _interopRequireWildcard(require("./SubPopupMenu")); var _util = require("./util"); var _legacyUtil = require("./utils/legacyUtil"); var Menu = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Menu, _React$Component); var _super = (0, _createSuper2.default)(Menu); function Menu(props) { var _this; (0, _classCallCheck2.default)(this, Menu); _this = _super.call(this, props); _this.inlineOpenKeys = []; _this.onSelect = function (selectInfo) { var _assertThisInitialize = (0, _assertThisInitialized2.default)(_this), props = _assertThisInitialize.props; if (props.selectable) { // root menu var _this$store$getState = _this.store.getState(), _selectedKeys = _this$store$getState.selectedKeys; var selectedKey = selectInfo.key; if (props.multiple) { _selectedKeys = _selectedKeys.concat([selectedKey]); } else { _selectedKeys = [selectedKey]; } if (!('selectedKeys' in props)) { _this.store.setState({ selectedKeys: _selectedKeys }); } props.onSelect((0, _objectSpread2.default)((0, _objectSpread2.default)({}, selectInfo), {}, { selectedKeys: _selectedKeys })); } }; _this.onClick = function (e) { var mode = _this.getRealMenuMode(); var _assertThisInitialize2 = (0, _assertThisInitialized2.default)(_this), store = _assertThisInitialize2.store, onOpenChange = _assertThisInitialize2.props.onOpenChange; if (mode !== 'inline' && !('openKeys' in _this.props)) { // closing vertical popup submenu after click it store.setState({ openKeys: [] }); onOpenChange([]); } _this.props.onClick(e); }; // onKeyDown needs to be exposed as a instance method // e.g., in rc-select, we need to navigate menu item while // current active item is rc-select input box rather than the menu itself _this.onKeyDown = function (e, callback) { _this.innerMenu.getWrappedInstance().onKeyDown(e, callback); }; _this.onOpenChange = function (event) { var _assertThisInitialize3 = (0, _assertThisInitialized2.default)(_this), props = _assertThisInitialize3.props; var openKeys = _this.store.getState().openKeys.concat(); var changed = false; var processSingle = function processSingle(e) { var oneChanged = false; if (e.open) { oneChanged = openKeys.indexOf(e.key) === -1; if (oneChanged) { openKeys.push(e.key); } } else { var index = openKeys.indexOf(e.key); oneChanged = index !== -1; if (oneChanged) { openKeys.splice(index, 1); } } changed = changed || oneChanged; }; if (Array.isArray(event)) { // batch change call event.forEach(processSingle); } else { processSingle(event); } if (changed) { if (!('openKeys' in _this.props)) { _this.store.setState({ openKeys: openKeys }); } props.onOpenChange(openKeys); } }; _this.onDeselect = function (selectInfo) { var _assertThisInitialize4 = (0, _assertThisInitialized2.default)(_this), props = _assertThisInitialize4.props; if (props.selectable) { var _selectedKeys2 = _this.store.getState().selectedKeys.concat(); var selectedKey = selectInfo.key; var index = _selectedKeys2.indexOf(selectedKey); if (index !== -1) { _selectedKeys2.splice(index, 1); } if (!('selectedKeys' in props)) { _this.store.setState({ selectedKeys: _selectedKeys2 }); } props.onDeselect((0, _objectSpread2.default)((0, _objectSpread2.default)({}, selectInfo), {}, { selectedKeys: _selectedKeys2 })); } }; // Restore vertical mode when menu is collapsed responsively when mounted // https://github.com/ant-design/ant-design/issues/13104 // TODO: not a perfect solution, // looking a new way to avoid setting switchingModeFromInline in this situation _this.onMouseEnter = function (e) { _this.restoreModeVerticalFromInline(); var onMouseEnter = _this.props.onMouseEnter; if (onMouseEnter) { onMouseEnter(e); } }; _this.onTransitionEnd = function (e) { // when inlineCollapsed menu width animation finished // https://github.com/ant-design/ant-design/issues/12864 var widthCollapsed = e.propertyName === 'width' && e.target === e.currentTarget; // Fix SVGElement e.target.className.indexOf is not a function // https://github.com/ant-design/ant-design/issues/15699 var className = e.target.className; // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, // unless during an animation. var classNameValue = Object.prototype.toString.call(className) === '[object SVGAnimatedString]' ? className.animVal : className; // Fix for , // the width transition won't trigger when menu is collapsed // https://github.com/ant-design/ant-design-pro/issues/2783 var iconScaled = e.propertyName === 'font-size' && classNameValue.indexOf('anticon') >= 0; if (widthCollapsed || iconScaled) { _this.restoreModeVerticalFromInline(); } }; _this.setInnerMenu = function (node) { _this.innerMenu = node; }; _this.isRootMenu = true; var selectedKeys = props.defaultSelectedKeys; var openKeys = props.defaultOpenKeys; if ('selectedKeys' in props) { selectedKeys = props.selectedKeys || []; } if ('openKeys' in props) { openKeys = props.openKeys || []; } _this.store = (0, _miniStore.create)({ selectedKeys: selectedKeys, openKeys: openKeys, activeKey: { '0-menu-': (0, _SubPopupMenu.getActiveKey)(props, props.activeKey) } }); _this.state = { switchingModeFromInline: false }; return _this; } (0, _createClass2.default)(Menu, [{ key: "componentDidMount", value: function componentDidMount() { this.updateMiniStore(); this.updateMenuDisplay(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { this.updateOpentKeysWhenSwitchMode(prevProps); this.updateMiniStore(); var _this$props = this.props, siderCollapsed = _this$props.siderCollapsed, inlineCollapsed = _this$props.inlineCollapsed, onOpenChange = _this$props.onOpenChange; if (!prevProps.inlineCollapsed && inlineCollapsed || !prevProps.siderCollapsed && siderCollapsed) { onOpenChange([]); } this.updateMenuDisplay(); } }, { key: "updateOpentKeysWhenSwitchMode", value: function updateOpentKeysWhenSwitchMode(prevProps) { var nextProps = this.props, store = this.store, inlineOpenKeys = this.inlineOpenKeys; var prevState = store.getState(); var newState = {}; if (prevProps.mode === 'inline' && nextProps.mode !== 'inline') { this.setState({ switchingModeFromInline: true }); } if (!('openKeys' in nextProps)) { // [Legacy] Old code will return after `openKeys` changed. // Not sure the reason, we should keep this logic still. if (nextProps.inlineCollapsed && !prevProps.inlineCollapsed || nextProps.siderCollapsed && !prevProps.siderCollapsed) { this.setState({ switchingModeFromInline: true }); this.inlineOpenKeys = prevState.openKeys.concat(); newState.openKeys = []; } if (!nextProps.inlineCollapsed && prevProps.inlineCollapsed || !nextProps.siderCollapsed && prevProps.siderCollapsed) { newState.openKeys = inlineOpenKeys; this.inlineOpenKeys = []; } } if (Object.keys(newState).length) { store.setState(newState); } } }, { key: "updateMenuDisplay", value: function updateMenuDisplay() { var collapsedWidth = this.props.collapsedWidth, store = this.store, prevOpenKeys = this.prevOpenKeys; // https://github.com/ant-design/ant-design/issues/8587 var hideMenu = this.getInlineCollapsed() && (collapsedWidth === 0 || collapsedWidth === '0' || collapsedWidth === '0px'); if (hideMenu) { this.prevOpenKeys = store.getState().openKeys.concat(); this.store.setState({ openKeys: [] }); } else if (prevOpenKeys) { this.store.setState({ openKeys: prevOpenKeys }); this.prevOpenKeys = null; } } }, { key: "getRealMenuMode", value: function getRealMenuMode() { var mode = this.props.mode; var switchingModeFromInline = this.state.switchingModeFromInline; var inlineCollapsed = this.getInlineCollapsed(); if (switchingModeFromInline && inlineCollapsed) { return 'inline'; } return inlineCollapsed ? 'vertical' : mode; } }, { key: "getInlineCollapsed", value: function getInlineCollapsed() { var _this$props2 = this.props, inlineCollapsed = _this$props2.inlineCollapsed, siderCollapsed = _this$props2.siderCollapsed; if (siderCollapsed !== undefined) { return siderCollapsed; } return inlineCollapsed; } }, { key: "restoreModeVerticalFromInline", value: function restoreModeVerticalFromInline() { var switchingModeFromInline = this.state.switchingModeFromInline; if (switchingModeFromInline) { this.setState({ switchingModeFromInline: false }); } } }, { key: "updateMiniStore", value: function updateMiniStore() { if ('selectedKeys' in this.props) { this.store.setState({ selectedKeys: this.props.selectedKeys || [] }); } if ('openKeys' in this.props) { this.store.setState({ openKeys: this.props.openKeys || [] }); } } }, { key: "render", value: function render() { var props = (0, _objectSpread2.default)({}, (0, _omit.default)(this.props, ['collapsedWidth', 'siderCollapsed', 'defaultMotions'])); var mode = this.getRealMenuMode(); props.className += " ".concat(props.prefixCls, "-root"); if (props.direction === 'rtl') { props.className += " ".concat(props.prefixCls, "-rtl"); } props = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, { mode: mode, onClick: this.onClick, onOpenChange: this.onOpenChange, onDeselect: this.onDeselect, onSelect: this.onSelect, onMouseEnter: this.onMouseEnter, onTransitionEnd: this.onTransitionEnd, parentMenu: this, motion: (0, _legacyUtil.getMotion)(this.props, this.state, mode) }); delete props.openAnimation; delete props.openTransitionName; return React.createElement(_miniStore.Provider, { store: this.store }, React.createElement(_SubPopupMenu.default, Object.assign({}, props, { ref: this.setInnerMenu }), this.props.children)); } }]); return Menu; }(React.Component); Menu.defaultProps = { selectable: true, onClick: _util.noop, onSelect: _util.noop, onOpenChange: _util.noop, onDeselect: _util.noop, defaultSelectedKeys: [], defaultOpenKeys: [], subMenuOpenDelay: 0.1, subMenuCloseDelay: 0.1, triggerSubMenuAction: 'hover', prefixCls: 'rc-menu', className: '', mode: 'vertical', style: {}, builtinPlacements: {}, overflowedIndicator: React.createElement("span", null, "\xB7\xB7\xB7") }; var _default = Menu; exports.default = _default; },{"./SubPopupMenu":646,"./util":649,"./utils/legacyUtil":651,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"mini-store":577,"omit.js":579,"react":"react"}],643:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.MenuItem = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("omit.js")); var _miniStore = require("mini-store"); var _util = require("./util"); var MenuItem = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(MenuItem, _React$Component); var _super = (0, _createSuper2.default)(MenuItem); function MenuItem() { var _this; (0, _classCallCheck2.default)(this, MenuItem); _this = _super.apply(this, arguments); _this.onKeyDown = function (e) { var keyCode = e.keyCode; if (keyCode === _KeyCode.default.ENTER) { _this.onClick(e); return true; } return undefined; }; _this.onMouseLeave = function (e) { var _this$props = _this.props, eventKey = _this$props.eventKey, onItemHover = _this$props.onItemHover, onMouseLeave = _this$props.onMouseLeave; onItemHover({ key: eventKey, hover: false }); onMouseLeave({ key: eventKey, domEvent: e }); }; _this.onMouseEnter = function (e) { var _this$props2 = _this.props, eventKey = _this$props2.eventKey, onItemHover = _this$props2.onItemHover, onMouseEnter = _this$props2.onMouseEnter; onItemHover({ key: eventKey, hover: true }); onMouseEnter({ key: eventKey, domEvent: e }); }; _this.onClick = function (e) { var _this$props3 = _this.props, eventKey = _this$props3.eventKey, multiple = _this$props3.multiple, onClick = _this$props3.onClick, onSelect = _this$props3.onSelect, onDeselect = _this$props3.onDeselect, isSelected = _this$props3.isSelected; var info = { key: eventKey, keyPath: [eventKey], item: (0, _assertThisInitialized2.default)(_this), domEvent: e }; onClick(info); if (multiple) { if (isSelected) { onDeselect(info); } else { onSelect(info); } } else if (!isSelected) { onSelect(info); } }; _this.saveNode = function (node) { _this.node = node; }; return _this; } (0, _createClass2.default)(MenuItem, [{ key: "componentDidMount", value: function componentDidMount() { // invoke customized ref to expose component to mixin this.callRef(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.callRef(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var props = this.props; if (props.onDestroy) { props.onDestroy(props.eventKey); } } }, { key: "getPrefixCls", value: function getPrefixCls() { return "".concat(this.props.rootPrefixCls, "-item"); } }, { key: "getActiveClassName", value: function getActiveClassName() { return "".concat(this.getPrefixCls(), "-active"); } }, { key: "getSelectedClassName", value: function getSelectedClassName() { return "".concat(this.getPrefixCls(), "-selected"); } }, { key: "getDisabledClassName", value: function getDisabledClassName() { return "".concat(this.getPrefixCls(), "-disabled"); } }, { key: "callRef", value: function callRef() { if (this.props.manualRef) { this.props.manualRef(this); } } }, { key: "render", value: function render() { var _classNames; var props = (0, _objectSpread2.default)({}, this.props); var className = (0, _classnames.default)(this.getPrefixCls(), props.className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, this.getActiveClassName(), !props.disabled && props.active), (0, _defineProperty2.default)(_classNames, this.getSelectedClassName(), props.isSelected), (0, _defineProperty2.default)(_classNames, this.getDisabledClassName(), props.disabled), _classNames)); var attrs = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props.attribute), {}, { title: typeof props.title === 'string' ? props.title : undefined, className: className, // set to menuitem by default role: props.role || 'menuitem', 'aria-disabled': props.disabled }); if (props.role === 'option') { // overwrite to option attrs = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, { role: 'option', 'aria-selected': props.isSelected }); } else if (props.role === null || props.role === 'none') { // sometimes we want to specify role inside
  • element //
  • Link
  • would be a good example // in this case the role on
  • should be "none" to // remove the implied listitem role. // https://www.w3.org/TR/wai-aria-practices-1.1/examples/menubar/menubar-1/menubar-1.html attrs.role = 'none'; } // In case that onClick/onMouseLeave/onMouseEnter is passed down from owner var mouseEvent = { onClick: props.disabled ? null : this.onClick, onMouseLeave: props.disabled ? null : this.onMouseLeave, onMouseEnter: props.disabled ? null : this.onMouseEnter }; var style = (0, _objectSpread2.default)({}, props.style); if (props.mode === 'inline') { if (props.direction === 'rtl') { style.paddingRight = props.inlineIndent * props.level; } else { style.paddingLeft = props.inlineIndent * props.level; } } _util.menuAllProps.forEach(function (key) { return delete props[key]; }); delete props.direction; var icon = this.props.itemIcon; if (typeof this.props.itemIcon === 'function') { // TODO: This is a bug which should fixed after TS refactor icon = React.createElement(this.props.itemIcon, this.props); } return React.createElement("li", Object.assign({}, (0, _omit.default)(props, ['onClick', 'onMouseEnter', 'onMouseLeave', 'onSelect']), attrs, mouseEvent, { style: style, ref: this.saveNode }), props.children, icon); } }]); return MenuItem; }(React.Component); exports.MenuItem = MenuItem; MenuItem.isMenuItem = true; MenuItem.defaultProps = { onSelect: _util.noop, onMouseEnter: _util.noop, onMouseLeave: _util.noop, manualRef: _util.noop }; var connected = (0, _miniStore.connect)(function (_ref, _ref2) { var activeKey = _ref.activeKey, selectedKeys = _ref.selectedKeys; var eventKey = _ref2.eventKey, subMenuKey = _ref2.subMenuKey; return { active: activeKey[subMenuKey] === eventKey, isSelected: selectedKeys.indexOf(eventKey) !== -1 }; })(MenuItem); var _default = connected; exports.default = _default; },{"./util":649,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"mini-store":577,"omit.js":579,"rc-util/lib/KeyCode":865,"react":"react"}],644:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _util = require("./util"); var MenuItemGroup = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(MenuItemGroup, _React$Component); var _super = (0, _createSuper2.default)(MenuItemGroup); function MenuItemGroup() { var _this; (0, _classCallCheck2.default)(this, MenuItemGroup); _this = _super.apply(this, arguments); _this.renderInnerMenuItem = function (item) { var _this$props = _this.props, renderMenuItem = _this$props.renderMenuItem, index = _this$props.index; return renderMenuItem(item, index, _this.props.subMenuKey); }; return _this; } (0, _createClass2.default)(MenuItemGroup, [{ key: "render", value: function render() { var props = (0, _extends2.default)({}, this.props); var _props$className = props.className, className = _props$className === void 0 ? '' : _props$className, rootPrefixCls = props.rootPrefixCls; var titleClassName = "".concat(rootPrefixCls, "-item-group-title"); var listClassName = "".concat(rootPrefixCls, "-item-group-list"); var title = props.title, children = props.children; _util.menuAllProps.forEach(function (key) { return delete props[key]; }); // Set onClick to null, to ignore propagated onClick event delete props.onClick; delete props.direction; return React.createElement("li", Object.assign({}, props, { className: "".concat(className, " ").concat(rootPrefixCls, "-item-group") }), React.createElement("div", { className: titleClassName, title: typeof title === 'string' ? title : undefined }, title), React.createElement("ul", { className: listClassName }, React.Children.map(children, this.renderInnerMenuItem))); } }]); return MenuItemGroup; }(React.Component); MenuItemGroup.isMenuItemGroup = true; MenuItemGroup.defaultProps = { disabled: true }; var _default = MenuItemGroup; exports.default = _default; },{"./util":649,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],645:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.SubMenu = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var ReactDOM = _interopRequireWildcard(require("react-dom")); var _rcTrigger = _interopRequireDefault(require("rc-trigger")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _rcMotion = _interopRequireDefault(require("rc-motion")); var _classnames = _interopRequireDefault(require("classnames")); var _miniStore = require("mini-store"); var _SubPopupMenu = _interopRequireDefault(require("./SubPopupMenu")); var _placements = require("./placements"); var _util = require("./util"); var guid = 0; var popupPlacementMap = { horizontal: 'bottomLeft', vertical: 'rightTop', 'vertical-left': 'rightTop', 'vertical-right': 'leftTop' }; var updateDefaultActiveFirst = function updateDefaultActiveFirst(store, eventKey, defaultActiveFirst) { var menuId = (0, _util.getMenuIdFromSubMenuEventKey)(eventKey); var state = store.getState(); store.setState({ defaultActiveFirst: (0, _objectSpread3.default)((0, _objectSpread3.default)({}, state.defaultActiveFirst), {}, (0, _defineProperty2.default)({}, menuId, defaultActiveFirst)) }); }; var SubMenu = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(SubMenu, _React$Component); var _super = (0, _createSuper2.default)(SubMenu); function SubMenu(props) { var _this; (0, _classCallCheck2.default)(this, SubMenu); _this = _super.call(this, props); _this.onDestroy = function (key) { _this.props.onDestroy(key); }; /** * note: * This legacy code that `onKeyDown` is called by parent instead of dom self. * which need return code to check if this event is handled */ _this.onKeyDown = function (e) { var keyCode = e.keyCode; var menu = _this.menuInstance; var _this$props = _this.props, isOpen = _this$props.isOpen, store = _this$props.store; if (keyCode === _KeyCode.default.ENTER) { _this.onTitleClick(e); updateDefaultActiveFirst(store, _this.props.eventKey, true); return true; } if (keyCode === _KeyCode.default.RIGHT) { if (isOpen) { menu.onKeyDown(e); } else { _this.triggerOpenChange(true); // need to update current menu's defaultActiveFirst value updateDefaultActiveFirst(store, _this.props.eventKey, true); } return true; } if (keyCode === _KeyCode.default.LEFT) { var handled; if (isOpen) { handled = menu.onKeyDown(e); } else { return undefined; } if (!handled) { _this.triggerOpenChange(false); handled = true; } return handled; } if (isOpen && (keyCode === _KeyCode.default.UP || keyCode === _KeyCode.default.DOWN)) { return menu.onKeyDown(e); } return undefined; }; _this.onOpenChange = function (e) { _this.props.onOpenChange(e); }; _this.onPopupVisibleChange = function (visible) { _this.triggerOpenChange(visible, visible ? 'mouseenter' : 'mouseleave'); }; _this.onMouseEnter = function (e) { var _this$props2 = _this.props, key = _this$props2.eventKey, onMouseEnter = _this$props2.onMouseEnter, store = _this$props2.store; updateDefaultActiveFirst(store, _this.props.eventKey, false); onMouseEnter({ key: key, domEvent: e }); }; _this.onMouseLeave = function (e) { var _this$props3 = _this.props, parentMenu = _this$props3.parentMenu, eventKey = _this$props3.eventKey, onMouseLeave = _this$props3.onMouseLeave; parentMenu.subMenuInstance = (0, _assertThisInitialized2.default)(_this); onMouseLeave({ key: eventKey, domEvent: e }); }; _this.onTitleMouseEnter = function (domEvent) { var _this$props4 = _this.props, key = _this$props4.eventKey, onItemHover = _this$props4.onItemHover, onTitleMouseEnter = _this$props4.onTitleMouseEnter; onItemHover({ key: key, hover: true }); onTitleMouseEnter({ key: key, domEvent: domEvent }); }; _this.onTitleMouseLeave = function (e) { var _this$props5 = _this.props, parentMenu = _this$props5.parentMenu, eventKey = _this$props5.eventKey, onItemHover = _this$props5.onItemHover, onTitleMouseLeave = _this$props5.onTitleMouseLeave; parentMenu.subMenuInstance = (0, _assertThisInitialized2.default)(_this); onItemHover({ key: eventKey, hover: false }); onTitleMouseLeave({ key: eventKey, domEvent: e }); }; _this.onTitleClick = function (e) { var _assertThisInitialize = (0, _assertThisInitialized2.default)(_this), props = _assertThisInitialize.props; props.onTitleClick({ key: props.eventKey, domEvent: e }); if (props.triggerSubMenuAction === 'hover') { return; } _this.triggerOpenChange(!props.isOpen, 'click'); updateDefaultActiveFirst(props.store, _this.props.eventKey, false); }; _this.onSubMenuClick = function (info) { // in the case of overflowed submenu // onClick is not copied over if (typeof _this.props.onClick === 'function') { _this.props.onClick(_this.addKeyPath(info)); } }; _this.onSelect = function (info) { _this.props.onSelect(info); }; _this.onDeselect = function (info) { _this.props.onDeselect(info); }; _this.getPrefixCls = function () { return "".concat(_this.props.rootPrefixCls, "-submenu"); }; _this.getActiveClassName = function () { return "".concat(_this.getPrefixCls(), "-active"); }; _this.getDisabledClassName = function () { return "".concat(_this.getPrefixCls(), "-disabled"); }; _this.getSelectedClassName = function () { return "".concat(_this.getPrefixCls(), "-selected"); }; _this.getOpenClassName = function () { return "".concat(_this.props.rootPrefixCls, "-submenu-open"); }; _this.saveMenuInstance = function (c) { // children menu instance _this.menuInstance = c; }; _this.addKeyPath = function (info) { return (0, _objectSpread3.default)((0, _objectSpread3.default)({}, info), {}, { keyPath: (info.keyPath || []).concat(_this.props.eventKey) }); }; _this.triggerOpenChange = function (open, type) { var key = _this.props.eventKey; var openChange = function openChange() { _this.onOpenChange({ key: key, item: (0, _assertThisInitialized2.default)(_this), trigger: type, open: open }); }; if (type === 'mouseenter') { // make sure mouseenter happen after other menu item's mouseleave _this.mouseenterTimeout = setTimeout(function () { openChange(); }, 0); } else { openChange(); } }; _this.isChildrenSelected = function () { var ret = { find: false }; (0, _util.loopMenuItemRecursively)(_this.props.children, _this.props.selectedKeys, ret); return ret.find; }; _this.isOpen = function () { return _this.props.openKeys.indexOf(_this.props.eventKey) !== -1; }; _this.adjustWidth = function () { /* istanbul ignore if */ if (!_this.subMenuTitle || !_this.menuInstance) { return; } var popupMenu = ReactDOM.findDOMNode(_this.menuInstance); if (popupMenu.offsetWidth >= _this.subMenuTitle.offsetWidth) { return; } /* istanbul ignore next */ popupMenu.style.minWidth = "".concat(_this.subMenuTitle.offsetWidth, "px"); }; _this.saveSubMenuTitle = function (subMenuTitle) { _this.subMenuTitle = subMenuTitle; }; _this.getBaseProps = function () { var _assertThisInitialize2 = (0, _assertThisInitialized2.default)(_this), props = _assertThisInitialize2.props; return { mode: props.mode === 'horizontal' ? 'vertical' : props.mode, visible: _this.props.isOpen, level: props.level + 1, inlineIndent: props.inlineIndent, focusable: false, onClick: _this.onSubMenuClick, onSelect: _this.onSelect, onDeselect: _this.onDeselect, onDestroy: _this.onDestroy, selectedKeys: props.selectedKeys, eventKey: "".concat(props.eventKey, "-menu-"), openKeys: props.openKeys, motion: props.motion, onOpenChange: _this.onOpenChange, subMenuOpenDelay: props.subMenuOpenDelay, parentMenu: (0, _assertThisInitialized2.default)(_this), subMenuCloseDelay: props.subMenuCloseDelay, forceSubMenuRender: props.forceSubMenuRender, triggerSubMenuAction: props.triggerSubMenuAction, builtinPlacements: props.builtinPlacements, defaultActiveFirst: props.store.getState().defaultActiveFirst[(0, _util.getMenuIdFromSubMenuEventKey)(props.eventKey)], multiple: props.multiple, prefixCls: props.rootPrefixCls, id: _this.internalMenuId, manualRef: _this.saveMenuInstance, itemIcon: props.itemIcon, expandIcon: props.expandIcon, direction: props.direction }; }; _this.getMotion = function (mode, visible) { var _assertThisInitialize3 = (0, _assertThisInitialized2.default)(_this), haveRendered = _assertThisInitialize3.haveRendered; var _this$props6 = _this.props, motion = _this$props6.motion, rootPrefixCls = _this$props6.rootPrefixCls; // don't show transition on first rendering (no animation for opened menu) // show appear transition if it's not visible (not sure why) // show appear transition if it's not inline mode var mergedMotion = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, motion), {}, { leavedClassName: "".concat(rootPrefixCls, "-hidden"), removeOnLeave: false, motionAppear: haveRendered || !visible || mode !== 'inline' }); return mergedMotion; }; var store = props.store, eventKey = props.eventKey; var _store$getState = store.getState(), defaultActiveFirst = _store$getState.defaultActiveFirst; _this.isRootMenu = false; var value = false; if (defaultActiveFirst) { value = defaultActiveFirst[eventKey]; } updateDefaultActiveFirst(store, eventKey, value); return _this; } (0, _createClass2.default)(SubMenu, [{ key: "componentDidMount", value: function componentDidMount() { this.componentDidUpdate(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { var _this2 = this; var _this$props7 = this.props, mode = _this$props7.mode, parentMenu = _this$props7.parentMenu, manualRef = _this$props7.manualRef, isOpen = _this$props7.isOpen; // invoke customized ref to expose component to mixin if (manualRef) { manualRef(this); } if (mode !== 'horizontal' || !(parentMenu === null || parentMenu === void 0 ? void 0 : parentMenu.isRootMenu) || !isOpen) { return; } this.minWidthTimeout = setTimeout(function () { return _this2.adjustWidth(); }, 0); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _this$props8 = this.props, onDestroy = _this$props8.onDestroy, eventKey = _this$props8.eventKey; if (onDestroy) { onDestroy(eventKey); } /* istanbul ignore if */ if (this.minWidthTimeout) { clearTimeout(this.minWidthTimeout); } /* istanbul ignore if */ if (this.mouseenterTimeout) { clearTimeout(this.mouseenterTimeout); } } }, { key: "renderChildren", value: function renderChildren(children) { var _this3 = this; var baseProps = this.getBaseProps(); // [Legacy] getMotion must be called before `haveRendered` var mergedMotion = this.getMotion(baseProps.mode, baseProps.visible); this.haveRendered = true; this.haveOpened = this.haveOpened || baseProps.visible || baseProps.forceSubMenuRender; // never rendered not planning to, don't render if (!this.haveOpened) { return React.createElement("div", null); } var direction = baseProps.direction; return React.createElement(_rcMotion.default, Object.assign({ visible: baseProps.visible }, mergedMotion), function (_ref) { var className = _ref.className, style = _ref.style; var mergedClassName = (0, _classnames.default)("".concat(baseProps.prefixCls, "-sub"), className, (0, _defineProperty2.default)({}, "".concat(baseProps.prefixCls, "-rtl"), direction === 'rtl')); return React.createElement(_SubPopupMenu.default, Object.assign({}, baseProps, { id: _this3.internalMenuId, className: mergedClassName, style: style }), children); }); } }, { key: "render", value: function render() { var _classNames2, _props$parentMenu; var props = (0, _objectSpread3.default)({}, this.props); var isOpen = props.isOpen; var prefixCls = this.getPrefixCls(); var isInlineMode = props.mode === 'inline'; var className = (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-").concat(props.mode), (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, props.className, !!props.className), (0, _defineProperty2.default)(_classNames2, this.getOpenClassName(), isOpen), (0, _defineProperty2.default)(_classNames2, this.getActiveClassName(), props.active || isOpen && !isInlineMode), (0, _defineProperty2.default)(_classNames2, this.getDisabledClassName(), props.disabled), (0, _defineProperty2.default)(_classNames2, this.getSelectedClassName(), this.isChildrenSelected()), _classNames2)); if (!this.internalMenuId) { if (props.eventKey) { this.internalMenuId = "".concat(props.eventKey, "$Menu"); } else { guid += 1; this.internalMenuId = "$__$".concat(guid, "$Menu"); } } var mouseEvents = {}; var titleClickEvents = {}; var titleMouseEvents = {}; if (!props.disabled) { mouseEvents = { onMouseLeave: this.onMouseLeave, onMouseEnter: this.onMouseEnter }; // only works in title, not outer li titleClickEvents = { onClick: this.onTitleClick }; titleMouseEvents = { onMouseEnter: this.onTitleMouseEnter, onMouseLeave: this.onTitleMouseLeave }; } var style = {}; var direction = props.direction; if (isInlineMode) { if (direction === 'rtl') { style.paddingRight = props.inlineIndent * props.level; } else { style.paddingLeft = props.inlineIndent * props.level; } } var ariaOwns = {}; // only set aria-owns when menu is open // otherwise it would be an invalid aria-owns value // since corresponding node cannot be found if (this.props.isOpen) { ariaOwns = { 'aria-owns': this.internalMenuId }; } // expand custom icon should NOT be displayed in menu with horizontal mode. var icon = null; if (props.mode !== 'horizontal') { icon = this.props.expandIcon; // ReactNode if (typeof this.props.expandIcon === 'function') { icon = React.createElement(this.props.expandIcon, (0, _objectSpread3.default)({}, this.props)); } } var title = React.createElement("div", Object.assign({ ref: this.saveSubMenuTitle, style: style, className: "".concat(prefixCls, "-title"), role: "button" }, titleMouseEvents, titleClickEvents, { "aria-expanded": isOpen }, ariaOwns, { "aria-haspopup": "true", title: typeof props.title === 'string' ? props.title : undefined }), props.title, icon || React.createElement("i", { className: "".concat(prefixCls, "-arrow") })); var children = this.renderChildren(props.children); var getPopupContainer = ((_props$parentMenu = props.parentMenu) === null || _props$parentMenu === void 0 ? void 0 : _props$parentMenu.isRootMenu) ? props.parentMenu.props.getPopupContainer : function (triggerNode) { return triggerNode.parentNode; }; var popupPlacement = popupPlacementMap[props.mode]; var popupAlign = props.popupOffset ? { offset: props.popupOffset } : {}; var popupClassName = props.mode === 'inline' ? '' : props.popupClassName; popupClassName += direction === 'rtl' ? " ".concat(prefixCls, "-rtl") : ''; var disabled = props.disabled, triggerSubMenuAction = props.triggerSubMenuAction, subMenuOpenDelay = props.subMenuOpenDelay, forceSubMenuRender = props.forceSubMenuRender, subMenuCloseDelay = props.subMenuCloseDelay, builtinPlacements = props.builtinPlacements; _util.menuAllProps.forEach(function (key) { return delete props[key]; }); // Set onClick to null, to ignore propagated onClick event delete props.onClick; var placement = direction === 'rtl' ? Object.assign({}, _placements.placementsRtl, builtinPlacements) : Object.assign({}, _placements.placements, builtinPlacements); delete props.direction; return React.createElement("li", Object.assign({}, props, mouseEvents, { className: className, role: "menuitem" }), isInlineMode && title, isInlineMode && children, !isInlineMode && React.createElement(_rcTrigger.default, { prefixCls: prefixCls, popupClassName: (0, _classnames.default)("".concat(prefixCls, "-popup"), popupClassName), getPopupContainer: getPopupContainer, builtinPlacements: placement, popupPlacement: popupPlacement, popupVisible: isOpen, popupAlign: popupAlign, popup: children, action: disabled ? [] : [triggerSubMenuAction], mouseEnterDelay: subMenuOpenDelay, mouseLeaveDelay: subMenuCloseDelay, onPopupVisibleChange: this.onPopupVisibleChange, forceRender: forceSubMenuRender }, title)); } }]); return SubMenu; }(React.Component); exports.SubMenu = SubMenu; SubMenu.defaultProps = { onMouseEnter: _util.noop, onMouseLeave: _util.noop, onTitleMouseEnter: _util.noop, onTitleMouseLeave: _util.noop, onTitleClick: _util.noop, manualRef: _util.noop, mode: 'vertical', title: '' }; var connected = (0, _miniStore.connect)(function (_ref2, _ref3) { var openKeys = _ref2.openKeys, activeKey = _ref2.activeKey, selectedKeys = _ref2.selectedKeys; var eventKey = _ref3.eventKey, subMenuKey = _ref3.subMenuKey; return { isOpen: openKeys.indexOf(eventKey) > -1, active: activeKey[subMenuKey] === eventKey, selectedKeys: selectedKeys }; })(SubMenu); connected.isSubMenu = true; var _default = connected; exports.default = _default; },{"./SubPopupMenu":646,"./placements":648,"./util":649,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"mini-store":577,"rc-motion":661,"rc-trigger":848,"rc-util/lib/KeyCode":865,"react":"react","react-dom":"react-dom"}],646:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getActiveKey = getActiveKey; exports.saveRef = saveRef; exports.default = exports.SubPopupMenu = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _miniStore = require("mini-store"); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _createChainedFunction = _interopRequireDefault(require("rc-util/lib/createChainedFunction")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _shallowequal = _interopRequireDefault(require("shallowequal")); var _classnames = _interopRequireDefault(require("classnames")); var _util = require("./util"); var _DOMWrap = _interopRequireDefault(require("./DOMWrap")); function allDisabled(arr) { if (!arr.length) { return true; } return arr.every(function (c) { return !!c.props.disabled; }); } function updateActiveKey(store, menuId, activeKey) { var state = store.getState(); store.setState({ activeKey: (0, _objectSpread4.default)((0, _objectSpread4.default)({}, state.activeKey), {}, (0, _defineProperty2.default)({}, menuId, activeKey)) }); } function getEventKey(props) { // when eventKey not available ,it's menu and return menu id '0-menu-' return props.eventKey || '0-menu-'; } function getActiveKey(props, originalActiveKey) { var activeKey = originalActiveKey; var children = props.children, eventKey = props.eventKey; if (activeKey) { var found; (0, _util.loopMenuItem)(children, function (c, i) { if (c && c.props && !c.props.disabled && activeKey === (0, _util.getKeyFromChildrenIndex)(c, eventKey, i)) { found = true; } }); if (found) { return activeKey; } } activeKey = null; if (props.defaultActiveFirst) { (0, _util.loopMenuItem)(children, function (c, i) { if (!activeKey && c && !c.props.disabled) { activeKey = (0, _util.getKeyFromChildrenIndex)(c, eventKey, i); } }); return activeKey; } return activeKey; } function saveRef(c) { if (c) { var index = this.instanceArray.indexOf(c); if (index !== -1) { // update component if it's already inside instanceArray this.instanceArray[index] = c; } else { // add component if it's not in instanceArray yet; this.instanceArray.push(c); } } } var SubPopupMenu = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(SubPopupMenu, _React$Component); var _super = (0, _createSuper2.default)(SubPopupMenu); function SubPopupMenu(props) { var _this; (0, _classCallCheck2.default)(this, SubPopupMenu); _this = _super.call(this, props); /** * all keyboard events callbacks run from here at first * * note: * This legacy code that `onKeyDown` is called by parent instead of dom self. * which need return code to check if this event is handled */ _this.onKeyDown = function (e, callback) { var keyCode = e.keyCode; var handled; _this.getFlatInstanceArray().forEach(function (obj) { if (obj && obj.props.active && obj.onKeyDown) { handled = obj.onKeyDown(e); } }); if (handled) { return 1; } var activeItem = null; if (keyCode === _KeyCode.default.UP || keyCode === _KeyCode.default.DOWN) { activeItem = _this.step(keyCode === _KeyCode.default.UP ? -1 : 1); } if (activeItem) { e.preventDefault(); updateActiveKey(_this.props.store, getEventKey(_this.props), activeItem.props.eventKey); if (typeof callback === 'function') { callback(activeItem); } return 1; } return undefined; }; _this.onItemHover = function (e) { var key = e.key, hover = e.hover; updateActiveKey(_this.props.store, getEventKey(_this.props), hover ? key : null); }; _this.onDeselect = function (selectInfo) { _this.props.onDeselect(selectInfo); }; _this.onSelect = function (selectInfo) { _this.props.onSelect(selectInfo); }; _this.onClick = function (e) { _this.props.onClick(e); }; _this.onOpenChange = function (e) { _this.props.onOpenChange(e); }; _this.onDestroy = function (key) { /* istanbul ignore next */ _this.props.onDestroy(key); }; _this.getFlatInstanceArray = function () { return _this.instanceArray; }; _this.step = function (direction) { var children = _this.getFlatInstanceArray(); var activeKey = _this.props.store.getState().activeKey[getEventKey(_this.props)]; var len = children.length; if (!len) { return null; } if (direction < 0) { children = children.concat().reverse(); } // find current activeIndex var activeIndex = -1; children.every(function (c, ci) { if (c && c.props.eventKey === activeKey) { activeIndex = ci; return false; } return true; }); if (!_this.props.defaultActiveFirst && activeIndex !== -1 && allDisabled(children.slice(activeIndex, len - 1))) { return undefined; } var start = (activeIndex + 1) % len; var i = start; do { var child = children[i]; if (!child || child.props.disabled) { i = (i + 1) % len; } else { return child; } } while (i !== start); return null; }; _this.renderCommonMenuItem = function (child, i, extraProps) { var state = _this.props.store.getState(); var _assertThisInitialize = (0, _assertThisInitialized2.default)(_this), props = _assertThisInitialize.props; var key = (0, _util.getKeyFromChildrenIndex)(child, props.eventKey, i); var childProps = child.props; // https://github.com/ant-design/ant-design/issues/11517#issuecomment-477403055 if (!childProps || typeof child.type === 'string') { return child; } var isActive = key === state.activeKey; var newChildProps = (0, _objectSpread4.default)((0, _objectSpread4.default)({ mode: childProps.mode || props.mode, level: props.level, inlineIndent: props.inlineIndent, renderMenuItem: _this.renderMenuItem, rootPrefixCls: props.prefixCls, index: i, parentMenu: props.parentMenu, // customized ref function, need to be invoked manually in child's componentDidMount manualRef: childProps.disabled ? undefined : (0, _createChainedFunction.default)(child.ref, saveRef.bind((0, _assertThisInitialized2.default)(_this))), eventKey: key, active: !childProps.disabled && isActive, multiple: props.multiple, onClick: function onClick(e) { (childProps.onClick || _util.noop)(e); _this.onClick(e); }, onItemHover: _this.onItemHover, motion: props.motion, subMenuOpenDelay: props.subMenuOpenDelay, subMenuCloseDelay: props.subMenuCloseDelay, forceSubMenuRender: props.forceSubMenuRender, onOpenChange: _this.onOpenChange, onDeselect: _this.onDeselect, onSelect: _this.onSelect, builtinPlacements: props.builtinPlacements, itemIcon: childProps.itemIcon || _this.props.itemIcon, expandIcon: childProps.expandIcon || _this.props.expandIcon }, extraProps), {}, { direction: props.direction }); // ref: https://github.com/ant-design/ant-design/issues/13943 if (props.mode === 'inline' || (0, _util.isMobileDevice)()) { newChildProps.triggerSubMenuAction = 'click'; } return React.cloneElement(child, (0, _objectSpread4.default)((0, _objectSpread4.default)({}, newChildProps), {}, { key: key || i })); }; _this.renderMenuItem = function (c, i, subMenuKey) { /* istanbul ignore if */ if (!c) { return null; } var state = _this.props.store.getState(); var extraProps = { openKeys: state.openKeys, selectedKeys: state.selectedKeys, triggerSubMenuAction: _this.props.triggerSubMenuAction, subMenuKey: subMenuKey }; return _this.renderCommonMenuItem(c, i, extraProps); }; props.store.setState({ activeKey: (0, _objectSpread4.default)((0, _objectSpread4.default)({}, props.store.getState().activeKey), {}, (0, _defineProperty2.default)({}, props.eventKey, getActiveKey(props, props.activeKey))) }); _this.instanceArray = []; return _this; } (0, _createClass2.default)(SubPopupMenu, [{ key: "componentDidMount", value: function componentDidMount() { // invoke customized ref to expose component to mixin if (this.props.manualRef) { this.props.manualRef(this); } } }, { key: "shouldComponentUpdate", value: function shouldComponentUpdate(nextProps) { return this.props.visible || nextProps.visible || this.props.className !== nextProps.className || !(0, _shallowequal.default)(this.props.style, nextProps.style); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var props = this.props; var originalActiveKey = 'activeKey' in props ? props.activeKey : props.store.getState().activeKey[getEventKey(props)]; var activeKey = getActiveKey(props, originalActiveKey); if (activeKey !== originalActiveKey) { updateActiveKey(props.store, getEventKey(props), activeKey); } else if ('activeKey' in prevProps) { // If prev activeKey is not same as current activeKey, // we should set it. var prevActiveKey = getActiveKey(prevProps, prevProps.activeKey); if (activeKey !== prevActiveKey) { updateActiveKey(props.store, getEventKey(props), activeKey); } } } }, { key: "render", value: function render() { var _this2 = this; var props = (0, _extends2.default)({}, this.props); this.instanceArray = []; var className = (0, _classnames.default)(props.prefixCls, props.className, "".concat(props.prefixCls, "-").concat(props.mode)); var domProps = { className: className, // role could be 'select' and by default set to menu role: props.role || 'menu' }; if (props.id) { domProps.id = props.id; } if (props.focusable) { domProps.tabIndex = 0; domProps.onKeyDown = this.onKeyDown; } var prefixCls = props.prefixCls, eventKey = props.eventKey, visible = props.visible, level = props.level, mode = props.mode, overflowedIndicator = props.overflowedIndicator, theme = props.theme; _util.menuAllProps.forEach(function (key) { return delete props[key]; }); // Otherwise, the propagated click event will trigger another onClick delete props.onClick; return React.createElement(_DOMWrap.default, Object.assign({}, props, { prefixCls: prefixCls, mode: mode, tag: "ul", level: level, theme: theme, visible: visible, overflowedIndicator: overflowedIndicator }, domProps), (0, _toArray.default)(props.children).map(function (c, i) { return _this2.renderMenuItem(c, i, eventKey || '0-menu-'); })); } }]); return SubPopupMenu; }(React.Component); exports.SubPopupMenu = SubPopupMenu; SubPopupMenu.defaultProps = { prefixCls: 'rc-menu', className: '', mode: 'vertical', level: 1, inlineIndent: 24, visible: true, focusable: true, style: {}, manualRef: _util.noop }; var connected = (0, _miniStore.connect)()(SubPopupMenu); var _default = connected; exports.default = _default; },{"./DOMWrap":640,"./util":649,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"mini-store":577,"rc-util/lib/Children/toArray":858,"rc-util/lib/KeyCode":865,"rc-util/lib/createChainedFunction":868,"react":"react","shallowequal":901}],647:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "SubMenu", { enumerable: true, get: function get() { return _SubMenu.default; } }); Object.defineProperty(exports, "Item", { enumerable: true, get: function get() { return _MenuItem.default; } }); Object.defineProperty(exports, "MenuItem", { enumerable: true, get: function get() { return _MenuItem.default; } }); Object.defineProperty(exports, "MenuItemGroup", { enumerable: true, get: function get() { return _MenuItemGroup.default; } }); Object.defineProperty(exports, "ItemGroup", { enumerable: true, get: function get() { return _MenuItemGroup.default; } }); Object.defineProperty(exports, "Divider", { enumerable: true, get: function get() { return _Divider.default; } }); exports.default = void 0; var _Menu = _interopRequireDefault(require("./Menu")); var _SubMenu = _interopRequireDefault(require("./SubMenu")); var _MenuItem = _interopRequireDefault(require("./MenuItem")); var _MenuItemGroup = _interopRequireDefault(require("./MenuItemGroup")); var _Divider = _interopRequireDefault(require("./Divider")); var _default = _Menu.default; exports.default = _default; },{"./Divider":641,"./Menu":642,"./MenuItem":643,"./MenuItemGroup":644,"./SubMenu":645,"@babel/runtime/helpers/interopRequireDefault":192}],648:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.placementsRtl = exports.placements = void 0; var autoAdjustOverflow = { adjustX: 1, adjustY: 1 }; var placements = { topLeft: { points: ['bl', 'tl'], overflow: autoAdjustOverflow, offset: [0, -7] }, bottomLeft: { points: ['tl', 'bl'], overflow: autoAdjustOverflow, offset: [0, 7] }, leftTop: { points: ['tr', 'tl'], overflow: autoAdjustOverflow, offset: [-4, 0] }, rightTop: { points: ['tl', 'tr'], overflow: autoAdjustOverflow, offset: [4, 0] } }; exports.placements = placements; var placementsRtl = { topLeft: { points: ['bl', 'tl'], overflow: autoAdjustOverflow, offset: [0, -7] }, bottomLeft: { points: ['tl', 'bl'], overflow: autoAdjustOverflow, offset: [0, 7] }, rightTop: { points: ['tr', 'tl'], overflow: autoAdjustOverflow, offset: [-4, 0] }, leftTop: { points: ['tl', 'tr'], overflow: autoAdjustOverflow, offset: [4, 0] } }; exports.placementsRtl = placementsRtl; var _default = placements; exports.default = _default; },{}],649:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.noop = noop; exports.getKeyFromChildrenIndex = getKeyFromChildrenIndex; exports.getMenuIdFromSubMenuEventKey = getMenuIdFromSubMenuEventKey; exports.loopMenuItem = loopMenuItem; exports.loopMenuItemRecursively = loopMenuItemRecursively; exports.isMobileDevice = exports.setStyle = exports.getWidth = exports.menuAllProps = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _isMobile = _interopRequireDefault(require("./utils/isMobile")); function noop() {} function getKeyFromChildrenIndex(child, menuEventKey, index) { var prefix = menuEventKey || ''; return child.key || "".concat(prefix, "item_").concat(index); } function getMenuIdFromSubMenuEventKey(eventKey) { return "".concat(eventKey, "-menu-"); } function loopMenuItem(children, cb) { var index = -1; React.Children.forEach(children, function (c) { index += 1; if (c && c.type && c.type.isMenuItemGroup) { React.Children.forEach(c.props.children, function (c2) { index += 1; cb(c2, index); }); } else { cb(c, index); } }); } function loopMenuItemRecursively(children, keys, ret) { /* istanbul ignore if */ if (!children || ret.find) { return; } React.Children.forEach(children, function (c) { if (c) { var construct = c.type; if (!construct || !(construct.isSubMenu || construct.isMenuItem || construct.isMenuItemGroup)) { return; } if (keys.indexOf(c.key) !== -1) { // eslint-disable-next-line no-param-reassign ret.find = true; } else if (c.props.children) { loopMenuItemRecursively(c.props.children, keys, ret); } } }); } var menuAllProps = ['defaultSelectedKeys', 'selectedKeys', 'defaultOpenKeys', 'openKeys', 'mode', 'getPopupContainer', 'onSelect', 'onDeselect', 'onDestroy', 'openTransitionName', 'openAnimation', 'subMenuOpenDelay', 'subMenuCloseDelay', 'forceSubMenuRender', 'triggerSubMenuAction', 'level', 'selectable', 'multiple', 'onOpenChange', 'visible', 'focusable', 'defaultActiveFirst', 'prefixCls', 'inlineIndent', 'parentMenu', 'title', 'rootPrefixCls', 'eventKey', 'active', 'onItemHover', 'onTitleMouseEnter', 'onTitleMouseLeave', 'onTitleClick', 'popupAlign', 'popupOffset', 'isOpen', 'renderMenuItem', 'manualRef', 'subMenuKey', 'disabled', 'index', 'isSelected', 'store', 'activeKey', 'builtinPlacements', 'overflowedIndicator', 'motion', // the following keys found need to be removed from test regression 'attribute', 'value', 'popupClassName', 'inlineCollapsed', 'menu', 'theme', 'itemIcon', 'expandIcon']; // ref: https://github.com/ant-design/ant-design/issues/14007 // ref: https://bugs.chromium.org/p/chromium/issues/detail?id=360889 // getBoundingClientRect return the full precision value, which is // not the same behavior as on chrome. Set the precision to 6 to // unify their behavior exports.menuAllProps = menuAllProps; var getWidth = function getWidth(elem) { var includeMargin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var width = elem && typeof elem.getBoundingClientRect === 'function' && elem.getBoundingClientRect().width; if (width) { if (includeMargin) { var _getComputedStyle = getComputedStyle(elem), marginLeft = _getComputedStyle.marginLeft, marginRight = _getComputedStyle.marginRight; width += +marginLeft.replace('px', '') + +marginRight.replace('px', ''); } width = +width.toFixed(6); } return width || 0; }; exports.getWidth = getWidth; var setStyle = function setStyle(elem, styleProperty, value) { if (elem && (0, _typeof2.default)(elem.style) === 'object') { // eslint-disable-next-line no-param-reassign elem.style[styleProperty] = value; } }; exports.setStyle = setStyle; var isMobileDevice = function isMobileDevice() { return _isMobile.default.any; }; exports.isMobileDevice = isMobileDevice; },{"./utils/isMobile":650,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"react":"react"}],650:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); // MIT License from https://github.com/kaimallea/isMobile var applePhone = /iPhone/i; var appleIpod = /iPod/i; var appleTablet = /iPad/i; var androidPhone = /\bAndroid(?:.+)Mobile\b/i; // Match 'Android' AND 'Mobile' var androidTablet = /Android/i; var amazonPhone = /\bAndroid(?:.+)SD4930UR\b/i; var amazonTablet = /\bAndroid(?:.+)(?:KF[A-Z]{2,4})\b/i; var windowsPhone = /Windows Phone/i; var windowsTablet = /\bWindows(?:.+)ARM\b/i; // Match 'Windows' AND 'ARM' var otherBlackberry = /BlackBerry/i; var otherBlackberry10 = /BB10/i; var otherOpera = /Opera Mini/i; var otherChrome = /\b(CriOS|Chrome)(?:.+)Mobile/i; var otherFirefox = /Mobile(?:.+)Firefox\b/i; // Match 'Mobile' AND 'Firefox' function match(regex, userAgent) { return regex.test(userAgent); } function isMobile(userAgent) { var ua = userAgent || (typeof navigator !== 'undefined' ? navigator.userAgent : ''); // Facebook mobile app's integrated browser adds a bunch of strings that // match everything. Strip it out if it exists. var tmp = ua.split('[FBAN'); if (typeof tmp[1] !== 'undefined') { var _tmp = tmp; var _tmp2 = (0, _slicedToArray2.default)(_tmp, 1); ua = _tmp2[0]; } // Twitter mobile app's integrated browser on iPad adds a "Twitter for // iPhone" string. Same probably happens on other tablet platforms. // This will confuse detection so strip it out if it exists. tmp = ua.split('Twitter'); if (typeof tmp[1] !== 'undefined') { var _tmp3 = tmp; var _tmp4 = (0, _slicedToArray2.default)(_tmp3, 1); ua = _tmp4[0]; } var result = { apple: { phone: match(applePhone, ua) && !match(windowsPhone, ua), ipod: match(appleIpod, ua), tablet: !match(applePhone, ua) && match(appleTablet, ua) && !match(windowsPhone, ua), device: (match(applePhone, ua) || match(appleIpod, ua) || match(appleTablet, ua)) && !match(windowsPhone, ua) }, amazon: { phone: match(amazonPhone, ua), tablet: !match(amazonPhone, ua) && match(amazonTablet, ua), device: match(amazonPhone, ua) || match(amazonTablet, ua) }, android: { phone: !match(windowsPhone, ua) && match(amazonPhone, ua) || !match(windowsPhone, ua) && match(androidPhone, ua), tablet: !match(windowsPhone, ua) && !match(amazonPhone, ua) && !match(androidPhone, ua) && (match(amazonTablet, ua) || match(androidTablet, ua)), device: !match(windowsPhone, ua) && (match(amazonPhone, ua) || match(amazonTablet, ua) || match(androidPhone, ua) || match(androidTablet, ua)) || match(/\bokhttp\b/i, ua) }, windows: { phone: match(windowsPhone, ua), tablet: match(windowsTablet, ua), device: match(windowsPhone, ua) || match(windowsTablet, ua) }, other: { blackberry: match(otherBlackberry, ua), blackberry10: match(otherBlackberry10, ua), opera: match(otherOpera, ua), firefox: match(otherFirefox, ua), chrome: match(otherChrome, ua), device: match(otherBlackberry, ua) || match(otherBlackberry10, ua) || match(otherOpera, ua) || match(otherFirefox, ua) || match(otherChrome, ua) }, // Additional any: null, phone: null, tablet: null }; result.any = result.apple.device || result.android.device || result.windows.device || result.other.device; // excludes 'other' devices and ipods, targeting touchscreen phones result.phone = result.apple.phone || result.android.phone || result.windows.phone; result.tablet = result.apple.tablet || result.android.tablet || result.windows.tablet; return result; } var defaultResult = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, isMobile()), {}, { isMobile: isMobile }); var _default = defaultResult; exports.default = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204}],651:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getMotion = getMotion; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); function getMotion(_ref, _ref2, menuMode) { var prefixCls = _ref.prefixCls, motion = _ref.motion, _ref$defaultMotions = _ref.defaultMotions, defaultMotions = _ref$defaultMotions === void 0 ? {} : _ref$defaultMotions, openAnimation = _ref.openAnimation, openTransitionName = _ref.openTransitionName; var switchingModeFromInline = _ref2.switchingModeFromInline; if (motion) { return motion; } if ((0, _typeof2.default)(openAnimation) === 'object' && openAnimation) { (0, _warning.default)(false, 'Object type of `openAnimation` is removed. Please use `motion` instead.'); } else if (typeof openAnimation === 'string') { return { motionName: "".concat(prefixCls, "-open-").concat(openAnimation) }; } if (openTransitionName) { return { motionName: openTransitionName }; } // Default logic var defaultMotion = defaultMotions[menuMode]; if (defaultMotion) { return defaultMotion; } // When mode switch from inline // submenu should hide without animation return switchingModeFromInline ? null : defaultMotions.other; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/typeof":208,"rc-util/lib/warning":879}],652:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.genCSSMotion = genCSSMotion; exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _findDOMNode = _interopRequireDefault(require("rc-util/lib/Dom/findDOMNode")); var _ref = require("rc-util/lib/ref"); var _classnames = _interopRequireDefault(require("classnames")); var _motion = require("./util/motion"); var _interface = require("./interface"); var _useStatus3 = _interopRequireDefault(require("./hooks/useStatus")); var _DomWrapper = _interopRequireDefault(require("./DomWrapper")); var _useStepQueue = require("./hooks/useStepQueue"); /* eslint-disable react/default-props-match-prop-types, react/no-multi-comp, react/prop-types */ /** * `transitionSupport` is used for none transition test case. * Default we use browser transition event support check. */ function genCSSMotion(config) { var transitionSupport = config; if ((0, _typeof2.default)(config) === 'object') { transitionSupport = config.transitionSupport; } function isSupportTransition(props) { return !!(props.motionName && transitionSupport); } var CSSMotion = React.forwardRef(function (props, ref) { var _props$visible = props.visible, visible = _props$visible === void 0 ? true : _props$visible, _props$removeOnLeave = props.removeOnLeave, removeOnLeave = _props$removeOnLeave === void 0 ? true : _props$removeOnLeave, forceRender = props.forceRender, children = props.children, motionName = props.motionName, leavedClassName = props.leavedClassName, eventProps = props.eventProps; var supportMotion = isSupportTransition(props); // Ref to the react node, it may be a HTMLElement var nodeRef = (0, React.useRef)(); // Ref to the dom wrapper in case ref can not pass to HTMLElement var wrapperNodeRef = (0, React.useRef)(); function getDomElement() { try { return (0, _findDOMNode.default)(nodeRef.current || wrapperNodeRef.current); } catch (e) { // Only happen when `motionDeadline` trigger but element removed. return null; } } var _useStatus = (0, _useStatus3.default)(supportMotion, visible, getDomElement, props), _useStatus2 = (0, _slicedToArray2.default)(_useStatus, 4), status = _useStatus2[0], statusStep = _useStatus2[1], statusStyle = _useStatus2[2], mergedVisible = _useStatus2[3]; // ====================== Refs ====================== var originRef = (0, React.useRef)(ref); originRef.current = ref; var setNodeRef = React.useCallback(function (node) { nodeRef.current = node; (0, _ref.fillRef)(originRef.current, node); }, []); // ===================== Render ===================== var motionChildren; if (!children) { // No children motionChildren = null; } else if (status === _interface.STATUS_NONE || !isSupportTransition(props)) { // Stable children if (mergedVisible) { motionChildren = children((0, _objectSpread2.default)({}, eventProps), setNodeRef); } else if (!removeOnLeave) { motionChildren = children((0, _objectSpread2.default)((0, _objectSpread2.default)({}, eventProps), {}, { className: leavedClassName }), setNodeRef); } else if (forceRender) { motionChildren = children((0, _objectSpread2.default)((0, _objectSpread2.default)({}, eventProps), {}, { style: { display: 'none' } }), setNodeRef); } else { motionChildren = null; } } else { var _classNames; // In motion var statusSuffix; if (statusStep === _interface.STEP_PREPARE) { statusSuffix = 'prepare'; } else if ((0, _useStepQueue.isActive)(statusStep)) { statusSuffix = 'active'; } else if (statusStep === _interface.STEP_START) { statusSuffix = 'start'; } motionChildren = children((0, _objectSpread2.default)((0, _objectSpread2.default)({}, eventProps), {}, { className: (0, _classnames.default)((0, _motion.getTransitionName)(motionName, status), (_classNames = {}, (0, _defineProperty2.default)(_classNames, (0, _motion.getTransitionName)(motionName, "".concat(status, "-").concat(statusSuffix)), statusSuffix), (0, _defineProperty2.default)(_classNames, motionName, typeof motionName === 'string'), _classNames)), style: statusStyle }), setNodeRef); } return React.createElement(_DomWrapper.default, { ref: wrapperNodeRef }, motionChildren); }); CSSMotion.displayName = 'CSSMotion'; return CSSMotion; } var _default = genCSSMotion(_motion.supportTransition); exports.default = _default; },{"./DomWrapper":654,"./hooks/useStatus":659,"./hooks/useStepQueue":660,"./interface":662,"./util/motion":664,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"classnames":455,"rc-util/lib/Dom/findDOMNode":863,"rc-util/lib/ref":874,"react":"react"}],653:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.genCSSMotionList = genCSSMotionList; exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _CSSMotion = _interopRequireDefault(require("./CSSMotion")); var _motion = require("./util/motion"); var _diff = require("./util/diff"); /* eslint react/prop-types: 0 */ var MOTION_PROP_NAMES = ['eventProps', 'visible', 'children', 'motionName', 'motionAppear', 'motionEnter', 'motionLeave', 'motionLeaveImmediately', 'motionDeadline', 'removeOnLeave', 'leavedClassName', 'onAppearStart', 'onAppearActive', 'onAppearEnd', 'onEnterStart', 'onEnterActive', 'onEnterEnd', 'onLeaveStart', 'onLeaveActive', 'onLeaveEnd']; /** * Generate a CSSMotionList component with config * @param transitionSupport No need since CSSMotionList no longer depends on transition support * @param CSSMotion CSSMotion component */ function genCSSMotionList(transitionSupport) { var CSSMotion = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _CSSMotion.default; var CSSMotionList = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(CSSMotionList, _React$Component); var _super = (0, _createSuper2.default)(CSSMotionList); function CSSMotionList() { var _this; (0, _classCallCheck2.default)(this, CSSMotionList); _this = _super.apply(this, arguments); _this.state = { keyEntities: [] }; _this.removeKey = function (removeKey) { _this.setState(function (_ref) { var keyEntities = _ref.keyEntities; return { keyEntities: keyEntities.map(function (entity) { if (entity.key !== removeKey) return entity; return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, entity), {}, { status: _diff.STATUS_REMOVED }); }) }; }); }; return _this; } (0, _createClass2.default)(CSSMotionList, [{ key: "render", value: function render() { var _this2 = this; var keyEntities = this.state.keyEntities; var _this$props = this.props, component = _this$props.component, children = _this$props.children, _onVisibleChanged = _this$props.onVisibleChanged, restProps = (0, _objectWithoutProperties2.default)(_this$props, ["component", "children", "onVisibleChanged"]); var Component = component || React.Fragment; var motionProps = {}; MOTION_PROP_NAMES.forEach(function (prop) { motionProps[prop] = restProps[prop]; delete restProps[prop]; }); delete restProps.keys; return React.createElement(Component, Object.assign({}, restProps), keyEntities.map(function (_ref2) { var status = _ref2.status, eventProps = (0, _objectWithoutProperties2.default)(_ref2, ["status"]); var visible = status === _diff.STATUS_ADD || status === _diff.STATUS_KEEP; return React.createElement(CSSMotion, Object.assign({}, motionProps, { key: eventProps.key, visible: visible, eventProps: eventProps, onVisibleChanged: function onVisibleChanged(changedVisible) { _onVisibleChanged === null || _onVisibleChanged === void 0 ? void 0 : _onVisibleChanged(changedVisible, { key: eventProps.key }); if (!changedVisible) { _this2.removeKey(eventProps.key); } } }), children); })); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(_ref3, _ref4) { var keys = _ref3.keys; var keyEntities = _ref4.keyEntities; var parsedKeyObjects = (0, _diff.parseKeys)(keys); var mixedKeyEntities = (0, _diff.diffKeys)(keyEntities, parsedKeyObjects); return { keyEntities: mixedKeyEntities.filter(function (entity) { var prevEntity = keyEntities.find(function (_ref5) { var key = _ref5.key; return entity.key === key; }); // Remove if already mark as removed if (prevEntity && prevEntity.status === _diff.STATUS_REMOVED && entity.status === _diff.STATUS_REMOVE) { return false; } return true; }) }; } }]); return CSSMotionList; }(React.Component); CSSMotionList.defaultProps = { component: 'div' }; return CSSMotionList; } var _default = genCSSMotionList(_motion.supportTransition); exports.default = _default; },{"./CSSMotion":652,"./util/diff":663,"./util/motion":664,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"react":"react"}],654:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var DomWrapper = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(DomWrapper, _React$Component); var _super = (0, _createSuper2.default)(DomWrapper); function DomWrapper() { (0, _classCallCheck2.default)(this, DomWrapper); return _super.apply(this, arguments); } (0, _createClass2.default)(DomWrapper, [{ key: "render", value: function render() { return this.props.children; } }]); return DomWrapper; }(React.Component); var _default = DomWrapper; exports.default = _default; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],655:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _motion = require("../util/motion"); var _default = function _default(callback) { var cacheElementRef = (0, React.useRef)(); // Cache callback var callbackRef = (0, React.useRef)(callback); callbackRef.current = callback; // Internal motion event handler var onInternalMotionEnd = React.useCallback(function (event) { callbackRef.current(event); }, []); // Remove events function removeMotionEvents(element) { if (element) { element.removeEventListener(_motion.transitionEndName, onInternalMotionEnd); element.removeEventListener(_motion.animationEndName, onInternalMotionEnd); } } // Patch events function patchMotionEvents(element) { if (cacheElementRef.current && cacheElementRef.current !== element) { removeMotionEvents(cacheElementRef.current); } if (element && element !== cacheElementRef.current) { element.addEventListener(_motion.transitionEndName, onInternalMotionEnd); element.addEventListener(_motion.animationEndName, onInternalMotionEnd); // Save as cache in case dom removed trigger by `motionDeadline` cacheElementRef.current = element; } } // Clean up when removed React.useEffect(function () { return function () { removeMotionEvents(cacheElementRef.current); }; }, []); return [patchMotionEvents, removeMotionEvents]; }; exports.default = _default; },{"../util/motion":664,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],656:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); var _canUseDom = _interopRequireDefault(require("rc-util/lib/Dom/canUseDom")); // It's safe to use `useLayoutEffect` but the warning is annoying var useIsomorphicLayoutEffect = (0, _canUseDom.default)() ? _react.useLayoutEffect : _react.useEffect; var _default = useIsomorphicLayoutEffect; exports.default = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"rc-util/lib/Dom/canUseDom":860,"react":"react"}],657:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _raf = _interopRequireDefault(require("rc-util/lib/raf")); var _default = function _default() { var nextFrameRef = React.useRef(null); function cancelNextFrame() { _raf.default.cancel(nextFrameRef.current); } function nextFrame(callback) { var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2; cancelNextFrame(); var nextFrameId = (0, _raf.default)(function () { if (delay <= 1) { callback({ isCanceled: function isCanceled() { return nextFrameId !== nextFrameRef.current; } }); } else { nextFrame(callback, delay - 1); } }); nextFrameRef.current = nextFrameId; } React.useEffect(function () { return function () { cancelNextFrame(); }; }, []); return [nextFrame, cancelNextFrame]; }; exports.default = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-util/lib/raf":873,"react":"react"}],658:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useMountStatus; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); function useMountStatus(defaultValue) { var destroyRef = (0, _react.useRef)(false); var _useState = (0, _react.useState)(defaultValue), _useState2 = (0, _slicedToArray2.default)(_useState, 2), val = _useState2[0], setVal = _useState2[1]; function setValue(next) { if (!destroyRef.current) { setVal(next); } } (0, _react.useEffect)(function () { return function () { destroyRef.current = true; }; }, []); return [val, setValue]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],659:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useStatus; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _interface = require("../interface"); var _useState7 = _interopRequireDefault(require("./useState")); var _useIsomorphicLayoutEffect = _interopRequireDefault(require("./useIsomorphicLayoutEffect")); var _useStepQueue3 = _interopRequireWildcard(require("./useStepQueue")); var _useDomMotionEvents3 = _interopRequireDefault(require("./useDomMotionEvents")); function useStatus(supportMotion, visible, getElement, _ref) { var _ref$motionEnter = _ref.motionEnter, motionEnter = _ref$motionEnter === void 0 ? true : _ref$motionEnter, _ref$motionAppear = _ref.motionAppear, motionAppear = _ref$motionAppear === void 0 ? true : _ref$motionAppear, _ref$motionLeave = _ref.motionLeave, motionLeave = _ref$motionLeave === void 0 ? true : _ref$motionLeave, motionDeadline = _ref.motionDeadline, motionLeaveImmediately = _ref.motionLeaveImmediately, onAppearPrepare = _ref.onAppearPrepare, onEnterPrepare = _ref.onEnterPrepare, onLeavePrepare = _ref.onLeavePrepare, onAppearStart = _ref.onAppearStart, onEnterStart = _ref.onEnterStart, onLeaveStart = _ref.onLeaveStart, onAppearActive = _ref.onAppearActive, onEnterActive = _ref.onEnterActive, onLeaveActive = _ref.onLeaveActive, onAppearEnd = _ref.onAppearEnd, onEnterEnd = _ref.onEnterEnd, onLeaveEnd = _ref.onLeaveEnd, onVisibleChanged = _ref.onVisibleChanged; // Used for outer render usage to avoid `visible: false & status: none` to render nothing var _useState = (0, _useState7.default)(), _useState2 = (0, _slicedToArray2.default)(_useState, 2), asyncVisible = _useState2[0], setAsyncVisible = _useState2[1]; var _useState3 = (0, _useState7.default)(_interface.STATUS_NONE), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), status = _useState4[0], setStatus = _useState4[1]; var _useState5 = (0, _useState7.default)(null), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), style = _useState6[0], setStyle = _useState6[1]; var mountedRef = (0, React.useRef)(false); var deadlineRef = (0, React.useRef)(null); // =========================== Dom Node =========================== var cacheElementRef = (0, React.useRef)(null); function getDomElement() { var element = getElement(); return element || cacheElementRef.current; } // ========================== Motion End ========================== var activeRef = (0, React.useRef)(false); function onInternalMotionEnd(event) { var element = getDomElement(); if (event && !event.deadline && event.target !== element) { // event exists // not initiated by deadline // transitionEnd not fired by inner elements return; } var canEnd; if (status === _interface.STATUS_APPEAR && activeRef.current) { canEnd = onAppearEnd === null || onAppearEnd === void 0 ? void 0 : onAppearEnd(element, event); } else if (status === _interface.STATUS_ENTER && activeRef.current) { canEnd = onEnterEnd === null || onEnterEnd === void 0 ? void 0 : onEnterEnd(element, event); } else if (status === _interface.STATUS_LEAVE && activeRef.current) { canEnd = onLeaveEnd === null || onLeaveEnd === void 0 ? void 0 : onLeaveEnd(element, event); } if (canEnd !== false) { setStatus(_interface.STATUS_NONE); setStyle(null); } } var _useDomMotionEvents = (0, _useDomMotionEvents3.default)(onInternalMotionEnd), _useDomMotionEvents2 = (0, _slicedToArray2.default)(_useDomMotionEvents, 1), patchMotionEvents = _useDomMotionEvents2[0]; // ============================= Step ============================= var eventHandlers = React.useMemo(function () { var _ref2, _ref3, _ref4; switch (status) { case 'appear': return _ref2 = {}, (0, _defineProperty2.default)(_ref2, _interface.STEP_PREPARE, onAppearPrepare), (0, _defineProperty2.default)(_ref2, _interface.STEP_START, onAppearStart), (0, _defineProperty2.default)(_ref2, _interface.STEP_ACTIVE, onAppearActive), _ref2; case 'enter': return _ref3 = {}, (0, _defineProperty2.default)(_ref3, _interface.STEP_PREPARE, onEnterPrepare), (0, _defineProperty2.default)(_ref3, _interface.STEP_START, onEnterStart), (0, _defineProperty2.default)(_ref3, _interface.STEP_ACTIVE, onEnterActive), _ref3; case 'leave': return _ref4 = {}, (0, _defineProperty2.default)(_ref4, _interface.STEP_PREPARE, onLeavePrepare), (0, _defineProperty2.default)(_ref4, _interface.STEP_START, onLeaveStart), (0, _defineProperty2.default)(_ref4, _interface.STEP_ACTIVE, onLeaveActive), _ref4; default: return {}; } }, [status]); var _useStepQueue = (0, _useStepQueue3.default)(function (newStep) { // Only prepare step can be skip if (newStep === _interface.STEP_PREPARE) { var onPrepare = eventHandlers[_interface.STEP_PREPARE]; if (!onPrepare) { return _useStepQueue3.SkipStep; } return onPrepare(getDomElement()); } // Rest step is sync update if (step in eventHandlers) { var _eventHandlers$step; setStyle(((_eventHandlers$step = eventHandlers[step]) === null || _eventHandlers$step === void 0 ? void 0 : _eventHandlers$step.call(eventHandlers, getDomElement(), null)) || null); } if (step === _interface.STEP_ACTIVE) { // Patch events when motion needed patchMotionEvents(getDomElement()); if (motionDeadline > 0) { clearTimeout(deadlineRef.current); deadlineRef.current = setTimeout(function () { onInternalMotionEnd({ deadline: true }); }, motionDeadline); } } return _useStepQueue3.DoStep; }), _useStepQueue2 = (0, _slicedToArray2.default)(_useStepQueue, 2), startStep = _useStepQueue2[0], step = _useStepQueue2[1]; var active = (0, _useStepQueue3.isActive)(step); activeRef.current = active; // ============================ Status ============================ // Update with new status (0, _useIsomorphicLayoutEffect.default)(function () { setAsyncVisible(visible); if (!supportMotion) { return; } var isMounted = mountedRef.current; mountedRef.current = true; var nextStatus; // Appear if (!isMounted && visible && motionAppear) { nextStatus = _interface.STATUS_APPEAR; } // Enter if (isMounted && visible && motionEnter) { nextStatus = _interface.STATUS_ENTER; } // Leave if (isMounted && !visible && motionLeave || !isMounted && motionLeaveImmediately && !visible && motionLeave) { nextStatus = _interface.STATUS_LEAVE; } // Update to next status if (nextStatus) { setStatus(nextStatus); startStep(); } }, [visible]); // ============================ Effect ============================ // Reset when motion changed (0, React.useEffect)(function () { if ( // Cancel appear status === _interface.STATUS_APPEAR && !motionAppear || // Cancel enter status === _interface.STATUS_ENTER && !motionEnter || // Cancel leave status === _interface.STATUS_LEAVE && !motionLeave) { setStatus(_interface.STATUS_NONE); } }, [motionAppear, motionEnter, motionLeave]); (0, React.useEffect)(function () { return function () { clearTimeout(deadlineRef.current); }; }, []); // Trigger `onVisibleChanged` (0, React.useEffect)(function () { if (asyncVisible !== undefined && status === _interface.STATUS_NONE) { onVisibleChanged === null || onVisibleChanged === void 0 ? void 0 : onVisibleChanged(asyncVisible); } }, [asyncVisible, status]); // ============================ Styles ============================ var mergedStyle = style; if (eventHandlers[_interface.STEP_PREPARE] && step === _interface.STEP_START) { mergedStyle = (0, _objectSpread2.default)({ transition: 'none' }, mergedStyle); } return [status, step, mergedStyle, asyncVisible !== null && asyncVisible !== void 0 ? asyncVisible : visible]; } },{"../interface":662,"./useDomMotionEvents":655,"./useIsomorphicLayoutEffect":656,"./useState":658,"./useStepQueue":660,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],660:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.isActive = isActive; exports.default = exports.DoStep = exports.SkipStep = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _interface = require("../interface"); var _useIsomorphicLayoutEffect = _interopRequireDefault(require("./useIsomorphicLayoutEffect")); var _useNextFrame3 = _interopRequireDefault(require("./useNextFrame")); var STEP_QUEUE = [_interface.STEP_PREPARE, _interface.STEP_START, _interface.STEP_ACTIVE, _interface.STEP_ACTIVATED]; /** Skip current step */ var SkipStep = false; /** Current step should be update in */ exports.SkipStep = SkipStep; var DoStep = true; exports.DoStep = DoStep; function isActive(step) { return step === _interface.STEP_ACTIVE || step === _interface.STEP_ACTIVATED; } var _default = function _default(callback) { var _React$useState = React.useState(_interface.STEP_NONE), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), step = _React$useState2[0], setStep = _React$useState2[1]; var _useNextFrame = (0, _useNextFrame3.default)(), _useNextFrame2 = (0, _slicedToArray2.default)(_useNextFrame, 2), nextFrame = _useNextFrame2[0], cancelNextFrame = _useNextFrame2[1]; function startQueue() { setStep(_interface.STEP_PREPARE); } (0, _useIsomorphicLayoutEffect.default)(function () { if (step !== _interface.STEP_NONE && step !== _interface.STEP_ACTIVATED) { var index = STEP_QUEUE.indexOf(step); var nextStep = STEP_QUEUE[index + 1]; var result = callback(step); if (result === SkipStep) { // Skip when no needed setStep(nextStep); } else { // Do as frame for step update nextFrame(function (info) { function doNext() { // Skip since current queue is ood if (info.isCanceled()) return; setStep(nextStep); } if (result === true) { doNext(); } else { // Only promise should be async Promise.resolve(result).then(doNext); } }); } } }, [step]); React.useEffect(function () { return function () { cancelNextFrame(); }; }, []); return [startQueue, step]; }; exports.default = _default; },{"../interface":662,"./useIsomorphicLayoutEffect":656,"./useNextFrame":657,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],661:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "CSSMotionList", { enumerable: true, get: function get() { return _CSSMotionList.default; } }); exports.default = void 0; var _CSSMotion = _interopRequireDefault(require("./CSSMotion")); var _CSSMotionList = _interopRequireDefault(require("./CSSMotionList")); var _default = _CSSMotion.default; exports.default = _default; },{"./CSSMotion":652,"./CSSMotionList":653,"@babel/runtime/helpers/interopRequireDefault":192}],662:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.STEP_ACTIVATED = exports.STEP_ACTIVE = exports.STEP_START = exports.STEP_PREPARE = exports.STEP_NONE = exports.STATUS_LEAVE = exports.STATUS_ENTER = exports.STATUS_APPEAR = exports.STATUS_NONE = void 0; var STATUS_NONE = 'none'; exports.STATUS_NONE = STATUS_NONE; var STATUS_APPEAR = 'appear'; exports.STATUS_APPEAR = STATUS_APPEAR; var STATUS_ENTER = 'enter'; exports.STATUS_ENTER = STATUS_ENTER; var STATUS_LEAVE = 'leave'; exports.STATUS_LEAVE = STATUS_LEAVE; var STEP_NONE = 'none'; exports.STEP_NONE = STEP_NONE; var STEP_PREPARE = 'prepare'; exports.STEP_PREPARE = STEP_PREPARE; var STEP_START = 'start'; exports.STEP_START = STEP_START; var STEP_ACTIVE = 'active'; exports.STEP_ACTIVE = STEP_ACTIVE; var STEP_ACTIVATED = 'end'; exports.STEP_ACTIVATED = STEP_ACTIVATED; },{}],663:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.wrapKeyToObject = wrapKeyToObject; exports.parseKeys = parseKeys; exports.diffKeys = diffKeys; exports.STATUS_REMOVED = exports.STATUS_REMOVE = exports.STATUS_KEEP = exports.STATUS_ADD = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var STATUS_ADD = 'add'; exports.STATUS_ADD = STATUS_ADD; var STATUS_KEEP = 'keep'; exports.STATUS_KEEP = STATUS_KEEP; var STATUS_REMOVE = 'remove'; exports.STATUS_REMOVE = STATUS_REMOVE; var STATUS_REMOVED = 'removed'; exports.STATUS_REMOVED = STATUS_REMOVED; function wrapKeyToObject(key) { var keyObj; if (key && (0, _typeof2.default)(key) === 'object' && 'key' in key) { keyObj = key; } else { keyObj = { key: key }; } return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, keyObj), {}, { key: String(keyObj.key) }); } function parseKeys() { var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; return keys.map(wrapKeyToObject); } function diffKeys() { var prevKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var currentKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var list = []; var currentIndex = 0; var currentLen = currentKeys.length; var prevKeyObjects = parseKeys(prevKeys); var currentKeyObjects = parseKeys(currentKeys); // Check prev keys to insert or keep prevKeyObjects.forEach(function (keyObj) { var hit = false; for (var i = currentIndex; i < currentLen; i += 1) { var currentKeyObj = currentKeyObjects[i]; if (currentKeyObj.key === keyObj.key) { // New added keys should add before current key if (currentIndex < i) { list = list.concat(currentKeyObjects.slice(currentIndex, i).map(function (obj) { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, obj), {}, { status: STATUS_ADD }); })); currentIndex = i; } list.push((0, _objectSpread2.default)((0, _objectSpread2.default)({}, currentKeyObj), {}, { status: STATUS_KEEP })); currentIndex += 1; hit = true; break; } } // If not hit, it means key is removed if (!hit) { list.push((0, _objectSpread2.default)((0, _objectSpread2.default)({}, keyObj), {}, { status: STATUS_REMOVE })); } }); // Add rest to the list if (currentIndex < currentLen) { list = list.concat(currentKeyObjects.slice(currentIndex).map(function (obj) { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, obj), {}, { status: STATUS_ADD }); })); } /** * Merge same key when it remove and add again: * [1 - add, 2 - keep, 1 - remove] -> [1 - keep, 2 - keep] */ var keys = {}; list.forEach(function (_ref) { var key = _ref.key; keys[key] = (keys[key] || 0) + 1; }); var duplicatedKeys = Object.keys(keys).filter(function (key) { return keys[key] > 1; }); duplicatedKeys.forEach(function (matchKey) { // Remove `STATUS_REMOVE` node. list = list.filter(function (_ref2) { var key = _ref2.key, status = _ref2.status; return key !== matchKey || status !== STATUS_REMOVE; }); // Update `STATUS_ADD` to `STATUS_KEEP` list.forEach(function (node) { if (node.key === matchKey) { // eslint-disable-next-line no-param-reassign node.status = STATUS_KEEP; } }); }); return list; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/typeof":208}],664:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getVendorPrefixes = getVendorPrefixes; exports.getVendorPrefixedEventName = getVendorPrefixedEventName; exports.getTransitionName = getTransitionName; exports.transitionEndName = exports.animationEndName = exports.supportTransition = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _canUseDom = _interopRequireDefault(require("rc-util/lib/Dom/canUseDom")); // ================= Transition ================= // Event wrapper. Copy from react source code function makePrefixMap(styleProp, eventName) { var prefixes = {}; prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(); prefixes["Webkit".concat(styleProp)] = "webkit".concat(eventName); prefixes["Moz".concat(styleProp)] = "moz".concat(eventName); prefixes["ms".concat(styleProp)] = "MS".concat(eventName); prefixes["O".concat(styleProp)] = "o".concat(eventName.toLowerCase()); return prefixes; } function getVendorPrefixes(domSupport, win) { var prefixes = { animationend: makePrefixMap('Animation', 'AnimationEnd'), transitionend: makePrefixMap('Transition', 'TransitionEnd') }; if (domSupport) { if (!('AnimationEvent' in win)) { delete prefixes.animationend.animation; } if (!('TransitionEvent' in win)) { delete prefixes.transitionend.transition; } } return prefixes; } var vendorPrefixes = getVendorPrefixes((0, _canUseDom.default)(), typeof window !== 'undefined' ? window : {}); var style = {}; if ((0, _canUseDom.default)()) { var _document$createEleme = document.createElement('div'); style = _document$createEleme.style; } var prefixedEventNames = {}; function getVendorPrefixedEventName(eventName) { if (prefixedEventNames[eventName]) { return prefixedEventNames[eventName]; } var prefixMap = vendorPrefixes[eventName]; if (prefixMap) { var stylePropList = Object.keys(prefixMap); var len = stylePropList.length; for (var i = 0; i < len; i += 1) { var styleProp = stylePropList[i]; if (Object.prototype.hasOwnProperty.call(prefixMap, styleProp) && styleProp in style) { prefixedEventNames[eventName] = prefixMap[styleProp]; return prefixedEventNames[eventName]; } } } return ''; } var internalAnimationEndName = getVendorPrefixedEventName('animationend'); var internalTransitionEndName = getVendorPrefixedEventName('transitionend'); var supportTransition = !!(internalAnimationEndName && internalTransitionEndName); exports.supportTransition = supportTransition; var animationEndName = internalAnimationEndName || 'animationend'; exports.animationEndName = animationEndName; var transitionEndName = internalTransitionEndName || 'transitionend'; exports.transitionEndName = transitionEndName; function getTransitionName(transitionName, transitionType) { if (!transitionName) return null; if ((0, _typeof2.default)(transitionName) === 'object') { var type = transitionType.replace(/-\w/g, function (match) { return match[1].toUpperCase(); }); return transitionName[type]; } return "".concat(transitionName, "-").concat(transitionType); } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/typeof":208,"rc-util/lib/Dom/canUseDom":860}],665:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireWildcard(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _classnames = _interopRequireDefault(require("classnames")); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function () { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var Notice = /*#__PURE__*/function (_Component) { (0, _inherits2.default)(Notice, _Component); var _super = _createSuper(Notice); function Notice() { var _this; (0, _classCallCheck2.default)(this, Notice); _this = _super.apply(this, arguments); _this.closeTimer = null; _this.close = function (e) { if (e) { e.stopPropagation(); } _this.clearCloseTimer(); var onClose = _this.props.onClose; if (onClose) { onClose(); } }; _this.startCloseTimer = function () { if (_this.props.duration) { _this.closeTimer = window.setTimeout(function () { _this.close(); }, _this.props.duration * 1000); } }; _this.clearCloseTimer = function () { if (_this.closeTimer) { clearTimeout(_this.closeTimer); _this.closeTimer = null; } }; return _this; } (0, _createClass2.default)(Notice, [{ key: "componentDidMount", value: function componentDidMount() { this.startCloseTimer(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { if (this.props.duration !== prevProps.duration || this.props.update) { this.restartCloseTimer(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.clearCloseTimer(); } }, { key: "restartCloseTimer", value: function restartCloseTimer() { this.clearCloseTimer(); this.startCloseTimer(); } }, { key: "render", value: function render() { var _this2 = this; var _this$props = this.props, prefixCls = _this$props.prefixCls, className = _this$props.className, closable = _this$props.closable, closeIcon = _this$props.closeIcon, style = _this$props.style, onClick = _this$props.onClick, children = _this$props.children, holder = _this$props.holder; var componentClass = "".concat(prefixCls, "-notice"); var dataOrAriaAttributeProps = Object.keys(this.props).reduce(function (acc, key) { if (key.substr(0, 5) === 'data-' || key.substr(0, 5) === 'aria-' || key === 'role') { acc[key] = _this2.props[key]; } return acc; }, {}); var node = _react.default.createElement("div", Object.assign({ className: (0, _classnames.default)(componentClass, className, (0, _defineProperty2.default)({}, "".concat(componentClass, "-closable"), closable)), style: style, onMouseEnter: this.clearCloseTimer, onMouseLeave: this.startCloseTimer, onClick: onClick }, dataOrAriaAttributeProps), _react.default.createElement("div", { className: "".concat(componentClass, "-content") }, children), closable ? _react.default.createElement("a", { tabIndex: 0, onClick: this.close, className: "".concat(componentClass, "-close") }, closeIcon || _react.default.createElement("span", { className: "".concat(componentClass, "-close-x") })) : null); if (holder) { return _reactDom.default.createPortal(node, holder); } return node; } }]); return Notice; }(_react.Component); exports.default = Notice; Notice.defaultProps = { onClose: function onClose() {}, duration: 1.5, style: { right: '50%' } }; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/possibleConstructorReturn":202,"classnames":455,"react":"react","react-dom":"react-dom"}],666:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireWildcard(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _rcAnimate = _interopRequireDefault(require("rc-animate")); var _createChainedFunction = _interopRequireDefault(require("rc-util/lib/createChainedFunction")); var _classnames = _interopRequireDefault(require("classnames")); var _Notice = _interopRequireDefault(require("./Notice")); var _useNotification2 = _interopRequireDefault(require("./useNotification")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function () { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var seed = 0; var now = Date.now(); function getUuid() { var id = seed; seed += 1; return "rcNotification_".concat(now, "_").concat(id); } var Notification = /*#__PURE__*/function (_Component) { (0, _inherits2.default)(Notification, _Component); var _super = _createSuper(Notification); function Notification() { var _this; (0, _classCallCheck2.default)(this, Notification); _this = _super.apply(this, arguments); _this.state = { notices: [] }; _this.hookRefs = new Map(); _this.add = function (notice, holderCallback) { // eslint-disable-next-line no-param-reassign notice.key = notice.key || getUuid(); var key = notice.key; var maxCount = _this.props.maxCount; _this.setState(function (previousState) { var notices = previousState.notices; var noticeIndex = notices.map(function (v) { return v.notice.key; }).indexOf(key); var updatedNotices = notices.concat(); if (noticeIndex !== -1) { updatedNotices.splice(noticeIndex, 1, { notice: notice, holderCallback: holderCallback }); } else { if (maxCount && notices.length >= maxCount) { // XXX, use key of first item to update new added (let React to move exsiting // instead of remove and mount). Same key was used before for both a) external // manual control and b) internal react 'key' prop , which is not that good. // eslint-disable-next-line no-param-reassign notice.updateKey = updatedNotices[0].notice.updateKey || updatedNotices[0].notice.key; updatedNotices.shift(); } updatedNotices.push({ notice: notice, holderCallback: holderCallback }); } return { notices: updatedNotices }; }); }; _this.remove = function (key) { _this.setState(function (previousState) { return { notices: previousState.notices.filter(function (_ref) { var notice = _ref.notice; return notice.key !== key; }) }; }); }; return _this; } (0, _createClass2.default)(Notification, [{ key: "getTransitionName", value: function getTransitionName() { var _this$props = this.props, prefixCls = _this$props.prefixCls, animation = _this$props.animation; var transitionName = this.props.transitionName; if (!transitionName && animation) { transitionName = "".concat(prefixCls, "-").concat(animation); } return transitionName; } }, { key: "render", value: function render() { var _this2 = this; var notices = this.state.notices; var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, closeIcon = _this$props2.closeIcon, style = _this$props2.style; var noticeNodes = notices.map(function (_ref2, index) { var notice = _ref2.notice, holderCallback = _ref2.holderCallback; var update = Boolean(index === notices.length - 1 && notice.updateKey); var key = notice.updateKey ? notice.updateKey : notice.key; var onClose = (0, _createChainedFunction.default)(_this2.remove.bind(_this2, notice.key), notice.onClose); var noticeProps = _objectSpread(_objectSpread(_objectSpread({ prefixCls: prefixCls, closeIcon: closeIcon }, notice), notice.props), {}, { key: key, update: update, onClose: onClose, onClick: notice.onClick, children: notice.content }); if (holderCallback) { return _react.default.createElement("div", { key: key, className: "".concat(prefixCls, "-hook-holder"), ref: function ref(div) { if (typeof key === 'undefined') { return; } if (div) { _this2.hookRefs.set(key, div); holderCallback(div, noticeProps); } else { _this2.hookRefs.delete(key); } } }); } return _react.default.createElement(_Notice.default, Object.assign({}, noticeProps)); }); return _react.default.createElement("div", { className: (0, _classnames.default)(prefixCls, className), style: style }, _react.default.createElement(_rcAnimate.default, { transitionName: this.getTransitionName() }, noticeNodes)); } }]); return Notification; }(_react.Component); Notification.defaultProps = { prefixCls: 'rc-notification', animation: 'fade', style: { top: 65, left: '50%' } }; Notification.newInstance = function newNotificationInstance(properties, callback) { var _ref3 = properties || {}, getContainer = _ref3.getContainer, props = (0, _objectWithoutProperties2.default)(_ref3, ["getContainer"]); var div = document.createElement('div'); if (getContainer) { var root = getContainer(); root.appendChild(div); } else { document.body.appendChild(div); } var called = false; function ref(notification) { if (called) { return; } called = true; callback({ notice: function notice(noticeProps) { notification.add(noticeProps); }, removeNotice: function removeNotice(key) { notification.remove(key); }, component: notification, destroy: function destroy() { _reactDom.default.unmountComponentAtNode(div); if (div.parentNode) { div.parentNode.removeChild(div); } }, // Hooks useNotification: function useNotification() { return (0, _useNotification2.default)(notification); } }); } // Only used for test case usage if (process.env.NODE_ENV === 'test' && properties.TEST_RENDER) { properties.TEST_RENDER(_react.default.createElement(Notification, Object.assign({}, props, { ref: ref }))); return; } _reactDom.default.render(_react.default.createElement(Notification, Object.assign({}, props, { ref: ref })), div); }; var _default = Notification; exports.default = _default; }).call(this,require('_process')) },{"./Notice":665,"./useNotification":668,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/possibleConstructorReturn":202,"_process":1,"classnames":455,"rc-animate":586,"rc-util/lib/createChainedFunction":868,"react":"react","react-dom":"react-dom"}],667:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Notification = _interopRequireDefault(require("./Notification")); var _default = _Notification.default; exports.default = _default; },{"./Notification":666,"@babel/runtime/helpers/interopRequireDefault":192}],668:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useNotification; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _Notice = _interopRequireDefault(require("./Notice")); function useNotification(notificationInstance) { var createdRef = React.useRef({}); var _React$useState = React.useState([]), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), elements = _React$useState2[0], setElements = _React$useState2[1]; function notify(noticeProps) { notificationInstance.add(noticeProps, function (div, props) { var key = props.key; if (div && !createdRef.current[key]) { var noticeEle = React.createElement(_Notice.default, Object.assign({}, props, { holder: div })); createdRef.current[key] = noticeEle; setElements(function (originElements) { return [].concat((0, _toConsumableArray2.default)(originElements), [noticeEle]); }); } }); } return [notify, React.createElement(React.Fragment, null, elements)]; } },{"./Notice":665,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"react":"react"}],669:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _default = { ZERO: 48, NINE: 57, NUMPAD_ZERO: 96, NUMPAD_NINE: 105, BACKSPACE: 8, DELETE: 46, ENTER: 13, ARROW_UP: 38, ARROW_DOWN: 40 }; exports.default = _default; },{}],670:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireDefault(require("react")); var _KeyCode = _interopRequireDefault(require("./KeyCode")); /* eslint react/prop-types: 0 */ var Options = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Options, _React$Component); var _super = (0, _createSuper2.default)(Options); function Options() { var _this; (0, _classCallCheck2.default)(this, Options); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); _this.state = { goInputText: '' }; _this.buildOptionText = function (value) { return "".concat(value, " ").concat(_this.props.locale.items_per_page); }; _this.changeSize = function (value) { _this.props.changeSize(Number(value)); }; _this.handleChange = function (e) { _this.setState({ goInputText: e.target.value }); }; _this.handleBlur = function (e) { var _this$props = _this.props, goButton = _this$props.goButton, quickGo = _this$props.quickGo, rootPrefixCls = _this$props.rootPrefixCls; var goInputText = _this.state.goInputText; if (goButton || goInputText === '') { return; } if (e.relatedTarget && (e.relatedTarget.className.indexOf("".concat(rootPrefixCls, "-prev")) >= 0 || e.relatedTarget.className.indexOf("".concat(rootPrefixCls, "-next")) >= 0)) { return; } _this.setState({ goInputText: '' }); quickGo(_this.getValidValue()); }; _this.go = function (e) { var goInputText = _this.state.goInputText; if (goInputText === '') { return; } if (e.keyCode === _KeyCode.default.ENTER || e.type === 'click') { _this.setState({ goInputText: '' }); _this.props.quickGo(_this.getValidValue()); } }; return _this; } (0, _createClass2.default)(Options, [{ key: "getValidValue", value: function getValidValue() { var _this$state = this.state, goInputText = _this$state.goInputText, current = _this$state.current; // eslint-disable-next-line no-restricted-globals return !goInputText || isNaN(goInputText) ? current : Number(goInputText); } }, { key: "getPageSizeOptions", value: function getPageSizeOptions() { var _this$props2 = this.props, pageSize = _this$props2.pageSize, pageSizeOptions = _this$props2.pageSizeOptions; if (pageSizeOptions.some(function (option) { return option.toString() === pageSize.toString(); })) { return pageSizeOptions; } return pageSizeOptions.concat([pageSize.toString()]).sort(function (a, b) { // eslint-disable-next-line no-restricted-globals var numberA = isNaN(Number(a)) ? 0 : Number(a); // eslint-disable-next-line no-restricted-globals var numberB = isNaN(Number(b)) ? 0 : Number(b); return numberA - numberB; }); } }, { key: "render", value: function render() { var _this2 = this; var _this$props3 = this.props, pageSize = _this$props3.pageSize, locale = _this$props3.locale, rootPrefixCls = _this$props3.rootPrefixCls, changeSize = _this$props3.changeSize, quickGo = _this$props3.quickGo, goButton = _this$props3.goButton, selectComponentClass = _this$props3.selectComponentClass, buildOptionText = _this$props3.buildOptionText, selectPrefixCls = _this$props3.selectPrefixCls, disabled = _this$props3.disabled; var goInputText = this.state.goInputText; var prefixCls = "".concat(rootPrefixCls, "-options"); var Select = selectComponentClass; var changeSelect = null; var goInput = null; var gotoButton = null; if (!changeSize && !quickGo) { return null; } var pageSizeOptions = this.getPageSizeOptions(); if (changeSize && Select) { var options = pageSizeOptions.map(function (opt, i) { return /*#__PURE__*/_react.default.createElement(Select.Option, { key: i, value: opt.toString() }, (buildOptionText || _this2.buildOptionText)(opt)); }); changeSelect = /*#__PURE__*/_react.default.createElement(Select, { disabled: disabled, prefixCls: selectPrefixCls, showSearch: false, className: "".concat(prefixCls, "-size-changer"), optionLabelProp: "children", dropdownMatchSelectWidth: false, value: (pageSize || pageSizeOptions[0]).toString(), onChange: this.changeSize, getPopupContainer: function getPopupContainer(triggerNode) { return triggerNode.parentNode; } }, options); } if (quickGo) { if (goButton) { gotoButton = typeof goButton === 'boolean' ? /*#__PURE__*/_react.default.createElement("button", { type: "button", onClick: this.go, onKeyUp: this.go, disabled: disabled, className: "".concat(prefixCls, "-quick-jumper-button") }, locale.jump_to_confirm) : /*#__PURE__*/_react.default.createElement("span", { onClick: this.go, onKeyUp: this.go }, goButton); } goInput = /*#__PURE__*/_react.default.createElement("div", { className: "".concat(prefixCls, "-quick-jumper") }, locale.jump_to, /*#__PURE__*/_react.default.createElement("input", { disabled: disabled, type: "text", value: goInputText, onChange: this.handleChange, onKeyUp: this.go, onBlur: this.handleBlur }), locale.page, gotoButton); } return /*#__PURE__*/_react.default.createElement("li", { className: "".concat(prefixCls) }, changeSelect, goInput); } }]); return Options; }(_react.default.Component); Options.defaultProps = { pageSizeOptions: ['10', '20', '50', '100'] }; var _default = Options; exports.default = _default; },{"./KeyCode":669,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"react":"react"}],671:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); /* eslint react/prop-types: 0 */ var Pager = function Pager(props) { var _classNames; var prefixCls = "".concat(props.rootPrefixCls, "-item"); var cls = (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-").concat(props.page), (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-active"), props.active), (0, _defineProperty2.default)(_classNames, props.className, !!props.className), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-disabled"), !props.page), _classNames)); var handleClick = function handleClick() { props.onClick(props.page); }; var handleKeyPress = function handleKeyPress(e) { props.onKeyPress(e, props.onClick, props.page); }; return /*#__PURE__*/_react.default.createElement("li", { title: props.showTitle ? props.page : null, className: cls, onClick: handleClick, onKeyPress: handleKeyPress, tabIndex: "0" }, props.itemRender(props.page, 'page', /*#__PURE__*/_react.default.createElement("a", { rel: "nofollow" }, props.page))); }; var _default = Pager; exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"classnames":455,"react":"react"}],672:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _Pager = _interopRequireDefault(require("./Pager")); var _Options = _interopRequireDefault(require("./Options")); var _KeyCode = _interopRequireDefault(require("./KeyCode")); var _zh_CN = _interopRequireDefault(require("./locale/zh_CN")); /* eslint react/prop-types: 0 */ function noop() {} function isInteger(value) { return (// eslint-disable-next-line no-restricted-globals typeof value === 'number' && isFinite(value) && Math.floor(value) === value ); } function defaultItemRender(page, type, element) { return element; } function calculatePage(p, state, props) { var pageSize = typeof p === 'undefined' ? state.pageSize : p; return Math.floor((props.total - 1) / pageSize) + 1; } var Pagination = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Pagination, _React$Component); var _super = (0, _createSuper2.default)(Pagination); function Pagination(props) { var _this; (0, _classCallCheck2.default)(this, Pagination); _this = _super.call(this, props); _this.getJumpPrevPage = function () { return Math.max(1, _this.state.current - (_this.props.showLessItems ? 3 : 5)); }; _this.getJumpNextPage = function () { return Math.min(calculatePage(undefined, _this.state, _this.props), _this.state.current + (_this.props.showLessItems ? 3 : 5)); }; _this.getItemIcon = function (icon, label) { var prefixCls = _this.props.prefixCls; var iconNode = icon || /*#__PURE__*/_react.default.createElement("button", { type: "button", "aria-label": label, className: "".concat(prefixCls, "-item-link") }); if (typeof icon === 'function') { iconNode = _react.default.createElement(icon, (0, _objectSpread2.default)({}, _this.props)); } return iconNode; }; _this.savePaginationNode = function (node) { _this.paginationNode = node; }; _this.isValid = function (page) { return isInteger(page) && page !== _this.state.current; }; _this.shouldDisplayQuickJumper = function () { var _this$props = _this.props, showQuickJumper = _this$props.showQuickJumper, pageSize = _this$props.pageSize, total = _this$props.total; if (total <= pageSize) { return false; } return showQuickJumper; }; _this.handleKeyDown = function (e) { if (e.keyCode === _KeyCode.default.ARROW_UP || e.keyCode === _KeyCode.default.ARROW_DOWN) { e.preventDefault(); } }; _this.handleKeyUp = function (e) { var value = _this.getValidValue(e); var currentInputValue = _this.state.currentInputValue; if (value !== currentInputValue) { _this.setState({ currentInputValue: value }); } if (e.keyCode === _KeyCode.default.ENTER) { _this.handleChange(value); } else if (e.keyCode === _KeyCode.default.ARROW_UP) { _this.handleChange(value - 1); } else if (e.keyCode === _KeyCode.default.ARROW_DOWN) { _this.handleChange(value + 1); } }; _this.changePageSize = function (size) { var current = _this.state.current; var newCurrent = calculatePage(size, _this.state, _this.props); current = current > newCurrent ? newCurrent : current; // fix the issue: // Once 'total' is 0, 'current' in 'onShowSizeChange' is 0, which is not correct. if (newCurrent === 0) { // eslint-disable-next-line prefer-destructuring current = _this.state.current; } if (typeof size === 'number') { if (!('pageSize' in _this.props)) { _this.setState({ pageSize: size }); } if (!('current' in _this.props)) { _this.setState({ current: current, currentInputValue: current }); } } _this.props.onShowSizeChange(current, size); if ('onChange' in _this.props && _this.props.onChange) { _this.props.onChange(current, size); } }; _this.handleChange = function (p) { var disabled = _this.props.disabled; var page = p; if (_this.isValid(page) && !disabled) { var currentPage = calculatePage(undefined, _this.state, _this.props); if (page > currentPage) { page = currentPage; } else if (page < 1) { page = 1; } if (!('current' in _this.props)) { _this.setState({ current: page, currentInputValue: page }); } var pageSize = _this.state.pageSize; _this.props.onChange(page, pageSize); return page; } return _this.state.current; }; _this.prev = function () { if (_this.hasPrev()) { _this.handleChange(_this.state.current - 1); } }; _this.next = function () { if (_this.hasNext()) { _this.handleChange(_this.state.current + 1); } }; _this.jumpPrev = function () { _this.handleChange(_this.getJumpPrevPage()); }; _this.jumpNext = function () { _this.handleChange(_this.getJumpNextPage()); }; _this.hasPrev = function () { return _this.state.current > 1; }; _this.hasNext = function () { return _this.state.current < calculatePage(undefined, _this.state, _this.props); }; _this.runIfEnter = function (event, callback) { if (event.key === 'Enter' || event.charCode === 13) { for (var _len = arguments.length, restParams = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { restParams[_key - 2] = arguments[_key]; } callback.apply(void 0, restParams); } }; _this.runIfEnterPrev = function (e) { _this.runIfEnter(e, _this.prev); }; _this.runIfEnterNext = function (e) { _this.runIfEnter(e, _this.next); }; _this.runIfEnterJumpPrev = function (e) { _this.runIfEnter(e, _this.jumpPrev); }; _this.runIfEnterJumpNext = function (e) { _this.runIfEnter(e, _this.jumpNext); }; _this.handleGoTO = function (e) { if (e.keyCode === _KeyCode.default.ENTER || e.type === 'click') { _this.handleChange(_this.state.currentInputValue); } }; var hasOnChange = props.onChange !== noop; var hasCurrent = ('current' in props); if (hasCurrent && !hasOnChange) { // eslint-disable-next-line no-console console.warn('Warning: You provided a `current` prop to a Pagination component without an `onChange` handler. This will render a read-only component.'); } var _current = props.defaultCurrent; if ('current' in props) { // eslint-disable-next-line prefer-destructuring _current = props.current; } var _pageSize = props.defaultPageSize; if ('pageSize' in props) { // eslint-disable-next-line prefer-destructuring _pageSize = props.pageSize; } _current = Math.min(_current, calculatePage(_pageSize, undefined, props)); _this.state = { current: _current, currentInputValue: _current, pageSize: _pageSize }; return _this; } (0, _createClass2.default)(Pagination, [{ key: "componentDidUpdate", value: function componentDidUpdate(prevProps, prevState) { // When current page change, fix focused style of prev item // A hacky solution of https://github.com/ant-design/ant-design/issues/8948 var prefixCls = this.props.prefixCls; if (prevState.current !== this.state.current && this.paginationNode) { var lastCurrentNode = this.paginationNode.querySelector(".".concat(prefixCls, "-item-").concat(prevState.current)); if (lastCurrentNode && document.activeElement === lastCurrentNode) { lastCurrentNode.blur(); } } } }, { key: "getValidValue", value: function getValidValue(e) { var inputValue = e.target.value; var allPages = calculatePage(undefined, this.state, this.props); var currentInputValue = this.state.currentInputValue; var value; if (inputValue === '') { value = inputValue; // eslint-disable-next-line no-restricted-globals } else if (isNaN(Number(inputValue))) { value = currentInputValue; } else if (inputValue >= allPages) { value = allPages; } else { value = Number(inputValue); } return value; } }, { key: "getShowSizeChanger", value: function getShowSizeChanger() { var _this$props2 = this.props, showSizeChanger = _this$props2.showSizeChanger, total = _this$props2.total, totalBoundaryShowSizeChanger = _this$props2.totalBoundaryShowSizeChanger; if (typeof showSizeChanger !== 'undefined') { return showSizeChanger; } return total > totalBoundaryShowSizeChanger; } }, { key: "renderPrev", value: function renderPrev(prevPage) { var _this$props3 = this.props, prevIcon = _this$props3.prevIcon, itemRender = _this$props3.itemRender; var prevButton = itemRender(prevPage, 'prev', this.getItemIcon(prevIcon, 'prev page')); var disabled = !this.hasPrev(); return (0, _react.isValidElement)(prevButton) ? (0, _react.cloneElement)(prevButton, { disabled: disabled }) : prevButton; } }, { key: "renderNext", value: function renderNext(nextPage) { var _this$props4 = this.props, nextIcon = _this$props4.nextIcon, itemRender = _this$props4.itemRender; var nextButton = itemRender(nextPage, 'next', this.getItemIcon(nextIcon, 'next page')); var disabled = !this.hasNext(); return (0, _react.isValidElement)(nextButton) ? (0, _react.cloneElement)(nextButton, { disabled: disabled }) : nextButton; } }, { key: "render", value: function render() { var _this2 = this; var _this$props5 = this.props, prefixCls = _this$props5.prefixCls, className = _this$props5.className, style = _this$props5.style, disabled = _this$props5.disabled, hideOnSinglePage = _this$props5.hideOnSinglePage, total = _this$props5.total, locale = _this$props5.locale, showQuickJumper = _this$props5.showQuickJumper, showLessItems = _this$props5.showLessItems, showTitle = _this$props5.showTitle, showTotal = _this$props5.showTotal, simple = _this$props5.simple, itemRender = _this$props5.itemRender, showPrevNextJumpers = _this$props5.showPrevNextJumpers, jumpPrevIcon = _this$props5.jumpPrevIcon, jumpNextIcon = _this$props5.jumpNextIcon, selectComponentClass = _this$props5.selectComponentClass, selectPrefixCls = _this$props5.selectPrefixCls, pageSizeOptions = _this$props5.pageSizeOptions; var _this$state = this.state, current = _this$state.current, pageSize = _this$state.pageSize, currentInputValue = _this$state.currentInputValue; // When hideOnSinglePage is true and there is only 1 page, hide the pager if (hideOnSinglePage === true && total <= pageSize) { return null; } var allPages = calculatePage(undefined, this.state, this.props); var pagerList = []; var jumpPrev = null; var jumpNext = null; var firstPager = null; var lastPager = null; var gotoButton = null; var goButton = showQuickJumper && showQuickJumper.goButton; var pageBufferSize = showLessItems ? 1 : 2; var prevPage = current - 1 > 0 ? current - 1 : 0; var nextPage = current + 1 < allPages ? current + 1 : allPages; var dataOrAriaAttributeProps = Object.keys(this.props).reduce(function (prev, key) { if (key.substr(0, 5) === 'data-' || key.substr(0, 5) === 'aria-' || key === 'role') { // eslint-disable-next-line no-param-reassign prev[key] = _this2.props[key]; } return prev; }, {}); if (simple) { if (goButton) { if (typeof goButton === 'boolean') { gotoButton = /*#__PURE__*/_react.default.createElement("button", { type: "button", onClick: this.handleGoTO, onKeyUp: this.handleGoTO }, locale.jump_to_confirm); } else { gotoButton = /*#__PURE__*/_react.default.createElement("span", { onClick: this.handleGoTO, onKeyUp: this.handleGoTO }, goButton); } gotoButton = /*#__PURE__*/_react.default.createElement("li", { title: showTitle ? "".concat(locale.jump_to).concat(current, "/").concat(allPages) : null, className: "".concat(prefixCls, "-simple-pager") }, gotoButton); } return /*#__PURE__*/_react.default.createElement("ul", (0, _extends2.default)({ className: (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-simple"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled"), disabled), className), style: style, ref: this.savePaginationNode }, dataOrAriaAttributeProps), /*#__PURE__*/_react.default.createElement("li", { title: showTitle ? locale.prev_page : null, onClick: this.prev, tabIndex: this.hasPrev() ? 0 : null, onKeyPress: this.runIfEnterPrev, className: (0, _classnames.default)("".concat(prefixCls, "-prev"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled"), !this.hasPrev())), "aria-disabled": !this.hasPrev() }, this.renderPrev(prevPage)), /*#__PURE__*/_react.default.createElement("li", { title: showTitle ? "".concat(current, "/").concat(allPages) : null, className: "".concat(prefixCls, "-simple-pager") }, /*#__PURE__*/_react.default.createElement("input", { type: "text", value: currentInputValue, disabled: disabled, onKeyDown: this.handleKeyDown, onKeyUp: this.handleKeyUp, onChange: this.handleKeyUp, size: "3" }), /*#__PURE__*/_react.default.createElement("span", { className: "".concat(prefixCls, "-slash") }, "/"), allPages), /*#__PURE__*/_react.default.createElement("li", { title: showTitle ? locale.next_page : null, onClick: this.next, tabIndex: this.hasPrev() ? 0 : null, onKeyPress: this.runIfEnterNext, className: (0, _classnames.default)("".concat(prefixCls, "-next"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled"), !this.hasNext())), "aria-disabled": !this.hasNext() }, this.renderNext(nextPage)), gotoButton); } if (allPages <= 3 + pageBufferSize * 2) { var pagerProps = { locale: locale, rootPrefixCls: prefixCls, onClick: this.handleChange, onKeyPress: this.runIfEnter, showTitle: showTitle, itemRender: itemRender }; if (!allPages) { pagerList.push( /*#__PURE__*/_react.default.createElement(_Pager.default, (0, _extends2.default)({}, pagerProps, { key: "noPager", page: allPages, className: "".concat(prefixCls, "-disabled") }))); } for (var i = 1; i <= allPages; i += 1) { var active = current === i; pagerList.push( /*#__PURE__*/_react.default.createElement(_Pager.default, (0, _extends2.default)({}, pagerProps, { key: i, page: i, active: active }))); } } else { var prevItemTitle = showLessItems ? locale.prev_3 : locale.prev_5; var nextItemTitle = showLessItems ? locale.next_3 : locale.next_5; if (showPrevNextJumpers) { jumpPrev = /*#__PURE__*/_react.default.createElement("li", { title: showTitle ? prevItemTitle : null, key: "prev", onClick: this.jumpPrev, tabIndex: "0", onKeyPress: this.runIfEnterJumpPrev, className: (0, _classnames.default)("".concat(prefixCls, "-jump-prev"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-jump-prev-custom-icon"), !!jumpPrevIcon)) }, itemRender(this.getJumpPrevPage(), 'jump-prev', this.getItemIcon(jumpPrevIcon, 'prev page'))); jumpNext = /*#__PURE__*/_react.default.createElement("li", { title: showTitle ? nextItemTitle : null, key: "next", tabIndex: "0", onClick: this.jumpNext, onKeyPress: this.runIfEnterJumpNext, className: (0, _classnames.default)("".concat(prefixCls, "-jump-next"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-jump-next-custom-icon"), !!jumpNextIcon)) }, itemRender(this.getJumpNextPage(), 'jump-next', this.getItemIcon(jumpNextIcon, 'next page'))); } lastPager = /*#__PURE__*/_react.default.createElement(_Pager.default, { locale: locale, last: true, rootPrefixCls: prefixCls, onClick: this.handleChange, onKeyPress: this.runIfEnter, key: allPages, page: allPages, active: false, showTitle: showTitle, itemRender: itemRender }); firstPager = /*#__PURE__*/_react.default.createElement(_Pager.default, { locale: locale, rootPrefixCls: prefixCls, onClick: this.handleChange, onKeyPress: this.runIfEnter, key: 1, page: 1, active: false, showTitle: showTitle, itemRender: itemRender }); var left = Math.max(1, current - pageBufferSize); var right = Math.min(current + pageBufferSize, allPages); if (current - 1 <= pageBufferSize) { right = 1 + pageBufferSize * 2; } if (allPages - current <= pageBufferSize) { left = allPages - pageBufferSize * 2; } for (var _i = left; _i <= right; _i += 1) { var _active = current === _i; pagerList.push( /*#__PURE__*/_react.default.createElement(_Pager.default, { locale: locale, rootPrefixCls: prefixCls, onClick: this.handleChange, onKeyPress: this.runIfEnter, key: _i, page: _i, active: _active, showTitle: showTitle, itemRender: itemRender })); } if (current - 1 >= pageBufferSize * 2 && current !== 1 + 2) { pagerList[0] = (0, _react.cloneElement)(pagerList[0], { className: "".concat(prefixCls, "-item-after-jump-prev") }); pagerList.unshift(jumpPrev); } if (allPages - current >= pageBufferSize * 2 && current !== allPages - 2) { pagerList[pagerList.length - 1] = (0, _react.cloneElement)(pagerList[pagerList.length - 1], { className: "".concat(prefixCls, "-item-before-jump-next") }); pagerList.push(jumpNext); } if (left !== 1) { pagerList.unshift(firstPager); } if (right !== allPages) { pagerList.push(lastPager); } } var totalText = null; if (showTotal) { totalText = /*#__PURE__*/_react.default.createElement("li", { className: "".concat(prefixCls, "-total-text") }, showTotal(total, [total === 0 ? 0 : (current - 1) * pageSize + 1, current * pageSize > total ? total : current * pageSize])); } var prevDisabled = !this.hasPrev() || !allPages; var nextDisabled = !this.hasNext() || !allPages; return /*#__PURE__*/_react.default.createElement("ul", (0, _extends2.default)({ className: (0, _classnames.default)(prefixCls, className, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled"), disabled)), style: style, unselectable: "unselectable", ref: this.savePaginationNode }, dataOrAriaAttributeProps), totalText, /*#__PURE__*/_react.default.createElement("li", { title: showTitle ? locale.prev_page : null, onClick: this.prev, tabIndex: prevDisabled ? null : 0, onKeyPress: this.runIfEnterPrev, className: (0, _classnames.default)("".concat(prefixCls, "-prev"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled"), prevDisabled)), "aria-disabled": prevDisabled }, this.renderPrev(prevPage)), pagerList, /*#__PURE__*/_react.default.createElement("li", { title: showTitle ? locale.next_page : null, onClick: this.next, tabIndex: nextDisabled ? null : 0, onKeyPress: this.runIfEnterNext, className: (0, _classnames.default)("".concat(prefixCls, "-next"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled"), nextDisabled)), "aria-disabled": nextDisabled }, this.renderNext(nextPage)), /*#__PURE__*/_react.default.createElement(_Options.default, { disabled: disabled, locale: locale, rootPrefixCls: prefixCls, selectComponentClass: selectComponentClass, selectPrefixCls: selectPrefixCls, changeSize: this.getShowSizeChanger() ? this.changePageSize : null, current: current, pageSize: pageSize, pageSizeOptions: pageSizeOptions, quickGo: this.shouldDisplayQuickJumper() ? this.handleChange : null, goButton: goButton })); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, prevState) { var newState = {}; if ('current' in props) { newState.current = props.current; if (props.current !== prevState.current) { newState.currentInputValue = newState.current; } } if ('pageSize' in props && props.pageSize !== prevState.pageSize) { var current = prevState.current; var newCurrent = calculatePage(props.pageSize, prevState, props); current = current > newCurrent ? newCurrent : current; if (!('current' in props)) { newState.current = current; newState.currentInputValue = current; } newState.pageSize = props.pageSize; } return newState; } }]); return Pagination; }(_react.default.Component); Pagination.defaultProps = { defaultCurrent: 1, total: 0, defaultPageSize: 10, onChange: noop, className: '', selectPrefixCls: 'rc-select', prefixCls: 'rc-pagination', selectComponentClass: null, hideOnSinglePage: false, showPrevNextJumpers: true, showQuickJumper: false, showLessItems: false, showTitle: true, onShowSizeChange: noop, locale: _zh_CN.default, style: {}, itemRender: defaultItemRender, totalBoundaryShowSizeChanger: 50 }; var _default = Pagination; exports.default = _default; },{"./KeyCode":669,"./Options":670,"./Pager":671,"./locale/zh_CN":675,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"react":"react"}],673:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function get() { return _Pagination.default; } }); var _Pagination = _interopRequireDefault(require("./Pagination")); },{"./Pagination":672,"@babel/runtime/helpers/interopRequireDefault":192}],674:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _default = { // Options.jsx items_per_page: '/ page', jump_to: 'Go to', jump_to_confirm: 'confirm', page: '', // Pagination.jsx prev_page: 'Previous Page', next_page: 'Next Page', prev_5: 'Previous 5 Pages', next_5: 'Next 5 Pages', prev_3: 'Previous 3 Pages', next_3: 'Next 3 Pages' }; exports.default = _default; },{}],675:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _default = { // Options.jsx items_per_page: '条/页', jump_to: '跳至', jump_to_confirm: '确定', page: '页', // Pagination.jsx prev_page: '上一页', next_page: '下一页', prev_5: '向前 5 页', next_5: '向后 5 页', prev_3: '向前 3 页', next_3: '向后 3 页' }; exports.default = _default; },{}],676:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var PanelContext = React.createContext({}); var _default = PanelContext; exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],677:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _PickerPanel = _interopRequireDefault(require("./PickerPanel")); var _PickerTrigger = _interopRequireDefault(require("./PickerTrigger")); var _dateUtil = require("./utils/dateUtil"); var _miscUtil = _interopRequireWildcard(require("./utils/miscUtil")); var _PanelContext = _interopRequireDefault(require("./PanelContext")); var _uiUtil = require("./utils/uiUtil"); var _usePickerInput3 = _interopRequireDefault(require("./hooks/usePickerInput")); var _useTextValueMapping3 = _interopRequireDefault(require("./hooks/useTextValueMapping")); var _useValueTexts3 = _interopRequireDefault(require("./hooks/useValueTexts")); var _useHoverValue3 = _interopRequireDefault(require("./hooks/useHoverValue")); /** * Removed: * - getCalendarContainer: use `getPopupContainer` instead * - onOk * * New Feature: * - picker * - allowEmpty * - selectable * * Tips: Should add faq about `datetime` mode with `defaultValue` */ function InnerPicker(props) { var _classNames2; var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-picker' : _props$prefixCls, id = props.id, tabIndex = props.tabIndex, style = props.style, className = props.className, dropdownClassName = props.dropdownClassName, dropdownAlign = props.dropdownAlign, popupStyle = props.popupStyle, transitionName = props.transitionName, generateConfig = props.generateConfig, locale = props.locale, inputReadOnly = props.inputReadOnly, allowClear = props.allowClear, autoFocus = props.autoFocus, showTime = props.showTime, _props$picker = props.picker, picker = _props$picker === void 0 ? 'date' : _props$picker, format = props.format, use12Hours = props.use12Hours, value = props.value, defaultValue = props.defaultValue, open = props.open, defaultOpen = props.defaultOpen, defaultOpenValue = props.defaultOpenValue, suffixIcon = props.suffixIcon, clearIcon = props.clearIcon, disabled = props.disabled, disabledDate = props.disabledDate, placeholder = props.placeholder, getPopupContainer = props.getPopupContainer, pickerRef = props.pickerRef, panelRender = props.panelRender, onChange = props.onChange, onOpenChange = props.onOpenChange, onFocus = props.onFocus, onBlur = props.onBlur, onMouseDown = props.onMouseDown, onMouseUp = props.onMouseUp, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onContextMenu = props.onContextMenu, onClick = props.onClick, direction = props.direction, _props$autoComplete = props.autoComplete, autoComplete = _props$autoComplete === void 0 ? 'off' : _props$autoComplete; var inputRef = React.useRef(null); var needConfirmButton = picker === 'date' && !!showTime || picker === 'time'; // ============================= State ============================= var formatList = (0, _miscUtil.toArray)((0, _uiUtil.getDefaultFormat)(format, picker, showTime, use12Hours)); // Panel ref var panelDivRef = React.useRef(null); var inputDivRef = React.useRef(null); // Real value var _useMergedState = (0, _useMergedState5.default)(null, { value: value, defaultValue: defaultValue }), _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2), mergedValue = _useMergedState2[0], setInnerValue = _useMergedState2[1]; // Selected value var _React$useState = React.useState(mergedValue), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), selectedValue = _React$useState2[0], setSelectedValue = _React$useState2[1]; // Operation ref var operationRef = React.useRef(null); // Open var _useMergedState3 = (0, _useMergedState5.default)(false, { value: open, defaultValue: defaultOpen, postState: function postState(postOpen) { return disabled ? false : postOpen; }, onChange: function onChange(newOpen) { if (onOpenChange) { onOpenChange(newOpen); } if (!newOpen && operationRef.current && operationRef.current.onClose) { operationRef.current.onClose(); } } }), _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2), mergedOpen = _useMergedState4[0], triggerInnerOpen = _useMergedState4[1]; // ============================= Text ============================== var _useValueTexts = (0, _useValueTexts3.default)(selectedValue, { formatList: formatList, generateConfig: generateConfig, locale: locale }), _useValueTexts2 = (0, _slicedToArray2.default)(_useValueTexts, 2), valueTexts = _useValueTexts2[0], firstValueText = _useValueTexts2[1]; var _useTextValueMapping = (0, _useTextValueMapping3.default)({ valueTexts: valueTexts, onTextChange: function onTextChange(newText) { var inputDate = generateConfig.locale.parse(locale.locale, newText, formatList); if (inputDate && (!disabledDate || !disabledDate(inputDate))) { setSelectedValue(inputDate); } } }), _useTextValueMapping2 = (0, _slicedToArray2.default)(_useTextValueMapping, 3), text = _useTextValueMapping2[0], triggerTextChange = _useTextValueMapping2[1], resetText = _useTextValueMapping2[2]; // ============================ Trigger ============================ var triggerChange = function triggerChange(newValue) { setSelectedValue(newValue); setInnerValue(newValue); if (onChange && !(0, _dateUtil.isEqual)(generateConfig, mergedValue, newValue)) { onChange(newValue, newValue ? generateConfig.locale.format(locale.locale, newValue, formatList[0]) : ''); } }; var triggerOpen = function triggerOpen(newOpen) { if (disabled && newOpen) { return; } triggerInnerOpen(newOpen); }; var forwardKeyDown = function forwardKeyDown(e) { if (mergedOpen && operationRef.current && operationRef.current.onKeyDown) { // Let popup panel handle keyboard return operationRef.current.onKeyDown(e); } /* istanbul ignore next */ /* eslint-disable no-lone-blocks */ { (0, _warning.default)(false, 'Picker not correct forward KeyDown operation. Please help to fire issue about this.'); return false; } }; var onInternalMouseUp = function onInternalMouseUp() { if (onMouseUp) { onMouseUp.apply(void 0, arguments); } if (inputRef.current) { inputRef.current.focus(); triggerOpen(true); } }; // ============================= Input ============================= var _usePickerInput = (0, _usePickerInput3.default)({ blurToCancel: needConfirmButton, open: mergedOpen, value: text, triggerOpen: triggerOpen, forwardKeyDown: forwardKeyDown, isClickOutside: function isClickOutside(target) { return !(0, _uiUtil.elementsContains)([panelDivRef.current, inputDivRef.current], target); }, onSubmit: function onSubmit() { if (disabledDate && disabledDate(selectedValue)) { return false; } triggerChange(selectedValue); triggerOpen(false); resetText(); return true; }, onCancel: function onCancel() { triggerOpen(false); setSelectedValue(mergedValue); resetText(); }, onFocus: onFocus, onBlur: onBlur }), _usePickerInput2 = (0, _slicedToArray2.default)(_usePickerInput, 2), inputProps = _usePickerInput2[0], _usePickerInput2$ = _usePickerInput2[1], focused = _usePickerInput2$.focused, typing = _usePickerInput2$.typing; // ============================= Sync ============================== // Close should sync back with text value React.useEffect(function () { if (!mergedOpen) { setSelectedValue(mergedValue); if (!valueTexts.length || valueTexts[0] === '') { triggerTextChange(''); } else if (firstValueText !== text) { resetText(); } } }, [mergedOpen, valueTexts]); // Change picker should sync back with text value React.useEffect(function () { if (!mergedOpen) { resetText(); } }, [picker]); // Sync innerValue with control mode React.useEffect(function () { // Sync select value setSelectedValue(mergedValue); }, [mergedValue]); // ============================ Private ============================ if (pickerRef) { pickerRef.current = { focus: function focus() { if (inputRef.current) { inputRef.current.focus(); } }, blur: function blur() { if (inputRef.current) { inputRef.current.blur(); } } }; } // ============================= Panel ============================= var panelProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, { className: undefined, style: undefined, pickerValue: undefined, onPickerValueChange: undefined }); var panelNode = React.createElement(_PickerPanel.default, Object.assign({}, panelProps, { generateConfig: generateConfig, className: (0, _classnames.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-panel-focused"), !typing)), value: selectedValue, locale: locale, tabIndex: -1, onChange: setSelectedValue, direction: direction })); if (panelRender) { panelNode = panelRender(panelNode); } var panel = React.createElement("div", { className: "".concat(prefixCls, "-panel-container"), onMouseDown: function onMouseDown(e) { e.preventDefault(); } }, panelNode); var suffixNode; if (suffixIcon) { suffixNode = React.createElement("span", { className: "".concat(prefixCls, "-suffix") }, suffixIcon); } var clearNode; if (allowClear && mergedValue && !disabled) { clearNode = React.createElement("span", { onMouseDown: function onMouseDown(e) { e.preventDefault(); e.stopPropagation(); }, onMouseUp: function onMouseUp(e) { e.preventDefault(); e.stopPropagation(); triggerChange(null); triggerOpen(false); }, className: "".concat(prefixCls, "-clear") }, clearIcon || React.createElement("span", { className: "".concat(prefixCls, "-clear-btn") })); } // ============================ Warning ============================ if (process.env.NODE_ENV !== 'production') { (0, _warning.default)(!defaultOpenValue, '`defaultOpenValue` may confuse user for the current value status. Please use `defaultValue` instead.'); } // ============================ Return ============================= var onContextSelect = function onContextSelect(date, type) { if (type === 'submit' || type !== 'key' && !needConfirmButton) { // triggerChange will also update selected values triggerChange(date); triggerOpen(false); } }; var popupPlacement = direction === 'rtl' ? 'bottomRight' : 'bottomLeft'; var _useHoverValue = (0, _useHoverValue3.default)(text, { formatList: formatList, generateConfig: generateConfig, locale: locale }), _useHoverValue2 = (0, _slicedToArray2.default)(_useHoverValue, 3), hoverValue = _useHoverValue2[0], onEnter = _useHoverValue2[1], onLeave = _useHoverValue2[2]; return React.createElement(_PanelContext.default.Provider, { value: { operationRef: operationRef, hideHeader: picker === 'time', panelRef: panelDivRef, onSelect: onContextSelect, open: mergedOpen, defaultOpenValue: defaultOpenValue, onDateMouseEnter: onEnter, onDateMouseLeave: onLeave } }, React.createElement(_PickerTrigger.default, { visible: mergedOpen, popupElement: panel, popupStyle: popupStyle, prefixCls: prefixCls, dropdownClassName: dropdownClassName, dropdownAlign: dropdownAlign, getPopupContainer: getPopupContainer, transitionName: transitionName, popupPlacement: popupPlacement, direction: direction }, React.createElement("div", { className: (0, _classnames.default)(prefixCls, className, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-focused"), focused), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames2)), style: style, onMouseDown: onMouseDown, onMouseUp: onInternalMouseUp, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onContextMenu: onContextMenu, onClick: onClick }, React.createElement("div", { className: (0, _classnames.default)("".concat(prefixCls, "-input"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-input-placeholder"), !!hoverValue)), ref: inputDivRef }, React.createElement("input", Object.assign({ id: id, tabIndex: tabIndex, disabled: disabled, readOnly: inputReadOnly || !typing, value: hoverValue || text, onChange: function onChange(e) { triggerTextChange(e.target.value); }, autoFocus: autoFocus, placeholder: placeholder, ref: inputRef, title: text }, inputProps, { size: (0, _uiUtil.getInputSize)(picker, formatList[0]) }, (0, _miscUtil.default)(props), { autoComplete: autoComplete })), suffixNode, clearNode)))); } // Wrap with class component to enable pass generic with instance method var Picker = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Picker, _React$Component); var _super = (0, _createSuper2.default)(Picker); function Picker() { var _this; (0, _classCallCheck2.default)(this, Picker); _this = _super.apply(this, arguments); _this.pickerRef = React.createRef(); _this.focus = function () { if (_this.pickerRef.current) { _this.pickerRef.current.focus(); } }; _this.blur = function () { if (_this.pickerRef.current) { _this.pickerRef.current.blur(); } }; return _this; } (0, _createClass2.default)(Picker, [{ key: "render", value: function render() { return React.createElement(InnerPicker, Object.assign({}, this.props, { pickerRef: this.pickerRef })); } }]); return Picker; }(React.Component); var _default = Picker; exports.default = _default; }).call(this,require('_process')) },{"./PanelContext":676,"./PickerPanel":678,"./PickerTrigger":679,"./hooks/useHoverValue":684,"./hooks/usePickerInput":685,"./hooks/useTextValueMapping":688,"./hooks/useValueTexts":689,"./utils/dateUtil":715,"./utils/miscUtil":718,"./utils/uiUtil":720,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"_process":1,"classnames":455,"rc-util/lib/hooks/useMergedState":871,"rc-util/lib/warning":879,"react":"react"}],678:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _useMergedState7 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _TimePanel = _interopRequireDefault(require("./panels/TimePanel")); var _DatetimePanel = _interopRequireDefault(require("./panels/DatetimePanel")); var _DatePanel = _interopRequireDefault(require("./panels/DatePanel")); var _WeekPanel = _interopRequireDefault(require("./panels/WeekPanel")); var _MonthPanel = _interopRequireDefault(require("./panels/MonthPanel")); var _QuarterPanel = _interopRequireDefault(require("./panels/QuarterPanel")); var _YearPanel = _interopRequireDefault(require("./panels/YearPanel")); var _DecadePanel = _interopRequireDefault(require("./panels/DecadePanel")); var _dateUtil = require("./utils/dateUtil"); var _PanelContext = _interopRequireDefault(require("./PanelContext")); var _uiUtil = require("./utils/uiUtil"); var _RangeContext = _interopRequireDefault(require("./RangeContext")); var _getExtraFooter = _interopRequireDefault(require("./utils/getExtraFooter")); var _getRanges = _interopRequireDefault(require("./utils/getRanges")); var _timeUtil = require("./utils/timeUtil"); /* eslint-disable jsx-a11y/no-noninteractive-tabindex */ /** * Logic: * When `mode` === `picker`, * click will trigger `onSelect` (if value changed trigger `onChange` also). * Panel change will not trigger `onSelect` but trigger `onPanelChange` */ function PickerPanel(props) { var _classNames; var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-picker' : _props$prefixCls, className = props.className, style = props.style, locale = props.locale, generateConfig = props.generateConfig, value = props.value, defaultValue = props.defaultValue, pickerValue = props.pickerValue, defaultPickerValue = props.defaultPickerValue, disabledDate = props.disabledDate, mode = props.mode, _props$picker = props.picker, picker = _props$picker === void 0 ? 'date' : _props$picker, _props$tabIndex = props.tabIndex, tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex, showNow = props.showNow, showTime = props.showTime, showToday = props.showToday, renderExtraFooter = props.renderExtraFooter, hideHeader = props.hideHeader, onSelect = props.onSelect, onChange = props.onChange, onPanelChange = props.onPanelChange, onMouseDown = props.onMouseDown, onPickerValueChange = props.onPickerValueChange, _onOk = props.onOk, components = props.components, direction = props.direction, _props$hourStep = props.hourStep, hourStep = _props$hourStep === void 0 ? 1 : _props$hourStep, _props$minuteStep = props.minuteStep, minuteStep = _props$minuteStep === void 0 ? 1 : _props$minuteStep, _props$secondStep = props.secondStep, secondStep = _props$secondStep === void 0 ? 1 : _props$secondStep; var needConfirmButton = picker === 'date' && !!showTime || picker === 'time'; var isHourStepValid = 24 % hourStep === 0; var isMinuteStepValid = 60 % minuteStep === 0; var isSecondStepValid = 60 % secondStep === 0; if (process.env.NODE_ENV !== 'production') { (0, _warning.default)(!value || generateConfig.isValidate(value), 'Invalidate date pass to `value`.'); (0, _warning.default)(!value || generateConfig.isValidate(value), 'Invalidate date pass to `defaultValue`.'); (0, _warning.default)(isHourStepValid, "`hourStep` ".concat(hourStep, " is invalid. It should be a factor of 24.")); (0, _warning.default)(isMinuteStepValid, "`minuteStep` ".concat(minuteStep, " is invalid. It should be a factor of 60.")); (0, _warning.default)(isSecondStepValid, "`secondStep` ".concat(secondStep, " is invalid. It should be a factor of 60.")); } // ============================ State ============================= var panelContext = React.useContext(_PanelContext.default); var operationRef = panelContext.operationRef, panelDivRef = panelContext.panelRef, onContextSelect = panelContext.onSelect, hideRanges = panelContext.hideRanges, defaultOpenValue = panelContext.defaultOpenValue; var _React$useContext = React.useContext(_RangeContext.default), inRange = _React$useContext.inRange, panelPosition = _React$useContext.panelPosition, rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue; var panelRef = React.useRef({}); // Handle init logic var initRef = React.useRef(true); // Value var _useMergedState = (0, _useMergedState7.default)(null, { value: value, defaultValue: defaultValue, postState: function postState(val) { if (!val && defaultOpenValue && picker === 'time') { return defaultOpenValue; } return val; } }), _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2), mergedValue = _useMergedState2[0], setInnerValue = _useMergedState2[1]; // View date control var _useMergedState3 = (0, _useMergedState7.default)(null, { value: pickerValue, defaultValue: defaultPickerValue || mergedValue, postState: function postState(date) { return date || generateConfig.getNow(); } }), _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2), viewDate = _useMergedState4[0], setInnerViewDate = _useMergedState4[1]; var setViewDate = function setViewDate(date) { setInnerViewDate(date); if (onPickerValueChange) { onPickerValueChange(date); } }; // Panel control var getInternalNextMode = function getInternalNextMode(nextMode) { var getNextMode = _uiUtil.PickerModeMap[picker]; if (getNextMode) { return getNextMode(nextMode); } return nextMode; }; // Save panel is changed from which panel var _useMergedState5 = (0, _useMergedState7.default)(function () { if (picker === 'time') { return 'time'; } return getInternalNextMode('date'); }, { value: mode }), _useMergedState6 = (0, _slicedToArray2.default)(_useMergedState5, 2), mergedMode = _useMergedState6[0], setInnerMode = _useMergedState6[1]; React.useEffect(function () { setInnerMode(picker); }, [picker]); var _React$useState = React.useState(function () { return mergedMode; }), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), sourceMode = _React$useState2[0], setSourceMode = _React$useState2[1]; var onInternalPanelChange = function onInternalPanelChange(newMode, viewValue) { var nextMode = getInternalNextMode(newMode || mergedMode); setSourceMode(mergedMode); setInnerMode(nextMode); if (onPanelChange && (mergedMode !== nextMode || (0, _dateUtil.isEqual)(generateConfig, viewDate, viewDate))) { onPanelChange(viewValue, nextMode); } }; var triggerSelect = function triggerSelect(date, type) { var forceTriggerSelect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; if (mergedMode === picker || forceTriggerSelect) { setInnerValue(date); if (onSelect) { onSelect(date); } if (onContextSelect) { onContextSelect(date, type); } if (onChange && !(0, _dateUtil.isEqual)(generateConfig, date, mergedValue)) { onChange(date); } } }; // ========================= Interactive ========================== var onInternalKeyDown = function onInternalKeyDown(e) { if (panelRef.current && panelRef.current.onKeyDown) { if ([_KeyCode.default.LEFT, _KeyCode.default.RIGHT, _KeyCode.default.UP, _KeyCode.default.DOWN, _KeyCode.default.PAGE_UP, _KeyCode.default.PAGE_DOWN, _KeyCode.default.ENTER].includes(e.which)) { e.preventDefault(); } return panelRef.current.onKeyDown(e); } /* istanbul ignore next */ /* eslint-disable no-lone-blocks */ { (0, _warning.default)(false, 'Panel not correct handle keyDown event. Please help to fire issue about this.'); return false; } /* eslint-enable no-lone-blocks */ }; var onInternalBlur = function onInternalBlur(e) { if (panelRef.current && panelRef.current.onBlur) { panelRef.current.onBlur(e); } }; if (operationRef && panelPosition !== 'right') { operationRef.current = { onKeyDown: onInternalKeyDown, onClose: function onClose() { if (panelRef.current && panelRef.current.onClose) { panelRef.current.onClose(); } } }; } // ============================ Effect ============================ React.useEffect(function () { if (value && !initRef.current) { setInnerViewDate(value); } }, [value]); React.useEffect(function () { initRef.current = false; }, []); // ============================ Panels ============================ var panelNode; var pickerProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, { operationRef: panelRef, prefixCls: prefixCls, viewDate: viewDate, value: mergedValue, onViewDateChange: setViewDate, sourceMode: sourceMode, onPanelChange: onInternalPanelChange, disabledDate: mergedMode !== 'decade' ? disabledDate : undefined }); delete pickerProps.onChange; delete pickerProps.onSelect; switch (mergedMode) { case 'decade': panelNode = React.createElement(_DecadePanel.default, Object.assign({}, pickerProps, { onSelect: function onSelect(date, type) { setViewDate(date); triggerSelect(date, type); } })); break; case 'year': panelNode = React.createElement(_YearPanel.default, Object.assign({}, pickerProps, { onSelect: function onSelect(date, type) { setViewDate(date); triggerSelect(date, type); } })); break; case 'month': panelNode = React.createElement(_MonthPanel.default, Object.assign({}, pickerProps, { onSelect: function onSelect(date, type) { setViewDate(date); triggerSelect(date, type); } })); break; case 'quarter': panelNode = React.createElement(_QuarterPanel.default, Object.assign({}, pickerProps, { onSelect: function onSelect(date, type) { setViewDate(date); triggerSelect(date, type); } })); break; case 'week': panelNode = React.createElement(_WeekPanel.default, Object.assign({}, pickerProps, { onSelect: function onSelect(date, type) { setViewDate(date); triggerSelect(date, type); } })); break; case 'time': delete pickerProps.showTime; panelNode = React.createElement(_TimePanel.default, Object.assign({}, pickerProps, (0, _typeof2.default)(showTime) === 'object' ? showTime : null, { onSelect: function onSelect(date, type) { setViewDate(date); triggerSelect(date, type); } })); break; default: if (showTime) { panelNode = React.createElement(_DatetimePanel.default, Object.assign({}, pickerProps, { onSelect: function onSelect(date, type) { setViewDate(date); triggerSelect(date, type); } })); } else { panelNode = React.createElement(_DatePanel.default, Object.assign({}, pickerProps, { onSelect: function onSelect(date, type) { setViewDate(date); triggerSelect(date, type); } })); } } // ============================ Footer ============================ var extraFooter; var rangesNode; var onNow = function onNow() { var now = generateConfig.getNow(); var lowerBoundTime = (0, _timeUtil.getLowerBoundTime)(generateConfig.getHour(now), generateConfig.getMinute(now), generateConfig.getSecond(now), isHourStepValid ? hourStep : 1, isMinuteStepValid ? minuteStep : 1, isSecondStepValid ? secondStep : 1); var adjustedNow = (0, _timeUtil.setTime)(generateConfig, now, lowerBoundTime[0], // hour lowerBoundTime[1], // minute lowerBoundTime[2]); triggerSelect(adjustedNow, 'submit'); }; if (!hideRanges) { extraFooter = (0, _getExtraFooter.default)(prefixCls, mergedMode, renderExtraFooter); rangesNode = (0, _getRanges.default)({ prefixCls: prefixCls, components: components, needConfirmButton: needConfirmButton, okDisabled: !mergedValue || disabledDate && disabledDate(mergedValue), locale: locale, showNow: showNow, onNow: needConfirmButton && onNow, onOk: function onOk() { if (mergedValue) { triggerSelect(mergedValue, 'submit', true); if (_onOk) { _onOk(mergedValue); } } } }); } var todayNode; if (showToday && mergedMode === 'date' && picker === 'date' && !showTime) { var now = generateConfig.getNow(); var todayCls = "".concat(prefixCls, "-today-btn"); var disabled = disabledDate && disabledDate(now); todayNode = React.createElement("a", { className: (0, _classnames.default)(todayCls, disabled && "".concat(todayCls, "-disabled")), "aria-disabled": disabled, onClick: function onClick() { if (!disabled) { triggerSelect(now, 'mouse', true); } } }, locale.today); } return React.createElement(_PanelContext.default.Provider, { value: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, panelContext), {}, { hideHeader: 'hideHeader' in props ? hideHeader : panelContext.hideHeader, hidePrevBtn: inRange && panelPosition === 'right', hideNextBtn: inRange && panelPosition === 'left' }) }, React.createElement("div", { tabIndex: tabIndex, className: (0, _classnames.default)("".concat(prefixCls, "-panel"), className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-panel-has-range"), rangedValue && rangedValue[0] && rangedValue[1]), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-panel-has-range-hover"), hoverRangedValue && hoverRangedValue[0] && hoverRangedValue[1]), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-panel-rtl"), direction === 'rtl'), _classNames)), style: style, onKeyDown: onInternalKeyDown, onBlur: onInternalBlur, onMouseDown: onMouseDown, ref: panelDivRef }, panelNode, extraFooter || rangesNode || todayNode ? React.createElement("div", { className: "".concat(prefixCls, "-footer") }, extraFooter, rangesNode, todayNode) : null)); } var _default = PickerPanel; /* eslint-enable */ exports.default = _default; }).call(this,require('_process')) },{"./PanelContext":676,"./RangeContext":680,"./panels/DatePanel":694,"./panels/DatetimePanel":695,"./panels/DecadePanel":698,"./panels/MonthPanel":702,"./panels/QuarterPanel":706,"./panels/TimePanel":710,"./panels/WeekPanel":711,"./panels/YearPanel":714,"./utils/dateUtil":715,"./utils/getExtraFooter":716,"./utils/getRanges":717,"./utils/timeUtil":719,"./utils/uiUtil":720,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"_process":1,"classnames":455,"rc-util/lib/KeyCode":865,"rc-util/lib/hooks/useMergedState":871,"rc-util/lib/warning":879,"react":"react"}],679:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcTrigger = _interopRequireDefault(require("rc-trigger")); var BUILT_IN_PLACEMENTS = { bottomLeft: { points: ['tl', 'bl'], offset: [0, 4], overflow: { adjustX: 1, adjustY: 1 } }, bottomRight: { points: ['tr', 'br'], offset: [0, 4], overflow: { adjustX: 1, adjustY: 1 } }, topLeft: { points: ['bl', 'tl'], offset: [0, -4], overflow: { adjustX: 0, adjustY: 1 } }, topRight: { points: ['br', 'tr'], offset: [0, -4], overflow: { adjustX: 0, adjustY: 1 } } }; function PickerTrigger(_ref) { var _classNames; var prefixCls = _ref.prefixCls, popupElement = _ref.popupElement, popupStyle = _ref.popupStyle, visible = _ref.visible, dropdownClassName = _ref.dropdownClassName, dropdownAlign = _ref.dropdownAlign, transitionName = _ref.transitionName, getPopupContainer = _ref.getPopupContainer, children = _ref.children, range = _ref.range, popupPlacement = _ref.popupPlacement, direction = _ref.direction; var dropdownPrefixCls = "".concat(prefixCls, "-dropdown"); var getPopupPlacement = function getPopupPlacement() { if (popupPlacement !== undefined) { return popupPlacement; } return direction === 'rtl' ? 'bottomRight' : 'bottomLeft'; }; return React.createElement(_rcTrigger.default, { showAction: [], hideAction: [], popupPlacement: getPopupPlacement(), builtinPlacements: BUILT_IN_PLACEMENTS, prefixCls: dropdownPrefixCls, popupTransitionName: transitionName, popup: popupElement, popupAlign: dropdownAlign, popupVisible: visible, popupClassName: (0, _classnames.default)(dropdownClassName, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(dropdownPrefixCls, "-range"), range), (0, _defineProperty2.default)(_classNames, "".concat(dropdownPrefixCls, "-rtl"), direction === 'rtl'), _classNames)), popupStyle: popupStyle, getPopupContainer: getPopupContainer }, children); } var _default = PickerTrigger; exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-trigger":848,"react":"react"}],680:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var RangeContext = React.createContext({}); var _default = RangeContext; exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],681:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _useMergedState11 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _PickerTrigger = _interopRequireDefault(require("./PickerTrigger")); var _PickerPanel = _interopRequireDefault(require("./PickerPanel")); var _usePickerInput5 = _interopRequireDefault(require("./hooks/usePickerInput")); var _miscUtil = _interopRequireWildcard(require("./utils/miscUtil")); var _uiUtil = require("./utils/uiUtil"); var _PanelContext = _interopRequireDefault(require("./PanelContext")); var _dateUtil = require("./utils/dateUtil"); var _useValueTexts5 = _interopRequireDefault(require("./hooks/useValueTexts")); var _useTextValueMapping5 = _interopRequireDefault(require("./hooks/useTextValueMapping")); var _RangeContext = _interopRequireDefault(require("./RangeContext")); var _useRangeDisabled3 = _interopRequireDefault(require("./hooks/useRangeDisabled")); var _getExtraFooter = _interopRequireDefault(require("./utils/getExtraFooter")); var _getRanges = _interopRequireDefault(require("./utils/getRanges")); var _useRangeViewDates3 = _interopRequireDefault(require("./hooks/useRangeViewDates")); var _useHoverValue5 = _interopRequireDefault(require("./hooks/useHoverValue")); function reorderValues(values, generateConfig) { if (values && values[0] && values[1] && generateConfig.isAfter(values[0], values[1])) { return [values[1], values[0]]; } return values; } function canValueTrigger(value, index, disabled, allowEmpty) { if (value) { return true; } if (allowEmpty && allowEmpty[index]) { return true; } if (disabled[(index + 1) % 2]) { return true; } return false; } function InnerRangePicker(props) { var _classNames2, _classNames3, _classNames4; var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-picker' : _props$prefixCls, id = props.id, style = props.style, className = props.className, popupStyle = props.popupStyle, dropdownClassName = props.dropdownClassName, transitionName = props.transitionName, dropdownAlign = props.dropdownAlign, getPopupContainer = props.getPopupContainer, generateConfig = props.generateConfig, locale = props.locale, placeholder = props.placeholder, autoFocus = props.autoFocus, disabled = props.disabled, format = props.format, _props$picker = props.picker, picker = _props$picker === void 0 ? 'date' : _props$picker, showTime = props.showTime, use12Hours = props.use12Hours, _props$separator = props.separator, separator = _props$separator === void 0 ? '~' : _props$separator, value = props.value, defaultValue = props.defaultValue, defaultPickerValue = props.defaultPickerValue, open = props.open, defaultOpen = props.defaultOpen, disabledDate = props.disabledDate, _disabledTime = props.disabledTime, dateRender = props.dateRender, panelRender = props.panelRender, ranges = props.ranges, allowEmpty = props.allowEmpty, allowClear = props.allowClear, suffixIcon = props.suffixIcon, clearIcon = props.clearIcon, pickerRef = props.pickerRef, inputReadOnly = props.inputReadOnly, mode = props.mode, renderExtraFooter = props.renderExtraFooter, onChange = props.onChange, onOpenChange = props.onOpenChange, onPanelChange = props.onPanelChange, onCalendarChange = props.onCalendarChange, _onFocus = props.onFocus, onBlur = props.onBlur, _onOk = props.onOk, components = props.components, order = props.order, direction = props.direction, activePickerIndex = props.activePickerIndex, _props$autoComplete = props.autoComplete, autoComplete = _props$autoComplete === void 0 ? 'off' : _props$autoComplete; var needConfirmButton = picker === 'date' && !!showTime || picker === 'time'; // We record opened status here in case repeat open with picker var openRecordsRef = (0, React.useRef)({}); var containerRef = (0, React.useRef)(null); var panelDivRef = (0, React.useRef)(null); var startInputDivRef = (0, React.useRef)(null); var endInputDivRef = (0, React.useRef)(null); var separatorRef = (0, React.useRef)(null); var startInputRef = (0, React.useRef)(null); var endInputRef = (0, React.useRef)(null); // ============================= Misc ============================== var formatList = (0, _miscUtil.toArray)((0, _uiUtil.getDefaultFormat)(format, picker, showTime, use12Hours)); // Active picker var _useMergedState = (0, _useMergedState11.default)(0, { value: activePickerIndex }), _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2), mergedActivePickerIndex = _useMergedState2[0], setMergedActivePickerIndex = _useMergedState2[1]; // Operation ref var operationRef = (0, React.useRef)(null); var mergedDisabled = React.useMemo(function () { if (Array.isArray(disabled)) { return disabled; } return [disabled || false, disabled || false]; }, [disabled]); // ============================= Value ============================= var _useMergedState3 = (0, _useMergedState11.default)(null, { value: value, defaultValue: defaultValue, postState: function postState(values) { return picker === 'time' && !order ? values : reorderValues(values, generateConfig); } }), _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2), mergedValue = _useMergedState4[0], setInnerValue = _useMergedState4[1]; // =========================== View Date =========================== // Config view panel var _useRangeViewDates = (0, _useRangeViewDates3.default)({ values: mergedValue, picker: picker, defaultDates: defaultPickerValue, generateConfig: generateConfig }), _useRangeViewDates2 = (0, _slicedToArray2.default)(_useRangeViewDates, 2), getViewDate = _useRangeViewDates2[0], setViewDate = _useRangeViewDates2[1]; // ========================= Select Values ========================= var _useMergedState5 = (0, _useMergedState11.default)(mergedValue, { postState: function postState(values) { var postValues = values; if (mergedDisabled[0] && mergedDisabled[1]) { return postValues; } // Fill disabled unit for (var i = 0; i < 2; i += 1) { if (mergedDisabled[i] && !(0, _miscUtil.getValue)(postValues, i) && !(0, _miscUtil.getValue)(allowEmpty, i)) { postValues = (0, _miscUtil.updateValues)(postValues, generateConfig.getNow(), i); } } return postValues; } }), _useMergedState6 = (0, _slicedToArray2.default)(_useMergedState5, 2), selectedValue = _useMergedState6[0], setSelectedValue = _useMergedState6[1]; // ============================= Modes ============================= var _useMergedState7 = (0, _useMergedState11.default)([picker, picker], { value: mode }), _useMergedState8 = (0, _slicedToArray2.default)(_useMergedState7, 2), mergedModes = _useMergedState8[0], setInnerModes = _useMergedState8[1]; (0, React.useEffect)(function () { setInnerModes([picker, picker]); }, [picker]); var triggerModesChange = function triggerModesChange(modes, values) { setInnerModes(modes); if (onPanelChange) { onPanelChange(values, modes); } }; // ========================= Disable Date ========================== var _useRangeDisabled = (0, _useRangeDisabled3.default)({ picker: picker, selectedValue: selectedValue, locale: locale, disabled: mergedDisabled, disabledDate: disabledDate, generateConfig: generateConfig }, openRecordsRef.current[1], openRecordsRef.current[0]), _useRangeDisabled2 = (0, _slicedToArray2.default)(_useRangeDisabled, 2), disabledStartDate = _useRangeDisabled2[0], disabledEndDate = _useRangeDisabled2[1]; // ============================= Open ============================== var _useMergedState9 = (0, _useMergedState11.default)(false, { value: open, defaultValue: defaultOpen, postState: function postState(postOpen) { return mergedDisabled[mergedActivePickerIndex] ? false : postOpen; }, onChange: function onChange(newOpen) { if (onOpenChange) { onOpenChange(newOpen); } if (!newOpen && operationRef.current && operationRef.current.onClose) { operationRef.current.onClose(); } } }), _useMergedState10 = (0, _slicedToArray2.default)(_useMergedState9, 2), mergedOpen = _useMergedState10[0], triggerInnerOpen = _useMergedState10[1]; var startOpen = mergedOpen && mergedActivePickerIndex === 0; var endOpen = mergedOpen && mergedActivePickerIndex === 1; // ============================= Popup ============================= // Popup min width var _useState = (0, React.useState)(0), _useState2 = (0, _slicedToArray2.default)(_useState, 2), popupMinWidth = _useState2[0], setPopupMinWidth = _useState2[1]; (0, React.useEffect)(function () { if (!mergedOpen && containerRef.current) { setPopupMinWidth(containerRef.current.offsetWidth); } }, [mergedOpen]); // ============================ Trigger ============================ var triggerRef = React.useRef(); function _triggerOpen(newOpen, index) { if (newOpen) { clearTimeout(triggerRef.current); openRecordsRef.current[index] = true; setMergedActivePickerIndex(index); triggerInnerOpen(newOpen); // Open to reset view date if (!mergedOpen) { setViewDate(null, index); } } else if (mergedActivePickerIndex === index) { triggerInnerOpen(newOpen); // Clean up async // This makes ref not quick refresh in case user open another input with blur trigger var openRecords = openRecordsRef.current; triggerRef.current = setTimeout(function () { if (openRecords === openRecordsRef.current) { openRecordsRef.current = {}; } }); } } function triggerOpenAndFocus(index) { _triggerOpen(true, index); // Use setTimeout to make sure panel DOM exists setTimeout(function () { var inputRef = [startInputRef, endInputRef][index]; if (inputRef.current) { inputRef.current.focus(); } }, 0); } function triggerChange(newValue, sourceIndex) { var values = newValue; var startValue = (0, _miscUtil.getValue)(values, 0); var endValue = (0, _miscUtil.getValue)(values, 1); // >>>>> Format start & end values if (startValue && endValue && generateConfig.isAfter(startValue, endValue)) { if ( // WeekPicker only compare week picker === 'week' && !(0, _dateUtil.isSameWeek)(generateConfig, locale.locale, startValue, endValue) || // QuotaPicker only compare week picker === 'quarter' && !(0, _dateUtil.isSameQuarter)(generateConfig, startValue, endValue) || // Other non-TimePicker compare date picker !== 'week' && picker !== 'quarter' && picker !== 'time' && !(0, _dateUtil.isSameDate)(generateConfig, startValue, endValue)) { // Clean up end date when start date is after end date if (sourceIndex === 0) { values = [startValue, null]; endValue = null; } else { startValue = null; values = [null, endValue]; } // Clean up cache since invalidate openRecordsRef.current = (0, _defineProperty2.default)({}, sourceIndex, true); } else if (picker !== 'time' || order !== false) { // Reorder when in same date values = reorderValues(values, generateConfig); } } setSelectedValue(values); var startStr = values && values[0] ? generateConfig.locale.format(locale.locale, values[0], formatList[0]) : ''; var endStr = values && values[1] ? generateConfig.locale.format(locale.locale, values[1], formatList[0]) : ''; if (onCalendarChange) { var info = { range: sourceIndex === 0 ? 'start' : 'end' }; onCalendarChange(values, [startStr, endStr], info); } // >>>>> Trigger `onChange` event var canStartValueTrigger = canValueTrigger(startValue, 0, mergedDisabled, allowEmpty); var canEndValueTrigger = canValueTrigger(endValue, 1, mergedDisabled, allowEmpty); var canTrigger = values === null || canStartValueTrigger && canEndValueTrigger; if (canTrigger) { // Trigger onChange only when value is validate setInnerValue(values); if (onChange && (!(0, _dateUtil.isEqual)(generateConfig, (0, _miscUtil.getValue)(mergedValue, 0), startValue) || !(0, _dateUtil.isEqual)(generateConfig, (0, _miscUtil.getValue)(mergedValue, 1), endValue))) { onChange(values, [startStr, endStr]); } } // >>>>> Open picker when // Always open another picker if possible var nextOpenIndex = null; if (sourceIndex === 0 && !mergedDisabled[1]) { nextOpenIndex = 1; } else if (sourceIndex === 1 && !mergedDisabled[0]) { nextOpenIndex = 0; } if (nextOpenIndex !== null && nextOpenIndex !== mergedActivePickerIndex && (!openRecordsRef.current[nextOpenIndex] || !(0, _miscUtil.getValue)(values, nextOpenIndex)) && (0, _miscUtil.getValue)(values, sourceIndex)) { // Delay to focus to avoid input blur trigger expired selectedValues triggerOpenAndFocus(nextOpenIndex); } else { _triggerOpen(false, sourceIndex); } } var forwardKeyDown = function forwardKeyDown(e) { if (mergedOpen && operationRef.current && operationRef.current.onKeyDown) { // Let popup panel handle keyboard return operationRef.current.onKeyDown(e); } /* istanbul ignore next */ /* eslint-disable no-lone-blocks */ { (0, _warning.default)(false, 'Picker not correct forward KeyDown operation. Please help to fire issue about this.'); return false; } }; // ============================= Text ============================== var sharedTextHooksProps = { formatList: formatList, generateConfig: generateConfig, locale: locale }; var _useValueTexts = (0, _useValueTexts5.default)((0, _miscUtil.getValue)(selectedValue, 0), sharedTextHooksProps), _useValueTexts2 = (0, _slicedToArray2.default)(_useValueTexts, 2), startValueTexts = _useValueTexts2[0], firstStartValueText = _useValueTexts2[1]; var _useValueTexts3 = (0, _useValueTexts5.default)((0, _miscUtil.getValue)(selectedValue, 1), sharedTextHooksProps), _useValueTexts4 = (0, _slicedToArray2.default)(_useValueTexts3, 2), endValueTexts = _useValueTexts4[0], firstEndValueText = _useValueTexts4[1]; var _onTextChange = function onTextChange(newText, index) { var inputDate = generateConfig.locale.parse(locale.locale, newText, formatList); var disabledFunc = index === 0 ? disabledStartDate : disabledEndDate; if (inputDate && !disabledFunc(inputDate)) { setSelectedValue((0, _miscUtil.updateValues)(selectedValue, inputDate, index)); setViewDate(inputDate, index); } }; var _useTextValueMapping = (0, _useTextValueMapping5.default)({ valueTexts: startValueTexts, onTextChange: function onTextChange(newText) { return _onTextChange(newText, 0); } }), _useTextValueMapping2 = (0, _slicedToArray2.default)(_useTextValueMapping, 3), startText = _useTextValueMapping2[0], triggerStartTextChange = _useTextValueMapping2[1], resetStartText = _useTextValueMapping2[2]; var _useTextValueMapping3 = (0, _useTextValueMapping5.default)({ valueTexts: endValueTexts, onTextChange: function onTextChange(newText) { return _onTextChange(newText, 1); } }), _useTextValueMapping4 = (0, _slicedToArray2.default)(_useTextValueMapping3, 3), endText = _useTextValueMapping4[0], triggerEndTextChange = _useTextValueMapping4[1], resetEndText = _useTextValueMapping4[2]; var _useState3 = (0, React.useState)(null), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), rangeHoverValue = _useState4[0], setRangeHoverValue = _useState4[1]; // ========================== Hover Range ========================== var _useState5 = (0, React.useState)(null), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), hoverRangedValue = _useState6[0], setHoverRangedValue = _useState6[1]; var _useHoverValue = (0, _useHoverValue5.default)(startText, { formatList: formatList, generateConfig: generateConfig, locale: locale }), _useHoverValue2 = (0, _slicedToArray2.default)(_useHoverValue, 3), startHoverValue = _useHoverValue2[0], onStartEnter = _useHoverValue2[1], onStartLeave = _useHoverValue2[2]; var _useHoverValue3 = (0, _useHoverValue5.default)(endText, { formatList: formatList, generateConfig: generateConfig, locale: locale }), _useHoverValue4 = (0, _slicedToArray2.default)(_useHoverValue3, 3), endHoverValue = _useHoverValue4[0], onEndEnter = _useHoverValue4[1], onEndLeave = _useHoverValue4[2]; var onDateMouseEnter = function onDateMouseEnter(date) { setHoverRangedValue((0, _miscUtil.updateValues)(selectedValue, date, mergedActivePickerIndex)); if (mergedActivePickerIndex === 0) { onStartEnter(date); } else { onEndEnter(date); } }; var onDateMouseLeave = function onDateMouseLeave() { setHoverRangedValue((0, _miscUtil.updateValues)(selectedValue, null, mergedActivePickerIndex)); if (mergedActivePickerIndex === 0) { onStartLeave(); } else { onEndLeave(); } }; // ============================= Input ============================= var getSharedInputHookProps = function getSharedInputHookProps(index, resetText) { return { blurToCancel: needConfirmButton, forwardKeyDown: forwardKeyDown, onBlur: onBlur, isClickOutside: function isClickOutside(target) { return !(0, _uiUtil.elementsContains)([panelDivRef.current, startInputDivRef.current, endInputDivRef.current], target); }, onFocus: function onFocus(e) { setMergedActivePickerIndex(index); if (_onFocus) { _onFocus(e); } }, triggerOpen: function triggerOpen(newOpen) { _triggerOpen(newOpen, index); }, onSubmit: function onSubmit() { triggerChange(selectedValue, index); resetText(); }, onCancel: function onCancel() { _triggerOpen(false, index); setSelectedValue(mergedValue); resetText(); } }; }; var _usePickerInput = (0, _usePickerInput5.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, getSharedInputHookProps(0, resetStartText)), {}, { open: startOpen, value: startText })), _usePickerInput2 = (0, _slicedToArray2.default)(_usePickerInput, 2), startInputProps = _usePickerInput2[0], _usePickerInput2$ = _usePickerInput2[1], startFocused = _usePickerInput2$.focused, startTyping = _usePickerInput2$.typing; var _usePickerInput3 = (0, _usePickerInput5.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, getSharedInputHookProps(1, resetEndText)), {}, { open: endOpen, value: endText })), _usePickerInput4 = (0, _slicedToArray2.default)(_usePickerInput3, 2), endInputProps = _usePickerInput4[0], _usePickerInput4$ = _usePickerInput4[1], endFocused = _usePickerInput4$.focused, endTyping = _usePickerInput4$.typing; // ========================== Click Picker ========================== var onPickerClick = function onPickerClick(e) { // When click inside the picker & outside the picker's input elements // the panel should still be opened if (!mergedOpen && !startInputRef.current.contains(e.target) && !endInputRef.current.contains(e.target)) { if (!mergedDisabled[0]) { triggerOpenAndFocus(0); } else if (!mergedDisabled[1]) { triggerOpenAndFocus(1); } } }; var onPickerMouseDown = function onPickerMouseDown(e) { // shouldn't affect input elements if picker is active if (mergedOpen && (startFocused || endFocused) && !startInputRef.current.contains(e.target) && !endInputRef.current.contains(e.target)) { e.preventDefault(); } }; // ============================= Sync ============================== // Close should sync back with text value var startStr = mergedValue && mergedValue[0] ? generateConfig.locale.format(locale.locale, mergedValue[0], 'YYYYMMDDHHmmss') : ''; var endStr = mergedValue && mergedValue[1] ? generateConfig.locale.format(locale.locale, mergedValue[1], 'YYYYMMDDHHmmss') : ''; (0, React.useEffect)(function () { if (!mergedOpen) { setSelectedValue(mergedValue); if (!startValueTexts.length || startValueTexts[0] === '') { triggerStartTextChange(''); } else if (firstStartValueText !== startText) { resetStartText(); } if (!endValueTexts.length || endValueTexts[0] === '') { triggerEndTextChange(''); } else if (firstEndValueText !== endText) { resetEndText(); } } }, [mergedOpen, startValueTexts, endValueTexts]); // Sync innerValue with control mode (0, React.useEffect)(function () { setSelectedValue(mergedValue); }, [startStr, endStr]); // ============================ Warning ============================ if (process.env.NODE_ENV !== 'production') { if (value && Array.isArray(disabled) && ((0, _miscUtil.getValue)(disabled, 0) && !(0, _miscUtil.getValue)(value, 0) || (0, _miscUtil.getValue)(disabled, 1) && !(0, _miscUtil.getValue)(value, 1))) { (0, _warning.default)(false, '`disabled` should not set with empty `value`. You should set `allowEmpty` or `value` instead.'); } } // ============================ Private ============================ if (pickerRef) { pickerRef.current = { focus: function focus() { if (startInputRef.current) { startInputRef.current.focus(); } }, blur: function blur() { if (startInputRef.current) { startInputRef.current.blur(); } if (endInputRef.current) { endInputRef.current.blur(); } } }; } // ============================ Ranges ============================= var rangeLabels = Object.keys(ranges || {}); var rangeList = rangeLabels.map(function (label) { var range = ranges[label]; var newValues = typeof range === 'function' ? range() : range; return { label: label, onClick: function onClick() { triggerChange(newValues, null); _triggerOpen(false, mergedActivePickerIndex); }, onMouseEnter: function onMouseEnter() { setRangeHoverValue(newValues); }, onMouseLeave: function onMouseLeave() { setRangeHoverValue(null); } }; }); // ============================= Panel ============================= function renderPanel() { var panelPosition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var panelProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var panelHoverRangedValue = null; if (mergedOpen && hoverRangedValue && hoverRangedValue[0] && hoverRangedValue[1] && generateConfig.isAfter(hoverRangedValue[1], hoverRangedValue[0])) { panelHoverRangedValue = hoverRangedValue; } var panelShowTime = showTime; if (showTime && (0, _typeof2.default)(showTime) === 'object' && showTime.defaultValue) { var timeDefaultValues = showTime.defaultValue; panelShowTime = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, showTime), {}, { defaultValue: (0, _miscUtil.getValue)(timeDefaultValues, mergedActivePickerIndex) || undefined }); } var panelDateRender = null; if (dateRender) { panelDateRender = function panelDateRender(date, today) { return dateRender(date, today, { range: mergedActivePickerIndex ? 'end' : 'start' }); }; } return React.createElement(_RangeContext.default.Provider, { value: { inRange: true, panelPosition: panelPosition, rangedValue: rangeHoverValue || selectedValue, hoverRangedValue: panelHoverRangedValue } }, React.createElement(_PickerPanel.default, Object.assign({}, props, panelProps, { dateRender: panelDateRender, showTime: panelShowTime, mode: mergedModes[mergedActivePickerIndex], generateConfig: generateConfig, style: undefined, direction: direction, disabledDate: mergedActivePickerIndex === 0 ? disabledStartDate : disabledEndDate, disabledTime: function disabledTime(date) { if (_disabledTime) { return _disabledTime(date, mergedActivePickerIndex === 0 ? 'start' : 'end'); } return false; }, className: (0, _classnames.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-panel-focused"), mergedActivePickerIndex === 0 ? !startTyping : !endTyping)), value: (0, _miscUtil.getValue)(selectedValue, mergedActivePickerIndex), locale: locale, tabIndex: -1, onPanelChange: function onPanelChange(date, newMode) { triggerModesChange((0, _miscUtil.updateValues)(mergedModes, newMode, mergedActivePickerIndex), (0, _miscUtil.updateValues)(selectedValue, date, mergedActivePickerIndex)); var viewDate = date; if (panelPosition === 'right' && mergedModes[mergedActivePickerIndex] === newMode) { viewDate = (0, _dateUtil.getClosingViewDate)(viewDate, newMode, generateConfig, -1); } setViewDate(viewDate, mergedActivePickerIndex); }, onOk: null, onSelect: undefined, onChange: undefined, defaultValue: undefined, defaultPickerValue: undefined }))); } var arrowLeft = 0; var panelLeft = 0; if (mergedActivePickerIndex && startInputDivRef.current && separatorRef.current && panelDivRef.current) { // Arrow offset arrowLeft = startInputDivRef.current.offsetWidth + separatorRef.current.offsetWidth; if (panelDivRef.current.offsetWidth && arrowLeft > panelDivRef.current.offsetWidth) { panelLeft = arrowLeft; } } var arrowPositionStyle = direction === 'rtl' ? { right: arrowLeft } : { left: arrowLeft }; function renderPanels() { var panels; var extraNode = (0, _getExtraFooter.default)(prefixCls, mergedModes[mergedActivePickerIndex], renderExtraFooter); var rangesNode = (0, _getRanges.default)({ prefixCls: prefixCls, components: components, needConfirmButton: needConfirmButton, okDisabled: !(0, _miscUtil.getValue)(selectedValue, mergedActivePickerIndex) || disabledDate && disabledDate(selectedValue[mergedActivePickerIndex]), locale: locale, rangeList: rangeList, onOk: function onOk() { if ((0, _miscUtil.getValue)(selectedValue, mergedActivePickerIndex)) { // triggerChangeOld(selectedValue); triggerChange(selectedValue, mergedActivePickerIndex); if (_onOk) { _onOk(selectedValue); } } } }); if (picker !== 'time' && !showTime) { var viewDate = getViewDate(mergedActivePickerIndex); var nextViewDate = (0, _dateUtil.getClosingViewDate)(viewDate, picker, generateConfig); var currentMode = mergedModes[mergedActivePickerIndex]; var showDoublePanel = currentMode === picker; var leftPanel = renderPanel(showDoublePanel ? 'left' : false, { pickerValue: viewDate, onPickerValueChange: function onPickerValueChange(newViewDate) { setViewDate(newViewDate, mergedActivePickerIndex); } }); var rightPanel = renderPanel('right', { pickerValue: nextViewDate, onPickerValueChange: function onPickerValueChange(newViewDate) { setViewDate((0, _dateUtil.getClosingViewDate)(newViewDate, picker, generateConfig, -1), mergedActivePickerIndex); } }); if (direction === 'rtl') { panels = React.createElement(React.Fragment, null, rightPanel, showDoublePanel && leftPanel); } else { panels = React.createElement(React.Fragment, null, leftPanel, showDoublePanel && rightPanel); } } else { panels = renderPanel(); } var mergedNodes = React.createElement(React.Fragment, null, React.createElement("div", { className: "".concat(prefixCls, "-panels") }, panels), (extraNode || rangesNode) && React.createElement("div", { className: "".concat(prefixCls, "-footer") }, extraNode, rangesNode)); if (panelRender) { mergedNodes = panelRender(mergedNodes); } return React.createElement("div", { className: "".concat(prefixCls, "-panel-container"), style: { marginLeft: panelLeft }, ref: panelDivRef, onMouseDown: function onMouseDown(e) { e.preventDefault(); } }, mergedNodes); } var rangePanel = React.createElement("div", { className: (0, _classnames.default)("".concat(prefixCls, "-range-wrapper"), "".concat(prefixCls, "-").concat(picker, "-range-wrapper")), style: { minWidth: popupMinWidth } }, React.createElement("div", { className: "".concat(prefixCls, "-range-arrow"), style: arrowPositionStyle }), renderPanels()); // ============================= Icons ============================= var suffixNode; if (suffixIcon) { suffixNode = React.createElement("span", { className: "".concat(prefixCls, "-suffix") }, suffixIcon); } var clearNode; if (allowClear && ((0, _miscUtil.getValue)(mergedValue, 0) && !mergedDisabled[0] || (0, _miscUtil.getValue)(mergedValue, 1) && !mergedDisabled[1])) { clearNode = React.createElement("span", { onMouseDown: function onMouseDown(e) { e.preventDefault(); e.stopPropagation(); }, onMouseUp: function onMouseUp(e) { e.preventDefault(); e.stopPropagation(); var values = mergedValue; if (!mergedDisabled[0]) { values = (0, _miscUtil.updateValues)(values, null, 0); } if (!mergedDisabled[1]) { values = (0, _miscUtil.updateValues)(values, null, 1); } triggerChange(values, null); _triggerOpen(false, mergedActivePickerIndex); }, className: "".concat(prefixCls, "-clear") }, clearIcon || React.createElement("span", { className: "".concat(prefixCls, "-clear-btn") })); } var inputSharedProps = { size: (0, _uiUtil.getInputSize)(picker, formatList[0]) }; var activeBarLeft = 0; var activeBarWidth = 0; if (startInputDivRef.current && endInputDivRef.current && separatorRef.current) { if (mergedActivePickerIndex === 0) { activeBarWidth = startInputDivRef.current.offsetWidth; } else { activeBarLeft = arrowLeft; activeBarWidth = endInputDivRef.current.offsetWidth; } } var activeBarPositionStyle = direction === 'rtl' ? { right: activeBarLeft } : { left: activeBarLeft }; // ============================ Return ============================= var onContextSelect = function onContextSelect(date, type) { var values = (0, _miscUtil.updateValues)(selectedValue, date, mergedActivePickerIndex); if (type === 'submit' || type !== 'key' && !needConfirmButton) { // triggerChange will also update selected values triggerChange(values, mergedActivePickerIndex); // clear hover value style if (mergedActivePickerIndex === 0) { onStartLeave(); } else { onEndLeave(); } } else { setSelectedValue(values); } }; return React.createElement(_PanelContext.default.Provider, { value: { operationRef: operationRef, hideHeader: picker === 'time', onDateMouseEnter: onDateMouseEnter, onDateMouseLeave: onDateMouseLeave, hideRanges: true, onSelect: onContextSelect, open: mergedOpen } }, React.createElement(_PickerTrigger.default, { visible: mergedOpen, popupElement: rangePanel, popupStyle: popupStyle, prefixCls: prefixCls, dropdownClassName: dropdownClassName, dropdownAlign: dropdownAlign, getPopupContainer: getPopupContainer, transitionName: transitionName, range: true, direction: direction }, React.createElement("div", Object.assign({ ref: containerRef, className: (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-range"), className, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-disabled"), mergedDisabled[0] && mergedDisabled[1]), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-focused"), mergedActivePickerIndex === 0 ? startFocused : endFocused), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames2)), style: style, onClick: onPickerClick, onMouseDown: onPickerMouseDown }, (0, _miscUtil.default)(props)), React.createElement("div", { className: (0, _classnames.default)("".concat(prefixCls, "-input"), (_classNames3 = {}, (0, _defineProperty2.default)(_classNames3, "".concat(prefixCls, "-input-active"), mergedActivePickerIndex === 0), (0, _defineProperty2.default)(_classNames3, "".concat(prefixCls, "-input-placeholder"), !!startHoverValue), _classNames3)), ref: startInputDivRef }, React.createElement("input", Object.assign({ id: id, disabled: mergedDisabled[0], readOnly: inputReadOnly || !startTyping, value: startHoverValue || startText, onChange: function onChange(e) { triggerStartTextChange(e.target.value); }, autoFocus: autoFocus, placeholder: (0, _miscUtil.getValue)(placeholder, 0) || '', ref: startInputRef }, startInputProps, inputSharedProps, { autoComplete: autoComplete }))), React.createElement("div", { className: "".concat(prefixCls, "-range-separator"), ref: separatorRef }, separator), React.createElement("div", { className: (0, _classnames.default)("".concat(prefixCls, "-input"), (_classNames4 = {}, (0, _defineProperty2.default)(_classNames4, "".concat(prefixCls, "-input-active"), mergedActivePickerIndex === 1), (0, _defineProperty2.default)(_classNames4, "".concat(prefixCls, "-input-placeholder"), !!endHoverValue), _classNames4)), ref: endInputDivRef }, React.createElement("input", Object.assign({ disabled: mergedDisabled[1], readOnly: inputReadOnly || !endTyping, value: endHoverValue || endText, onChange: function onChange(e) { triggerEndTextChange(e.target.value); }, placeholder: (0, _miscUtil.getValue)(placeholder, 1) || '', ref: endInputRef }, endInputProps, inputSharedProps, { autoComplete: autoComplete }))), React.createElement("div", { className: "".concat(prefixCls, "-active-bar"), style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, activeBarPositionStyle), {}, { width: activeBarWidth, position: 'absolute' }) }), suffixNode, clearNode))); } // Wrap with class component to enable pass generic with instance method var RangePicker = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(RangePicker, _React$Component); var _super = (0, _createSuper2.default)(RangePicker); function RangePicker() { var _this; (0, _classCallCheck2.default)(this, RangePicker); _this = _super.apply(this, arguments); _this.pickerRef = React.createRef(); _this.focus = function () { if (_this.pickerRef.current) { _this.pickerRef.current.focus(); } }; _this.blur = function () { if (_this.pickerRef.current) { _this.pickerRef.current.blur(); } }; return _this; } (0, _createClass2.default)(RangePicker, [{ key: "render", value: function render() { return React.createElement(InnerRangePicker, Object.assign({}, this.props, { pickerRef: this.pickerRef })); } }]); return RangePicker; }(React.Component); var _default = RangePicker; exports.default = _default; }).call(this,require('_process')) },{"./PanelContext":676,"./PickerPanel":678,"./PickerTrigger":679,"./RangeContext":680,"./hooks/useHoverValue":684,"./hooks/usePickerInput":685,"./hooks/useRangeDisabled":686,"./hooks/useRangeViewDates":687,"./hooks/useTextValueMapping":688,"./hooks/useValueTexts":689,"./utils/dateUtil":715,"./utils/getExtraFooter":716,"./utils/getRanges":717,"./utils/miscUtil":718,"./utils/uiUtil":720,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"_process":1,"classnames":455,"rc-util/lib/hooks/useMergedState":871,"rc-util/lib/warning":879,"react":"react"}],682:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _moment = _interopRequireDefault(require("moment")); var _warning = require("rc-util/lib/warning"); var generateConfig = { // get getNow: function getNow() { return (0, _moment.default)(); }, getWeekDay: function getWeekDay(date) { var clone = date.clone().locale('en_US'); return clone.weekday() + clone.localeData().firstDayOfWeek(); }, getYear: function getYear(date) { return date.year(); }, getMonth: function getMonth(date) { return date.month(); }, getDate: function getDate(date) { return date.date(); }, getHour: function getHour(date) { return date.hour(); }, getMinute: function getMinute(date) { return date.minute(); }, getSecond: function getSecond(date) { return date.second(); }, // set addYear: function addYear(date, diff) { var clone = date.clone(); return clone.add(diff, 'year'); }, addMonth: function addMonth(date, diff) { var clone = date.clone(); return clone.add(diff, 'month'); }, addDate: function addDate(date, diff) { var clone = date.clone(); return clone.add(diff, 'day'); }, setYear: function setYear(date, year) { var clone = date.clone(); return clone.year(year); }, setMonth: function setMonth(date, month) { var clone = date.clone(); return clone.month(month); }, setDate: function setDate(date, num) { var clone = date.clone(); return clone.date(num); }, setHour: function setHour(date, hour) { var clone = date.clone(); return clone.hour(hour); }, setMinute: function setMinute(date, minute) { var clone = date.clone(); return clone.minute(minute); }, setSecond: function setSecond(date, second) { var clone = date.clone(); return clone.second(second); }, // Compare isAfter: function isAfter(date1, date2) { return date1.isAfter(date2); }, isValidate: function isValidate(date) { return date.isValid(); }, locale: { getWeekFirstDay: function getWeekFirstDay(locale) { var date = (0, _moment.default)().locale(locale); return date.localeData().firstDayOfWeek(); }, getWeek: function getWeek(locale, date) { var clone = date.clone(); var result = clone.locale(locale); return result.week(); }, getShortWeekDays: function getShortWeekDays(locale) { var date = (0, _moment.default)().locale(locale); return date.localeData().weekdaysMin(); }, getShortMonths: function getShortMonths(locale) { var date = (0, _moment.default)().locale(locale); return date.localeData().monthsShort(); }, format: function format(locale, date, _format) { var clone = date.clone(); var result = clone.locale(locale); return result.format(_format); }, parse: function parse(locale, text, formats) { var fallbackFormatList = []; for (var i = 0; i < formats.length; i += 1) { var format = formats[i]; var formatText = text; if (format.includes('wo') || format.includes('Wo')) { format = format.replace(/wo/g, 'w').replace(/Wo/g, 'W'); var matchFormat = format.match(/[-YyMmDdHhSsWwGg]+/g); var matchText = formatText.match(/[-\d]+/g); if (matchFormat && matchText) { format = matchFormat.join(''); formatText = matchText.join(''); } else { fallbackFormatList.push(format.replace(/o/g, '')); } } var date = (0, _moment.default)(formatText, format, locale, true); if (date.isValid()) { return date; } } // Fallback to fuzzy matching, this should always not reach match or need fire a issue for (var _i = 0; _i < fallbackFormatList.length; _i += 1) { var _date = (0, _moment.default)(text, fallbackFormatList[_i], locale, false); /* istanbul ignore next */ if (_date.isValid()) { (0, _warning.noteOnce)(false, 'Not match any format strictly and fallback to fuzzy match. Please help to fire a issue about this.'); return _date; } } return null; } } }; var _default = generateConfig; exports.default = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"moment":578,"rc-util/lib/warning":879}],683:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useCellClassName; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _dateUtil = require("../utils/dateUtil"); var _miscUtil = require("../utils/miscUtil"); function useCellClassName(_ref) { var cellPrefixCls = _ref.cellPrefixCls, generateConfig = _ref.generateConfig, rangedValue = _ref.rangedValue, hoverRangedValue = _ref.hoverRangedValue, isInView = _ref.isInView, isSameCell = _ref.isSameCell, offsetCell = _ref.offsetCell, today = _ref.today, value = _ref.value; function getClassName(currentDate) { var _ref2; var prevDate = offsetCell(currentDate, -1); var nextDate = offsetCell(currentDate, 1); var rangeStart = (0, _miscUtil.getValue)(rangedValue, 0); var rangeEnd = (0, _miscUtil.getValue)(rangedValue, 1); var hoverStart = (0, _miscUtil.getValue)(hoverRangedValue, 0); var hoverEnd = (0, _miscUtil.getValue)(hoverRangedValue, 1); var isRangeHovered = (0, _dateUtil.isInRange)(generateConfig, hoverStart, hoverEnd, currentDate); function isRangeStart(date) { return isSameCell(rangeStart, date); } function isRangeEnd(date) { return isSameCell(rangeEnd, date); } var isHoverStart = isSameCell(hoverStart, currentDate); var isHoverEnd = isSameCell(hoverEnd, currentDate); var isHoverEdgeStart = (isRangeHovered || isHoverEnd) && (!isInView(prevDate) || isRangeEnd(prevDate)); var isHoverEdgeEnd = (isRangeHovered || isHoverStart) && (!isInView(nextDate) || isRangeStart(nextDate)); return _ref2 = {}, (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-in-view"), isInView(currentDate)), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-in-range"), (0, _dateUtil.isInRange)(generateConfig, rangeStart, rangeEnd, currentDate)), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-start"), isRangeStart(currentDate)), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-end"), isRangeEnd(currentDate)), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-start-single"), isRangeStart(currentDate) && !rangeEnd), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-end-single"), isRangeEnd(currentDate) && !rangeStart), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-start-near-hover"), isRangeStart(currentDate) && (isSameCell(prevDate, hoverStart) || (0, _dateUtil.isInRange)(generateConfig, hoverStart, hoverEnd, prevDate))), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-end-near-hover"), isRangeEnd(currentDate) && (isSameCell(nextDate, hoverEnd) || (0, _dateUtil.isInRange)(generateConfig, hoverStart, hoverEnd, nextDate))), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-hover"), isRangeHovered), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-hover-start"), isHoverStart), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-hover-end"), isHoverEnd), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-start"), isHoverEdgeStart), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-end"), isHoverEdgeEnd), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-start-near-range"), isHoverEdgeStart && isSameCell(prevDate, rangeEnd)), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-end-near-range"), isHoverEdgeEnd && isSameCell(nextDate, rangeStart)), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-today"), isSameCell(today, currentDate)), (0, _defineProperty2.default)(_ref2, "".concat(cellPrefixCls, "-selected"), isSameCell(value, currentDate)), _ref2; } return getClassName; } },{"../utils/dateUtil":715,"../utils/miscUtil":718,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192}],684:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useHoverValue; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _useValueTexts3 = _interopRequireDefault(require("./useValueTexts")); function useHoverValue(valueText, _ref) { var formatList = _ref.formatList, generateConfig = _ref.generateConfig, locale = _ref.locale; var _useState = (0, _react.useState)(null), _useState2 = (0, _slicedToArray2.default)(_useState, 2), value = _useState2[0], internalSetValue = _useState2[1]; var raf = (0, _react.useRef)(null); function setValue(val) { var immediately = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; cancelAnimationFrame(raf.current); if (immediately) { internalSetValue(val); return; } raf.current = requestAnimationFrame(function () { internalSetValue(val); }); } var _useValueTexts = (0, _useValueTexts3.default)(value, { formatList: formatList, generateConfig: generateConfig, locale: locale }), _useValueTexts2 = (0, _slicedToArray2.default)(_useValueTexts, 2), firstText = _useValueTexts2[1]; function onEnter(date) { setValue(date); } function onLeave() { var immediately = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; setValue(null, immediately); } (0, _react.useEffect)(function () { onLeave(true); }, [valueText]); (0, _react.useEffect)(function () { return function () { return cancelAnimationFrame(raf.current); }; }, []); return [firstText, onEnter, onLeave]; } },{"./useValueTexts":689,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],685:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = usePickerInput; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _uiUtil = require("../utils/uiUtil"); function usePickerInput(_ref) { var open = _ref.open, value = _ref.value, isClickOutside = _ref.isClickOutside, triggerOpen = _ref.triggerOpen, forwardKeyDown = _ref.forwardKeyDown, blurToCancel = _ref.blurToCancel, onSubmit = _ref.onSubmit, onCancel = _ref.onCancel, _onFocus = _ref.onFocus, _onBlur = _ref.onBlur; var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), typing = _useState2[0], setTyping = _useState2[1]; var _useState3 = (0, _react.useState)(false), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), focused = _useState4[0], setFocused = _useState4[1]; /** * We will prevent blur to handle open event when user click outside, * since this will repeat trigger `onOpenChange` event. */ var preventBlurRef = (0, _react.useRef)(false); var valueChangedRef = (0, _react.useRef)(false); var inputProps = { onMouseDown: function onMouseDown() { setTyping(true); triggerOpen(true); }, onKeyDown: function onKeyDown(e) { switch (e.which) { case _KeyCode.default.ENTER: { if (!open) { triggerOpen(true); } else if (onSubmit() !== false) { setTyping(true); } e.preventDefault(); return; } case _KeyCode.default.TAB: { if (typing && open && !e.shiftKey) { setTyping(false); e.preventDefault(); } else if (!typing && open) { if (!forwardKeyDown(e) && e.shiftKey) { setTyping(true); e.preventDefault(); } } return; } case _KeyCode.default.ESC: { setTyping(true); onCancel(); return; } } if (!open && ![_KeyCode.default.SHIFT].includes(e.which)) { triggerOpen(true); } else if (!typing) { // Let popup panel handle keyboard forwardKeyDown(e); } }, onFocus: function onFocus(e) { setTyping(true); setFocused(true); if (_onFocus) { _onFocus(e); } }, onBlur: function onBlur(e) { if (preventBlurRef.current || !isClickOutside(document.activeElement)) { preventBlurRef.current = false; return; } if (blurToCancel) { setTimeout(function () { if (isClickOutside(document.activeElement)) { onCancel(); } }, 0); } else if (open) { triggerOpen(false); if (valueChangedRef.current) { onSubmit(); } } setFocused(false); if (_onBlur) { _onBlur(e); } } }; // check if value changed (0, _react.useEffect)(function () { valueChangedRef.current = false; }, [open]); (0, _react.useEffect)(function () { valueChangedRef.current = true; }, [value]); // Global click handler (0, _react.useEffect)(function () { return (0, _uiUtil.addGlobalMouseDownEvent)(function (_ref2) { var target = _ref2.target; if (open) { if (!isClickOutside(target)) { preventBlurRef.current = true; // Always set back in case `onBlur` prevented by user requestAnimationFrame(function () { preventBlurRef.current = false; }); } else if (!focused) { triggerOpen(false); } } }); }); return [inputProps, { focused: focused, typing: typing }]; } },{"../utils/uiUtil":720,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"rc-util/lib/KeyCode":865,"react":"react"}],686:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useRangeDisabled; var React = _interopRequireWildcard(require("react")); var _miscUtil = require("../utils/miscUtil"); var _dateUtil = require("../utils/dateUtil"); function useRangeDisabled(_ref, disabledStart, disabledEnd) { var picker = _ref.picker, locale = _ref.locale, selectedValue = _ref.selectedValue, disabledDate = _ref.disabledDate, disabled = _ref.disabled, generateConfig = _ref.generateConfig; var startDate = (0, _miscUtil.getValue)(selectedValue, 0); var endDate = (0, _miscUtil.getValue)(selectedValue, 1); function weekNumber(date) { var year = generateConfig.getYear(date); var week = generateConfig.locale.getWeek(locale.locale, date); return year * 100 + week; } function monthNumber(date) { var year = generateConfig.getYear(date); var month = generateConfig.getMonth(date); return year * 100 + month; } function quarterNumber(date) { var year = generateConfig.getYear(date); var quarter = (0, _dateUtil.getQuarter)(generateConfig, date); return year * 10 + quarter; } var disabledStartDate = React.useCallback(function (date) { if (disabledDate && disabledDate(date)) { return true; } // Disabled range if (disabled[1] && endDate) { return !(0, _dateUtil.isSameDate)(generateConfig, date, endDate) && generateConfig.isAfter(date, endDate); } // Disabled part if (disabledStart && endDate) { switch (picker) { case 'quarter': return quarterNumber(date) > quarterNumber(endDate); case 'month': return monthNumber(date) > monthNumber(endDate); case 'week': return weekNumber(date) > weekNumber(endDate); default: return !(0, _dateUtil.isSameDate)(generateConfig, date, endDate) && generateConfig.isAfter(date, endDate); } } return false; }, [disabledDate, disabled[1], endDate, disabledStart]); var disabledEndDate = React.useCallback(function (date) { if (disabledDate && disabledDate(date)) { return true; } // Disabled range if (disabled[0] && startDate) { return !(0, _dateUtil.isSameDate)(generateConfig, date, endDate) && generateConfig.isAfter(startDate, date); } // Disabled part if (disabledEnd && startDate) { switch (picker) { case 'quarter': return quarterNumber(date) < quarterNumber(startDate); case 'month': return monthNumber(date) < monthNumber(startDate); case 'week': return weekNumber(date) < weekNumber(startDate); default: return !(0, _dateUtil.isSameDate)(generateConfig, date, startDate) && generateConfig.isAfter(startDate, date); } } return false; }, [disabledDate, disabled[0], startDate, disabledEnd]); return [disabledStartDate, disabledEndDate]; } },{"../utils/dateUtil":715,"../utils/miscUtil":718,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],687:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useRangeViewDates; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _miscUtil = require("../utils/miscUtil"); var _dateUtil = require("../utils/dateUtil"); function getStartEndDistance(startDate, endDate, picker, generateConfig) { var startNext = (0, _dateUtil.getClosingViewDate)(startDate, picker, generateConfig, 1); function getDistance(compareFunc) { if (compareFunc(startDate, endDate)) { return 'same'; } if (compareFunc(startNext, endDate)) { return 'closing'; } return 'far'; } switch (picker) { case 'year': return getDistance(function (start, end) { return (0, _dateUtil.isSameDecade)(generateConfig, start, end); }); case 'quarter': case 'month': return getDistance(function (start, end) { return (0, _dateUtil.isSameYear)(generateConfig, start, end); }); default: return getDistance(function (start, end) { return (0, _dateUtil.isSameMonth)(generateConfig, start, end); }); } } function getRangeViewDate(values, index, picker, generateConfig) { var startDate = (0, _miscUtil.getValue)(values, 0); var endDate = (0, _miscUtil.getValue)(values, 1); if (index === 0) { return startDate; } if (startDate && endDate) { var distance = getStartEndDistance(startDate, endDate, picker, generateConfig); switch (distance) { case 'same': return startDate; case 'closing': return startDate; default: return (0, _dateUtil.getClosingViewDate)(endDate, picker, generateConfig, -1); } } return startDate; } function useRangeViewDates(_ref) { var values = _ref.values, picker = _ref.picker, defaultDates = _ref.defaultDates, generateConfig = _ref.generateConfig; var _React$useState = React.useState(function () { return [(0, _miscUtil.getValue)(defaultDates, 0), (0, _miscUtil.getValue)(defaultDates, 1)]; }), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), defaultViewDates = _React$useState2[0], setDefaultViewDates = _React$useState2[1]; var _React$useState3 = React.useState(null), _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2), viewDates = _React$useState4[0], setInternalViewDates = _React$useState4[1]; var startDate = (0, _miscUtil.getValue)(values, 0); var endDate = (0, _miscUtil.getValue)(values, 1); function getViewDate(index) { // If set default view date, use it if (defaultViewDates[index]) { return defaultViewDates[index]; } return (0, _miscUtil.getValue)(viewDates, index) || getRangeViewDate(values, index, picker, generateConfig) || startDate || endDate || generateConfig.getNow(); } function setViewDate(viewDate, index) { if (viewDate) { var newViewDates = (0, _miscUtil.updateValues)(viewDates, viewDate, index); // Set view date will clean up default one setDefaultViewDates( // Should always be an array (0, _miscUtil.updateValues)(defaultViewDates, null, index) || [null, null]); // Reset another one when not have value var anotherIndex = (index + 1) % 2; if (!(0, _miscUtil.getValue)(values, anotherIndex)) { newViewDates = (0, _miscUtil.updateValues)(newViewDates, viewDate, anotherIndex); } setInternalViewDates(newViewDates); } else if (startDate || endDate) { // Reset all when has values when `viewDate` is `null` which means from open trigger setInternalViewDates(null); } } return [getViewDate, setViewDate]; } },{"../utils/dateUtil":715,"../utils/miscUtil":718,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],688:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useTextValueMapping; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); function useTextValueMapping(_ref) { var valueTexts = _ref.valueTexts, onTextChange = _ref.onTextChange; var _React$useState = React.useState(''), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), text = _React$useState2[0], setInnerText = _React$useState2[1]; var valueTextsRef = React.useRef([]); valueTextsRef.current = valueTexts; function triggerTextChange(value) { setInnerText(value); onTextChange(value); } function resetText() { setInnerText(valueTextsRef.current[0]); } React.useEffect(function () { if (valueTexts.every(function (valText) { return valText !== text; })) { resetText(); } }, [valueTexts.join('||')]); return [text, triggerTextChange, resetText]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],689:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useValueTexts; var _shallowequal = _interopRequireDefault(require("shallowequal")); var _useMemo = _interopRequireDefault(require("rc-util/lib/hooks/useMemo")); function useValueTexts(value, _ref) { var formatList = _ref.formatList, generateConfig = _ref.generateConfig, locale = _ref.locale; return (0, _useMemo.default)(function () { if (!value) { return [[''], '']; } // We will convert data format back to first format var firstValueText = ''; var fullValueTexts = []; for (var i = 0; i < formatList.length; i += 1) { var format = formatList[i]; var formatStr = generateConfig.locale.format(locale.locale, value, format); fullValueTexts.push(formatStr); if (i === 0) { firstValueText = formatStr; } } return [fullValueTexts, firstValueText]; }, [value, formatList], function (prev, next) { return prev[0] !== next[0] || !(0, _shallowequal.default)(prev[1], next[1]); }); } },{"@babel/runtime/helpers/interopRequireDefault":192,"rc-util/lib/hooks/useMemo":870,"shallowequal":901}],690:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "PickerPanel", { enumerable: true, get: function get() { return _PickerPanel.default; } }); Object.defineProperty(exports, "RangePicker", { enumerable: true, get: function get() { return _RangePicker.default; } }); exports.default = void 0; var _Picker = _interopRequireDefault(require("./Picker")); var _PickerPanel = _interopRequireDefault(require("./PickerPanel")); var _RangePicker = _interopRequireDefault(require("./RangePicker")); var _default = _Picker.default; exports.default = _default; },{"./Picker":677,"./PickerPanel":678,"./RangePicker":681,"@babel/runtime/helpers/interopRequireDefault":192}],691:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var locale = { locale: 'en_US', today: 'Today', now: 'Now', backToToday: 'Back to today', ok: 'Ok', clear: 'Clear', month: 'Month', year: 'Year', timeSelect: 'select time', dateSelect: 'select date', weekSelect: 'Choose a week', monthSelect: 'Choose a month', yearSelect: 'Choose a year', decadeSelect: 'Choose a decade', yearFormat: 'YYYY', dateFormat: 'M/D/YYYY', dayFormat: 'D', dateTimeFormat: 'M/D/YYYY HH:mm:ss', monthBeforeYear: true, previousMonth: 'Previous month (PageUp)', nextMonth: 'Next month (PageDown)', previousYear: 'Last year (Control + left)', nextYear: 'Next year (Control + right)', previousDecade: 'Last decade', nextDecade: 'Next decade', previousCentury: 'Last century', nextCentury: 'Next century' }; var _default = locale; exports.default = _default; },{}],692:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _dateUtil = require("../../utils/dateUtil"); var _RangeContext = _interopRequireDefault(require("../../RangeContext")); var _useCellClassName = _interopRequireDefault(require("../../hooks/useCellClassName")); var _PanelBody = _interopRequireDefault(require("../PanelBody")); function DateBody(props) { var prefixCls = props.prefixCls, generateConfig = props.generateConfig, prefixColumn = props.prefixColumn, locale = props.locale, rowCount = props.rowCount, viewDate = props.viewDate, value = props.value, dateRender = props.dateRender; var _React$useContext = React.useContext(_RangeContext.default), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue; var baseDate = (0, _dateUtil.getWeekStartDate)(locale.locale, generateConfig, viewDate); var cellPrefixCls = "".concat(prefixCls, "-cell"); var weekFirstDay = generateConfig.locale.getWeekFirstDay(locale.locale); var today = generateConfig.getNow(); // ============================== Header ============================== var headerCells = []; var weekDaysLocale = locale.shortWeekDays || (generateConfig.locale.getShortWeekDays ? generateConfig.locale.getShortWeekDays(locale.locale) : []); if (prefixColumn) { headerCells.push(React.createElement("th", { key: "empty", "aria-label": "empty cell" })); } for (var i = 0; i < _dateUtil.WEEK_DAY_COUNT; i += 1) { headerCells.push(React.createElement("th", { key: i }, weekDaysLocale[(i + weekFirstDay) % _dateUtil.WEEK_DAY_COUNT])); } // =============================== Body =============================== var getCellClassName = (0, _useCellClassName.default)({ cellPrefixCls: cellPrefixCls, today: today, value: value, generateConfig: generateConfig, rangedValue: prefixColumn ? null : rangedValue, hoverRangedValue: prefixColumn ? null : hoverRangedValue, isSameCell: function isSameCell(current, target) { return (0, _dateUtil.isSameDate)(generateConfig, current, target); }, isInView: function isInView(date) { return (0, _dateUtil.isSameMonth)(generateConfig, date, viewDate); }, offsetCell: function offsetCell(date, offset) { return generateConfig.addDate(date, offset); } }); var getCellNode = dateRender ? function (date) { return dateRender(date, today); } : undefined; return React.createElement(_PanelBody.default, Object.assign({}, props, { rowNum: rowCount, colNum: _dateUtil.WEEK_DAY_COUNT, baseDate: baseDate, getCellNode: getCellNode, getCellText: generateConfig.getDate, getCellClassName: getCellClassName, getCellDate: generateConfig.addDate, titleCell: function titleCell(date) { return generateConfig.locale.format(locale.locale, date, 'YYYY-MM-DD'); }, headerCells: headerCells })); } var _default = DateBody; exports.default = _default; },{"../../RangeContext":680,"../../hooks/useCellClassName":683,"../../utils/dateUtil":715,"../PanelBody":703,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],693:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _Header = _interopRequireDefault(require("../Header")); var _PanelContext = _interopRequireDefault(require("../../PanelContext")); function DateHeader(props) { var prefixCls = props.prefixCls, generateConfig = props.generateConfig, locale = props.locale, viewDate = props.viewDate, onNextMonth = props.onNextMonth, onPrevMonth = props.onPrevMonth, onNextYear = props.onNextYear, onPrevYear = props.onPrevYear, onYearClick = props.onYearClick, onMonthClick = props.onMonthClick; var _React$useContext = React.useContext(_PanelContext.default), hideHeader = _React$useContext.hideHeader; if (hideHeader) { return null; } var headerPrefixCls = "".concat(prefixCls, "-header"); var monthsLocale = locale.shortMonths || (generateConfig.locale.getShortMonths ? generateConfig.locale.getShortMonths(locale.locale) : []); var month = generateConfig.getMonth(viewDate); // =================== Month & Year =================== var yearNode = React.createElement("button", { type: "button", key: "year", onClick: onYearClick, tabIndex: -1, className: "".concat(prefixCls, "-year-btn") }, generateConfig.locale.format(locale.locale, viewDate, locale.yearFormat)); var monthNode = React.createElement("button", { type: "button", key: "month", onClick: onMonthClick, tabIndex: -1, className: "".concat(prefixCls, "-month-btn") }, locale.monthFormat ? generateConfig.locale.format(locale.locale, viewDate, locale.monthFormat) : monthsLocale[month]); var monthYearNodes = locale.monthBeforeYear ? [monthNode, yearNode] : [yearNode, monthNode]; return React.createElement(_Header.default, Object.assign({}, props, { prefixCls: headerPrefixCls, onSuperPrev: onPrevYear, onPrev: onPrevMonth, onNext: onNextMonth, onSuperNext: onNextYear }), monthYearNodes); } var _default = DateHeader; exports.default = _default; },{"../../PanelContext":676,"../Header":699,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],694:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _DateBody = _interopRequireDefault(require("./DateBody")); var _DateHeader = _interopRequireDefault(require("./DateHeader")); var _dateUtil = require("../../utils/dateUtil"); var _uiUtil = require("../../utils/uiUtil"); var DATE_ROW_COUNT = 6; function DatePanel(props) { var prefixCls = props.prefixCls, _props$panelName = props.panelName, panelName = _props$panelName === void 0 ? 'date' : _props$panelName, keyboardConfig = props.keyboardConfig, active = props.active, operationRef = props.operationRef, generateConfig = props.generateConfig, value = props.value, viewDate = props.viewDate, onViewDateChange = props.onViewDateChange, onPanelChange = props.onPanelChange, _onSelect = props.onSelect; var panelPrefixCls = "".concat(prefixCls, "-").concat(panelName, "-panel"); // ======================= Keyboard ======================= operationRef.current = { onKeyDown: function onKeyDown(event) { return (0, _uiUtil.createKeyDownHandler)(event, (0, _objectSpread2.default)({ onLeftRight: function onLeftRight(diff) { _onSelect(generateConfig.addDate(value || viewDate, diff), 'key'); }, onCtrlLeftRight: function onCtrlLeftRight(diff) { _onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); }, onUpDown: function onUpDown(diff) { _onSelect(generateConfig.addDate(value || viewDate, diff * _dateUtil.WEEK_DAY_COUNT), 'key'); }, onPageUpDown: function onPageUpDown(diff) { _onSelect(generateConfig.addMonth(value || viewDate, diff), 'key'); } }, keyboardConfig)); } }; // ==================== View Operation ==================== var onYearChange = function onYearChange(diff) { var newDate = generateConfig.addYear(viewDate, diff); onViewDateChange(newDate); onPanelChange(null, newDate); }; var onMonthChange = function onMonthChange(diff) { var newDate = generateConfig.addMonth(viewDate, diff); onViewDateChange(newDate); onPanelChange(null, newDate); }; return React.createElement("div", { className: (0, _classnames.default)(panelPrefixCls, (0, _defineProperty2.default)({}, "".concat(panelPrefixCls, "-active"), active)) }, React.createElement(_DateHeader.default, Object.assign({}, props, { prefixCls: prefixCls, value: value, viewDate: viewDate, // View Operation onPrevYear: function onPrevYear() { onYearChange(-1); }, onNextYear: function onNextYear() { onYearChange(1); }, onPrevMonth: function onPrevMonth() { onMonthChange(-1); }, onNextMonth: function onNextMonth() { onMonthChange(1); }, onMonthClick: function onMonthClick() { onPanelChange('month', viewDate); }, onYearClick: function onYearClick() { onPanelChange('year', viewDate); } })), React.createElement(_DateBody.default, Object.assign({}, props, { onSelect: function onSelect(date) { return _onSelect(date, 'mouse'); }, prefixCls: prefixCls, value: value, viewDate: viewDate, rowCount: DATE_ROW_COUNT }))); } var _default = DatePanel; exports.default = _default; },{"../../utils/dateUtil":715,"../../utils/uiUtil":720,"./DateBody":692,"./DateHeader":693,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"react":"react"}],695:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _DatePanel = _interopRequireDefault(require("../DatePanel")); var _TimePanel = _interopRequireDefault(require("../TimePanel")); var _miscUtil = require("../../utils/miscUtil"); function setTime(generateConfig, date, defaultDate) { if (!defaultDate) { return date; } var newDate = date; newDate = generateConfig.setHour(newDate, generateConfig.getHour(defaultDate)); newDate = generateConfig.setMinute(newDate, generateConfig.getMinute(defaultDate)); newDate = generateConfig.setSecond(newDate, generateConfig.getSecond(defaultDate)); return newDate; } var ACTIVE_PANEL = (0, _miscUtil.tuple)('date', 'time'); function DatetimePanel(props) { var prefixCls = props.prefixCls, operationRef = props.operationRef, generateConfig = props.generateConfig, value = props.value, defaultValue = props.defaultValue, disabledTime = props.disabledTime, showTime = props.showTime, onSelect = props.onSelect; var panelPrefixCls = "".concat(prefixCls, "-datetime-panel"); var _React$useState = React.useState(null), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), activePanel = _React$useState2[0], setActivePanel = _React$useState2[1]; var dateOperationRef = React.useRef({}); var timeOperationRef = React.useRef({}); var timeProps = (0, _typeof2.default)(showTime) === 'object' ? (0, _objectSpread2.default)({}, showTime) : {}; // ======================= Keyboard ======================= function getNextActive(offset) { var activeIndex = ACTIVE_PANEL.indexOf(activePanel) + offset; var nextActivePanel = ACTIVE_PANEL[activeIndex] || null; return nextActivePanel; } var onBlur = function onBlur(e) { if (timeOperationRef.current.onBlur) { timeOperationRef.current.onBlur(e); } setActivePanel(null); }; operationRef.current = { onKeyDown: function onKeyDown(event) { // Switch active panel if (event.which === _KeyCode.default.TAB) { var nextActivePanel = getNextActive(event.shiftKey ? -1 : 1); setActivePanel(nextActivePanel); if (nextActivePanel) { event.preventDefault(); } return true; } // Operate on current active panel if (activePanel) { var ref = activePanel === 'date' ? dateOperationRef : timeOperationRef; if (ref.current && ref.current.onKeyDown) { ref.current.onKeyDown(event); } return true; } // Switch first active panel if operate without panel if ([_KeyCode.default.LEFT, _KeyCode.default.RIGHT, _KeyCode.default.UP, _KeyCode.default.DOWN].includes(event.which)) { setActivePanel('date'); return true; } return false; }, onBlur: onBlur, onClose: onBlur }; // ======================== Events ======================== var onInternalSelect = function onInternalSelect(date, source) { var selectedDate = date; if (source === 'date' && !value && timeProps.defaultValue) { // Date with time defaultValue selectedDate = generateConfig.setHour(selectedDate, generateConfig.getHour(timeProps.defaultValue)); selectedDate = generateConfig.setMinute(selectedDate, generateConfig.getMinute(timeProps.defaultValue)); selectedDate = generateConfig.setSecond(selectedDate, generateConfig.getSecond(timeProps.defaultValue)); } else if (source === 'time' && !value && defaultValue) { selectedDate = generateConfig.setYear(selectedDate, generateConfig.getYear(defaultValue)); selectedDate = generateConfig.setMonth(selectedDate, generateConfig.getMonth(defaultValue)); selectedDate = generateConfig.setDate(selectedDate, generateConfig.getDate(defaultValue)); } if (onSelect) { onSelect(selectedDate, 'mouse'); } }; // ======================== Render ======================== var disabledTimes = disabledTime ? disabledTime(value || null) : {}; return React.createElement("div", { className: (0, _classnames.default)(panelPrefixCls, (0, _defineProperty2.default)({}, "".concat(panelPrefixCls, "-active"), activePanel)) }, React.createElement(_DatePanel.default, Object.assign({}, props, { operationRef: dateOperationRef, active: activePanel === 'date', onSelect: function onSelect(date) { onInternalSelect(setTime(generateConfig, date, showTime && (0, _typeof2.default)(showTime) === 'object' ? showTime.defaultValue : null), 'date'); } })), React.createElement(_TimePanel.default, Object.assign({}, props, { format: undefined }, timeProps, disabledTimes, { defaultValue: undefined, operationRef: timeOperationRef, active: activePanel === 'time', onSelect: function onSelect(date) { onInternalSelect(date, 'time'); } }))); } var _default = DatetimePanel; exports.default = _default; },{"../../utils/miscUtil":718,"../DatePanel":694,"../TimePanel":710,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/typeof":208,"classnames":455,"rc-util/lib/KeyCode":865,"react":"react"}],696:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.DECADE_COL_COUNT = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _ = require("."); var _PanelBody = _interopRequireDefault(require("../PanelBody")); var DECADE_COL_COUNT = 3; exports.DECADE_COL_COUNT = DECADE_COL_COUNT; var DECADE_ROW_COUNT = 4; function DecadeBody(props) { var DECADE_UNIT_DIFF_DES = _.DECADE_UNIT_DIFF - 1; var prefixCls = props.prefixCls, viewDate = props.viewDate, generateConfig = props.generateConfig, disabledDate = props.disabledDate; var cellPrefixCls = "".concat(prefixCls, "-cell"); var yearNumber = generateConfig.getYear(viewDate); var decadeYearNumber = Math.floor(yearNumber / _.DECADE_UNIT_DIFF) * _.DECADE_UNIT_DIFF; var startDecadeYear = Math.floor(yearNumber / _.DECADE_DISTANCE_COUNT) * _.DECADE_DISTANCE_COUNT; var endDecadeYear = startDecadeYear + _.DECADE_DISTANCE_COUNT - 1; var baseDecadeYear = generateConfig.setYear(viewDate, startDecadeYear - Math.ceil((DECADE_COL_COUNT * DECADE_ROW_COUNT * _.DECADE_UNIT_DIFF - _.DECADE_DISTANCE_COUNT) / 2)); var getCellClassName = function getCellClassName(date) { var _ref; var disabled = disabledDate && disabledDate(date); var startDecadeNumber = generateConfig.getYear(date); var endDecadeNumber = startDecadeNumber + DECADE_UNIT_DIFF_DES; return _ref = {}, (0, _defineProperty2.default)(_ref, "".concat(cellPrefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_ref, "".concat(cellPrefixCls, "-in-view"), startDecadeYear <= startDecadeNumber && endDecadeNumber <= endDecadeYear), (0, _defineProperty2.default)(_ref, "".concat(cellPrefixCls, "-selected"), startDecadeNumber === decadeYearNumber), _ref; }; return React.createElement(_PanelBody.default, Object.assign({}, props, { rowNum: DECADE_ROW_COUNT, colNum: DECADE_COL_COUNT, baseDate: baseDecadeYear, getCellText: function getCellText(date) { var startDecadeNumber = generateConfig.getYear(date); return "".concat(startDecadeNumber, "-").concat(startDecadeNumber + DECADE_UNIT_DIFF_DES); }, getCellClassName: getCellClassName, getCellDate: function getCellDate(date, offset) { return generateConfig.addYear(date, offset * _.DECADE_UNIT_DIFF); } })); } var _default = DecadeBody; exports.default = _default; },{".":698,"../PanelBody":703,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],697:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _Header = _interopRequireDefault(require("../Header")); var _ = require("."); var _PanelContext = _interopRequireDefault(require("../../PanelContext")); function DecadeHeader(props) { var prefixCls = props.prefixCls, generateConfig = props.generateConfig, viewDate = props.viewDate, onPrevDecades = props.onPrevDecades, onNextDecades = props.onNextDecades; var _React$useContext = React.useContext(_PanelContext.default), hideHeader = _React$useContext.hideHeader; if (hideHeader) { return null; } var headerPrefixCls = "".concat(prefixCls, "-header"); var yearNumber = generateConfig.getYear(viewDate); var startYear = Math.floor(yearNumber / _.DECADE_DISTANCE_COUNT) * _.DECADE_DISTANCE_COUNT; var endYear = startYear + _.DECADE_DISTANCE_COUNT - 1; return React.createElement(_Header.default, Object.assign({}, props, { prefixCls: headerPrefixCls, onSuperPrev: onPrevDecades, onSuperNext: onNextDecades }), startYear, "-", endYear); } var _default = DecadeHeader; exports.default = _default; },{".":698,"../../PanelContext":676,"../Header":699,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],698:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.DECADE_DISTANCE_COUNT = exports.DECADE_UNIT_DIFF = void 0; var React = _interopRequireWildcard(require("react")); var _DecadeHeader = _interopRequireDefault(require("./DecadeHeader")); var _DecadeBody = _interopRequireWildcard(require("./DecadeBody")); var _uiUtil = require("../../utils/uiUtil"); var DECADE_UNIT_DIFF = 10; exports.DECADE_UNIT_DIFF = DECADE_UNIT_DIFF; var DECADE_DISTANCE_COUNT = DECADE_UNIT_DIFF * 10; exports.DECADE_DISTANCE_COUNT = DECADE_DISTANCE_COUNT; function DecadePanel(props) { var prefixCls = props.prefixCls, onViewDateChange = props.onViewDateChange, generateConfig = props.generateConfig, viewDate = props.viewDate, operationRef = props.operationRef, onSelect = props.onSelect, onPanelChange = props.onPanelChange; var panelPrefixCls = "".concat(prefixCls, "-decade-panel"); // ======================= Keyboard ======================= operationRef.current = { onKeyDown: function onKeyDown(event) { return (0, _uiUtil.createKeyDownHandler)(event, { onLeftRight: function onLeftRight(diff) { onSelect(generateConfig.addYear(viewDate, diff * DECADE_UNIT_DIFF), 'key'); }, onCtrlLeftRight: function onCtrlLeftRight(diff) { onSelect(generateConfig.addYear(viewDate, diff * DECADE_DISTANCE_COUNT), 'key'); }, onUpDown: function onUpDown(diff) { onSelect(generateConfig.addYear(viewDate, diff * DECADE_UNIT_DIFF * _DecadeBody.DECADE_COL_COUNT), 'key'); }, onEnter: function onEnter() { onPanelChange('year', viewDate); } }); } }; // ==================== View Operation ==================== var onDecadesChange = function onDecadesChange(diff) { var newDate = generateConfig.addYear(viewDate, diff * DECADE_DISTANCE_COUNT); onViewDateChange(newDate); onPanelChange(null, newDate); }; var onInternalSelect = function onInternalSelect(date) { onSelect(date, 'mouse'); onPanelChange('year', date); }; return React.createElement("div", { className: panelPrefixCls }, React.createElement(_DecadeHeader.default, Object.assign({}, props, { prefixCls: prefixCls, onPrevDecades: function onPrevDecades() { onDecadesChange(-1); }, onNextDecades: function onNextDecades() { onDecadesChange(1); } })), React.createElement(_DecadeBody.default, Object.assign({}, props, { prefixCls: prefixCls, onSelect: onInternalSelect }))); } var _default = DecadePanel; exports.default = _default; },{"../../utils/uiUtil":720,"./DecadeBody":696,"./DecadeHeader":697,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],699:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _PanelContext = _interopRequireDefault(require("../PanelContext")); var HIDDEN_STYLE = { visibility: 'hidden' }; function Header(_ref) { var prefixCls = _ref.prefixCls, _ref$prevIcon = _ref.prevIcon, prevIcon = _ref$prevIcon === void 0 ? "\u2039" : _ref$prevIcon, _ref$nextIcon = _ref.nextIcon, nextIcon = _ref$nextIcon === void 0 ? "\u203A" : _ref$nextIcon, _ref$superPrevIcon = _ref.superPrevIcon, superPrevIcon = _ref$superPrevIcon === void 0 ? "\xAB" : _ref$superPrevIcon, _ref$superNextIcon = _ref.superNextIcon, superNextIcon = _ref$superNextIcon === void 0 ? "\xBB" : _ref$superNextIcon, onSuperPrev = _ref.onSuperPrev, onSuperNext = _ref.onSuperNext, onPrev = _ref.onPrev, onNext = _ref.onNext, children = _ref.children; var _React$useContext = React.useContext(_PanelContext.default), hideNextBtn = _React$useContext.hideNextBtn, hidePrevBtn = _React$useContext.hidePrevBtn; return React.createElement("div", { className: prefixCls }, onSuperPrev && React.createElement("button", { type: "button", onClick: onSuperPrev, tabIndex: -1, className: "".concat(prefixCls, "-super-prev-btn"), style: hidePrevBtn ? HIDDEN_STYLE : {} }, superPrevIcon), onPrev && React.createElement("button", { type: "button", onClick: onPrev, tabIndex: -1, className: "".concat(prefixCls, "-prev-btn"), style: hidePrevBtn ? HIDDEN_STYLE : {} }, prevIcon), React.createElement("div", { className: "".concat(prefixCls, "-view") }, children), onNext && React.createElement("button", { type: "button", onClick: onNext, tabIndex: -1, className: "".concat(prefixCls, "-next-btn"), style: hideNextBtn ? HIDDEN_STYLE : {} }, nextIcon), onSuperNext && React.createElement("button", { type: "button", onClick: onSuperNext, tabIndex: -1, className: "".concat(prefixCls, "-super-next-btn"), style: hideNextBtn ? HIDDEN_STYLE : {} }, superNextIcon)); } var _default = Header; exports.default = _default; },{"../PanelContext":676,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],700:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.MONTH_COL_COUNT = void 0; var React = _interopRequireWildcard(require("react")); var _dateUtil = require("../../utils/dateUtil"); var _RangeContext = _interopRequireDefault(require("../../RangeContext")); var _useCellClassName = _interopRequireDefault(require("../../hooks/useCellClassName")); var _PanelBody = _interopRequireDefault(require("../PanelBody")); var MONTH_COL_COUNT = 3; exports.MONTH_COL_COUNT = MONTH_COL_COUNT; var MONTH_ROW_COUNT = 4; function MonthBody(props) { var prefixCls = props.prefixCls, locale = props.locale, value = props.value, viewDate = props.viewDate, generateConfig = props.generateConfig, monthCellRender = props.monthCellRender; var _React$useContext = React.useContext(_RangeContext.default), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue; var cellPrefixCls = "".concat(prefixCls, "-cell"); var getCellClassName = (0, _useCellClassName.default)({ cellPrefixCls: cellPrefixCls, value: value, generateConfig: generateConfig, rangedValue: rangedValue, hoverRangedValue: hoverRangedValue, isSameCell: function isSameCell(current, target) { return (0, _dateUtil.isSameMonth)(generateConfig, current, target); }, isInView: function isInView() { return true; }, offsetCell: function offsetCell(date, offset) { return generateConfig.addMonth(date, offset); } }); var monthsLocale = locale.shortMonths || (generateConfig.locale.getShortMonths ? generateConfig.locale.getShortMonths(locale.locale) : []); var baseMonth = generateConfig.setMonth(viewDate, 0); var getCellNode = monthCellRender ? function (date) { return monthCellRender(date, locale); } : undefined; return React.createElement(_PanelBody.default, Object.assign({}, props, { rowNum: MONTH_ROW_COUNT, colNum: MONTH_COL_COUNT, baseDate: baseMonth, getCellNode: getCellNode, getCellText: function getCellText(date) { return locale.monthFormat ? generateConfig.locale.format(locale.locale, date, locale.monthFormat) : monthsLocale[generateConfig.getMonth(date)]; }, getCellClassName: getCellClassName, getCellDate: generateConfig.addMonth, titleCell: function titleCell(date) { return generateConfig.locale.format(locale.locale, date, 'YYYY-MM'); } })); } var _default = MonthBody; exports.default = _default; },{"../../RangeContext":680,"../../hooks/useCellClassName":683,"../../utils/dateUtil":715,"../PanelBody":703,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],701:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _Header = _interopRequireDefault(require("../Header")); var _PanelContext = _interopRequireDefault(require("../../PanelContext")); function MonthHeader(props) { var prefixCls = props.prefixCls, generateConfig = props.generateConfig, locale = props.locale, viewDate = props.viewDate, onNextYear = props.onNextYear, onPrevYear = props.onPrevYear, onYearClick = props.onYearClick; var _React$useContext = React.useContext(_PanelContext.default), hideHeader = _React$useContext.hideHeader; if (hideHeader) { return null; } var headerPrefixCls = "".concat(prefixCls, "-header"); return React.createElement(_Header.default, Object.assign({}, props, { prefixCls: headerPrefixCls, onSuperPrev: onPrevYear, onSuperNext: onNextYear }), React.createElement("button", { type: "button", onClick: onYearClick, className: "".concat(prefixCls, "-year-btn") }, generateConfig.locale.format(locale.locale, viewDate, locale.yearFormat))); } var _default = MonthHeader; exports.default = _default; },{"../../PanelContext":676,"../Header":699,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],702:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _MonthHeader = _interopRequireDefault(require("./MonthHeader")); var _MonthBody = _interopRequireWildcard(require("./MonthBody")); var _uiUtil = require("../../utils/uiUtil"); function MonthPanel(props) { var prefixCls = props.prefixCls, operationRef = props.operationRef, onViewDateChange = props.onViewDateChange, generateConfig = props.generateConfig, value = props.value, viewDate = props.viewDate, onPanelChange = props.onPanelChange, _onSelect = props.onSelect; var panelPrefixCls = "".concat(prefixCls, "-month-panel"); // ======================= Keyboard ======================= operationRef.current = { onKeyDown: function onKeyDown(event) { return (0, _uiUtil.createKeyDownHandler)(event, { onLeftRight: function onLeftRight(diff) { _onSelect(generateConfig.addMonth(value || viewDate, diff), 'key'); }, onCtrlLeftRight: function onCtrlLeftRight(diff) { _onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); }, onUpDown: function onUpDown(diff) { _onSelect(generateConfig.addMonth(value || viewDate, diff * _MonthBody.MONTH_COL_COUNT), 'key'); }, onEnter: function onEnter() { onPanelChange('date', value || viewDate); } }); } }; // ==================== View Operation ==================== var onYearChange = function onYearChange(diff) { var newDate = generateConfig.addYear(viewDate, diff); onViewDateChange(newDate); onPanelChange(null, newDate); }; return React.createElement("div", { className: panelPrefixCls }, React.createElement(_MonthHeader.default, Object.assign({}, props, { prefixCls: prefixCls, onPrevYear: function onPrevYear() { onYearChange(-1); }, onNextYear: function onNextYear() { onYearChange(1); }, onYearClick: function onYearClick() { onPanelChange('year', viewDate); } })), React.createElement(_MonthBody.default, Object.assign({}, props, { prefixCls: prefixCls, onSelect: function onSelect(date) { _onSelect(date, 'mouse'); onPanelChange('date', date); } }))); } var _default = MonthPanel; exports.default = _default; },{"../../utils/uiUtil":720,"./MonthBody":700,"./MonthHeader":701,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],703:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = PanelBody; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _PanelContext = _interopRequireDefault(require("../PanelContext")); function PanelBody(_ref) { var prefixCls = _ref.prefixCls, disabledDate = _ref.disabledDate, onSelect = _ref.onSelect, rowNum = _ref.rowNum, colNum = _ref.colNum, prefixColumn = _ref.prefixColumn, rowClassName = _ref.rowClassName, baseDate = _ref.baseDate, getCellClassName = _ref.getCellClassName, getCellText = _ref.getCellText, getCellNode = _ref.getCellNode, getCellDate = _ref.getCellDate, titleCell = _ref.titleCell, headerCells = _ref.headerCells; var _React$useContext = React.useContext(_PanelContext.default), onDateMouseEnter = _React$useContext.onDateMouseEnter, onDateMouseLeave = _React$useContext.onDateMouseLeave; var cellPrefixCls = "".concat(prefixCls, "-cell"); // =============================== Body =============================== var rows = []; for (var i = 0; i < rowNum; i += 1) { var row = []; var rowStartDate = void 0; var _loop = function _loop(j) { var offset = i * colNum + j; var currentDate = getCellDate(baseDate, offset); var disabled = disabledDate && disabledDate(currentDate); if (j === 0) { rowStartDate = currentDate; if (prefixColumn) { row.push(prefixColumn(rowStartDate)); } } row.push(React.createElement("td", { key: j, title: titleCell && titleCell(currentDate), className: (0, _classnames.default)(cellPrefixCls, (0, _objectSpread3.default)((0, _defineProperty2.default)({}, "".concat(cellPrefixCls, "-disabled"), disabled), getCellClassName(currentDate))), onClick: function onClick() { if (!disabled) { onSelect(currentDate); } }, onMouseEnter: function onMouseEnter() { if (!disabled && onDateMouseEnter) { onDateMouseEnter(currentDate); } }, onMouseLeave: function onMouseLeave() { if (!disabled && onDateMouseLeave) { onDateMouseLeave(currentDate); } } }, getCellNode ? getCellNode(currentDate) : React.createElement("div", { className: "".concat(cellPrefixCls, "-inner") }, getCellText(currentDate)))); }; for (var j = 0; j < colNum; j += 1) { _loop(j); } rows.push(React.createElement("tr", { key: i, className: rowClassName && rowClassName(rowStartDate) }, row)); } return React.createElement("div", { className: "".concat(prefixCls, "-body") }, React.createElement("table", { className: "".concat(prefixCls, "-content") }, headerCells && React.createElement("thead", null, React.createElement("tr", null, headerCells)), React.createElement("tbody", null, rows))); } },{"../PanelContext":676,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"react":"react"}],704:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.QUARTER_COL_COUNT = void 0; var React = _interopRequireWildcard(require("react")); var _dateUtil = require("../../utils/dateUtil"); var _RangeContext = _interopRequireDefault(require("../../RangeContext")); var _useCellClassName = _interopRequireDefault(require("../../hooks/useCellClassName")); var _PanelBody = _interopRequireDefault(require("../PanelBody")); var QUARTER_COL_COUNT = 4; exports.QUARTER_COL_COUNT = QUARTER_COL_COUNT; var QUARTER_ROW_COUNT = 1; function QuarterBody(props) { var prefixCls = props.prefixCls, locale = props.locale, value = props.value, viewDate = props.viewDate, generateConfig = props.generateConfig; var _React$useContext = React.useContext(_RangeContext.default), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue; var cellPrefixCls = "".concat(prefixCls, "-cell"); var getCellClassName = (0, _useCellClassName.default)({ cellPrefixCls: cellPrefixCls, value: value, generateConfig: generateConfig, rangedValue: rangedValue, hoverRangedValue: hoverRangedValue, isSameCell: function isSameCell(current, target) { return (0, _dateUtil.isSameQuarter)(generateConfig, current, target); }, isInView: function isInView() { return true; }, offsetCell: function offsetCell(date, offset) { return generateConfig.addMonth(date, offset * 3); } }); var baseQuarter = generateConfig.setDate(generateConfig.setMonth(viewDate, 0), 1); return React.createElement(_PanelBody.default, Object.assign({}, props, { rowNum: QUARTER_ROW_COUNT, colNum: QUARTER_COL_COUNT, baseDate: baseQuarter, getCellText: function getCellText(date) { return generateConfig.locale.format(locale.locale, date, locale.quarterFormat || '[Q]Q'); }, getCellClassName: getCellClassName, getCellDate: function getCellDate(date, offset) { return generateConfig.addMonth(date, offset * 3); }, titleCell: function titleCell(date) { return generateConfig.locale.format(locale.locale, date, 'YYYY-[Q]Q'); } })); } var _default = QuarterBody; exports.default = _default; },{"../../RangeContext":680,"../../hooks/useCellClassName":683,"../../utils/dateUtil":715,"../PanelBody":703,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],705:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _Header = _interopRequireDefault(require("../Header")); var _PanelContext = _interopRequireDefault(require("../../PanelContext")); function QuarterHeader(props) { var prefixCls = props.prefixCls, generateConfig = props.generateConfig, locale = props.locale, viewDate = props.viewDate, onNextYear = props.onNextYear, onPrevYear = props.onPrevYear, onYearClick = props.onYearClick; var _React$useContext = React.useContext(_PanelContext.default), hideHeader = _React$useContext.hideHeader; if (hideHeader) { return null; } var headerPrefixCls = "".concat(prefixCls, "-header"); return React.createElement(_Header.default, Object.assign({}, props, { prefixCls: headerPrefixCls, onSuperPrev: onPrevYear, onSuperNext: onNextYear }), React.createElement("button", { type: "button", onClick: onYearClick, className: "".concat(prefixCls, "-year-btn") }, generateConfig.locale.format(locale.locale, viewDate, locale.yearFormat))); } var _default = QuarterHeader; exports.default = _default; },{"../../PanelContext":676,"../Header":699,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],706:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _QuarterHeader = _interopRequireDefault(require("./QuarterHeader")); var _QuarterBody = _interopRequireDefault(require("./QuarterBody")); var _uiUtil = require("../../utils/uiUtil"); function QuarterPanel(props) { var prefixCls = props.prefixCls, operationRef = props.operationRef, onViewDateChange = props.onViewDateChange, generateConfig = props.generateConfig, value = props.value, viewDate = props.viewDate, onPanelChange = props.onPanelChange, _onSelect = props.onSelect; var panelPrefixCls = "".concat(prefixCls, "-quarter-panel"); // ======================= Keyboard ======================= operationRef.current = { onKeyDown: function onKeyDown(event) { return (0, _uiUtil.createKeyDownHandler)(event, { onLeftRight: function onLeftRight(diff) { _onSelect(generateConfig.addMonth(value || viewDate, diff * 3), 'key'); }, onCtrlLeftRight: function onCtrlLeftRight(diff) { _onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); }, onUpDown: function onUpDown(diff) { _onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); } }); } }; // ==================== View Operation ==================== var onYearChange = function onYearChange(diff) { var newDate = generateConfig.addYear(viewDate, diff); onViewDateChange(newDate); onPanelChange(null, newDate); }; return React.createElement("div", { className: panelPrefixCls }, React.createElement(_QuarterHeader.default, Object.assign({}, props, { prefixCls: prefixCls, onPrevYear: function onPrevYear() { onYearChange(-1); }, onNextYear: function onNextYear() { onYearChange(1); }, onYearClick: function onYearClick() { onPanelChange('year', viewDate); } })), React.createElement(_QuarterBody.default, Object.assign({}, props, { prefixCls: prefixCls, onSelect: function onSelect(date) { _onSelect(date, 'mouse'); } }))); } var _default = QuarterPanel; exports.default = _default; },{"../../utils/uiUtil":720,"./QuarterBody":704,"./QuarterHeader":705,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],707:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _useMemo = _interopRequireDefault(require("rc-util/lib/hooks/useMemo")); var _TimeUnitColumn = _interopRequireDefault(require("./TimeUnitColumn")); var _miscUtil = require("../../utils/miscUtil"); var _timeUtil = require("../../utils/timeUtil"); function shouldUnitsUpdate(prevUnits, nextUnits) { if (prevUnits.length !== nextUnits.length) return true; // if any unit's disabled status is different, the units should be re-evaluted for (var i = 0; i < prevUnits.length; i += 1) { if (prevUnits[i].disabled !== nextUnits[i].disabled) return true; } return false; } function generateUnits(start, end, step, disabledUnits) { var units = []; for (var i = start; i <= end; i += step) { units.push({ label: (0, _miscUtil.leftPad)(i, 2), value: i, disabled: (disabledUnits || []).includes(i) }); } return units; } function TimeBody(props) { var generateConfig = props.generateConfig, prefixCls = props.prefixCls, operationRef = props.operationRef, activeColumnIndex = props.activeColumnIndex, value = props.value, showHour = props.showHour, showMinute = props.showMinute, showSecond = props.showSecond, use12Hours = props.use12Hours, _props$hourStep = props.hourStep, hourStep = _props$hourStep === void 0 ? 1 : _props$hourStep, _props$minuteStep = props.minuteStep, minuteStep = _props$minuteStep === void 0 ? 1 : _props$minuteStep, _props$secondStep = props.secondStep, secondStep = _props$secondStep === void 0 ? 1 : _props$secondStep, disabledHours = props.disabledHours, disabledMinutes = props.disabledMinutes, disabledSeconds = props.disabledSeconds, hideDisabledOptions = props.hideDisabledOptions, onSelect = props.onSelect; var columns = []; var contentPrefixCls = "".concat(prefixCls, "-content"); var columnPrefixCls = "".concat(prefixCls, "-time-panel"); var isPM; var hour = value ? generateConfig.getHour(value) : -1; var minute = value ? generateConfig.getMinute(value) : -1; var second = value ? generateConfig.getSecond(value) : -1; var setTime = function setTime(isNewPM, newHour, newMinute, newSecond) { var newDate = value || generateConfig.getNow(); var mergedHour = Math.max(0, newHour); var mergedMinute = Math.max(0, newMinute); var mergedSecond = Math.max(0, newSecond); newDate = (0, _timeUtil.setTime)(generateConfig, newDate, !use12Hours || !isNewPM ? mergedHour : mergedHour + 12, mergedMinute, mergedSecond); return newDate; }; // ========================= Unit ========================= var rawHours = generateUnits(0, 23, hourStep, disabledHours && disabledHours()); var memorizedRawHours = (0, _useMemo.default)(function () { return rawHours; }, rawHours, shouldUnitsUpdate); // Should additional logic to handle 12 hours if (use12Hours) { isPM = hour >= 12; // -1 means should display AM hour %= 12; } var _React$useMemo = React.useMemo(function () { if (!use12Hours) { return [false, false]; } var AMPMDisabled = [true, true]; memorizedRawHours.forEach(function (_ref) { var disabled = _ref.disabled, hourValue = _ref.value; if (disabled) return; if (hourValue >= 12) { AMPMDisabled[1] = false; } else { AMPMDisabled[0] = false; } }); return AMPMDisabled; }, [use12Hours, memorizedRawHours]), _React$useMemo2 = (0, _slicedToArray2.default)(_React$useMemo, 2), AMDisabled = _React$useMemo2[0], PMDisabled = _React$useMemo2[1]; var hours = React.useMemo(function () { if (!use12Hours) return memorizedRawHours; return memorizedRawHours.filter(isPM ? function (hourMeta) { return hourMeta.value >= 12; } : function (hourMeta) { return hourMeta.value < 12; }).map(function (hourMeta) { var hourValue = hourMeta.value % 12; var hourLabel = hourValue === 0 ? '12' : (0, _miscUtil.leftPad)(hourValue, 2); return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, hourMeta), {}, { label: hourLabel, value: hourValue }); }); }, [use12Hours, memorizedRawHours]); var minutes = generateUnits(0, 59, minuteStep, disabledMinutes && disabledMinutes(hour)); var seconds = generateUnits(0, 59, secondStep, disabledSeconds && disabledSeconds(hour, minute)); // ====================== Operations ====================== operationRef.current = { onUpDown: function onUpDown(diff) { var column = columns[activeColumnIndex]; if (column) { var valueIndex = column.units.findIndex(function (unit) { return unit.value === column.value; }); var unitLen = column.units.length; for (var i = 1; i < unitLen; i += 1) { var nextUnit = column.units[(valueIndex + diff * i + unitLen) % unitLen]; if (nextUnit.disabled !== true) { column.onSelect(nextUnit.value); break; } } } } }; // ======================== Render ======================== function addColumnNode(condition, node, columnValue, units, onColumnSelect) { if (condition !== false) { columns.push({ node: React.cloneElement(node, { prefixCls: columnPrefixCls, value: columnValue, active: activeColumnIndex === columns.length, onSelect: onColumnSelect, units: units, hideDisabledOptions: hideDisabledOptions }), onSelect: onColumnSelect, value: columnValue, units: units }); } } // Hour addColumnNode(showHour, React.createElement(_TimeUnitColumn.default, { key: "hour" }), hour, hours, function (num) { onSelect(setTime(isPM, num, minute, second), 'mouse'); }); // Minute addColumnNode(showMinute, React.createElement(_TimeUnitColumn.default, { key: "minute" }), minute, minutes, function (num) { onSelect(setTime(isPM, hour, num, second), 'mouse'); }); // Second addColumnNode(showSecond, React.createElement(_TimeUnitColumn.default, { key: "second" }), second, seconds, function (num) { onSelect(setTime(isPM, hour, minute, num), 'mouse'); }); // 12 Hours var PMIndex = -1; if (typeof isPM === 'boolean') { PMIndex = isPM ? 1 : 0; } addColumnNode(use12Hours === true, React.createElement(_TimeUnitColumn.default, { key: "12hours" }), PMIndex, [{ label: 'AM', value: 0, disabled: AMDisabled }, { label: 'PM', value: 1, disabled: PMDisabled }], function (num) { onSelect(setTime(!!num, hour, minute, second), 'mouse'); }); return React.createElement("div", { className: contentPrefixCls }, columns.map(function (_ref2) { var node = _ref2.node; return node; })); } var _default = TimeBody; exports.default = _default; },{"../../utils/miscUtil":718,"../../utils/timeUtil":719,"./TimeUnitColumn":709,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"rc-util/lib/hooks/useMemo":870,"react":"react"}],708:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _Header = _interopRequireDefault(require("../Header")); var _PanelContext = _interopRequireDefault(require("../../PanelContext")); function TimeHeader(props) { var _React$useContext = React.useContext(_PanelContext.default), hideHeader = _React$useContext.hideHeader; if (hideHeader) { return null; } var prefixCls = props.prefixCls, generateConfig = props.generateConfig, locale = props.locale, value = props.value, format = props.format; var headerPrefixCls = "".concat(prefixCls, "-header"); return React.createElement(_Header.default, { prefixCls: headerPrefixCls }, value ? generateConfig.locale.format(locale.locale, value, format) : "\xA0"); } var _default = TimeHeader; exports.default = _default; },{"../../PanelContext":676,"../Header":699,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],709:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _uiUtil = require("../../utils/uiUtil"); var _PanelContext = _interopRequireDefault(require("../../PanelContext")); function TimeUnitColumn(props) { var prefixCls = props.prefixCls, units = props.units, onSelect = props.onSelect, value = props.value, active = props.active, hideDisabledOptions = props.hideDisabledOptions; var cellPrefixCls = "".concat(prefixCls, "-cell"); var _React$useContext = React.useContext(_PanelContext.default), open = _React$useContext.open; var ulRef = React.useRef(null); var liRefs = React.useRef(new Map()); // `useLayoutEffect` here to avoid blink by duration is 0 React.useLayoutEffect(function () { var li = liRefs.current.get(value); if (li && open !== false) { (0, _uiUtil.scrollTo)(ulRef.current, li.offsetTop, 120); } }, [value]); React.useLayoutEffect(function () { if (open) { var li = liRefs.current.get(value); if (li) { (0, _uiUtil.scrollTo)(ulRef.current, li.offsetTop, 0); } } }, [open]); return React.createElement("ul", { className: (0, _classnames.default)("".concat(prefixCls, "-column"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-column-active"), active)), ref: ulRef, style: { position: 'relative' } }, units.map(function (unit) { var _classNames2; if (hideDisabledOptions && unit.disabled) { return null; } return React.createElement("li", { key: unit.value, ref: function ref(element) { liRefs.current.set(unit.value, element); }, className: (0, _classnames.default)(cellPrefixCls, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, "".concat(cellPrefixCls, "-disabled"), unit.disabled), (0, _defineProperty2.default)(_classNames2, "".concat(cellPrefixCls, "-selected"), value === unit.value), _classNames2)), onClick: function onClick() { if (unit.disabled) { return; } onSelect(unit.value); } }, React.createElement("div", { className: "".concat(cellPrefixCls, "-inner") }, unit.label)); })); } var _default = TimeUnitColumn; exports.default = _default; },{"../../PanelContext":676,"../../utils/uiUtil":720,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],710:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _TimeHeader = _interopRequireDefault(require("./TimeHeader")); var _TimeBody = _interopRequireDefault(require("./TimeBody")); var _uiUtil = require("../../utils/uiUtil"); var countBoolean = function countBoolean(boolList) { return boolList.filter(function (bool) { return bool !== false; }).length; }; function TimePanel(props) { var generateConfig = props.generateConfig, _props$format = props.format, format = _props$format === void 0 ? 'HH:mm:ss' : _props$format, prefixCls = props.prefixCls, active = props.active, operationRef = props.operationRef, showHour = props.showHour, showMinute = props.showMinute, showSecond = props.showSecond, _props$use12Hours = props.use12Hours, use12Hours = _props$use12Hours === void 0 ? false : _props$use12Hours, onSelect = props.onSelect, value = props.value; var panelPrefixCls = "".concat(prefixCls, "-time-panel"); var bodyOperationRef = React.useRef(); // ======================= Keyboard ======================= var _React$useState = React.useState(-1), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), activeColumnIndex = _React$useState2[0], setActiveColumnIndex = _React$useState2[1]; var columnsCount = countBoolean([showHour, showMinute, showSecond, use12Hours]); operationRef.current = { onKeyDown: function onKeyDown(event) { return (0, _uiUtil.createKeyDownHandler)(event, { onLeftRight: function onLeftRight(diff) { setActiveColumnIndex((activeColumnIndex + diff + columnsCount) % columnsCount); }, onUpDown: function onUpDown(diff) { if (activeColumnIndex === -1) { setActiveColumnIndex(0); } else if (bodyOperationRef.current) { bodyOperationRef.current.onUpDown(diff); } }, onEnter: function onEnter() { onSelect(value || generateConfig.getNow(), 'key'); setActiveColumnIndex(-1); } }); }, onBlur: function onBlur() { setActiveColumnIndex(-1); } }; return React.createElement("div", { className: (0, _classnames.default)(panelPrefixCls, (0, _defineProperty2.default)({}, "".concat(panelPrefixCls, "-active"), active)) }, React.createElement(_TimeHeader.default, Object.assign({}, props, { format: format, prefixCls: prefixCls })), React.createElement(_TimeBody.default, Object.assign({}, props, { prefixCls: prefixCls, activeColumnIndex: activeColumnIndex, operationRef: bodyOperationRef }))); } var _default = TimePanel; exports.default = _default; },{"../../utils/uiUtil":720,"./TimeBody":707,"./TimeHeader":708,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"react":"react"}],711:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _DatePanel = _interopRequireDefault(require("../DatePanel")); var _dateUtil = require("../../utils/dateUtil"); function WeekPanel(props) { var prefixCls = props.prefixCls, generateConfig = props.generateConfig, locale = props.locale, value = props.value; // Render additional column var cellPrefixCls = "".concat(prefixCls, "-cell"); var prefixColumn = function prefixColumn(date) { return React.createElement("td", { key: "week", className: (0, _classnames.default)(cellPrefixCls, "".concat(cellPrefixCls, "-week")) }, generateConfig.locale.getWeek(locale.locale, date)); }; // Add row className var rowPrefixCls = "".concat(prefixCls, "-week-panel-row"); var rowClassName = function rowClassName(date) { return (0, _classnames.default)(rowPrefixCls, (0, _defineProperty2.default)({}, "".concat(rowPrefixCls, "-selected"), (0, _dateUtil.isSameWeek)(generateConfig, locale.locale, value, date))); }; return React.createElement(_DatePanel.default, Object.assign({}, props, { panelName: "week", prefixColumn: prefixColumn, rowClassName: rowClassName, keyboardConfig: { onLeftRight: null } })); } var _default = WeekPanel; exports.default = _default; },{"../../utils/dateUtil":715,"../DatePanel":694,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],712:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.YEAR_COL_COUNT = void 0; var React = _interopRequireWildcard(require("react")); var _ = require("."); var _useCellClassName = _interopRequireDefault(require("../../hooks/useCellClassName")); var _dateUtil = require("../../utils/dateUtil"); var _RangeContext = _interopRequireDefault(require("../../RangeContext")); var _PanelBody = _interopRequireDefault(require("../PanelBody")); var YEAR_COL_COUNT = 3; exports.YEAR_COL_COUNT = YEAR_COL_COUNT; var YEAR_ROW_COUNT = 4; function YearBody(props) { var prefixCls = props.prefixCls, value = props.value, viewDate = props.viewDate, locale = props.locale, generateConfig = props.generateConfig; var _React$useContext = React.useContext(_RangeContext.default), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue; var yearPrefixCls = "".concat(prefixCls, "-cell"); // =============================== Year =============================== var yearNumber = generateConfig.getYear(viewDate); var startYear = Math.floor(yearNumber / _.YEAR_DECADE_COUNT) * _.YEAR_DECADE_COUNT; var endYear = startYear + _.YEAR_DECADE_COUNT - 1; var baseYear = generateConfig.setYear(viewDate, startYear - Math.ceil((YEAR_COL_COUNT * YEAR_ROW_COUNT - _.YEAR_DECADE_COUNT) / 2)); var isInView = function isInView(date) { var currentYearNumber = generateConfig.getYear(date); return startYear <= currentYearNumber && currentYearNumber <= endYear; }; var getCellClassName = (0, _useCellClassName.default)({ cellPrefixCls: yearPrefixCls, value: value, generateConfig: generateConfig, rangedValue: rangedValue, hoverRangedValue: hoverRangedValue, isSameCell: function isSameCell(current, target) { return (0, _dateUtil.isSameYear)(generateConfig, current, target); }, isInView: isInView, offsetCell: function offsetCell(date, offset) { return generateConfig.addYear(date, offset); } }); return React.createElement(_PanelBody.default, Object.assign({}, props, { rowNum: YEAR_ROW_COUNT, colNum: YEAR_COL_COUNT, baseDate: baseYear, getCellText: generateConfig.getYear, getCellClassName: getCellClassName, getCellDate: generateConfig.addYear, titleCell: function titleCell(date) { return generateConfig.locale.format(locale.locale, date, 'YYYY'); } })); } var _default = YearBody; exports.default = _default; },{".":714,"../../RangeContext":680,"../../hooks/useCellClassName":683,"../../utils/dateUtil":715,"../PanelBody":703,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],713:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _Header = _interopRequireDefault(require("../Header")); var _ = require("."); var _PanelContext = _interopRequireDefault(require("../../PanelContext")); function YearHeader(props) { var prefixCls = props.prefixCls, generateConfig = props.generateConfig, viewDate = props.viewDate, onPrevDecade = props.onPrevDecade, onNextDecade = props.onNextDecade, onDecadeClick = props.onDecadeClick; var _React$useContext = React.useContext(_PanelContext.default), hideHeader = _React$useContext.hideHeader; if (hideHeader) { return null; } var headerPrefixCls = "".concat(prefixCls, "-header"); var yearNumber = generateConfig.getYear(viewDate); var startYear = Math.floor(yearNumber / _.YEAR_DECADE_COUNT) * _.YEAR_DECADE_COUNT; var endYear = startYear + _.YEAR_DECADE_COUNT - 1; return React.createElement(_Header.default, Object.assign({}, props, { prefixCls: headerPrefixCls, onSuperPrev: onPrevDecade, onSuperNext: onNextDecade }), React.createElement("button", { type: "button", onClick: onDecadeClick, className: "".concat(prefixCls, "-decade-btn") }, startYear, "-", endYear)); } var _default = YearHeader; exports.default = _default; },{".":714,"../../PanelContext":676,"../Header":699,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],714:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.YEAR_DECADE_COUNT = void 0; var React = _interopRequireWildcard(require("react")); var _YearHeader = _interopRequireDefault(require("./YearHeader")); var _YearBody = _interopRequireWildcard(require("./YearBody")); var _uiUtil = require("../../utils/uiUtil"); var YEAR_DECADE_COUNT = 10; exports.YEAR_DECADE_COUNT = YEAR_DECADE_COUNT; function YearPanel(props) { var prefixCls = props.prefixCls, operationRef = props.operationRef, onViewDateChange = props.onViewDateChange, generateConfig = props.generateConfig, value = props.value, viewDate = props.viewDate, sourceMode = props.sourceMode, _onSelect = props.onSelect, onPanelChange = props.onPanelChange; var panelPrefixCls = "".concat(prefixCls, "-year-panel"); // ======================= Keyboard ======================= operationRef.current = { onKeyDown: function onKeyDown(event) { return (0, _uiUtil.createKeyDownHandler)(event, { onLeftRight: function onLeftRight(diff) { _onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); }, onCtrlLeftRight: function onCtrlLeftRight(diff) { _onSelect(generateConfig.addYear(value || viewDate, diff * YEAR_DECADE_COUNT), 'key'); }, onUpDown: function onUpDown(diff) { _onSelect(generateConfig.addYear(value || viewDate, diff * _YearBody.YEAR_COL_COUNT), 'key'); }, onEnter: function onEnter() { onPanelChange(sourceMode === 'date' ? 'date' : 'month', value || viewDate); } }); } }; // ==================== View Operation ==================== var onDecadeChange = function onDecadeChange(diff) { var newDate = generateConfig.addYear(viewDate, diff * 10); onViewDateChange(newDate); onPanelChange(null, newDate); }; return React.createElement("div", { className: panelPrefixCls }, React.createElement(_YearHeader.default, Object.assign({}, props, { prefixCls: prefixCls, onPrevDecade: function onPrevDecade() { onDecadeChange(-1); }, onNextDecade: function onNextDecade() { onDecadeChange(1); }, onDecadeClick: function onDecadeClick() { onPanelChange('decade', viewDate); } })), React.createElement(_YearBody.default, Object.assign({}, props, { prefixCls: prefixCls, onSelect: function onSelect(date) { onPanelChange(sourceMode === 'date' ? 'date' : 'month', date); _onSelect(date, 'mouse'); } }))); } var _default = YearPanel; exports.default = _default; },{"../../utils/uiUtil":720,"./YearBody":712,"./YearHeader":713,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],715:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isNullEqual = isNullEqual; exports.isSameDecade = isSameDecade; exports.isSameYear = isSameYear; exports.getQuarter = getQuarter; exports.isSameQuarter = isSameQuarter; exports.isSameMonth = isSameMonth; exports.isSameDate = isSameDate; exports.isSameTime = isSameTime; exports.isSameWeek = isSameWeek; exports.isEqual = isEqual; exports.isInRange = isInRange; exports.getWeekStartDate = getWeekStartDate; exports.getClosingViewDate = getClosingViewDate; exports.WEEK_DAY_COUNT = void 0; var WEEK_DAY_COUNT = 7; exports.WEEK_DAY_COUNT = WEEK_DAY_COUNT; function isNullEqual(value1, value2) { if (!value1 && !value2) { return true; } if (!value1 || !value2) { return false; } return undefined; } function isSameDecade(generateConfig, decade1, decade2) { var equal = isNullEqual(decade1, decade2); if (typeof equal === 'boolean') { return equal; } var num1 = Math.floor(generateConfig.getYear(decade1) / 10); var num2 = Math.floor(generateConfig.getYear(decade2) / 10); return num1 === num2; } function isSameYear(generateConfig, year1, year2) { var equal = isNullEqual(year1, year2); if (typeof equal === 'boolean') { return equal; } return generateConfig.getYear(year1) === generateConfig.getYear(year2); } function getQuarter(generateConfig, date) { var quota = Math.floor(generateConfig.getMonth(date) / 3); return quota + 1; } function isSameQuarter(generateConfig, quarter1, quarter2) { var equal = isNullEqual(quarter1, quarter2); if (typeof equal === 'boolean') { return equal; } return isSameYear(generateConfig, quarter1, quarter2) && getQuarter(generateConfig, quarter1) === getQuarter(generateConfig, quarter2); } function isSameMonth(generateConfig, month1, month2) { var equal = isNullEqual(month1, month2); if (typeof equal === 'boolean') { return equal; } return isSameYear(generateConfig, month1, month2) && generateConfig.getMonth(month1) === generateConfig.getMonth(month2); } function isSameDate(generateConfig, date1, date2) { var equal = isNullEqual(date1, date2); if (typeof equal === 'boolean') { return equal; } return generateConfig.getYear(date1) === generateConfig.getYear(date2) && generateConfig.getMonth(date1) === generateConfig.getMonth(date2) && generateConfig.getDate(date1) === generateConfig.getDate(date2); } function isSameTime(generateConfig, time1, time2) { var equal = isNullEqual(time1, time2); if (typeof equal === 'boolean') { return equal; } return generateConfig.getHour(time1) === generateConfig.getHour(time2) && generateConfig.getMinute(time1) === generateConfig.getMinute(time2) && generateConfig.getSecond(time1) === generateConfig.getSecond(time2); } function isSameWeek(generateConfig, locale, date1, date2) { var equal = isNullEqual(date1, date2); if (typeof equal === 'boolean') { return equal; } return generateConfig.locale.getWeek(locale, date1) === generateConfig.locale.getWeek(locale, date2); } function isEqual(generateConfig, value1, value2) { return isSameDate(generateConfig, value1, value2) && isSameTime(generateConfig, value1, value2); } /** Between in date but not equal of date */ function isInRange(generateConfig, startDate, endDate, current) { if (!startDate || !endDate || !current) { return false; } return !isSameDate(generateConfig, startDate, current) && !isSameDate(generateConfig, endDate, current) && generateConfig.isAfter(current, startDate) && generateConfig.isAfter(endDate, current); } function getWeekStartDate(locale, generateConfig, value) { var weekFirstDay = generateConfig.locale.getWeekFirstDay(locale); var monthStartDate = generateConfig.setDate(value, 1); var startDateWeekDay = generateConfig.getWeekDay(monthStartDate); var alignStartDate = generateConfig.addDate(monthStartDate, weekFirstDay - startDateWeekDay); if (generateConfig.getMonth(alignStartDate) === generateConfig.getMonth(value) && generateConfig.getDate(alignStartDate) > 1) { alignStartDate = generateConfig.addDate(alignStartDate, -7); } return alignStartDate; } function getClosingViewDate(viewDate, picker, generateConfig) { var offset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; switch (picker) { case 'year': return generateConfig.addYear(viewDate, offset * 10); case 'quarter': case 'month': return generateConfig.addYear(viewDate, offset); default: return generateConfig.addMonth(viewDate, offset); } } },{}],716:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = getExtraFooter; var React = _interopRequireWildcard(require("react")); function getExtraFooter(prefixCls, mode, renderExtraFooter) { if (!renderExtraFooter) { return null; } return React.createElement("div", { className: "".concat(prefixCls, "-footer-extra") }, renderExtraFooter(mode)); } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],717:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = getRanges; var React = _interopRequireWildcard(require("react")); function getRanges(_ref) { var prefixCls = _ref.prefixCls, _ref$rangeList = _ref.rangeList, rangeList = _ref$rangeList === void 0 ? [] : _ref$rangeList, _ref$components = _ref.components, components = _ref$components === void 0 ? {} : _ref$components, needConfirmButton = _ref.needConfirmButton, onNow = _ref.onNow, onOk = _ref.onOk, okDisabled = _ref.okDisabled, showNow = _ref.showNow, locale = _ref.locale; var presetNode; var okNode; if (rangeList.length) { var Item = components.rangeItem || 'span'; presetNode = React.createElement(React.Fragment, null, rangeList.map(function (_ref2) { var label = _ref2.label, onClick = _ref2.onClick, onMouseEnter = _ref2.onMouseEnter, onMouseLeave = _ref2.onMouseLeave; return React.createElement("li", { key: label, className: "".concat(prefixCls, "-preset") }, React.createElement(Item, { onClick: onClick, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave }, label)); })); } if (needConfirmButton) { var Button = components.button || 'button'; if (onNow && !presetNode && showNow !== false) { presetNode = React.createElement("li", { className: "".concat(prefixCls, "-now") }, React.createElement("a", { className: "".concat(prefixCls, "-now-btn"), onClick: onNow }, locale.now)); } okNode = needConfirmButton && React.createElement("li", { className: "".concat(prefixCls, "-ok") }, React.createElement(Button, { disabled: okDisabled, onClick: onOk }, locale.ok)); } if (!presetNode && !okNode) { return null; } return React.createElement("ul", { className: "".concat(prefixCls, "-ranges") }, presetNode, okNode); } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],718:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.leftPad = leftPad; exports.toArray = toArray; exports.default = getDataOrAriaProps; exports.getValue = getValue; exports.updateValues = updateValues; exports.tuple = void 0; function leftPad(str, length) { var fill = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0'; var current = String(str); while (current.length < length) { current = "".concat(fill).concat(str); } return current; } var tuple = function tuple() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return args; }; exports.tuple = tuple; function toArray(val) { if (val === null || val === undefined) { return []; } return Array.isArray(val) ? val : [val]; } function getDataOrAriaProps(props) { var retProps = {}; Object.keys(props).forEach(function (key) { if ((key.substr(0, 5) === 'data-' || key.substr(0, 5) === 'aria-' || key === 'role' || key === 'name') && key.substr(0, 7) !== 'data-__') { retProps[key] = props[key]; } }); return retProps; } function getValue(values, index) { return values ? values[index] : null; } function updateValues(values, value, index) { var newValues = [getValue(values, 0), getValue(values, 1)]; newValues[index] = typeof value === 'function' ? value(newValues[index]) : value; if (!newValues[0] && !newValues[1]) { return null; } return newValues; } },{}],719:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setTime = setTime; exports.getLowerBoundTime = getLowerBoundTime; function setTime(generateConfig, date, hour, minute, second) { var nextTime = generateConfig.setHour(date, hour); nextTime = generateConfig.setMinute(nextTime, minute); nextTime = generateConfig.setSecond(nextTime, second); return nextTime; } function getLowerBoundTime(hour, minute, second, hourStep, minuteStep, secondStep) { var lowerBoundHour = Math.floor(hour / hourStep) * hourStep; if (lowerBoundHour < hour) { return [lowerBoundHour, 60 - minuteStep, 60 - secondStep]; } var lowerBoundMinute = Math.floor(minute / minuteStep) * minuteStep; if (lowerBoundMinute < minute) { return [lowerBoundHour, lowerBoundMinute, 60 - secondStep]; } var lowerBoundSecond = Math.floor(second / secondStep) * secondStep; return [lowerBoundHour, lowerBoundMinute, lowerBoundSecond]; } },{}],720:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.scrollTo = scrollTo; exports.createKeyDownHandler = createKeyDownHandler; exports.getDefaultFormat = getDefaultFormat; exports.getInputSize = getInputSize; exports.addGlobalMouseDownEvent = addGlobalMouseDownEvent; exports.elementsContains = elementsContains; exports.PickerModeMap = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var scrollIds = new Map(); /* eslint-disable no-param-reassign */ function scrollTo(element, to, duration) { if (scrollIds.get(element)) { cancelAnimationFrame(scrollIds.get(element)); } // jump to target if duration zero if (duration <= 0) { scrollIds.set(element, requestAnimationFrame(function () { element.scrollTop = to; })); return; } var difference = to - element.scrollTop; var perTick = difference / duration * 10; scrollIds.set(element, requestAnimationFrame(function () { element.scrollTop += perTick; if (element.scrollTop !== to) { scrollTo(element, to, duration - 10); } })); } function createKeyDownHandler(event, _ref) { var onLeftRight = _ref.onLeftRight, onCtrlLeftRight = _ref.onCtrlLeftRight, onUpDown = _ref.onUpDown, onPageUpDown = _ref.onPageUpDown, onEnter = _ref.onEnter; var which = event.which, ctrlKey = event.ctrlKey, metaKey = event.metaKey; switch (which) { case _KeyCode.default.LEFT: if (ctrlKey || metaKey) { if (onCtrlLeftRight) { onCtrlLeftRight(-1); return true; } } else if (onLeftRight) { onLeftRight(-1); return true; } /* istanbul ignore next */ break; case _KeyCode.default.RIGHT: if (ctrlKey || metaKey) { if (onCtrlLeftRight) { onCtrlLeftRight(1); return true; } } else if (onLeftRight) { onLeftRight(1); return true; } /* istanbul ignore next */ break; case _KeyCode.default.UP: if (onUpDown) { onUpDown(-1); return true; } /* istanbul ignore next */ break; case _KeyCode.default.DOWN: if (onUpDown) { onUpDown(1); return true; } /* istanbul ignore next */ break; case _KeyCode.default.PAGE_UP: if (onPageUpDown) { onPageUpDown(-1); return true; } /* istanbul ignore next */ break; case _KeyCode.default.PAGE_DOWN: if (onPageUpDown) { onPageUpDown(1); return true; } /* istanbul ignore next */ break; case _KeyCode.default.ENTER: if (onEnter) { onEnter(); return true; } /* istanbul ignore next */ break; } return false; } // ===================== Format ===================== function getDefaultFormat(format, picker, showTime, use12Hours) { var mergedFormat = format; if (!mergedFormat) { switch (picker) { case 'time': mergedFormat = use12Hours ? 'hh:mm:ss a' : 'HH:mm:ss'; break; case 'week': mergedFormat = 'gggg-wo'; break; case 'month': mergedFormat = 'YYYY-MM'; break; case 'quarter': mergedFormat = 'YYYY-[Q]Q'; break; case 'year': mergedFormat = 'YYYY'; break; default: mergedFormat = showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD'; } } return mergedFormat; } function getInputSize(picker, format) { var defaultSize = picker === 'time' ? 8 : 10; return Math.max(defaultSize, format.length) + 2; } var globalClickFunc = null; var clickCallbacks = new Set(); function addGlobalMouseDownEvent(callback) { if (!globalClickFunc && typeof window !== 'undefined' && window.addEventListener) { globalClickFunc = function globalClickFunc(e) { // Clone a new list to avoid repeat trigger events (0, _toConsumableArray2.default)(clickCallbacks).forEach(function (queueFunc) { queueFunc(e); }); }; window.addEventListener('mousedown', globalClickFunc); } clickCallbacks.add(callback); return function () { clickCallbacks.delete(callback); if (clickCallbacks.size === 0) { window.removeEventListener('mousedown', globalClickFunc); globalClickFunc = null; } }; } // ====================== Mode ====================== var getYearNextMode = function getYearNextMode(next) { if (next === 'month' || next === 'date') { return 'year'; } return next; }; var getMonthNextMode = function getMonthNextMode(next) { if (next === 'date') { return 'month'; } return next; }; var getQuarterNextMode = function getQuarterNextMode(next) { if (next === 'month' || next === 'date') { return 'quarter'; } return next; }; var getWeekNextMode = function getWeekNextMode(next) { if (next === 'date') { return 'week'; } return next; }; var PickerModeMap = { year: getYearNextMode, month: getMonthNextMode, quarter: getQuarterNextMode, week: getWeekNextMode, time: null, date: null }; exports.PickerModeMap = PickerModeMap; function elementsContains(elements, target) { return elements.some(function (ele) { return ele && ele.contains(target); }); } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/toConsumableArray":207,"rc-util/lib/KeyCode":865}],721:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _common = require("./common"); var gradientSeed = 0; function stripPercentToNumber(percent) { return +percent.replace('%', ''); } function toArray(symArray) { return Array.isArray(symArray) ? symArray : [symArray]; } function getPathStyles(offset, percent, strokeColor, strokeWidth) { var gapDegree = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; var gapPosition = arguments.length > 5 ? arguments[5] : undefined; var radius = 50 - strokeWidth / 2; var beginPositionX = 0; var beginPositionY = -radius; var endPositionX = 0; var endPositionY = -2 * radius; switch (gapPosition) { case 'left': beginPositionX = -radius; beginPositionY = 0; endPositionX = 2 * radius; endPositionY = 0; break; case 'right': beginPositionX = radius; beginPositionY = 0; endPositionX = -2 * radius; endPositionY = 0; break; case 'bottom': beginPositionY = radius; endPositionY = 2 * radius; break; default: } var pathString = "M 50,50 m ".concat(beginPositionX, ",").concat(beginPositionY, "\n a ").concat(radius, ",").concat(radius, " 0 1 1 ").concat(endPositionX, ",").concat(-endPositionY, "\n a ").concat(radius, ",").concat(radius, " 0 1 1 ").concat(-endPositionX, ",").concat(endPositionY); var len = Math.PI * 2 * radius; var pathStyle = { stroke: strokeColor, strokeDasharray: "".concat(percent / 100 * (len - gapDegree), "px ").concat(len, "px"), strokeDashoffset: "-".concat(gapDegree / 2 + offset / 100 * (len - gapDegree), "px"), transition: 'stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s, stroke-width .06s ease .3s' }; return { pathString: pathString, pathStyle: pathStyle }; } var Circle = function Circle(_ref) { var prefixCls = _ref.prefixCls, strokeWidth = _ref.strokeWidth, trailWidth = _ref.trailWidth, gapDegree = _ref.gapDegree, gapPosition = _ref.gapPosition, trailColor = _ref.trailColor, strokeLinecap = _ref.strokeLinecap, style = _ref.style, className = _ref.className, strokeColor = _ref.strokeColor, percent = _ref.percent, restProps = (0, _objectWithoutProperties2.default)(_ref, ["prefixCls", "strokeWidth", "trailWidth", "gapDegree", "gapPosition", "trailColor", "strokeLinecap", "style", "className", "strokeColor", "percent"]); var gradientId = React.useMemo(function () { gradientSeed += 1; return gradientSeed; }, []); var _getPathStyles = getPathStyles(0, 100, trailColor, strokeWidth, gapDegree, gapPosition), pathString = _getPathStyles.pathString, pathStyle = _getPathStyles.pathStyle; var percentList = toArray(percent); var strokeColorList = toArray(strokeColor); var gradient = strokeColorList.find(function (color) { return Object.prototype.toString.call(color) === '[object Object]'; }); var _useTransitionDuratio = (0, _common.useTransitionDuration)(percentList), _useTransitionDuratio2 = (0, _slicedToArray2.default)(_useTransitionDuratio, 1), paths = _useTransitionDuratio2[0]; var getStokeList = function getStokeList() { var stackPtg = 0; return percentList.map(function (ptg, index) { var color = strokeColorList[index] || strokeColorList[strokeColorList.length - 1]; var stroke = Object.prototype.toString.call(color) === '[object Object]' ? "url(#".concat(prefixCls, "-gradient-").concat(gradientId, ")") : ''; var pathStyles = getPathStyles(stackPtg, ptg, color, strokeWidth, gapDegree, gapPosition); stackPtg += ptg; return React.createElement("path", { key: index, className: "".concat(prefixCls, "-circle-path"), d: pathStyles.pathString, stroke: stroke, strokeLinecap: strokeLinecap, strokeWidth: strokeWidth, opacity: ptg === 0 ? 0 : 1, fillOpacity: "0", style: pathStyles.pathStyle, ref: paths[index] }); }); }; return React.createElement("svg", Object.assign({ className: (0, _classnames.default)("".concat(prefixCls, "-circle"), className), viewBox: "0 0 100 100", style: style }, restProps), gradient && React.createElement("defs", null, React.createElement("linearGradient", { id: "".concat(prefixCls, "-gradient-").concat(gradientId), x1: "100%", y1: "0%", x2: "0%", y2: "0%" }, Object.keys(gradient).sort(function (a, b) { return stripPercentToNumber(a) - stripPercentToNumber(b); }).map(function (key, index) { return React.createElement("stop", { key: index, offset: key, stopColor: gradient[key] }); }))), React.createElement("path", { className: "".concat(prefixCls, "-circle-trail"), d: pathString, stroke: trailColor, strokeLinecap: strokeLinecap, strokeWidth: trailWidth || strokeWidth, fillOpacity: "0", style: pathStyle }), getStokeList().reverse()); }; Circle.defaultProps = _common.defaultProps; Circle.displayName = 'Circle'; var _default = Circle; exports.default = _default; },{"./common":723,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"react":"react"}],722:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _common = require("./common"); var Line = function Line(_ref) { var className = _ref.className, percent = _ref.percent, prefixCls = _ref.prefixCls, strokeColor = _ref.strokeColor, strokeLinecap = _ref.strokeLinecap, strokeWidth = _ref.strokeWidth, style = _ref.style, trailColor = _ref.trailColor, trailWidth = _ref.trailWidth, transition = _ref.transition, restProps = (0, _objectWithoutProperties2.default)(_ref, ["className", "percent", "prefixCls", "strokeColor", "strokeLinecap", "strokeWidth", "style", "trailColor", "trailWidth", "transition"]); // eslint-disable-next-line no-param-reassign delete restProps.gapPosition; var percentList = Array.isArray(percent) ? percent : [percent]; var strokeColorList = Array.isArray(strokeColor) ? strokeColor : [strokeColor]; var _useTransitionDuratio = (0, _common.useTransitionDuration)(percentList), _useTransitionDuratio2 = (0, _slicedToArray2.default)(_useTransitionDuratio, 1), paths = _useTransitionDuratio2[0]; var center = strokeWidth / 2; var right = 100 - strokeWidth / 2; var pathString = "M ".concat(strokeLinecap === 'round' ? center : 0, ",").concat(center, "\n L ").concat(strokeLinecap === 'round' ? right : 100, ",").concat(center); var viewBoxString = "0 0 100 ".concat(strokeWidth); var stackPtg = 0; return React.createElement("svg", Object.assign({ className: (0, _classnames.default)("".concat(prefixCls, "-line"), className), viewBox: viewBoxString, preserveAspectRatio: "none", style: style }, restProps), React.createElement("path", { className: "".concat(prefixCls, "-line-trail"), d: pathString, strokeLinecap: strokeLinecap, stroke: trailColor, strokeWidth: trailWidth || strokeWidth, fillOpacity: "0" }), percentList.map(function (ptg, index) { var pathStyle = { strokeDasharray: "".concat(ptg, "px, 100px"), strokeDashoffset: "-".concat(stackPtg, "px"), transition: transition || 'stroke-dashoffset 0.3s ease 0s, stroke-dasharray .3s ease 0s, stroke 0.3s linear' }; var color = strokeColorList[index] || strokeColorList[strokeColorList.length - 1]; stackPtg += ptg; return React.createElement("path", { key: index, className: "".concat(prefixCls, "-line-path"), d: pathString, strokeLinecap: strokeLinecap, stroke: color, strokeWidth: strokeWidth, fillOpacity: "0", ref: paths[index], style: pathStyle }); })); }; Line.defaultProps = _common.defaultProps; Line.displayName = 'Line'; var _default = Line; exports.default = _default; },{"./common":723,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"react":"react"}],723:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useTransitionDuration = exports.defaultProps = void 0; var _react = require("react"); var defaultProps = { className: '', percent: 0, prefixCls: 'rc-progress', strokeColor: '#2db7f5', strokeLinecap: 'round', strokeWidth: 1, style: {}, trailColor: '#D9D9D9', trailWidth: 1 }; exports.defaultProps = defaultProps; var useTransitionDuration = function useTransitionDuration(percentList) { // eslint-disable-next-line react-hooks/rules-of-hooks var paths = percentList.map(function () { return (0, _react.useRef)(); }); var prevTimeStamp = (0, _react.useRef)(null); (0, _react.useEffect)(function () { var now = Date.now(); var updated = false; Object.keys(paths).forEach(function (key) { var path = paths[key].current; if (!path) { return; } updated = true; var pathStyle = path.style; pathStyle.transitionDuration = '.3s, .3s, .3s, .06s'; if (prevTimeStamp.current && now - prevTimeStamp.current < 100) { pathStyle.transitionDuration = '0s, 0s'; } }); if (updated) { prevTimeStamp.current = Date.now(); } }); return [paths]; }; exports.useTransitionDuration = useTransitionDuration; },{"react":"react"}],724:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Line", { enumerable: true, get: function get() { return _Line.default; } }); Object.defineProperty(exports, "Circle", { enumerable: true, get: function get() { return _Circle.default; } }); exports.default = void 0; var _Line = _interopRequireDefault(require("./Line")); var _Circle = _interopRequireDefault(require("./Circle")); var _default = { Line: _Line.default, Circle: _Circle.default }; exports.default = _default; },{"./Circle":721,"./Line":722,"@babel/runtime/helpers/interopRequireDefault":192}],725:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireDefault(require("react")); var _findDOMNode = _interopRequireDefault(require("rc-util/lib/Dom/findDOMNode")); var _classnames = _interopRequireDefault(require("classnames")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _util = require("./util"); var _Star = _interopRequireDefault(require("./Star")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function noop() {} var Rate = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Rate, _React$Component); var _super = _createSuper(Rate); function Rate(props) { var _this; (0, _classCallCheck2.default)(this, Rate); _this = _super.call(this, props); _this.onHover = function (event, index) { var onHoverChange = _this.props.onHoverChange; var hoverValue = _this.getStarValue(index, event.pageX); var cleanedValue = _this.state.cleanedValue; if (hoverValue !== cleanedValue) { _this.setState({ hoverValue: hoverValue, cleanedValue: null }); } onHoverChange(hoverValue); }; _this.onMouseLeave = function () { var onHoverChange = _this.props.onHoverChange; _this.setState({ hoverValue: undefined, cleanedValue: null }); onHoverChange(undefined); }; _this.onClick = function (event, index) { var allowClear = _this.props.allowClear; var value = _this.state.value; var newValue = _this.getStarValue(index, event.pageX); var isReset = false; if (allowClear) { isReset = newValue === value; } _this.onMouseLeave(); _this.changeValue(isReset ? 0 : newValue); _this.setState({ cleanedValue: isReset ? newValue : null }); }; _this.onFocus = function () { var onFocus = _this.props.onFocus; _this.setState({ focused: true }); if (onFocus) { onFocus(); } }; _this.onBlur = function () { var onBlur = _this.props.onBlur; _this.setState({ focused: false }); if (onBlur) { onBlur(); } }; _this.onKeyDown = function (event) { var keyCode = event.keyCode; var _this$props = _this.props, count = _this$props.count, allowHalf = _this$props.allowHalf, onKeyDown = _this$props.onKeyDown, direction = _this$props.direction; var reverse = direction === 'rtl'; var value = _this.state.value; if (keyCode === _KeyCode.default.RIGHT && value < count && !reverse) { if (allowHalf) { value += 0.5; } else { value += 1; } _this.changeValue(value); event.preventDefault(); } else if (keyCode === _KeyCode.default.LEFT && value > 0 && !reverse) { if (allowHalf) { value -= 0.5; } else { value -= 1; } _this.changeValue(value); event.preventDefault(); } else if (keyCode === _KeyCode.default.RIGHT && value > 0 && reverse) { if (allowHalf) { value -= 0.5; } else { value -= 1; } _this.changeValue(value); event.preventDefault(); } else if (keyCode === _KeyCode.default.LEFT && value < count && reverse) { if (allowHalf) { value += 0.5; } else { value += 1; } _this.changeValue(value); event.preventDefault(); } if (onKeyDown) { onKeyDown(event); } }; _this.saveRef = function (index) { return function (node) { _this.stars[index] = node; }; }; _this.saveRate = function (node) { _this.rate = node; }; var value = props.value; if (value === undefined) { value = props.defaultValue; } _this.stars = {}; _this.state = { value: value, focused: false, cleanedValue: null }; return _this; } (0, _createClass2.default)(Rate, [{ key: "componentDidMount", value: function componentDidMount() { var _this$props2 = this.props, autoFocus = _this$props2.autoFocus, disabled = _this$props2.disabled; if (autoFocus && !disabled) { this.focus(); } } }, { key: "getStarDOM", value: function getStarDOM(index) { return (0, _findDOMNode.default)(this.stars[index]); } }, { key: "getStarValue", value: function getStarValue(index, x) { var _this$props3 = this.props, allowHalf = _this$props3.allowHalf, direction = _this$props3.direction; var reverse = direction === 'rtl'; var value = index + 1; if (allowHalf) { var starEle = this.getStarDOM(index); var leftDis = (0, _util.getOffsetLeft)(starEle); var width = starEle.clientWidth; if (reverse && x - leftDis > width / 2) { value -= 0.5; } else if (!reverse && x - leftDis < width / 2) { value -= 0.5; } } return value; } }, { key: "focus", value: function focus() { var disabled = this.props.disabled; if (!disabled) { this.rate.focus(); } } }, { key: "blur", value: function blur() { var disabled = this.props.disabled; if (!disabled) { this.rate.blur(); } } }, { key: "changeValue", value: function changeValue(value) { var onChange = this.props.onChange; if (!('value' in this.props)) { this.setState({ value: value }); } onChange(value); } }, { key: "render", value: function render() { var _this$props4 = this.props, count = _this$props4.count, allowHalf = _this$props4.allowHalf, style = _this$props4.style, prefixCls = _this$props4.prefixCls, disabled = _this$props4.disabled, className = _this$props4.className, character = _this$props4.character, characterRender = _this$props4.characterRender, tabIndex = _this$props4.tabIndex, direction = _this$props4.direction; var _this$state = this.state, value = _this$state.value, hoverValue = _this$state.hoverValue, focused = _this$state.focused; var stars = []; var disabledClass = disabled ? "".concat(prefixCls, "-disabled") : ''; for (var index = 0; index < count; index += 1) { stars.push(_react.default.createElement(_Star.default, { ref: this.saveRef(index), index: index, count: count, disabled: disabled, prefixCls: "".concat(prefixCls, "-star"), allowHalf: allowHalf, value: hoverValue === undefined ? value : hoverValue, onClick: this.onClick, onHover: this.onHover, key: index, character: character, characterRender: characterRender, focused: focused })); } var rateClassName = (0, _classnames.default)(prefixCls, disabledClass, className, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-rtl"), direction === 'rtl')); return _react.default.createElement("ul", { className: rateClassName, style: style, onMouseLeave: disabled ? null : this.onMouseLeave, tabIndex: disabled ? -1 : tabIndex, onFocus: disabled ? null : this.onFocus, onBlur: disabled ? null : this.onBlur, onKeyDown: disabled ? null : this.onKeyDown, ref: this.saveRate, role: "radiogroup" }, stars); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, state) { if ('value' in nextProps && nextProps.value !== undefined) { return _objectSpread(_objectSpread({}, state), {}, { value: nextProps.value }); } return state; } }]); return Rate; }(_react.default.Component); Rate.defaultProps = { defaultValue: 0, count: 5, allowHalf: false, allowClear: true, style: {}, prefixCls: 'rc-rate', onChange: noop, character: '★', onHoverChange: noop, tabIndex: 0, direction: 'ltr' }; var _default = Rate; exports.default = _default; },{"./Star":726,"./util":728,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/possibleConstructorReturn":202,"classnames":455,"rc-util/lib/Dom/findDOMNode":863,"rc-util/lib/KeyCode":865,"react":"react"}],726:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireDefault(require("react")); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var Star = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Star, _React$Component); var _super = _createSuper(Star); function Star() { var _this; (0, _classCallCheck2.default)(this, Star); _this = _super.apply(this, arguments); _this.onHover = function (e) { var _this$props = _this.props, onHover = _this$props.onHover, index = _this$props.index; onHover(e, index); }; _this.onClick = function (e) { var _this$props2 = _this.props, onClick = _this$props2.onClick, index = _this$props2.index; onClick(e, index); }; _this.onKeyDown = function (e) { var _this$props3 = _this.props, onClick = _this$props3.onClick, index = _this$props3.index; if (e.keyCode === 13) { onClick(e, index); } }; return _this; } (0, _createClass2.default)(Star, [{ key: "getClassName", value: function getClassName() { var _this$props4 = this.props, prefixCls = _this$props4.prefixCls, index = _this$props4.index, value = _this$props4.value, allowHalf = _this$props4.allowHalf, focused = _this$props4.focused; var starValue = index + 1; var className = prefixCls; if (value === 0 && index === 0 && focused) { className += " ".concat(prefixCls, "-focused"); } else if (allowHalf && value + 0.5 >= starValue && value < starValue) { className += " ".concat(prefixCls, "-half ").concat(prefixCls, "-active"); if (focused) { className += " ".concat(prefixCls, "-focused"); } } else { className += starValue <= value ? " ".concat(prefixCls, "-full") : " ".concat(prefixCls, "-zero"); if (starValue === value && focused) { className += " ".concat(prefixCls, "-focused"); } } return className; } }, { key: "render", value: function render() { var onHover = this.onHover, onClick = this.onClick, onKeyDown = this.onKeyDown; var _this$props5 = this.props, disabled = _this$props5.disabled, prefixCls = _this$props5.prefixCls, character = _this$props5.character, characterRender = _this$props5.characterRender, index = _this$props5.index, count = _this$props5.count, value = _this$props5.value; var characterNode = typeof character === 'function' ? character(this.props) : character; var start = _react.default.createElement("li", { className: this.getClassName() }, _react.default.createElement("div", { onClick: disabled ? null : onClick, onKeyDown: disabled ? null : onKeyDown, onMouseMove: disabled ? null : onHover, role: "radio", "aria-checked": value > index ? 'true' : 'false', "aria-posinset": index + 1, "aria-setsize": count, tabIndex: disabled ? -1 : 0 }, _react.default.createElement("div", { className: "".concat(prefixCls, "-first") }, characterNode), _react.default.createElement("div", { className: "".concat(prefixCls, "-second") }, characterNode))); if (characterRender) { start = characterRender(start, this.props); } return start; } }]); return Star; }(_react.default.Component); exports.default = Star; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/possibleConstructorReturn":202,"react":"react"}],727:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Rate = _interopRequireDefault(require("./Rate")); var _default = _Rate.default; exports.default = _default; },{"./Rate":725,"@babel/runtime/helpers/interopRequireDefault":192}],728:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getOffsetLeft = getOffsetLeft; /* eslint-disable import/prefer-default-export */ function getScroll(w) { var ret = w.pageXOffset; var method = 'scrollLeft'; if (typeof ret !== 'number') { var d = w.document; // ie6,7,8 standard mode ret = d.documentElement[method]; if (typeof ret !== 'number') { // quirks mode ret = d.body[method]; } } return ret; } function getClientPosition(elem) { var x; var y; var doc = elem.ownerDocument; var body = doc.body; var docElem = doc && doc.documentElement; var box = elem.getBoundingClientRect(); x = box.left; y = box.top; x -= docElem.clientLeft || body.clientLeft || 0; y -= docElem.clientTop || body.clientTop || 0; return { left: x, top: y }; } function getOffsetLeft(el) { var pos = getClientPosition(el); var doc = el.ownerDocument; // Only IE use `parentWindow` var w = doc.defaultView || doc.parentWindow; pos.left += getScroll(w); return pos.left; } },{}],729:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _findDOMNode = _interopRequireDefault(require("rc-util/lib/Dom/findDOMNode")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _ref = require("rc-util/lib/ref"); var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill")); var INTERNAL_PREFIX_KEY = 'rc-observer-key'; // Still need to be compatible with React 15, we use class component here var ReactResizeObserver = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(ReactResizeObserver, _React$Component); var _super = (0, _createSuper2.default)(ReactResizeObserver); function ReactResizeObserver() { var _this; (0, _classCallCheck2.default)(this, ReactResizeObserver); _this = _super.apply(this, arguments); _this.resizeObserver = null; _this.childNode = null; _this.currentElement = null; _this.state = { width: 0, height: 0, offsetHeight: 0, offsetWidth: 0 }; _this.onResize = function (entries) { var onResize = _this.props.onResize; var target = entries[0].target; var _target$getBoundingCl = target.getBoundingClientRect(), width = _target$getBoundingCl.width, height = _target$getBoundingCl.height; var offsetWidth = target.offsetWidth, offsetHeight = target.offsetHeight; /** * Resize observer trigger when content size changed. * In most case we just care about element size, * let's use `boundary` instead of `contentRect` here to avoid shaking. */ var fixedWidth = Math.floor(width); var fixedHeight = Math.floor(height); if (_this.state.width !== fixedWidth || _this.state.height !== fixedHeight || _this.state.offsetWidth !== offsetWidth || _this.state.offsetHeight !== offsetHeight) { var size = { width: fixedWidth, height: fixedHeight, offsetWidth: offsetWidth, offsetHeight: offsetHeight }; _this.setState(size); if (onResize) { // defer the callback but not defer to next frame Promise.resolve().then(function () { onResize((0, _objectSpread2.default)((0, _objectSpread2.default)({}, size), {}, { offsetWidth: offsetWidth, offsetHeight: offsetHeight })); }); } } }; _this.setChildNode = function (node) { _this.childNode = node; }; return _this; } (0, _createClass2.default)(ReactResizeObserver, [{ key: "componentDidMount", value: function componentDidMount() { this.onComponentUpdated(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.onComponentUpdated(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.destroyObserver(); } }, { key: "onComponentUpdated", value: function onComponentUpdated() { var disabled = this.props.disabled; // Unregister if disabled if (disabled) { this.destroyObserver(); return; } // Unregister if element changed var element = (0, _findDOMNode.default)(this.childNode || this); var elementChanged = element !== this.currentElement; if (elementChanged) { this.destroyObserver(); this.currentElement = element; } if (!this.resizeObserver && element) { this.resizeObserver = new _resizeObserverPolyfill.default(this.onResize); this.resizeObserver.observe(element); } } }, { key: "destroyObserver", value: function destroyObserver() { if (this.resizeObserver) { this.resizeObserver.disconnect(); this.resizeObserver = null; } } }, { key: "render", value: function render() { var children = this.props.children; var childNodes = (0, _toArray.default)(children); if (childNodes.length > 1) { (0, _warning.default)(false, 'Find more than one child node with `children` in ResizeObserver. Will only observe first one.'); } else if (childNodes.length === 0) { (0, _warning.default)(false, '`children` of ResizeObserver is empty. Nothing is in observe.'); return null; } var childNode = childNodes[0]; if (React.isValidElement(childNode) && (0, _ref.supportRef)(childNode)) { var ref = childNode.ref; childNodes[0] = React.cloneElement(childNode, { ref: (0, _ref.composeRef)(ref, this.setChildNode) }); } return childNodes.length === 1 ? childNodes[0] : childNodes.map(function (node, index) { if (!React.isValidElement(node) || 'key' in node && node.key !== null) { return node; } return React.cloneElement(node, { key: "".concat(INTERNAL_PREFIX_KEY, "-").concat(index) }); }); } }]); return ReactResizeObserver; }(React.Component); ReactResizeObserver.displayName = 'ResizeObserver'; var _default = ReactResizeObserver; exports.default = _default; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"rc-util/lib/Children/toArray":858,"rc-util/lib/Dom/findDOMNode":863,"rc-util/lib/ref":874,"rc-util/lib/warning":879,"react":"react","resize-observer-polyfill":899}],730:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** This is a placeholder, not real render in dom */ var OptGroup = function OptGroup() { return null; }; OptGroup.isSelectOptGroup = true; var _default = OptGroup; exports.default = _default; },{}],731:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** This is a placeholder, not real render in dom */ var Option = function Option() { return null; }; Option.isSelectOption = true; var _default = Option; exports.default = _default; },{}],732:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _pickAttrs = _interopRequireDefault(require("rc-util/lib/pickAttrs")); var _useMemo = _interopRequireDefault(require("rc-util/lib/hooks/useMemo")); var _classnames = _interopRequireDefault(require("classnames")); var _rcVirtualList = _interopRequireDefault(require("rc-virtual-list")); var _TransBtn = _interopRequireDefault(require("./TransBtn")); /** * Using virtual list of option display. * Will fallback to dom if use customize render. */ var OptionList = function OptionList(_ref, ref) { var prefixCls = _ref.prefixCls, id = _ref.id, flattenOptions = _ref.flattenOptions, childrenAsData = _ref.childrenAsData, values = _ref.values, searchValue = _ref.searchValue, multiple = _ref.multiple, defaultActiveFirstOption = _ref.defaultActiveFirstOption, height = _ref.height, itemHeight = _ref.itemHeight, notFoundContent = _ref.notFoundContent, open = _ref.open, menuItemSelectedIcon = _ref.menuItemSelectedIcon, virtual = _ref.virtual, onSelect = _ref.onSelect, onToggleOpen = _ref.onToggleOpen, onActiveValue = _ref.onActiveValue, onScroll = _ref.onScroll, onMouseEnter = _ref.onMouseEnter; var itemPrefixCls = "".concat(prefixCls, "-item"); var memoFlattenOptions = (0, _useMemo.default)(function () { return flattenOptions; }, [open, flattenOptions], function (prev, next) { return next[0] && prev[1] !== next[1]; }); // =========================== List =========================== var listRef = React.useRef(null); var onListMouseDown = function onListMouseDown(event) { event.preventDefault(); }; var scrollIntoView = function scrollIntoView(index) { if (listRef.current) { listRef.current.scrollTo({ index: index }); } }; // ========================== Active ========================== var getEnabledActiveIndex = function getEnabledActiveIndex(index) { var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var len = memoFlattenOptions.length; for (var i = 0; i < len; i += 1) { var current = (index + i * offset + len) % len; var _memoFlattenOptions$c = memoFlattenOptions[current], group = _memoFlattenOptions$c.group, data = _memoFlattenOptions$c.data; if (!group && !data.disabled) { return current; } } return -1; }; var _React$useState = React.useState(function () { return getEnabledActiveIndex(0); }), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), activeIndex = _React$useState2[0], setActiveIndex = _React$useState2[1]; var setActive = function setActive(index) { var fromKeyboard = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; setActiveIndex(index); var info = { source: fromKeyboard ? 'keyboard' : 'mouse' }; // Trigger active event var flattenItem = memoFlattenOptions[index]; if (!flattenItem) { onActiveValue(null, -1, info); return; } onActiveValue(flattenItem.data.value, index, info); }; // Auto active first item when list length or searchValue changed React.useEffect(function () { setActive(defaultActiveFirstOption !== false ? getEnabledActiveIndex(0) : -1); }, [memoFlattenOptions.length, searchValue]); // Auto scroll to item position in single mode React.useEffect(function () { /** * React will skip `onChange` when component update. * `setActive` function will call root accessibility state update which makes re-render. * So we need to delay to let Input component trigger onChange first. */ var timeoutId = setTimeout(function () { if (!multiple && open && values.size === 1) { var value = Array.from(values)[0]; var index = memoFlattenOptions.findIndex(function (_ref2) { var data = _ref2.data; return data.value === value; }); setActive(index); scrollIntoView(index); } }); return function () { return clearTimeout(timeoutId); }; }, [open]); // ========================== Values ========================== var onSelectValue = function onSelectValue(value) { if (value !== undefined) { onSelect(value, { selected: !values.has(value) }); } // Single mode should always close by select if (!multiple) { onToggleOpen(false); } }; // ========================= Keyboard ========================= React.useImperativeHandle(ref, function () { return { onKeyDown: function onKeyDown(event) { var which = event.which; switch (which) { // >>> Arrow keys case _KeyCode.default.UP: case _KeyCode.default.DOWN: { var offset = 0; if (which === _KeyCode.default.UP) { offset = -1; } else if (which === _KeyCode.default.DOWN) { offset = 1; } if (offset !== 0) { var nextActiveIndex = getEnabledActiveIndex(activeIndex + offset, offset); scrollIntoView(nextActiveIndex); setActive(nextActiveIndex, true); } break; } // >>> Select case _KeyCode.default.ENTER: { // value var item = memoFlattenOptions[activeIndex]; if (item && !item.data.disabled) { onSelectValue(item.data.value); } else { onSelectValue(undefined); } if (open) { event.preventDefault(); } break; } // >>> Close case _KeyCode.default.ESC: { onToggleOpen(false); } } }, onKeyUp: function onKeyUp() {}, scrollTo: function scrollTo(index) { scrollIntoView(index); } }; }); // ========================== Render ========================== if (memoFlattenOptions.length === 0) { return React.createElement("div", { role: "listbox", id: "".concat(id, "_list"), className: "".concat(itemPrefixCls, "-empty"), onMouseDown: onListMouseDown }, notFoundContent); } function renderItem(index) { var item = memoFlattenOptions[index]; if (!item) return null; var itemData = item.data || {}; var value = itemData.value, label = itemData.label, children = itemData.children; var attrs = (0, _pickAttrs.default)(itemData, true); var mergedLabel = childrenAsData ? children : label; return item ? React.createElement("div", Object.assign({ "aria-label": typeof mergedLabel === 'string' ? mergedLabel : null }, attrs, { key: index, role: "option", id: "".concat(id, "_list_").concat(index), "aria-selected": values.has(value) }), value) : null; } return React.createElement(React.Fragment, null, React.createElement("div", { role: "listbox", id: "".concat(id, "_list"), style: { height: 0, width: 0, overflow: 'hidden' } }, renderItem(activeIndex - 1), renderItem(activeIndex), renderItem(activeIndex + 1)), React.createElement(_rcVirtualList.default, { itemKey: "key", ref: listRef, data: memoFlattenOptions, height: height, itemHeight: itemHeight, fullHeight: false, onMouseDown: onListMouseDown, onScroll: onScroll, virtual: virtual, onMouseEnter: onMouseEnter }, function (_ref3, itemIndex) { var _classNames; var group = _ref3.group, groupOption = _ref3.groupOption, data = _ref3.data; var label = data.label, key = data.key; // Group if (group) { return React.createElement("div", { className: (0, _classnames.default)(itemPrefixCls, "".concat(itemPrefixCls, "-group")) }, label !== undefined ? label : key); } var disabled = data.disabled, value = data.value, title = data.title, children = data.children, style = data.style, className = data.className, otherProps = (0, _objectWithoutProperties2.default)(data, ["disabled", "value", "title", "children", "style", "className"]); // Option var selected = values.has(value); var optionPrefixCls = "".concat(itemPrefixCls, "-option"); var optionClassName = (0, _classnames.default)(itemPrefixCls, optionPrefixCls, className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(optionPrefixCls, "-grouped"), groupOption), (0, _defineProperty2.default)(_classNames, "".concat(optionPrefixCls, "-active"), activeIndex === itemIndex && !disabled), (0, _defineProperty2.default)(_classNames, "".concat(optionPrefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames, "".concat(optionPrefixCls, "-selected"), selected), _classNames)); var mergedLabel = childrenAsData ? children : label; var iconVisible = !menuItemSelectedIcon || typeof menuItemSelectedIcon === 'function' || selected; var content = mergedLabel || value; // https://github.com/ant-design/ant-design/issues/26717 var optionTitle = typeof content === 'string' || typeof content === 'number' ? content.toString() : undefined; if (title !== undefined) { optionTitle = title; } return React.createElement("div", Object.assign({}, otherProps, { "aria-selected": selected, className: optionClassName, title: optionTitle, onMouseMove: function onMouseMove() { if (activeIndex === itemIndex || disabled) { return; } setActive(itemIndex); }, onClick: function onClick() { if (!disabled) { onSelectValue(value); } }, style: style }), React.createElement("div", { className: "".concat(optionPrefixCls, "-content") }, content), React.isValidElement(menuItemSelectedIcon) || selected, iconVisible && React.createElement(_TransBtn.default, { className: "".concat(itemPrefixCls, "-option-state"), customizeIcon: menuItemSelectedIcon, customizeIconProps: { isSelected: selected } }, selected ? '✓' : null)); })); }; var RefOptionList = React.forwardRef(OptionList); RefOptionList.displayName = 'OptionList'; var _default = RefOptionList; exports.default = _default; },{"./TransBtn":739,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-util/lib/KeyCode":865,"rc-util/lib/hooks/useMemo":870,"rc-util/lib/pickAttrs":872,"rc-virtual-list":891,"react":"react"}],733:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _OptionList = _interopRequireDefault(require("./OptionList")); var _Option = _interopRequireDefault(require("./Option")); var _OptGroup = _interopRequireDefault(require("./OptGroup")); var _legacyUtil = require("./utils/legacyUtil"); var _valueUtil = require("./utils/valueUtil"); var _generate = _interopRequireDefault(require("./generate")); var _warningPropsUtil = _interopRequireDefault(require("./utils/warningPropsUtil")); /** * To match accessibility requirement, we always provide an input in the component. * Other element will not set `tabIndex` to avoid `onBlur` sequence problem. * For focused select, we set `aria-live="polite"` to update the accessibility content. * * ref: * - keyboard: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#Keyboard_interactions * * New api: * - listHeight * - listItemHeight * - component * * Remove deprecated api: * - multiple * - tags * - combobox * - firstActiveValue * - dropdownMenuStyle * - openClassName (Not list in api) * * Update: * - `backfill` only support `combobox` mode * - `combobox` mode not support `labelInValue` since it's meaningless * - `getInputElement` only support `combobox` mode * - `onChange` return OptionData instead of ReactNode * - `filterOption` `onChange` `onSelect` accept OptionData instead of ReactNode * - `combobox` mode trigger `onChange` will get `undefined` if no `value` match in Option * - `combobox` mode not support `optionLabelProp` */ var RefSelect = (0, _generate.default)({ prefixCls: 'rc-select', components: { optionList: _OptionList.default }, convertChildrenToData: _legacyUtil.convertChildrenToData, flattenOptions: _valueUtil.flattenOptions, getLabeledValue: _valueUtil.getLabeledValue, filterOptions: _valueUtil.filterOptions, isValueDisabled: _valueUtil.isValueDisabled, findValueOption: _valueUtil.findValueOption, warningProps: _warningPropsUtil.default, fillOptionsWithMissingValue: _valueUtil.fillOptionsWithMissingValue }); /** * Typescript not support generic with function component, * we have to wrap an class component to handle this. */ var Select = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Select, _React$Component); var _super = (0, _createSuper2.default)(Select); function Select() { var _this; (0, _classCallCheck2.default)(this, Select); _this = _super.apply(this, arguments); _this.selectRef = React.createRef(); _this.focus = function () { _this.selectRef.current.focus(); }; _this.blur = function () { _this.selectRef.current.blur(); }; return _this; } (0, _createClass2.default)(Select, [{ key: "render", value: function render() { return React.createElement(RefSelect, Object.assign({ ref: this.selectRef }, this.props)); } }]); return Select; }(React.Component); Select.Option = _Option.default; Select.OptGroup = _OptGroup.default; var _default = Select; exports.default = _default; },{"./OptGroup":730,"./Option":731,"./OptionList":732,"./generate":740,"./utils/legacyUtil":750,"./utils/valueUtil":751,"./utils/warningPropsUtil":752,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],734:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _rcTrigger = _interopRequireDefault(require("rc-trigger")); var _classnames = _interopRequireDefault(require("classnames")); var getBuiltInPlacements = function getBuiltInPlacements(dropdownMatchSelectWidth) { // Enable horizontal overflow auto-adjustment when a custom dropdown width is provided var adjustX = typeof dropdownMatchSelectWidth !== 'number' ? 0 : 1; return { bottomLeft: { points: ['tl', 'bl'], offset: [0, 4], overflow: { adjustX: adjustX, adjustY: 1 } }, bottomRight: { points: ['tr', 'br'], offset: [0, 4], overflow: { adjustX: adjustX, adjustY: 1 } }, topLeft: { points: ['bl', 'tl'], offset: [0, -4], overflow: { adjustX: adjustX, adjustY: 1 } }, topRight: { points: ['br', 'tr'], offset: [0, -4], overflow: { adjustX: adjustX, adjustY: 1 } } }; }; var SelectTrigger = function SelectTrigger(props, ref) { var prefixCls = props.prefixCls, disabled = props.disabled, visible = props.visible, children = props.children, popupElement = props.popupElement, containerWidth = props.containerWidth, animation = props.animation, transitionName = props.transitionName, dropdownStyle = props.dropdownStyle, dropdownClassName = props.dropdownClassName, _props$direction = props.direction, direction = _props$direction === void 0 ? 'ltr' : _props$direction, _props$dropdownMatchS = props.dropdownMatchSelectWidth, dropdownMatchSelectWidth = _props$dropdownMatchS === void 0 ? true : _props$dropdownMatchS, dropdownRender = props.dropdownRender, dropdownAlign = props.dropdownAlign, getPopupContainer = props.getPopupContainer, empty = props.empty, getTriggerDOMNode = props.getTriggerDOMNode, restProps = (0, _objectWithoutProperties2.default)(props, ["prefixCls", "disabled", "visible", "children", "popupElement", "containerWidth", "animation", "transitionName", "dropdownStyle", "dropdownClassName", "direction", "dropdownMatchSelectWidth", "dropdownRender", "dropdownAlign", "getPopupContainer", "empty", "getTriggerDOMNode"]); var dropdownPrefixCls = "".concat(prefixCls, "-dropdown"); var popupNode = popupElement; if (dropdownRender) { popupNode = dropdownRender(popupElement); } var builtInPlacements = React.useMemo(function () { return getBuiltInPlacements(dropdownMatchSelectWidth); }, [dropdownMatchSelectWidth]); // ===================== Motion ====================== var mergedTransitionName = animation ? "".concat(dropdownPrefixCls, "-").concat(animation) : transitionName; // ======================= Ref ======================= var popupRef = React.useRef(null); React.useImperativeHandle(ref, function () { return { getPopupElement: function getPopupElement() { return popupRef.current; } }; }); var popupStyle = (0, _objectSpread2.default)({ minWidth: containerWidth }, dropdownStyle); if (typeof dropdownMatchSelectWidth === 'number') { popupStyle.width = dropdownMatchSelectWidth; } else if (dropdownMatchSelectWidth) { popupStyle.width = containerWidth; } return React.createElement(_rcTrigger.default, Object.assign({}, restProps, { showAction: [], hideAction: [], popupPlacement: direction === 'rtl' ? 'bottomRight' : 'bottomLeft', builtinPlacements: builtInPlacements, prefixCls: dropdownPrefixCls, popupTransitionName: mergedTransitionName, popup: React.createElement("div", { ref: popupRef }, popupNode), popupAlign: dropdownAlign, popupVisible: visible, getPopupContainer: getPopupContainer, popupClassName: (0, _classnames.default)(dropdownClassName, (0, _defineProperty2.default)({}, "".concat(dropdownPrefixCls, "-empty"), empty)), popupStyle: popupStyle, getTriggerDOMNode: getTriggerDOMNode }), children); }; var RefSelectTrigger = React.forwardRef(SelectTrigger); RefSelectTrigger.displayName = 'SelectTrigger'; var _default = RefSelectTrigger; exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"classnames":455,"rc-trigger":848,"react":"react"}],735:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _ref2 = require("rc-util/lib/ref"); var Input = function Input(_ref, ref) { var prefixCls = _ref.prefixCls, id = _ref.id, inputElement = _ref.inputElement, disabled = _ref.disabled, tabIndex = _ref.tabIndex, autoFocus = _ref.autoFocus, autoComplete = _ref.autoComplete, editable = _ref.editable, accessibilityIndex = _ref.accessibilityIndex, value = _ref.value, _onKeyDown = _ref.onKeyDown, _onMouseDown = _ref.onMouseDown, _onChange = _ref.onChange, onPaste = _ref.onPaste, _onCompositionStart = _ref.onCompositionStart, _onCompositionEnd = _ref.onCompositionEnd, open = _ref.open, attrs = _ref.attrs; var inputNode = inputElement || React.createElement("input", null); var _inputNode = inputNode, originRef = _inputNode.ref, _inputNode$props = _inputNode.props, onOriginKeyDown = _inputNode$props.onKeyDown, onOriginChange = _inputNode$props.onChange, onOriginMouseDown = _inputNode$props.onMouseDown, onOriginCompositionStart = _inputNode$props.onCompositionStart, onOriginCompositionEnd = _inputNode$props.onCompositionEnd, style = _inputNode$props.style; inputNode = React.cloneElement(inputNode, (0, _objectSpread2.default)((0, _objectSpread2.default)({ id: id, ref: (0, _ref2.composeRef)(ref, originRef), disabled: disabled, tabIndex: tabIndex, autoComplete: autoComplete || 'off', type: 'search', autoFocus: autoFocus, className: "".concat(prefixCls, "-selection-search-input"), style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), {}, { opacity: editable ? null : 0 }), role: 'combobox', 'aria-expanded': open, 'aria-haspopup': 'listbox', 'aria-owns': "".concat(id, "_list"), 'aria-autocomplete': 'list', 'aria-controls': "".concat(id, "_list"), 'aria-activedescendant': "".concat(id, "_list_").concat(accessibilityIndex) }, attrs), {}, { value: editable ? value : '', readOnly: !editable, unselectable: !editable ? 'on' : null, onKeyDown: function onKeyDown(event) { _onKeyDown(event); if (onOriginKeyDown) { onOriginKeyDown(event); } }, onMouseDown: function onMouseDown(event) { _onMouseDown(event); if (onOriginMouseDown) { onOriginMouseDown(event); } }, onChange: function onChange(event) { _onChange(event); if (onOriginChange) { onOriginChange(event); } }, onCompositionStart: function onCompositionStart(event) { _onCompositionStart(event); if (onOriginCompositionStart) { onOriginCompositionStart(event); } }, onCompositionEnd: function onCompositionEnd(event) { _onCompositionEnd(event); if (onOriginCompositionEnd) { onOriginCompositionEnd(event); } }, onPaste: onPaste })); return inputNode; }; var RefInput = React.forwardRef(Input); RefInput.displayName = 'Input'; var _default = RefInput; exports.default = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"rc-util/lib/ref":874,"react":"react"}],736:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _pickAttrs = _interopRequireDefault(require("rc-util/lib/pickAttrs")); var _rcMotion = require("rc-motion"); var _TransBtn = _interopRequireDefault(require("../TransBtn")); var _Input = _interopRequireDefault(require("./Input")); var _useLayoutEffect = _interopRequireDefault(require("../hooks/useLayoutEffect")); var REST_TAG_KEY = '__RC_SELECT_MAX_REST_COUNT__'; var SelectSelector = function SelectSelector(props) { var id = props.id, prefixCls = props.prefixCls, values = props.values, open = props.open, searchValue = props.searchValue, inputRef = props.inputRef, placeholder = props.placeholder, disabled = props.disabled, mode = props.mode, showSearch = props.showSearch, autoFocus = props.autoFocus, autoComplete = props.autoComplete, accessibilityIndex = props.accessibilityIndex, tabIndex = props.tabIndex, removeIcon = props.removeIcon, choiceTransitionName = props.choiceTransitionName, maxTagCount = props.maxTagCount, maxTagTextLength = props.maxTagTextLength, _props$maxTagPlacehol = props.maxTagPlaceholder, maxTagPlaceholder = _props$maxTagPlacehol === void 0 ? function (omittedValues) { return "+ ".concat(omittedValues.length, " ..."); } : _props$maxTagPlacehol, tagRender = props.tagRender, onSelect = props.onSelect, onInputChange = props.onInputChange, onInputPaste = props.onInputPaste, onInputKeyDown = props.onInputKeyDown, onInputMouseDown = props.onInputMouseDown, onInputCompositionStart = props.onInputCompositionStart, onInputCompositionEnd = props.onInputCompositionEnd; var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), motionAppear = _React$useState2[0], setMotionAppear = _React$useState2[1]; var measureRef = React.useRef(null); var _React$useState3 = React.useState(0), _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2), inputWidth = _React$useState4[0], setInputWidth = _React$useState4[1]; // ===================== Motion ====================== React.useEffect(function () { setMotionAppear(true); }, []); // ===================== Search ====================== var inputValue = open || mode === 'tags' ? searchValue : ''; var inputEditable = mode === 'tags' || open && showSearch; // We measure width and set to the input immediately (0, _useLayoutEffect.default)(function () { setInputWidth(measureRef.current.scrollWidth); }, [inputValue]); // ==================== Selection ==================== var displayValues = values; // Cut by `maxTagCount` var restCount; if (typeof maxTagCount === 'number') { restCount = values.length - maxTagCount; displayValues = values.slice(0, maxTagCount); } // Update by `maxTagTextLength` if (typeof maxTagTextLength === 'number') { displayValues = displayValues.map(function (_ref) { var label = _ref.label, rest = (0, _objectWithoutProperties2.default)(_ref, ["label"]); var displayLabel = label; if (typeof label === 'string' || typeof label === 'number') { var strLabel = String(displayLabel); if (strLabel.length > maxTagTextLength) { displayLabel = "".concat(strLabel.slice(0, maxTagTextLength), "..."); } } return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rest), {}, { label: displayLabel }); }); } // Fill rest if (restCount > 0) { displayValues.push({ key: REST_TAG_KEY, label: typeof maxTagPlaceholder === 'function' ? maxTagPlaceholder(values.slice(maxTagCount)) : maxTagPlaceholder }); } var selectionNode = React.createElement(_rcMotion.CSSMotionList, { component: false, keys: displayValues, motionName: choiceTransitionName, motionAppear: motionAppear }, function (_ref2) { var key = _ref2.key, label = _ref2.label, value = _ref2.value, itemDisabled = _ref2.disabled, className = _ref2.className, style = _ref2.style; var mergedKey = key || value; var closable = key !== REST_TAG_KEY && !itemDisabled; var onMouseDown = function onMouseDown(event) { event.preventDefault(); event.stopPropagation(); }; var onClose = function onClose(event) { if (event) event.stopPropagation(); onSelect(value, { selected: false }); }; return typeof tagRender === 'function' ? React.createElement("span", { key: mergedKey, onMouseDown: onMouseDown, className: className, style: style }, tagRender({ label: label, value: value, disabled: itemDisabled, closable: closable, onClose: onClose })) : React.createElement("span", { key: mergedKey, className: (0, _classnames.default)(className, "".concat(prefixCls, "-selection-item"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-selection-item-disabled"), itemDisabled)), style: style }, React.createElement("span", { className: "".concat(prefixCls, "-selection-item-content") }, label), closable && React.createElement(_TransBtn.default, { className: "".concat(prefixCls, "-selection-item-remove"), onMouseDown: onMouseDown, onClick: onClose, customizeIcon: removeIcon }, "\xD7")); }); return React.createElement(React.Fragment, null, selectionNode, React.createElement("span", { className: "".concat(prefixCls, "-selection-search"), style: { width: inputWidth } }, React.createElement(_Input.default, { ref: inputRef, open: open, prefixCls: prefixCls, id: id, inputElement: null, disabled: disabled, autoFocus: autoFocus, autoComplete: autoComplete, editable: inputEditable, accessibilityIndex: accessibilityIndex, value: inputValue, onKeyDown: onInputKeyDown, onMouseDown: onInputMouseDown, onChange: onInputChange, onPaste: onInputPaste, onCompositionStart: onInputCompositionStart, onCompositionEnd: onInputCompositionEnd, tabIndex: tabIndex, attrs: (0, _pickAttrs.default)(props, true) }), React.createElement("span", { ref: measureRef, className: "".concat(prefixCls, "-selection-search-mirror"), "aria-hidden": true }, inputValue, "\xA0")), !values.length && !inputValue && React.createElement("span", { className: "".concat(prefixCls, "-selection-placeholder") }, placeholder)); }; var _default = SelectSelector; exports.default = _default; },{"../TransBtn":739,"../hooks/useLayoutEffect":744,"./Input":735,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-motion":661,"rc-util/lib/pickAttrs":872,"react":"react"}],737:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _pickAttrs = _interopRequireDefault(require("rc-util/lib/pickAttrs")); var _Input = _interopRequireDefault(require("./Input")); var SingleSelector = function SingleSelector(props) { var inputElement = props.inputElement, prefixCls = props.prefixCls, id = props.id, inputRef = props.inputRef, disabled = props.disabled, autoFocus = props.autoFocus, autoComplete = props.autoComplete, accessibilityIndex = props.accessibilityIndex, mode = props.mode, open = props.open, values = props.values, placeholder = props.placeholder, tabIndex = props.tabIndex, showSearch = props.showSearch, searchValue = props.searchValue, activeValue = props.activeValue, onInputKeyDown = props.onInputKeyDown, onInputMouseDown = props.onInputMouseDown, onInputChange = props.onInputChange, onInputPaste = props.onInputPaste, onInputCompositionStart = props.onInputCompositionStart, onInputCompositionEnd = props.onInputCompositionEnd; var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), inputChanged = _React$useState2[0], setInputChanged = _React$useState2[1]; var combobox = mode === 'combobox'; var inputEditable = combobox || showSearch; var item = values[0]; var inputValue = searchValue || ''; if (combobox && activeValue && !inputChanged) { inputValue = activeValue; } React.useEffect(function () { if (combobox) { setInputChanged(false); } }, [combobox, activeValue]); // Not show text when closed expect combobox mode var hasTextInput = mode !== 'combobox' && !open ? false : !!inputValue; var title = item && (typeof item.label === 'string' || typeof item.label === 'number') ? item.label.toString() : undefined; return React.createElement(React.Fragment, null, React.createElement("span", { className: "".concat(prefixCls, "-selection-search") }, React.createElement(_Input.default, { ref: inputRef, prefixCls: prefixCls, id: id, open: open, inputElement: inputElement, disabled: disabled, autoFocus: autoFocus, autoComplete: autoComplete, editable: inputEditable, accessibilityIndex: accessibilityIndex, value: inputValue, onKeyDown: onInputKeyDown, onMouseDown: onInputMouseDown, onChange: function onChange(e) { setInputChanged(true); onInputChange(e); }, onPaste: onInputPaste, onCompositionStart: onInputCompositionStart, onCompositionEnd: onInputCompositionEnd, tabIndex: tabIndex, attrs: (0, _pickAttrs.default)(props, true) })), !combobox && item && !hasTextInput && React.createElement("span", { className: "".concat(prefixCls, "-selection-item"), title: title }, item.label), !item && !hasTextInput && React.createElement("span", { className: "".concat(prefixCls, "-selection-placeholder") }, placeholder)); }; var _default = SingleSelector; exports.default = _default; },{"./Input":735,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"rc-util/lib/pickAttrs":872,"react":"react"}],738:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _MultipleSelector = _interopRequireDefault(require("./MultipleSelector")); var _SingleSelector = _interopRequireDefault(require("./SingleSelector")); var _useLock3 = _interopRequireDefault(require("../hooks/useLock")); /** * Cursor rule: * 1. Only `showSearch` enabled * 2. Only `open` is `true` * 3. When typing, set `open` to `true` which hit rule of 2 * * Accessibility: * - https://www.w3.org/TR/wai-aria-practices/examples/combobox/aria1.1pattern/listbox-combo.html */ var Selector = function Selector(props, ref) { var inputRef = (0, React.useRef)(null); var compositionStatusRef = (0, React.useRef)(false); var prefixCls = props.prefixCls, multiple = props.multiple, open = props.open, mode = props.mode, showSearch = props.showSearch, tokenWithEnter = props.tokenWithEnter, onSearch = props.onSearch, onSearchSubmit = props.onSearchSubmit, onToggleOpen = props.onToggleOpen, onInputKeyDown = props.onInputKeyDown, domRef = props.domRef; // ======================= Ref ======================= React.useImperativeHandle(ref, function () { return { focus: function focus() { inputRef.current.focus(); }, blur: function blur() { inputRef.current.blur(); } }; }); // ====================== Input ====================== var _useLock = (0, _useLock3.default)(0), _useLock2 = (0, _slicedToArray2.default)(_useLock, 2), getInputMouseDown = _useLock2[0], setInputMouseDown = _useLock2[1]; var onInternalInputKeyDown = function onInternalInputKeyDown(event) { var which = event.which; if (which === _KeyCode.default.UP || which === _KeyCode.default.DOWN) { event.preventDefault(); } if (onInputKeyDown) { onInputKeyDown(event); } if (which === _KeyCode.default.ENTER && mode === 'tags' && !compositionStatusRef.current && !open) { // When menu isn't open, OptionList won't trigger a value change // So when enter is pressed, the tag's input value should be emitted here to let selector know onSearchSubmit(event.target.value); } if (![_KeyCode.default.SHIFT, _KeyCode.default.TAB, _KeyCode.default.BACKSPACE, _KeyCode.default.ESC].includes(which)) { onToggleOpen(true); } }; /** * We can not use `findDOMNode` sine it will get warning, * have to use timer to check if is input element. */ var onInternalInputMouseDown = function onInternalInputMouseDown() { setInputMouseDown(true); }; // When paste come, ignore next onChange var pastedTextRef = (0, React.useRef)(null); var triggerOnSearch = function triggerOnSearch(value) { if (onSearch(value, true, compositionStatusRef.current) !== false) { onToggleOpen(true); } }; var onInputCompositionStart = function onInputCompositionStart() { compositionStatusRef.current = true; }; var onInputCompositionEnd = function onInputCompositionEnd() { compositionStatusRef.current = false; }; var onInputChange = function onInputChange(event) { var value = event.target.value; // Pasted text should replace back to origin content if (tokenWithEnter && pastedTextRef.current && /[\r\n]/.test(pastedTextRef.current)) { // CRLF will be treated as a single space for input element var replacedText = pastedTextRef.current.replace(/\r\n/g, ' ').replace(/[\r\n]/g, ' '); value = value.replace(replacedText, pastedTextRef.current); } pastedTextRef.current = null; triggerOnSearch(value); }; var onInputPaste = function onInputPaste(e) { var clipboardData = e.clipboardData; var value = clipboardData.getData('text'); pastedTextRef.current = value; }; var onClick = function onClick(_ref) { var target = _ref.target; if (target !== inputRef.current) { // Should focus input if click the selector var isIE = document.body.style.msTouchAction !== undefined; if (isIE) { setTimeout(function () { inputRef.current.focus(); }); } else { inputRef.current.focus(); } } }; var onMouseDown = function onMouseDown(event) { var inputMouseDown = getInputMouseDown(); if (event.target !== inputRef.current && !inputMouseDown) { event.preventDefault(); } if (mode !== 'combobox' && (!showSearch || !inputMouseDown) || !open) { if (open) { onSearch('', true, false); } onToggleOpen(); } }; // ================= Inner Selector ================== var sharedProps = { inputRef: inputRef, onInputKeyDown: onInternalInputKeyDown, onInputMouseDown: onInternalInputMouseDown, onInputChange: onInputChange, onInputPaste: onInputPaste, onInputCompositionStart: onInputCompositionStart, onInputCompositionEnd: onInputCompositionEnd }; var selectNode = multiple ? React.createElement(_MultipleSelector.default, Object.assign({}, props, sharedProps)) : React.createElement(_SingleSelector.default, Object.assign({}, props, sharedProps)); return React.createElement("div", { ref: domRef, className: "".concat(prefixCls, "-selector"), onClick: onClick, onMouseDown: onMouseDown }, selectNode); }; var ForwardSelector = React.forwardRef(Selector); ForwardSelector.displayName = 'Selector'; var _default = ForwardSelector; exports.default = _default; },{"../hooks/useLock":745,"./MultipleSelector":736,"./SingleSelector":737,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"rc-util/lib/KeyCode":865,"react":"react"}],739:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var TransBtn = function TransBtn(_ref) { var className = _ref.className, customizeIcon = _ref.customizeIcon, customizeIconProps = _ref.customizeIconProps, _onMouseDown = _ref.onMouseDown, onClick = _ref.onClick, children = _ref.children; var icon; if (typeof customizeIcon === 'function') { icon = customizeIcon(customizeIconProps); } else { icon = customizeIcon; } return React.createElement("span", { className: className, onMouseDown: function onMouseDown(event) { event.preventDefault(); if (_onMouseDown) { _onMouseDown(event); } }, style: { userSelect: 'none', WebkitUserSelect: 'none' }, unselectable: "on", onClick: onClick, "aria-hidden": true }, icon !== undefined ? icon : React.createElement("span", { className: (0, _classnames.default)(className.split(/\s+/).map(function (cls) { return "".concat(cls, "-icon"); })) }, children)); }; var _default = TransBtn; exports.default = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],740:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = generateSelector; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _classnames = _interopRequireDefault(require("classnames")); var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _Selector = _interopRequireDefault(require("./Selector")); var _SelectTrigger = _interopRequireDefault(require("./SelectTrigger")); var _generator = require("./interface/generator"); var _commonUtil = require("./utils/commonUtil"); var _TransBtn = _interopRequireDefault(require("./TransBtn")); var _useLock3 = _interopRequireDefault(require("./hooks/useLock")); var _useDelayReset3 = _interopRequireDefault(require("./hooks/useDelayReset")); var _useLayoutEffect = _interopRequireDefault(require("./hooks/useLayoutEffect")); var _valueUtil = require("./utils/valueUtil"); var _useSelectTriggerControl = _interopRequireDefault(require("./hooks/useSelectTriggerControl")); var _useCacheDisplayValue = _interopRequireDefault(require("./hooks/useCacheDisplayValue")); var _useCacheOptions = _interopRequireDefault(require("./hooks/useCacheOptions")); /** * To match accessibility requirement, we always provide an input in the component. * Other element will not set `tabIndex` to avoid `onBlur` sequence problem. * For focused select, we set `aria-live="polite"` to update the accessibility content. * * ref: * - keyboard: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#Keyboard_interactions */ var DEFAULT_OMIT_PROPS = ['removeIcon', 'placeholder', 'autoFocus', 'maxTagCount', 'maxTagTextLength', 'maxTagPlaceholder', 'choiceTransitionName', 'onInputKeyDown']; /** * This function is in internal usage. * Do not use it in your prod env since we may refactor this. */ function generateSelector(config) { var defaultPrefixCls = config.prefixCls, OptionList = config.components.optionList, convertChildrenToData = config.convertChildrenToData, flattenOptions = config.flattenOptions, getLabeledValue = config.getLabeledValue, filterOptions = config.filterOptions, isValueDisabled = config.isValueDisabled, findValueOption = config.findValueOption, warningProps = config.warningProps, fillOptionsWithMissingValue = config.fillOptionsWithMissingValue, omitDOMProps = config.omitDOMProps; // Use raw define since `React.FC` not support generic function Select(props, ref) { var _classNames2; var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? defaultPrefixCls : _props$prefixCls, className = props.className, id = props.id, open = props.open, defaultOpen = props.defaultOpen, options = props.options, children = props.children, mode = props.mode, value = props.value, defaultValue = props.defaultValue, labelInValue = props.labelInValue, showSearch = props.showSearch, inputValue = props.inputValue, searchValue = props.searchValue, filterOption = props.filterOption, _props$optionFilterPr = props.optionFilterProp, optionFilterProp = _props$optionFilterPr === void 0 ? 'value' : _props$optionFilterPr, _props$autoClearSearc = props.autoClearSearchValue, autoClearSearchValue = _props$autoClearSearc === void 0 ? true : _props$autoClearSearc, onSearch = props.onSearch, allowClear = props.allowClear, clearIcon = props.clearIcon, showArrow = props.showArrow, inputIcon = props.inputIcon, menuItemSelectedIcon = props.menuItemSelectedIcon, disabled = props.disabled, loading = props.loading, defaultActiveFirstOption = props.defaultActiveFirstOption, _props$notFoundConten = props.notFoundContent, notFoundContent = _props$notFoundConten === void 0 ? 'Not Found' : _props$notFoundConten, optionLabelProp = props.optionLabelProp, backfill = props.backfill, getInputElement = props.getInputElement, getPopupContainer = props.getPopupContainer, _props$listHeight = props.listHeight, listHeight = _props$listHeight === void 0 ? 200 : _props$listHeight, _props$listItemHeight = props.listItemHeight, listItemHeight = _props$listItemHeight === void 0 ? 20 : _props$listItemHeight, animation = props.animation, transitionName = props.transitionName, virtual = props.virtual, dropdownStyle = props.dropdownStyle, dropdownClassName = props.dropdownClassName, dropdownMatchSelectWidth = props.dropdownMatchSelectWidth, dropdownRender = props.dropdownRender, dropdownAlign = props.dropdownAlign, _props$showAction = props.showAction, showAction = _props$showAction === void 0 ? [] : _props$showAction, direction = props.direction, tokenSeparators = props.tokenSeparators, tagRender = props.tagRender, onPopupScroll = props.onPopupScroll, onDropdownVisibleChange = props.onDropdownVisibleChange, onFocus = props.onFocus, onBlur = props.onBlur, onKeyUp = props.onKeyUp, onKeyDown = props.onKeyDown, onMouseDown = props.onMouseDown, onChange = props.onChange, onSelect = props.onSelect, onDeselect = props.onDeselect, onClear = props.onClear, _props$internalProps = props.internalProps, internalProps = _props$internalProps === void 0 ? {} : _props$internalProps, restProps = (0, _objectWithoutProperties2.default)(props, ["prefixCls", "className", "id", "open", "defaultOpen", "options", "children", "mode", "value", "defaultValue", "labelInValue", "showSearch", "inputValue", "searchValue", "filterOption", "optionFilterProp", "autoClearSearchValue", "onSearch", "allowClear", "clearIcon", "showArrow", "inputIcon", "menuItemSelectedIcon", "disabled", "loading", "defaultActiveFirstOption", "notFoundContent", "optionLabelProp", "backfill", "getInputElement", "getPopupContainer", "listHeight", "listItemHeight", "animation", "transitionName", "virtual", "dropdownStyle", "dropdownClassName", "dropdownMatchSelectWidth", "dropdownRender", "dropdownAlign", "showAction", "direction", "tokenSeparators", "tagRender", "onPopupScroll", "onDropdownVisibleChange", "onFocus", "onBlur", "onKeyUp", "onKeyDown", "onMouseDown", "onChange", "onSelect", "onDeselect", "onClear", "internalProps"]); var useInternalProps = internalProps.mark === _generator.INTERNAL_PROPS_MARK; var domProps = omitDOMProps ? omitDOMProps(restProps) : restProps; DEFAULT_OMIT_PROPS.forEach(function (prop) { delete domProps[prop]; }); var containerRef = (0, React.useRef)(null); var triggerRef = (0, React.useRef)(null); var selectorRef = (0, React.useRef)(null); var listRef = (0, React.useRef)(null); var tokenWithEnter = (0, React.useMemo)(function () { return (tokenSeparators || []).some(function (tokenSeparator) { return ['\n', '\r\n'].includes(tokenSeparator); }); }, [tokenSeparators]); /** Used for component focused management */ var _useDelayReset = (0, _useDelayReset3.default)(), _useDelayReset2 = (0, _slicedToArray2.default)(_useDelayReset, 3), mockFocused = _useDelayReset2[0], setMockFocused = _useDelayReset2[1], cancelSetMockFocused = _useDelayReset2[2]; // Inner id for accessibility usage. Only work in client side var _useState = (0, React.useState)(), _useState2 = (0, _slicedToArray2.default)(_useState, 2), innerId = _useState2[0], setInnerId = _useState2[1]; (0, React.useEffect)(function () { setInnerId("rc_select_".concat((0, _commonUtil.getUUID)())); }, []); var mergedId = id || innerId; // optionLabelProp var mergedOptionLabelProp = optionLabelProp; if (mergedOptionLabelProp === undefined) { mergedOptionLabelProp = options ? 'label' : 'children'; } // labelInValue var mergedLabelInValue = mode === 'combobox' ? false : labelInValue; var isMultiple = mode === 'tags' || mode === 'multiple'; var mergedShowSearch = showSearch !== undefined ? showSearch : isMultiple || mode === 'combobox'; // ============================== Ref =============================== var selectorDomRef = (0, React.useRef)(null); React.useImperativeHandle(ref, function () { return { focus: selectorRef.current.focus, blur: selectorRef.current.blur }; }); // ============================= Value ============================== var _useMergedState = (0, _useMergedState5.default)(defaultValue, { value: value }), _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2), mergedValue = _useMergedState2[0], setMergedValue = _useMergedState2[1]; /** Unique raw values */ var mergedRawValue = (0, React.useMemo)(function () { return (0, _commonUtil.toInnerValue)(mergedValue, { labelInValue: mergedLabelInValue, combobox: mode === 'combobox' }); }, [mergedValue, mergedLabelInValue]); /** We cache a set of raw values to speed up check */ var rawValues = (0, React.useMemo)(function () { return new Set(mergedRawValue); }, [mergedRawValue]); // ============================= Option ============================= // Set by option list active, it will merge into search input when mode is `combobox` var _useState3 = (0, React.useState)(null), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), activeValue = _useState4[0], setActiveValue = _useState4[1]; var _useState5 = (0, React.useState)(''), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), innerSearchValue = _useState6[0], setInnerSearchValue = _useState6[1]; var mergedSearchValue = innerSearchValue; if (mode === 'combobox' && mergedValue !== undefined) { mergedSearchValue = mergedValue; } else if (searchValue !== undefined) { mergedSearchValue = searchValue; } else if (inputValue) { mergedSearchValue = inputValue; } var mergedOptions = (0, React.useMemo)(function () { var newOptions = options; if (newOptions === undefined) { newOptions = convertChildrenToData(children); } /** * `tags` should fill un-list item. * This is not cool here since TreeSelect do not need this */ if (mode === 'tags' && fillOptionsWithMissingValue) { newOptions = fillOptionsWithMissingValue(newOptions, mergedValue, mergedOptionLabelProp, labelInValue); } return newOptions || []; }, [options, children, mode, mergedValue]); var mergedFlattenOptions = (0, React.useMemo)(function () { return flattenOptions(mergedOptions, props); }, [mergedOptions]); var getValueOption = (0, _useCacheOptions.default)(mergedRawValue, mergedFlattenOptions); // Display options for OptionList var displayOptions = (0, React.useMemo)(function () { if (!mergedSearchValue || !mergedShowSearch) { return (0, _toConsumableArray2.default)(mergedOptions); } var filteredOptions = filterOptions(mergedSearchValue, mergedOptions, { optionFilterProp: optionFilterProp, filterOption: mode === 'combobox' && filterOption === undefined ? function () { return true; } : filterOption }); if (mode === 'tags' && filteredOptions.every(function (opt) { return opt[optionFilterProp] !== mergedSearchValue; })) { filteredOptions.unshift({ value: mergedSearchValue, label: mergedSearchValue, key: '__RC_SELECT_TAG_PLACEHOLDER__' }); } return filteredOptions; }, [mergedOptions, mergedSearchValue, mode, mergedShowSearch]); var displayFlattenOptions = (0, React.useMemo)(function () { return flattenOptions(displayOptions, props); }, [displayOptions]); (0, React.useEffect)(function () { if (listRef.current && listRef.current.scrollTo) { listRef.current.scrollTo(0); } }, [mergedSearchValue]); // ============================ Selector ============================ var displayValues = (0, React.useMemo)(function () { var tmpValues = mergedRawValue.map(function (val) { var valueOptions = getValueOption([val]); var displayValue = getLabeledValue(val, { options: valueOptions, prevValue: mergedValue, labelInValue: mergedLabelInValue, optionLabelProp: mergedOptionLabelProp }); return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, displayValue), {}, { disabled: isValueDisabled(val, valueOptions) }); }); if (!mode && tmpValues.length === 1 && tmpValues[0].value === null && tmpValues[0].label === null) { return []; } return tmpValues; }, [mergedValue, mergedOptions, mode]); // Polyfill with cache label displayValues = (0, _useCacheDisplayValue.default)(displayValues); var triggerSelect = function triggerSelect(newValue, isSelect, source) { var newValueOption = getValueOption([newValue]); var outOption = findValueOption([newValue], newValueOption)[0]; if (!internalProps.skipTriggerSelect) { // Skip trigger `onSelect` or `onDeselect` if configured var selectValue = mergedLabelInValue ? getLabeledValue(newValue, { options: newValueOption, prevValue: mergedValue, labelInValue: mergedLabelInValue, optionLabelProp: mergedOptionLabelProp }) : newValue; if (isSelect && onSelect) { onSelect(selectValue, outOption); } else if (!isSelect && onDeselect) { onDeselect(selectValue, outOption); } } // Trigger internal event if (useInternalProps) { if (isSelect && internalProps.onRawSelect) { internalProps.onRawSelect(newValue, outOption, source); } else if (!isSelect && internalProps.onRawDeselect) { internalProps.onRawDeselect(newValue, outOption, source); } } }; // We need cache options here in case user update the option list var _useState7 = (0, React.useState)([]), _useState8 = (0, _slicedToArray2.default)(_useState7, 2), prevValueOptions = _useState8[0], setPrevValueOptions = _useState8[1]; var triggerChange = function triggerChange(newRawValues) { if (useInternalProps && internalProps.skipTriggerChange) { return; } var newRawValuesOptions = getValueOption(newRawValues); var outValues = (0, _commonUtil.toOuterValues)(Array.from(newRawValues), { labelInValue: mergedLabelInValue, options: newRawValuesOptions, getLabeledValue: getLabeledValue, prevValue: mergedValue, optionLabelProp: mergedOptionLabelProp }); var outValue = isMultiple ? outValues : outValues[0]; // Skip trigger if prev & current value is both empty if (onChange && (mergedRawValue.length !== 0 || outValues.length !== 0)) { var outOptions = findValueOption(newRawValues, newRawValuesOptions, { prevValueOptions: prevValueOptions }); // We will cache option in case it removed by ajax setPrevValueOptions(outOptions.map(function (option, index) { var clone = (0, _objectSpread2.default)({}, option); Object.defineProperty(clone, '_INTERNAL_OPTION_VALUE_', { get: function get() { return newRawValues[index]; } }); return clone; })); onChange(outValue, isMultiple ? outOptions : outOptions[0]); } setMergedValue(outValue); }; var onInternalSelect = function onInternalSelect(newValue, _ref) { var selected = _ref.selected, source = _ref.source; if (disabled) { return; } var newRawValue; if (isMultiple) { newRawValue = new Set(mergedRawValue); if (selected) { newRawValue.add(newValue); } else { newRawValue.delete(newValue); } } else { newRawValue = new Set(); newRawValue.add(newValue); } // Multiple always trigger change and single should change if value changed if (isMultiple || !isMultiple && Array.from(mergedRawValue)[0] !== newValue) { triggerChange(Array.from(newRawValue)); } // Trigger `onSelect`. Single mode always trigger select triggerSelect(newValue, !isMultiple || selected, source); // Clean search value if single or configured if (mode === 'combobox') { setInnerSearchValue(String(newValue)); setActiveValue(''); } else if (!isMultiple || autoClearSearchValue) { setInnerSearchValue(''); setActiveValue(''); } }; var onInternalOptionSelect = function onInternalOptionSelect(newValue, info) { onInternalSelect(newValue, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, info), {}, { source: 'option' })); }; var onInternalSelectionSelect = function onInternalSelectionSelect(newValue, info) { onInternalSelect(newValue, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, info), {}, { source: 'selection' })); }; // ============================= Input ============================== // Only works in `combobox` var customizeInputElement = mode === 'combobox' && getInputElement && getInputElement() || null; // ============================== Open ============================== var _useMergedState3 = (0, _useMergedState5.default)(undefined, { defaultValue: defaultOpen, value: open }), _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2), innerOpen = _useMergedState4[0], setInnerOpen = _useMergedState4[1]; var mergedOpen = innerOpen; // Not trigger `open` in `combobox` when `notFoundContent` is empty var emptyListContent = !notFoundContent && !displayOptions.length; if (disabled || emptyListContent && mergedOpen && mode === 'combobox') { mergedOpen = false; } var triggerOpen = emptyListContent ? false : mergedOpen; var onToggleOpen = function onToggleOpen(newOpen) { var nextOpen = newOpen !== undefined ? newOpen : !mergedOpen; if (innerOpen !== nextOpen && !disabled) { setInnerOpen(nextOpen); if (onDropdownVisibleChange) { onDropdownVisibleChange(nextOpen); } } }; (0, _useSelectTriggerControl.default)([containerRef.current, triggerRef.current && triggerRef.current.getPopupElement()], triggerOpen, onToggleOpen); // ============================= Search ============================= var triggerSearch = function triggerSearch(searchText, fromTyping, isCompositing) { var ret = true; var newSearchText = searchText; setActiveValue(null); // Check if match the `tokenSeparators` var patchLabels = isCompositing ? null : (0, _valueUtil.getSeparatedContent)(searchText, tokenSeparators); var patchRawValues = patchLabels; if (mode === 'combobox') { // Only typing will trigger onChange if (fromTyping) { triggerChange([newSearchText]); } } else if (patchLabels) { newSearchText = ''; if (mode !== 'tags') { patchRawValues = patchLabels.map(function (label) { var item = mergedFlattenOptions.find(function (_ref2) { var data = _ref2.data; return data[mergedOptionLabelProp] === label; }); return item ? item.data.value : null; }).filter(function (val) { return val !== null; }); } var newRawValues = Array.from(new Set([].concat((0, _toConsumableArray2.default)(mergedRawValue), (0, _toConsumableArray2.default)(patchRawValues)))); triggerChange(newRawValues); newRawValues.forEach(function (newRawValue) { triggerSelect(newRawValue, true, 'input'); }); // Should close when paste finish onToggleOpen(false); // Tell Selector that break next actions ret = false; } setInnerSearchValue(newSearchText); if (onSearch && mergedSearchValue !== newSearchText) { onSearch(newSearchText); } return ret; }; // Only triggered when menu is closed & mode is tags // If menu is open, OptionList will take charge // If mode isn't tags, press enter is not meaningful when you can't see any option var onSearchSubmit = function onSearchSubmit(searchText) { var newRawValues = Array.from(new Set([].concat((0, _toConsumableArray2.default)(mergedRawValue), [searchText]))); triggerChange(newRawValues); newRawValues.forEach(function (newRawValue) { triggerSelect(newRawValue, true, 'input'); }); setInnerSearchValue(''); }; // Close dropdown when disabled change (0, React.useEffect)(function () { if (innerOpen && !!disabled) { setInnerOpen(false); } }, [disabled]); // Close will clean up single mode search text (0, React.useEffect)(function () { if (!mergedOpen && !isMultiple && mode !== 'combobox') { triggerSearch('', false, false); } }, [mergedOpen]); // ============================ Keyboard ============================ /** * We record input value here to check if can press to clean up by backspace * - null: Key is not down, this is reset by key up * - true: Search text is empty when first time backspace down * - false: Search text is not empty when first time backspace down */ var _useLock = (0, _useLock3.default)(), _useLock2 = (0, _slicedToArray2.default)(_useLock, 2), getClearLock = _useLock2[0], setClearLock = _useLock2[1]; // KeyDown var onInternalKeyDown = function onInternalKeyDown(event) { var clearLock = getClearLock(); var which = event.which; // We only manage open state here, close logic should handle by list component if (!mergedOpen && which === _KeyCode.default.ENTER) { onToggleOpen(true); } setClearLock(!!mergedSearchValue); // Remove value by `backspace` if (which === _KeyCode.default.BACKSPACE && !clearLock && isMultiple && !mergedSearchValue && mergedRawValue.length) { var removeInfo = (0, _commonUtil.removeLastEnabledValue)(displayValues, mergedRawValue); if (removeInfo.removedValue !== null) { triggerChange(removeInfo.values); triggerSelect(removeInfo.removedValue, false, 'input'); } } for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { rest[_key - 1] = arguments[_key]; } if (mergedOpen && listRef.current) { var _listRef$current; (_listRef$current = listRef.current).onKeyDown.apply(_listRef$current, [event].concat(rest)); } if (onKeyDown) { onKeyDown.apply(void 0, [event].concat(rest)); } }; // KeyUp var onInternalKeyUp = function onInternalKeyUp(event) { for (var _len2 = arguments.length, rest = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { rest[_key2 - 1] = arguments[_key2]; } if (mergedOpen && listRef.current) { var _listRef$current2; (_listRef$current2 = listRef.current).onKeyUp.apply(_listRef$current2, [event].concat(rest)); } if (onKeyUp) { onKeyUp.apply(void 0, [event].concat(rest)); } }; // ========================== Focus / Blur ========================== /** Record real focus status */ var focusRef = (0, React.useRef)(false); var onContainerFocus = function onContainerFocus() { setMockFocused(true); if (!disabled) { if (onFocus && !focusRef.current) { onFocus.apply(void 0, arguments); } // `showAction` should handle `focus` if set if (showAction.includes('focus')) { onToggleOpen(true); } } focusRef.current = true; }; var onContainerBlur = function onContainerBlur() { setMockFocused(false, function () { focusRef.current = false; onToggleOpen(false); }); if (disabled) { return; } if (mergedSearchValue) { // `tags` mode should move `searchValue` into values if (mode === 'tags') { triggerSearch('', false, false); triggerChange(Array.from(new Set([].concat((0, _toConsumableArray2.default)(mergedRawValue), [mergedSearchValue])))); } else if (mode === 'multiple') { // `multiple` mode only clean the search value but not trigger event setInnerSearchValue(''); } } if (onBlur) { onBlur.apply(void 0, arguments); } }; var activeTimeoutIds = []; (0, React.useEffect)(function () { return function () { activeTimeoutIds.forEach(function (timeoutId) { return clearTimeout(timeoutId); }); activeTimeoutIds.splice(0, activeTimeoutIds.length); }; }, []); var onInternalMouseDown = function onInternalMouseDown(event) { var target = event.target; var popupElement = triggerRef.current && triggerRef.current.getPopupElement(); // We should give focus back to selector if clicked item is not focusable if (popupElement && popupElement.contains(target)) { var timeoutId = setTimeout(function () { var index = activeTimeoutIds.indexOf(timeoutId); if (index !== -1) { activeTimeoutIds.splice(index, 1); } cancelSetMockFocused(); if (!popupElement.contains(document.activeElement)) { selectorRef.current.focus(); } }); activeTimeoutIds.push(timeoutId); } if (onMouseDown) { for (var _len3 = arguments.length, restArgs = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { restArgs[_key3 - 1] = arguments[_key3]; } onMouseDown.apply(void 0, [event].concat(restArgs)); } }; // ========================= Accessibility ========================== var _useState9 = (0, React.useState)(0), _useState10 = (0, _slicedToArray2.default)(_useState9, 2), accessibilityIndex = _useState10[0], setAccessibilityIndex = _useState10[1]; var mergedDefaultActiveFirstOption = defaultActiveFirstOption !== undefined ? defaultActiveFirstOption : mode !== 'combobox'; var onActiveValue = function onActiveValue(active, index) { var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref3$source = _ref3.source, source = _ref3$source === void 0 ? 'keyboard' : _ref3$source; setAccessibilityIndex(index); if (backfill && mode === 'combobox' && active !== null && source === 'keyboard') { setActiveValue(String(active)); } }; // ============================= Popup ============================== var _useState11 = (0, React.useState)(null), _useState12 = (0, _slicedToArray2.default)(_useState11, 2), containerWidth = _useState12[0], setContainerWidth = _useState12[1]; var _useState13 = (0, React.useState)({}), _useState14 = (0, _slicedToArray2.default)(_useState13, 2), forceUpdate = _useState14[1]; // We need force update here since popup dom is render async function onPopupMouseEnter() { forceUpdate({}); } (0, _useLayoutEffect.default)(function () { if (triggerOpen) { var newWidth = Math.ceil(containerRef.current.offsetWidth); if (containerWidth !== newWidth) { setContainerWidth(newWidth); } } }, [triggerOpen]); var popupNode = React.createElement(OptionList, { ref: listRef, prefixCls: prefixCls, id: mergedId, open: mergedOpen, childrenAsData: !options, options: displayOptions, flattenOptions: displayFlattenOptions, multiple: isMultiple, values: rawValues, height: listHeight, itemHeight: listItemHeight, onSelect: onInternalOptionSelect, onToggleOpen: onToggleOpen, onActiveValue: onActiveValue, defaultActiveFirstOption: mergedDefaultActiveFirstOption, notFoundContent: notFoundContent, onScroll: onPopupScroll, searchValue: mergedSearchValue, menuItemSelectedIcon: menuItemSelectedIcon, virtual: virtual !== false && dropdownMatchSelectWidth !== false, onMouseEnter: onPopupMouseEnter }); // ============================= Clear ============================== var clearNode; var onClearMouseDown = function onClearMouseDown() { // Trigger internal `onClear` event if (useInternalProps && internalProps.onClear) { internalProps.onClear(); } if (onClear) { onClear(); } triggerChange([]); triggerSearch('', false, false); }; if (!disabled && allowClear && (mergedRawValue.length || mergedSearchValue)) { clearNode = React.createElement(_TransBtn.default, { className: "".concat(prefixCls, "-clear"), onMouseDown: onClearMouseDown, customizeIcon: clearIcon }, "\xD7"); } // ============================= Arrow ============================== var mergedShowArrow = showArrow !== undefined ? showArrow : loading || !isMultiple && mode !== 'combobox'; var arrowNode; if (mergedShowArrow) { arrowNode = React.createElement(_TransBtn.default, { className: (0, _classnames.default)("".concat(prefixCls, "-arrow"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-arrow-loading"), loading)), customizeIcon: inputIcon, customizeIconProps: { loading: loading, searchValue: mergedSearchValue, open: mergedOpen, focused: mockFocused, showSearch: mergedShowSearch } }); } // ============================ Warning ============================= if (process.env.NODE_ENV !== 'production' && warningProps) { warningProps(props); } // ============================= Render ============================= var mergedClassName = (0, _classnames.default)(prefixCls, className, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-focused"), mockFocused), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-multiple"), isMultiple), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-single"), !isMultiple), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-allow-clear"), allowClear), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-show-arrow"), mergedShowArrow), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-loading"), loading), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-open"), mergedOpen), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-customize-input"), customizeInputElement), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-show-search"), mergedShowSearch), _classNames2)); return React.createElement("div", Object.assign({ className: mergedClassName }, domProps, { ref: containerRef, onMouseDown: onInternalMouseDown, onKeyDown: onInternalKeyDown, onKeyUp: onInternalKeyUp, onFocus: onContainerFocus, onBlur: onContainerBlur }), mockFocused && !mergedOpen && React.createElement("span", { style: { width: 0, height: 0, display: 'flex', overflow: 'hidden', opacity: 0 }, "aria-live": "polite" }, "".concat(mergedRawValue.join(', '))), React.createElement(_SelectTrigger.default, { ref: triggerRef, disabled: disabled, prefixCls: prefixCls, visible: triggerOpen, popupElement: popupNode, containerWidth: containerWidth, animation: animation, transitionName: transitionName, dropdownStyle: dropdownStyle, dropdownClassName: dropdownClassName, direction: direction, dropdownMatchSelectWidth: dropdownMatchSelectWidth, dropdownRender: dropdownRender, dropdownAlign: dropdownAlign, getPopupContainer: getPopupContainer, empty: !mergedOptions.length, getTriggerDOMNode: function getTriggerDOMNode() { return selectorDomRef.current; } }, React.createElement(_Selector.default, Object.assign({}, props, { domRef: selectorDomRef, prefixCls: prefixCls, inputElement: customizeInputElement, ref: selectorRef, id: mergedId, showSearch: mergedShowSearch, mode: mode, accessibilityIndex: accessibilityIndex, multiple: isMultiple, tagRender: tagRender, values: displayValues, open: mergedOpen, onToggleOpen: onToggleOpen, searchValue: mergedSearchValue, activeValue: activeValue, onSearch: triggerSearch, onSearchSubmit: onSearchSubmit, onSelect: onInternalSelectionSelect, tokenWithEnter: tokenWithEnter }))), arrowNode, clearNode); } var RefSelect = React.forwardRef(Select); return RefSelect; } }).call(this,require('_process')) },{"./SelectTrigger":734,"./Selector":738,"./TransBtn":739,"./hooks/useCacheDisplayValue":741,"./hooks/useCacheOptions":742,"./hooks/useDelayReset":743,"./hooks/useLayoutEffect":744,"./hooks/useLock":745,"./hooks/useSelectTriggerControl":746,"./interface/generator":748,"./utils/commonUtil":749,"./utils/valueUtil":751,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"_process":1,"classnames":455,"rc-util/lib/KeyCode":865,"rc-util/lib/hooks/useMergedState":871,"react":"react"}],741:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useCacheDisplayValue; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); function useCacheDisplayValue(values) { var prevValuesRef = React.useRef(values); var mergedValues = React.useMemo(function () { // Create value - label map var valueLabels = new Map(); prevValuesRef.current.forEach(function (_ref) { var value = _ref.value, label = _ref.label; if (value !== label) { valueLabels.set(value, label); } }); var resultValues = values.map(function (item) { var cacheLabel = valueLabels.get(item.value); if (item.value === item.label && cacheLabel) { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, { label: cacheLabel }); } return item; }); prevValuesRef.current = resultValues; return resultValues; }, [values]); return mergedValues; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"react":"react"}],742:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useCacheOptions; var React = _interopRequireWildcard(require("react")); function useCacheOptions(values, options) { var prevOptionMapRef = React.useRef(null); var optionMap = React.useMemo(function () { var map = new Map(); options.forEach(function (item) { var value = item.data.value; map.set(value, item); }); return map; }, [values, options]); prevOptionMapRef.current = optionMap; var getValueOption = function getValueOption(vals) { return vals.map(function (value) { return prevOptionMapRef.current.get(value); }).filter(Boolean); }; return getValueOption; } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],743:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useDelayReset; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); /** * Similar with `useLock`, but this hook will always execute last value. * When set to `true`, it will keep `true` for a short time even if `false` is set. */ function useDelayReset() { var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10; var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), bool = _React$useState2[0], setBool = _React$useState2[1]; var delayRef = React.useRef(null); var cancelLatest = function cancelLatest() { window.clearTimeout(delayRef.current); }; React.useEffect(function () { return cancelLatest; }, []); var delaySetBool = function delaySetBool(value, callback) { cancelLatest(); delayRef.current = window.setTimeout(function () { setBool(value); if (callback) { callback(); } }, timeout); }; return [bool, delaySetBool, cancelLatest]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],744:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useLayoutEffect; var React = _interopRequireWildcard(require("react")); var _commonUtil = require("../utils/commonUtil"); /* eslint-disable react-hooks/rules-of-hooks */ /** * Wrap `React.useLayoutEffect` which will not throw warning message in test env */ function useLayoutEffect(effect, deps) { // Never happen in test env if (_commonUtil.isBrowserClient) { /* istanbul ignore next */ React.useLayoutEffect(effect, deps); } else { React.useEffect(effect, deps); } } /* eslint-enable */ },{"../utils/commonUtil":749,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],745:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useLock; var React = _interopRequireWildcard(require("react")); /** * Locker return cached mark. * If set to `true`, will return `true` in a short time even if set `false`. * If set to `false` and then set to `true`, will change to `true`. * And after time duration, it will back to `null` automatically. */ function useLock() { var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 250; var lockRef = React.useRef(null); var timeoutRef = React.useRef(null); // Clean up React.useEffect(function () { return function () { window.clearTimeout(timeoutRef.current); }; }, []); function doLock(locked) { if (locked || lockRef.current === null) { lockRef.current = locked; } window.clearTimeout(timeoutRef.current); timeoutRef.current = window.setTimeout(function () { lockRef.current = null; }, duration); } return [function () { return lockRef.current; }, doLock]; } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],746:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useSelectTriggerControl; var React = _interopRequireWildcard(require("react")); function useSelectTriggerControl(elements, open, triggerOpen) { var propsRef = React.useRef(null); propsRef.current = { elements: elements.filter(function (e) { return e; }), open: open, triggerOpen: triggerOpen }; React.useEffect(function () { function onGlobalMouseDown(event) { var target = event.target; if (propsRef.current.open && propsRef.current.elements.every(function (element) { return !element.contains(target) && element !== target; })) { // Should trigger close propsRef.current.triggerOpen(false); } } window.addEventListener('mousedown', onGlobalMouseDown); return function () { return window.removeEventListener('mousedown', onGlobalMouseDown); }; }, []); } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],747:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Option", { enumerable: true, get: function get() { return _Option.default; } }); Object.defineProperty(exports, "OptGroup", { enumerable: true, get: function get() { return _OptGroup.default; } }); exports.default = void 0; var _Select = _interopRequireDefault(require("./Select")); var _Option = _interopRequireDefault(require("./Option")); var _OptGroup = _interopRequireDefault(require("./OptGroup")); var _default = _Select.default; exports.default = _default; },{"./OptGroup":730,"./Option":731,"./Select":733,"@babel/runtime/helpers/interopRequireDefault":192}],748:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.INTERNAL_PROPS_MARK = void 0; var INTERNAL_PROPS_MARK = 'RC_SELECT_INTERNAL_PROPS_MARK'; exports.INTERNAL_PROPS_MARK = INTERNAL_PROPS_MARK; },{}],749:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.toArray = toArray; exports.toInnerValue = toInnerValue; exports.toOuterValues = toOuterValues; exports.removeLastEnabledValue = removeLastEnabledValue; exports.getUUID = getUUID; exports.isBrowserClient = exports.isClient = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); function toArray(value) { if (Array.isArray(value)) { return value; } return value !== undefined ? [value] : []; } /** * Convert outer props value into internal value */ function toInnerValue(value, _ref) { var labelInValue = _ref.labelInValue, combobox = _ref.combobox; if (value === undefined || value === '' && combobox) { return []; } var values = Array.isArray(value) ? value : [value]; if (labelInValue) { return values.map(function (_ref2) { var key = _ref2.key, val = _ref2.value; return val !== undefined ? val : key; }); } return values; } /** * Convert internal value into out event value */ function toOuterValues(valueList, _ref3) { var optionLabelProp = _ref3.optionLabelProp, labelInValue = _ref3.labelInValue, prevValue = _ref3.prevValue, options = _ref3.options, getLabeledValue = _ref3.getLabeledValue; var values = valueList; if (labelInValue) { values = values.map(function (val) { return getLabeledValue(val, { options: options, prevValue: prevValue, labelInValue: labelInValue, optionLabelProp: optionLabelProp }); }); } return values; } function removeLastEnabledValue(measureValues, values) { var newValues = (0, _toConsumableArray2.default)(values); var removeIndex; for (removeIndex = measureValues.length - 1; removeIndex >= 0; removeIndex -= 1) { if (!measureValues[removeIndex].disabled) { break; } } var removedValue = null; if (removeIndex !== -1) { removedValue = newValues[removeIndex]; newValues.splice(removeIndex, 1); } return { values: newValues, removedValue: removedValue }; } var isClient = typeof window !== 'undefined' && window.document && window.document.documentElement; /** Is client side and not jsdom */ exports.isClient = isClient; var isBrowserClient = process.env.NODE_ENV !== 'test' && isClient; exports.isBrowserClient = isBrowserClient; var uuid = 0; /** Get unique id for accessibility usage */ function getUUID() { var retId; // Test never reach /* istanbul ignore if */ if (isBrowserClient) { retId = uuid; uuid += 1; } else { retId = 'TEST_OR_SSR'; } return retId; } }).call(this,require('_process')) },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/toConsumableArray":207,"_process":1}],750:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.convertChildrenToData = convertChildrenToData; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); function convertNodeToOption(node) { var key = node.key, _node$props = node.props, children = _node$props.children, value = _node$props.value, restProps = (0, _objectWithoutProperties2.default)(_node$props, ["children", "value"]); return (0, _objectSpread2.default)({ key: key, value: value !== undefined ? value : key, children: children }, restProps); } function convertChildrenToData(nodes) { var optionOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return (0, _toArray.default)(nodes).map(function (node, index) { if (!React.isValidElement(node) || !node.type) { return null; } var isSelectOptGroup = node.type.isSelectOptGroup, key = node.key, _node$props2 = node.props, children = _node$props2.children, restProps = (0, _objectWithoutProperties2.default)(_node$props2, ["children"]); if (optionOnly || !isSelectOptGroup) { return convertNodeToOption(node); } return (0, _objectSpread2.default)((0, _objectSpread2.default)({ key: "__RC_SELECT_GRP__".concat(key === null ? index : key, "__"), label: key }, restProps), {}, { options: convertChildrenToData(children) }); }).filter(function (data) { return data; }); } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"rc-util/lib/Children/toArray":858,"react":"react"}],751:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.flattenOptions = flattenOptions; exports.findValueOption = findValueOption; exports.filterOptions = filterOptions; exports.getSeparatedContent = getSeparatedContent; exports.isValueDisabled = isValueDisabled; exports.fillOptionsWithMissingValue = fillOptionsWithMissingValue; exports.getLabeledValue = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _commonUtil = require("./commonUtil"); function getKey(data, index) { var key = data.key; var value; if ('value' in data) { value = data.value; } if (key !== null && key !== undefined) { return key; } if (value !== undefined) { return value; } return "rc-index-key-".concat(index); } /** * Flat options into flatten list. * We use `optionOnly` here is aim to avoid user use nested option group. * Here is simply set `key` to the index if not provided. */ function flattenOptions(options) { var flattenList = []; function dig(list, isGroupOption) { list.forEach(function (data) { if (isGroupOption || !('options' in data)) { // Option flattenList.push({ key: getKey(data, flattenList.length), groupOption: isGroupOption, data: data }); } else { // Option Group flattenList.push({ key: getKey(data, flattenList.length), group: true, data: data }); dig(data.options, true); } }); } dig(options, false); return flattenList; } /** * Inject `props` into `option` for legacy usage */ function injectPropsWithOption(option) { var newOption = (0, _objectSpread2.default)({}, option); if (!('props' in newOption)) { Object.defineProperty(newOption, 'props', { get: function get() { (0, _warning.default)(false, 'Return type is option instead of Option instance. Please read value directly instead of reading from `props`.'); return newOption; } }); } return newOption; } function findValueOption(values, options) { var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref$prevValueOptions = _ref.prevValueOptions, prevValueOptions = _ref$prevValueOptions === void 0 ? [] : _ref$prevValueOptions; var optionMap = new Map(); options.forEach(function (flattenItem) { if (!flattenItem.group) { var data = flattenItem.data; // Check if match optionMap.set(data.value, data); } }); return values.map(function (val) { var option = optionMap.get(val); // Fallback to try to find prev options if (!option) { option = (0, _objectSpread2.default)({}, prevValueOptions.find(function (opt) { return opt._INTERNAL_OPTION_VALUE_ === val; })); } return injectPropsWithOption(option); }); } var getLabeledValue = function getLabeledValue(value, _ref2) { var options = _ref2.options, prevValue = _ref2.prevValue, labelInValue = _ref2.labelInValue, optionLabelProp = _ref2.optionLabelProp; var item = findValueOption([value], options)[0]; var result = { value: value }; var prevValItem; var prevValues = (0, _commonUtil.toArray)(prevValue); if (labelInValue) { prevValItem = prevValues.find(function (prevItem) { if ((0, _typeof2.default)(prevItem) === 'object' && 'value' in prevItem) { return prevItem.value === value; } // [Legacy] Support `key` as `value` return prevItem.key === value; }); } if (prevValItem && (0, _typeof2.default)(prevValItem) === 'object' && 'label' in prevValItem) { result.label = prevValItem.label; if (item && typeof prevValItem.label === 'string' && typeof item[optionLabelProp] === 'string' && prevValItem.label.trim() !== item[optionLabelProp].trim()) { (0, _warning.default)(false, '`label` of `value` is not same as `label` in Select options.'); } } else if (item && optionLabelProp in item) { result.label = item[optionLabelProp]; } else { result.label = value; } // Used for motion control result.key = result.value; return result; }; exports.getLabeledValue = getLabeledValue; function toRawString(content) { return (0, _commonUtil.toArray)(content).join(''); } /** Filter single option if match the search text */ function getFilterFunction(optionFilterProp) { return function (searchValue, option) { var lowerSearchText = searchValue.toLowerCase(); // Group label search if ('options' in option) { return toRawString(option.label).toLowerCase().includes(lowerSearchText); } // Option value search var rawValue = option[optionFilterProp]; var value = toRawString(rawValue).toLowerCase(); return value.includes(lowerSearchText); }; } /** Filter options and return a new options by the search text */ function filterOptions(searchValue, options, _ref3) { var optionFilterProp = _ref3.optionFilterProp, filterOption = _ref3.filterOption; var filteredOptions = []; var filterFunc; if (filterOption === false) { return options; } if (typeof filterOption === 'function') { filterFunc = filterOption; } else { filterFunc = getFilterFunction(optionFilterProp); } options.forEach(function (item) { // Group should check child options if ('options' in item) { // Check group first var matchGroup = filterFunc(searchValue, item); if (matchGroup) { filteredOptions.push(item); } else { // Check option var subOptions = item.options.filter(function (subItem) { return filterFunc(searchValue, subItem); }); if (subOptions.length) { filteredOptions.push((0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, { options: subOptions })); } } return; } if (filterFunc(searchValue, injectPropsWithOption(item))) { filteredOptions.push(item); } }); return filteredOptions; } function getSeparatedContent(text, tokens) { if (!tokens || !tokens.length) { return null; } var match = false; function separate(str, _ref4) { var _ref5 = (0, _toArray2.default)(_ref4), token = _ref5[0], restTokens = _ref5.slice(1); if (!token) { return [str]; } var list = str.split(token); match = match || list.length > 1; return list.reduce(function (prevList, unitStr) { return [].concat((0, _toConsumableArray2.default)(prevList), (0, _toConsumableArray2.default)(separate(unitStr, restTokens))); }, []).filter(function (unit) { return unit; }); } var list = separate(text, tokens); return match ? list : null; } function isValueDisabled(value, options) { var option = findValueOption([value], options)[0]; return option.disabled; } /** * `tags` mode should fill un-list item into the option list */ function fillOptionsWithMissingValue(options, value, optionLabelProp, labelInValue) { var values = (0, _commonUtil.toArray)(value).slice().sort(); var cloneOptions = (0, _toConsumableArray2.default)(options); // Convert options value to set var optionValues = new Set(); options.forEach(function (opt) { if (opt.options) { opt.options.forEach(function (subOpt) { optionValues.add(subOpt.value); }); } else { optionValues.add(opt.value); } }); // Fill missing value values.forEach(function (item) { var val = labelInValue ? item.value : item; if (!optionValues.has(val)) { var _ref6; cloneOptions.push(labelInValue ? (_ref6 = {}, (0, _defineProperty2.default)(_ref6, optionLabelProp, item.label), (0, _defineProperty2.default)(_ref6, "value", val), _ref6) : { value: val }); } }); return cloneOptions; } },{"./commonUtil":749,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/toArray":206,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"rc-util/lib/warning":879}],752:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _warning = _interopRequireWildcard(require("rc-util/lib/warning")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _legacyUtil = require("./legacyUtil"); var _commonUtil = require("./commonUtil"); function warningProps(props) { var mode = props.mode, options = props.options, children = props.children, backfill = props.backfill, allowClear = props.allowClear, placeholder = props.placeholder, getInputElement = props.getInputElement, showSearch = props.showSearch, onSearch = props.onSearch, defaultOpen = props.defaultOpen, autoFocus = props.autoFocus, labelInValue = props.labelInValue, value = props.value, inputValue = props.inputValue, optionLabelProp = props.optionLabelProp; var multiple = mode === 'multiple' || mode === 'tags'; var mergedShowSearch = showSearch !== undefined ? showSearch : multiple || mode === 'combobox'; var mergedOptions = options || (0, _legacyUtil.convertChildrenToData)(children); // `tags` should not set option as disabled (0, _warning.default)(mode !== 'tags' || mergedOptions.every(function (opt) { return !opt.disabled; }), 'Please avoid setting option to disabled in tags mode since user can always type text as tag.'); // `combobox` & `tags` should option be `string` type if (mode === 'tags' || mode === 'combobox') { var hasNumberValue = mergedOptions.some(function (item) { if (item.options) { return item.options.some(function (opt) { return typeof ('value' in opt ? opt.value : opt.key) === 'number'; }); } return typeof ('value' in item ? item.value : item.key) === 'number'; }); (0, _warning.default)(!hasNumberValue, '`value` of Option should not use number type when `mode` is `tags` or `combobox`.'); } // `combobox` should not use `optionLabelProp` (0, _warning.default)(mode !== 'combobox' || !optionLabelProp, '`combobox` mode not support `optionLabelProp`. Please set `value` on Option directly.'); // Only `combobox` support `backfill` (0, _warning.default)(mode === 'combobox' || !backfill, '`backfill` only works with `combobox` mode.'); // Only `combobox` support `getInputElement` (0, _warning.default)(mode === 'combobox' || !getInputElement, '`getInputElement` only work with `combobox` mode.'); // Customize `getInputElement` should not use `allowClear` & `placeholder` (0, _warning.noteOnce)(mode !== 'combobox' || !getInputElement || !allowClear || !placeholder, 'Customize `getInputElement` should customize clear and placeholder logic instead of configuring `allowClear` and `placeholder`.'); // `onSearch` should use in `combobox` or `showSearch` if (onSearch && !mergedShowSearch && mode !== 'combobox' && mode !== 'tags') { (0, _warning.default)(false, '`onSearch` should work with `showSearch` instead of use alone.'); } (0, _warning.noteOnce)(!defaultOpen || autoFocus, '`defaultOpen` makes Select open without focus which means it will not close by click outside. You can set `autoFocus` if needed.'); if (value !== undefined && value !== null) { var values = (0, _commonUtil.toArray)(value); (0, _warning.default)(!labelInValue || values.every(function (val) { return (0, _typeof2.default)(val) === 'object' && ('key' in val || 'value' in val); }), '`value` should in shape of `{ value: string | number, label?: ReactNode }` when you set `labelInValue` to `true`'); (0, _warning.default)(!multiple || Array.isArray(value), '`value` should be array when `mode` is `multiple` or `tags`'); } // Syntactic sugar should use correct children type if (children) { var invalidateChildType = null; (0, _toArray.default)(children).some(function (node) { if (!React.isValidElement(node) || !node.type) { return false; } var type = node.type; if (type.isSelectOption) { return false; } if (type.isSelectOptGroup) { var allChildrenValid = (0, _toArray.default)(node.props.children).every(function (subNode) { if (!React.isValidElement(subNode) || !node.type || subNode.type.isSelectOption) { return true; } invalidateChildType = subNode.type; return false; }); if (allChildrenValid) { return false; } return true; } invalidateChildType = type; return true; }); if (invalidateChildType) { (0, _warning.default)(false, "`children` should be `Select.Option` or `Select.OptGroup` instead of `".concat(invalidateChildType.displayName || invalidateChildType.name || invalidateChildType, "`.")); } (0, _warning.default)(inputValue === undefined, '`inputValue` is deprecated, please use `searchValue` instead.'); } } var _default = warningProps; exports.default = _default; },{"./commonUtil":749,"./legacyUtil":750,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"rc-util/lib/Children/toArray":858,"rc-util/lib/warning":879,"react":"react"}],753:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var Handle = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Handle, _React$Component); var _super = (0, _createSuper2.default)(Handle); function Handle() { var _this; (0, _classCallCheck2.default)(this, Handle); _this = _super.apply(this, arguments); _this.state = { clickFocused: false }; _this.setHandleRef = function (node) { _this.handle = node; }; _this.handleMouseUp = function () { if (document.activeElement === _this.handle) { _this.setClickFocus(true); } }; _this.handleMouseDown = function (e) { // avoid selecting text during drag // https://github.com/ant-design/ant-design/issues/25010 e.preventDefault(); // fix https://github.com/ant-design/ant-design/issues/15324 _this.focus(); }; _this.handleBlur = function () { _this.setClickFocus(false); }; _this.handleKeyDown = function () { _this.setClickFocus(false); }; return _this; } (0, _createClass2.default)(Handle, [{ key: "componentDidMount", value: function componentDidMount() { // mouseup won't trigger if mouse moved out of handle, // so we listen on document here. this.onMouseUpListener = (0, _addEventListener.default)(document, 'mouseup', this.handleMouseUp); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.onMouseUpListener) { this.onMouseUpListener.remove(); } } }, { key: "setClickFocus", value: function setClickFocus(focused) { this.setState({ clickFocused: focused }); } }, { key: "clickFocus", value: function clickFocus() { this.setClickFocus(true); this.focus(); } }, { key: "focus", value: function focus() { this.handle.focus(); } }, { key: "blur", value: function blur() { this.handle.blur(); } }, { key: "render", value: function render() { var _ref, _ref2; var _this$props = this.props, prefixCls = _this$props.prefixCls, vertical = _this$props.vertical, reverse = _this$props.reverse, offset = _this$props.offset, style = _this$props.style, disabled = _this$props.disabled, min = _this$props.min, max = _this$props.max, value = _this$props.value, tabIndex = _this$props.tabIndex, ariaLabel = _this$props.ariaLabel, ariaLabelledBy = _this$props.ariaLabelledBy, ariaValueTextFormatter = _this$props.ariaValueTextFormatter, restProps = (0, _objectWithoutProperties2.default)(_this$props, ["prefixCls", "vertical", "reverse", "offset", "style", "disabled", "min", "max", "value", "tabIndex", "ariaLabel", "ariaLabelledBy", "ariaValueTextFormatter"]); var className = (0, _classnames.default)(this.props.className, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-handle-click-focused"), this.state.clickFocused)); var positionStyle = vertical ? (_ref = {}, (0, _defineProperty2.default)(_ref, reverse ? 'top' : 'bottom', "".concat(offset, "%")), (0, _defineProperty2.default)(_ref, reverse ? 'bottom' : 'top', 'auto'), (0, _defineProperty2.default)(_ref, "transform", reverse ? null : "translateY(+50%)"), _ref) : (_ref2 = {}, (0, _defineProperty2.default)(_ref2, reverse ? 'right' : 'left', "".concat(offset, "%")), (0, _defineProperty2.default)(_ref2, reverse ? 'left' : 'right', 'auto'), (0, _defineProperty2.default)(_ref2, "transform", "translateX(".concat(reverse ? '+' : '-', "50%)")), _ref2); var elStyle = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), positionStyle); var mergedTabIndex = tabIndex || 0; if (disabled || tabIndex === null) { mergedTabIndex = null; } var ariaValueText; if (ariaValueTextFormatter) { ariaValueText = ariaValueTextFormatter(value); } return _react.default.createElement("div", Object.assign({ ref: this.setHandleRef, tabIndex: mergedTabIndex }, restProps, { className: className, style: elStyle, onBlur: this.handleBlur, onKeyDown: this.handleKeyDown, onMouseDown: this.handleMouseDown, // aria attribute role: "slider", "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": value, "aria-disabled": !!disabled, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-valuetext": ariaValueText })); } }]); return Handle; }(_react.default.Component); exports.default = Handle; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"classnames":455,"rc-util/lib/Dom/addEventListener":859,"react":"react"}],754:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _shallowequal = _interopRequireDefault(require("shallowequal")); var _Track = _interopRequireDefault(require("./common/Track")); var _createSlider = _interopRequireDefault(require("./common/createSlider")); var utils = _interopRequireWildcard(require("./utils")); var _trimAlignValue = function trimAlignValue(_ref) { var value = _ref.value, handle = _ref.handle, bounds = _ref.bounds, props = _ref.props; var allowCross = props.allowCross, pushable = props.pushable; var thershold = Number(pushable); var valInRange = utils.ensureValueInRange(value, props); var valNotConflict = valInRange; if (!allowCross && handle != null && bounds !== undefined) { if (handle > 0 && valInRange <= bounds[handle - 1] + thershold) { valNotConflict = bounds[handle - 1] + thershold; } if (handle < bounds.length - 1 && valInRange >= bounds[handle + 1] - thershold) { valNotConflict = bounds[handle + 1] - thershold; } } return utils.ensureValuePrecision(valNotConflict, props); }; var Range = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Range, _React$Component); var _super = (0, _createSuper2.default)(Range); function Range(props) { var _this; (0, _classCallCheck2.default)(this, Range); _this = _super.call(this, props); _this.onEnd = function (force) { var handle = _this.state.handle; _this.removeDocumentEvents(); if (handle !== null || force) { _this.props.onAfterChange(_this.getValue()); } _this.setState({ handle: null }); }; var count = props.count, min = props.min, max = props.max; var initialValue = Array.apply(void 0, (0, _toConsumableArray2.default)(Array(count + 1))).map(function () { return min; }); var defaultValue = 'defaultValue' in props ? props.defaultValue : initialValue; var value = props.value !== undefined ? props.value : defaultValue; var bounds = value.map(function (v, i) { return _trimAlignValue({ value: v, handle: i, props: props }); }); var recent = bounds[0] === max ? 0 : bounds.length - 1; _this.state = { handle: null, recent: recent, bounds: bounds }; return _this; } /** * [Legacy] Used for inherit other component. * It's a bad code style which should be refactor. */ /* eslint-disable @typescript-eslint/no-unused-vars, class-methods-use-this */ (0, _createClass2.default)(Range, [{ key: "calcValueByPos", value: function calcValueByPos(value) { return 0; } }, { key: "calcOffset", value: function calcOffset(value) { return 0; } }, { key: "saveHandle", value: function saveHandle(index, h) {} }, { key: "removeDocumentEvents", value: function removeDocumentEvents() {} }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps, prevState) { var _this2 = this; if (!('value' in this.props || 'min' in this.props || 'max' in this.props)) { return; } if (this.props.min === prevProps.min && this.props.max === prevProps.max && (0, _shallowequal.default)(this.props.value, prevProps.value)) { return; } var _this$props = this.props, onChange = _this$props.onChange, value = _this$props.value; var currentValue = value || prevState.bounds; if (currentValue.some(function (v) { return utils.isValueOutOfRange(v, _this2.props); })) { var newValues = currentValue.map(function (v) { return utils.ensureValueInRange(v, _this2.props); }); onChange(newValues); } } }, { key: "onChange", value: function onChange(state) { var props = this.props; var isNotControlled = !('value' in props); if (isNotControlled) { this.setState(state); } else { var controlledState = {}; ['handle', 'recent'].forEach(function (item) { if (state[item] !== undefined) { controlledState[item] = state[item]; } }); if (Object.keys(controlledState).length) { this.setState(controlledState); } } var data = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, this.state), state); var changedValue = data.bounds; props.onChange(changedValue); } }, { key: "onStart", value: function onStart(position) { var props = this.props, state = this.state; var bounds = this.getValue(); props.onBeforeChange(bounds); var value = this.calcValueByPos(position); this.startValue = value; this.startPosition = position; var closestBound = this.getClosestBound(value); this.prevMovedHandleIndex = this.getBoundNeedMoving(value, closestBound); this.setState({ handle: this.prevMovedHandleIndex, recent: this.prevMovedHandleIndex }); var prevValue = bounds[this.prevMovedHandleIndex]; if (value === prevValue) return; var nextBounds = (0, _toConsumableArray2.default)(state.bounds); nextBounds[this.prevMovedHandleIndex] = value; this.onChange({ bounds: nextBounds }); } }, { key: "onMove", value: function onMove(e, position) { utils.pauseEvent(e); var state = this.state; var value = this.calcValueByPos(position); var oldValue = state.bounds[state.handle]; if (value === oldValue) return; this.moveTo(value); } }, { key: "onKeyboard", value: function onKeyboard(e) { var _this$props2 = this.props, reverse = _this$props2.reverse, vertical = _this$props2.vertical; var valueMutator = utils.getKeyboardValueMutator(e, vertical, reverse); if (valueMutator) { utils.pauseEvent(e); var state = this.state, props = this.props; var bounds = state.bounds, handle = state.handle; var oldValue = bounds[handle === null ? state.recent : handle]; var mutatedValue = valueMutator(oldValue, props); var value = _trimAlignValue({ value: mutatedValue, handle: handle, bounds: state.bounds, props: props }); if (value === oldValue) return; var isFromKeyboardEvent = true; this.moveTo(value, isFromKeyboardEvent); } } }, { key: "getValue", value: function getValue() { return this.state.bounds; } }, { key: "getClosestBound", value: function getClosestBound(value) { var bounds = this.state.bounds; var closestBound = 0; for (var i = 1; i < bounds.length - 1; i += 1) { if (value >= bounds[i]) { closestBound = i; } } if (Math.abs(bounds[closestBound + 1] - value) < Math.abs(bounds[closestBound] - value)) { closestBound += 1; } return closestBound; } }, { key: "getBoundNeedMoving", value: function getBoundNeedMoving(value, closestBound) { var _this$state = this.state, bounds = _this$state.bounds, recent = _this$state.recent; var boundNeedMoving = closestBound; var isAtTheSamePoint = bounds[closestBound + 1] === bounds[closestBound]; if (isAtTheSamePoint && bounds[recent] === bounds[closestBound]) { boundNeedMoving = recent; } if (isAtTheSamePoint && value !== bounds[closestBound + 1]) { boundNeedMoving = value < bounds[closestBound + 1] ? closestBound : closestBound + 1; } return boundNeedMoving; } }, { key: "getLowerBound", value: function getLowerBound() { return this.state.bounds[0]; } }, { key: "getUpperBound", value: function getUpperBound() { var bounds = this.state.bounds; return bounds[bounds.length - 1]; } /** * Returns an array of possible slider points, taking into account both * `marks` and `step`. The result is cached. */ }, { key: "getPoints", value: function getPoints() { var _this$props3 = this.props, marks = _this$props3.marks, step = _this$props3.step, min = _this$props3.min, max = _this$props3.max; var cache = this.internalPointsCache; if (!cache || cache.marks !== marks || cache.step !== step) { var pointsObject = (0, _objectSpread2.default)({}, marks); if (step !== null) { for (var point = min; point <= max; point += step) { pointsObject[point] = point; } } var points = Object.keys(pointsObject).map(parseFloat); points.sort(function (a, b) { return a - b; }); this.internalPointsCache = { marks: marks, step: step, points: points }; } return this.internalPointsCache.points; } }, { key: "moveTo", value: function moveTo(value, isFromKeyboardEvent) { var _this3 = this; var state = this.state, props = this.props; var nextBounds = (0, _toConsumableArray2.default)(state.bounds); var handle = state.handle === null ? state.recent : state.handle; nextBounds[handle] = value; var nextHandle = handle; if (props.pushable !== false) { this.pushSurroundingHandles(nextBounds, nextHandle); } else if (props.allowCross) { nextBounds.sort(function (a, b) { return a - b; }); nextHandle = nextBounds.indexOf(value); } this.onChange({ recent: nextHandle, handle: nextHandle, bounds: nextBounds }); if (isFromKeyboardEvent) { // known problem: because setState is async, // so trigger focus will invoke handler's onEnd and another handler's onStart too early, // cause onBeforeChange and onAfterChange receive wrong value. // here use setState callback to hack,but not elegant this.props.onAfterChange(nextBounds); this.setState({}, function () { _this3.handlesRefs[nextHandle].focus(); }); this.onEnd(); } } }, { key: "pushSurroundingHandles", value: function pushSurroundingHandles(bounds, handle) { var value = bounds[handle]; var pushable = this.props.pushable; var threshold = Number(pushable); var direction = 0; if (bounds[handle + 1] - value < threshold) { direction = +1; // push to right } if (value - bounds[handle - 1] < threshold) { direction = -1; // push to left } if (direction === 0) { return; } var nextHandle = handle + direction; var diffToNext = direction * (bounds[nextHandle] - value); if (!this.pushHandle(bounds, nextHandle, direction, threshold - diffToNext)) { // revert to original value if pushing is impossible // eslint-disable-next-line no-param-reassign bounds[handle] = bounds[nextHandle] - direction * threshold; } } }, { key: "pushHandle", value: function pushHandle(bounds, handle, direction, amount) { var originalValue = bounds[handle]; var currentValue = bounds[handle]; while (direction * (currentValue - originalValue) < amount) { if (!this.pushHandleOnePoint(bounds, handle, direction)) { // can't push handle enough to create the needed `amount` gap, so we // revert its position to the original value // eslint-disable-next-line no-param-reassign bounds[handle] = originalValue; return false; } currentValue = bounds[handle]; } // the handle was pushed enough to create the needed `amount` gap return true; } }, { key: "pushHandleOnePoint", value: function pushHandleOnePoint(bounds, handle, direction) { var points = this.getPoints(); var pointIndex = points.indexOf(bounds[handle]); var nextPointIndex = pointIndex + direction; if (nextPointIndex >= points.length || nextPointIndex < 0) { // reached the minimum or maximum available point, can't push anymore return false; } var nextHandle = handle + direction; var nextValue = points[nextPointIndex]; var pushable = this.props.pushable; var threshold = Number(pushable); var diffToNext = direction * (bounds[nextHandle] - nextValue); if (!this.pushHandle(bounds, nextHandle, direction, threshold - diffToNext)) { // couldn't push next handle, so we won't push this one either return false; } // push the handle // eslint-disable-next-line no-param-reassign bounds[handle] = nextValue; return true; } }, { key: "trimAlignValue", value: function trimAlignValue(value) { var _this$state2 = this.state, handle = _this$state2.handle, bounds = _this$state2.bounds; return _trimAlignValue({ value: value, handle: handle, bounds: bounds, props: this.props }); } }, { key: "render", value: function render() { var _this4 = this; var _this$state3 = this.state, handle = _this$state3.handle, bounds = _this$state3.bounds; var _this$props4 = this.props, prefixCls = _this$props4.prefixCls, vertical = _this$props4.vertical, included = _this$props4.included, disabled = _this$props4.disabled, min = _this$props4.min, max = _this$props4.max, reverse = _this$props4.reverse, handleGenerator = _this$props4.handle, trackStyle = _this$props4.trackStyle, handleStyle = _this$props4.handleStyle, tabIndex = _this$props4.tabIndex, ariaLabelGroupForHandles = _this$props4.ariaLabelGroupForHandles, ariaLabelledByGroupForHandles = _this$props4.ariaLabelledByGroupForHandles, ariaValueTextFormatterGroupForHandles = _this$props4.ariaValueTextFormatterGroupForHandles; var offsets = bounds.map(function (v) { return _this4.calcOffset(v); }); var handleClassName = "".concat(prefixCls, "-handle"); var handles = bounds.map(function (v, i) { var _classNames; var mergedTabIndex = tabIndex[i] || 0; if (disabled || tabIndex[i] === null) { mergedTabIndex = null; } var dragging = handle === i; return handleGenerator({ className: (0, _classnames.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, handleClassName, true), (0, _defineProperty2.default)(_classNames, "".concat(handleClassName, "-").concat(i + 1), true), (0, _defineProperty2.default)(_classNames, "".concat(handleClassName, "-dragging"), dragging), _classNames)), prefixCls: prefixCls, vertical: vertical, dragging: dragging, offset: offsets[i], value: v, index: i, tabIndex: mergedTabIndex, min: min, max: max, reverse: reverse, disabled: disabled, style: handleStyle[i], ref: function ref(h) { return _this4.saveHandle(i, h); }, ariaLabel: ariaLabelGroupForHandles[i], ariaLabelledBy: ariaLabelledByGroupForHandles[i], ariaValueTextFormatter: ariaValueTextFormatterGroupForHandles[i] }); }); var tracks = bounds.slice(0, -1).map(function (_, index) { var _classNames2; var i = index + 1; var trackClassName = (0, _classnames.default)((_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-track"), true), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-track-").concat(i), true), _classNames2)); return _react.default.createElement(_Track.default, { className: trackClassName, vertical: vertical, reverse: reverse, included: included, offset: offsets[i - 1], length: offsets[i] - offsets[i - 1], style: trackStyle[index], key: i }); }); return { tracks: tracks, handles: handles }; } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, state) { if ('value' in props || 'min' in props || 'max' in props) { var value = props.value || state.bounds; var nextBounds = value.map(function (v, i) { return _trimAlignValue({ value: v, handle: i, bounds: state.bounds, props: props }); }); if (nextBounds.length === state.bounds.length && nextBounds.every(function (v, i) { return v === state.bounds[i]; })) { return null; } return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, state), {}, { bounds: nextBounds }); } return null; } }]); return Range; }(_react.default.Component); /* eslint-enable */ Range.displayName = 'Range'; Range.defaultProps = { count: 1, allowCross: true, pushable: false, tabIndex: [], ariaLabelGroupForHandles: [], ariaLabelledByGroupForHandles: [], ariaValueTextFormatterGroupForHandles: [] }; var _default = (0, _createSlider.default)(Range); exports.default = _default; },{"./common/Track":758,"./common/createSlider":759,"./utils":762,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"react":"react","shallowequal":901}],755:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireDefault(require("react")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _Track = _interopRequireDefault(require("./common/Track")); var _createSlider = _interopRequireDefault(require("./common/createSlider")); var utils = _interopRequireWildcard(require("./utils")); var Slider = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Slider, _React$Component); var _super = (0, _createSuper2.default)(Slider); /* eslint-enable */ function Slider(props) { var _this; (0, _classCallCheck2.default)(this, Slider); _this = _super.call(this, props); _this.onEnd = function (force) { var dragging = _this.state.dragging; _this.removeDocumentEvents(); if (dragging || force) { _this.props.onAfterChange(_this.getValue()); } _this.setState({ dragging: false }); }; var defaultValue = props.defaultValue !== undefined ? props.defaultValue : props.min; var value = props.value !== undefined ? props.value : defaultValue; _this.state = { value: _this.trimAlignValue(value), dragging: false }; (0, _warning.default)(!('minimumTrackStyle' in props), 'minimumTrackStyle will be deprecated, please use trackStyle instead.'); (0, _warning.default)(!('maximumTrackStyle' in props), 'maximumTrackStyle will be deprecated, please use railStyle instead.'); return _this; } /** * [Legacy] Used for inherit other component. * It's a bad code style which should be refactor. */ /* eslint-disable @typescript-eslint/no-unused-vars, class-methods-use-this */ (0, _createClass2.default)(Slider, [{ key: "calcValueByPos", value: function calcValueByPos(value) { return 0; } }, { key: "calcOffset", value: function calcOffset(value) { return 0; } }, { key: "saveHandle", value: function saveHandle(index, h) {} }, { key: "removeDocumentEvents", value: function removeDocumentEvents() {} }, { key: "componentDidUpdate", value: function componentDidUpdate(_, prevState) { if (!('value' in this.props || 'min' in this.props || 'max' in this.props)) { return; } var _this$props = this.props, value = _this$props.value, onChange = _this$props.onChange; var theValue = value !== undefined ? value : prevState.value; var nextValue = this.trimAlignValue(theValue, this.props); if (nextValue !== prevState.value) { // eslint-disable-next-line this.setState({ value: nextValue }); if (utils.isValueOutOfRange(theValue, this.props)) { onChange(nextValue); } } } }, { key: "onChange", value: function onChange(state) { var props = this.props; var isNotControlled = !('value' in props); var nextState = state.value > this.props.max ? (0, _objectSpread2.default)((0, _objectSpread2.default)({}, state), {}, { value: this.props.max }) : state; if (isNotControlled) { this.setState(nextState); } var changedValue = nextState.value; props.onChange(changedValue); } }, { key: "onStart", value: function onStart(position) { this.setState({ dragging: true }); var props = this.props; var prevValue = this.getValue(); props.onBeforeChange(prevValue); var value = this.calcValueByPos(position); this.startValue = value; this.startPosition = position; if (value === prevValue) return; this.prevMovedHandleIndex = 0; this.onChange({ value: value }); } }, { key: "onMove", value: function onMove(e, position) { utils.pauseEvent(e); var oldValue = this.state.value; var value = this.calcValueByPos(position); if (value === oldValue) return; this.onChange({ value: value }); } }, { key: "onKeyboard", value: function onKeyboard(e) { var _this$props2 = this.props, reverse = _this$props2.reverse, vertical = _this$props2.vertical; var valueMutator = utils.getKeyboardValueMutator(e, vertical, reverse); if (valueMutator) { utils.pauseEvent(e); var state = this.state; var oldValue = state.value; var mutatedValue = valueMutator(oldValue, this.props); var value = this.trimAlignValue(mutatedValue); if (value === oldValue) return; this.onChange({ value: value }); this.props.onAfterChange(value); this.onEnd(); } } }, { key: "getValue", value: function getValue() { return this.state.value; } }, { key: "getLowerBound", value: function getLowerBound() { return this.props.min; } }, { key: "getUpperBound", value: function getUpperBound() { return this.state.value; } }, { key: "trimAlignValue", value: function trimAlignValue(v) { var nextProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (v === null) { return null; } var mergedProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, this.props), nextProps); var val = utils.ensureValueInRange(v, mergedProps); return utils.ensureValuePrecision(val, mergedProps); } }, { key: "render", value: function render() { var _this2 = this; var _this$props3 = this.props, prefixCls = _this$props3.prefixCls, vertical = _this$props3.vertical, included = _this$props3.included, disabled = _this$props3.disabled, minimumTrackStyle = _this$props3.minimumTrackStyle, trackStyle = _this$props3.trackStyle, handleStyle = _this$props3.handleStyle, tabIndex = _this$props3.tabIndex, ariaLabelForHandle = _this$props3.ariaLabelForHandle, ariaLabelledByForHandle = _this$props3.ariaLabelledByForHandle, ariaValueTextFormatterForHandle = _this$props3.ariaValueTextFormatterForHandle, min = _this$props3.min, max = _this$props3.max, startPoint = _this$props3.startPoint, reverse = _this$props3.reverse, handleGenerator = _this$props3.handle; var _this$state = this.state, value = _this$state.value, dragging = _this$state.dragging; var offset = this.calcOffset(value); var handle = handleGenerator({ className: "".concat(prefixCls, "-handle"), prefixCls: prefixCls, vertical: vertical, offset: offset, value: value, dragging: dragging, disabled: disabled, min: min, max: max, reverse: reverse, index: 0, tabIndex: tabIndex, ariaLabel: ariaLabelForHandle, ariaLabelledBy: ariaLabelledByForHandle, ariaValueTextFormatter: ariaValueTextFormatterForHandle, style: handleStyle[0] || handleStyle, ref: function ref(h) { return _this2.saveHandle(0, h); } }); var trackOffset = startPoint !== undefined ? this.calcOffset(startPoint) : 0; var mergedTrackStyle = trackStyle[0] || trackStyle; var track = _react.default.createElement(_Track.default, { className: "".concat(prefixCls, "-track"), vertical: vertical, included: included, offset: trackOffset, reverse: reverse, length: offset - trackOffset, style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, minimumTrackStyle), mergedTrackStyle) }); return { tracks: track, handles: handle }; } }]); return Slider; }(_react.default.Component); var _default = (0, _createSlider.default)(Slider); exports.default = _default; },{"./common/Track":758,"./common/createSlider":759,"./utils":762,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"rc-util/lib/warning":879,"react":"react"}],756:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var Marks = function Marks(_ref) { var className = _ref.className, vertical = _ref.vertical, reverse = _ref.reverse, marks = _ref.marks, included = _ref.included, upperBound = _ref.upperBound, lowerBound = _ref.lowerBound, max = _ref.max, min = _ref.min, onClickLabel = _ref.onClickLabel; var marksKeys = Object.keys(marks); var range = max - min; var elements = marksKeys.map(parseFloat).sort(function (a, b) { return a - b; }).map(function (point) { var _classNames; var markPoint = marks[point]; var markPointIsObject = (0, _typeof2.default)(markPoint) === 'object' && !_react.default.isValidElement(markPoint); var markLabel = markPointIsObject ? markPoint.label : markPoint; if (!markLabel && markLabel !== 0) { return null; } var isActive = !included && point === upperBound || included && point <= upperBound && point >= lowerBound; var markClassName = (0, _classnames.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(className, "-text"), true), (0, _defineProperty2.default)(_classNames, "".concat(className, "-text-active"), isActive), _classNames)); var bottomStyle = (0, _defineProperty2.default)({ marginBottom: '-50%' }, reverse ? 'top' : 'bottom', "".concat((point - min) / range * 100, "%")); var leftStyle = (0, _defineProperty2.default)({ transform: "translateX(".concat(reverse ? "50%" : "-50%", ")"), msTransform: "translateX(".concat(reverse ? "50%" : "-50%", ")") }, reverse ? 'right' : 'left', "".concat((point - min) / range * 100, "%")); var style = vertical ? bottomStyle : leftStyle; var markStyle = markPointIsObject ? (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), markPoint.style) : style; return _react.default.createElement("span", { className: markClassName, style: markStyle, key: point, onMouseDown: function onMouseDown(e) { return onClickLabel(e, point); }, onTouchStart: function onTouchStart(e) { return onClickLabel(e, point); } }, markLabel); }); return _react.default.createElement("div", { className: className }, elements); }; var _default = Marks; exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/typeof":208,"classnames":455,"react":"react"}],757:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var calcPoints = function calcPoints(vertical, marks, dots, step, min, max) { (0, _warning.default)(dots ? step > 0 : true, '`Slider[step]` should be a positive number in order to make Slider[dots] work.'); var points = Object.keys(marks).map(parseFloat).sort(function (a, b) { return a - b; }); if (dots && step) { for (var i = min; i <= max; i += step) { if (points.indexOf(i) === -1) { points.push(i); } } } return points; }; var Steps = function Steps(_ref) { var prefixCls = _ref.prefixCls, vertical = _ref.vertical, reverse = _ref.reverse, marks = _ref.marks, dots = _ref.dots, step = _ref.step, included = _ref.included, lowerBound = _ref.lowerBound, upperBound = _ref.upperBound, max = _ref.max, min = _ref.min, dotStyle = _ref.dotStyle, activeDotStyle = _ref.activeDotStyle; var range = max - min; var elements = calcPoints(vertical, marks, dots, step, min, max).map(function (point) { var _classNames; var offset = "".concat(Math.abs(point - min) / range * 100, "%"); var isActived = !included && point === upperBound || included && point <= upperBound && point >= lowerBound; var style = vertical ? (0, _objectSpread4.default)((0, _objectSpread4.default)({}, dotStyle), {}, (0, _defineProperty2.default)({}, reverse ? 'top' : 'bottom', offset)) : (0, _objectSpread4.default)((0, _objectSpread4.default)({}, dotStyle), {}, (0, _defineProperty2.default)({}, reverse ? 'right' : 'left', offset)); if (isActived) { style = (0, _objectSpread4.default)((0, _objectSpread4.default)({}, style), activeDotStyle); } var pointClassName = (0, _classnames.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-dot"), true), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-dot-active"), isActived), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-dot-reverse"), reverse), _classNames)); return _react.default.createElement("span", { className: pointClassName, style: style, key: point }); }); return _react.default.createElement("div", { className: "".concat(prefixCls, "-step") }, elements); }; var _default = Steps; exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"rc-util/lib/warning":879,"react":"react"}],758:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var Track = function Track(props) { var _ref, _ref2; var className = props.className, included = props.included, vertical = props.vertical, style = props.style; var length = props.length, offset = props.offset, reverse = props.reverse; if (length < 0) { reverse = !reverse; length = Math.abs(length); offset = 100 - offset; } var positonStyle = vertical ? (_ref = {}, (0, _defineProperty2.default)(_ref, reverse ? 'top' : 'bottom', "".concat(offset, "%")), (0, _defineProperty2.default)(_ref, reverse ? 'bottom' : 'top', 'auto'), (0, _defineProperty2.default)(_ref, "height", "".concat(length, "%")), _ref) : (_ref2 = {}, (0, _defineProperty2.default)(_ref2, reverse ? 'right' : 'left', "".concat(offset, "%")), (0, _defineProperty2.default)(_ref2, reverse ? 'left' : 'right', 'auto'), (0, _defineProperty2.default)(_ref2, "width", "".concat(length, "%")), _ref2); var elStyle = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), positonStyle); return included ? _react.default.createElement("div", { className: className, style: elStyle }) : null; }; var _default = Track; exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"react":"react"}],759:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = createSlider; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireDefault(require("react")); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var _classnames = _interopRequireDefault(require("classnames")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _Steps = _interopRequireDefault(require("./Steps")); var _Marks = _interopRequireDefault(require("./Marks")); var _Handle = _interopRequireDefault(require("../Handle")); var utils = _interopRequireWildcard(require("../utils")); /* eslint-disable @typescript-eslint/no-explicit-any */ function noop() {} function createSlider(Component) { var _a; return _a = /*#__PURE__*/function (_Component) { (0, _inherits2.default)(ComponentEnhancer, _Component); var _super = (0, _createSuper2.default)(ComponentEnhancer); function ComponentEnhancer(props) { var _this; (0, _classCallCheck2.default)(this, ComponentEnhancer); _this = _super.call(this, props); _this.onMouseDown = function (e) { if (e.button !== 0) { return; } var isVertical = _this.props.vertical; var position = utils.getMousePosition(isVertical, e); if (!utils.isEventFromHandle(e, _this.handlesRefs)) { _this.dragOffset = 0; } else { var handlePosition = utils.getHandleCenterPosition(isVertical, e.target); _this.dragOffset = position - handlePosition; position = handlePosition; } _this.removeDocumentEvents(); _this.onStart(position); _this.addDocumentMouseEvents(); }; _this.onTouchStart = function (e) { if (utils.isNotTouchEvent(e)) return; var isVertical = _this.props.vertical; var position = utils.getTouchPosition(isVertical, e); if (!utils.isEventFromHandle(e, _this.handlesRefs)) { _this.dragOffset = 0; } else { var handlePosition = utils.getHandleCenterPosition(isVertical, e.target); _this.dragOffset = position - handlePosition; position = handlePosition; } _this.onStart(position); _this.addDocumentTouchEvents(); utils.pauseEvent(e); }; _this.onFocus = function (e) { var _this$props = _this.props, onFocus = _this$props.onFocus, vertical = _this$props.vertical; if (utils.isEventFromHandle(e, _this.handlesRefs)) { var handlePosition = utils.getHandleCenterPosition(vertical, e.target); _this.dragOffset = 0; _this.onStart(handlePosition); utils.pauseEvent(e); if (onFocus) { onFocus(e); } } }; _this.onBlur = function (e) { var onBlur = _this.props.onBlur; _this.onEnd(); if (onBlur) { onBlur(e); } }; _this.onMouseUp = function () { if (_this.handlesRefs[_this.prevMovedHandleIndex]) { _this.handlesRefs[_this.prevMovedHandleIndex].clickFocus(); } }; _this.onMouseMove = function (e) { if (!_this.sliderRef) { _this.onEnd(); return; } var position = utils.getMousePosition(_this.props.vertical, e); _this.onMove(e, position - _this.dragOffset); }; _this.onTouchMove = function (e) { if (utils.isNotTouchEvent(e) || !_this.sliderRef) { _this.onEnd(); return; } var position = utils.getTouchPosition(_this.props.vertical, e); _this.onMove(e, position - _this.dragOffset); }; _this.onKeyDown = function (e) { if (_this.sliderRef && utils.isEventFromHandle(e, _this.handlesRefs)) { _this.onKeyboard(e); } }; _this.onClickMarkLabel = function (e, value) { e.stopPropagation(); _this.onChange({ value: value }); // eslint-disable-next-line react/no-unused-state _this.setState({ value: value }, function () { return _this.onEnd(true); }); }; _this.saveSlider = function (slider) { _this.sliderRef = slider; }; var step = props.step, max = props.max, min = props.min; var isPointDiffEven = isFinite(max - min) ? (max - min) % step === 0 : true; // eslint-disable-line (0, _warning.default)(step && Math.floor(step) === step ? isPointDiffEven : true, "Slider[max] - Slider[min] (".concat(max - min, ") should be a multiple of Slider[step] (").concat(step, ")")); _this.handlesRefs = {}; return _this; } (0, _createClass2.default)(ComponentEnhancer, [{ key: "componentDidMount", value: function componentDidMount() { // Snapshot testing cannot handle refs, so be sure to null-check this. this.document = this.sliderRef && this.sliderRef.ownerDocument; var _this$props2 = this.props, autoFocus = _this$props2.autoFocus, disabled = _this$props2.disabled; if (autoFocus && !disabled) { this.focus(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if ((0, _get2.default)((0, _getPrototypeOf2.default)(ComponentEnhancer.prototype), "componentWillUnmount", this)) (0, _get2.default)((0, _getPrototypeOf2.default)(ComponentEnhancer.prototype), "componentWillUnmount", this).call(this); this.removeDocumentEvents(); } }, { key: "getSliderStart", value: function getSliderStart() { var slider = this.sliderRef; var _this$props3 = this.props, vertical = _this$props3.vertical, reverse = _this$props3.reverse; var rect = slider.getBoundingClientRect(); if (vertical) { return reverse ? rect.bottom : rect.top; } return window.pageXOffset + (reverse ? rect.right : rect.left); } }, { key: "getSliderLength", value: function getSliderLength() { var slider = this.sliderRef; if (!slider) { return 0; } var coords = slider.getBoundingClientRect(); return this.props.vertical ? coords.height : coords.width; } }, { key: "addDocumentTouchEvents", value: function addDocumentTouchEvents() { // just work for Chrome iOS Safari and Android Browser this.onTouchMoveListener = (0, _addEventListener.default)(this.document, 'touchmove', this.onTouchMove); this.onTouchUpListener = (0, _addEventListener.default)(this.document, 'touchend', this.onEnd); } }, { key: "addDocumentMouseEvents", value: function addDocumentMouseEvents() { this.onMouseMoveListener = (0, _addEventListener.default)(this.document, 'mousemove', this.onMouseMove); this.onMouseUpListener = (0, _addEventListener.default)(this.document, 'mouseup', this.onEnd); } }, { key: "removeDocumentEvents", value: function removeDocumentEvents() { /* eslint-disable @typescript-eslint/no-unused-expressions */ this.onTouchMoveListener && this.onTouchMoveListener.remove(); this.onTouchUpListener && this.onTouchUpListener.remove(); this.onMouseMoveListener && this.onMouseMoveListener.remove(); this.onMouseUpListener && this.onMouseUpListener.remove(); /* eslint-enable no-unused-expressions */ } }, { key: "focus", value: function focus() { if (!this.props.disabled) { this.handlesRefs[0].focus(); } } }, { key: "blur", value: function blur() { var _this2 = this; if (!this.props.disabled) { Object.keys(this.handlesRefs).forEach(function (key) { if (_this2.handlesRefs[key] && _this2.handlesRefs[key].blur) { _this2.handlesRefs[key].blur(); } }); } } }, { key: "calcValue", value: function calcValue(offset) { var _this$props4 = this.props, vertical = _this$props4.vertical, min = _this$props4.min, max = _this$props4.max; var ratio = Math.abs(Math.max(offset, 0) / this.getSliderLength()); var value = vertical ? (1 - ratio) * (max - min) + min : ratio * (max - min) + min; return value; } }, { key: "calcValueByPos", value: function calcValueByPos(position) { var sign = this.props.reverse ? -1 : +1; var pixelOffset = sign * (position - this.getSliderStart()); var nextValue = this.trimAlignValue(this.calcValue(pixelOffset)); return nextValue; } }, { key: "calcOffset", value: function calcOffset(value) { var _this$props5 = this.props, min = _this$props5.min, max = _this$props5.max; var ratio = (value - min) / (max - min); return Math.max(0, ratio * 100); } }, { key: "saveHandle", value: function saveHandle(index, handle) { this.handlesRefs[index] = handle; } }, { key: "render", value: function render() { var _classNames; var _this$props6 = this.props, prefixCls = _this$props6.prefixCls, className = _this$props6.className, marks = _this$props6.marks, dots = _this$props6.dots, step = _this$props6.step, included = _this$props6.included, disabled = _this$props6.disabled, vertical = _this$props6.vertical, reverse = _this$props6.reverse, min = _this$props6.min, max = _this$props6.max, children = _this$props6.children, maximumTrackStyle = _this$props6.maximumTrackStyle, style = _this$props6.style, railStyle = _this$props6.railStyle, dotStyle = _this$props6.dotStyle, activeDotStyle = _this$props6.activeDotStyle; var _get$call = (0, _get2.default)((0, _getPrototypeOf2.default)(ComponentEnhancer.prototype), "render", this).call(this), tracks = _get$call.tracks, handles = _get$call.handles; var sliderClassName = (0, _classnames.default)(prefixCls, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-with-marks"), Object.keys(marks).length), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-vertical"), vertical), (0, _defineProperty2.default)(_classNames, className, className), _classNames)); return _react.default.createElement("div", { ref: this.saveSlider, className: sliderClassName, onTouchStart: disabled ? noop : this.onTouchStart, onMouseDown: disabled ? noop : this.onMouseDown, onMouseUp: disabled ? noop : this.onMouseUp, onKeyDown: disabled ? noop : this.onKeyDown, onFocus: disabled ? noop : this.onFocus, onBlur: disabled ? noop : this.onBlur, style: style }, _react.default.createElement("div", { className: "".concat(prefixCls, "-rail"), style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, maximumTrackStyle), railStyle) }), tracks, _react.default.createElement(_Steps.default, { prefixCls: prefixCls, vertical: vertical, reverse: reverse, marks: marks, dots: dots, step: step, included: included, lowerBound: this.getLowerBound(), upperBound: this.getUpperBound(), max: max, min: min, dotStyle: dotStyle, activeDotStyle: activeDotStyle }), handles, _react.default.createElement(_Marks.default, { className: "".concat(prefixCls, "-mark"), onClickLabel: disabled ? noop : this.onClickMarkLabel, vertical: vertical, marks: marks, included: included, lowerBound: this.getLowerBound(), upperBound: this.getUpperBound(), max: max, min: min, reverse: reverse }), children); } }]); return ComponentEnhancer; }(Component), _a.displayName = "ComponentEnhancer(".concat(Component.displayName, ")"), _a.defaultProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, Component.defaultProps), {}, { prefixCls: 'rc-slider', className: '', min: 0, max: 100, step: 1, marks: {}, handle: function handle(props) { var index = props.index, restProps = (0, _objectWithoutProperties2.default)(props, ["index"]); delete restProps.dragging; if (restProps.value === null) { return null; } return _react.default.createElement(_Handle.default, Object.assign({}, restProps, { key: index })); }, onBeforeChange: noop, onChange: noop, onAfterChange: noop, included: true, disabled: false, dots: false, vertical: false, reverse: false, trackStyle: [{}], handleStyle: [{}], railStyle: {}, dotStyle: {}, activeDotStyle: {} }), _a; } },{"../Handle":753,"../utils":762,"./Marks":756,"./Steps":757,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/get":189,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"classnames":455,"rc-util/lib/Dom/addEventListener":859,"rc-util/lib/warning":879,"react":"react"}],760:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = createSliderWithTooltip; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireDefault(require("react")); var _rcTooltip = _interopRequireDefault(require("rc-tooltip")); var _Handle = _interopRequireDefault(require("./Handle")); function createSliderWithTooltip(Component) { var _a; return _a = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(ComponentWrapper, _React$Component); var _super = (0, _createSuper2.default)(ComponentWrapper); function ComponentWrapper() { var _this; (0, _classCallCheck2.default)(this, ComponentWrapper); _this = _super.apply(this, arguments); _this.state = { visibles: {} }; _this.handleTooltipVisibleChange = function (index, visible) { _this.setState(function (prevState) { return { visibles: (0, _objectSpread3.default)((0, _objectSpread3.default)({}, prevState.visibles), {}, (0, _defineProperty2.default)({}, index, visible)) }; }); }; _this.handleWithTooltip = function (_ref) { var value = _ref.value, dragging = _ref.dragging, index = _ref.index, disabled = _ref.disabled, restProps = (0, _objectWithoutProperties2.default)(_ref, ["value", "dragging", "index", "disabled"]); var _this$props = _this.props, tipFormatter = _this$props.tipFormatter, tipProps = _this$props.tipProps, handleStyle = _this$props.handleStyle, getTooltipContainer = _this$props.getTooltipContainer; var _tipProps$prefixCls = tipProps.prefixCls, prefixCls = _tipProps$prefixCls === void 0 ? 'rc-slider-tooltip' : _tipProps$prefixCls, _tipProps$overlay = tipProps.overlay, overlay = _tipProps$overlay === void 0 ? tipFormatter(value) : _tipProps$overlay, _tipProps$placement = tipProps.placement, placement = _tipProps$placement === void 0 ? 'top' : _tipProps$placement, _tipProps$visible = tipProps.visible, visible = _tipProps$visible === void 0 ? false : _tipProps$visible, restTooltipProps = (0, _objectWithoutProperties2.default)(tipProps, ["prefixCls", "overlay", "placement", "visible"]); var handleStyleWithIndex; if (Array.isArray(handleStyle)) { handleStyleWithIndex = handleStyle[index] || handleStyle[0]; } else { handleStyleWithIndex = handleStyle; } return _react.default.createElement(_rcTooltip.default, Object.assign({}, restTooltipProps, { getTooltipContainer: getTooltipContainer, prefixCls: prefixCls, overlay: overlay, placement: placement, visible: !disabled && (_this.state.visibles[index] || dragging) || visible, key: index }), _react.default.createElement(_Handle.default, Object.assign({}, restProps, { style: (0, _objectSpread3.default)({}, handleStyleWithIndex), value: value, onMouseEnter: function onMouseEnter() { return _this.handleTooltipVisibleChange(index, true); }, onMouseLeave: function onMouseLeave() { return _this.handleTooltipVisibleChange(index, false); } }))); }; return _this; } (0, _createClass2.default)(ComponentWrapper, [{ key: "render", value: function render() { return _react.default.createElement(Component, Object.assign({}, this.props, { handle: this.handleWithTooltip })); } }]); return ComponentWrapper; }(_react.default.Component), _a.defaultProps = { tipFormatter: function tipFormatter(value) { return value; }, handleStyle: [{}], tipProps: {}, getTooltipContainer: function getTooltipContainer(node) { return node.parentNode; } }, _a; } },{"./Handle":753,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"rc-tooltip":816,"react":"react"}],761:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Range", { enumerable: true, get: function get() { return _Range.default; } }); Object.defineProperty(exports, "Handle", { enumerable: true, get: function get() { return _Handle.default; } }); Object.defineProperty(exports, "createSliderWithTooltip", { enumerable: true, get: function get() { return _createSliderWithTooltip.default; } }); exports.default = void 0; var _Slider = _interopRequireDefault(require("./Slider")); var _Range = _interopRequireDefault(require("./Range")); var _Handle = _interopRequireDefault(require("./Handle")); var _createSliderWithTooltip = _interopRequireDefault(require("./createSliderWithTooltip")); var InternalSlider = _Slider.default; InternalSlider.Range = _Range.default; InternalSlider.Handle = _Handle.default; InternalSlider.createSliderWithTooltip = _createSliderWithTooltip.default; var _default = InternalSlider; exports.default = _default; },{"./Handle":753,"./Range":754,"./Slider":755,"./createSliderWithTooltip":760,"@babel/runtime/helpers/interopRequireDefault":192}],762:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.isEventFromHandle = isEventFromHandle; exports.isValueOutOfRange = isValueOutOfRange; exports.isNotTouchEvent = isNotTouchEvent; exports.getClosestPoint = getClosestPoint; exports.getPrecision = getPrecision; exports.getMousePosition = getMousePosition; exports.getTouchPosition = getTouchPosition; exports.getHandleCenterPosition = getHandleCenterPosition; exports.ensureValueInRange = ensureValueInRange; exports.ensureValuePrecision = ensureValuePrecision; exports.pauseEvent = pauseEvent; exports.calculateNextValue = calculateNextValue; exports.getKeyboardValueMutator = getKeyboardValueMutator; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _reactDom = require("react-dom"); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); function isEventFromHandle(e, handles) { try { return Object.keys(handles).some(function (key) { return e.target === (0, _reactDom.findDOMNode)(handles[key]); }); } catch (error) { return false; } } function isValueOutOfRange(value, _ref) { var min = _ref.min, max = _ref.max; return value < min || value > max; } function isNotTouchEvent(e) { return e.touches.length > 1 || e.type.toLowerCase() === 'touchend' && e.touches.length > 0; } function getClosestPoint(val, _ref2) { var marks = _ref2.marks, step = _ref2.step, min = _ref2.min, max = _ref2.max; var points = Object.keys(marks).map(parseFloat); if (step !== null) { var maxSteps = Math.floor((max - min) / step); var steps = Math.min((val - min) / step, maxSteps); var closestStep = Math.round(steps) * step + min; points.push(closestStep); } var diffs = points.map(function (point) { return Math.abs(val - point); }); return points[diffs.indexOf(Math.min.apply(Math, (0, _toConsumableArray2.default)(diffs)))]; } function getPrecision(step) { var stepString = step.toString(); var precision = 0; if (stepString.indexOf('.') >= 0) { precision = stepString.length - stepString.indexOf('.') - 1; } return precision; } function getMousePosition(vertical, e) { return vertical ? e.clientY : e.pageX; } function getTouchPosition(vertical, e) { return vertical ? e.touches[0].clientY : e.touches[0].pageX; } function getHandleCenterPosition(vertical, handle) { var coords = handle.getBoundingClientRect(); return vertical ? coords.top + coords.height * 0.5 : window.pageXOffset + coords.left + coords.width * 0.5; } function ensureValueInRange(val, _ref3) { var max = _ref3.max, min = _ref3.min; if (val <= min) { return min; } if (val >= max) { return max; } return val; } function ensureValuePrecision(val, props) { var step = props.step; var closestPoint = isFinite(getClosestPoint(val, props)) ? getClosestPoint(val, props) : 0; // eslint-disable-line return step === null ? closestPoint : parseFloat(closestPoint.toFixed(getPrecision(step))); } function pauseEvent(e) { e.stopPropagation(); e.preventDefault(); } function calculateNextValue(func, value, props) { var operations = { increase: function increase(a, b) { return a + b; }, decrease: function decrease(a, b) { return a - b; } }; var indexToGet = operations[func](Object.keys(props.marks).indexOf(JSON.stringify(value)), 1); var keyToGet = Object.keys(props.marks)[indexToGet]; if (props.step) { return operations[func](value, props.step); } if (!!Object.keys(props.marks).length && !!props.marks[keyToGet]) { return props.marks[keyToGet]; } return value; } function getKeyboardValueMutator(e, vertical, reverse) { var increase = 'increase'; var decrease = 'decrease'; var method = increase; switch (e.keyCode) { case _KeyCode.default.UP: method = vertical && reverse ? decrease : increase; break; case _KeyCode.default.RIGHT: method = !vertical && reverse ? decrease : increase; break; case _KeyCode.default.DOWN: method = vertical && reverse ? increase : decrease; break; case _KeyCode.default.LEFT: method = !vertical && reverse ? increase : decrease; break; case _KeyCode.default.END: return function (value, props) { return props.max; }; case _KeyCode.default.HOME: return function (value, props) { return props.min; }; case _KeyCode.default.PAGE_UP: return function (value, props) { return value + props.step * 2; }; case _KeyCode.default.PAGE_DOWN: return function (value, props) { return value - props.step * 2; }; default: return undefined; } return function (value, props) { return calculateNextValue(method, value, props); }; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/toConsumableArray":207,"rc-util/lib/KeyCode":865,"react-dom":"react-dom"}],763:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function isString(str) { return typeof str === 'string'; } var Step = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Step, _React$Component); var _super = _createSuper(Step); function Step() { var _this; (0, _classCallCheck2.default)(this, Step); _this = _super.apply(this, arguments); _this.onClick = function () { var _this$props = _this.props, onClick = _this$props.onClick, onStepClick = _this$props.onStepClick, stepIndex = _this$props.stepIndex; if (onClick) { onClick.apply(void 0, arguments); } onStepClick(stepIndex); }; return _this; } (0, _createClass2.default)(Step, [{ key: "renderIconNode", value: function renderIconNode() { var _classNames; var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, progressDot = _this$props2.progressDot, stepIcon = _this$props2.stepIcon, stepNumber = _this$props2.stepNumber, status = _this$props2.status, title = _this$props2.title, description = _this$props2.description, icon = _this$props2.icon, iconPrefix = _this$props2.iconPrefix, icons = _this$props2.icons; var iconNode; var iconClassName = (0, _classnames.default)("".concat(prefixCls, "-icon"), "".concat(iconPrefix, "icon"), (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(iconPrefix, "icon-").concat(icon), icon && isString(icon)), (0, _defineProperty2.default)(_classNames, "".concat(iconPrefix, "icon-check"), !icon && status === 'finish' && (icons && !icons.finish || !icons)), (0, _defineProperty2.default)(_classNames, "".concat(iconPrefix, "icon-cross"), !icon && status === 'error' && (icons && !icons.error || !icons)), _classNames)); var iconDot = _react.default.createElement("span", { className: "".concat(prefixCls, "-icon-dot") }); // `progressDot` enjoy the highest priority if (progressDot) { if (typeof progressDot === 'function') { iconNode = _react.default.createElement("span", { className: "".concat(prefixCls, "-icon") }, progressDot(iconDot, { index: stepNumber - 1, status: status, title: title, description: description })); } else { iconNode = _react.default.createElement("span", { className: "".concat(prefixCls, "-icon") }, iconDot); } } else if (icon && !isString(icon)) { iconNode = _react.default.createElement("span", { className: "".concat(prefixCls, "-icon") }, icon); } else if (icons && icons.finish && status === 'finish') { iconNode = _react.default.createElement("span", { className: "".concat(prefixCls, "-icon") }, icons.finish); } else if (icons && icons.error && status === 'error') { iconNode = _react.default.createElement("span", { className: "".concat(prefixCls, "-icon") }, icons.error); } else if (icon || status === 'finish' || status === 'error') { iconNode = _react.default.createElement("span", { className: iconClassName }); } else { iconNode = _react.default.createElement("span", { className: "".concat(prefixCls, "-icon") }, stepNumber); } if (stepIcon) { iconNode = stepIcon({ index: stepNumber - 1, status: status, title: title, description: description, node: iconNode }); } return iconNode; } }, { key: "render", value: function render() { var _classNames2; var _this$props3 = this.props, className = _this$props3.className, prefixCls = _this$props3.prefixCls, style = _this$props3.style, active = _this$props3.active, _this$props3$status = _this$props3.status, status = _this$props3$status === void 0 ? 'wait' : _this$props3$status, iconPrefix = _this$props3.iconPrefix, icon = _this$props3.icon, wrapperStyle = _this$props3.wrapperStyle, stepNumber = _this$props3.stepNumber, disabled = _this$props3.disabled, description = _this$props3.description, title = _this$props3.title, subTitle = _this$props3.subTitle, progressDot = _this$props3.progressDot, stepIcon = _this$props3.stepIcon, tailContent = _this$props3.tailContent, icons = _this$props3.icons, stepIndex = _this$props3.stepIndex, onStepClick = _this$props3.onStepClick, onClick = _this$props3.onClick, restProps = (0, _objectWithoutProperties2.default)(_this$props3, ["className", "prefixCls", "style", "active", "status", "iconPrefix", "icon", "wrapperStyle", "stepNumber", "disabled", "description", "title", "subTitle", "progressDot", "stepIcon", "tailContent", "icons", "stepIndex", "onStepClick", "onClick"]); var classString = (0, _classnames.default)("".concat(prefixCls, "-item"), "".concat(prefixCls, "-item-").concat(status), className, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-item-custom"), icon), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-item-active"), active), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-item-disabled"), disabled === true), _classNames2)); var stepItemStyle = _objectSpread({}, style); var accessibilityProps = {}; if (onStepClick && !disabled) { accessibilityProps.role = 'button'; accessibilityProps.tabIndex = 0; accessibilityProps.onClick = this.onClick; } return _react.default.createElement("div", Object.assign({}, restProps, { className: classString, style: stepItemStyle }), _react.default.createElement("div", Object.assign({ onClick: onClick }, accessibilityProps, { className: "".concat(prefixCls, "-item-container") }), _react.default.createElement("div", { className: "".concat(prefixCls, "-item-tail") }, tailContent), _react.default.createElement("div", { className: "".concat(prefixCls, "-item-icon") }, this.renderIconNode()), _react.default.createElement("div", { className: "".concat(prefixCls, "-item-content") }, _react.default.createElement("div", { className: "".concat(prefixCls, "-item-title") }, title, subTitle && _react.default.createElement("div", { title: typeof subTitle === 'string' ? subTitle : undefined, className: "".concat(prefixCls, "-item-subtitle") }, subTitle)), description && _react.default.createElement("div", { className: "".concat(prefixCls, "-item-description") }, description)))); } }]); return Step; }(_react.default.Component); exports.default = Step; },{"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/possibleConstructorReturn":202,"classnames":455,"react":"react"}],764:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireWildcard(require("react")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _classnames = _interopRequireDefault(require("classnames")); var _Step = _interopRequireDefault(require("./Step")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var Steps = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Steps, _React$Component); var _super = _createSuper(Steps); function Steps() { var _this; (0, _classCallCheck2.default)(this, Steps); _this = _super.apply(this, arguments); _this.onStepClick = function (next) { var _this$props = _this.props, onChange = _this$props.onChange, current = _this$props.current; if (onChange && current !== next) { onChange(next); } }; return _this; } (0, _createClass2.default)(Steps, [{ key: "render", value: function render() { var _classNames, _this2 = this; var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, _this$props2$style = _this$props2.style, style = _this$props2$style === void 0 ? {} : _this$props2$style, className = _this$props2.className, children = _this$props2.children, direction = _this$props2.direction, type = _this$props2.type, labelPlacement = _this$props2.labelPlacement, iconPrefix = _this$props2.iconPrefix, status = _this$props2.status, size = _this$props2.size, current = _this$props2.current, progressDot = _this$props2.progressDot, stepIcon = _this$props2.stepIcon, initial = _this$props2.initial, icons = _this$props2.icons, onChange = _this$props2.onChange, restProps = (0, _objectWithoutProperties2.default)(_this$props2, ["prefixCls", "style", "className", "children", "direction", "type", "labelPlacement", "iconPrefix", "status", "size", "current", "progressDot", "stepIcon", "initial", "icons", "onChange"]); var isNav = type === 'navigation'; var adjustedLabelPlacement = progressDot ? 'vertical' : labelPlacement; var classString = (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-").concat(direction), className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-").concat(size), size), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-label-").concat(adjustedLabelPlacement), direction === 'horizontal'), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-dot"), !!progressDot), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-navigation"), isNav), _classNames)); return _react.default.createElement("div", Object.assign({ className: classString, style: style }, restProps), (0, _toArray.default)(children).map(function (child, index) { var stepNumber = initial + index; var childProps = _objectSpread({ stepNumber: "".concat(stepNumber + 1), stepIndex: stepNumber, key: stepNumber, prefixCls: prefixCls, iconPrefix: iconPrefix, wrapperStyle: style, progressDot: progressDot, stepIcon: stepIcon, icons: icons, onStepClick: onChange && _this2.onStepClick }, child.props); // fix tail color if (status === 'error' && index === current - 1) { childProps.className = "".concat(prefixCls, "-next-error"); } if (!child.props.status) { if (stepNumber === current) { childProps.status = status; } else if (stepNumber < current) { childProps.status = 'finish'; } else { childProps.status = 'wait'; } } childProps.active = stepNumber === current; return (0, _react.cloneElement)(child, childProps); })); } }]); return Steps; }(_react.default.Component); exports.default = Steps; Steps.Step = _Step.default; Steps.defaultProps = { type: 'default', prefixCls: 'rc-steps', iconPrefix: 'rc', direction: 'horizontal', labelPlacement: 'horizontal', initial: 0, current: 0, status: 'process', size: '', progressDot: false }; },{"./Step":763,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/possibleConstructorReturn":202,"classnames":455,"rc-util/lib/Children/toArray":858,"react":"react"}],765:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Step", { enumerable: true, get: function get() { return _Step.default; } }); exports.default = void 0; var _Steps = _interopRequireDefault(require("./Steps")); var _Step = _interopRequireDefault(require("./Step")); var _default = _Steps.default; exports.default = _default; },{"./Step":763,"./Steps":764,"@babel/runtime/helpers/interopRequireDefault":192}],766:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var Switch = React.forwardRef(function (_ref, ref) { var _classNames; var _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? 'rc-switch' : _ref$prefixCls, className = _ref.className, checked = _ref.checked, defaultChecked = _ref.defaultChecked, disabled = _ref.disabled, loadingIcon = _ref.loadingIcon, checkedChildren = _ref.checkedChildren, unCheckedChildren = _ref.unCheckedChildren, onClick = _ref.onClick, onChange = _ref.onChange, onKeyDown = _ref.onKeyDown, restProps = (0, _objectWithoutProperties2.default)(_ref, ["prefixCls", "className", "checked", "defaultChecked", "disabled", "loadingIcon", "checkedChildren", "unCheckedChildren", "onClick", "onChange", "onKeyDown"]); var _useMergedState = (0, _useMergedState3.default)(false, { value: checked, defaultValue: defaultChecked }), _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2), innerChecked = _useMergedState2[0], setInnerChecked = _useMergedState2[1]; function triggerChange(newChecked, event) { var mergedChecked = innerChecked; if (!disabled) { mergedChecked = newChecked; setInnerChecked(mergedChecked); onChange === null || onChange === void 0 ? void 0 : onChange(mergedChecked, event); } return mergedChecked; } function onInternalKeyDown(e) { if (e.which === _KeyCode.default.LEFT) { triggerChange(false, e); } else if (e.which === _KeyCode.default.RIGHT) { triggerChange(true, e); } onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e); } function onInternalClick(e) { var ret = triggerChange(!innerChecked, e); // [Legacy] trigger onClick with value onClick === null || onClick === void 0 ? void 0 : onClick(ret, e); } var switchClassName = (0, _classnames.default)(prefixCls, className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-checked"), innerChecked), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-disabled"), disabled), _classNames)); return React.createElement("button", Object.assign({}, restProps, { type: "button", role: "switch", "aria-checked": innerChecked, disabled: disabled, className: switchClassName, ref: ref, onKeyDown: onInternalKeyDown, onClick: onInternalClick }), loadingIcon, React.createElement("span", { className: "".concat(prefixCls, "-inner") }, innerChecked ? checkedChildren : unCheckedChildren)); }); Switch.displayName = 'Switch'; var _default = Switch; exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-util/lib/KeyCode":865,"rc-util/lib/hooks/useMergedState":871,"react":"react"}],767:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _Cell = _interopRequireDefault(require("../Cell")); var _TableContext = _interopRequireDefault(require("../context/TableContext")); var _BodyContext = _interopRequireDefault(require("../context/BodyContext")); var _valueUtil = require("../utils/valueUtil"); var _ExpandedRow = _interopRequireDefault(require("./ExpandedRow")); function BodyRow(props) { var className = props.className, style = props.style, record = props.record, index = props.index, rowKey = props.rowKey, getRowKey = props.getRowKey, rowExpandable = props.rowExpandable, expandedKeys = props.expandedKeys, onRow = props.onRow, _props$indent = props.indent, indent = _props$indent === void 0 ? 0 : _props$indent, RowComponent = props.rowComponent, cellComponent = props.cellComponent, childrenColumnName = props.childrenColumnName; var _React$useContext = React.useContext(_TableContext.default), prefixCls = _React$useContext.prefixCls, fixedInfoList = _React$useContext.fixedInfoList; var _React$useContext2 = React.useContext(_BodyContext.default), fixHeader = _React$useContext2.fixHeader, fixColumn = _React$useContext2.fixColumn, horizonScroll = _React$useContext2.horizonScroll, componentWidth = _React$useContext2.componentWidth, flattenColumns = _React$useContext2.flattenColumns, expandableType = _React$useContext2.expandableType, expandRowByClick = _React$useContext2.expandRowByClick, onTriggerExpand = _React$useContext2.onTriggerExpand, rowClassName = _React$useContext2.rowClassName, expandedRowClassName = _React$useContext2.expandedRowClassName, indentSize = _React$useContext2.indentSize, expandIcon = _React$useContext2.expandIcon, expandedRowRender = _React$useContext2.expandedRowRender, expandIconColumnIndex = _React$useContext2.expandIconColumnIndex; var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), expandRended = _React$useState2[0], setExpandRended = _React$useState2[1]; var expanded = expandedKeys && expandedKeys.has(props.recordKey); React.useEffect(function () { if (expanded) { setExpandRended(true); } }, [expanded]); var rowSupportExpand = expandableType === 'row' && (!rowExpandable || rowExpandable(record)); // Only when row is not expandable and `children` exist in record var nestExpandable = expandableType === 'nest'; var hasNestChildren = childrenColumnName && record && record[childrenColumnName]; var mergedExpandable = rowSupportExpand || nestExpandable; // =========================== onRow =========================== var additionalProps; if (onRow) { additionalProps = onRow(record, index); } var onClick = function onClick(event) { if (expandRowByClick && mergedExpandable) { onTriggerExpand(record, event); } if (additionalProps && additionalProps.onClick) { var _additionalProps; for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } (_additionalProps = additionalProps).onClick.apply(_additionalProps, [event].concat(args)); } }; // ======================== Base tr row ======================== var computeRowClassName; if (typeof rowClassName === 'string') { computeRowClassName = rowClassName; } else if (typeof rowClassName === 'function') { computeRowClassName = rowClassName(record, index, indent); } var columnsKey = (0, _valueUtil.getColumnsKey)(flattenColumns); var baseRowNode = React.createElement(RowComponent, Object.assign({}, additionalProps, { "data-row-key": rowKey, className: (0, _classnames.default)(className, "".concat(prefixCls, "-row"), "".concat(prefixCls, "-row-level-").concat(indent), computeRowClassName, additionalProps && additionalProps.className), style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), additionalProps ? additionalProps.style : null), onClick: onClick }), flattenColumns.map(function (column, colIndex) { var render = column.render, dataIndex = column.dataIndex, columnClassName = column.className; var key = columnsKey[colIndex]; var fixedInfo = fixedInfoList[colIndex]; // ============= Used for nest expandable ============= var appendCellNode; if (colIndex === (expandIconColumnIndex || 0) && nestExpandable) { appendCellNode = React.createElement(React.Fragment, null, React.createElement("span", { style: { paddingLeft: "".concat(indentSize * indent, "px") }, className: "".concat(prefixCls, "-row-indent indent-level-").concat(indent) }), expandIcon({ prefixCls: prefixCls, expanded: expanded, expandable: hasNestChildren, record: record, onExpand: onTriggerExpand })); } var additionalCellProps; if (column.onCell) { additionalCellProps = column.onCell(record, index); } return React.createElement(_Cell.default, Object.assign({ className: columnClassName, ellipsis: column.ellipsis, align: column.align, component: cellComponent, prefixCls: prefixCls, key: key, record: record, index: index, dataIndex: dataIndex, render: render, shouldCellUpdate: column.shouldCellUpdate }, fixedInfo, { appendNode: appendCellNode, additionalProps: additionalCellProps })); })); // ======================== Expand Row ========================= var expandRowNode; if (rowSupportExpand && (expandRended || expanded)) { var expandContent = expandedRowRender(record, index, indent + 1, expanded); var computedExpandedRowClassName = expandedRowClassName && expandedRowClassName(record, index, indent); expandRowNode = React.createElement(_ExpandedRow.default, { expanded: expanded, className: (0, _classnames.default)("".concat(prefixCls, "-expanded-row"), "".concat(prefixCls, "-expanded-row-level-").concat(indent + 1), computedExpandedRowClassName), prefixCls: prefixCls, fixHeader: fixHeader, fixColumn: fixColumn, horizonScroll: horizonScroll, component: RowComponent, componentWidth: componentWidth, cellComponent: cellComponent, colSpan: flattenColumns.length }, expandContent); } // ========================= Nest Row ========================== var nestRowNode; if (hasNestChildren && expanded) { nestRowNode = (record[childrenColumnName] || []).map(function (subRecord, subIndex) { var subKey = getRowKey(subRecord, subIndex); return React.createElement(BodyRow, Object.assign({}, props, { key: subKey, rowKey: subKey, record: subRecord, recordKey: subKey, index: subIndex, indent: indent + 1 })); }); } return React.createElement(React.Fragment, null, baseRowNode, expandRowNode, nestRowNode); } BodyRow.displayName = 'BodyRow'; var _default = BodyRow; exports.default = _default; },{"../Cell":771,"../context/BodyContext":781,"../context/TableContext":783,"../utils/valueUtil":795,"./ExpandedRow":768,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"react":"react"}],768:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _Cell = _interopRequireDefault(require("../Cell")); var _TableContext = _interopRequireDefault(require("../context/TableContext")); function ExpandedRow(_ref) { var prefixCls = _ref.prefixCls, children = _ref.children, Component = _ref.component, cellComponent = _ref.cellComponent, fixHeader = _ref.fixHeader, fixColumn = _ref.fixColumn, horizonScroll = _ref.horizonScroll, className = _ref.className, expanded = _ref.expanded, componentWidth = _ref.componentWidth, colSpan = _ref.colSpan; var _React$useContext = React.useContext(_TableContext.default), scrollbarSize = _React$useContext.scrollbarSize; // Cache render node return React.useMemo(function () { var contentNode = children; if (fixColumn) { contentNode = React.createElement("div", { style: { width: componentWidth - (fixHeader ? scrollbarSize : 0), position: 'sticky', left: 0, overflow: 'hidden' }, className: "".concat(prefixCls, "-expanded-row-fixed") }, contentNode); } return React.createElement(Component, { className: className, style: { display: expanded ? null : 'none' } }, React.createElement(_Cell.default, { component: cellComponent, prefixCls: prefixCls, colSpan: colSpan }, contentNode)); }, [children, Component, fixHeader, horizonScroll, className, expanded, componentWidth, colSpan, scrollbarSize]); } var _default = ExpandedRow; exports.default = _default; },{"../Cell":771,"../context/TableContext":783,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],769:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = MeasureCell; var React = _interopRequireWildcard(require("react")); var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer")); function MeasureCell(_ref) { var columnKey = _ref.columnKey, onColumnResize = _ref.onColumnResize; var cellRef = React.useRef(); React.useEffect(function () { if (cellRef.current) { onColumnResize(columnKey, cellRef.current.offsetWidth); } }, []); return React.createElement(_rcResizeObserver.default, { onResize: function onResize(_ref2) { var offsetWidth = _ref2.offsetWidth; onColumnResize(columnKey, offsetWidth); } }, React.createElement("td", { ref: cellRef, style: { padding: 0, border: 0, height: 0 } }, React.createElement("div", { style: { height: 0, overflow: 'hidden' } }, "\xA0"))); } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"rc-resize-observer":729,"react":"react"}],770:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _BodyRow = _interopRequireDefault(require("./BodyRow")); var _TableContext = _interopRequireDefault(require("../context/TableContext")); var _ExpandedRow = _interopRequireDefault(require("./ExpandedRow")); var _BodyContext = _interopRequireDefault(require("../context/BodyContext")); var _valueUtil = require("../utils/valueUtil"); var _ResizeContext = _interopRequireDefault(require("../context/ResizeContext")); var _MeasureCell = _interopRequireDefault(require("./MeasureCell")); function Body(_ref) { var data = _ref.data, getRowKey = _ref.getRowKey, measureColumnWidth = _ref.measureColumnWidth, expandedKeys = _ref.expandedKeys, onRow = _ref.onRow, rowExpandable = _ref.rowExpandable, emptyNode = _ref.emptyNode, childrenColumnName = _ref.childrenColumnName; var _React$useContext = React.useContext(_ResizeContext.default), onColumnResize = _React$useContext.onColumnResize; var _React$useContext2 = React.useContext(_TableContext.default), prefixCls = _React$useContext2.prefixCls, getComponent = _React$useContext2.getComponent; var _React$useContext3 = React.useContext(_BodyContext.default), fixHeader = _React$useContext3.fixHeader, horizonScroll = _React$useContext3.horizonScroll, flattenColumns = _React$useContext3.flattenColumns, componentWidth = _React$useContext3.componentWidth; return React.useMemo(function () { var WrapperComponent = getComponent(['body', 'wrapper'], 'tbody'); var trComponent = getComponent(['body', 'row'], 'tr'); var tdComponent = getComponent(['body', 'cell'], 'td'); var rows; if (data.length) { rows = data.map(function (record, index) { var key = getRowKey(record, index); return React.createElement(_BodyRow.default, { key: key, rowKey: key, record: record, recordKey: key, index: index, rowComponent: trComponent, cellComponent: tdComponent, expandedKeys: expandedKeys, onRow: onRow, getRowKey: getRowKey, rowExpandable: rowExpandable, childrenColumnName: childrenColumnName }); }); } else { rows = React.createElement(_ExpandedRow.default, { expanded: true, className: "".concat(prefixCls, "-placeholder"), prefixCls: prefixCls, fixHeader: fixHeader, fixColumn: horizonScroll, horizonScroll: horizonScroll, component: trComponent, componentWidth: componentWidth, cellComponent: tdComponent, colSpan: flattenColumns.length }, emptyNode); } var columnsKey = (0, _valueUtil.getColumnsKey)(flattenColumns); return React.createElement(WrapperComponent, { className: "".concat(prefixCls, "-tbody") }, measureColumnWidth && React.createElement("tr", { "aria-hidden": "true", className: "".concat(prefixCls, "-measure-row"), style: { height: 0 } }, columnsKey.map(function (columnKey) { return React.createElement(_MeasureCell.default, { key: columnKey, columnKey: columnKey, onColumnResize: onColumnResize }); })), rows); }, [data, prefixCls, onRow, measureColumnWidth, expandedKeys, getRowKey, getComponent, componentWidth, emptyNode, flattenColumns]); } var MemoBody = React.memo(Body); MemoBody.displayName = 'Body'; var _default = MemoBody; exports.default = _default; },{"../context/BodyContext":781,"../context/ResizeContext":782,"../context/TableContext":783,"../utils/valueUtil":795,"./BodyRow":767,"./ExpandedRow":768,"./MeasureCell":769,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],771:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _ref3 = require("rc-util/lib/ref"); var _valueUtil = require("../utils/valueUtil"); function isRenderCell(data) { return data && (0, _typeof2.default)(data) === 'object' && !Array.isArray(data) && !React.isValidElement(data); } function isRefComponent(component) { // String tag component also support ref if (typeof component === 'string') { return true; } return (0, _ref3.supportRef)(component); } function Cell(_ref, ref) { var _classNames; var prefixCls = _ref.prefixCls, className = _ref.className, record = _ref.record, index = _ref.index, dataIndex = _ref.dataIndex, render = _ref.render, children = _ref.children, _ref$component = _ref.component, Component = _ref$component === void 0 ? 'td' : _ref$component, colSpan = _ref.colSpan, rowSpan = _ref.rowSpan, fixLeft = _ref.fixLeft, fixRight = _ref.fixRight, firstFixLeft = _ref.firstFixLeft, lastFixLeft = _ref.lastFixLeft, firstFixRight = _ref.firstFixRight, lastFixRight = _ref.lastFixRight, appendNode = _ref.appendNode, _ref$additionalProps = _ref.additionalProps, additionalProps = _ref$additionalProps === void 0 ? {} : _ref$additionalProps, ellipsis = _ref.ellipsis, align = _ref.align, rowType = _ref.rowType, isSticky = _ref.isSticky; var cellPrefixCls = "".concat(prefixCls, "-cell"); // ==================== Child Node ==================== var cellProps; var childNode; if (children) { childNode = children; } else { var value = (0, _valueUtil.getPathValue)(record, dataIndex); // Customize render node childNode = value; if (render) { var renderData = render(value, record, index); if (isRenderCell(renderData)) { childNode = renderData.children; cellProps = renderData.props; } else { childNode = renderData; } } } // Not crash if final `childNode` is not validate ReactNode if ((0, _typeof2.default)(childNode) === 'object' && !Array.isArray(childNode) && !React.isValidElement(childNode)) { childNode = null; } if (ellipsis && (lastFixLeft || firstFixRight)) { childNode = React.createElement("span", { className: "".concat(cellPrefixCls, "-content") }, childNode); } var _ref2 = cellProps || {}, cellColSpan = _ref2.colSpan, cellRowSpan = _ref2.rowSpan, cellStyle = _ref2.style, cellClassName = _ref2.className, restCellProps = (0, _objectWithoutProperties2.default)(_ref2, ["colSpan", "rowSpan", "style", "className"]); var mergedColSpan = cellColSpan !== undefined ? cellColSpan : colSpan; var mergedRowSpan = cellRowSpan !== undefined ? cellRowSpan : rowSpan; if (mergedColSpan === 0 || mergedRowSpan === 0) { return null; } // ====================== Fixed ======================= var fixedStyle = {}; var isFixLeft = typeof fixLeft === 'number'; var isFixRight = typeof fixRight === 'number'; if (isFixLeft) { fixedStyle.position = 'sticky'; fixedStyle.left = fixLeft; } if (isFixRight) { fixedStyle.position = 'sticky'; fixedStyle.right = fixRight; } // ====================== Align ======================= var alignStyle = {}; if (align) { alignStyle.textAlign = align; } // ====================== Render ====================== var title; var ellipsisConfig = ellipsis === true ? { showTitle: true } : ellipsis; if (ellipsisConfig && (ellipsisConfig.showTitle || rowType === 'header')) { if (typeof childNode === 'string' || typeof childNode === 'number') { title = childNode.toString(); } else if (React.isValidElement(childNode) && typeof childNode.props.children === 'string') { title = childNode.props.children; } } var componentProps = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({ title: title }, restCellProps), additionalProps), {}, { colSpan: mergedColSpan && mergedColSpan !== 1 ? mergedColSpan : null, rowSpan: mergedRowSpan && mergedRowSpan !== 1 ? mergedRowSpan : null, className: (0, _classnames.default)(cellPrefixCls, className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(cellPrefixCls, "-fix-left"), isFixLeft), (0, _defineProperty2.default)(_classNames, "".concat(cellPrefixCls, "-fix-left-first"), firstFixLeft), (0, _defineProperty2.default)(_classNames, "".concat(cellPrefixCls, "-fix-left-last"), lastFixLeft), (0, _defineProperty2.default)(_classNames, "".concat(cellPrefixCls, "-fix-right"), isFixRight), (0, _defineProperty2.default)(_classNames, "".concat(cellPrefixCls, "-fix-right-first"), firstFixRight), (0, _defineProperty2.default)(_classNames, "".concat(cellPrefixCls, "-fix-right-last"), lastFixRight), (0, _defineProperty2.default)(_classNames, "".concat(cellPrefixCls, "-ellipsis"), ellipsis), (0, _defineProperty2.default)(_classNames, "".concat(cellPrefixCls, "-with-append"), appendNode), (0, _defineProperty2.default)(_classNames, "".concat(cellPrefixCls, "-fix-sticky"), (isFixLeft || isFixRight) && isSticky), _classNames), additionalProps.className, cellClassName), style: (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, additionalProps.style), alignStyle), fixedStyle), cellStyle), ref: isRefComponent(Component) ? ref : null }); return React.createElement(Component, Object.assign({}, componentProps), appendNode, childNode); } var RefCell = React.forwardRef(Cell); RefCell.displayName = 'Cell'; var MemoCell = React.memo(RefCell, function (prev, next) { if (next.shouldCellUpdate) { return !next.shouldCellUpdate(next.record, prev.record); } return false; }); var _default = MemoCell; exports.default = _default; },{"../utils/valueUtil":795,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/typeof":208,"classnames":455,"rc-util/lib/ref":874,"react":"react"}],772:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _legacyUtil = require("./utils/legacyUtil"); function ColGroup(_ref) { var colWidths = _ref.colWidths, columns = _ref.columns, columCount = _ref.columCount; var cols = []; var len = columCount || columns.length; // Only insert col with width & additional props // Skip if rest col do not have any useful info var mustInsert = false; for (var i = len - 1; i >= 0; i -= 1) { var width = colWidths[i]; var column = columns && columns[i]; var additionalProps = column && column[_legacyUtil.INTERNAL_COL_DEFINE]; if (width || additionalProps || mustInsert) { cols.unshift(React.createElement("col", Object.assign({ key: i, style: { width: width, minWidth: width } }, additionalProps))); mustInsert = true; } } return React.createElement("colgroup", null, cols); } var _default = ColGroup; exports.default = _default; },{"./utils/legacyUtil":794,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],773:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SummaryCell; var React = _interopRequireWildcard(require("react")); var _Cell = _interopRequireDefault(require("../Cell")); var _TableContext = _interopRequireDefault(require("../context/TableContext")); function SummaryCell(_ref) { var className = _ref.className, index = _ref.index, children = _ref.children, colSpan = _ref.colSpan, rowSpan = _ref.rowSpan; var _React$useContext = React.useContext(_TableContext.default), prefixCls = _React$useContext.prefixCls, fixedInfoList = _React$useContext.fixedInfoList; var fixedInfo = fixedInfoList[index]; return React.createElement(_Cell.default, Object.assign({ className: className, index: index, component: "td", prefixCls: prefixCls, record: null, dataIndex: null, render: function render() { return { children: children, props: { colSpan: colSpan, rowSpan: rowSpan } }; } }, fixedInfo)); } },{"../Cell":771,"../context/TableContext":783,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],774:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = FooterRow; var React = _interopRequireWildcard(require("react")); function FooterRow(props) { return React.createElement("tr", Object.assign({}, props)); } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],775:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.FooterComponents = exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _TableContext = _interopRequireDefault(require("../context/TableContext")); var _Cell = _interopRequireDefault(require("./Cell")); var _Row = _interopRequireDefault(require("./Row")); function Footer(_ref) { var children = _ref.children; var _React$useContext = React.useContext(_TableContext.default), prefixCls = _React$useContext.prefixCls; return React.createElement("tfoot", { className: "".concat(prefixCls, "-summary") }, children); } var _default = Footer; exports.default = _default; var FooterComponents = { Cell: _Cell.default, Row: _Row.default }; exports.FooterComponents = FooterComponents; },{"../context/TableContext":783,"./Cell":773,"./Row":774,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],776:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _ref2 = require("rc-util/lib/ref"); var _Header = _interopRequireDefault(require("./Header")); var _ColGroup = _interopRequireDefault(require("../ColGroup")); var _TableContext = _interopRequireDefault(require("../context/TableContext")); function useColumnWidth(colWidths, columCount) { return (0, React.useMemo)(function () { var cloneColumns = []; for (var i = 0; i < columCount; i += 1) { var val = colWidths[i]; if (val !== undefined) { cloneColumns[i] = val; } else { return null; } } return cloneColumns; }, [colWidths.join('_'), columCount]); } var FixedHeader = React.forwardRef(function (_ref, ref) { var noData = _ref.noData, columns = _ref.columns, flattenColumns = _ref.flattenColumns, colWidths = _ref.colWidths, columCount = _ref.columCount, stickyOffsets = _ref.stickyOffsets, direction = _ref.direction, fixHeader = _ref.fixHeader, offsetHeader = _ref.offsetHeader, stickyClassName = _ref.stickyClassName, onScroll = _ref.onScroll, props = (0, _objectWithoutProperties2.default)(_ref, ["noData", "columns", "flattenColumns", "colWidths", "columCount", "stickyOffsets", "direction", "fixHeader", "offsetHeader", "stickyClassName", "onScroll"]); var _React$useContext = React.useContext(_TableContext.default), prefixCls = _React$useContext.prefixCls, scrollbarSize = _React$useContext.scrollbarSize, isSticky = _React$useContext.isSticky; var combinationScrollBarSize = isSticky && !fixHeader ? 0 : scrollbarSize; // Pass wheel to scroll event var scrollRef = React.useRef(null); var setScrollRef = React.useCallback(function (element) { (0, _ref2.fillRef)(ref, element); (0, _ref2.fillRef)(scrollRef, element); }, []); React.useEffect(function () { var _scrollRef$current; function onWheel(e) { var currentTarget = e.currentTarget, deltaX = e.deltaX; if (deltaX) { onScroll({ currentTarget: currentTarget, scrollLeft: currentTarget.scrollLeft + deltaX }); e.preventDefault(); } } (_scrollRef$current = scrollRef.current) === null || _scrollRef$current === void 0 ? void 0 : _scrollRef$current.addEventListener('wheel', onWheel); return function () { var _scrollRef$current2; (_scrollRef$current2 = scrollRef.current) === null || _scrollRef$current2 === void 0 ? void 0 : _scrollRef$current2.removeEventListener('wheel', onWheel); }; }, []); // Add scrollbar column var lastColumn = flattenColumns[flattenColumns.length - 1]; var ScrollBarColumn = { fixed: lastColumn ? lastColumn.fixed : null, onHeaderCell: function onHeaderCell() { return { className: "".concat(prefixCls, "-cell-scrollbar") }; } }; var columnsWithScrollbar = (0, React.useMemo)(function () { return combinationScrollBarSize ? [].concat((0, _toConsumableArray2.default)(columns), [ScrollBarColumn]) : columns; }, [combinationScrollBarSize, columns]); var flattenColumnsWithScrollbar = (0, React.useMemo)(function () { return combinationScrollBarSize ? [].concat((0, _toConsumableArray2.default)(flattenColumns), [ScrollBarColumn]) : flattenColumns; }, [combinationScrollBarSize, flattenColumns]); // Calculate the sticky offsets var headerStickyOffsets = (0, React.useMemo)(function () { var right = stickyOffsets.right, left = stickyOffsets.left; return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, stickyOffsets), {}, { left: direction === 'rtl' ? [].concat((0, _toConsumableArray2.default)(left.map(function (width) { return width + combinationScrollBarSize; })), [0]) : left, right: direction === 'rtl' ? right : [].concat((0, _toConsumableArray2.default)(right.map(function (width) { return width + combinationScrollBarSize; })), [0]), isSticky: isSticky }); }, [combinationScrollBarSize, stickyOffsets, isSticky]); var mergedColumnWidth = useColumnWidth(colWidths, columCount); return React.createElement("div", { style: (0, _objectSpread2.default)({ overflow: 'hidden' }, isSticky ? { top: offsetHeader } : {}), ref: setScrollRef, className: (0, _classnames.default)("".concat(prefixCls, "-header"), (0, _defineProperty2.default)({}, stickyClassName, !!stickyClassName)) }, React.createElement("table", { style: { tableLayout: 'fixed', visibility: noData || mergedColumnWidth ? null : 'hidden' } }, React.createElement(_ColGroup.default, { colWidths: mergedColumnWidth ? [].concat((0, _toConsumableArray2.default)(mergedColumnWidth), [combinationScrollBarSize]) : [], columCount: columCount + 1, columns: flattenColumnsWithScrollbar }), React.createElement(_Header.default, Object.assign({}, props, { stickyOffsets: headerStickyOffsets, columns: columnsWithScrollbar, flattenColumns: flattenColumnsWithScrollbar })))); }); FixedHeader.displayName = 'FixedHeader'; var _default = FixedHeader; exports.default = _default; },{"../ColGroup":772,"../context/TableContext":783,"./Header":777,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"rc-util/lib/ref":874,"react":"react"}],777:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _HeaderRow = _interopRequireDefault(require("./HeaderRow")); var _TableContext = _interopRequireDefault(require("../context/TableContext")); function parseHeaderRows(rootColumns) { var rows = []; function fillRowCells(columns, colIndex) { var rowIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; // Init rows rows[rowIndex] = rows[rowIndex] || []; var currentColIndex = colIndex; var colSpans = columns.filter(Boolean).map(function (column) { var cell = { key: column.key, className: column.className || '', children: column.title, column: column, colStart: currentColIndex }; var colSpan = 1; var subColumns = column.children; if (subColumns && subColumns.length > 0) { colSpan = fillRowCells(subColumns, currentColIndex, rowIndex + 1).reduce(function (total, count) { return total + count; }, 0); cell.hasSubColumns = true; } if ('colSpan' in column) { colSpan = column.colSpan; } if ('rowSpan' in column) { cell.rowSpan = column.rowSpan; } cell.colSpan = colSpan; cell.colEnd = cell.colStart + colSpan - 1; rows[rowIndex].push(cell); currentColIndex += colSpan; return colSpan; }); return colSpans; } // Generate `rows` cell data fillRowCells(rootColumns, 0); // Handle `rowSpan` var rowCount = rows.length; var _loop = function _loop(rowIndex) { rows[rowIndex].forEach(function (cell) { if (!('rowSpan' in cell) && !cell.hasSubColumns) { // eslint-disable-next-line no-param-reassign cell.rowSpan = rowCount - rowIndex; } }); }; for (var rowIndex = 0; rowIndex < rowCount; rowIndex += 1) { _loop(rowIndex); } return rows; } function Header(_ref) { var stickyOffsets = _ref.stickyOffsets, columns = _ref.columns, flattenColumns = _ref.flattenColumns, onHeaderRow = _ref.onHeaderRow; var _React$useContext = React.useContext(_TableContext.default), prefixCls = _React$useContext.prefixCls, getComponent = _React$useContext.getComponent; var rows = React.useMemo(function () { return parseHeaderRows(columns); }, [columns]); var WrapperComponent = getComponent(['header', 'wrapper'], 'thead'); var trComponent = getComponent(['header', 'row'], 'tr'); var thComponent = getComponent(['header', 'cell'], 'th'); return React.createElement(WrapperComponent, { className: "".concat(prefixCls, "-thead") }, rows.map(function (row, rowIndex) { var rowNode = React.createElement(_HeaderRow.default, { key: rowIndex, flattenColumns: flattenColumns, cells: row, stickyOffsets: stickyOffsets, rowComponent: trComponent, cellComponent: thComponent, onHeaderRow: onHeaderRow, index: rowIndex }); return rowNode; })); } var _default = Header; exports.default = _default; },{"../context/TableContext":783,"./HeaderRow":778,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],778:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _Cell = _interopRequireDefault(require("../Cell")); var _TableContext = _interopRequireDefault(require("../context/TableContext")); var _fixUtil = require("../utils/fixUtil"); var _valueUtil = require("../utils/valueUtil"); function HeaderRow(_ref) { var cells = _ref.cells, stickyOffsets = _ref.stickyOffsets, flattenColumns = _ref.flattenColumns, RowComponent = _ref.rowComponent, CellComponent = _ref.cellComponent, onHeaderRow = _ref.onHeaderRow, index = _ref.index; var _React$useContext = React.useContext(_TableContext.default), prefixCls = _React$useContext.prefixCls, direction = _React$useContext.direction; var rowProps; if (onHeaderRow) { rowProps = onHeaderRow(cells.map(function (cell) { return cell.column; }), index); } var columnsKey = (0, _valueUtil.getColumnsKey)(cells.map(function (cell) { return cell.column; })); return React.createElement(RowComponent, Object.assign({}, rowProps), cells.map(function (cell, cellIndex) { var column = cell.column; var fixedInfo = (0, _fixUtil.getCellFixedInfo)(cell.colStart, cell.colEnd, flattenColumns, stickyOffsets, direction); var additionalProps; if (column && column.onHeaderCell) { additionalProps = cell.column.onHeaderCell(column); } return React.createElement(_Cell.default, Object.assign({}, cell, { ellipsis: column.ellipsis, align: column.align, component: CellComponent, prefixCls: prefixCls, key: columnsKey[cellIndex] }, fixedInfo, { additionalProps: additionalProps, rowType: "header" })); })); } HeaderRow.displayName = 'HeaderRow'; var _default = HeaderRow; exports.default = _default; },{"../Cell":771,"../context/TableContext":783,"../utils/fixUtil":793,"../utils/valueUtil":795,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],779:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); function Panel(_ref) { var className = _ref.className, children = _ref.children; return React.createElement("div", { className: className }, children); } var _default = Panel; exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],780:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.INTERNAL_HOOKS = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _shallowequal = _interopRequireDefault(require("shallowequal")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer")); var _getScrollBarSize = _interopRequireDefault(require("rc-util/lib/getScrollBarSize")); var _ColumnGroup = _interopRequireDefault(require("./sugar/ColumnGroup")); var _Column = _interopRequireDefault(require("./sugar/Column")); var _FixedHeader = _interopRequireDefault(require("./Header/FixedHeader")); var _Header = _interopRequireDefault(require("./Header/Header")); var _TableContext = _interopRequireDefault(require("./context/TableContext")); var _BodyContext = _interopRequireDefault(require("./context/BodyContext")); var _Body = _interopRequireDefault(require("./Body")); var _useColumns3 = _interopRequireDefault(require("./hooks/useColumns")); var _useFrame = require("./hooks/useFrame"); var _valueUtil = require("./utils/valueUtil"); var _ResizeContext = _interopRequireDefault(require("./context/ResizeContext")); var _useStickyOffsets = _interopRequireDefault(require("./hooks/useStickyOffsets")); var _ColGroup = _interopRequireDefault(require("./ColGroup")); var _legacyUtil = require("./utils/legacyUtil"); var _Panel = _interopRequireDefault(require("./Panel")); var _Footer = _interopRequireWildcard(require("./Footer")); var _expandUtil = require("./utils/expandUtil"); var _fixUtil = require("./utils/fixUtil"); var _stickyScrollBar = _interopRequireDefault(require("./stickyScrollBar")); var _useSticky2 = _interopRequireDefault(require("./hooks/useSticky")); /** * Feature: * - fixed not need to set width * - support `rowExpandable` to config row expand logic * - add `summary` to support `() => ReactNode` * * Update: * - `dataIndex` is `array[]` now * - `expandable` wrap all the expand related props * * Removed: * - expandIconAsCell * - useFixedHeader * - rowRef * - columns[number].onCellClick * - onRowClick * - onRowDoubleClick * - onRowMouseEnter * - onRowMouseLeave * - getBodyWrapper * - bodyStyle * * Deprecated: * - All expanded props, move into expandable */ // Used for conditions cache var EMPTY_DATA = []; // Used for customize scroll var EMPTY_SCROLL_TARGET = {}; var INTERNAL_HOOKS = 'rc-table-internal-hook'; exports.INTERNAL_HOOKS = INTERNAL_HOOKS; var MemoTableContent = React.memo(function (_ref) { var children = _ref.children; return children; }, function (prev, next) { if (!(0, _shallowequal.default)(prev.props, next.props)) { return false; } // No additional render when pinged status change. // This is not a bug. return prev.pingLeft !== next.pingLeft || prev.pingRight !== next.pingRight; }); function Table(props) { var _classNames; var prefixCls = props.prefixCls, className = props.className, rowClassName = props.rowClassName, style = props.style, data = props.data, rowKey = props.rowKey, scroll = props.scroll, tableLayout = props.tableLayout, direction = props.direction, title = props.title, footer = props.footer, summary = props.summary, id = props.id, showHeader = props.showHeader, components = props.components, emptyText = props.emptyText, onRow = props.onRow, onHeaderRow = props.onHeaderRow, internalHooks = props.internalHooks, transformColumns = props.transformColumns, internalRefs = props.internalRefs, sticky = props.sticky; var mergedData = data || EMPTY_DATA; var hasData = !!mergedData.length; // ===================== Effects ====================== var _React$useState = React.useState(0), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), scrollbarSize = _React$useState2[0], setScrollbarSize = _React$useState2[1]; React.useEffect(function () { setScrollbarSize((0, _getScrollBarSize.default)()); }); // ===================== Warning ====================== if (process.env.NODE_ENV !== 'production') { ['onRowClick', 'onRowDoubleClick', 'onRowContextMenu', 'onRowMouseEnter', 'onRowMouseLeave'].forEach(function (name) { (0, _warning.default)(props[name] === undefined, "`".concat(name, "` is removed, please use `onRow` instead.")); }); (0, _warning.default)(!('getBodyWrapper' in props), '`getBodyWrapper` is deprecated, please use custom `components` instead.'); } // ==================== Customize ===================== var mergedComponents = React.useMemo(function () { return (0, _valueUtil.mergeObject)(components, {}); }, [components]); var getComponent = React.useCallback(function (path, defaultComponent) { return (0, _valueUtil.getPathValue)(mergedComponents, path) || defaultComponent; }, [mergedComponents]); var getRowKey = React.useMemo(function () { if (typeof rowKey === 'function') { return rowKey; } return function (record) { var key = record && record[rowKey]; if (process.env.NODE_ENV !== 'production') { (0, _warning.default)(key !== undefined, 'Each record in table should have a unique `key` prop, or set `rowKey` to an unique primary key.'); } return key; }; }, [rowKey]); // ====================== Expand ====================== var expandableConfig = (0, _legacyUtil.getExpandableProps)(props); var expandIcon = expandableConfig.expandIcon, expandedRowKeys = expandableConfig.expandedRowKeys, defaultExpandedRowKeys = expandableConfig.defaultExpandedRowKeys, defaultExpandAllRows = expandableConfig.defaultExpandAllRows, expandedRowRender = expandableConfig.expandedRowRender, onExpand = expandableConfig.onExpand, onExpandedRowsChange = expandableConfig.onExpandedRowsChange, expandRowByClick = expandableConfig.expandRowByClick, rowExpandable = expandableConfig.rowExpandable, expandIconColumnIndex = expandableConfig.expandIconColumnIndex, expandedRowClassName = expandableConfig.expandedRowClassName, childrenColumnName = expandableConfig.childrenColumnName, indentSize = expandableConfig.indentSize; var mergedExpandIcon = expandIcon || _expandUtil.renderExpandIcon; var mergedChildrenColumnName = childrenColumnName || 'children'; var expandableType = React.useMemo(function () { if (expandedRowRender) { return 'row'; } /* eslint-disable no-underscore-dangle */ /** * Fix https://github.com/ant-design/ant-design/issues/21154 * This is a workaround to not to break current behavior. * We can remove follow code after final release. * * To other developer: * Do not use `__PARENT_RENDER_ICON__` in prod since we will remove this when refactor */ if (props.expandable && internalHooks === INTERNAL_HOOKS && props.expandable.__PARENT_RENDER_ICON__ || mergedData.some(function (record) { return record && (0, _typeof2.default)(record) === 'object' && record[mergedChildrenColumnName]; })) { return 'nest'; } /* eslint-enable */ return false; }, [!!expandedRowRender, mergedData]); var _React$useState3 = React.useState(function () { if (defaultExpandedRowKeys) { return defaultExpandedRowKeys; } if (defaultExpandAllRows) { return (0, _expandUtil.findAllChildrenKeys)(mergedData, getRowKey, mergedChildrenColumnName); } return []; }), _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2), innerExpandedKeys = _React$useState4[0], setInnerExpandedKeys = _React$useState4[1]; var mergedExpandedKeys = React.useMemo(function () { return new Set(expandedRowKeys || innerExpandedKeys || []); }, [expandedRowKeys, innerExpandedKeys]); var onTriggerExpand = React.useCallback(function (record) { var key = getRowKey(record, mergedData.indexOf(record)); var newExpandedKeys; var hasKey = mergedExpandedKeys.has(key); if (hasKey) { mergedExpandedKeys.delete(key); newExpandedKeys = (0, _toConsumableArray2.default)(mergedExpandedKeys); } else { newExpandedKeys = [].concat((0, _toConsumableArray2.default)(mergedExpandedKeys), [key]); } setInnerExpandedKeys(newExpandedKeys); if (onExpand) { onExpand(!hasKey, record); } if (onExpandedRowsChange) { onExpandedRowsChange(newExpandedKeys); } }, [getRowKey, mergedExpandedKeys, mergedData, onExpand, onExpandedRowsChange]); // ====================== Column ====================== var _React$useState5 = React.useState(0), _React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2), componentWidth = _React$useState6[0], setComponentWidth = _React$useState6[1]; var _useColumns = (0, _useColumns3.default)((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), expandableConfig), {}, { expandable: !!expandedRowRender, expandedKeys: mergedExpandedKeys, getRowKey: getRowKey, // https://github.com/ant-design/ant-design/issues/23894 onTriggerExpand: onTriggerExpand, expandIcon: mergedExpandIcon, expandIconColumnIndex: expandIconColumnIndex, direction: direction }), internalHooks === INTERNAL_HOOKS ? transformColumns : null), _useColumns2 = (0, _slicedToArray2.default)(_useColumns, 2), columns = _useColumns2[0], flattenColumns = _useColumns2[1]; var columnContext = React.useMemo(function () { return { columns: columns, flattenColumns: flattenColumns }; }, [columns, flattenColumns]); // ====================== Scroll ====================== var fullTableRef = React.useRef(); var scrollHeaderRef = React.useRef(); var scrollBodyRef = React.useRef(); var _React$useState7 = React.useState(false), _React$useState8 = (0, _slicedToArray2.default)(_React$useState7, 2), pingedLeft = _React$useState8[0], setPingedLeft = _React$useState8[1]; var _React$useState9 = React.useState(false), _React$useState10 = (0, _slicedToArray2.default)(_React$useState9, 2), pingedRight = _React$useState10[0], setPingedRight = _React$useState10[1]; var _useFrameState = (0, _useFrame.useFrameState)(new Map()), _useFrameState2 = (0, _slicedToArray2.default)(_useFrameState, 2), colsWidths = _useFrameState2[0], updateColsWidths = _useFrameState2[1]; // Convert map to number width var colsKeys = (0, _valueUtil.getColumnsKey)(flattenColumns); var pureColWidths = colsKeys.map(function (columnKey) { return colsWidths.get(columnKey); }); var colWidths = React.useMemo(function () { return pureColWidths; }, [pureColWidths.join('_')]); var stickyOffsets = (0, _useStickyOffsets.default)(colWidths, flattenColumns.length, direction); var fixHeader = scroll && (0, _valueUtil.validateValue)(scroll.y); var horizonScroll = scroll && (0, _valueUtil.validateValue)(scroll.x); var fixColumn = horizonScroll && flattenColumns.some(function (_ref2) { var fixed = _ref2.fixed; return fixed; }); // Sticky var stickyRef = React.useRef(); var _useSticky = (0, _useSticky2.default)(sticky, prefixCls), isSticky = _useSticky.isSticky, offsetHeader = _useSticky.offsetHeader, offsetScroll = _useSticky.offsetScroll, stickyClassName = _useSticky.stickyClassName; var scrollXStyle; var scrollYStyle; var scrollTableStyle; if (fixHeader) { scrollYStyle = { overflowY: 'scroll', maxHeight: scroll.y }; } if (horizonScroll) { scrollXStyle = { overflowX: 'auto' }; // When no vertical scrollbar, should hide it // https://github.com/ant-design/ant-design/pull/20705 // https://github.com/ant-design/ant-design/issues/21879 if (!fixHeader) { scrollYStyle = { overflowY: 'hidden' }; } scrollTableStyle = { width: scroll.x === true ? 'auto' : scroll.x, minWidth: '100%' }; } var onColumnResize = React.useCallback(function (columnKey, width) { updateColsWidths(function (widths) { var newWidths = new Map(widths); newWidths.set(columnKey, width); return newWidths; }); }, []); var _useTimeoutLock = (0, _useFrame.useTimeoutLock)(null), _useTimeoutLock2 = (0, _slicedToArray2.default)(_useTimeoutLock, 2), setScrollTarget = _useTimeoutLock2[0], getScrollTarget = _useTimeoutLock2[1]; function forceScroll(scrollLeft, target) { if (!target) { return; } if (typeof target === 'function') { target(scrollLeft); } else if (target.scrollLeft !== scrollLeft) { // eslint-disable-next-line no-param-reassign target.scrollLeft = scrollLeft; } } var onScroll = function onScroll(_ref3) { var currentTarget = _ref3.currentTarget, scrollLeft = _ref3.scrollLeft; var mergedScrollLeft = typeof scrollLeft === 'number' ? scrollLeft : currentTarget.scrollLeft; var compareTarget = currentTarget || EMPTY_SCROLL_TARGET; if (!getScrollTarget() || getScrollTarget() === compareTarget) { var _stickyRef$current; setScrollTarget(compareTarget); forceScroll(mergedScrollLeft, scrollHeaderRef.current); forceScroll(mergedScrollLeft, scrollBodyRef.current); forceScroll(mergedScrollLeft, (_stickyRef$current = stickyRef.current) === null || _stickyRef$current === void 0 ? void 0 : _stickyRef$current.setScrollLeft); } if (currentTarget) { var scrollWidth = currentTarget.scrollWidth, clientWidth = currentTarget.clientWidth; setPingedLeft(mergedScrollLeft > 0); setPingedRight(mergedScrollLeft < scrollWidth - clientWidth); } }; var triggerOnScroll = function triggerOnScroll() { if (scrollBodyRef.current) { onScroll({ currentTarget: scrollBodyRef.current }); } }; var onFullTableResize = function onFullTableResize(_ref4) { var width = _ref4.width; triggerOnScroll(); setComponentWidth(fullTableRef.current ? fullTableRef.current.offsetWidth : width); }; // Sync scroll bar when init or `horizonScroll` changed React.useEffect(function () { return triggerOnScroll; }, []); React.useEffect(function () { if (horizonScroll) { triggerOnScroll(); } }, [horizonScroll]); // ================== INTERNAL HOOKS ================== React.useEffect(function () { if (internalHooks === INTERNAL_HOOKS && internalRefs) { internalRefs.body.current = scrollBodyRef.current; } }); // ====================== Render ====================== var TableComponent = getComponent(['table'], 'table'); // Table layout var mergedTableLayout = React.useMemo(function () { if (tableLayout) { return tableLayout; } // https://github.com/ant-design/ant-design/issues/25227 // When scroll.x is max-content, no need to fix table layout // it's width should stretch out to fit content if (fixColumn) { return scroll.x === 'max-content' ? 'auto' : 'fixed'; } if (fixHeader || flattenColumns.some(function (_ref5) { var ellipsis = _ref5.ellipsis; return ellipsis; })) { return 'fixed'; } return 'auto'; }, [fixHeader, fixColumn, flattenColumns, tableLayout]); var groupTableNode; // Header props var headerProps = { colWidths: colWidths, columCount: flattenColumns.length, stickyOffsets: stickyOffsets, onHeaderRow: onHeaderRow, fixHeader: fixHeader }; // Empty var emptyNode = React.useMemo(function () { if (hasData) { return null; } if (typeof emptyText === 'function') { return emptyText(); } return emptyText; }, [hasData, emptyText]); // Body var bodyTable = React.createElement(_Body.default, { data: mergedData, measureColumnWidth: fixHeader || horizonScroll || isSticky, expandedKeys: mergedExpandedKeys, rowExpandable: rowExpandable, getRowKey: getRowKey, onRow: onRow, emptyNode: emptyNode, childrenColumnName: mergedChildrenColumnName }); var bodyColGroup = React.createElement(_ColGroup.default, { colWidths: flattenColumns.map(function (_ref6) { var width = _ref6.width; return width; }), columns: flattenColumns }); var footerTable = summary && React.createElement(_Footer.default, null, summary(mergedData)); var customizeScrollBody = getComponent(['body']); if (process.env.NODE_ENV !== 'production' && typeof customizeScrollBody === 'function' && hasData && !fixHeader) { (0, _warning.default)(false, '`components.body` with render props is only work on `scroll.y`.'); } if (fixHeader || isSticky) { var bodyContent; if (typeof customizeScrollBody === 'function') { bodyContent = customizeScrollBody(mergedData, { scrollbarSize: scrollbarSize, ref: scrollBodyRef, onScroll: onScroll }); headerProps.colWidths = flattenColumns.map(function (_ref7, index) { var width = _ref7.width; var colWidth = index === columns.length - 1 ? width - scrollbarSize : width; if (typeof colWidth === 'number' && !Number.isNaN(colWidth)) { return colWidth; } (0, _warning.default)(false, 'When use `components.body` with render props. Each column should have a fixed value.'); return 0; }); } else { bodyContent = React.createElement("div", { style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, scrollXStyle), scrollYStyle), onScroll: onScroll, ref: scrollBodyRef, className: (0, _classnames.default)("".concat(prefixCls, "-body")) }, React.createElement(TableComponent, { style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, scrollTableStyle), {}, { tableLayout: mergedTableLayout }) }, bodyColGroup, bodyTable, footerTable), isSticky && React.createElement(_stickyScrollBar.default, { ref: stickyRef, offsetScroll: offsetScroll, scrollBodyRef: scrollBodyRef, onScroll: onScroll })); } groupTableNode = React.createElement(React.Fragment, null, showHeader !== false && React.createElement(_FixedHeader.default, Object.assign({ noData: !mergedData.length }, headerProps, columnContext, { direction: direction, // Fixed Props offsetHeader: offsetHeader, stickyClassName: stickyClassName, ref: scrollHeaderRef, onScroll: onScroll })), bodyContent); } else { groupTableNode = React.createElement("div", { style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, scrollXStyle), scrollYStyle), className: (0, _classnames.default)("".concat(prefixCls, "-content")), onScroll: onScroll, ref: scrollBodyRef }, React.createElement(TableComponent, { style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, scrollTableStyle), {}, { tableLayout: mergedTableLayout }) }, bodyColGroup, showHeader !== false && React.createElement(_Header.default, Object.assign({}, headerProps, columnContext)), bodyTable, footerTable)); } var ariaProps = (0, _legacyUtil.getDataAndAriaProps)(props); var fullTable = React.createElement("div", Object.assign({ className: (0, _classnames.default)(prefixCls, className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-ping-left"), pingedLeft), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-ping-right"), pingedRight), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-layout-fixed"), tableLayout === 'fixed'), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-fixed-header"), fixHeader), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-fixed-column"), fixColumn), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-scroll-horizontal"), horizonScroll), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-has-fix-left"), flattenColumns[0] && flattenColumns[0].fixed), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-has-fix-right"), flattenColumns[flattenColumns.length - 1] && flattenColumns[flattenColumns.length - 1].fixed === 'right'), _classNames)), style: style, id: id, ref: fullTableRef }, ariaProps), React.createElement(MemoTableContent, { pingLeft: pingedLeft, pingRight: pingedRight, props: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, { stickyOffsets: stickyOffsets, mergedExpandedKeys: mergedExpandedKeys }) }, title && React.createElement(_Panel.default, { className: "".concat(prefixCls, "-title") }, title(mergedData)), React.createElement("div", { className: "".concat(prefixCls, "-container") }, groupTableNode), footer && React.createElement(_Panel.default, { className: "".concat(prefixCls, "-footer") }, footer(mergedData)))); if (horizonScroll) { fullTable = React.createElement(_rcResizeObserver.default, { onResize: onFullTableResize }, fullTable); } var TableContextValue = React.useMemo(function () { return { prefixCls: prefixCls, getComponent: getComponent, scrollbarSize: scrollbarSize, direction: direction, fixedInfoList: flattenColumns.map(function (_, colIndex) { return (0, _fixUtil.getCellFixedInfo)(colIndex, colIndex, flattenColumns, stickyOffsets, direction); }), isSticky: isSticky }; }, [prefixCls, getComponent, scrollbarSize, direction, flattenColumns, stickyOffsets, direction, isSticky]); var BodyContextValue = React.useMemo(function () { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, columnContext), {}, { tableLayout: mergedTableLayout, rowClassName: rowClassName, expandedRowClassName: expandedRowClassName, componentWidth: componentWidth, fixHeader: fixHeader, fixColumn: fixColumn, horizonScroll: horizonScroll, expandIcon: mergedExpandIcon, expandableType: expandableType, expandRowByClick: expandRowByClick, expandedRowRender: expandedRowRender, onTriggerExpand: onTriggerExpand, expandIconColumnIndex: expandIconColumnIndex, indentSize: indentSize }); }, [columnContext, mergedTableLayout, rowClassName, expandedRowClassName, componentWidth, fixHeader, fixColumn, horizonScroll, mergedExpandIcon, expandableType, expandRowByClick, expandedRowRender, onTriggerExpand, expandIconColumnIndex, indentSize]); var ResizeContextValue = React.useMemo(function () { return { onColumnResize: onColumnResize }; }, [onColumnResize]); return React.createElement(_TableContext.default.Provider, { value: TableContextValue }, React.createElement(_BodyContext.default.Provider, { value: BodyContextValue }, React.createElement(_ResizeContext.default.Provider, { value: ResizeContextValue }, fullTable))); } Table.Column = _Column.default; Table.ColumnGroup = _ColumnGroup.default; Table.Summary = _Footer.FooterComponents; Table.defaultProps = { rowKey: 'key', prefixCls: 'rc-table', emptyText: function emptyText() { return 'No Data'; } }; var _default = Table; exports.default = _default; }).call(this,require('_process')) },{"./Body":770,"./ColGroup":772,"./Footer":775,"./Header/FixedHeader":776,"./Header/Header":777,"./Panel":779,"./context/BodyContext":781,"./context/ResizeContext":782,"./context/TableContext":783,"./hooks/useColumns":784,"./hooks/useFrame":785,"./hooks/useSticky":786,"./hooks/useStickyOffsets":787,"./stickyScrollBar":789,"./sugar/Column":790,"./sugar/ColumnGroup":791,"./utils/expandUtil":792,"./utils/fixUtil":793,"./utils/legacyUtil":794,"./utils/valueUtil":795,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"_process":1,"classnames":455,"rc-resize-observer":729,"rc-util/lib/getScrollBarSize":869,"rc-util/lib/warning":879,"react":"react","shallowequal":901}],781:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var BodyContext = React.createContext(null); var _default = BodyContext; exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],782:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var ResizeContext = React.createContext(null); var _default = ResizeContext; exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],783:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var TableContext = React.createContext(null); var _default = TableContext; exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],784:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.convertChildrenToColumns = convertChildrenToColumns; exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _legacyUtil = require("../utils/legacyUtil"); function convertChildrenToColumns(children) { return (0, _toArray.default)(children).filter(function (node) { return React.isValidElement(node); }).map(function (_ref) { var key = _ref.key, props = _ref.props; var nodeChildren = props.children, restProps = (0, _objectWithoutProperties2.default)(props, ["children"]); var column = (0, _objectSpread2.default)({ key: key }, restProps); if (nodeChildren) { column.children = convertChildrenToColumns(nodeChildren); } return column; }); } function flatColumns(columns) { return columns.reduce(function (list, column) { var fixed = column.fixed; // Convert `fixed='true'` to `fixed='left'` instead var parsedFixed = fixed === true ? 'left' : fixed; var subColumns = column.children; if (subColumns && subColumns.length > 0) { return [].concat((0, _toConsumableArray2.default)(list), (0, _toConsumableArray2.default)(flatColumns(subColumns).map(function (subColum) { return (0, _objectSpread2.default)({ fixed: parsedFixed }, subColum); }))); } return [].concat((0, _toConsumableArray2.default)(list), [(0, _objectSpread2.default)((0, _objectSpread2.default)({}, column), {}, { fixed: parsedFixed })]); }, []); } function warningFixed(flattenColumns) { var allFixLeft = true; for (var i = 0; i < flattenColumns.length; i += 1) { var col = flattenColumns[i]; if (allFixLeft && col.fixed !== 'left') { allFixLeft = false; } else if (!allFixLeft && col.fixed === 'left') { (0, _warning.default)(false, "Index ".concat(i - 1, " of `columns` missing `fixed='left'` prop.")); break; } } var allFixRight = true; for (var _i = flattenColumns.length - 1; _i >= 0; _i -= 1) { var _col = flattenColumns[_i]; if (allFixRight && _col.fixed !== 'right') { allFixRight = false; } else if (!allFixRight && _col.fixed === 'right') { (0, _warning.default)(false, "Index ".concat(_i + 1, " of `columns` missing `fixed='right'` prop.")); break; } } } function revertForRtl(columns) { return columns.map(function (column) { var fixed = column.fixed, restProps = (0, _objectWithoutProperties2.default)(column, ["fixed"]); // Convert `fixed='left'` to `fixed='right'` instead var parsedFixed = fixed; if (fixed === 'left') { parsedFixed = 'right'; } else if (fixed === 'right') { parsedFixed = 'left'; } return (0, _objectSpread2.default)({ fixed: parsedFixed }, restProps); }); } /** * Parse `columns` & `children` into `columns`. */ function useColumns(_ref2, transformColumns) { var prefixCls = _ref2.prefixCls, columns = _ref2.columns, children = _ref2.children, expandable = _ref2.expandable, expandedKeys = _ref2.expandedKeys, getRowKey = _ref2.getRowKey, onTriggerExpand = _ref2.onTriggerExpand, expandIcon = _ref2.expandIcon, rowExpandable = _ref2.rowExpandable, expandIconColumnIndex = _ref2.expandIconColumnIndex, direction = _ref2.direction, expandRowByClick = _ref2.expandRowByClick; var baseColumns = React.useMemo(function () { return columns || convertChildrenToColumns(children); }, [columns, children]); // Add expand column var withExpandColumns = React.useMemo(function () { if (expandable) { var _expandColumn; var expandColIndex = expandIconColumnIndex || 0; var prevColumn = baseColumns[expandColIndex]; var expandColumn = (_expandColumn = {}, (0, _defineProperty2.default)(_expandColumn, _legacyUtil.INTERNAL_COL_DEFINE, { className: "".concat(prefixCls, "-expand-icon-col") }), (0, _defineProperty2.default)(_expandColumn, "title", ''), (0, _defineProperty2.default)(_expandColumn, "fixed", prevColumn ? prevColumn.fixed : null), (0, _defineProperty2.default)(_expandColumn, "className", "".concat(prefixCls, "-row-expand-icon-cell")), (0, _defineProperty2.default)(_expandColumn, "render", function render(_, record, index) { var rowKey = getRowKey(record, index); var expanded = expandedKeys.has(rowKey); var recordExpandable = rowExpandable ? rowExpandable(record) : true; var icon = expandIcon({ prefixCls: prefixCls, expanded: expanded, expandable: recordExpandable, record: record, onExpand: onTriggerExpand }); if (expandRowByClick) { return React.createElement("span", { onClick: function onClick(e) { return e.stopPropagation(); } }, icon); } return icon; }), _expandColumn); // Insert expand column in the target position var cloneColumns = baseColumns.slice(); if (expandColIndex >= 0) { cloneColumns.splice(expandColIndex, 0, expandColumn); } return cloneColumns; } return baseColumns; }, [expandable, baseColumns, getRowKey, expandedKeys, expandIcon, direction]); var mergedColumns = React.useMemo(function () { var finalColumns = withExpandColumns; if (transformColumns) { finalColumns = transformColumns(finalColumns); } // Always provides at least one column for table display if (!finalColumns.length) { finalColumns = [{ render: function render() { return null; } }]; } return finalColumns; }, [transformColumns, withExpandColumns, direction]); var flattenColumns = React.useMemo(function () { if (direction === 'rtl') { return revertForRtl(flatColumns(mergedColumns)); } return flatColumns(mergedColumns); }, [mergedColumns, direction]); // Only check out of production since it's waste for each render if (process.env.NODE_ENV !== 'production') { warningFixed(flattenColumns); } return [mergedColumns, flattenColumns]; } var _default = useColumns; exports.default = _default; }).call(this,require('_process')) },{"../utils/legacyUtil":794,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/toConsumableArray":207,"_process":1,"rc-util/lib/Children/toArray":858,"rc-util/lib/warning":879,"react":"react"}],785:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useFrameState = useFrameState; exports.useTimeoutLock = useTimeoutLock; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _raf = _interopRequireDefault(require("raf")); function useFrameState(defaultState) { var stateRef = (0, _react.useRef)(defaultState); var _useState = (0, _react.useState)({}), _useState2 = (0, _slicedToArray2.default)(_useState, 2), forceUpdate = _useState2[1]; var timeoutRef = (0, _react.useRef)(null); var updateBatchRef = (0, _react.useRef)([]); function setFrameState(updater) { if (timeoutRef.current === null) { updateBatchRef.current = []; timeoutRef.current = (0, _raf.default)(function () { updateBatchRef.current.forEach(function (batchUpdater) { stateRef.current = batchUpdater(stateRef.current); }); timeoutRef.current = null; forceUpdate({}); }); } updateBatchRef.current.push(updater); } (0, _react.useEffect)(function () { return function () { _raf.default.cancel(timeoutRef.current); }; }, []); return [stateRef.current, setFrameState]; } /** Lock frame, when frame pass reset the lock. */ function useTimeoutLock(defaultState) { var frameRef = (0, _react.useRef)(defaultState); var timeoutRef = (0, _react.useRef)(null); function cleanUp() { window.clearTimeout(timeoutRef.current); } function setState(newState) { frameRef.current = newState; cleanUp(); timeoutRef.current = window.setTimeout(function () { frameRef.current = null; timeoutRef.current = null; }, 100); } function getState() { return frameRef.current; } (0, _react.useEffect)(function () { return cleanUp; }, []); return [setState, getState]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"raf":581,"react":"react"}],786:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useSticky; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var React = _interopRequireWildcard(require("react")); /** Sticky header hooks */ function useSticky(sticky, prefixCls) { return React.useMemo(function () { var isSticky = !!sticky; return { isSticky: isSticky, stickyClassName: isSticky ? "".concat(prefixCls, "-sticky-header") : '', offsetHeader: (0, _typeof2.default)(sticky) === 'object' ? sticky.offsetHeader || 0 : 0, offsetScroll: (0, _typeof2.default)(sticky) === 'object' ? sticky.offsetScroll || 0 : 0 }; }, [sticky, prefixCls]); } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/typeof":208,"react":"react"}],787:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); /** * Get sticky column offset width */ function useStickyOffsets(colWidths, columCount, direction) { var stickyOffsets = (0, _react.useMemo)(function () { var leftOffsets = []; var rightOffsets = []; var left = 0; var right = 0; for (var start = 0; start < columCount; start += 1) { if (direction === 'rtl') { // Left offset rightOffsets[start] = right; right += colWidths[start] || 0; // Right offset var end = columCount - start - 1; leftOffsets[end] = left; left += colWidths[end] || 0; } else { // Left offset leftOffsets[start] = left; left += colWidths[start] || 0; // Right offset var _end = columCount - start - 1; rightOffsets[_end] = right; right += colWidths[_end] || 0; } } return { left: leftOffsets, right: rightOffsets }; }, [colWidths, columCount, direction]); return stickyOffsets; } var _default = useStickyOffsets; exports.default = _default; },{"react":"react"}],788:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Summary", { enumerable: true, get: function get() { return _Footer.FooterComponents; } }); Object.defineProperty(exports, "Column", { enumerable: true, get: function get() { return _Column.default; } }); Object.defineProperty(exports, "ColumnGroup", { enumerable: true, get: function get() { return _ColumnGroup.default; } }); Object.defineProperty(exports, "INTERNAL_COL_DEFINE", { enumerable: true, get: function get() { return _legacyUtil.INTERNAL_COL_DEFINE; } }); exports.default = void 0; var _Table = _interopRequireDefault(require("./Table")); var _Footer = require("./Footer"); var _Column = _interopRequireDefault(require("./sugar/Column")); var _ColumnGroup = _interopRequireDefault(require("./sugar/ColumnGroup")); var _legacyUtil = require("./utils/legacyUtil"); var _default = _Table.default; exports.default = _default; },{"./Footer":775,"./Table":780,"./sugar/Column":790,"./sugar/ColumnGroup":791,"./utils/legacyUtil":794,"@babel/runtime/helpers/interopRequireDefault":192}],789:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var _getScrollBarSize = _interopRequireDefault(require("rc-util/lib/getScrollBarSize")); var _classnames = _interopRequireDefault(require("classnames")); var _css = require("rc-util/lib/Dom/css"); var _TableContext = _interopRequireDefault(require("./context/TableContext")); var _useFrame = require("./hooks/useFrame"); var StickyScrollBar = function StickyScrollBar(_ref, ref) { var _scrollBodyRef$curren, _scrollBodyRef$curren2; var scrollBodyRef = _ref.scrollBodyRef, onScroll = _ref.onScroll, offsetScroll = _ref.offsetScroll; var _React$useContext = React.useContext(_TableContext.default), prefixCls = _React$useContext.prefixCls; var bodyScrollWidth = ((_scrollBodyRef$curren = scrollBodyRef.current) === null || _scrollBodyRef$curren === void 0 ? void 0 : _scrollBodyRef$curren.scrollWidth) || 0; var bodyWidth = ((_scrollBodyRef$curren2 = scrollBodyRef.current) === null || _scrollBodyRef$curren2 === void 0 ? void 0 : _scrollBodyRef$curren2.clientWidth) || 0; var scrollBarWidth = bodyScrollWidth && bodyWidth * (bodyWidth / bodyScrollWidth); var scrollBarRef = React.useRef(); var _useFrameState = (0, _useFrame.useFrameState)({ scrollLeft: 0, isHiddenScrollBar: false }), _useFrameState2 = (0, _slicedToArray2.default)(_useFrameState, 2), frameState = _useFrameState2[0], setFrameState = _useFrameState2[1]; var refState = React.useRef({ delta: 0, x: 0 }); var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), isActive = _React$useState2[0], setActive = _React$useState2[1]; var onMouseUp = function onMouseUp() { setActive(false); }; var onMouseDown = function onMouseDown(event) { event.persist(); refState.current.delta = event.pageX - frameState.scrollLeft; refState.current.x = 0; setActive(true); event.preventDefault(); }; var onMouseMove = function onMouseMove(event) { var _window; // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons var _ref2 = event || ((_window = window) === null || _window === void 0 ? void 0 : _window.event), buttons = _ref2.buttons; if (!isActive || buttons === 0) { // If out body mouse up, we can set isActive false when mouse move if (isActive) { setActive(false); } return; } var left = refState.current.x + event.pageX - refState.current.x - refState.current.delta; if (left <= 0) { left = 0; } if (left + scrollBarWidth >= bodyWidth) { left = bodyWidth - scrollBarWidth; } onScroll({ scrollLeft: left / bodyWidth * (bodyScrollWidth + 2) }); refState.current.x = event.pageX; }; var onContainerScroll = function onContainerScroll() { var tableOffsetTop = (0, _css.getOffset)(scrollBodyRef.current).top; var tableBottomOffset = tableOffsetTop + scrollBodyRef.current.offsetHeight; var currentClientOffset = document.documentElement.scrollTop + window.innerHeight; if (tableBottomOffset - (0, _getScrollBarSize.default)() <= currentClientOffset || tableOffsetTop >= currentClientOffset - offsetScroll) { setFrameState(function (state) { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, state), {}, { isHiddenScrollBar: true }); }); } else { setFrameState(function (state) { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, state), {}, { isHiddenScrollBar: false }); }); } }; var setScrollLeft = function setScrollLeft(left) { setFrameState(function (state) { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, state), {}, { scrollLeft: left / bodyScrollWidth * bodyWidth || 0 }); }); }; React.useImperativeHandle(ref, function () { return { setScrollLeft: setScrollLeft }; }); React.useEffect(function () { var onMouseUpListener = (0, _addEventListener.default)(document.body, 'mouseup', onMouseUp, false); var onMouseMoveListener = (0, _addEventListener.default)(document.body, 'mousemove', onMouseMove, false); onContainerScroll(); return function () { onMouseUpListener.remove(); onMouseMoveListener.remove(); }; }, [scrollBarWidth, isActive]); React.useEffect(function () { var onScrollListener = (0, _addEventListener.default)(window, 'scroll', onContainerScroll, false); var onResizeListener = (0, _addEventListener.default)(window, 'resize', onContainerScroll, false); return function () { onScrollListener.remove(); onResizeListener.remove(); }; }, []); React.useEffect(function () { if (!frameState.isHiddenScrollBar) { setFrameState(function (state) { var _scrollBodyRef$curren3, _scrollBodyRef$curren4; return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, state), {}, { scrollLeft: scrollBodyRef.current.scrollLeft / ((_scrollBodyRef$curren3 = scrollBodyRef.current) === null || _scrollBodyRef$curren3 === void 0 ? void 0 : _scrollBodyRef$curren3.scrollWidth) * ((_scrollBodyRef$curren4 = scrollBodyRef.current) === null || _scrollBodyRef$curren4 === void 0 ? void 0 : _scrollBodyRef$curren4.clientWidth) }); }); } }, [frameState.isHiddenScrollBar]); if (bodyScrollWidth <= bodyWidth || !scrollBarWidth || frameState.isHiddenScrollBar) { return null; } return React.createElement("div", { style: { height: (0, _getScrollBarSize.default)(), width: bodyWidth, bottom: offsetScroll }, className: "".concat(prefixCls, "-sticky-scroll") }, React.createElement("div", { onMouseDown: onMouseDown, ref: scrollBarRef, className: (0, _classnames.default)("".concat(prefixCls, "-sticky-scroll-bar"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-sticky-scroll-bar-active"), isActive)), style: { width: "".concat(scrollBarWidth, "px"), transform: "translate3d(".concat(frameState.scrollLeft, "px, 0, 0)") } })); }; var _default = React.forwardRef(StickyScrollBar); exports.default = _default; },{"./context/TableContext":783,"./hooks/useFrame":785,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-util/lib/Dom/addEventListener":859,"rc-util/lib/Dom/css":862,"rc-util/lib/getScrollBarSize":869,"react":"react"}],790:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /* istanbul ignore next */ /** * This is a syntactic sugar for `columns` prop. * So HOC will not work on this. */ // eslint-disable-next-line @typescript-eslint/no-unused-vars function Column(_) { return null; } var _default = Column; exports.default = _default; },{}],791:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /* istanbul ignore next */ /** * This is a syntactic sugar for `columns` prop. * So HOC will not work on this. */ // eslint-disable-next-line @typescript-eslint/no-unused-vars function ColumnGroup(_) { return null; } var _default = ColumnGroup; exports.default = _default; },{}],792:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.renderExpandIcon = renderExpandIcon; exports.findAllChildrenKeys = findAllChildrenKeys; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); function renderExpandIcon(_ref) { var _classNames; var prefixCls = _ref.prefixCls, record = _ref.record, onExpand = _ref.onExpand, expanded = _ref.expanded, expandable = _ref.expandable; var expandClassName = "".concat(prefixCls, "-row-expand-icon"); if (!expandable) { return React.createElement("span", { className: (0, _classnames.default)(expandClassName, "".concat(prefixCls, "-row-spaced")) }); } var onClick = function onClick(event) { onExpand(record, event); event.stopPropagation(); }; return React.createElement("span", { className: (0, _classnames.default)(expandClassName, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-row-expanded"), expanded), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-row-collapsed"), !expanded), _classNames)), onClick: onClick }); } function findAllChildrenKeys(data, getRowKey, childrenColumnName) { var keys = []; function dig(list) { (list || []).forEach(function (item, index) { keys.push(getRowKey(item, index)); dig(item[childrenColumnName]); }); } dig(data); return keys; } },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],793:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getCellFixedInfo = getCellFixedInfo; function getCellFixedInfo(colStart, colEnd, columns, stickyOffsets, direction) { var startColumn = columns[colStart] || {}; var endColumn = columns[colEnd] || {}; var fixLeft; var fixRight; if (startColumn.fixed === 'left') { fixLeft = stickyOffsets.left[colStart]; } else if (endColumn.fixed === 'right') { fixRight = stickyOffsets.right[colEnd]; } var lastFixLeft = false; var firstFixRight = false; var lastFixRight = false; var firstFixLeft = false; var nextColumn = columns[colEnd + 1]; var prevColumn = columns[colStart - 1]; if (direction === 'rtl') { if (fixLeft !== undefined) { var prevFixLeft = prevColumn && prevColumn.fixed === 'left'; firstFixLeft = !prevFixLeft; } else if (fixRight !== undefined) { var nextFixRight = nextColumn && nextColumn.fixed === 'right'; lastFixRight = !nextFixRight; } } else if (fixLeft !== undefined) { var nextFixLeft = nextColumn && nextColumn.fixed === 'left'; lastFixLeft = !nextFixLeft; } else if (fixRight !== undefined) { var prevFixRight = prevColumn && prevColumn.fixed === 'right'; firstFixRight = !prevFixRight; } return { fixLeft: fixLeft, fixRight: fixRight, lastFixLeft: lastFixLeft, firstFixRight: firstFixRight, lastFixRight: lastFixRight, firstFixLeft: firstFixLeft, isSticky: stickyOffsets.isSticky }; } },{}],794:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getExpandableProps = getExpandableProps; exports.getDataAndAriaProps = getDataAndAriaProps; exports.INTERNAL_COL_DEFINE = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var INTERNAL_COL_DEFINE = 'RC_TABLE_INTERNAL_COL_DEFINE'; exports.INTERNAL_COL_DEFINE = INTERNAL_COL_DEFINE; function getExpandableProps(props) { var expandable = props.expandable, legacyExpandableConfig = (0, _objectWithoutProperties2.default)(props, ["expandable"]); if ('expandable' in props) { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, legacyExpandableConfig), expandable); } if (process.env.NODE_ENV !== 'production' && ['indentSize', 'expandedRowKeys', 'defaultExpandedRowKeys', 'defaultExpandAllRows', 'expandedRowRender', 'expandRowByClick', 'expandIcon', 'onExpand', 'onExpandedRowsChange', 'expandedRowClassName', 'expandIconColumnIndex'].some(function (prop) { return prop in props; })) { (0, _warning.default)(false, 'expanded related props have been moved into `expandable`.'); } return legacyExpandableConfig; } /** * Returns only data- and aria- key/value pairs * @param {object} props */ function getDataAndAriaProps(props) { /* eslint-disable no-param-reassign */ return Object.keys(props).reduce(function (memo, key) { if (key.substr(0, 5) === 'data-' || key.substr(0, 5) === 'aria-') { memo[key] = props[key]; } return memo; }, {}); /* eslint-enable */ } }).call(this,require('_process')) },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"_process":1,"rc-util/lib/warning":879}],795:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getPathValue = getPathValue; exports.getColumnsKey = getColumnsKey; exports.mergeObject = mergeObject; exports.validateValue = validateValue; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var INTERNAL_KEY_PREFIX = 'RC_TABLE_KEY'; function toArray(arr) { if (arr === undefined || arr === null) { return []; } return Array.isArray(arr) ? arr : [arr]; } function getPathValue(record, path) { // Skip if path is empty if (!path && typeof path !== 'number') { return record; } var pathList = toArray(path); var current = record; for (var i = 0; i < pathList.length; i += 1) { if (!current) { return null; } var prop = pathList[i]; current = current[prop]; } return current; } function getColumnsKey(columns) { var columnKeys = []; var keys = {}; columns.forEach(function (column) { var _ref = column || {}, key = _ref.key, dataIndex = _ref.dataIndex; var mergedKey = key || toArray(dataIndex).join('-') || INTERNAL_KEY_PREFIX; while (keys[mergedKey]) { mergedKey = "".concat(mergedKey, "_next"); } keys[mergedKey] = true; columnKeys.push(mergedKey); }); return columnKeys; } function mergeObject() { var merged = {}; /* eslint-disable no-param-reassign */ function fillProps(obj, clone) { if (clone) { Object.keys(clone).forEach(function (key) { var value = clone[key]; if (value && (0, _typeof2.default)(value) === 'object') { obj[key] = obj[key] || {}; fillProps(obj[key], value); } else { obj[key] = value; } }); } } /* eslint-enable */ for (var _len = arguments.length, objects = new Array(_len), _key = 0; _key < _len; _key++) { objects[_key] = arguments[_key]; } objects.forEach(function (clone) { fillProps(merged, clone); }); return merged; } function validateValue(val) { return val !== null && val !== undefined; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/typeof":208}],796:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); var _default = (0, _react.createContext)(null); exports.default = _default; },{"react":"react"}],797:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); function AddButton(_ref, ref) { var prefixCls = _ref.prefixCls, editable = _ref.editable, locale = _ref.locale, style = _ref.style; if (!editable || editable.showAdd === false) { return null; } return React.createElement("button", { ref: ref, type: "button", className: "".concat(prefixCls, "-nav-add"), style: style, "aria-label": (locale === null || locale === void 0 ? void 0 : locale.addAriaLabel) || 'Add tab', onClick: function onClick(event) { editable.onEdit('add', { event: event }); } }, editable.addIcon || '+'); } var _default = React.forwardRef(AddButton); exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],798:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _rcMenu = _interopRequireWildcard(require("rc-menu")); var _rcDropdown = _interopRequireDefault(require("rc-dropdown")); var _AddButton = _interopRequireDefault(require("./AddButton")); function OperationNode(_ref, ref) { var prefixCls = _ref.prefixCls, id = _ref.id, tabs = _ref.tabs, locale = _ref.locale, mobile = _ref.mobile, _ref$moreIcon = _ref.moreIcon, moreIcon = _ref$moreIcon === void 0 ? 'More' : _ref$moreIcon, moreTransitionName = _ref.moreTransitionName, style = _ref.style, className = _ref.className, editable = _ref.editable, tabBarGutter = _ref.tabBarGutter, rtl = _ref.rtl, onTabClick = _ref.onTabClick; // ======================== Dropdown ======================== var _useState = (0, React.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), open = _useState2[0], setOpen = _useState2[1]; var _useState3 = (0, React.useState)(null), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), selectedKey = _useState4[0], setSelectedKey = _useState4[1]; var popupId = "".concat(id, "-more-popup"); var dropdownPrefix = "".concat(prefixCls, "-dropdown"); var selectedItemId = selectedKey !== null ? "".concat(popupId, "-").concat(selectedKey) : null; var dropdownAriaLabel = locale === null || locale === void 0 ? void 0 : locale.dropdownAriaLabel; var menu = React.createElement(_rcMenu.default, { onClick: function onClick(_ref2) { var key = _ref2.key, domEvent = _ref2.domEvent; onTabClick(key, domEvent); setOpen(false); }, id: popupId, tabIndex: -1, role: "listbox", "aria-activedescendant": selectedItemId, selectedKeys: [selectedKey], "aria-label": dropdownAriaLabel !== undefined ? dropdownAriaLabel : 'expanded dropdown' }, tabs.map(function (tab) { return React.createElement(_rcMenu.MenuItem, { key: tab.key, id: "".concat(popupId, "-").concat(tab.key), role: "option", "aria-controls": id && "".concat(id, "-panel-").concat(tab.key), disabled: tab.disabled }, tab.tab); })); function selectOffset(offset) { var enabledTabs = tabs.filter(function (tab) { return !tab.disabled; }); var selectedIndex = enabledTabs.findIndex(function (tab) { return tab.key === selectedKey; }) || 0; var len = enabledTabs.length; for (var i = 0; i < len; i += 1) { selectedIndex = (selectedIndex + offset + len) % len; var tab = enabledTabs[selectedIndex]; if (!tab.disabled) { setSelectedKey(tab.key); return; } } } function onKeyDown(e) { var which = e.which; if (!open) { if ([_KeyCode.default.DOWN, _KeyCode.default.SPACE, _KeyCode.default.ENTER].includes(which)) { setOpen(true); e.preventDefault(); } return; } switch (which) { case _KeyCode.default.UP: selectOffset(-1); e.preventDefault(); break; case _KeyCode.default.DOWN: selectOffset(1); e.preventDefault(); break; case _KeyCode.default.ESC: setOpen(false); break; case _KeyCode.default.SPACE: case _KeyCode.default.ENTER: if (selectedKey !== null) onTabClick(selectedKey, e); break; } } // ========================= Effect ========================= (0, React.useEffect)(function () { // We use query element here to avoid React strict warning var ele = document.getElementById(selectedItemId); if (ele && ele.scrollIntoView) { ele.scrollIntoView(false); } }, [selectedKey]); (0, React.useEffect)(function () { if (!open) { setSelectedKey(null); } }, [open]); // ========================= Render ========================= var moreStyle = (0, _defineProperty2.default)({}, rtl ? 'marginLeft' : 'marginRight', tabBarGutter); if (!tabs.length) { moreStyle.visibility = 'hidden'; moreStyle.order = 1; } var overlayClassName = (0, _classnames.default)((0, _defineProperty2.default)({}, "".concat(dropdownPrefix, "-rtl"), rtl)); var moreNode = mobile ? null : React.createElement(_rcDropdown.default, { prefixCls: dropdownPrefix, overlay: menu, trigger: ['hover'], visible: open, transitionName: moreTransitionName, onVisibleChange: setOpen, overlayClassName: overlayClassName, mouseEnterDelay: 0.1, mouseLeaveDelay: 0.1 }, React.createElement("button", { type: "button", className: "".concat(prefixCls, "-nav-more"), style: moreStyle, tabIndex: -1, "aria-hidden": "true", "aria-haspopup": "listbox", "aria-controls": popupId, id: "".concat(id, "-more"), "aria-expanded": open, onKeyDown: onKeyDown }, moreIcon)); return React.createElement("div", { className: (0, _classnames.default)("".concat(prefixCls, "-nav-operations"), className), style: style, ref: ref }, moreNode, React.createElement(_AddButton.default, { prefixCls: prefixCls, locale: locale, editable: editable })); } var _default = React.forwardRef(OperationNode); exports.default = _default; },{"./AddButton":797,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-dropdown":611,"rc-menu":647,"rc-util/lib/KeyCode":865,"react":"react"}],799:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); function TabNode(_ref, ref) { var _classNames; var prefixCls = _ref.prefixCls, id = _ref.id, active = _ref.active, rtl = _ref.rtl, _ref$tab = _ref.tab, key = _ref$tab.key, tab = _ref$tab.tab, disabled = _ref$tab.disabled, closeIcon = _ref$tab.closeIcon, tabBarGutter = _ref.tabBarGutter, tabPosition = _ref.tabPosition, closable = _ref.closable, renderWrapper = _ref.renderWrapper, removeAriaLabel = _ref.removeAriaLabel, editable = _ref.editable, onClick = _ref.onClick, onRemove = _ref.onRemove, onFocus = _ref.onFocus; var tabPrefix = "".concat(prefixCls, "-tab"); React.useEffect(function () { return onRemove; }, []); var nodeStyle = {}; if (tabPosition === 'top' || tabPosition === 'bottom') { nodeStyle[rtl ? 'marginLeft' : 'marginRight'] = tabBarGutter; } else { nodeStyle.marginBottom = tabBarGutter; } var removable = editable && closable !== false && !disabled; function onInternalClick(e) { if (disabled) return; onClick(e); } function onRemoveTab(event) { event.preventDefault(); event.stopPropagation(); editable.onEdit('remove', { key: key, event: event }); } var node = React.createElement("div", { key: key, ref: ref, className: (0, _classnames.default)(tabPrefix, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(tabPrefix, "-with-remove"), removable), (0, _defineProperty2.default)(_classNames, "".concat(tabPrefix, "-active"), active), (0, _defineProperty2.default)(_classNames, "".concat(tabPrefix, "-disabled"), disabled), _classNames)), style: nodeStyle, onClick: onInternalClick }, React.createElement("div", { role: "tab", "aria-selected": active, id: id && "".concat(id, "-tab-").concat(key), className: "".concat(tabPrefix, "-btn"), "aria-controls": id && "".concat(id, "-panel-").concat(key), "aria-disabled": disabled, tabIndex: disabled ? null : 0, onClick: function onClick(e) { e.stopPropagation(); onInternalClick(e); }, onKeyDown: function onKeyDown(e) { if ([_KeyCode.default.SPACE, _KeyCode.default.ENTER].includes(e.which)) { e.preventDefault(); onInternalClick(e); } }, onFocus: onFocus }, tab), removable && React.createElement("button", { type: "button", "aria-label": removeAriaLabel || 'remove', tabIndex: 0, className: "".concat(tabPrefix, "-remove"), onClick: function onClick(e) { e.stopPropagation(); onRemoveTab(e); } }, closeIcon || editable.removeIcon || '×')); if (renderWrapper) { node = renderWrapper(node); } return node; } var _default = React.forwardRef(TabNode); exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"rc-util/lib/KeyCode":865,"react":"react"}],800:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _raf = _interopRequireDefault(require("raf")); var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer")); var _useRaf = _interopRequireWildcard(require("../hooks/useRaf")); var _TabNode = _interopRequireDefault(require("./TabNode")); var _useOffsets = _interopRequireDefault(require("../hooks/useOffsets")); var _useVisibleRange3 = _interopRequireDefault(require("../hooks/useVisibleRange")); var _OperationNode = _interopRequireDefault(require("./OperationNode")); var _TabContext = _interopRequireDefault(require("../TabContext")); var _useTouchMove = _interopRequireDefault(require("../hooks/useTouchMove")); var _useRefs3 = _interopRequireDefault(require("../hooks/useRefs")); var _AddButton = _interopRequireDefault(require("./AddButton")); var _useSyncState5 = _interopRequireDefault(require("../hooks/useSyncState")); var ExtraContent = function ExtraContent(_ref) { var position = _ref.position, prefixCls = _ref.prefixCls, extra = _ref.extra; if (!extra) return null; var content; var assertExtra = extra; if (position === 'right') { content = assertExtra.right || !assertExtra.left && assertExtra || null; } if (position === 'left') { content = assertExtra.left || null; } return content ? React.createElement("div", { className: "".concat(prefixCls, "-extra-content") }, content) : null; }; function TabNavList(props, ref) { var _classNames; var _React$useContext = React.useContext(_TabContext.default), prefixCls = _React$useContext.prefixCls, tabs = _React$useContext.tabs; var className = props.className, style = props.style, id = props.id, animated = props.animated, activeKey = props.activeKey, rtl = props.rtl, extra = props.extra, editable = props.editable, locale = props.locale, tabPosition = props.tabPosition, tabBarGutter = props.tabBarGutter, children = props.children, onTabClick = props.onTabClick, onTabScroll = props.onTabScroll; var tabsWrapperRef = (0, React.useRef)(); var tabListRef = (0, React.useRef)(); var operationsRef = (0, React.useRef)(); var innerAddButtonRef = (0, React.useRef)(); var _useRefs = (0, _useRefs3.default)(), _useRefs2 = (0, _slicedToArray2.default)(_useRefs, 2), getBtnRef = _useRefs2[0], removeBtnRef = _useRefs2[1]; var tabPositionTopOrBottom = tabPosition === 'top' || tabPosition === 'bottom'; var _useSyncState = (0, _useSyncState5.default)(0, function (next, prev) { if (tabPositionTopOrBottom && onTabScroll) { onTabScroll({ direction: next > prev ? 'left' : 'right' }); } }), _useSyncState2 = (0, _slicedToArray2.default)(_useSyncState, 2), transformLeft = _useSyncState2[0], setTransformLeft = _useSyncState2[1]; var _useSyncState3 = (0, _useSyncState5.default)(0, function (next, prev) { if (!tabPositionTopOrBottom && onTabScroll) { onTabScroll({ direction: next > prev ? 'top' : 'bottom' }); } }), _useSyncState4 = (0, _slicedToArray2.default)(_useSyncState3, 2), transformTop = _useSyncState4[0], setTransformTop = _useSyncState4[1]; var _useState = (0, React.useState)(0), _useState2 = (0, _slicedToArray2.default)(_useState, 2), wrapperScrollWidth = _useState2[0], setWrapperScrollWidth = _useState2[1]; var _useState3 = (0, React.useState)(0), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), wrapperScrollHeight = _useState4[0], setWrapperScrollHeight = _useState4[1]; var _useState5 = (0, React.useState)(0), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), wrapperContentWidth = _useState6[0], setWrapperContentWidth = _useState6[1]; var _useState7 = (0, React.useState)(0), _useState8 = (0, _slicedToArray2.default)(_useState7, 2), wrapperContentHeight = _useState8[0], setWrapperContentHeight = _useState8[1]; var _useState9 = (0, React.useState)(null), _useState10 = (0, _slicedToArray2.default)(_useState9, 2), wrapperWidth = _useState10[0], setWrapperWidth = _useState10[1]; var _useState11 = (0, React.useState)(null), _useState12 = (0, _slicedToArray2.default)(_useState11, 2), wrapperHeight = _useState12[0], setWrapperHeight = _useState12[1]; var _useState13 = (0, React.useState)(0), _useState14 = (0, _slicedToArray2.default)(_useState13, 2), addWidth = _useState14[0], setAddWidth = _useState14[1]; var _useState15 = (0, React.useState)(0), _useState16 = (0, _slicedToArray2.default)(_useState15, 2), addHeight = _useState16[0], setAddHeight = _useState16[1]; var _useRafState = (0, _useRaf.useRafState)(new Map()), _useRafState2 = (0, _slicedToArray2.default)(_useRafState, 2), tabSizes = _useRafState2[0], setTabSizes = _useRafState2[1]; var tabOffsets = (0, _useOffsets.default)(tabs, tabSizes, wrapperScrollWidth); // ========================== Util ========================= var operationsHiddenClassName = "".concat(prefixCls, "-nav-operations-hidden"); var transformMin = 0; var transformMax = 0; if (!tabPositionTopOrBottom) { transformMin = Math.min(0, wrapperHeight - wrapperScrollHeight); transformMax = 0; } else if (rtl) { transformMin = 0; transformMax = Math.max(0, wrapperScrollWidth - wrapperWidth); } else { transformMin = Math.min(0, wrapperWidth - wrapperScrollWidth); transformMax = 0; } function alignInRange(value) { if (value < transformMin) { return [transformMin, false]; } if (value > transformMax) { return [transformMax, false]; } return [value, true]; } // ========================= Mobile ======================== var touchMovingRef = (0, React.useRef)(); var _useState17 = (0, React.useState)(), _useState18 = (0, _slicedToArray2.default)(_useState17, 2), lockAnimation = _useState18[0], setLockAnimation = _useState18[1]; function doLockAnimation() { setLockAnimation(Date.now()); } function clearTouchMoving() { window.clearTimeout(touchMovingRef.current); } (0, _useTouchMove.default)(tabsWrapperRef, function (offsetX, offsetY) { var preventDefault = false; function doMove(setState, offset) { setState(function (value) { var _alignInRange = alignInRange(value + offset), _alignInRange2 = (0, _slicedToArray2.default)(_alignInRange, 2), newValue = _alignInRange2[0], needPrevent = _alignInRange2[1]; preventDefault = needPrevent; return newValue; }); } if (tabPositionTopOrBottom) { // Skip scroll if place is enough if (wrapperWidth >= wrapperScrollWidth) { return preventDefault; } doMove(setTransformLeft, offsetX); } else { if (wrapperHeight >= wrapperScrollHeight) { return preventDefault; } doMove(setTransformTop, offsetY); } clearTouchMoving(); doLockAnimation(); return preventDefault; }); (0, React.useEffect)(function () { clearTouchMoving(); if (lockAnimation) { touchMovingRef.current = window.setTimeout(function () { setLockAnimation(0); }, 100); } return clearTouchMoving; }, [lockAnimation]); // ========================= Scroll ======================== function scrollToTab() { var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : activeKey; var tabOffset = tabOffsets.get(key); if (!tabOffset) return; if (tabPositionTopOrBottom) { // ============ Align with top & bottom ============ var newTransform = transformLeft; // RTL if (rtl) { if (tabOffset.right < transformLeft) { newTransform = tabOffset.right; } else if (tabOffset.right + tabOffset.width > transformLeft + wrapperWidth) { newTransform = tabOffset.right + tabOffset.width - wrapperWidth; } } // LTR else if (tabOffset.left < -transformLeft) { newTransform = -tabOffset.left; } else if (tabOffset.left + tabOffset.width > -transformLeft + wrapperWidth) { newTransform = -(tabOffset.left + tabOffset.width - wrapperWidth); } setTransformTop(0); setTransformLeft(alignInRange(newTransform)[0]); } else { // ============ Align with left & right ============ var _newTransform = transformTop; if (tabOffset.top < -transformTop) { _newTransform = -tabOffset.top; } else if (tabOffset.top + tabOffset.height > -transformTop + wrapperHeight) { _newTransform = -(tabOffset.top + tabOffset.height - wrapperHeight); } setTransformLeft(0); setTransformTop(alignInRange(_newTransform)[0]); } } // ========================== Tab ========================== // Render tab node & collect tab offset var _useVisibleRange = (0, _useVisibleRange3.default)(tabOffsets, { width: wrapperWidth, height: wrapperHeight, left: transformLeft, top: transformTop }, { width: wrapperContentWidth, height: wrapperContentHeight }, { width: addWidth, height: addHeight }, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, { tabs: tabs })), _useVisibleRange2 = (0, _slicedToArray2.default)(_useVisibleRange, 2), visibleStart = _useVisibleRange2[0], visibleEnd = _useVisibleRange2[1]; var tabNodes = tabs.map(function (tab) { var key = tab.key; return React.createElement(_TabNode.default, { id: id, prefixCls: prefixCls, key: key, rtl: rtl, tab: tab, closable: tab.closable, editable: editable, active: key === activeKey, tabPosition: tabPosition, tabBarGutter: tabBarGutter, renderWrapper: children, removeAriaLabel: locale === null || locale === void 0 ? void 0 : locale.removeAriaLabel, ref: getBtnRef(key), onClick: function onClick(e) { onTabClick(key, e); }, onRemove: function onRemove() { removeBtnRef(key); }, onFocus: function onFocus() { scrollToTab(key); doLockAnimation(); // Focus element will make scrollLeft change which we should reset back if (!rtl) { tabsWrapperRef.current.scrollLeft = 0; } tabsWrapperRef.current.scrollTop = 0; } }); }); var onListHolderResize = (0, _useRaf.default)(function () { var _tabsWrapperRef$curre, _tabsWrapperRef$curre2, _innerAddButtonRef$cu, _innerAddButtonRef$cu2, _operationsRef$curren, _operationsRef$curren2, _tabListRef$current, _tabListRef$current2, _operationsRef$curren3; // Update wrapper records var offsetWidth = ((_tabsWrapperRef$curre = tabsWrapperRef.current) === null || _tabsWrapperRef$curre === void 0 ? void 0 : _tabsWrapperRef$curre.offsetWidth) || 0; var offsetHeight = ((_tabsWrapperRef$curre2 = tabsWrapperRef.current) === null || _tabsWrapperRef$curre2 === void 0 ? void 0 : _tabsWrapperRef$curre2.offsetHeight) || 0; var newAddWidth = ((_innerAddButtonRef$cu = innerAddButtonRef.current) === null || _innerAddButtonRef$cu === void 0 ? void 0 : _innerAddButtonRef$cu.offsetWidth) || 0; var newAddHeight = ((_innerAddButtonRef$cu2 = innerAddButtonRef.current) === null || _innerAddButtonRef$cu2 === void 0 ? void 0 : _innerAddButtonRef$cu2.offsetHeight) || 0; var newOperationWidth = ((_operationsRef$curren = operationsRef.current) === null || _operationsRef$curren === void 0 ? void 0 : _operationsRef$curren.offsetWidth) || 0; var newOperationHeight = ((_operationsRef$curren2 = operationsRef.current) === null || _operationsRef$curren2 === void 0 ? void 0 : _operationsRef$curren2.offsetHeight) || 0; setWrapperWidth(offsetWidth); setWrapperHeight(offsetHeight); setAddWidth(newAddWidth); setAddHeight(newAddHeight); var newWrapperScrollWidth = (((_tabListRef$current = tabListRef.current) === null || _tabListRef$current === void 0 ? void 0 : _tabListRef$current.offsetWidth) || 0) - newAddWidth; var newWrapperScrollHeight = (((_tabListRef$current2 = tabListRef.current) === null || _tabListRef$current2 === void 0 ? void 0 : _tabListRef$current2.offsetHeight) || 0) - newAddHeight; setWrapperScrollWidth(newWrapperScrollWidth); setWrapperScrollHeight(newWrapperScrollHeight); var isOperationHidden = (_operationsRef$curren3 = operationsRef.current) === null || _operationsRef$curren3 === void 0 ? void 0 : _operationsRef$curren3.className.includes(operationsHiddenClassName); setWrapperContentWidth(newWrapperScrollWidth - (isOperationHidden ? 0 : newOperationWidth)); setWrapperContentHeight(newWrapperScrollHeight - (isOperationHidden ? 0 : newOperationHeight)); // Update buttons records setTabSizes(function () { var newSizes = new Map(); tabs.forEach(function (_ref2) { var key = _ref2.key; var btnNode = getBtnRef(key).current; if (btnNode) { newSizes.set(key, { width: btnNode.offsetWidth, height: btnNode.offsetHeight, left: btnNode.offsetLeft, top: btnNode.offsetTop }); } }); return newSizes; }); }); // ======================== Dropdown ======================= var startHiddenTabs = tabs.slice(0, visibleStart); var endHiddenTabs = tabs.slice(visibleEnd + 1); var hiddenTabs = [].concat((0, _toConsumableArray2.default)(startHiddenTabs), (0, _toConsumableArray2.default)(endHiddenTabs)); // =================== Link & Operations =================== var _useState19 = (0, React.useState)(), _useState20 = (0, _slicedToArray2.default)(_useState19, 2), inkStyle = _useState20[0], setInkStyle = _useState20[1]; var activeTabOffset = tabOffsets.get(activeKey); // Delay set ink style to avoid remove tab blink var inkBarRafRef = (0, React.useRef)(); function cleanInkBarRaf() { _raf.default.cancel(inkBarRafRef.current); } (0, React.useEffect)(function () { var newInkStyle = {}; if (activeTabOffset) { if (tabPositionTopOrBottom) { if (rtl) { newInkStyle.right = activeTabOffset.right; } else { newInkStyle.left = activeTabOffset.left; } newInkStyle.width = activeTabOffset.width; } else { newInkStyle.top = activeTabOffset.top; newInkStyle.height = activeTabOffset.height; } } cleanInkBarRaf(); inkBarRafRef.current = (0, _raf.default)(function () { setInkStyle(newInkStyle); }); return cleanInkBarRaf; }, [activeTabOffset, tabPositionTopOrBottom, rtl]); // ========================= Effect ======================== (0, React.useEffect)(function () { scrollToTab(); }, [activeKey, activeTabOffset, tabOffsets, tabPositionTopOrBottom]); // Should recalculate when rtl changed (0, React.useEffect)(function () { onListHolderResize(); }, [rtl, tabBarGutter, activeKey, tabs.map(function (tab) { return tab.key; }).join('_')]); // ========================= Render ======================== var hasDropdown = !!hiddenTabs.length; var wrapPrefix = "".concat(prefixCls, "-nav-wrap"); var pingLeft; var pingRight; var pingTop; var pingBottom; if (tabPositionTopOrBottom) { if (rtl) { pingRight = transformLeft > 0; pingLeft = transformLeft + wrapperWidth < wrapperScrollWidth; } else { pingLeft = transformLeft < 0; pingRight = -transformLeft + wrapperWidth < wrapperScrollWidth; } } else { pingTop = transformTop < 0; pingBottom = -transformTop + wrapperHeight < wrapperScrollHeight; } /* eslint-disable jsx-a11y/interactive-supports-focus */ return React.createElement("div", { ref: ref, role: "tablist", className: (0, _classnames.default)("".concat(prefixCls, "-nav"), className), style: style, onKeyDown: function onKeyDown() { // No need animation when use keyboard doLockAnimation(); } }, React.createElement(ExtraContent, { position: "left", extra: extra, prefixCls: prefixCls }), React.createElement(_rcResizeObserver.default, { onResize: onListHolderResize }, React.createElement("div", { className: (0, _classnames.default)(wrapPrefix, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(wrapPrefix, "-ping-left"), pingLeft), (0, _defineProperty2.default)(_classNames, "".concat(wrapPrefix, "-ping-right"), pingRight), (0, _defineProperty2.default)(_classNames, "".concat(wrapPrefix, "-ping-top"), pingTop), (0, _defineProperty2.default)(_classNames, "".concat(wrapPrefix, "-ping-bottom"), pingBottom), _classNames)), ref: tabsWrapperRef }, React.createElement(_rcResizeObserver.default, { onResize: onListHolderResize }, React.createElement("div", { ref: tabListRef, className: "".concat(prefixCls, "-nav-list"), style: { transform: "translate(".concat(transformLeft, "px, ").concat(transformTop, "px)"), transition: lockAnimation ? 'none' : undefined } }, tabNodes, React.createElement(_AddButton.default, { ref: innerAddButtonRef, prefixCls: prefixCls, locale: locale, editable: editable, style: { visibility: hasDropdown ? 'hidden' : null } }), React.createElement("div", { className: (0, _classnames.default)("".concat(prefixCls, "-ink-bar"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-ink-bar-animated"), animated.inkBar)), style: inkStyle }))))), React.createElement(_OperationNode.default, Object.assign({}, props, { ref: operationsRef, prefixCls: prefixCls, tabs: hiddenTabs, className: !hasDropdown && operationsHiddenClassName })), React.createElement(ExtraContent, { position: "right", extra: extra, prefixCls: prefixCls })); /* eslint-enable */ } var _default = React.forwardRef(TabNavList); exports.default = _default; },{"../TabContext":796,"../hooks/useOffsets":804,"../hooks/useRaf":805,"../hooks/useRefs":806,"../hooks/useSyncState":807,"../hooks/useTouchMove":808,"../hooks/useVisibleRange":809,"./AddButton":797,"./OperationNode":798,"./TabNode":799,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"classnames":455,"raf":581,"rc-resize-observer":729,"react":"react"}],801:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = TabPane; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); function TabPane(_ref) { var prefixCls = _ref.prefixCls, forceRender = _ref.forceRender, className = _ref.className, style = _ref.style, id = _ref.id, active = _ref.active, animated = _ref.animated, destroyInactiveTabPane = _ref.destroyInactiveTabPane, tabKey = _ref.tabKey, children = _ref.children; var _React$useState = React.useState(forceRender), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), visited = _React$useState2[0], setVisited = _React$useState2[1]; React.useEffect(function () { if (active) { setVisited(true); } else if (destroyInactiveTabPane) { setVisited(false); } }, [active, destroyInactiveTabPane]); var mergedStyle = {}; if (!active) { if (animated) { mergedStyle.visibility = 'hidden'; mergedStyle.height = 0; mergedStyle.overflowY = 'hidden'; } else { mergedStyle.display = 'none'; } } return React.createElement("div", { id: id && "".concat(id, "-panel-").concat(tabKey), role: "tabpanel", tabIndex: active ? 0 : -1, "aria-labelledby": id && "".concat(id, "-tab-").concat(tabKey), "aria-hidden": !active, style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, mergedStyle), style), className: (0, _classnames.default)("".concat(prefixCls, "-tabpane"), active && "".concat(prefixCls, "-tabpane-active"), className) }, (active || visited || forceRender) && children); } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"react":"react"}],802:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = TabPanelList; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _TabContext = _interopRequireDefault(require("../TabContext")); function TabPanelList(_ref) { var id = _ref.id, activeKey = _ref.activeKey, animated = _ref.animated, tabPosition = _ref.tabPosition, rtl = _ref.rtl, destroyInactiveTabPane = _ref.destroyInactiveTabPane; var _React$useContext = React.useContext(_TabContext.default), prefixCls = _React$useContext.prefixCls, tabs = _React$useContext.tabs; var tabPaneAnimated = animated.tabPane; var activeIndex = tabs.findIndex(function (tab) { return tab.key === activeKey; }); return React.createElement("div", { className: (0, _classnames.default)("".concat(prefixCls, "-content-holder")) }, React.createElement("div", { className: (0, _classnames.default)("".concat(prefixCls, "-content"), "".concat(prefixCls, "-content-").concat(tabPosition), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-content-animated"), tabPaneAnimated)), style: activeIndex && tabPaneAnimated ? (0, _defineProperty2.default)({}, rtl ? 'marginRight' : 'marginLeft', "-".concat(activeIndex, "00%")) : null }, tabs.map(function (tab) { return React.cloneElement(tab.node, { key: tab.key, prefixCls: prefixCls, tabKey: tab.key, id: id, animated: tabPaneAnimated, active: tab.key === activeKey, destroyInactiveTabPane: destroyInactiveTabPane }); }))); } },{"../TabContext":796,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],803:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _TabNavList = _interopRequireDefault(require("./TabNavList")); var _TabPanelList = _interopRequireDefault(require("./TabPanelList")); var _TabPane = _interopRequireDefault(require("./TabPanelList/TabPane")); var _TabContext = _interopRequireDefault(require("./TabContext")); var _useTouchMove = require("./hooks/useTouchMove"); // Accessibility https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Tab_Role /** * Should added antd: * - type * * Removed: * - onNextClick * - onPrevClick * - keyboard */ // Used for accessibility var uuid = 0; function parseTabList(children) { return (0, _toArray.default)(children).map(function (node) { if (React.isValidElement(node)) { var key = node.key !== undefined ? String(node.key) : undefined; return (0, _objectSpread2.default)((0, _objectSpread2.default)({ key: key }, node.props), {}, { node: node }); } return null; }).filter(function (tab) { return tab; }); } function Tabs(_ref, ref) { var _classNames; var id = _ref.id, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? 'rc-tabs' : _ref$prefixCls, className = _ref.className, children = _ref.children, direction = _ref.direction, activeKey = _ref.activeKey, defaultActiveKey = _ref.defaultActiveKey, editable = _ref.editable, animated = _ref.animated, _ref$tabPosition = _ref.tabPosition, tabPosition = _ref$tabPosition === void 0 ? 'top' : _ref$tabPosition, tabBarGutter = _ref.tabBarGutter, tabBarStyle = _ref.tabBarStyle, tabBarExtraContent = _ref.tabBarExtraContent, locale = _ref.locale, moreIcon = _ref.moreIcon, moreTransitionName = _ref.moreTransitionName, destroyInactiveTabPane = _ref.destroyInactiveTabPane, renderTabBar = _ref.renderTabBar, onChange = _ref.onChange, onTabClick = _ref.onTabClick, onTabScroll = _ref.onTabScroll, restProps = (0, _objectWithoutProperties2.default)(_ref, ["id", "prefixCls", "className", "children", "direction", "activeKey", "defaultActiveKey", "editable", "animated", "tabPosition", "tabBarGutter", "tabBarStyle", "tabBarExtraContent", "locale", "moreIcon", "moreTransitionName", "destroyInactiveTabPane", "renderTabBar", "onChange", "onTabClick", "onTabScroll"]); var tabs = parseTabList(children); var rtl = direction === 'rtl'; var mergedAnimated; if (animated === false) { mergedAnimated = { inkBar: false, tabPane: false }; } else { mergedAnimated = (0, _objectSpread2.default)({ inkBar: true, tabPane: false }, animated !== true ? animated : null); } // ======================== Mobile ======================== var _useState = (0, React.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), mobile = _useState2[0], setMobile = _useState2[1]; (0, React.useEffect)(function () { // Only update on the client side setMobile((0, _useTouchMove.isMobile)()); }, []); // ====================== Active Key ====================== var _useMergedState = (0, _useMergedState5.default)(function () { var _tabs$; return (_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : _tabs$.key; }, { value: activeKey, defaultValue: defaultActiveKey }), _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2), mergedActiveKey = _useMergedState2[0], setMergedActiveKey = _useMergedState2[1]; var _useState3 = (0, React.useState)(function () { return tabs.findIndex(function (tab) { return tab.key === mergedActiveKey; }); }), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), activeIndex = _useState4[0], setActiveIndex = _useState4[1]; // Reset active key if not exist anymore (0, React.useEffect)(function () { var newActiveIndex = tabs.findIndex(function (tab) { return tab.key === mergedActiveKey; }); if (newActiveIndex === -1) { var _tabs$newActiveIndex; newActiveIndex = Math.max(0, Math.min(activeIndex, tabs.length - 1)); setMergedActiveKey((_tabs$newActiveIndex = tabs[newActiveIndex]) === null || _tabs$newActiveIndex === void 0 ? void 0 : _tabs$newActiveIndex.key); } setActiveIndex(newActiveIndex); }, [tabs.map(function (tab) { return tab.key; }).join('_'), mergedActiveKey, activeIndex]); // ===================== Accessibility ==================== var _useMergedState3 = (0, _useMergedState5.default)(null, { value: id }), _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2), mergedId = _useMergedState4[0], setMergedId = _useMergedState4[1]; var mergedTabPosition = tabPosition; if (mobile && !['left', 'right'].includes(tabPosition)) { mergedTabPosition = 'top'; } // Async generate id to avoid ssr mapping failed (0, React.useEffect)(function () { if (!id) { setMergedId("rc-tabs-".concat(process.env.NODE_ENV === 'test' ? 'test' : uuid)); uuid += 1; } }, []); // ======================== Events ======================== function onInternalTabClick(key, e) { onTabClick === null || onTabClick === void 0 ? void 0 : onTabClick(key, e); setMergedActiveKey(key); onChange === null || onChange === void 0 ? void 0 : onChange(key); } // ======================== Render ======================== var sharedProps = { id: mergedId, activeKey: mergedActiveKey, animated: mergedAnimated, tabPosition: mergedTabPosition, rtl: rtl, mobile: mobile }; var tabNavBar; var tabNavBarProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, sharedProps), {}, { editable: editable, locale: locale, moreIcon: moreIcon, moreTransitionName: moreTransitionName, tabBarGutter: tabBarGutter, onTabClick: onInternalTabClick, onTabScroll: onTabScroll, extra: tabBarExtraContent, style: tabBarStyle, panes: children }); if (renderTabBar) { tabNavBar = renderTabBar(tabNavBarProps, _TabNavList.default); } else { tabNavBar = React.createElement(_TabNavList.default, Object.assign({}, tabNavBarProps)); } return React.createElement(_TabContext.default.Provider, { value: { tabs: tabs, prefixCls: prefixCls } }, React.createElement("div", Object.assign({ ref: ref, id: id, className: (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-").concat(mergedTabPosition), (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-mobile"), mobile), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-editable"), editable), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-rtl"), rtl), _classNames), className) }, restProps), tabNavBar, React.createElement(_TabPanelList.default, Object.assign({ destroyInactiveTabPane: destroyInactiveTabPane }, sharedProps, { animated: mergedAnimated })))); } var ForwardTabs = React.forwardRef(Tabs); ForwardTabs.TabPane = _TabPane.default; var _default = ForwardTabs; exports.default = _default; }).call(this,require('_process')) },{"./TabContext":796,"./TabNavList":800,"./TabPanelList":802,"./TabPanelList/TabPane":801,"./hooks/useTouchMove":808,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"_process":1,"classnames":455,"rc-util/lib/Children/toArray":858,"rc-util/lib/hooks/useMergedState":871,"react":"react"}],804:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useOffsets; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _react = require("react"); var DEFAULT_SIZE = { width: 0, height: 0, left: 0, top: 0 }; function useOffsets(tabs, tabSizes, holderScrollWidth) { return (0, _react.useMemo)(function () { var _tabs$; var map = new Map(); var lastOffset = tabSizes.get((_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : _tabs$.key) || DEFAULT_SIZE; var rightOffset = lastOffset.left + lastOffset.width; for (var i = 0; i < tabs.length; i += 1) { var key = tabs[i].key; var data = tabSizes.get(key); // Reuse last one when not exist yet if (!data) { var _tabs; data = tabSizes.get((_tabs = tabs[i - 1]) === null || _tabs === void 0 ? void 0 : _tabs.key) || DEFAULT_SIZE; } var entity = map.get(key) || (0, _objectSpread2.default)({}, data); // Right entity.right = rightOffset - entity.left - entity.width; // Update entity map.set(key, entity); } return map; }, [tabs.map(function (tab) { return tab.key; }).join('_'), tabSizes, holderScrollWidth]); } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"react":"react"}],805:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useRaf; exports.useRafState = useRafState; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _raf = _interopRequireDefault(require("raf")); function useRaf(callback) { var rafRef = (0, _react.useRef)(); var removedRef = (0, _react.useRef)(false); function trigger() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (!removedRef.current) { _raf.default.cancel(rafRef.current); rafRef.current = (0, _raf.default)(function () { callback.apply(void 0, args); }); } } (0, _react.useEffect)(function () { return function () { removedRef.current = true; _raf.default.cancel(rafRef.current); }; }, []); return trigger; } function useRafState(defaultState) { var batchRef = (0, _react.useRef)([]); var _useState = (0, _react.useState)({}), _useState2 = (0, _slicedToArray2.default)(_useState, 2), forceUpdate = _useState2[1]; var state = (0, _react.useRef)(typeof defaultState === 'function' ? defaultState() : defaultState); var flushUpdate = useRaf(function () { var current = state.current; batchRef.current.forEach(function (callback) { current = callback(current); }); batchRef.current = []; state.current = current; forceUpdate({}); }); function updater(callback) { batchRef.current.push(callback); flushUpdate(); } return [state.current, updater]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"raf":581,"react":"react"}],806:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useRefs; var React = _interopRequireWildcard(require("react")); function useRefs() { var cacheRefs = (0, React.useRef)(new Map()); function getRef(key) { if (!cacheRefs.current.has(key)) { cacheRefs.current.set(key, React.createRef()); } return cacheRefs.current.get(key); } function removeRef(key) { cacheRefs.current.delete(key); } return [getRef, removeRef]; } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],807:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useSyncState; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); function useSyncState(defaultState, onChange) { var stateRef = React.useRef(defaultState); var _React$useState = React.useState({}), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), forceUpdate = _React$useState2[1]; function setState(updater) { var newValue = typeof updater === 'function' ? updater(stateRef.current) : updater; if (newValue !== stateRef.current) { onChange(newValue, stateRef.current); } stateRef.current = newValue; forceUpdate({}); } return [stateRef.current, setState]; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],808:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.isMobile = isMobile; exports.default = useTouchMove; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var MIN_SWIPE_DISTANCE = 0.1; var STOP_SWIPE_DISTANCE = 0.01; var REFRESH_INTERVAL = 20; var SPEED_OFF_MULTIPLE = Math.pow(0.995, REFRESH_INTERVAL); // ========================= Check if is a mobile ========================= function isMobile() { var agent = navigator.userAgent || navigator.vendor || window.opera; if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(agent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(agent.substr(0, 4))) { return true; } return false; } // ================================= Hook ================================= function useTouchMove(ref, onOffset) { var _useState = (0, React.useState)(), _useState2 = (0, _slicedToArray2.default)(_useState, 2), touchPosition = _useState2[0], setTouchPosition = _useState2[1]; var _useState3 = (0, React.useState)(0), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), lastTimestamp = _useState4[0], setLastTimestamp = _useState4[1]; var _useState5 = (0, React.useState)(0), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), lastTimeDiff = _useState6[0], setLastTimeDiff = _useState6[1]; var _useState7 = (0, React.useState)(), _useState8 = (0, _slicedToArray2.default)(_useState7, 2), lastOffset = _useState8[0], setLastOffset = _useState8[1]; var motionRef = (0, React.useRef)(); // ========================= Events ========================= // >>> Touch events function onTouchStart(e) { var _e$touches$ = e.touches[0], screenX = _e$touches$.screenX, screenY = _e$touches$.screenY; setTouchPosition({ x: screenX, y: screenY }); window.clearInterval(motionRef.current); } function onTouchMove(e) { if (!touchPosition) return; e.preventDefault(); var _e$touches$2 = e.touches[0], screenX = _e$touches$2.screenX, screenY = _e$touches$2.screenY; setTouchPosition({ x: screenX, y: screenY }); var offsetX = screenX - touchPosition.x; var offsetY = screenY - touchPosition.y; onOffset(offsetX, offsetY); var now = Date.now(); setLastTimestamp(now); setLastTimeDiff(now - lastTimestamp); setLastOffset({ x: offsetX, y: offsetY }); } function onTouchEnd() { if (!touchPosition) return; setTouchPosition(null); setLastOffset(null); // Swipe if needed if (lastOffset) { var distanceX = lastOffset.x / lastTimeDiff; var distanceY = lastOffset.y / lastTimeDiff; var absX = Math.abs(distanceX); var absY = Math.abs(distanceY); // Skip swipe if low distance if (Math.max(absX, absY) < MIN_SWIPE_DISTANCE) return; var currentX = distanceX; var currentY = distanceY; motionRef.current = window.setInterval(function () { if (Math.abs(currentX) < STOP_SWIPE_DISTANCE && Math.abs(currentY) < STOP_SWIPE_DISTANCE) { window.clearInterval(motionRef.current); return; } currentX *= SPEED_OFF_MULTIPLE; currentY *= SPEED_OFF_MULTIPLE; onOffset(currentX * REFRESH_INTERVAL, currentY * REFRESH_INTERVAL); }, REFRESH_INTERVAL); } } // >>> Wheel event var lastWheelTimestampRef = (0, React.useRef)(0); var lastWheelPreventRef = (0, React.useRef)(false); var lastWheelDirectionRef = (0, React.useRef)(); function onWheel(e) { var deltaX = e.deltaX, deltaY = e.deltaY; // Convert both to x & y since wheel only happened on PC var mixed = 0; var absX = Math.abs(deltaX); var absY = Math.abs(deltaY); if (absX === absY) { mixed = lastWheelDirectionRef.current === 'x' ? deltaX : deltaY; } else if (absX > absY) { mixed = deltaX; lastWheelDirectionRef.current = 'x'; } else { mixed = deltaY; lastWheelDirectionRef.current = 'y'; } // Optimize mac touch scroll var now = Date.now(); if (now - lastWheelTimestampRef.current > 100) { lastWheelPreventRef.current = false; } if (onOffset(-mixed, -mixed) || lastWheelPreventRef.current) { e.preventDefault(); lastWheelPreventRef.current = true; } lastWheelTimestampRef.current = now; } // ========================= Effect ========================= var touchEventsRef = (0, React.useRef)(null); touchEventsRef.current = { onTouchStart: onTouchStart, onTouchMove: onTouchMove, onTouchEnd: onTouchEnd, onWheel: onWheel }; React.useEffect(function () { function onProxyTouchStart(e) { touchEventsRef.current.onTouchStart(e); } function onProxyTouchMove(e) { touchEventsRef.current.onTouchMove(e); } function onProxyTouchEnd(e) { touchEventsRef.current.onTouchEnd(e); } function onProxyWheel(e) { touchEventsRef.current.onWheel(e); } document.addEventListener('touchmove', onProxyTouchMove, { passive: false }); document.addEventListener('touchend', onProxyTouchEnd, { passive: false }); // No need to clean up since element removed ref.current.addEventListener('touchstart', onProxyTouchStart, { passive: false }); ref.current.addEventListener('wheel', onProxyWheel); return function () { document.removeEventListener('touchmove', onProxyTouchMove); document.removeEventListener('touchend', onProxyTouchEnd); }; }, []); } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],809:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useVisibleRange; var _react = require("react"); var DEFAULT_SIZE = { width: 0, height: 0, left: 0, top: 0, right: 0 }; function useVisibleRange(tabOffsets, containerSize, tabContentNodeSize, addNodeSize, _ref) { var tabs = _ref.tabs, tabPosition = _ref.tabPosition, rtl = _ref.rtl; var unit; var position; var transformSize; if (['top', 'bottom'].includes(tabPosition)) { unit = 'width'; position = rtl ? 'right' : 'left'; transformSize = Math.abs(containerSize.left); } else { unit = 'height'; position = 'top'; transformSize = -containerSize.top; } var basicSize = containerSize[unit]; var tabContentSize = tabContentNodeSize[unit]; var addSize = addNodeSize[unit]; var mergedBasicSize = basicSize; if (tabContentSize + addSize > basicSize) { mergedBasicSize = basicSize - addSize; } return (0, _react.useMemo)(function () { if (!tabs.length) { return [0, 0]; } var len = tabs.length; var endIndex = len; for (var i = 0; i < len; i += 1) { var offset = tabOffsets.get(tabs[i].key) || DEFAULT_SIZE; if (offset[position] + offset[unit] > transformSize + mergedBasicSize) { endIndex = i - 1; break; } } var startIndex = 0; for (var _i = len - 1; _i >= 0; _i -= 1) { var _offset = tabOffsets.get(tabs[_i].key) || DEFAULT_SIZE; if (_offset[position] < transformSize) { startIndex = _i + 1; break; } } return [startIndex, endIndex]; }, [tabOffsets, transformSize, mergedBasicSize, tabPosition, tabs.map(function (tab) { return tab.key; }).join('_'), rtl]); } },{"react":"react"}],810:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "TabPane", { enumerable: true, get: function get() { return _TabPane.default; } }); exports.default = void 0; var _Tabs = _interopRequireDefault(require("./Tabs")); var _TabPane = _interopRequireDefault(require("./TabPanelList/TabPane")); var _default = _Tabs.default; exports.default = _default; },{"./TabPanelList/TabPane":801,"./Tabs":803,"@babel/runtime/helpers/interopRequireDefault":192}],811:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var React = _interopRequireWildcard(require("react")); var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer")); var _omit = _interopRequireDefault(require("omit.js")); var _classnames = _interopRequireDefault(require("classnames")); var _calculateNodeHeight = _interopRequireDefault(require("./calculateNodeHeight")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } // eslint-disable-next-line @typescript-eslint/naming-convention var RESIZE_STATUS; (function (RESIZE_STATUS) { RESIZE_STATUS[RESIZE_STATUS["NONE"] = 0] = "NONE"; RESIZE_STATUS[RESIZE_STATUS["RESIZING"] = 1] = "RESIZING"; RESIZE_STATUS[RESIZE_STATUS["RESIZED"] = 2] = "RESIZED"; })(RESIZE_STATUS || (RESIZE_STATUS = {})); var ResizableTextArea = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(ResizableTextArea, _React$Component); var _super = _createSuper(ResizableTextArea); function ResizableTextArea(props) { var _this; (0, _classCallCheck2.default)(this, ResizableTextArea); _this = _super.call(this, props); _this.saveTextArea = function (textArea) { _this.textArea = textArea; }; _this.handleResize = function (size) { var resizeStatus = _this.state.resizeStatus; var _this$props = _this.props, autoSize = _this$props.autoSize, onResize = _this$props.onResize; if (resizeStatus !== RESIZE_STATUS.NONE) { return; } if (typeof onResize === 'function') { onResize(size); } if (autoSize) { _this.resizeOnNextFrame(); } }; _this.resizeOnNextFrame = function () { cancelAnimationFrame(_this.nextFrameActionId); _this.nextFrameActionId = requestAnimationFrame(_this.resizeTextarea); }; _this.resizeTextarea = function () { var autoSize = _this.props.autoSize; if (!autoSize || !_this.textArea) { return; } var minRows = autoSize.minRows, maxRows = autoSize.maxRows; var textareaStyles = (0, _calculateNodeHeight.default)(_this.textArea, false, minRows, maxRows); _this.setState({ textareaStyles: textareaStyles, resizeStatus: RESIZE_STATUS.RESIZING }, function () { cancelAnimationFrame(_this.resizeFrameId); _this.resizeFrameId = requestAnimationFrame(function () { _this.setState({ resizeStatus: RESIZE_STATUS.RESIZED }, function () { _this.resizeFrameId = requestAnimationFrame(function () { _this.setState({ resizeStatus: RESIZE_STATUS.NONE }); _this.fixFirefoxAutoScroll(); }); }); }); }); }; _this.renderTextArea = function () { var _this$props2 = _this.props, _this$props2$prefixCl = _this$props2.prefixCls, prefixCls = _this$props2$prefixCl === void 0 ? 'rc-textarea' : _this$props2$prefixCl, autoSize = _this$props2.autoSize, onResize = _this$props2.onResize, className = _this$props2.className, disabled = _this$props2.disabled; var _this$state = _this.state, textareaStyles = _this$state.textareaStyles, resizeStatus = _this$state.resizeStatus; var otherProps = (0, _omit.default)(_this.props, ['prefixCls', 'onPressEnter', 'autoSize', 'defaultValue', 'onResize']); var cls = (0, _classnames.default)(prefixCls, className, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled"), disabled)); // Fix https://github.com/ant-design/ant-design/issues/6776 // Make sure it could be reset when using form.getFieldDecorator if ('value' in otherProps) { otherProps.value = otherProps.value || ''; } var style = _objectSpread(_objectSpread(_objectSpread({}, _this.props.style), textareaStyles), resizeStatus === RESIZE_STATUS.RESIZING ? // React will warning when mix `overflow` & `overflowY`. // We need to define this separately. { overflowX: 'hidden', overflowY: 'hidden' } : null); return React.createElement(_rcResizeObserver.default, { onResize: _this.handleResize, disabled: !(autoSize || onResize) }, React.createElement("textarea", Object.assign({}, otherProps, { className: cls, style: style, ref: _this.saveTextArea }))); }; _this.state = { textareaStyles: {}, resizeStatus: RESIZE_STATUS.NONE }; return _this; } (0, _createClass2.default)(ResizableTextArea, [{ key: "componentDidMount", value: function componentDidMount() { this.resizeTextarea(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { // Re-render with the new content then recalculate the height as required. if (prevProps.value !== this.props.value) { this.resizeTextarea(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { cancelAnimationFrame(this.nextFrameActionId); cancelAnimationFrame(this.resizeFrameId); } // https://github.com/ant-design/ant-design/issues/21870 }, { key: "fixFirefoxAutoScroll", value: function fixFirefoxAutoScroll() { try { if (document.activeElement === this.textArea) { var currentStart = this.textArea.selectionStart; var currentEnd = this.textArea.selectionEnd; this.textArea.setSelectionRange(currentStart, currentEnd); } } catch (e) {// Fix error in Chrome: // Failed to read the 'selectionStart' property from 'HTMLInputElement' // http://stackoverflow.com/q/21177489/3040605 } } }, { key: "render", value: function render() { return this.renderTextArea(); } }]); return ResizableTextArea; }(React.Component); var _default = ResizableTextArea; exports.default = _default; },{"./calculateNodeHeight":812,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/possibleConstructorReturn":202,"classnames":455,"omit.js":579,"rc-resize-observer":729,"react":"react"}],812:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateNodeStyling = calculateNodeStyling; exports.default = calculateNodeHeight; // Thanks to https://github.com/andreypopp/react-textarea-autosize/ /** * calculateNodeHeight(uiTextNode, useCache = false) */ var HIDDEN_TEXTAREA_STYLE = "\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important\n"; var SIZING_STYLE = ['letter-spacing', 'line-height', 'padding-top', 'padding-bottom', 'font-family', 'font-weight', 'font-size', 'font-variant', 'text-rendering', 'text-transform', 'width', 'text-indent', 'padding-left', 'padding-right', 'border-width', 'box-sizing']; var computedStyleCache = {}; var hiddenTextarea; function calculateNodeStyling(node) { var useCache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var nodeRef = node.getAttribute('id') || node.getAttribute('data-reactid') || node.getAttribute('name'); if (useCache && computedStyleCache[nodeRef]) { return computedStyleCache[nodeRef]; } var style = window.getComputedStyle(node); var boxSizing = style.getPropertyValue('box-sizing') || style.getPropertyValue('-moz-box-sizing') || style.getPropertyValue('-webkit-box-sizing'); var paddingSize = parseFloat(style.getPropertyValue('padding-bottom')) + parseFloat(style.getPropertyValue('padding-top')); var borderSize = parseFloat(style.getPropertyValue('border-bottom-width')) + parseFloat(style.getPropertyValue('border-top-width')); var sizingStyle = SIZING_STYLE.map(function (name) { return "".concat(name, ":").concat(style.getPropertyValue(name)); }).join(';'); var nodeInfo = { sizingStyle: sizingStyle, paddingSize: paddingSize, borderSize: borderSize, boxSizing: boxSizing }; if (useCache && nodeRef) { computedStyleCache[nodeRef] = nodeInfo; } return nodeInfo; } function calculateNodeHeight(uiTextNode) { var useCache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var minRows = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; var maxRows = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; if (!hiddenTextarea) { hiddenTextarea = document.createElement('textarea'); hiddenTextarea.setAttribute('tab-index', '-1'); hiddenTextarea.setAttribute('aria-hidden', 'true'); document.body.appendChild(hiddenTextarea); } // Fix wrap="off" issue // https://github.com/ant-design/ant-design/issues/6577 if (uiTextNode.getAttribute('wrap')) { hiddenTextarea.setAttribute('wrap', uiTextNode.getAttribute('wrap')); } else { hiddenTextarea.removeAttribute('wrap'); } // Copy all CSS properties that have an impact on the height of the content in // the textbox var _calculateNodeStyling = calculateNodeStyling(uiTextNode, useCache), paddingSize = _calculateNodeStyling.paddingSize, borderSize = _calculateNodeStyling.borderSize, boxSizing = _calculateNodeStyling.boxSizing, sizingStyle = _calculateNodeStyling.sizingStyle; // Need to have the overflow attribute to hide the scrollbar otherwise // text-lines will not calculated properly as the shadow will technically be // narrower for content hiddenTextarea.setAttribute('style', "".concat(sizingStyle, ";").concat(HIDDEN_TEXTAREA_STYLE)); hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || ''; var minHeight = Number.MIN_SAFE_INTEGER; var maxHeight = Number.MAX_SAFE_INTEGER; var height = hiddenTextarea.scrollHeight; var overflowY; if (boxSizing === 'border-box') { // border-box: add border, since height = content + padding + border height += borderSize; } else if (boxSizing === 'content-box') { // remove padding, since height = content height -= paddingSize; } if (minRows !== null || maxRows !== null) { // measure height of a textarea with a single row hiddenTextarea.value = ' '; var singleRowHeight = hiddenTextarea.scrollHeight - paddingSize; if (minRows !== null) { minHeight = singleRowHeight * minRows; if (boxSizing === 'border-box') { minHeight = minHeight + paddingSize + borderSize; } height = Math.max(minHeight, height); } if (maxRows !== null) { maxHeight = singleRowHeight * maxRows; if (boxSizing === 'border-box') { maxHeight = maxHeight + paddingSize + borderSize; } overflowY = height > maxHeight ? '' : 'hidden'; height = Math.min(maxHeight, height); } } return { height: height, minHeight: minHeight, maxHeight: maxHeight, overflowY: overflowY }; } },{}],813:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "ResizableTextArea", { enumerable: true, get: function get() { return _ResizableTextArea.default; } }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var React = _interopRequireWildcard(require("react")); var _ResizableTextArea = _interopRequireDefault(require("./ResizableTextArea")); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var TextArea = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(TextArea, _React$Component); var _super = _createSuper(TextArea); function TextArea(props) { var _this; (0, _classCallCheck2.default)(this, TextArea); _this = _super.call(this, props); _this.focus = function () { _this.resizableTextArea.textArea.focus(); }; _this.saveTextArea = function (resizableTextArea) { _this.resizableTextArea = resizableTextArea; }; _this.handleChange = function (e) { var onChange = _this.props.onChange; _this.setValue(e.target.value, function () { _this.resizableTextArea.resizeTextarea(); }); if (onChange) { onChange(e); } }; _this.handleKeyDown = function (e) { var _this$props = _this.props, onPressEnter = _this$props.onPressEnter, onKeyDown = _this$props.onKeyDown; if (e.keyCode === 13 && onPressEnter) { onPressEnter(e); } if (onKeyDown) { onKeyDown(e); } }; var value = typeof props.value === 'undefined' || props.value === null ? props.defaultValue : props.value; _this.state = { value: value }; return _this; } (0, _createClass2.default)(TextArea, [{ key: "setValue", value: function setValue(value, callback) { if (!('value' in this.props)) { this.setState({ value: value }, callback); } } }, { key: "blur", value: function blur() { this.resizableTextArea.textArea.blur(); } }, { key: "render", value: function render() { return React.createElement(_ResizableTextArea.default, Object.assign({}, this.props, { value: this.state.value, onKeyDown: this.handleKeyDown, onChange: this.handleChange, ref: this.saveTextArea })); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps) { if ('value' in nextProps) { return { value: nextProps.value }; } return null; } }]); return TextArea; }(React.Component); var _default = TextArea; exports.default = _default; },{"./ResizableTextArea":811,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/getPrototypeOf":190,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/possibleConstructorReturn":202,"react":"react"}],814:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var Content = function Content(props) { var overlay = props.overlay, prefixCls = props.prefixCls, id = props.id, overlayInnerStyle = props.overlayInnerStyle; return React.createElement("div", { className: "".concat(prefixCls, "-inner"), id: id, role: "tooltip", style: overlayInnerStyle }, typeof overlay === 'function' ? overlay() : overlay); }; var _default = Content; exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],815:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _rcTrigger = _interopRequireDefault(require("rc-trigger")); var _placements = require("./placements"); var _Content = _interopRequireDefault(require("./Content")); var Tooltip = function Tooltip(props, ref) { var overlayClassName = props.overlayClassName, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? ['hover'] : _props$trigger, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, overlayStyle = props.overlayStyle, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-tooltip' : _props$prefixCls, children = props.children, onVisibleChange = props.onVisibleChange, afterVisibleChange = props.afterVisibleChange, transitionName = props.transitionName, animation = props.animation, _props$placement = props.placement, placement = _props$placement === void 0 ? 'right' : _props$placement, _props$align = props.align, align = _props$align === void 0 ? {} : _props$align, _props$destroyTooltip = props.destroyTooltipOnHide, destroyTooltipOnHide = _props$destroyTooltip === void 0 ? false : _props$destroyTooltip, defaultVisible = props.defaultVisible, getTooltipContainer = props.getTooltipContainer, overlayInnerStyle = props.overlayInnerStyle, restProps = (0, _objectWithoutProperties2.default)(props, ["overlayClassName", "trigger", "mouseEnterDelay", "mouseLeaveDelay", "overlayStyle", "prefixCls", "children", "onVisibleChange", "afterVisibleChange", "transitionName", "animation", "placement", "align", "destroyTooltipOnHide", "defaultVisible", "getTooltipContainer", "overlayInnerStyle"]); var domRef = (0, React.useRef)(null); (0, React.useImperativeHandle)(ref, function () { return domRef.current; }); var extraProps = (0, _objectSpread2.default)({}, restProps); if ('visible' in props) { extraProps.popupVisible = props.visible; } var getPopupElement = function getPopupElement() { var _props$arrowContent = props.arrowContent, arrowContent = _props$arrowContent === void 0 ? null : _props$arrowContent, overlay = props.overlay, id = props.id; return [React.createElement("div", { className: "".concat(prefixCls, "-arrow"), key: "arrow" }, arrowContent), React.createElement(_Content.default, { key: "content", prefixCls: prefixCls, id: id, overlay: overlay, overlayInnerStyle: overlayInnerStyle })]; }; var destroyTooltip = false; var autoDestroy = false; if (typeof destroyTooltipOnHide === 'boolean') { destroyTooltip = destroyTooltipOnHide; } else if (destroyTooltipOnHide && (0, _typeof2.default)(destroyTooltipOnHide) === 'object') { var keepParent = destroyTooltipOnHide.keepParent; destroyTooltip = keepParent === true; autoDestroy = keepParent === false; } return React.createElement(_rcTrigger.default, Object.assign({ popupClassName: overlayClassName, prefixCls: prefixCls, popup: getPopupElement, action: trigger, builtinPlacements: _placements.placements, popupPlacement: placement, ref: domRef, popupAlign: align, getPopupContainer: getTooltipContainer, onPopupVisibleChange: onVisibleChange, afterPopupVisibleChange: afterVisibleChange, popupTransitionName: transitionName, popupAnimation: animation, defaultPopupVisible: defaultVisible, destroyPopupOnHide: destroyTooltip, autoDestroy: autoDestroy, mouseLeaveDelay: mouseLeaveDelay, popupStyle: overlayStyle, mouseEnterDelay: mouseEnterDelay }, extraProps), children); }; var _default = (0, React.forwardRef)(Tooltip); exports.default = _default; },{"./Content":814,"./placements":817,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/typeof":208,"rc-trigger":848,"react":"react"}],816:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Tooltip = _interopRequireDefault(require("./Tooltip")); var _default = _Tooltip.default; exports.default = _default; },{"./Tooltip":815,"@babel/runtime/helpers/interopRequireDefault":192}],817:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.placements = void 0; var autoAdjustOverflow = { adjustX: 1, adjustY: 1 }; var targetOffset = [0, 0]; var placements = { left: { points: ['cr', 'cl'], overflow: autoAdjustOverflow, offset: [-4, 0], targetOffset: targetOffset }, right: { points: ['cl', 'cr'], overflow: autoAdjustOverflow, offset: [4, 0], targetOffset: targetOffset }, top: { points: ['bc', 'tc'], overflow: autoAdjustOverflow, offset: [0, -4], targetOffset: targetOffset }, bottom: { points: ['tc', 'bc'], overflow: autoAdjustOverflow, offset: [0, 4], targetOffset: targetOffset }, topLeft: { points: ['bl', 'tl'], overflow: autoAdjustOverflow, offset: [0, -4], targetOffset: targetOffset }, leftTop: { points: ['tr', 'tl'], overflow: autoAdjustOverflow, offset: [-4, 0], targetOffset: targetOffset }, topRight: { points: ['br', 'tr'], overflow: autoAdjustOverflow, offset: [0, -4], targetOffset: targetOffset }, rightTop: { points: ['tl', 'tr'], overflow: autoAdjustOverflow, offset: [4, 0], targetOffset: targetOffset }, bottomRight: { points: ['tr', 'br'], overflow: autoAdjustOverflow, offset: [0, 4], targetOffset: targetOffset }, rightBottom: { points: ['bl', 'br'], overflow: autoAdjustOverflow, offset: [4, 0], targetOffset: targetOffset }, bottomLeft: { points: ['tl', 'bl'], overflow: autoAdjustOverflow, offset: [0, 4], targetOffset: targetOffset }, leftBottom: { points: ['br', 'bl'], overflow: autoAdjustOverflow, offset: [-4, 0], targetOffset: targetOffset } }; exports.placements = placements; var _default = placements; exports.default = _default; },{}],818:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.SelectContext = void 0; var React = _interopRequireWildcard(require("react")); var SelectContext = React.createContext(null); exports.SelectContext = SelectContext; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],819:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _useMemo = _interopRequireDefault(require("rc-util/lib/hooks/useMemo")); var _rcTree = _interopRequireDefault(require("rc-tree")); var _Context = require("./Context"); var _useKeyValueMapping3 = _interopRequireDefault(require("./hooks/useKeyValueMapping")); var _useKeyValueMap3 = _interopRequireDefault(require("./hooks/useKeyValueMap")); var HIDDEN_STYLE = { width: 0, height: 0, display: 'flex', overflow: 'hidden', opacity: 0, border: 0, padding: 0, margin: 0 }; var OptionList = function OptionList(props, ref) { var prefixCls = props.prefixCls, height = props.height, itemHeight = props.itemHeight, virtual = props.virtual, options = props.options, flattenOptions = props.flattenOptions, multiple = props.multiple, searchValue = props.searchValue, onSelect = props.onSelect, onToggleOpen = props.onToggleOpen, open = props.open, notFoundContent = props.notFoundContent, onMouseEnter = props.onMouseEnter; var _React$useContext = React.useContext(_Context.SelectContext), checkable = _React$useContext.checkable, checkedKeys = _React$useContext.checkedKeys, halfCheckedKeys = _React$useContext.halfCheckedKeys, treeExpandedKeys = _React$useContext.treeExpandedKeys, treeDefaultExpandAll = _React$useContext.treeDefaultExpandAll, treeDefaultExpandedKeys = _React$useContext.treeDefaultExpandedKeys, onTreeExpand = _React$useContext.onTreeExpand, treeIcon = _React$useContext.treeIcon, showTreeIcon = _React$useContext.showTreeIcon, switcherIcon = _React$useContext.switcherIcon, treeLine = _React$useContext.treeLine, treeNodeFilterProp = _React$useContext.treeNodeFilterProp, loadData = _React$useContext.loadData, treeLoadedKeys = _React$useContext.treeLoadedKeys, treeMotion = _React$useContext.treeMotion, onTreeLoad = _React$useContext.onTreeLoad; var treeRef = React.useRef(); var memoOptions = (0, _useMemo.default)(function () { return options; }, [open, options], function (prev, next) { return next[0] && prev[1] !== next[1]; }); var _useKeyValueMap = (0, _useKeyValueMap3.default)(flattenOptions), _useKeyValueMap2 = (0, _slicedToArray2.default)(_useKeyValueMap, 2), cacheKeyMap = _useKeyValueMap2[0], cacheValueMap = _useKeyValueMap2[1]; var _useKeyValueMapping = (0, _useKeyValueMapping3.default)(cacheKeyMap, cacheValueMap), _useKeyValueMapping2 = (0, _slicedToArray2.default)(_useKeyValueMapping, 2), getEntityByKey = _useKeyValueMapping2[0], getEntityByValue = _useKeyValueMapping2[1]; // ========================== Values ========================== var valueKeys = React.useMemo(function () { return checkedKeys.map(function (val) { var entity = getEntityByValue(val); return entity ? entity.key : null; }); }, [checkedKeys]); var mergedCheckedKeys = React.useMemo(function () { if (!checkable) { return null; } return { checked: valueKeys, halfChecked: halfCheckedKeys }; }, [valueKeys, halfCheckedKeys, checkable]); // ========================== Scroll ========================== React.useEffect(function () { // Single mode should scroll to current key if (open && !multiple && valueKeys.length) { var _treeRef$current; (_treeRef$current = treeRef.current) === null || _treeRef$current === void 0 ? void 0 : _treeRef$current.scrollTo({ key: valueKeys[0] }); } }, [open]); // ========================== Search ========================== var lowerSearchValue = String(searchValue).toLowerCase(); var filterTreeNode = function filterTreeNode(treeNode) { if (!lowerSearchValue) { return false; } return String(treeNode[treeNodeFilterProp]).toLowerCase().includes(lowerSearchValue); }; // =========================== Keys =========================== var _React$useState = React.useState(treeDefaultExpandedKeys), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), expandedKeys = _React$useState2[0], setExpandedKeys = _React$useState2[1]; var _React$useState3 = React.useState(null), _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2), searchExpandedKeys = _React$useState4[0], setSearchExpandedKeys = _React$useState4[1]; var mergedExpandedKeys = React.useMemo(function () { if (treeExpandedKeys) { return (0, _toConsumableArray2.default)(treeExpandedKeys); } return searchValue ? searchExpandedKeys : expandedKeys; }, [expandedKeys, searchExpandedKeys, lowerSearchValue, treeExpandedKeys]); React.useEffect(function () { if (searchValue) { setSearchExpandedKeys(flattenOptions.map(function (o) { return o.key; })); } }, [searchValue]); var onInternalExpand = function onInternalExpand(keys) { setExpandedKeys(keys); setSearchExpandedKeys(keys); if (onTreeExpand) { onTreeExpand(keys); } }; // ========================== Events ========================== var onListMouseDown = function onListMouseDown(event) { event.preventDefault(); }; var onInternalSelect = function onInternalSelect(_, _ref) { var key = _ref.node.key; var entity = getEntityByKey(key, checkable ? 'checkbox' : 'select'); if (entity !== null) { onSelect(entity.data.value, { selected: !checkedKeys.includes(entity.data.value) }); } if (!multiple) { onToggleOpen(false); } }; // ========================= Keyboard ========================= var _React$useState5 = React.useState(null), _React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2), activeKey = _React$useState6[0], setActiveKey = _React$useState6[1]; var activeEntity = getEntityByKey(activeKey); React.useImperativeHandle(ref, function () { return { onKeyDown: function onKeyDown(event) { var _treeRef$current2; var which = event.which; switch (which) { // >>> Arrow keys case _KeyCode.default.UP: case _KeyCode.default.DOWN: case _KeyCode.default.LEFT: case _KeyCode.default.RIGHT: (_treeRef$current2 = treeRef.current) === null || _treeRef$current2 === void 0 ? void 0 : _treeRef$current2.onKeyDown(event); break; // >>> Select item case _KeyCode.default.ENTER: { if (activeEntity !== null) { onInternalSelect(null, { node: { key: activeKey }, selected: !checkedKeys.includes(activeEntity.data.value) }); } break; } // >>> Close case _KeyCode.default.ESC: { onToggleOpen(false); } } }, onKeyUp: function onKeyUp() {} }; }); // ========================== Render ========================== if (memoOptions.length === 0) { return React.createElement("div", { role: "listbox", className: "".concat(prefixCls, "-empty"), onMouseDown: onListMouseDown }, notFoundContent); } var treeProps = {}; if (treeLoadedKeys) { treeProps.loadedKeys = treeLoadedKeys; } if (mergedExpandedKeys) { treeProps.expandedKeys = mergedExpandedKeys; } return React.createElement("div", { onMouseDown: onListMouseDown, onMouseEnter: onMouseEnter }, activeEntity && open && React.createElement("span", { style: HIDDEN_STYLE, "aria-live": "assertive" }, activeEntity.data.value), React.createElement(_rcTree.default, Object.assign({ ref: treeRef, focusable: false, prefixCls: "".concat(prefixCls, "-tree"), treeData: memoOptions, height: height, itemHeight: itemHeight, virtual: virtual, multiple: multiple, icon: treeIcon, showIcon: showTreeIcon, switcherIcon: switcherIcon, showLine: treeLine, loadData: searchValue ? null : loadData, motion: treeMotion, // We handle keys by out instead tree self checkable: checkable, checkStrictly: true, checkedKeys: mergedCheckedKeys, selectedKeys: !checkable ? valueKeys : [], defaultExpandAll: treeDefaultExpandAll }, treeProps, { // Proxy event out onActiveChange: setActiveKey, onSelect: onInternalSelect, onCheck: onInternalSelect, onExpand: onInternalExpand, onLoad: onTreeLoad, filterTreeNode: filterTreeNode }))); }; var RefOptionList = React.forwardRef(OptionList); RefOptionList.displayName = 'OptionList'; var _default = RefOptionList; exports.default = _default; },{"./Context":818,"./hooks/useKeyValueMap":822,"./hooks/useKeyValueMapping":823,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"rc-tree":837,"rc-util/lib/KeyCode":865,"rc-util/lib/hooks/useMemo":870,"react":"react"}],820:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** This is a placeholder, not real render in dom */ var TreeNode = function TreeNode() { return null; }; var _default = TreeNode; exports.default = _default; },{}],821:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _generate = _interopRequireDefault(require("rc-select/lib/generate")); var _valueUtil = require("rc-select/lib/utils/valueUtil"); var _treeUtil = require("rc-tree/lib/utils/treeUtil"); var _conductUtil = require("rc-tree/lib/utils/conductUtil"); var _generator = require("rc-select/lib/interface/generator"); var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _OptionList = _interopRequireDefault(require("./OptionList")); var _TreeNode = _interopRequireDefault(require("./TreeNode")); var _valueUtil2 = require("./utils/valueUtil"); var _warningPropsUtil = _interopRequireDefault(require("./utils/warningPropsUtil")); var _Context = require("./Context"); var _useTreeData = _interopRequireDefault(require("./hooks/useTreeData")); var _useKeyValueMap3 = _interopRequireDefault(require("./hooks/useKeyValueMap")); var _useKeyValueMapping3 = _interopRequireDefault(require("./hooks/useKeyValueMapping")); var _strategyUtil = require("./utils/strategyUtil"); var _legacyUtil = require("./utils/legacyUtil"); var _useSelectValues = _interopRequireDefault(require("./hooks/useSelectValues")); var OMIT_PROPS = ['expandedKeys', 'treeData', 'treeCheckable', 'showCheckedStrategy', 'searchPlaceholder', 'treeLine', 'treeIcon', 'showTreeIcon', 'switcherIcon', 'treeNodeFilterProp', 'filterTreeNode', 'dropdownPopupAlign', 'treeDefaultExpandAll', 'treeCheckStrictly', 'treeExpandedKeys', 'treeLoadedKeys', 'treeMotion', 'onTreeExpand', 'onTreeLoad', 'loadData', 'treeDataSimpleMode', 'treeNodeLabelProp', 'treeDefaultExpandedKeys']; var RefSelect = (0, _generate.default)({ prefixCls: 'rc-tree-select', components: { optionList: _OptionList.default }, // Not use generate since we will handle ourself convertChildrenToData: function convertChildrenToData() { return null; }, flattenOptions: _valueUtil2.flattenOptions, // Handle `optionLabelProp` in TreeSelect component getLabeledValue: _valueUtil.getLabeledValue, filterOptions: _valueUtil2.filterOptions, isValueDisabled: _valueUtil2.isValueDisabled, findValueOption: _valueUtil2.findValueOption, omitDOMProps: function omitDOMProps(props) { var cloneProps = (0, _objectSpread2.default)({}, props); OMIT_PROPS.forEach(function (prop) { delete cloneProps[prop]; }); return cloneProps; } }); RefSelect.displayName = 'Select'; var RefTreeSelect = React.forwardRef(function (props, ref) { var multiple = props.multiple, treeCheckable = props.treeCheckable, treeCheckStrictly = props.treeCheckStrictly, _props$showCheckedStr = props.showCheckedStrategy, showCheckedStrategy = _props$showCheckedStr === void 0 ? 'SHOW_CHILD' : _props$showCheckedStr, labelInValue = props.labelInValue, loadData = props.loadData, treeLoadedKeys = props.treeLoadedKeys, _props$treeNodeFilter = props.treeNodeFilterProp, treeNodeFilterProp = _props$treeNodeFilter === void 0 ? 'value' : _props$treeNodeFilter, treeNodeLabelProp = props.treeNodeLabelProp, treeDataSimpleMode = props.treeDataSimpleMode, treeData = props.treeData, treeExpandedKeys = props.treeExpandedKeys, treeDefaultExpandedKeys = props.treeDefaultExpandedKeys, treeDefaultExpandAll = props.treeDefaultExpandAll, children = props.children, treeIcon = props.treeIcon, showTreeIcon = props.showTreeIcon, switcherIcon = props.switcherIcon, treeLine = props.treeLine, treeMotion = props.treeMotion, filterTreeNode = props.filterTreeNode, dropdownPopupAlign = props.dropdownPopupAlign, onChange = props.onChange, onTreeExpand = props.onTreeExpand, onTreeLoad = props.onTreeLoad, onDropdownVisibleChange = props.onDropdownVisibleChange, onSelect = props.onSelect, onDeselect = props.onDeselect; var mergedCheckable = treeCheckable || treeCheckStrictly; var mergedMultiple = multiple || mergedCheckable; var treeConduction = treeCheckable && !treeCheckStrictly; var mergedLabelInValue = treeCheckStrictly || labelInValue; // ========================== Ref ========================== var selectRef = React.useRef(null); React.useImperativeHandle(ref, function () { return { focus: selectRef.current.focus, blur: selectRef.current.blur }; }); // ======================= Tree Data ======================= // Legacy both support `label` or `title` if not set. // We have to fallback to function to handle this var getTreeNodeTitle = function getTreeNodeTitle(node) { if (!treeData) { return node.title; } return node.label || node.title; }; var getTreeNodeLabelProp = function getTreeNodeLabelProp(node) { if (treeNodeLabelProp) { return node[treeNodeLabelProp]; } return getTreeNodeTitle(node); }; var mergedTreeData = (0, _useTreeData.default)(treeData, children, { getLabelProp: getTreeNodeTitle, simpleMode: treeDataSimpleMode }); var flattedOptions = (0, React.useMemo)(function () { return (0, _valueUtil2.flattenOptions)(mergedTreeData); }, [mergedTreeData]); var _useKeyValueMap = (0, _useKeyValueMap3.default)(flattedOptions), _useKeyValueMap2 = (0, _slicedToArray2.default)(_useKeyValueMap, 2), cacheKeyMap = _useKeyValueMap2[0], cacheValueMap = _useKeyValueMap2[1]; var _useKeyValueMapping = (0, _useKeyValueMapping3.default)(cacheKeyMap, cacheValueMap), _useKeyValueMapping2 = (0, _slicedToArray2.default)(_useKeyValueMapping, 2), getEntityByKey = _useKeyValueMapping2[0], getEntityByValue = _useKeyValueMapping2[1]; // Only generate keyEntities for check conduction when is `treeCheckable` var _useMemo = (0, React.useMemo)(function () { if (treeConduction) { return (0, _treeUtil.convertDataToEntities)(mergedTreeData); } return { keyEntities: null }; }, [mergedTreeData, treeCheckable, treeCheckStrictly]), conductKeyEntities = _useMemo.keyEntities; // ========================= Value ========================= var _useMergedState = (0, _useMergedState3.default)(props.defaultValue, { value: props.value }), _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2), value = _useMergedState2[0], setValue = _useMergedState2[1]; /** Get `missingRawValues` which not exist in the tree yet */ var splitRawValues = function splitRawValues(newRawValues) { var missingRawValues = []; var existRawValues = []; // Keep missing value in the cache newRawValues.forEach(function (val) { if (getEntityByValue(val)) { existRawValues.push(val); } else { missingRawValues.push(val); } }); return { missingRawValues: missingRawValues, existRawValues: existRawValues }; }; var _useMemo2 = (0, React.useMemo)(function () { var valueHalfCheckedKeys = []; var newRawValues = []; (0, _valueUtil2.toArray)(value).forEach(function (item) { if (item && (0, _typeof2.default)(item) === 'object' && 'value' in item) { if (item.halfChecked && treeCheckStrictly) { var entity = getEntityByValue(item.value); valueHalfCheckedKeys.push(entity ? entity.key : item.value); } else { newRawValues.push(item.value); } } else { newRawValues.push(item); } }); // We need do conduction of values if (treeConduction) { var _splitRawValues = splitRawValues(newRawValues), missingRawValues = _splitRawValues.missingRawValues, existRawValues = _splitRawValues.existRawValues; var keyList = existRawValues.map(function (val) { return getEntityByValue(val).key; }); var _conductCheck = (0, _conductUtil.conductCheck)(keyList, true, conductKeyEntities), checkedKeys = _conductCheck.checkedKeys, halfCheckedKeys = _conductCheck.halfCheckedKeys; return [[].concat((0, _toConsumableArray2.default)(missingRawValues), (0, _toConsumableArray2.default)(checkedKeys.map(function (key) { return getEntityByKey(key).data.value; }))), halfCheckedKeys]; } return [newRawValues, valueHalfCheckedKeys]; }, [value, mergedMultiple, mergedLabelInValue, treeCheckable, treeCheckStrictly]), _useMemo3 = (0, _slicedToArray2.default)(_useMemo2, 2), rawValues = _useMemo3[0], rawHalfCheckedKeys = _useMemo3[1]; var selectValues = (0, _useSelectValues.default)(rawValues, { treeConduction: treeConduction, value: value, showCheckedStrategy: showCheckedStrategy, conductKeyEntities: conductKeyEntities, getEntityByValue: getEntityByValue, getEntityByKey: getEntityByKey, getLabelProp: getTreeNodeLabelProp }); var triggerChange = function triggerChange(newRawValues, extra, source) { setValue(mergedMultiple ? newRawValues : newRawValues[0]); if (onChange) { var eventValues = newRawValues; if (treeConduction && showCheckedStrategy !== 'SHOW_ALL') { var keyList = newRawValues.map(function (val) { var entity = getEntityByValue(val); return entity ? entity.key : val; }); var formattedKeyList = (0, _strategyUtil.formatStrategyKeys)(keyList, showCheckedStrategy, conductKeyEntities); eventValues = formattedKeyList.map(function (key) { var entity = getEntityByKey(key); return entity ? entity.data.value : key; }); } var _ref = extra || { triggerValue: undefined, selected: undefined }, triggerValue = _ref.triggerValue, selected = _ref.selected; var returnValues = mergedLabelInValue ? (0, _valueUtil2.getRawValueLabeled)(eventValues, value, getEntityByValue, getTreeNodeLabelProp) : eventValues; // We need fill half check back if (treeCheckStrictly) { var halfValues = rawHalfCheckedKeys.map(function (key) { var entity = getEntityByKey(key); return entity ? entity.data.value : key; }).filter(function (val) { return !eventValues.includes(val); }); returnValues = [].concat((0, _toConsumableArray2.default)(returnValues), (0, _toConsumableArray2.default)((0, _valueUtil2.getRawValueLabeled)(halfValues, value, getEntityByValue, getTreeNodeLabelProp))); } var additionalInfo = { // [Legacy] Always return as array contains label & value preValue: selectValues, triggerValue: triggerValue }; // [Legacy] Fill legacy data if user query. // This is expansive that we only fill when user query // https://github.com/react-component/tree-select/blob/fe33eb7c27830c9ac70cd1fdb1ebbe7bc679c16a/src/Select.jsx var showPosition = true; if (treeCheckStrictly || source === 'selection' && !selected) { showPosition = false; } (0, _legacyUtil.fillAdditionalInfo)(additionalInfo, triggerValue, newRawValues, mergedTreeData, showPosition); if (mergedCheckable) { additionalInfo.checked = selected; } else { additionalInfo.selected = selected; } onChange(mergedMultiple ? returnValues : returnValues[0], mergedLabelInValue ? null : eventValues.map(function (val) { var entity = getEntityByValue(val); return entity ? getTreeNodeLabelProp(entity.data) : null; }), additionalInfo); } }; var onInternalSelect = function onInternalSelect(selectValue, option, source) { var eventValue = mergedLabelInValue ? selectValue : selectValue; if (!mergedMultiple) { // Single mode always set value triggerChange([selectValue], { selected: true, triggerValue: selectValue }, source); } else { var newRawValues = (0, _valueUtil2.addValue)(rawValues, selectValue); // Add keys if tree conduction if (treeConduction) { // Should keep missing values var _splitRawValues2 = splitRawValues(newRawValues), missingRawValues = _splitRawValues2.missingRawValues, existRawValues = _splitRawValues2.existRawValues; var keyList = existRawValues.map(function (val) { return getEntityByValue(val).key; }); var _conductCheck2 = (0, _conductUtil.conductCheck)(keyList, true, conductKeyEntities), checkedKeys = _conductCheck2.checkedKeys; newRawValues = [].concat((0, _toConsumableArray2.default)(missingRawValues), (0, _toConsumableArray2.default)(checkedKeys.map(function (key) { return getEntityByKey(key).data.value; }))); } triggerChange(newRawValues, { selected: true, triggerValue: selectValue }, source); } if (onSelect) { onSelect(eventValue, option); } }; var onInternalDeselect = function onInternalDeselect(selectValue, option, source) { var eventValue = mergedLabelInValue ? selectValue : selectValue; var newRawValues = (0, _valueUtil2.removeValue)(rawValues, selectValue); // Remove keys if tree conduction if (treeConduction) { var _splitRawValues3 = splitRawValues(newRawValues), missingRawValues = _splitRawValues3.missingRawValues, existRawValues = _splitRawValues3.existRawValues; var keyList = existRawValues.map(function (val) { return getEntityByValue(val).key; }); var _conductCheck3 = (0, _conductUtil.conductCheck)(keyList, { checked: false, halfCheckedKeys: rawHalfCheckedKeys }, conductKeyEntities), checkedKeys = _conductCheck3.checkedKeys; newRawValues = [].concat((0, _toConsumableArray2.default)(missingRawValues), (0, _toConsumableArray2.default)(checkedKeys.map(function (key) { return getEntityByKey(key).data.value; }))); } triggerChange(newRawValues, { selected: false, triggerValue: selectValue }, source); if (onDeselect) { onDeselect(eventValue, option); } }; var onInternalClear = function onInternalClear() { triggerChange([], null, 'clear'); }; // ========================= Open ========================== var onInternalDropdownVisibleChange = React.useCallback(function (open) { if (onDropdownVisibleChange) { var legacyParam = {}; Object.defineProperty(legacyParam, 'documentClickClose', { get: function get() { (0, _warning.default)(false, 'Second param of `onDropdownVisibleChange` has been removed.'); return false; } }); onDropdownVisibleChange(open, legacyParam); } }, [onDropdownVisibleChange]); // ======================== Warning ======================== if (process.env.NODE_ENV !== 'production') { (0, _warningPropsUtil.default)(props); } // ======================== Render ========================= // We pass some props into select props style var selectProps = { optionLabelProp: null, optionFilterProp: treeNodeFilterProp, dropdownAlign: dropdownPopupAlign, internalProps: { mark: _generator.INTERNAL_PROPS_MARK, onClear: onInternalClear, skipTriggerChange: true, skipTriggerSelect: true, onRawSelect: onInternalSelect, onRawDeselect: onInternalDeselect } }; if ('filterTreeNode' in props) { selectProps.filterOption = filterTreeNode; } return React.createElement(_Context.SelectContext.Provider, { value: { checkable: mergedCheckable, loadData: loadData, treeLoadedKeys: treeLoadedKeys, onTreeLoad: onTreeLoad, checkedKeys: rawValues, halfCheckedKeys: rawHalfCheckedKeys, treeDefaultExpandAll: treeDefaultExpandAll, treeExpandedKeys: treeExpandedKeys, treeDefaultExpandedKeys: treeDefaultExpandedKeys, onTreeExpand: onTreeExpand, treeIcon: treeIcon, treeMotion: treeMotion, showTreeIcon: showTreeIcon, switcherIcon: switcherIcon, treeLine: treeLine, treeNodeFilterProp: treeNodeFilterProp } }, React.createElement(RefSelect, Object.assign({ ref: selectRef, mode: mergedMultiple ? 'multiple' : null }, props, selectProps, { value: selectValues, // We will handle this ourself since we need calculate conduction labelInValue: true, options: mergedTreeData, onChange: null, onSelect: null, onDeselect: null, onDropdownVisibleChange: onInternalDropdownVisibleChange }))); }); // Use class component since typescript not support generic // by `forwardRef` with function component yet. var TreeSelect = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(TreeSelect, _React$Component); var _super = (0, _createSuper2.default)(TreeSelect); function TreeSelect() { var _this; (0, _classCallCheck2.default)(this, TreeSelect); _this = _super.apply(this, arguments); _this.selectRef = React.createRef(); _this.focus = function () { _this.selectRef.current.focus(); }; _this.blur = function () { _this.selectRef.current.blur(); }; return _this; } (0, _createClass2.default)(TreeSelect, [{ key: "render", value: function render() { return React.createElement(RefTreeSelect, Object.assign({ ref: this.selectRef }, this.props)); } }]); return TreeSelect; }(React.Component); TreeSelect.TreeNode = _TreeNode.default; TreeSelect.SHOW_ALL = _strategyUtil.SHOW_ALL; TreeSelect.SHOW_PARENT = _strategyUtil.SHOW_PARENT; TreeSelect.SHOW_CHILD = _strategyUtil.SHOW_CHILD; var _default = TreeSelect; exports.default = _default; }).call(this,require('_process')) },{"./Context":818,"./OptionList":819,"./TreeNode":820,"./hooks/useKeyValueMap":822,"./hooks/useKeyValueMapping":823,"./hooks/useSelectValues":824,"./hooks/useTreeData":825,"./utils/legacyUtil":827,"./utils/strategyUtil":828,"./utils/valueUtil":829,"./utils/warningPropsUtil":830,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"_process":1,"rc-select/lib/generate":740,"rc-select/lib/interface/generator":748,"rc-select/lib/utils/valueUtil":751,"rc-tree/lib/utils/conductUtil":839,"rc-tree/lib/utils/treeUtil":841,"rc-util/lib/hooks/useMergedState":871,"rc-util/lib/warning":879,"react":"react"}],822:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useKeyValueMap; var React = _interopRequireWildcard(require("react")); /** * Return cached Key Value map with DataNode. * Only re-calculate when `flattenOptions` changed. */ function useKeyValueMap(flattenOptions) { return React.useMemo(function () { var cacheKeyMap = new Map(); var cacheValueMap = new Map(); // Cache options by key flattenOptions.forEach(function (dataNode) { cacheKeyMap.set(dataNode.key, dataNode); cacheValueMap.set(dataNode.data.value, dataNode); }); return [cacheKeyMap, cacheValueMap]; }, [flattenOptions]); } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],823:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.isDisabled = isDisabled; exports.default = useKeyValueMapping; var React = _interopRequireWildcard(require("react")); function isDisabled(dataNode, skipType) { if (!dataNode) { return true; } var _dataNode$data = dataNode.data, disabled = _dataNode$data.disabled, disableCheckbox = _dataNode$data.disableCheckbox; switch (skipType) { case 'select': return disabled; case 'checkbox': return disabled || disableCheckbox; } return false; } function useKeyValueMapping(cacheKeyMap, cacheValueMap) { var getEntityByKey = React.useCallback(function (key) { var skipType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'select'; var ignoreDisabledCheck = arguments.length > 2 ? arguments[2] : undefined; var dataNode = cacheKeyMap.get(key); if (!ignoreDisabledCheck && isDisabled(dataNode, skipType)) { return null; } return dataNode; }, [cacheKeyMap]); var getEntityByValue = React.useCallback(function (value) { var skipType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'select'; var ignoreDisabledCheck = arguments.length > 2 ? arguments[2] : undefined; var dataNode = cacheValueMap.get(value); if (!ignoreDisabledCheck && isDisabled(dataNode, skipType)) { return null; } return dataNode; }, [cacheValueMap]); return [getEntityByKey, getEntityByValue]; } },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],824:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useSelectValues; var React = _interopRequireWildcard(require("react")); var _valueUtil = require("../utils/valueUtil"); var _strategyUtil = require("../utils/strategyUtil"); /** Return */ function useSelectValues(rawValues, _ref) { var value = _ref.value, getEntityByValue = _ref.getEntityByValue, getEntityByKey = _ref.getEntityByKey, treeConduction = _ref.treeConduction, showCheckedStrategy = _ref.showCheckedStrategy, conductKeyEntities = _ref.conductKeyEntities, getLabelProp = _ref.getLabelProp; return React.useMemo(function () { var mergedRawValues = rawValues; if (treeConduction) { var rawKeys = (0, _strategyUtil.formatStrategyKeys)(rawValues.map(function (val) { var entity = getEntityByValue(val); return entity ? entity.key : val; }), showCheckedStrategy, conductKeyEntities); mergedRawValues = rawKeys.map(function (key) { var entity = getEntityByKey(key); return entity ? entity.data.value : key; }); } return (0, _valueUtil.getRawValueLabeled)(mergedRawValues, value, getEntityByValue, getLabelProp); }, [rawValues, value, treeConduction, showCheckedStrategy, getEntityByValue]); } },{"../utils/strategyUtil":828,"../utils/valueUtil":829,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],825:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useTreeData; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _legacyUtil = require("../utils/legacyUtil"); var MAX_WARNING_TIMES = 10; function parseSimpleTreeData(treeData, _ref) { var id = _ref.id, pId = _ref.pId, rootPId = _ref.rootPId; var keyNodes = {}; var rootNodeList = []; // Fill in the map var nodeList = treeData.map(function (node) { var clone = (0, _objectSpread2.default)({}, node); var key = clone[id]; keyNodes[key] = clone; clone.key = clone.key || key; return clone; }); // Connect tree nodeList.forEach(function (node) { var parentKey = node[pId]; var parent = keyNodes[parentKey]; // Fill parent if (parent) { parent.children = parent.children || []; parent.children.push(node); } // Fill root tree node if (parentKey === rootPId || !parent && rootPId === null) { rootNodeList.push(node); } }); return rootNodeList; } /** * Format `treeData` with `value` & `key` which is used for calculation */ function formatTreeData(treeData, getLabelProp) { var warningTimes = 0; var valueSet = new Set(); function dig(dataNodes) { return (dataNodes || []).map(function (node) { var key = node.key, value = node.value, children = node.children, rest = (0, _objectWithoutProperties2.default)(node, ["key", "value", "children"]); var mergedValue = 'value' in node ? value : key; var dataNode = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rest), {}, { key: key !== null && key !== undefined ? key : mergedValue, value: mergedValue, title: getLabelProp(node) }); // Check `key` & `value` and warning user if (process.env.NODE_ENV !== 'production') { if (key !== null && key !== undefined && value !== undefined && String(key) !== String(value) && warningTimes < MAX_WARNING_TIMES) { warningTimes += 1; (0, _warning.default)(false, "`key` or `value` with TreeNode must be the same or you can remove one of them. key: ".concat(key, ", value: ").concat(value, ".")); } (0, _warning.default)(!valueSet.has(value), "Same `value` exist in the tree: ".concat(value)); valueSet.add(value); } if ('children' in node) { dataNode.children = dig(children); } return dataNode; }); } return dig(treeData); } /** * Convert `treeData` or `children` into formatted `treeData`. * Will not re-calculate if `treeData` or `children` not change. */ function useTreeData(treeData, children, _ref2) { var getLabelProp = _ref2.getLabelProp, simpleMode = _ref2.simpleMode; var cacheRef = React.useRef({}); if (treeData) { cacheRef.current.formatTreeData = cacheRef.current.treeData === treeData ? cacheRef.current.formatTreeData : formatTreeData(simpleMode ? parseSimpleTreeData(treeData, (0, _objectSpread2.default)({ id: 'id', pId: 'pId', rootPId: null }, simpleMode !== true ? simpleMode : {})) : treeData, getLabelProp); cacheRef.current.treeData = treeData; } else { cacheRef.current.formatTreeData = cacheRef.current.children === children ? cacheRef.current.formatTreeData : formatTreeData((0, _legacyUtil.convertChildrenToData)(children), getLabelProp); } return cacheRef.current.formatTreeData; } }).call(this,require('_process')) },{"../utils/legacyUtil":827,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"_process":1,"rc-util/lib/warning":879,"react":"react"}],826:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "TreeNode", { enumerable: true, get: function get() { return _TreeNode.default; } }); Object.defineProperty(exports, "SHOW_ALL", { enumerable: true, get: function get() { return _strategyUtil.SHOW_ALL; } }); Object.defineProperty(exports, "SHOW_CHILD", { enumerable: true, get: function get() { return _strategyUtil.SHOW_CHILD; } }); Object.defineProperty(exports, "SHOW_PARENT", { enumerable: true, get: function get() { return _strategyUtil.SHOW_PARENT; } }); exports.default = void 0; var _TreeSelect = _interopRequireDefault(require("./TreeSelect")); var _TreeNode = _interopRequireDefault(require("./TreeNode")); var _strategyUtil = require("./utils/strategyUtil"); var _default = _TreeSelect.default; exports.default = _default; },{"./TreeNode":820,"./TreeSelect":821,"./utils/strategyUtil":828,"@babel/runtime/helpers/interopRequireDefault":192}],827:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.convertChildrenToData = convertChildrenToData; exports.fillLegacyProps = fillLegacyProps; exports.fillAdditionalInfo = fillAdditionalInfo; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _TreeNode = _interopRequireDefault(require("../TreeNode")); function convertChildrenToData(nodes) { return (0, _toArray.default)(nodes).map(function (node) { if (!React.isValidElement(node) || !node.type) { return null; } var key = node.key, _node$props = node.props, children = _node$props.children, value = _node$props.value, restProps = (0, _objectWithoutProperties2.default)(_node$props, ["children", "value"]); var data = (0, _objectSpread2.default)({ key: key, value: value }, restProps); var childData = convertChildrenToData(children); if (childData.length) { data.children = childData; } return data; }).filter(function (data) { return data; }); } function fillLegacyProps(dataNode) { // Skip if not dataNode exist if (!dataNode) { return dataNode; } var cloneNode = (0, _objectSpread2.default)({}, dataNode); if (!('props' in cloneNode)) { Object.defineProperty(cloneNode, 'props', { get: function get() { (0, _warning.default)(false, 'New `rc-tree-select` not support return node instance as argument anymore. Please consider to remove `props` access.'); return cloneNode; } }); } return cloneNode; } function fillAdditionalInfo(extra, triggerValue, checkedValues, treeData, showPosition) { var triggerNode = null; var nodeList = null; function generateMap() { function dig(list) { var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '0'; var parentIncluded = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; return list.map(function (dataNode, index) { var pos = "".concat(level, "-").concat(index); var included = checkedValues.includes(dataNode.value); var children = dig(dataNode.children || [], pos, included); var node = React.createElement(_TreeNode.default, Object.assign({}, dataNode), children.map(function (child) { return child.node; })); // Link with trigger node if (triggerValue === dataNode.value) { triggerNode = node; } if (included) { var checkedNode = { pos: pos, node: node, children: children }; if (!parentIncluded) { nodeList.push(checkedNode); } return checkedNode; } return null; }).filter(function (node) { return node; }); } if (!nodeList) { nodeList = []; dig(treeData); // Sort to keep the checked node length nodeList.sort(function (_ref, _ref2) { var val1 = _ref.node.props.value; var val2 = _ref2.node.props.value; var index1 = checkedValues.indexOf(val1); var index2 = checkedValues.indexOf(val2); return index1 - index2; }); } } Object.defineProperty(extra, 'triggerNode', { get: function get() { (0, _warning.default)(false, '`triggerNode` is deprecated. Please consider decoupling data with node.'); generateMap(); return triggerNode; } }); Object.defineProperty(extra, 'allCheckedNodes', { get: function get() { (0, _warning.default)(false, '`allCheckedNodes` is deprecated. Please consider decoupling data with node.'); generateMap(); if (showPosition) { return nodeList; } return nodeList.map(function (_ref3) { var node = _ref3.node; return node; }); } }); } },{"../TreeNode":820,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"rc-util/lib/Children/toArray":858,"rc-util/lib/warning":879,"react":"react"}],828:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatStrategyKeys = formatStrategyKeys; exports.SHOW_CHILD = exports.SHOW_PARENT = exports.SHOW_ALL = void 0; var _valueUtil = require("./valueUtil"); var SHOW_ALL = 'SHOW_ALL'; exports.SHOW_ALL = SHOW_ALL; var SHOW_PARENT = 'SHOW_PARENT'; exports.SHOW_PARENT = SHOW_PARENT; var SHOW_CHILD = 'SHOW_CHILD'; exports.SHOW_CHILD = SHOW_CHILD; function formatStrategyKeys(keys, strategy, keyEntities) { var keySet = new Set(keys); if (strategy === SHOW_CHILD) { return keys.filter(function (key) { var entity = keyEntities[key]; if (entity && entity.children && entity.children.every(function (_ref) { var node = _ref.node; return (0, _valueUtil.isCheckDisabled)(node) || keySet.has(node.key); })) { return false; } return true; }); } if (strategy === SHOW_PARENT) { return keys.filter(function (key) { var entity = keyEntities[key]; var parent = entity ? entity.parent : null; if (parent && !(0, _valueUtil.isCheckDisabled)(parent.node) && keySet.has(parent.node.key)) { return false; } return true; }); } return keys; } },{"./valueUtil":829}],829:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.toArray = toArray; exports.findValueOption = findValueOption; exports.isValueDisabled = isValueDisabled; exports.isCheckDisabled = isCheckDisabled; exports.flattenOptions = flattenOptions; exports.filterOptions = filterOptions; exports.getRawValueLabeled = getRawValueLabeled; exports.addValue = addValue; exports.removeValue = removeValue; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _treeUtil = require("rc-tree/lib/utils/treeUtil"); var _legacyUtil = require("./legacyUtil"); function toArray(value) { if (Array.isArray(value)) { return value; } return value !== undefined ? [value] : []; } function findValueOption(values, options) { var optionMap = new Map(); options.forEach(function (flattenItem) { var data = flattenItem.data; optionMap.set(data.value, data); }); return values.map(function (val) { return (0, _legacyUtil.fillLegacyProps)(optionMap.get(val)); }); } function isValueDisabled(value, options) { var option = findValueOption([value], options)[0]; if (option) { return option.disabled; } return false; } function isCheckDisabled(node) { return node.disabled || node.disableCheckbox || node.checkable === false; } function getLevel(_ref) { var parent = _ref.parent; var level = 0; var current = parent; while (current) { current = current.parent; level += 1; } return level; } /** * Before reuse `rc-tree` logic, we need to add key since TreeSelect use `value` instead of `key`. */ function flattenOptions(options) { // Add missing key function fillKey(list) { return (list || []).map(function (node) { var value = node.value, key = node.key, children = node.children; var clone = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, node), {}, { key: 'key' in node ? key : value }); if (children) { clone.children = fillKey(children); } return clone; }); } var flattenList = (0, _treeUtil.flattenTreeData)(fillKey(options), true); return flattenList.map(function (node) { return { key: node.data.key, data: node.data, level: getLevel(node) }; }); } function getDefaultFilterOption(optionFilterProp) { return function (searchValue, dataNode) { var value = dataNode[optionFilterProp]; return String(value).toLowerCase().includes(String(searchValue).toLowerCase()); }; } /** Filter options and return a new options by the search text */ function filterOptions(searchValue, options, _ref2) { var optionFilterProp = _ref2.optionFilterProp, filterOption = _ref2.filterOption; if (filterOption === false) { return options; } var filterOptionFunc; if (typeof filterOption === 'function') { filterOptionFunc = filterOption; } else { filterOptionFunc = getDefaultFilterOption(optionFilterProp); } function dig(list) { var keepAll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return list.map(function (dataNode) { var children = dataNode.children; var match = keepAll || filterOptionFunc(searchValue, (0, _legacyUtil.fillLegacyProps)(dataNode)); var childList = dig(children || [], match); if (match || childList.length) { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, dataNode), {}, { children: childList }); } return null; }).filter(function (node) { return node; }); } return dig(options); } function getRawValueLabeled(values, prevValue, getEntityByValue, getLabelProp) { var valueMap = new Map(); toArray(prevValue).forEach(function (item) { if (item && (0, _typeof2.default)(item) === 'object' && 'value' in item) { valueMap.set(item.value, item); } }); return values.map(function (val) { var item = { value: val }; var entity = getEntityByValue(val, 'select', true); var label = entity ? getLabelProp(entity.data) : val; if (valueMap.has(val)) { var labeledValue = valueMap.get(val); item.label = 'label' in labeledValue ? labeledValue.label : label; if ('halfChecked' in labeledValue) { item.halfChecked = labeledValue.halfChecked; } } else { item.label = label; } return item; }); } function addValue(rawValues, value) { var values = new Set(rawValues); values.add(value); return Array.from(values); } function removeValue(rawValues, value) { var values = new Set(rawValues); values.delete(value); return Array.from(values); } },{"./legacyUtil":827,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/typeof":208,"rc-tree/lib/utils/treeUtil":841}],830:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _valueUtil = require("./valueUtil"); function warningProps(props) { var searchPlaceholder = props.searchPlaceholder, treeCheckStrictly = props.treeCheckStrictly, treeCheckable = props.treeCheckable, labelInValue = props.labelInValue, value = props.value, multiple = props.multiple; (0, _warning.default)(!searchPlaceholder, '`searchPlaceholder` has been removed.'); if (treeCheckStrictly && labelInValue === false) { (0, _warning.default)(false, '`treeCheckStrictly` will force set `labelInValue` to `true`.'); } if (labelInValue || treeCheckStrictly) { (0, _warning.default)((0, _valueUtil.toArray)(value).every(function (val) { return val && (0, _typeof2.default)(val) === 'object' && 'value' in val; }), 'Invalid prop `value` supplied to `TreeSelect`. You should use { label: string, value: string | number } or [{ label: string, value: string | number }] instead.'); } if (treeCheckStrictly || multiple || treeCheckable) { (0, _warning.default)(!value || Array.isArray(value), '`value` should be an array when `TreeSelect` is checkable or multiple.'); } else { (0, _warning.default)(!Array.isArray(value), '`value` should not be array when `TreeSelect` is single mode.'); } } var _default = warningProps; exports.default = _default; },{"./valueUtil":829,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/typeof":208,"rc-util/lib/warning":879}],831:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var Indent = function Indent(_ref) { var prefixCls = _ref.prefixCls, level = _ref.level, isStart = _ref.isStart, isEnd = _ref.isEnd; if (!level) { return null; } var baseClassName = "".concat(prefixCls, "-indent-unit"); var list = []; for (var i = 0; i < level; i += 1) { var _classNames; list.push(React.createElement("span", { key: i, className: (0, _classnames.default)(baseClassName, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(baseClassName, "-start"), isStart[i + 1]), (0, _defineProperty2.default)(_classNames, "".concat(baseClassName, "-end"), isEnd[i + 1]), (0, _defineProperty2.default)(_classNames, "".concat(baseClassName, "-end-first-level"), !i && isEnd[0]), _classNames)) })); } return React.createElement("span", { "aria-hidden": "true", className: "".concat(prefixCls, "-indent") }, list); }; var _default = Indent; exports.default = _default; },{"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"classnames":455,"react":"react"}],832:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcMotion = _interopRequireDefault(require("rc-motion")); var _TreeNode = _interopRequireDefault(require("./TreeNode")); var _treeUtil = require("./utils/treeUtil"); var _contextTypes = require("./contextTypes"); var MotionTreeNode = function MotionTreeNode(_ref, ref) { var className = _ref.className, style = _ref.style, motion = _ref.motion, motionNodes = _ref.motionNodes, motionType = _ref.motionType, onOriginMotionStart = _ref.onMotionStart, onOriginMotionEnd = _ref.onMotionEnd, active = _ref.active, treeNodeRequiredProps = _ref.treeNodeRequiredProps, props = (0, _objectWithoutProperties2.default)(_ref, ["className", "style", "motion", "motionNodes", "motionType", "onMotionStart", "onMotionEnd", "active", "treeNodeRequiredProps"]); var _React$useState = React.useState(true), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1]; var _React$useContext = React.useContext(_contextTypes.TreeContext), prefixCls = _React$useContext.prefixCls; var motionedRef = React.useRef(false); var onMotionEnd = function onMotionEnd() { if (!motionedRef.current) { onOriginMotionEnd(); } motionedRef.current = true; }; (0, React.useEffect)(function () { if (motionNodes && motionType === 'hide' && visible) { setVisible(false); } }, [motionNodes]); (0, React.useEffect)(function () { // Trigger motion only when patched if (motionNodes) { onOriginMotionStart(); } return function () { if (motionNodes) { onMotionEnd(); } }; }, []); if (motionNodes) { return React.createElement(_rcMotion.default, Object.assign({ ref: ref, visible: visible }, motion, { motionAppear: motionType === 'show', onAppearEnd: onMotionEnd, onLeaveEnd: onMotionEnd }), function (_ref2, motionRef) { var motionClassName = _ref2.className, motionStyle = _ref2.style; return React.createElement("div", { ref: motionRef, className: (0, _classnames.default)("".concat(prefixCls, "-treenode-motion"), motionClassName), style: motionStyle }, motionNodes.map(function (treeNode) { var _treeNode$data = treeNode.data, key = _treeNode$data.key, restProps = (0, _objectWithoutProperties2.default)(_treeNode$data, ["key"]), isStart = treeNode.isStart, isEnd = treeNode.isEnd; delete restProps.children; var treeNodeProps = (0, _treeUtil.getTreeNodeProps)(key, treeNodeRequiredProps); return React.createElement(_TreeNode.default, Object.assign({}, restProps, treeNodeProps, { active: active, data: treeNode.data, key: key, isStart: isStart, isEnd: isEnd })); })); }); } return React.createElement(_TreeNode.default, Object.assign({ domRef: ref, className: className, style: style }, props, { active: active })); }; MotionTreeNode.displayName = 'MotionTreeNode'; var RefMotionTreeNode = React.forwardRef(MotionTreeNode); var _default = RefMotionTreeNode; exports.default = _default; },{"./TreeNode":835,"./contextTypes":836,"./utils/treeUtil":841,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-motion":661,"react":"react"}],833:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getMinimumRangeTransitionRange = getMinimumRangeTransitionRange; exports.default = exports.MotionEntity = exports.MOTION_KEY = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _rcVirtualList = _interopRequireDefault(require("rc-virtual-list")); var _MotionTreeNode = _interopRequireDefault(require("./MotionTreeNode")); var _diffUtil = require("./utils/diffUtil"); var _treeUtil = require("./utils/treeUtil"); /** * Handle virtual list of the TreeNodes. */ var HIDDEN_STYLE = { width: 0, height: 0, display: 'flex', overflow: 'hidden', opacity: 0, border: 0, padding: 0, margin: 0 }; var noop = function noop() {}; var MOTION_KEY = "RC_TREE_MOTION_".concat(Math.random()); exports.MOTION_KEY = MOTION_KEY; var MotionNode = { key: MOTION_KEY }; var MotionEntity = { key: MOTION_KEY, level: 0, index: 0, pos: '0', node: MotionNode }; exports.MotionEntity = MotionEntity; var MotionFlattenData = { parent: null, children: [], pos: MotionEntity.pos, data: MotionNode, /** Hold empty list here since we do not use it */ isStart: [], isEnd: [] }; /** * We only need get visible content items to play the animation. */ function getMinimumRangeTransitionRange(list, virtual, height, itemHeight) { if (virtual === false || !height) { return list; } return list.slice(0, Math.ceil(height / itemHeight) + 1); } function itemKey(item) { var key = item.data.key, pos = item.pos; return (0, _treeUtil.getKey)(key, pos); } function getAccessibilityPath(item) { var path = String(item.data.key); var current = item; while (current.parent) { current = current.parent; path = "".concat(current.data.key, " > ").concat(path); } return path; } var RefNodeList = function RefNodeList(props, ref) { var prefixCls = props.prefixCls, data = props.data, selectable = props.selectable, checkable = props.checkable, expandedKeys = props.expandedKeys, selectedKeys = props.selectedKeys, checkedKeys = props.checkedKeys, loadedKeys = props.loadedKeys, loadingKeys = props.loadingKeys, halfCheckedKeys = props.halfCheckedKeys, keyEntities = props.keyEntities, disabled = props.disabled, dragging = props.dragging, dragOverNodeKey = props.dragOverNodeKey, dropPosition = props.dropPosition, motion = props.motion, height = props.height, itemHeight = props.itemHeight, virtual = props.virtual, focusable = props.focusable, activeItem = props.activeItem, focused = props.focused, tabIndex = props.tabIndex, onKeyDown = props.onKeyDown, onFocus = props.onFocus, onBlur = props.onBlur, onActiveChange = props.onActiveChange, onListChangeStart = props.onListChangeStart, onListChangeEnd = props.onListChangeEnd, domProps = (0, _objectWithoutProperties2.default)(props, ["prefixCls", "data", "selectable", "checkable", "expandedKeys", "selectedKeys", "checkedKeys", "loadedKeys", "loadingKeys", "halfCheckedKeys", "keyEntities", "disabled", "dragging", "dragOverNodeKey", "dropPosition", "motion", "height", "itemHeight", "virtual", "focusable", "activeItem", "focused", "tabIndex", "onKeyDown", "onFocus", "onBlur", "onActiveChange", "onListChangeStart", "onListChangeEnd"]); // =============================== Ref ================================ var listRef = React.useRef(null); React.useImperativeHandle(ref, function () { return { scrollTo: function scrollTo(scroll) { listRef.current.scrollTo(scroll); } }; }); // ============================== Motion ============================== var _React$useState = React.useState(expandedKeys), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), prevExpandedKeys = _React$useState2[0], setPrevExpandedKeys = _React$useState2[1]; var _React$useState3 = React.useState(data), _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2), prevData = _React$useState4[0], setPrevData = _React$useState4[1]; var _React$useState5 = React.useState(data), _React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2), transitionData = _React$useState6[0], setTransitionData = _React$useState6[1]; var _React$useState7 = React.useState([]), _React$useState8 = (0, _slicedToArray2.default)(_React$useState7, 2), transitionRange = _React$useState8[0], setTransitionRange = _React$useState8[1]; var _React$useState9 = React.useState(null), _React$useState10 = (0, _slicedToArray2.default)(_React$useState9, 2), motionType = _React$useState10[0], setMotionType = _React$useState10[1]; function onMotionEnd() { setPrevData(data); setTransitionData(data); setTransitionRange([]); setMotionType(null); onListChangeEnd(); } // Do animation if expanded keys changed React.useEffect(function () { setPrevExpandedKeys(expandedKeys); var diffExpanded = (0, _diffUtil.findExpandedKeys)(prevExpandedKeys, expandedKeys); if (diffExpanded.key !== null) { if (diffExpanded.add) { var keyIndex = prevData.findIndex(function (_ref) { var key = _ref.data.key; return key === diffExpanded.key; }); var rangeNodes = getMinimumRangeTransitionRange((0, _diffUtil.getExpandRange)(prevData, data, diffExpanded.key), virtual, height, itemHeight); var newTransitionData = prevData.slice(); newTransitionData.splice(keyIndex + 1, 0, MotionFlattenData); setTransitionData(newTransitionData); setTransitionRange(rangeNodes); setMotionType('show'); } else { var _keyIndex = data.findIndex(function (_ref2) { var key = _ref2.data.key; return key === diffExpanded.key; }); var _rangeNodes = getMinimumRangeTransitionRange((0, _diffUtil.getExpandRange)(data, prevData, diffExpanded.key), virtual, height, itemHeight); var _newTransitionData = data.slice(); _newTransitionData.splice(_keyIndex + 1, 0, MotionFlattenData); setTransitionData(_newTransitionData); setTransitionRange(_rangeNodes); setMotionType('hide'); } } else if (prevData !== data) { // If whole data changed, we just refresh the list setPrevData(data); setTransitionData(data); } }, [expandedKeys, data]); // We should clean up motion if is changed by dragging React.useEffect(function () { if (!dragging) { onMotionEnd(); } }, [dragging]); var mergedData = motion ? transitionData : data; var treeNodeRequiredProps = { expandedKeys: expandedKeys, selectedKeys: selectedKeys, loadedKeys: loadedKeys, loadingKeys: loadingKeys, checkedKeys: checkedKeys, halfCheckedKeys: halfCheckedKeys, dragOverNodeKey: dragOverNodeKey, dropPosition: dropPosition, keyEntities: keyEntities }; return React.createElement(React.Fragment, null, focused && activeItem && React.createElement("span", { style: HIDDEN_STYLE, "aria-live": "assertive" }, getAccessibilityPath(activeItem)), React.createElement("div", { role: "tree" }, React.createElement("input", { style: HIDDEN_STYLE, disabled: focusable === false || disabled, tabIndex: focusable !== false ? tabIndex : null, onKeyDown: onKeyDown, onFocus: onFocus, onBlur: onBlur, value: "", onChange: noop })), React.createElement(_rcVirtualList.default, Object.assign({}, domProps, { data: mergedData, itemKey: itemKey, height: height, fullHeight: false, virtual: virtual, itemHeight: itemHeight, prefixCls: "".concat(prefixCls, "-list"), ref: listRef }), function (treeNode) { var pos = treeNode.pos, _treeNode$data = treeNode.data, key = _treeNode$data.key, restProps = (0, _objectWithoutProperties2.default)(_treeNode$data, ["key"]), isStart = treeNode.isStart, isEnd = treeNode.isEnd; var mergedKey = (0, _treeUtil.getKey)(key, pos); delete restProps.children; var treeNodeProps = (0, _treeUtil.getTreeNodeProps)(mergedKey, treeNodeRequiredProps); return React.createElement(_MotionTreeNode.default, Object.assign({}, restProps, treeNodeProps, { active: activeItem && key === activeItem.data.key, pos: pos, data: treeNode.data, isStart: isStart, isEnd: isEnd, motion: motion, motionNodes: key === MOTION_KEY ? transitionRange : null, motionType: motionType, onMotionStart: onListChangeStart, onMotionEnd: onMotionEnd, treeNodeRequiredProps: treeNodeRequiredProps, onMouseMove: function onMouseMove() { onActiveChange(null); } })); })); }; var NodeList = React.forwardRef(RefNodeList); NodeList.displayName = 'NodeList'; var _default = NodeList; exports.default = _default; },{"./MotionTreeNode":832,"./utils/diffUtil":840,"./utils/treeUtil":841,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"rc-virtual-list":891,"react":"react"}],834:[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _classnames = _interopRequireDefault(require("classnames")); var _contextTypes = require("./contextTypes"); var _util = require("./util"); var _treeUtil = require("./utils/treeUtil"); var _NodeList = _interopRequireWildcard(require("./NodeList")); var _TreeNode = _interopRequireDefault(require("./TreeNode")); var _conductUtil = require("./utils/conductUtil"); // TODO: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/treeview/treeview-2/treeview-2a.html // Fully accessibility support var Tree = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Tree, _React$Component); var _super = (0, _createSuper2.default)(Tree); function Tree() { var _this; (0, _classCallCheck2.default)(this, Tree); _this = _super.apply(this, arguments); _this.destroyed = false; _this.state = { keyEntities: {}, selectedKeys: [], checkedKeys: [], halfCheckedKeys: [], loadedKeys: [], loadingKeys: [], expandedKeys: [], dragging: false, dragNodesKeys: [], dragOverNodeKey: null, dropPosition: null, treeData: [], flattenNodes: [], focused: false, activeKey: null, listChanging: false, prevProps: null }; _this.listRef = React.createRef(); _this.onNodeDragStart = function (event, node) { var _this$state = _this.state, expandedKeys = _this$state.expandedKeys, keyEntities = _this$state.keyEntities; var onDragStart = _this.props.onDragStart; var eventKey = node.props.eventKey; _this.dragNode = node; var newExpandedKeys = (0, _util.arrDel)(expandedKeys, eventKey); _this.setState({ dragging: true, dragNodesKeys: (0, _util.getDragNodesKeys)(eventKey, keyEntities) }); _this.setExpandedKeys(newExpandedKeys); if (onDragStart) { onDragStart({ event: event, node: (0, _treeUtil.convertNodePropsToEventData)(node.props) }); } }; /** * [Legacy] Select handler is less small than node, * so that this will trigger when drag enter node or select handler. * This is a little tricky if customize css without padding. * Better for use mouse move event to refresh drag state. * But let's just keep it to avoid event trigger logic change. */ _this.onNodeDragEnter = function (event, node) { var _this$state2 = _this.state, expandedKeys = _this$state2.expandedKeys, keyEntities = _this$state2.keyEntities, dragNodesKeys = _this$state2.dragNodesKeys; var onDragEnter = _this.props.onDragEnter; var _node$props = node.props, pos = _node$props.pos, eventKey = _node$props.eventKey; if (!_this.dragNode || dragNodesKeys.indexOf(eventKey) !== -1) return; var dropPosition = (0, _util.calcDropPosition)(event, node); // Skip if drag node is self if (_this.dragNode.props.eventKey === eventKey && dropPosition === 0) { _this.setState({ dragOverNodeKey: '', dropPosition: null }); return; } // Ref: https://github.com/react-component/tree/issues/132 // Add timeout to let onDragLevel fire before onDragEnter, // so that we can clean drag props for onDragLeave node. // Macro task for this: // https://html.spec.whatwg.org/multipage/webappapis.html#clean-up-after-running-script setTimeout(function () { // Update drag over node _this.setState({ dragOverNodeKey: eventKey, dropPosition: dropPosition }); // Side effect for delay drag if (!_this.delayedDragEnterLogic) { _this.delayedDragEnterLogic = {}; } Object.keys(_this.delayedDragEnterLogic).forEach(function (key) { clearTimeout(_this.delayedDragEnterLogic[key]); }); _this.delayedDragEnterLogic[pos] = window.setTimeout(function () { if (!_this.state.dragging) return; var newExpandedKeys = (0, _toConsumableArray2.default)(expandedKeys); var entity = keyEntities[eventKey]; if (entity && (entity.children || []).length) { newExpandedKeys = (0, _util.arrAdd)(expandedKeys, eventKey); } if (!('expandedKeys' in _this.props)) { _this.setExpandedKeys(newExpandedKeys); } if (onDragEnter) { onDragEnter({ event: event, node: (0, _treeUtil.convertNodePropsToEventData)(node.props), expandedKeys: newExpandedKeys }); } }, 400); }, 0); }; _this.onNodeDragOver = function (event, node) { var dragNodesKeys = _this.state.dragNodesKeys; var onDragOver = _this.props.onDragOver; var eventKey = node.props.eventKey; if (dragNodesKeys.indexOf(eventKey) !== -1) { return; } // Update drag position if (_this.dragNode && eventKey === _this.state.dragOverNodeKey) { var dropPosition = (0, _util.calcDropPosition)(event, node); if (dropPosition === _this.state.dropPosition) return; _this.setState({ dropPosition: dropPosition }); } if (onDragOver) { onDragOver({ event: event, node: (0, _treeUtil.convertNodePropsToEventData)(node.props) }); } }; _this.onNodeDragLeave = function (event, node) { var onDragLeave = _this.props.onDragLeave; _this.setState({ dragOverNodeKey: '' }); if (onDragLeave) { onDragLeave({ event: event, node: (0, _treeUtil.convertNodePropsToEventData)(node.props) }); } }; _this.onNodeDragEnd = function (event, node) { var onDragEnd = _this.props.onDragEnd; _this.setState({ dragOverNodeKey: '' }); _this.cleanDragState(); if (onDragEnd) { onDragEnd({ event: event, node: (0, _treeUtil.convertNodePropsToEventData)(node.props) }); } _this.dragNode = null; }; _this.onNodeDrop = function (event, node) { var _this$state3 = _this.state, _this$state3$dragNode = _this$state3.dragNodesKeys, dragNodesKeys = _this$state3$dragNode === void 0 ? [] : _this$state3$dragNode, dropPosition = _this$state3.dropPosition; var onDrop = _this.props.onDrop; var _node$props2 = node.props, eventKey = _node$props2.eventKey, pos = _node$props2.pos; _this.setState({ dragOverNodeKey: '' }); _this.cleanDragState(); if (dragNodesKeys.indexOf(eventKey) !== -1) { (0, _warning.default)(false, "Can not drop to dragNode(include it's children node)"); return; } var posArr = (0, _util.posToArr)(pos); var dropResult = { event: event, node: (0, _treeUtil.convertNodePropsToEventData)(node.props), dragNode: _this.dragNode ? (0, _treeUtil.convertNodePropsToEventData)(_this.dragNode.props) : null, dragNodesKeys: dragNodesKeys.slice(), dropPosition: dropPosition + Number(posArr[posArr.length - 1]), dropToGap: false }; if (dropPosition !== 0) { dropResult.dropToGap = true; } if (onDrop) { onDrop(dropResult); } _this.dragNode = null; }; _this.cleanDragState = function () { var dragging = _this.state.dragging; if (dragging) { _this.setState({ dragging: false }); } }; _this.onNodeClick = function (e, treeNode) { var onClick = _this.props.onClick; if (onClick) { onClick(e, treeNode); } }; _this.onNodeDoubleClick = function (e, treeNode) { var onDoubleClick = _this.props.onDoubleClick; if (onDoubleClick) { onDoubleClick(e, treeNode); } }; _this.onNodeSelect = function (e, treeNode) { var selectedKeys = _this.state.selectedKeys; var keyEntities = _this.state.keyEntities; var _this$props = _this.props, onSelect = _this$props.onSelect, multiple = _this$props.multiple; var selected = treeNode.selected, key = treeNode.key; var targetSelected = !selected; // Update selected keys if (!targetSelected) { selectedKeys = (0, _util.arrDel)(selectedKeys, key); } else if (!multiple) { selectedKeys = [key]; } else { selectedKeys = (0, _util.arrAdd)(selectedKeys, key); } // [Legacy] Not found related usage in doc or upper libs var selectedNodes = selectedKeys.map(function (selectedKey) { var entity = keyEntities[selectedKey]; if (!entity) return null; return entity.node; }).filter(function (node) { return node; }); _this.setUncontrolledState({ selectedKeys: selectedKeys }); if (onSelect) { onSelect(selectedKeys, { event: 'select', selected: targetSelected, node: treeNode, selectedNodes: selectedNodes, nativeEvent: e.nativeEvent }); } }; _this.onNodeCheck = function (e, treeNode, checked) { var _this$state4 = _this.state, keyEntities = _this$state4.keyEntities, oriCheckedKeys = _this$state4.checkedKeys, oriHalfCheckedKeys = _this$state4.halfCheckedKeys; var _this$props2 = _this.props, checkStrictly = _this$props2.checkStrictly, onCheck = _this$props2.onCheck; var key = treeNode.key; // Prepare trigger arguments var checkedObj; var eventObj = { event: 'check', node: treeNode, checked: checked, nativeEvent: e.nativeEvent }; if (checkStrictly) { var checkedKeys = checked ? (0, _util.arrAdd)(oriCheckedKeys, key) : (0, _util.arrDel)(oriCheckedKeys, key); var halfCheckedKeys = (0, _util.arrDel)(oriHalfCheckedKeys, key); checkedObj = { checked: checkedKeys, halfChecked: halfCheckedKeys }; eventObj.checkedNodes = checkedKeys.map(function (checkedKey) { return keyEntities[checkedKey]; }).filter(function (entity) { return entity; }).map(function (entity) { return entity.node; }); _this.setUncontrolledState({ checkedKeys: checkedKeys }); } else { // Always fill first var _conductCheck = (0, _conductUtil.conductCheck)([].concat((0, _toConsumableArray2.default)(oriCheckedKeys), [key]), true, keyEntities), _checkedKeys = _conductCheck.checkedKeys, _halfCheckedKeys = _conductCheck.halfCheckedKeys; // If remove, we do it again to correction if (!checked) { var keySet = new Set(_checkedKeys); keySet.delete(key); var _conductCheck2 = (0, _conductUtil.conductCheck)(Array.from(keySet), { checked: false, halfCheckedKeys: _halfCheckedKeys }, keyEntities); _checkedKeys = _conductCheck2.checkedKeys; _halfCheckedKeys = _conductCheck2.halfCheckedKeys; } checkedObj = _checkedKeys; // [Legacy] This is used for `rc-tree-select` eventObj.checkedNodes = []; eventObj.checkedNodesPositions = []; eventObj.halfCheckedKeys = _halfCheckedKeys; _checkedKeys.forEach(function (checkedKey) { var entity = keyEntities[checkedKey]; if (!entity) return; var node = entity.node, pos = entity.pos; eventObj.checkedNodes.push(node); eventObj.checkedNodesPositions.push({ node: node, pos: pos }); }); _this.setUncontrolledState({ checkedKeys: _checkedKeys }, false, { halfCheckedKeys: _halfCheckedKeys }); } if (onCheck) { onCheck(checkedObj, eventObj); } }; _this.onNodeLoad = function (treeNode) { return new Promise(function (resolve) { // We need to get the latest state of loading/loaded keys _this.setState(function (_ref) { var _ref$loadedKeys = _ref.loadedKeys, loadedKeys = _ref$loadedKeys === void 0 ? [] : _ref$loadedKeys, _ref$loadingKeys = _ref.loadingKeys, loadingKeys = _ref$loadingKeys === void 0 ? [] : _ref$loadingKeys; var _this$props3 = _this.props, loadData = _this$props3.loadData, onLoad = _this$props3.onLoad; var key = treeNode.key; if (!loadData || loadedKeys.indexOf(key) !== -1 || loadingKeys.indexOf(key) !== -1) { // react 15 will warn if return null return {}; } // Process load data var promise = loadData(treeNode); promise.then(function () { var _this$state5 = _this.state, currentLoadedKeys = _this$state5.loadedKeys, currentLoadingKeys = _this$state5.loadingKeys; var newLoadedKeys = (0, _util.arrAdd)(currentLoadedKeys, key); var newLoadingKeys = (0, _util.arrDel)(currentLoadingKeys, key); // onLoad should trigger before internal setState to avoid `loadData` trigger twice. // https://github.com/ant-design/ant-design/issues/12464 if (onLoad) { onLoad(newLoadedKeys, { event: 'load', node: treeNode }); } _this.setUncontrolledState({ loadedKeys: newLoadedKeys }); _this.setState({ loadingKeys: newLoadingKeys }); resolve(); }); return { loadingKeys: (0, _util.arrAdd)(loadingKeys, key) }; }); }); }; _this.onNodeMouseEnter = function (event, node) { var onMouseEnter = _this.props.onMouseEnter; if (onMouseEnter) { onMouseEnter({ event: event, node: node }); } }; _this.onNodeMouseLeave = function (event, node) { var onMouseLeave = _this.props.onMouseLeave; if (onMouseLeave) { onMouseLeave({ event: event, node: node }); } }; _this.onNodeContextMenu = function (event, node) { var onRightClick = _this.props.onRightClick; if (onRightClick) { event.preventDefault(); onRightClick({ event: event, node: node }); } }; _this.onFocus = function () { var onFocus = _this.props.onFocus; _this.setState({ focused: true }); if (onFocus) { onFocus.apply(void 0, arguments); } }; _this.onBlur = function () { var onBlur = _this.props.onBlur; _this.setState({ focused: false }); _this.onActiveChange(null); if (onBlur) { onBlur.apply(void 0, arguments); } }; _this.getTreeNodeRequiredProps = function () { var _this$state6 = _this.state, expandedKeys = _this$state6.expandedKeys, selectedKeys = _this$state6.selectedKeys, loadedKeys = _this$state6.loadedKeys, loadingKeys = _this$state6.loadingKeys, checkedKeys = _this$state6.checkedKeys, halfCheckedKeys = _this$state6.halfCheckedKeys, dragOverNodeKey = _this$state6.dragOverNodeKey, dropPosition = _this$state6.dropPosition, keyEntities = _this$state6.keyEntities; return { expandedKeys: expandedKeys || [], selectedKeys: selectedKeys || [], loadedKeys: loadedKeys || [], loadingKeys: loadingKeys || [], checkedKeys: checkedKeys || [], halfCheckedKeys: halfCheckedKeys || [], dragOverNodeKey: dragOverNodeKey, dropPosition: dropPosition, keyEntities: keyEntities }; }; // =========================== Expanded =========================== /** Set uncontrolled `expandedKeys`. This will also auto update `flattenNodes`. */ _this.setExpandedKeys = function (expandedKeys) { var treeData = _this.state.treeData; var flattenNodes = (0, _treeUtil.flattenTreeData)(treeData, expandedKeys); _this.setUncontrolledState({ expandedKeys: expandedKeys, flattenNodes: flattenNodes }, true); }; _this.onNodeExpand = function (e, treeNode) { var expandedKeys = _this.state.expandedKeys; var listChanging = _this.state.listChanging; var _this$props4 = _this.props, onExpand = _this$props4.onExpand, loadData = _this$props4.loadData; var key = treeNode.key, expanded = treeNode.expanded; // Do nothing when motion is in progress if (listChanging) { return; } // Update selected keys var index = expandedKeys.indexOf(key); var targetExpanded = !expanded; (0, _warning.default)(expanded && index !== -1 || !expanded && index === -1, 'Expand state not sync with index check'); if (targetExpanded) { expandedKeys = (0, _util.arrAdd)(expandedKeys, key); } else { expandedKeys = (0, _util.arrDel)(expandedKeys, key); } _this.setExpandedKeys(expandedKeys); if (onExpand) { onExpand(expandedKeys, { node: treeNode, expanded: targetExpanded, nativeEvent: e.nativeEvent }); } // Async Load data if (targetExpanded && loadData) { var loadPromise = _this.onNodeLoad(treeNode); if (loadPromise) { loadPromise.then(function () { // [Legacy] Refresh logic var newFlattenTreeData = (0, _treeUtil.flattenTreeData)(_this.state.treeData, expandedKeys); _this.setUncontrolledState({ flattenNodes: newFlattenTreeData }); }); } } }; _this.onListChangeStart = function () { _this.setUncontrolledState({ listChanging: true }); }; _this.onListChangeEnd = function () { setTimeout(function () { _this.setUncontrolledState({ listChanging: false }); }); }; // =========================== Keyboard =========================== _this.onActiveChange = function (newActiveKey) { var activeKey = _this.state.activeKey; var onActiveChange = _this.props.onActiveChange; if (activeKey === newActiveKey) { return; } _this.setState({ activeKey: newActiveKey }); if (newActiveKey !== null) { _this.scrollTo({ key: newActiveKey }); } if (onActiveChange) { onActiveChange(newActiveKey); } }; _this.getActiveItem = function () { var _this$state7 = _this.state, activeKey = _this$state7.activeKey, flattenNodes = _this$state7.flattenNodes; if (activeKey === null) { return null; } return flattenNodes.find(function (_ref2) { var key = _ref2.data.key; return key === activeKey; }) || null; }; _this.offsetActiveKey = function (offset) { var _this$state8 = _this.state, flattenNodes = _this$state8.flattenNodes, activeKey = _this$state8.activeKey; var index = flattenNodes.findIndex(function (_ref3) { var key = _ref3.data.key; return key === activeKey; }); // Align with index if (index === -1 && offset < 0) { index = flattenNodes.length; } index = (index + offset + flattenNodes.length) % flattenNodes.length; var item = flattenNodes[index]; if (item) { var key = item.data.key; _this.onActiveChange(key); } else { _this.onActiveChange(null); } }; _this.onKeyDown = function (event) { var _this$state9 = _this.state, activeKey = _this$state9.activeKey, expandedKeys = _this$state9.expandedKeys, checkedKeys = _this$state9.checkedKeys; var _this$props5 = _this.props, onKeyDown = _this$props5.onKeyDown, checkable = _this$props5.checkable, selectable = _this$props5.selectable; // >>>>>>>>>> Direction switch (event.which) { case _KeyCode.default.UP: { _this.offsetActiveKey(-1); event.preventDefault(); break; } case _KeyCode.default.DOWN: { _this.offsetActiveKey(1); event.preventDefault(); break; } } // >>>>>>>>>> Expand & Selection var activeItem = _this.getActiveItem(); if (activeItem && activeItem.data) { var treeNodeRequiredProps = _this.getTreeNodeRequiredProps(); var expandable = activeItem.data.isLeaf === false || !!(activeItem.data.children || []).length; var eventNode = (0, _treeUtil.convertNodePropsToEventData)((0, _objectSpread3.default)((0, _objectSpread3.default)({}, (0, _treeUtil.getTreeNodeProps)(activeKey, treeNodeRequiredProps)), {}, { data: activeItem.data, active: true })); switch (event.which) { // >>> Expand case _KeyCode.default.LEFT: { // Collapse if possible if (expandable && expandedKeys.includes(activeKey)) { _this.onNodeExpand({}, eventNode); } else if (activeItem.parent) { _this.onActiveChange(activeItem.parent.data.key); } event.preventDefault(); break; } case _KeyCode.default.RIGHT: { // Expand if possible if (expandable && !expandedKeys.includes(activeKey)) { _this.onNodeExpand({}, eventNode); } else if (activeItem.children && activeItem.children.length) { _this.onActiveChange(activeItem.children[0].data.key); } event.preventDefault(); break; } // Selection case _KeyCode.default.ENTER: case _KeyCode.default.SPACE: { if (checkable && !eventNode.disabled && eventNode.checkable !== false && !eventNode.disableCheckbox) { _this.onNodeCheck({}, eventNode, !checkedKeys.includes(activeKey)); } else if (!checkable && selectable && !eventNode.disabled && eventNode.selectable !== false) { _this.onNodeSelect({}, eventNode); } break; } } } if (onKeyDown) { onKeyDown(event); } }; /** * Only update the value which is not in props */ _this.setUncontrolledState = function (state) { var atomic = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var forceState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; if (_this.destroyed) { return; } var needSync = false; var allPassed = true; var newState = {}; Object.keys(state).forEach(function (name) { if (name in _this.props) { allPassed = false; return; } needSync = true; newState[name] = state[name]; }); if (needSync && (!atomic || allPassed)) { _this.setState((0, _objectSpread3.default)((0, _objectSpread3.default)({}, newState), forceState)); } }; _this.scrollTo = function (scroll) { _this.listRef.current.scrollTo(scroll); }; return _this; } (0, _createClass2.default)(Tree, [{ key: "componentWillUnmount", value: function componentWillUnmount() { this.destroyed = true; } }, { key: "render", value: function render() { var _classNames; var _this$state10 = this.state, focused = _this$state10.focused, flattenNodes = _this$state10.flattenNodes, keyEntities = _this$state10.keyEntities, dragging = _this$state10.dragging, activeKey = _this$state10.activeKey; var _this$props6 = this.props, prefixCls = _this$props6.prefixCls, className = _this$props6.className, style = _this$props6.style, showLine = _this$props6.showLine, focusable = _this$props6.focusable, _this$props6$tabIndex = _this$props6.tabIndex, tabIndex = _this$props6$tabIndex === void 0 ? 0 : _this$props6$tabIndex, selectable = _this$props6.selectable, showIcon = _this$props6.showIcon, icon = _this$props6.icon, switcherIcon = _this$props6.switcherIcon, draggable = _this$props6.draggable, checkable = _this$props6.checkable, checkStrictly = _this$props6.checkStrictly, disabled = _this$props6.disabled, motion = _this$props6.motion, loadData = _this$props6.loadData, filterTreeNode = _this$props6.filterTreeNode, height = _this$props6.height, itemHeight = _this$props6.itemHeight, virtual = _this$props6.virtual, titleRender = _this$props6.titleRender, onContextMenu = _this$props6.onContextMenu; var domProps = (0, _util.getDataAndAria)(this.props); return React.createElement(_contextTypes.TreeContext.Provider, { value: { prefixCls: prefixCls, selectable: selectable, showIcon: showIcon, icon: icon, switcherIcon: switcherIcon, draggable: draggable, checkable: checkable, checkStrictly: checkStrictly, disabled: disabled, keyEntities: keyEntities, loadData: loadData, filterTreeNode: filterTreeNode, titleRender: titleRender, onNodeClick: this.onNodeClick, onNodeDoubleClick: this.onNodeDoubleClick, onNodeExpand: this.onNodeExpand, onNodeSelect: this.onNodeSelect, onNodeCheck: this.onNodeCheck, onNodeLoad: this.onNodeLoad, onNodeMouseEnter: this.onNodeMouseEnter, onNodeMouseLeave: this.onNodeMouseLeave, onNodeContextMenu: this.onNodeContextMenu, onNodeDragStart: this.onNodeDragStart, onNodeDragEnter: this.onNodeDragEnter, onNodeDragOver: this.onNodeDragOver, onNodeDragLeave: this.onNodeDragLeave, onNodeDragEnd: this.onNodeDragEnd, onNodeDrop: this.onNodeDrop } }, React.createElement("div", { className: (0, _classnames.default)(prefixCls, className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-show-line"), showLine), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-focused"), focused), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-active-focused"), activeKey !== null), _classNames)) }, React.createElement(_NodeList.default, Object.assign({ ref: this.listRef, prefixCls: prefixCls, style: style, data: flattenNodes, disabled: disabled, selectable: selectable, checkable: !!checkable, motion: motion, dragging: dragging, height: height, itemHeight: itemHeight, virtual: virtual, focusable: focusable, focused: focused, tabIndex: tabIndex, activeItem: this.getActiveItem(), onFocus: this.onFocus, onBlur: this.onBlur, onKeyDown: this.onKeyDown, onActiveChange: this.onActiveChange, onListChangeStart: this.onListChangeStart, onListChangeEnd: this.onListChangeEnd, onContextMenu: onContextMenu }, this.getTreeNodeRequiredProps(), domProps)))); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, prevState) { var prevProps = prevState.prevProps; var newState = { prevProps: props }; function needSync(name) { return !prevProps && name in props || prevProps && prevProps[name] !== props[name]; } // ================== Tree Node ================== var treeData; // Check if `treeData` or `children` changed and save into the state. if (needSync('treeData')) { treeData = props.treeData; } else if (needSync('children')) { (0, _warning.default)(false, '`children` of Tree is deprecated. Please use `treeData` instead.'); treeData = (0, _treeUtil.convertTreeToData)(props.children); } // Save flatten nodes info and convert `treeData` into keyEntities if (treeData) { newState.treeData = treeData; var entitiesMap = (0, _treeUtil.convertDataToEntities)(treeData); newState.keyEntities = (0, _objectSpread3.default)((0, _defineProperty2.default)({}, _NodeList.MOTION_KEY, _NodeList.MotionEntity), entitiesMap.keyEntities); // Warning if treeNode not provide key if (process.env.NODE_ENV !== 'production') { (0, _treeUtil.warningWithoutKey)(treeData); } } var keyEntities = newState.keyEntities || prevState.keyEntities; // ================ expandedKeys ================= if (needSync('expandedKeys') || prevProps && needSync('autoExpandParent')) { newState.expandedKeys = props.autoExpandParent || !prevProps && props.defaultExpandParent ? (0, _util.conductExpandParent)(props.expandedKeys, keyEntities) : props.expandedKeys; } else if (!prevProps && props.defaultExpandAll) { var cloneKeyEntities = (0, _objectSpread3.default)({}, keyEntities); delete cloneKeyEntities[_NodeList.MOTION_KEY]; newState.expandedKeys = Object.keys(cloneKeyEntities).map(function (key) { return cloneKeyEntities[key].key; }); } else if (!prevProps && props.defaultExpandedKeys) { newState.expandedKeys = props.autoExpandParent || props.defaultExpandParent ? (0, _util.conductExpandParent)(props.defaultExpandedKeys, keyEntities) : props.defaultExpandedKeys; } if (!newState.expandedKeys) { delete newState.expandedKeys; } // ================ flattenNodes ================= if (treeData || newState.expandedKeys) { var flattenNodes = (0, _treeUtil.flattenTreeData)(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys); newState.flattenNodes = flattenNodes; } // ================ selectedKeys ================= if (props.selectable) { if (needSync('selectedKeys')) { newState.selectedKeys = (0, _util.calcSelectedKeys)(props.selectedKeys, props); } else if (!prevProps && props.defaultSelectedKeys) { newState.selectedKeys = (0, _util.calcSelectedKeys)(props.defaultSelectedKeys, props); } } // ================= checkedKeys ================= if (props.checkable) { var checkedKeyEntity; if (needSync('checkedKeys')) { checkedKeyEntity = (0, _util.parseCheckedKeys)(props.checkedKeys) || {}; } else if (!prevProps && props.defaultCheckedKeys) { checkedKeyEntity = (0, _util.parseCheckedKeys)(props.defaultCheckedKeys) || {}; } else if (treeData) { // If `treeData` changed, we also need check it checkedKeyEntity = (0, _util.parseCheckedKeys)(props.checkedKeys) || { checkedKeys: prevState.checkedKeys, halfCheckedKeys: prevState.halfCheckedKeys }; } if (checkedKeyEntity) { var _checkedKeyEntity = checkedKeyEntity, _checkedKeyEntity$che = _checkedKeyEntity.checkedKeys, checkedKeys = _checkedKeyEntity$che === void 0 ? [] : _checkedKeyEntity$che, _checkedKeyEntity$hal = _checkedKeyEntity.halfCheckedKeys, halfCheckedKeys = _checkedKeyEntity$hal === void 0 ? [] : _checkedKeyEntity$hal; if (!props.checkStrictly) { var conductKeys = (0, _conductUtil.conductCheck)(checkedKeys, true, keyEntities); checkedKeys = conductKeys.checkedKeys; halfCheckedKeys = conductKeys.halfCheckedKeys; } newState.checkedKeys = checkedKeys; newState.halfCheckedKeys = halfCheckedKeys; } } // ================= loadedKeys ================== if (needSync('loadedKeys')) { newState.loadedKeys = props.loadedKeys; } return newState; } }]); return Tree; }(React.Component); Tree.defaultProps = { prefixCls: 'rc-tree', showLine: false, showIcon: true, selectable: true, multiple: false, checkable: false, disabled: false, checkStrictly: false, draggable: false, defaultExpandParent: true, autoExpandParent: false, defaultExpandAll: false, defaultExpandedKeys: [], defaultCheckedKeys: [], defaultSelectedKeys: [] }; Tree.TreeNode = _TreeNode.default; var _default = Tree; exports.default = _default; }).call(this,require('_process')) },{"./NodeList":833,"./TreeNode":835,"./contextTypes":836,"./util":838,"./utils/conductUtil":839,"./utils/treeUtil":841,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/toConsumableArray":207,"_process":1,"classnames":455,"rc-util/lib/KeyCode":865,"rc-util/lib/warning":879,"react":"react"}],835:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.InternalTreeNode = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _contextTypes = require("./contextTypes"); var _util = require("./util"); var _Indent = _interopRequireDefault(require("./Indent")); var _treeUtil = require("./utils/treeUtil"); // @ts-ignore var ICON_OPEN = 'open'; var ICON_CLOSE = 'close'; var defaultTitle = '---'; var InternalTreeNode = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(InternalTreeNode, _React$Component); var _super = (0, _createSuper2.default)(InternalTreeNode); function InternalTreeNode() { var _this; (0, _classCallCheck2.default)(this, InternalTreeNode); _this = _super.apply(this, arguments); _this.state = { dragNodeHighlight: false }; _this.onSelectorClick = function (e) { // Click trigger before select/check operation var onNodeClick = _this.props.context.onNodeClick; onNodeClick(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props)); if (_this.isSelectable()) { _this.onSelect(e); } else { _this.onCheck(e); } }; _this.onSelectorDoubleClick = function (e) { var onNodeDoubleClick = _this.props.context.onNodeDoubleClick; onNodeDoubleClick(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props)); }; _this.onSelect = function (e) { if (_this.isDisabled()) return; var onNodeSelect = _this.props.context.onNodeSelect; e.preventDefault(); onNodeSelect(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props)); }; _this.onCheck = function (e) { if (_this.isDisabled()) return; var _this$props = _this.props, disableCheckbox = _this$props.disableCheckbox, checked = _this$props.checked; var onNodeCheck = _this.props.context.onNodeCheck; if (!_this.isCheckable() || disableCheckbox) return; e.preventDefault(); var targetChecked = !checked; onNodeCheck(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props), targetChecked); }; _this.onMouseEnter = function (e) { var onNodeMouseEnter = _this.props.context.onNodeMouseEnter; onNodeMouseEnter(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props)); }; _this.onMouseLeave = function (e) { var onNodeMouseLeave = _this.props.context.onNodeMouseLeave; onNodeMouseLeave(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props)); }; _this.onContextMenu = function (e) { var onNodeContextMenu = _this.props.context.onNodeContextMenu; onNodeContextMenu(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props)); }; _this.onDragStart = function (e) { var onNodeDragStart = _this.props.context.onNodeDragStart; e.stopPropagation(); _this.setState({ dragNodeHighlight: true }); onNodeDragStart(e, (0, _assertThisInitialized2.default)(_this)); try { // ie throw error // firefox-need-it e.dataTransfer.setData('text/plain', ''); } catch (error) {// empty } }; _this.onDragEnter = function (e) { var onNodeDragEnter = _this.props.context.onNodeDragEnter; e.preventDefault(); e.stopPropagation(); onNodeDragEnter(e, (0, _assertThisInitialized2.default)(_this)); }; _this.onDragOver = function (e) { var onNodeDragOver = _this.props.context.onNodeDragOver; e.preventDefault(); e.stopPropagation(); onNodeDragOver(e, (0, _assertThisInitialized2.default)(_this)); }; _this.onDragLeave = function (e) { var onNodeDragLeave = _this.props.context.onNodeDragLeave; e.stopPropagation(); onNodeDragLeave(e, (0, _assertThisInitialized2.default)(_this)); }; _this.onDragEnd = function (e) { var onNodeDragEnd = _this.props.context.onNodeDragEnd; e.stopPropagation(); _this.setState({ dragNodeHighlight: false }); onNodeDragEnd(e, (0, _assertThisInitialized2.default)(_this)); }; _this.onDrop = function (e) { var onNodeDrop = _this.props.context.onNodeDrop; e.preventDefault(); e.stopPropagation(); _this.setState({ dragNodeHighlight: false }); onNodeDrop(e, (0, _assertThisInitialized2.default)(_this)); }; // Disabled item still can be switch _this.onExpand = function (e) { var onNodeExpand = _this.props.context.onNodeExpand; onNodeExpand(e, (0, _treeUtil.convertNodePropsToEventData)(_this.props)); }; // Drag usage _this.setSelectHandle = function (node) { _this.selectHandle = node; }; _this.getNodeState = function () { var expanded = _this.props.expanded; if (_this.isLeaf()) { return null; } return expanded ? ICON_OPEN : ICON_CLOSE; }; _this.hasChildren = function () { var eventKey = _this.props.eventKey; var keyEntities = _this.props.context.keyEntities; var _ref = keyEntities[eventKey] || {}, children = _ref.children; return !!(children || []).length; }; _this.isLeaf = function () { var _this$props2 = _this.props, isLeaf = _this$props2.isLeaf, loaded = _this$props2.loaded; var loadData = _this.props.context.loadData; var hasChildren = _this.hasChildren(); if (isLeaf === false) { return false; } return isLeaf || !loadData && !hasChildren || loadData && loaded && !hasChildren; }; _this.isDisabled = function () { var disabled = _this.props.disabled; var treeDisabled = _this.props.context.disabled; return !!(treeDisabled || disabled); }; _this.isCheckable = function () { var checkable = _this.props.checkable; var treeCheckable = _this.props.context.checkable; // Return false if tree or treeNode is not checkable if (!treeCheckable || checkable === false) return false; return treeCheckable; }; // Load data to avoid default expanded tree without data _this.syncLoadData = function (props) { var expanded = props.expanded, loading = props.loading, loaded = props.loaded; var _this$props$context = _this.props.context, loadData = _this$props$context.loadData, onNodeLoad = _this$props$context.onNodeLoad; if (loading) return; // read from state to avoid loadData at same time if (loadData && expanded && !_this.isLeaf()) { // We needn't reload data when has children in sync logic // It's only needed in node expanded if (!_this.hasChildren() && !loaded) { onNodeLoad((0, _treeUtil.convertNodePropsToEventData)(_this.props)); } } }; // Switcher _this.renderSwitcher = function () { var _this$props3 = _this.props, expanded = _this$props3.expanded, switcherIconFromProps = _this$props3.switcherIcon; var _this$props$context2 = _this.props.context, prefixCls = _this$props$context2.prefixCls, switcherIconFromCtx = _this$props$context2.switcherIcon; var switcherIcon = switcherIconFromProps || switcherIconFromCtx; if (_this.isLeaf()) { return React.createElement("span", { className: (0, _classnames.default)("".concat(prefixCls, "-switcher"), "".concat(prefixCls, "-switcher-noop")) }, typeof switcherIcon === 'function' ? switcherIcon((0, _objectSpread2.default)((0, _objectSpread2.default)({}, _this.props), {}, { isLeaf: true })) : switcherIcon); } var switcherCls = (0, _classnames.default)("".concat(prefixCls, "-switcher"), "".concat(prefixCls, "-switcher_").concat(expanded ? ICON_OPEN : ICON_CLOSE)); return React.createElement("span", { onClick: _this.onExpand, className: switcherCls }, typeof switcherIcon === 'function' ? switcherIcon((0, _objectSpread2.default)((0, _objectSpread2.default)({}, _this.props), {}, { isLeaf: false })) : switcherIcon); }; // Checkbox _this.renderCheckbox = function () { var _this$props4 = _this.props, checked = _this$props4.checked, halfChecked = _this$props4.halfChecked, disableCheckbox = _this$props4.disableCheckbox; var prefixCls = _this.props.context.prefixCls; var disabled = _this.isDisabled(); var checkable = _this.isCheckable(); if (!checkable) return null; // [Legacy] Custom element should be separate with `checkable` in future var $custom = typeof checkable !== 'boolean' ? checkable : null; return React.createElement("span", { className: (0, _classnames.default)("".concat(prefixCls, "-checkbox"), checked && "".concat(prefixCls, "-checkbox-checked"), !checked && halfChecked && "".concat(prefixCls, "-checkbox-indeterminate"), (disabled || disableCheckbox) && "".concat(prefixCls, "-checkbox-disabled")), onClick: _this.onCheck }, $custom); }; _this.renderIcon = function () { var loading = _this.props.loading; var prefixCls = _this.props.context.prefixCls; return React.createElement("span", { className: (0, _classnames.default)("".concat(prefixCls, "-iconEle"), "".concat(prefixCls, "-icon__").concat(_this.getNodeState() || 'docu'), loading && "".concat(prefixCls, "-icon_loading")) }); }; // Icon + Title _this.renderSelector = function () { var dragNodeHighlight = _this.state.dragNodeHighlight; var _this$props5 = _this.props, title = _this$props5.title, selected = _this$props5.selected, icon = _this$props5.icon, loading = _this$props5.loading, data = _this$props5.data; var _this$props$context3 = _this.props.context, prefixCls = _this$props$context3.prefixCls, showIcon = _this$props$context3.showIcon, treeIcon = _this$props$context3.icon, draggable = _this$props$context3.draggable, loadData = _this$props$context3.loadData, titleRender = _this$props$context3.titleRender; var disabled = _this.isDisabled(); var wrapClass = "".concat(prefixCls, "-node-content-wrapper"); // Icon - Still show loading icon when loading without showIcon var $icon; if (showIcon) { var currentIcon = icon || treeIcon; $icon = currentIcon ? React.createElement("span", { className: (0, _classnames.default)("".concat(prefixCls, "-iconEle"), "".concat(prefixCls, "-icon__customize")) }, typeof currentIcon === 'function' ? currentIcon(_this.props) : currentIcon) : _this.renderIcon(); } else if (loadData && loading) { $icon = _this.renderIcon(); } // Title var titleNode; if (typeof title === 'function') { titleNode = title(data); } else if (titleRender) { titleNode = titleRender(data); } else { titleNode = title; } var $title = React.createElement("span", { className: "".concat(prefixCls, "-title") }, titleNode); return React.createElement("span", { ref: _this.setSelectHandle, title: typeof title === 'string' ? title : '', className: (0, _classnames.default)("".concat(wrapClass), "".concat(wrapClass, "-").concat(_this.getNodeState() || 'normal'), !disabled && (selected || dragNodeHighlight) && "".concat(prefixCls, "-node-selected"), !disabled && draggable && 'draggable'), draggable: !disabled && draggable || undefined, "aria-grabbed": !disabled && draggable || undefined, onMouseEnter: _this.onMouseEnter, onMouseLeave: _this.onMouseLeave, onContextMenu: _this.onContextMenu, onClick: _this.onSelectorClick, onDoubleClick: _this.onSelectorDoubleClick, onDragStart: draggable ? _this.onDragStart : undefined }, $icon, $title); }; return _this; } // Isomorphic needn't load data in server side (0, _createClass2.default)(InternalTreeNode, [{ key: "componentDidMount", value: function componentDidMount() { this.syncLoadData(this.props); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.syncLoadData(this.props); } }, { key: "isSelectable", value: function isSelectable() { var selectable = this.props.selectable; var treeSelectable = this.props.context.selectable; // Ignore when selectable is undefined or null if (typeof selectable === 'boolean') { return selectable; } return treeSelectable; } }, { key: "render", value: function render() { var _classNames; var _this$props6 = this.props, eventKey = _this$props6.eventKey, className = _this$props6.className, style = _this$props6.style, dragOver = _this$props6.dragOver, dragOverGapTop = _this$props6.dragOverGapTop, dragOverGapBottom = _this$props6.dragOverGapBottom, isLeaf = _this$props6.isLeaf, isStart = _this$props6.isStart, isEnd = _this$props6.isEnd, expanded = _this$props6.expanded, selected = _this$props6.selected, checked = _this$props6.checked, halfChecked = _this$props6.halfChecked, loading = _this$props6.loading, domRef = _this$props6.domRef, active = _this$props6.active, onMouseMove = _this$props6.onMouseMove, otherProps = (0, _objectWithoutProperties2.default)(_this$props6, ["eventKey", "className", "style", "dragOver", "dragOverGapTop", "dragOverGapBottom", "isLeaf", "isStart", "isEnd", "expanded", "selected", "checked", "halfChecked", "loading", "domRef", "active", "onMouseMove"]); var _this$props$context4 = this.props.context, prefixCls = _this$props$context4.prefixCls, filterTreeNode = _this$props$context4.filterTreeNode, draggable = _this$props$context4.draggable, keyEntities = _this$props$context4.keyEntities; var disabled = this.isDisabled(); var dataOrAriaAttributeProps = (0, _util.getDataAndAria)(otherProps); var _ref2 = keyEntities[eventKey] || {}, level = _ref2.level; var isEndNode = isEnd[isEnd.length - 1]; return React.createElement("div", Object.assign({ ref: domRef, className: (0, _classnames.default)(className, "".concat(prefixCls, "-treenode"), (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-disabled"), disabled), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-switcher-").concat(expanded ? 'open' : 'close'), !isLeaf), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-checkbox-checked"), checked), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-checkbox-indeterminate"), halfChecked), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-selected"), selected), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-loading"), loading), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-active"), active), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-treenode-leaf-last"), isEndNode), (0, _defineProperty2.default)(_classNames, 'drag-over', !disabled && dragOver), (0, _defineProperty2.default)(_classNames, 'drag-over-gap-top', !disabled && dragOverGapTop), (0, _defineProperty2.default)(_classNames, 'drag-over-gap-bottom', !disabled && dragOverGapBottom), (0, _defineProperty2.default)(_classNames, 'filter-node', filterTreeNode && filterTreeNode((0, _treeUtil.convertNodePropsToEventData)(this.props))), _classNames)), style: style, onDragEnter: draggable ? this.onDragEnter : undefined, onDragOver: draggable ? this.onDragOver : undefined, onDragLeave: draggable ? this.onDragLeave : undefined, onDrop: draggable ? this.onDrop : undefined, onDragEnd: draggable ? this.onDragEnd : undefined, onMouseMove: onMouseMove }, dataOrAriaAttributeProps), React.createElement(_Indent.default, { prefixCls: prefixCls, level: level, isStart: isStart, isEnd: isEnd }), this.renderSwitcher(), this.renderCheckbox(), this.renderSelector()); } }]); return InternalTreeNode; }(React.Component); exports.InternalTreeNode = InternalTreeNode; var ContextTreeNode = function ContextTreeNode(props) { return React.createElement(_contextTypes.TreeContext.Consumer, null, function (context) { return React.createElement(InternalTreeNode, Object.assign({}, props, { context: context })); }); }; ContextTreeNode.displayName = 'TreeNode'; ContextTreeNode.defaultProps = { title: defaultTitle }; ContextTreeNode.isTreeNode = 1; var _default = ContextTreeNode; exports.default = _default; },{"./Indent":831,"./contextTypes":836,"./util":838,"./utils/treeUtil":841,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"classnames":455,"react":"react"}],836:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.TreeContext = void 0; var React = _interopRequireWildcard(require("react")); /** * Webpack has bug for import loop, which is not the same behavior as ES module. * When util.js imports the TreeNode for tree generate will cause treeContextTypes be empty. */ var TreeContext = React.createContext(null); exports.TreeContext = TreeContext; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],837:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "TreeNode", { enumerable: true, get: function get() { return _TreeNode.default; } }); exports.default = void 0; var _Tree = _interopRequireDefault(require("./Tree")); var _TreeNode = _interopRequireDefault(require("./TreeNode")); var _default = _Tree.default; exports.default = _default; },{"./Tree":834,"./TreeNode":835,"@babel/runtime/helpers/interopRequireDefault":192}],838:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.arrDel = arrDel; exports.arrAdd = arrAdd; exports.posToArr = posToArr; exports.getPosition = getPosition; exports.isTreeNode = isTreeNode; exports.getDragNodesKeys = getDragNodesKeys; exports.calcDropPosition = calcDropPosition; exports.calcSelectedKeys = calcSelectedKeys; exports.convertDataToTree = convertDataToTree; exports.parseCheckedKeys = parseCheckedKeys; exports.conductExpandParent = conductExpandParent; exports.getDataAndAria = getDataAndAria; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _react = _interopRequireDefault(require("react")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _TreeNode = _interopRequireDefault(require("./TreeNode")); /** * Legacy code. Should avoid to use if you are new to import these code. */ var DRAG_SIDE_RANGE = 0.25; var DRAG_MIN_GAP = 2; function arrDel(list, value) { var clone = list.slice(); var index = clone.indexOf(value); if (index >= 0) { clone.splice(index, 1); } return clone; } function arrAdd(list, value) { var clone = list.slice(); if (clone.indexOf(value) === -1) { clone.push(value); } return clone; } function posToArr(pos) { return pos.split('-'); } function getPosition(level, index) { return "".concat(level, "-").concat(index); } function isTreeNode(node) { return node && node.type && node.type.isTreeNode; } function getDragNodesKeys(dragNodeKey, keyEntities) { var dragNodesKeys = [dragNodeKey]; var entity = keyEntities[dragNodeKey]; function dig() { var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; list.forEach(function (_ref) { var key = _ref.key, children = _ref.children; dragNodesKeys.push(key); dig(children); }); } dig(entity.children); return dragNodesKeys; } // Only used when drag, not affect SSR. function calcDropPosition(event, treeNode) { var clientY = event.clientY; var _treeNode$selectHandl = treeNode.selectHandle.getBoundingClientRect(), top = _treeNode$selectHandl.top, bottom = _treeNode$selectHandl.bottom, height = _treeNode$selectHandl.height; var des = Math.max(height * DRAG_SIDE_RANGE, DRAG_MIN_GAP); if (clientY <= top + des) { return -1; } if (clientY >= bottom - des) { return 1; } return 0; } /** * Return selectedKeys according with multiple prop * @param selectedKeys * @param props * @returns [string] */ function calcSelectedKeys(selectedKeys, props) { if (!selectedKeys) return undefined; var multiple = props.multiple; if (multiple) { return selectedKeys.slice(); } if (selectedKeys.length) { return [selectedKeys[0]]; } return selectedKeys; } var internalProcessProps = function internalProcessProps(props) { return props; }; function convertDataToTree(treeData, processor) { if (!treeData) return []; var _ref2 = processor || {}, _ref2$processProps = _ref2.processProps, processProps = _ref2$processProps === void 0 ? internalProcessProps : _ref2$processProps; var list = Array.isArray(treeData) ? treeData : [treeData]; return list.map(function (_ref3) { var children = _ref3.children, props = (0, _objectWithoutProperties2.default)(_ref3, ["children"]); var childrenNodes = convertDataToTree(children, processor); return _react.default.createElement(_TreeNode.default, Object.assign({}, processProps(props)), childrenNodes); }); } /** * Parse `checkedKeys` to { checkedKeys, halfCheckedKeys } style */ function parseCheckedKeys(keys) { if (!keys) { return null; } // Convert keys to object format var keyProps; if (Array.isArray(keys)) { // [Legacy] Follow the api doc keyProps = { checkedKeys: keys, halfCheckedKeys: undefined }; } else if ((0, _typeof2.default)(keys) === 'object') { keyProps = { checkedKeys: keys.checked || undefined, halfCheckedKeys: keys.halfChecked || undefined }; } else { (0, _warning.default)(false, '`checkedKeys` is not an array or an object'); return null; } return keyProps; } /** * If user use `autoExpandParent` we should get the list of parent node * @param keyList * @param keyEntities */ function conductExpandParent(keyList, keyEntities) { var expandedKeys = new Set(); function conductUp(key) { if (expandedKeys.has(key)) return; var entity = keyEntities[key]; if (!entity) return; expandedKeys.add(key); var parent = entity.parent, node = entity.node; if (node.disabled) return; if (parent) { conductUp(parent.key); } } (keyList || []).forEach(function (key) { conductUp(key); }); return (0, _toConsumableArray2.default)(expandedKeys); } /** * Returns only the data- and aria- key/value pairs */ function getDataAndAria(props) { var omitProps = {}; Object.keys(props).forEach(function (key) { if (key.startsWith('data-') || key.startsWith('aria-')) { omitProps[key] = props[key]; } }); return omitProps; } },{"./TreeNode":835,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/toConsumableArray":207,"@babel/runtime/helpers/typeof":208,"rc-util/lib/warning":879,"react":"react"}],839:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.isCheckDisabled = isCheckDisabled; exports.conductCheck = conductCheck; var _warning = _interopRequireDefault(require("rc-util/lib/warning")); function removeFromCheckedKeys(halfCheckedKeys, checkedKeys) { var filteredKeys = new Set(); halfCheckedKeys.forEach(function (key) { if (!checkedKeys.has(key)) { filteredKeys.add(key); } }); return filteredKeys; } function isCheckDisabled(node) { var _ref = node || {}, disabled = _ref.disabled, disableCheckbox = _ref.disableCheckbox, checkable = _ref.checkable; return !!(disabled || disableCheckbox) || checkable === false; } // Fill miss keys function fillConductCheck(keys, levelEntities, maxLevel, syntheticGetCheckDisabled) { var checkedKeys = new Set(keys); var halfCheckedKeys = new Set(); // Add checked keys top to bottom for (var level = 0; level <= maxLevel; level += 1) { var entities = levelEntities.get(level) || new Set(); entities.forEach(function (entity) { var key = entity.key, node = entity.node, _entity$children = entity.children, children = _entity$children === void 0 ? [] : _entity$children; if (checkedKeys.has(key) && !syntheticGetCheckDisabled(node)) { children.filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (childEntity) { checkedKeys.add(childEntity.key); }); } }); } // Add checked keys from bottom to top var visitedKeys = new Set(); for (var _level = maxLevel; _level >= 0; _level -= 1) { var _entities = levelEntities.get(_level) || new Set(); _entities.forEach(function (entity) { var parent = entity.parent, node = entity.node; // Skip if no need to check if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) { return; } // Skip if parent is disabled if (syntheticGetCheckDisabled(entity.parent.node)) { visitedKeys.add(parent.key); return; } var allChecked = true; var partialChecked = false; (parent.children || []).filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (_ref2) { var key = _ref2.key; var checked = checkedKeys.has(key); if (allChecked && !checked) { allChecked = false; } if (!partialChecked && (checked || halfCheckedKeys.has(key))) { partialChecked = true; } }); if (allChecked) { checkedKeys.add(parent.key); } if (partialChecked) { halfCheckedKeys.add(parent.key); } visitedKeys.add(parent.key); }); } return { checkedKeys: Array.from(checkedKeys), halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys)) }; } // Remove useless key function cleanConductCheck(keys, halfKeys, levelEntities, maxLevel, syntheticGetCheckDisabled) { var checkedKeys = new Set(keys); var halfCheckedKeys = new Set(halfKeys); // Remove checked keys from top to bottom for (var level = 0; level <= maxLevel; level += 1) { var entities = levelEntities.get(level) || new Set(); entities.forEach(function (entity) { var key = entity.key, node = entity.node, _entity$children2 = entity.children, children = _entity$children2 === void 0 ? [] : _entity$children2; if (!checkedKeys.has(key) && !halfCheckedKeys.has(key) && !syntheticGetCheckDisabled(node)) { children.filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (childEntity) { checkedKeys.delete(childEntity.key); }); } }); } // Remove checked keys form bottom to top halfCheckedKeys = new Set(); var visitedKeys = new Set(); for (var _level2 = maxLevel; _level2 >= 0; _level2 -= 1) { var _entities2 = levelEntities.get(_level2) || new Set(); _entities2.forEach(function (entity) { var parent = entity.parent, node = entity.node; // Skip if no need to check if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) { return; } // Skip if parent is disabled if (syntheticGetCheckDisabled(entity.parent.node)) { visitedKeys.add(parent.key); return; } var allChecked = true; var partialChecked = false; (parent.children || []).filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (_ref3) { var key = _ref3.key; var checked = checkedKeys.has(key); if (allChecked && !checked) { allChecked = false; } if (!partialChecked && (checked || halfCheckedKeys.has(key))) { partialChecked = true; } }); if (!allChecked) { checkedKeys.delete(parent.key); } if (partialChecked) { halfCheckedKeys.add(parent.key); } visitedKeys.add(parent.key); }); } return { checkedKeys: Array.from(checkedKeys), halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys)) }; } /** * Conduct with keys. * @param keyList current key list * @param keyEntities key - dataEntity map * @param mode `fill` to fill missing key, `clean` to remove useless key */ function conductCheck(keyList, checked, keyEntities, getCheckDisabled) { var warningMissKeys = []; var syntheticGetCheckDisabled; if (getCheckDisabled) { syntheticGetCheckDisabled = getCheckDisabled; } else { syntheticGetCheckDisabled = isCheckDisabled; } // We only handle exist keys var keys = new Set(keyList.filter(function (key) { var hasEntity = !!keyEntities[key]; if (!hasEntity) { warningMissKeys.push(key); } return hasEntity; })); var levelEntities = new Map(); var maxLevel = 0; // Convert entities by level for calculation Object.keys(keyEntities).forEach(function (key) { var entity = keyEntities[key]; var level = entity.level; var levelSet = levelEntities.get(level); if (!levelSet) { levelSet = new Set(); levelEntities.set(level, levelSet); } levelSet.add(entity); maxLevel = Math.max(maxLevel, level); }); (0, _warning.default)(!warningMissKeys.length, "Tree missing follow keys: ".concat(warningMissKeys.slice(0, 100).map(function (key) { return "'".concat(key, "'"); }).join(', '))); var result; if (checked === true) { result = fillConductCheck(keys, levelEntities, maxLevel, syntheticGetCheckDisabled); } else { result = cleanConductCheck(keys, checked.halfCheckedKeys, levelEntities, maxLevel, syntheticGetCheckDisabled); } return result; } },{"@babel/runtime/helpers/interopRequireDefault":192,"rc-util/lib/warning":879}],840:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.findExpandedKeys = findExpandedKeys; exports.getExpandRange = getExpandRange; function findExpandedKeys() { var prev = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var next = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var prevLen = prev.length; var nextLen = next.length; if (Math.abs(prevLen - nextLen) !== 1) { return { add: false, key: null }; } function find(shorter, longer) { var cache = new Map(); shorter.forEach(function (key) { cache.set(key, true); }); var keys = longer.filter(function (key) { return !cache.has(key); }); return keys.length === 1 ? keys[0] : null; } if (prevLen < nextLen) { return { add: true, key: find(prev, next) }; } return { add: false, key: find(next, prev) }; } function getExpandRange(shorter, longer, key) { var shorterStartIndex = shorter.findIndex(function (_ref) { var data = _ref.data; return data.key === key; }); var shorterEndNode = shorter[shorterStartIndex + 1]; var longerStartIndex = longer.findIndex(function (_ref2) { var data = _ref2.data; return data.key === key; }); if (shorterEndNode) { var longerEndIndex = longer.findIndex(function (_ref3) { var data = _ref3.data; return data.key === shorterEndNode.data.key; }); return longer.slice(longerStartIndex + 1, longerEndIndex); } return longer.slice(longerStartIndex + 1); } },{}],841:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getKey = getKey; exports.warningWithoutKey = warningWithoutKey; exports.convertTreeToData = convertTreeToData; exports.flattenTreeData = flattenTreeData; exports.traverseDataNodes = traverseDataNodes; exports.convertDataToEntities = convertDataToEntities; exports.getTreeNodeProps = getTreeNodeProps; exports.convertNodePropsToEventData = convertNodePropsToEventData; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray")); var _warning = _interopRequireDefault(require("rc-util/lib/warning")); var _util = require("../util"); function getKey(key, pos) { if (key !== null && key !== undefined) { return key; } return pos; } /** * Warning if TreeNode do not provides key */ function warningWithoutKey() { var treeData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var keys = new Map(); function dig(list) { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; (list || []).forEach(function (treeNode) { var key = treeNode.key, children = treeNode.children; (0, _warning.default)(key !== null && key !== undefined, "Tree node must have a certain key: [".concat(path).concat(key, "]")); var recordKey = String(key); (0, _warning.default)(!keys.has(recordKey) || key === null || key === undefined, "Same 'key' exist in the Tree: ".concat(recordKey)); keys.set(recordKey, true); dig(children, "".concat(path).concat(recordKey, " > ")); }); } dig(treeData); } /** * Convert `children` of Tree into `treeData` structure. */ function convertTreeToData(rootNodes) { function dig(node) { var treeNodes = (0, _toArray.default)(node); return treeNodes.map(function (treeNode) { // Filter invalidate node if (!(0, _util.isTreeNode)(treeNode)) { (0, _warning.default)(!treeNode, 'Tree/TreeNode can only accept TreeNode as children.'); return null; } var key = treeNode.key; var _treeNode$props = treeNode.props, children = _treeNode$props.children, rest = (0, _objectWithoutProperties2.default)(_treeNode$props, ["children"]); var dataNode = (0, _objectSpread2.default)({ key: key }, rest); var parsedChildren = dig(children); if (parsedChildren.length) { dataNode.children = parsedChildren; } return dataNode; }).filter(function (dataNode) { return dataNode; }); } return dig(rootNodes); } /** * Flat nest tree data into flatten list. This is used for virtual list render. * @param treeNodeList Origin data node list * @param expandedKeys * need expanded keys, provides `true` means all expanded (used in `rc-tree-select`). */ function flattenTreeData() { var treeNodeList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var expandedKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var expandedKeySet = new Set(expandedKeys === true ? [] : expandedKeys); var flattenList = []; function dig(list) { var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return list.map(function (treeNode, index) { var pos = (0, _util.getPosition)(parent ? parent.pos : '0', index); var mergedKey = getKey(treeNode.key, pos); // Add FlattenDataNode into list var flattenNode = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, treeNode), {}, { parent: parent, pos: pos, children: null, data: treeNode, isStart: [].concat((0, _toConsumableArray2.default)(parent ? parent.isStart : []), [index === 0]), isEnd: [].concat((0, _toConsumableArray2.default)(parent ? parent.isEnd : []), [index === list.length - 1]) }); flattenList.push(flattenNode); // Loop treeNode children if (expandedKeys === true || expandedKeySet.has(mergedKey)) { flattenNode.children = dig(treeNode.children || [], flattenNode); } else { flattenNode.children = []; } return flattenNode; }); } dig(treeNodeList); return flattenList; } /** * Traverse all the data by `treeData`. * Please not use it out of the `rc-tree` since we may refactor this code. */ function traverseDataNodes(dataNodes, callback, externalGetKey) { var syntheticGetKey; if (externalGetKey) { if (typeof externalGetKey === 'string') { syntheticGetKey = function syntheticGetKey(node) { return node[externalGetKey]; }; } else if (typeof externalGetKey === 'function') { syntheticGetKey = function syntheticGetKey(node) { return externalGetKey(node); }; } } else { syntheticGetKey = function syntheticGetKey(node, pos) { return getKey(node.key, pos); }; } function processNode(node, index, parent) { var children = node ? node.children : dataNodes; var pos = node ? (0, _util.getPosition)(parent.pos, index) : '0'; // Process node if is not root if (node) { var key = syntheticGetKey(node, pos); var data = { node: node, index: index, pos: pos, key: key, parentPos: parent.node ? parent.pos : null, level: parent.level + 1 }; callback(data); } // Process children node if (children) { children.forEach(function (subNode, subIndex) { processNode(subNode, subIndex, { node: node, pos: pos, level: parent ? parent.level + 1 : -1 }); }); } } processNode(null); } /** * Convert `treeData` into entity records. */ function convertDataToEntities(dataNodes) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, initWrapper = _ref.initWrapper, processEntity = _ref.processEntity, onProcessFinished = _ref.onProcessFinished; var externalGetKey = arguments.length > 2 ? arguments[2] : undefined; var posEntities = {}; var keyEntities = {}; var wrapper = { posEntities: posEntities, keyEntities: keyEntities }; if (initWrapper) { wrapper = initWrapper(wrapper) || wrapper; } traverseDataNodes(dataNodes, function (item) { var node = item.node, index = item.index, pos = item.pos, key = item.key, parentPos = item.parentPos, level = item.level; var entity = { node: node, index: index, key: key, pos: pos, level: level }; var mergedKey = getKey(key, pos); posEntities[pos] = entity; keyEntities[mergedKey] = entity; // Fill children entity.parent = posEntities[parentPos]; if (entity.parent) { entity.parent.children = entity.parent.children || []; entity.parent.children.push(entity); } if (processEntity) { processEntity(entity, wrapper); } }, externalGetKey); if (onProcessFinished) { onProcessFinished(wrapper); } return wrapper; } /** * Get TreeNode props with Tree props. */ function getTreeNodeProps(key, _ref2) { var expandedKeys = _ref2.expandedKeys, selectedKeys = _ref2.selectedKeys, loadedKeys = _ref2.loadedKeys, loadingKeys = _ref2.loadingKeys, checkedKeys = _ref2.checkedKeys, halfCheckedKeys = _ref2.halfCheckedKeys, dragOverNodeKey = _ref2.dragOverNodeKey, dropPosition = _ref2.dropPosition, keyEntities = _ref2.keyEntities; var entity = keyEntities[key]; var treeNodeProps = { eventKey: key, expanded: expandedKeys.indexOf(key) !== -1, selected: selectedKeys.indexOf(key) !== -1, loaded: loadedKeys.indexOf(key) !== -1, loading: loadingKeys.indexOf(key) !== -1, checked: checkedKeys.indexOf(key) !== -1, halfChecked: halfCheckedKeys.indexOf(key) !== -1, pos: String(entity ? entity.pos : ''), // [Legacy] Drag props dragOver: dragOverNodeKey === key && dropPosition === 0, dragOverGapTop: dragOverNodeKey === key && dropPosition === -1, dragOverGapBottom: dragOverNodeKey === key && dropPosition === 1 }; return treeNodeProps; } function convertNodePropsToEventData(props) { var data = props.data, expanded = props.expanded, selected = props.selected, checked = props.checked, loaded = props.loaded, loading = props.loading, halfChecked = props.halfChecked, dragOver = props.dragOver, dragOverGapTop = props.dragOverGapTop, dragOverGapBottom = props.dragOverGapBottom, pos = props.pos, active = props.active; var eventData = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, data), {}, { expanded: expanded, selected: selected, checked: checked, loaded: loaded, loading: loading, halfChecked: halfChecked, dragOver: dragOver, dragOverGapTop: dragOverGapTop, dragOverGapBottom: dragOverGapBottom, pos: pos, active: active }); if (!('props' in eventData)) { Object.defineProperty(eventData, 'props', { get: function get() { (0, _warning.default)(false, 'Second param return from event is node data instead of TreeNode instance. Please read value directly instead of reading from `props`.'); return props; } }); } return eventData; } },{"../util":838,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/toConsumableArray":207,"rc-util/lib/Children/toArray":858,"rc-util/lib/warning":879}],842:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Mask; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _rcMotion = _interopRequireDefault(require("rc-motion")); var _legacyUtil = require("../utils/legacyUtil"); function Mask(props) { var prefixCls = props.prefixCls, visible = props.visible, zIndex = props.zIndex, mask = props.mask, maskMotion = props.maskMotion, maskAnimation = props.maskAnimation, maskTransitionName = props.maskTransitionName; if (!mask) { return null; } var motion = {}; if (maskMotion || maskTransitionName || maskAnimation) { motion = (0, _objectSpread2.default)({ motionAppear: true }, (0, _legacyUtil.getMotion)({ motion: maskMotion, prefixCls: prefixCls, transitionName: maskTransitionName, animation: maskAnimation })); } return React.createElement(_rcMotion.default, Object.assign({}, motion, { visible: visible, removeOnLeave: true }), function (_ref) { var className = _ref.className; return React.createElement("div", { style: { zIndex: zIndex }, className: (0, _classnames.default)("".concat(prefixCls, "-mask"), className) }); }); } },{"../utils/legacyUtil":850,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"rc-motion":661,"react":"react"}],843:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _rcAlign = _interopRequireDefault(require("rc-align")); var _rcMotion = _interopRequireDefault(require("rc-motion")); var _classnames = _interopRequireDefault(require("classnames")); var _useVisibleStatus3 = _interopRequireDefault(require("./useVisibleStatus")); var _legacyUtil = require("../utils/legacyUtil"); var _useStretchStyle3 = _interopRequireDefault(require("./useStretchStyle")); var PopupInner = React.forwardRef(function (props, ref) { var visible = props.visible, prefixCls = props.prefixCls, className = props.className, style = props.style, children = props.children, zIndex = props.zIndex, stretch = props.stretch, destroyPopupOnHide = props.destroyPopupOnHide, align = props.align, point = props.point, getRootDomNode = props.getRootDomNode, getClassNameFromAlign = props.getClassNameFromAlign, onAlign = props.onAlign, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onMouseDown = props.onMouseDown, onTouchStart = props.onTouchStart; var alignRef = (0, React.useRef)(); var elementRef = (0, React.useRef)(); var _useState = (0, React.useState)(), _useState2 = (0, _slicedToArray2.default)(_useState, 2), alignedClassName = _useState2[0], setAlignedClassName = _useState2[1]; // ======================= Measure ======================== var _useStretchStyle = (0, _useStretchStyle3.default)(stretch), _useStretchStyle2 = (0, _slicedToArray2.default)(_useStretchStyle, 2), stretchStyle = _useStretchStyle2[0], measureStretchStyle = _useStretchStyle2[1]; function doMeasure() { if (stretch) { measureStretchStyle(getRootDomNode()); } } // ======================== Status ======================== var _useVisibleStatus = (0, _useVisibleStatus3.default)(visible, doMeasure), _useVisibleStatus2 = (0, _slicedToArray2.default)(_useVisibleStatus, 2), status = _useVisibleStatus2[0], goNextStatus = _useVisibleStatus2[1]; // ======================== Aligns ======================== var prepareResolveRef = (0, React.useRef)(); // `target` on `rc-align` can accept as a function to get the bind element or a point. // ref: https://www.npmjs.com/package/rc-align function getAlignTarget() { if (point) { return point; } return getRootDomNode; } function forceAlign() { var _alignRef$current; (_alignRef$current = alignRef.current) === null || _alignRef$current === void 0 ? void 0 : _alignRef$current.forceAlign(); } function onInternalAlign(popupDomNode, matchAlign) { if (status === 'align') { var nextAlignedClassName = getClassNameFromAlign(matchAlign); setAlignedClassName(nextAlignedClassName); // Repeat until not more align needed if (alignedClassName !== nextAlignedClassName) { Promise.resolve().then(function () { forceAlign(); }); } else { goNextStatus(function () { var _prepareResolveRef$cu; (_prepareResolveRef$cu = prepareResolveRef.current) === null || _prepareResolveRef$cu === void 0 ? void 0 : _prepareResolveRef$cu.call(prepareResolveRef); }); } onAlign === null || onAlign === void 0 ? void 0 : onAlign(popupDomNode, matchAlign); } } // ======================== Motion ======================== var motion = (0, _objectSpread2.default)({}, (0, _legacyUtil.getMotion)(props)); ['onAppearEnd', 'onEnterEnd', 'onLeaveEnd'].forEach(function (eventName) { var originHandler = motion[eventName]; motion[eventName] = function (element, event) { goNextStatus(); return originHandler === null || originHandler === void 0 ? void 0 : originHandler(element, event); }; }); function onShowPrepare() { return new Promise(function (resolve) { prepareResolveRef.current = resolve; }); } // Go to stable directly when motion not provided React.useEffect(function () { if (!motion.motionName && status === 'motion') { goNextStatus(); } }, [motion.motionName, status]); // ========================= Refs ========================= React.useImperativeHandle(ref, function () { return { forceAlign: forceAlign, getElement: function getElement() { return elementRef.current; } }; }); // ======================== Render ======================== var mergedStyle = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, stretchStyle), {}, { zIndex: zIndex }, style), {}, { opacity: status === 'motion' || status === 'stable' || !visible ? undefined : 0, pointerEvents: status === 'stable' ? undefined : 'none' }); // Align status var alignDisabled = true; if ((align === null || align === void 0 ? void 0 : align.points) && (status === 'align' || status === 'stable')) { alignDisabled = false; } var childNode = children; // Wrapper when multiple children if (React.Children.count(children) > 1) { childNode = React.createElement("div", { className: "".concat(prefixCls, "-content") }, children); } return React.createElement(_rcMotion.default, Object.assign({ visible: visible, ref: elementRef }, motion, { onAppearPrepare: onShowPrepare, onEnterPrepare: onShowPrepare, removeOnLeave: destroyPopupOnHide, leavedClassName: "".concat(prefixCls, "-hidden") }), function (_ref, motionRef) { var motionClassName = _ref.className, motionStyle = _ref.style; var mergedClassName = (0, _classnames.default)(prefixCls, className, alignedClassName, motionClassName); return React.createElement(_rcAlign.default, { target: getAlignTarget(), key: "popup", ref: alignRef, monitorWindowResize: true, disabled: alignDisabled, align: align, onAlign: onInternalAlign }, React.createElement("div", { ref: motionRef, className: mergedClassName, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onTouchStart: onTouchStart, style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, motionStyle), mergedStyle) }, childNode)); }); }); PopupInner.displayName = 'PopupInner'; var _default = PopupInner; exports.default = _default; },{"../utils/legacyUtil":850,"./useStretchStyle":845,"./useVisibleStatus":846,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectSpread2":199,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-align":584,"rc-motion":661,"react":"react"}],844:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _Mask = _interopRequireDefault(require("./Mask")); var _PopupInner = _interopRequireDefault(require("./PopupInner")); var Popup = React.forwardRef(function (props, ref) { var cloneProps = (0, _extends2.default)({}, props); // We can use fragment directly but this may failed some selector usage. Keep as origin logic return React.createElement("div", null, React.createElement(_Mask.default, Object.assign({}, cloneProps)), React.createElement(_PopupInner.default, Object.assign({}, cloneProps, { ref: ref }))); }); Popup.displayName = 'Popup'; var _default = Popup; exports.default = _default; },{"./Mask":842,"./PopupInner":843,"@babel/runtime/helpers/extends":188,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],845:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireDefault(require("react")); var _default = function _default(stretch) { var _React$useState = _react.default.useState({ width: 0, height: 0 }), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), targetSize = _React$useState2[0], setTargetSize = _React$useState2[1]; function measureStretch(element) { setTargetSize({ width: element.offsetWidth, height: element.offsetHeight }); } // Merge stretch style var style = _react.default.useMemo(function () { var sizeStyle = {}; if (stretch) { var width = targetSize.width, height = targetSize.height; // Stretch with target if (stretch.indexOf('height') !== -1 && height) { sizeStyle.height = height; } else if (stretch.indexOf('minHeight') !== -1 && height) { sizeStyle.minHeight = height; } if (stretch.indexOf('width') !== -1 && width) { sizeStyle.width = width; } else if (stretch.indexOf('minWidth') !== -1 && width) { sizeStyle.minWidth = width; } } return sizeStyle; }, [stretch, targetSize]); return [style, measureStretch]; }; exports.default = _default; },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"react":"react"}],846:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _raf = _interopRequireDefault(require("rc-util/lib/raf")); var StatusQueue = ['measure', 'align', null, 'motion']; var _default = function _default(visible, doMeasure) { var _useState = (0, _react.useState)(null), _useState2 = (0, _slicedToArray2.default)(_useState, 2), status = _useState2[0], setStatus = _useState2[1]; var rafRef = (0, _react.useRef)(); function cancelRaf() { _raf.default.cancel(rafRef.current); } function goNextStatus(callback) { cancelRaf(); rafRef.current = (0, _raf.default)(function () { // Only align should be manually trigger setStatus(function (prev) { switch (status) { case 'align': return 'motion'; case 'motion': return 'stable'; } return prev; }); callback === null || callback === void 0 ? void 0 : callback(); }); } // Init status (0, _react.useEffect)(function () { setStatus('measure'); }, [visible]); // Go next status (0, _react.useEffect)(function () { switch (status) { case 'measure': doMeasure(); break; } if (status) { rafRef.current = (0, _raf.default)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { var index, nextStatus; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: index = StatusQueue.indexOf(status); nextStatus = StatusQueue[index + 1]; if (nextStatus && index !== -1) { setStatus(nextStatus); } case 3: case "end": return _context.stop(); } } }, _callee); }))); } }, [status]); (0, _react.useEffect)(function () { return function () { cancelRaf(); }; }, []); return [status, goNextStatus]; }; exports.default = _default; },{"@babel/runtime/helpers/asyncToGenerator":183,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/slicedToArray":204,"@babel/runtime/regenerator":210,"rc-util/lib/raf":873,"react":"react"}],847:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var TriggerContext = React.createContext(null); var _default = TriggerContext; exports.default = _default; },{"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],848:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.generateTrigger = generateTrigger; exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireDefault(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _raf = _interopRequireDefault(require("rc-util/lib/raf")); var _contains = _interopRequireDefault(require("rc-util/lib/Dom/contains")); var _findDOMNode = _interopRequireDefault(require("rc-util/lib/Dom/findDOMNode")); var _ref2 = require("rc-util/lib/ref"); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var _Portal = _interopRequireDefault(require("rc-util/lib/Portal")); var _classnames = _interopRequireDefault(require("classnames")); var _alignUtil = require("./utils/alignUtil"); var _Popup = _interopRequireDefault(require("./Popup")); var _context = _interopRequireDefault(require("./context")); function noop() {} function returnEmptyString() { return ''; } function returnDocument() { return window.document; } var ALL_HANDLERS = ['onClick', 'onMouseDown', 'onTouchStart', 'onMouseEnter', 'onMouseLeave', 'onFocus', 'onBlur', 'onContextMenu']; /** * Internal usage. Do not use in your code since this will be removed. */ function generateTrigger(PortalComponent) { var Trigger = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Trigger, _React$Component); var _super = (0, _createSuper2.default)(Trigger); function Trigger(props) { var _this; (0, _classCallCheck2.default)(this, Trigger); _this = _super.call(this, props); _this.popupRef = _react.default.createRef(); _this.triggerRef = _react.default.createRef(); _this.onMouseEnter = function (e) { var mouseEnterDelay = _this.props.mouseEnterDelay; _this.fireEvents('onMouseEnter', e); _this.delaySetPopupVisible(true, mouseEnterDelay, mouseEnterDelay ? null : e); }; _this.onMouseMove = function (e) { _this.fireEvents('onMouseMove', e); _this.setPoint(e); }; _this.onMouseLeave = function (e) { _this.fireEvents('onMouseLeave', e); _this.delaySetPopupVisible(false, _this.props.mouseLeaveDelay); }; _this.onPopupMouseEnter = function () { _this.clearDelayTimer(); }; _this.onPopupMouseLeave = function (e) { var _this$popupRef$curren; // https://github.com/react-component/trigger/pull/13 // react bug? if (e.relatedTarget && !e.relatedTarget.setTimeout && (0, _contains.default)((_this$popupRef$curren = _this.popupRef.current) === null || _this$popupRef$curren === void 0 ? void 0 : _this$popupRef$curren.getElement(), e.relatedTarget)) { return; } _this.delaySetPopupVisible(false, _this.props.mouseLeaveDelay); }; _this.onFocus = function (e) { _this.fireEvents('onFocus', e); // incase focusin and focusout _this.clearDelayTimer(); if (_this.isFocusToShow()) { _this.focusTime = Date.now(); _this.delaySetPopupVisible(true, _this.props.focusDelay); } }; _this.onMouseDown = function (e) { _this.fireEvents('onMouseDown', e); _this.preClickTime = Date.now(); }; _this.onTouchStart = function (e) { _this.fireEvents('onTouchStart', e); _this.preTouchTime = Date.now(); }; _this.onBlur = function (e) { _this.fireEvents('onBlur', e); _this.clearDelayTimer(); if (_this.isBlurToHide()) { _this.delaySetPopupVisible(false, _this.props.blurDelay); } }; _this.onContextMenu = function (e) { e.preventDefault(); _this.fireEvents('onContextMenu', e); _this.setPopupVisible(true, e); }; _this.onContextMenuClose = function () { if (_this.isContextMenuToShow()) { _this.close(); } }; _this.onClick = function (event) { _this.fireEvents('onClick', event); // focus will trigger click if (_this.focusTime) { var preTime; if (_this.preClickTime && _this.preTouchTime) { preTime = Math.min(_this.preClickTime, _this.preTouchTime); } else if (_this.preClickTime) { preTime = _this.preClickTime; } else if (_this.preTouchTime) { preTime = _this.preTouchTime; } if (Math.abs(preTime - _this.focusTime) < 20) { return; } _this.focusTime = 0; } _this.preClickTime = 0; _this.preTouchTime = 0; // Only prevent default when all the action is click. // https://github.com/ant-design/ant-design/issues/17043 // https://github.com/ant-design/ant-design/issues/17291 if (_this.isClickToShow() && (_this.isClickToHide() || _this.isBlurToHide()) && event && event.preventDefault) { event.preventDefault(); } var nextVisible = !_this.state.popupVisible; if (_this.isClickToHide() && !nextVisible || nextVisible && _this.isClickToShow()) { _this.setPopupVisible(!_this.state.popupVisible, event); } }; _this.onPopupMouseDown = function () { _this.hasPopupMouseDown = true; clearTimeout(_this.mouseDownTimeout); _this.mouseDownTimeout = window.setTimeout(function () { _this.hasPopupMouseDown = false; }, 0); if (_this.context) { var _this$context; (_this$context = _this.context).onPopupMouseDown.apply(_this$context, arguments); } }; _this.onDocumentClick = function (event) { if (_this.props.mask && !_this.props.maskClosable) { return; } var target = event.target; var root = _this.getRootDomNode(); var popupNode = _this.getPopupDomNode(); if (!(0, _contains.default)(root, target) && !(0, _contains.default)(popupNode, target) && !_this.hasPopupMouseDown) { _this.close(); } }; _this.getRootDomNode = function () { var getTriggerDOMNode = _this.props.getTriggerDOMNode; if (getTriggerDOMNode) { return getTriggerDOMNode(_this.triggerRef.current); } try { var domNode = (0, _findDOMNode.default)(_this.triggerRef.current); if (domNode) { return domNode; } } catch (err) {// Do nothing } return _reactDom.default.findDOMNode((0, _assertThisInitialized2.default)(_this)); }; _this.getPopupClassNameFromAlign = function (align) { var className = []; var _this$props = _this.props, popupPlacement = _this$props.popupPlacement, builtinPlacements = _this$props.builtinPlacements, prefixCls = _this$props.prefixCls, alignPoint = _this$props.alignPoint, getPopupClassNameFromAlign = _this$props.getPopupClassNameFromAlign; if (popupPlacement && builtinPlacements) { className.push((0, _alignUtil.getAlignPopupClassName)(builtinPlacements, prefixCls, align, alignPoint)); } if (getPopupClassNameFromAlign) { className.push(getPopupClassNameFromAlign(align)); } return className.join(' '); }; _this.getComponent = function () { var _this$props2 = _this.props, prefixCls = _this$props2.prefixCls, destroyPopupOnHide = _this$props2.destroyPopupOnHide, popupClassName = _this$props2.popupClassName, onPopupAlign = _this$props2.onPopupAlign, popupMotion = _this$props2.popupMotion, popupAnimation = _this$props2.popupAnimation, popupTransitionName = _this$props2.popupTransitionName, popupStyle = _this$props2.popupStyle, mask = _this$props2.mask, maskAnimation = _this$props2.maskAnimation, maskTransitionName = _this$props2.maskTransitionName, maskMotion = _this$props2.maskMotion, zIndex = _this$props2.zIndex, popup = _this$props2.popup, stretch = _this$props2.stretch, alignPoint = _this$props2.alignPoint; var _this$state = _this.state, popupVisible = _this$state.popupVisible, point = _this$state.point; var align = _this.getPopupAlign(); var mouseProps = {}; if (_this.isMouseEnterToShow()) { mouseProps.onMouseEnter = _this.onPopupMouseEnter; } if (_this.isMouseLeaveToHide()) { mouseProps.onMouseLeave = _this.onPopupMouseLeave; } mouseProps.onMouseDown = _this.onPopupMouseDown; mouseProps.onTouchStart = _this.onPopupMouseDown; return _react.default.createElement(_Popup.default, Object.assign({ prefixCls: prefixCls, destroyPopupOnHide: destroyPopupOnHide, visible: popupVisible, point: alignPoint && point, className: popupClassName, align: align, onAlign: onPopupAlign, animation: popupAnimation, getClassNameFromAlign: _this.getPopupClassNameFromAlign }, mouseProps, { stretch: stretch, getRootDomNode: _this.getRootDomNode, style: popupStyle, mask: mask, zIndex: zIndex, transitionName: popupTransitionName, maskAnimation: maskAnimation, maskTransitionName: maskTransitionName, maskMotion: maskMotion, ref: _this.popupRef, motion: popupMotion }), typeof popup === 'function' ? popup() : popup); }; _this.attachParent = function (popupContainer) { _raf.default.cancel(_this.attachId); var _this$props3 = _this.props, getPopupContainer = _this$props3.getPopupContainer, getDocument = _this$props3.getDocument; var domNode = _this.getRootDomNode(); var mountNode; if (!getPopupContainer) { mountNode = getDocument().body; } else if (domNode || getPopupContainer.length === 0) { // Compatible for legacy getPopupContainer with domNode argument. // If no need `domNode` argument, will call directly. // https://codesandbox.io/s/eloquent-mclean-ss93m?file=/src/App.js mountNode = getPopupContainer(domNode); } if (mountNode) { mountNode.appendChild(popupContainer); } else { // Retry after frame render in case parent not ready _this.attachId = (0, _raf.default)(function () { _this.attachParent(popupContainer); }); } }; _this.getContainer = function () { var popupContainer = document.createElement('div'); // Make sure default popup container will never cause scrollbar appearing // https://github.com/react-component/trigger/issues/41 popupContainer.style.position = 'absolute'; popupContainer.style.top = '0'; popupContainer.style.left = '0'; popupContainer.style.width = '100%'; _this.attachParent(popupContainer); return popupContainer; }; _this.setPoint = function (point) { var alignPoint = _this.props.alignPoint; if (!alignPoint || !point) return; _this.setState({ point: { pageX: point.pageX, pageY: point.pageY } }); }; _this.handlePortalUpdate = function () { if (_this.state.prevPopupVisible !== _this.state.popupVisible) { _this.props.afterPopupVisibleChange(_this.state.popupVisible); } }; var popupVisible; if ('popupVisible' in props) { popupVisible = !!props.popupVisible; } else { popupVisible = !!props.defaultPopupVisible; } _this.state = { prevPopupVisible: popupVisible, popupVisible: popupVisible }; ALL_HANDLERS.forEach(function (h) { _this["fire".concat(h)] = function (e) { _this.fireEvents(h, e); }; }); return _this; } (0, _createClass2.default)(Trigger, [{ key: "componentDidMount", value: function componentDidMount() { this.componentDidUpdate(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { var props = this.props; var state = this.state; // We must listen to `mousedown` or `touchstart`, edge case: // https://github.com/ant-design/ant-design/issues/5804 // https://github.com/react-component/calendar/issues/250 // https://github.com/react-component/trigger/issues/50 if (state.popupVisible) { var currentDocument; if (!this.clickOutsideHandler && (this.isClickToHide() || this.isContextMenuToShow())) { currentDocument = props.getDocument(); this.clickOutsideHandler = (0, _addEventListener.default)(currentDocument, 'mousedown', this.onDocumentClick); } // always hide on mobile if (!this.touchOutsideHandler) { currentDocument = currentDocument || props.getDocument(); this.touchOutsideHandler = (0, _addEventListener.default)(currentDocument, 'touchstart', this.onDocumentClick); } // close popup when trigger type contains 'onContextMenu' and document is scrolling. if (!this.contextMenuOutsideHandler1 && this.isContextMenuToShow()) { currentDocument = currentDocument || props.getDocument(); this.contextMenuOutsideHandler1 = (0, _addEventListener.default)(currentDocument, 'scroll', this.onContextMenuClose); } // close popup when trigger type contains 'onContextMenu' and window is blur. if (!this.contextMenuOutsideHandler2 && this.isContextMenuToShow()) { this.contextMenuOutsideHandler2 = (0, _addEventListener.default)(window, 'blur', this.onContextMenuClose); } return; } this.clearOutsideHandler(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.clearDelayTimer(); this.clearOutsideHandler(); clearTimeout(this.mouseDownTimeout); } }, { key: "getPopupDomNode", value: function getPopupDomNode() { var _this$popupRef$curren2; // for test return ((_this$popupRef$curren2 = this.popupRef.current) === null || _this$popupRef$curren2 === void 0 ? void 0 : _this$popupRef$curren2.getElement()) || null; } }, { key: "getPopupAlign", value: function getPopupAlign() { var props = this.props; var popupPlacement = props.popupPlacement, popupAlign = props.popupAlign, builtinPlacements = props.builtinPlacements; if (popupPlacement && builtinPlacements) { return (0, _alignUtil.getAlignFromPlacement)(builtinPlacements, popupPlacement, popupAlign); } return popupAlign; } /** * @param popupVisible Show or not the popup element * @param event SyntheticEvent, used for `pointAlign` */ }, { key: "setPopupVisible", value: function setPopupVisible(popupVisible, event) { var alignPoint = this.props.alignPoint; var prevPopupVisible = this.state.popupVisible; this.clearDelayTimer(); if (prevPopupVisible !== popupVisible) { if (!('popupVisible' in this.props)) { this.setState({ popupVisible: popupVisible, prevPopupVisible: prevPopupVisible }); } this.props.onPopupVisibleChange(popupVisible); } // Always record the point position since mouseEnterDelay will delay the show if (alignPoint && event) { this.setPoint(event); } } }, { key: "delaySetPopupVisible", value: function delaySetPopupVisible(visible, delayS, event) { var _this2 = this; var delay = delayS * 1000; this.clearDelayTimer(); if (delay) { var point = event ? { pageX: event.pageX, pageY: event.pageY } : null; this.delayTimer = window.setTimeout(function () { _this2.setPopupVisible(visible, point); _this2.clearDelayTimer(); }, delay); } else { this.setPopupVisible(visible, event); } } }, { key: "clearDelayTimer", value: function clearDelayTimer() { if (this.delayTimer) { clearTimeout(this.delayTimer); this.delayTimer = null; } } }, { key: "clearOutsideHandler", value: function clearOutsideHandler() { if (this.clickOutsideHandler) { this.clickOutsideHandler.remove(); this.clickOutsideHandler = null; } if (this.contextMenuOutsideHandler1) { this.contextMenuOutsideHandler1.remove(); this.contextMenuOutsideHandler1 = null; } if (this.contextMenuOutsideHandler2) { this.contextMenuOutsideHandler2.remove(); this.contextMenuOutsideHandler2 = null; } if (this.touchOutsideHandler) { this.touchOutsideHandler.remove(); this.touchOutsideHandler = null; } } }, { key: "createTwoChains", value: function createTwoChains(event) { var childPros = this.props.children.props; var props = this.props; if (childPros[event] && props[event]) { return this["fire".concat(event)]; } return childPros[event] || props[event]; } }, { key: "isClickToShow", value: function isClickToShow() { var _this$props4 = this.props, action = _this$props4.action, showAction = _this$props4.showAction; return action.indexOf('click') !== -1 || showAction.indexOf('click') !== -1; } }, { key: "isContextMenuToShow", value: function isContextMenuToShow() { var _this$props5 = this.props, action = _this$props5.action, showAction = _this$props5.showAction; return action.indexOf('contextMenu') !== -1 || showAction.indexOf('contextMenu') !== -1; } }, { key: "isClickToHide", value: function isClickToHide() { var _this$props6 = this.props, action = _this$props6.action, hideAction = _this$props6.hideAction; return action.indexOf('click') !== -1 || hideAction.indexOf('click') !== -1; } }, { key: "isMouseEnterToShow", value: function isMouseEnterToShow() { var _this$props7 = this.props, action = _this$props7.action, showAction = _this$props7.showAction; return action.indexOf('hover') !== -1 || showAction.indexOf('mouseEnter') !== -1; } }, { key: "isMouseLeaveToHide", value: function isMouseLeaveToHide() { var _this$props8 = this.props, action = _this$props8.action, hideAction = _this$props8.hideAction; return action.indexOf('hover') !== -1 || hideAction.indexOf('mouseLeave') !== -1; } }, { key: "isFocusToShow", value: function isFocusToShow() { var _this$props9 = this.props, action = _this$props9.action, showAction = _this$props9.showAction; return action.indexOf('focus') !== -1 || showAction.indexOf('focus') !== -1; } }, { key: "isBlurToHide", value: function isBlurToHide() { var _this$props10 = this.props, action = _this$props10.action, hideAction = _this$props10.hideAction; return action.indexOf('focus') !== -1 || hideAction.indexOf('blur') !== -1; } }, { key: "forcePopupAlign", value: function forcePopupAlign() { if (this.state.popupVisible) { var _this$popupRef$curren3; (_this$popupRef$curren3 = this.popupRef.current) === null || _this$popupRef$curren3 === void 0 ? void 0 : _this$popupRef$curren3.forceAlign(); } } }, { key: "fireEvents", value: function fireEvents(type, e) { var childCallback = this.props.children.props[type]; if (childCallback) { childCallback(e); } var callback = this.props[type]; if (callback) { callback(e); } } }, { key: "close", value: function close() { this.setPopupVisible(false); } }, { key: "render", value: function render() { var popupVisible = this.state.popupVisible; var _this$props11 = this.props, children = _this$props11.children, forceRender = _this$props11.forceRender, alignPoint = _this$props11.alignPoint, className = _this$props11.className, autoDestroy = _this$props11.autoDestroy; var child = _react.default.Children.only(children); var newChildProps = { key: 'trigger' }; if (this.isContextMenuToShow()) { newChildProps.onContextMenu = this.onContextMenu; } else { newChildProps.onContextMenu = this.createTwoChains('onContextMenu'); } if (this.isClickToHide() || this.isClickToShow()) { newChildProps.onClick = this.onClick; newChildProps.onMouseDown = this.onMouseDown; newChildProps.onTouchStart = this.onTouchStart; } else { newChildProps.onClick = this.createTwoChains('onClick'); newChildProps.onMouseDown = this.createTwoChains('onMouseDown'); newChildProps.onTouchStart = this.createTwoChains('onTouchStart'); } if (this.isMouseEnterToShow()) { newChildProps.onMouseEnter = this.onMouseEnter; if (alignPoint) { newChildProps.onMouseMove = this.onMouseMove; } } else { newChildProps.onMouseEnter = this.createTwoChains('onMouseEnter'); } if (this.isMouseLeaveToHide()) { newChildProps.onMouseLeave = this.onMouseLeave; } else { newChildProps.onMouseLeave = this.createTwoChains('onMouseLeave'); } if (this.isFocusToShow() || this.isBlurToHide()) { newChildProps.onFocus = this.onFocus; newChildProps.onBlur = this.onBlur; } else { newChildProps.onFocus = this.createTwoChains('onFocus'); newChildProps.onBlur = this.createTwoChains('onBlur'); } var childrenClassName = (0, _classnames.default)(child && child.props && child.props.className, className); if (childrenClassName) { newChildProps.className = childrenClassName; } var cloneProps = (0, _objectSpread2.default)({}, newChildProps); if ((0, _ref2.supportRef)(child)) { cloneProps.ref = (0, _ref2.composeRef)(this.triggerRef, child.ref); } var trigger = _react.default.cloneElement(child, cloneProps); var portal; // prevent unmounting after it's rendered if (popupVisible || this.popupRef.current || forceRender) { portal = _react.default.createElement(PortalComponent, { key: "portal", getContainer: this.getContainer, didUpdate: this.handlePortalUpdate }, this.getComponent()); } if (!popupVisible && autoDestroy) { portal = null; } return _react.default.createElement(_context.default.Provider, { value: { onPopupMouseDown: this.onPopupMouseDown } }, trigger, portal); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(_ref, prevState) { var popupVisible = _ref.popupVisible; var newState = {}; if (popupVisible !== undefined && prevState.popupVisible !== popupVisible) { newState.popupVisible = popupVisible; newState.prevPopupVisible = prevState.popupVisible; } return newState; } }]); return Trigger; }(_react.default.Component); Trigger.contextType = _context.default; Trigger.defaultProps = { prefixCls: 'rc-trigger-popup', getPopupClassNameFromAlign: returnEmptyString, getDocument: returnDocument, onPopupVisibleChange: noop, afterPopupVisibleChange: noop, onPopupAlign: noop, popupClassName: '', mouseEnterDelay: 0, mouseLeaveDelay: 0.1, focusDelay: 0, blurDelay: 0.15, popupStyle: {}, destroyPopupOnHide: false, popupAlign: {}, defaultPopupVisible: false, mask: false, maskClosable: true, action: [], showAction: [], hideAction: [], autoDestroy: false }; return Trigger; } var _default = generateTrigger(_Portal.default); exports.default = _default; },{"./Popup":844,"./context":847,"./utils/alignUtil":849,"@babel/runtime/helpers/assertThisInitialized":182,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199,"classnames":455,"rc-util/lib/Dom/addEventListener":859,"rc-util/lib/Dom/contains":861,"rc-util/lib/Dom/findDOMNode":863,"rc-util/lib/Portal":866,"rc-util/lib/raf":873,"rc-util/lib/ref":874,"react":"react","react-dom":"react-dom"}],849:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getAlignFromPlacement = getAlignFromPlacement; exports.getAlignPopupClassName = getAlignPopupClassName; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); function isPointsEq(a1, a2, isAlignPoint) { if (isAlignPoint) { return a1[0] === a2[0]; } return a1[0] === a2[0] && a1[1] === a2[1]; } function getAlignFromPlacement(builtinPlacements, placementStr, align) { var baseAlign = builtinPlacements[placementStr] || {}; return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, baseAlign), align); } function getAlignPopupClassName(builtinPlacements, prefixCls, align, isAlignPoint) { var points = align.points; var placements = Object.keys(builtinPlacements); for (var i = 0; i < placements.length; i += 1) { var placement = placements[i]; if (isPointsEq(builtinPlacements[placement].points, points, isAlignPoint)) { return "".concat(prefixCls, "-placement-").concat(placement); } } return ''; } },{"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/objectSpread2":199}],850:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getMotion = getMotion; function getMotion(_ref) { var prefixCls = _ref.prefixCls, motion = _ref.motion, animation = _ref.animation, transitionName = _ref.transitionName; if (motion) { return motion; } if (animation) { return { motionName: "".concat(prefixCls, "-").concat(animation) }; } if (transitionName) { return { motionName: transitionName }; } return null; } },{}],851:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _pickAttrs = _interopRequireDefault(require("rc-util/lib/pickAttrs")); var _request = _interopRequireDefault(require("./request")); var _uid = _interopRequireDefault(require("./uid")); var _attrAccept = _interopRequireDefault(require("./attr-accept")); var _traverseFileTree = _interopRequireDefault(require("./traverseFileTree")); /* eslint react/no-is-mounted:0,react/sort-comp:0,react/prop-types:0 */ var AjaxUploader = /*#__PURE__*/function (_Component) { (0, _inherits2.default)(AjaxUploader, _Component); var _super = (0, _createSuper2.default)(AjaxUploader); function AjaxUploader() { var _this; (0, _classCallCheck2.default)(this, AjaxUploader); _this = _super.apply(this, arguments); _this.state = { uid: (0, _uid.default)() }; _this.reqs = {}; _this.onChange = function (e) { var files = e.target.files; _this.uploadFiles(files); _this.reset(); }; _this.onClick = function (e) { var el = _this.fileInput; if (!el) { return; } var _this$props = _this.props, children = _this$props.children, onClick = _this$props.onClick; if (children && children.type === 'button') { var parent = el.parentNode; parent.focus(); parent.querySelector('button').blur(); } el.click(); if (onClick) { onClick(e); } }; _this.onKeyDown = function (e) { if (e.key === 'Enter') { _this.onClick(e); } }; _this.onFileDrop = function (e) { var multiple = _this.props.multiple; e.preventDefault(); if (e.type === 'dragover') { return; } if (_this.props.directory) { (0, _traverseFileTree.default)(Array.prototype.slice.call(e.dataTransfer.items), _this.uploadFiles, function (_file) { return (0, _attrAccept.default)(_file, _this.props.accept); }); } else { var files = Array.prototype.slice.call(e.dataTransfer.files).filter(function (file) { return (0, _attrAccept.default)(file, _this.props.accept); }); if (multiple === false) { files = files.slice(0, 1); } _this.uploadFiles(files); } }; _this.uploadFiles = function (files) { var postFiles = Array.prototype.slice.call(files); postFiles.map(function (file) { // eslint-disable-next-line no-param-reassign file.uid = (0, _uid.default)(); return file; }).forEach(function (file) { _this.upload(file, postFiles); }); }; _this.saveFileInput = function (node) { _this.fileInput = node; }; return _this; } (0, _createClass2.default)(AjaxUploader, [{ key: "componentDidMount", value: function componentDidMount() { this._isMounted = true; } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this._isMounted = false; this.abort(); } }, { key: "upload", value: function upload(file, fileList) { var _this2 = this; var props = this.props; if (!props.beforeUpload) { // always async in case use react state to keep fileList Promise.resolve().then(function () { _this2.post(file); }); return; } var before = props.beforeUpload(file, fileList); if (before && typeof before !== 'boolean' && before.then) { before.then(function (processedFile) { var processedFileType = Object.prototype.toString.call(processedFile); if (processedFileType === '[object File]' || processedFileType === '[object Blob]') { _this2.post(processedFile); return; } _this2.post(file); }).catch(function (e) { // eslint-disable-next-line no-console console.log(e); }); } else if (before !== false) { Promise.resolve().then(function () { _this2.post(file); }); } } }, { key: "post", value: function post(file) { var _this3 = this; if (!this._isMounted) { return; } var props = this.props; var onStart = props.onStart, onProgress = props.onProgress, _props$transformFile = props.transformFile, transformFile = _props$transformFile === void 0 ? function (originFile) { return originFile; } : _props$transformFile; new Promise(function (resolve) { var action = props.action; if (typeof action === 'function') { action = action(file); } return resolve(action); }).then(function (action) { var uid = file.uid; var request = props.customRequest || _request.default; var transform = Promise.resolve(transformFile(file)).then(function (transformedFile) { var data = props.data; if (typeof data === 'function') { data = data(transformedFile); } return Promise.all([transformedFile, data]); }).catch(function (e) { console.error(e); // eslint-disable-line no-console }); transform.then(function (_ref) { var _ref2 = (0, _slicedToArray2.default)(_ref, 2), transformedFile = _ref2[0], data = _ref2[1]; var requestOption = { action: action, filename: props.name, data: data, file: transformedFile, headers: props.headers, withCredentials: props.withCredentials, method: props.method || 'post', onProgress: onProgress ? function (e) { onProgress(e, file); } : null, onSuccess: function onSuccess(ret, xhr) { delete _this3.reqs[uid]; props.onSuccess(ret, file, xhr); }, onError: function onError(err, ret) { delete _this3.reqs[uid]; props.onError(err, ret, file); } }; onStart(file); _this3.reqs[uid] = request(requestOption); }); }); } }, { key: "reset", value: function reset() { this.setState({ uid: (0, _uid.default)() }); } }, { key: "abort", value: function abort(file) { var reqs = this.reqs; if (file) { var uid = file.uid ? file.uid : file; if (reqs[uid] && reqs[uid].abort) { reqs[uid].abort(); } delete reqs[uid]; } else { Object.keys(reqs).forEach(function (uid) { if (reqs[uid] && reqs[uid].abort) { reqs[uid].abort(); } delete reqs[uid]; }); } } }, { key: "render", value: function render() { var _classNames; var _this$props2 = this.props, Tag = _this$props2.component, prefixCls = _this$props2.prefixCls, className = _this$props2.className, disabled = _this$props2.disabled, id = _this$props2.id, style = _this$props2.style, multiple = _this$props2.multiple, accept = _this$props2.accept, children = _this$props2.children, directory = _this$props2.directory, openFileDialogOnClick = _this$props2.openFileDialogOnClick, onMouseEnter = _this$props2.onMouseEnter, onMouseLeave = _this$props2.onMouseLeave, otherProps = (0, _objectWithoutProperties2.default)(_this$props2, ["component", "prefixCls", "className", "disabled", "id", "style", "multiple", "accept", "children", "directory", "openFileDialogOnClick", "onMouseEnter", "onMouseLeave"]); var cls = (0, _classnames.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, prefixCls, true), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames, className, className), _classNames)); // because input don't have directory/webkitdirectory type declaration var dirProps = directory ? { directory: 'directory', webkitdirectory: 'webkitdirectory' } : {}; var events = disabled ? {} : { onClick: openFileDialogOnClick ? this.onClick : function () {}, onKeyDown: openFileDialogOnClick ? this.onKeyDown : function () {}, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onDrop: this.onFileDrop, onDragOver: this.onFileDrop, tabIndex: '0' }; return _react.default.createElement(Tag, Object.assign({}, events, { className: cls, role: "button", style: style }), _react.default.createElement("input", Object.assign({}, (0, _pickAttrs.default)(otherProps, { aria: true, data: true }), { id: id, type: "file", ref: this.saveFileInput, onClick: function onClick(e) { return e.stopPropagation(); }, key: this.state.uid, style: { display: 'none' }, accept: accept }, dirProps, { multiple: multiple, onChange: this.onChange })), children); } }]); return AjaxUploader; }(_react.Component); var _default = AjaxUploader; exports.default = _default; },{"./attr-accept":853,"./request":855,"./traverseFileTree":856,"./uid":857,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/defineProperty":187,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"@babel/runtime/helpers/objectWithoutProperties":200,"@babel/runtime/helpers/slicedToArray":204,"classnames":455,"rc-util/lib/pickAttrs":872,"react":"react"}],852:[function(require,module,exports){ "use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireWildcard(require("react")); var _AjaxUploader = _interopRequireDefault(require("./AjaxUploader")); /* eslint react/prop-types:0 */ function empty() {} var Upload = /*#__PURE__*/function (_Component) { (0, _inherits2.default)(Upload, _Component); var _super = (0, _createSuper2.default)(Upload); function Upload() { var _this; (0, _classCallCheck2.default)(this, Upload); _this = _super.apply(this, arguments); _this.saveUploader = function (node) { _this.uploader = node; }; return _this; } (0, _createClass2.default)(Upload, [{ key: "abort", value: function abort(file) { this.uploader.abort(file); } }, { key: "render", value: function render() { return _react.default.createElement(_AjaxUploader.default, Object.assign({}, this.props, { ref: this.saveUploader })); } }]); return Upload; }(_react.Component); Upload.defaultProps = { component: 'span', prefixCls: 'rc-upload', data: {}, headers: {}, name: 'file', multipart: false, onStart: empty, onError: empty, onSuccess: empty, multiple: false, beforeUpload: null, customRequest: null, withCredentials: false, openFileDialogOnClick: true }; var _default = Upload; exports.default = _default; },{"./AjaxUploader":851,"@babel/runtime/helpers/classCallCheck":184,"@babel/runtime/helpers/createClass":185,"@babel/runtime/helpers/createSuper":186,"@babel/runtime/helpers/inherits":191,"@babel/runtime/helpers/interopRequireDefault":192,"@babel/runtime/helpers/interopRequireWildcard":193,"react":"react"}],853:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function endsWith(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; } var _default = function _default(file, acceptedFiles) { if (file && acceptedFiles) { var acceptedFilesArray = Array.isArray(acceptedFiles) ? acceptedFiles : acceptedFiles.split(','); var fileName = file.name || ''; var mimeType = file.type || ''; var baseMimeType = mimeType.replace(/\/.*$/, ''); return acceptedFilesArray.some(function (type) { var validType = type.trim(); if (validType.charAt(0) === '.') { return endsWith(fileName.toLowerCase(), validType.toLowerCase()); } if (/\/\*$/.test(validType)) { // This is something like a image/* mime type return baseMimeType === validType.replace(/\/.*$/, ''); } return mimeType === validType; }); } return true; }; exports.default = _default; },{}],854:[function(require,module,exports){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Upload = _interopRequireDefault(require("./Upload")); var _default = _Upload.default; exports.default = _default; },{"./Upload":852,"@babel/runtime/helpers/interopRequireDefault":192}],855:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = upload; function getError(option, xhr) { var msg = "cannot ".concat(option.method, " ").concat(option.action, " ").concat(xhr.status, "'"); var err = new Error(msg); err.status = xhr.status; err.method = option.method; err.url = option.action; return err; } function getBody(xhr) { var text = xhr.responseText || xhr.response; if (!text) { return text; } try { return JSON.parse(text); } catch (e) { return text; } } function upload(option) { // eslint-disable-next-line no-undef var xhr = new XMLHttpRequest(); if (option.onProgress && xhr.upload) { xhr.upload.onprogress = function progress(e) { if (e.total > 0) { e.percent = e.loaded / e.total * 100; } option.onProgress(e); }; } // eslint-disable-next-line no-undef var formData = new FormData(); if (option.data) { Object.keys(option.data).forEach(function (key) { var value = option.data[key]; // support key-value array data if (Array.isArray(value)) { value.forEach(function (item) { // { list: [ 11, 22 ] } // formData.append('list[]', 11); formData.append("".concat(key, "[]"), item); }); return; } formData.append(key, option.data[key]); }); } // eslint-disable-next-line no-undef if (option.file instanceof Blob) { formData.append(option.filename, option.file, option.file.name); } else { formData.append(option.filename, option.file); } xhr.onerror = function error(e) { option.onError(e); }; xhr.onload = function onload() { // allow success when 2xx status // see https://github.com/react-component/upload/issues/34 if (xhr.status < 200 || xhr.status >= 300) { return option.onError(getError(option, xhr), getBody(xhr)); } return option.onSuccess(getBody(xhr), xhr); }; xhr.open(option.method, option.action, true); // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179 if (option.withCredentials && 'withCredentials' in xhr) { xhr.withCredentials = true; } var headers = option.headers || {}; // when set headers['X-Requested-With'] = null , can close default XHR header // see https://github.com/react-component/upload/issues/33 if (headers['X-Requested-With'] !== null) { xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); } Object.keys(headers).forEach(function (h) { if (headers[h] !== null) { xhr.setRequestHeader(h, headers[h]); } }); xhr.send(formData); return { abort: function abort() { xhr.abort(); } }; } },{}],856:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function loopFiles(item, callback) { var dirReader = item.createReader(); var fileList = []; function sequence() { dirReader.readEntries(function (entries) { var entryList = Array.prototype.slice.apply(entries); fileList = fileList.concat(entryList); // Check if all the file has been viewed var isFinished = !entryList.length; if (isFinished) { callback(fileList); } else { sequence(); } }); } sequence(); } var traverseFileTree = function traverseFileTree(files, callback, isAccepted) { // eslint-disable-next-line @typescript-eslint/naming-convention var _traverseFileTree = function _traverseFileTree(item, path) { // eslint-disable-next-line no-param-reassign item.path = path || ''; if (item.isFile) { item.file(function (file) { if (isAccepted(file)) { // https://github.com/ant-design/ant-design/issues/16426 if (item.fullPath && !file.webkitRelativePath) { Object.defineProperties(file, { webkitRelativePath: { writable: true } }); // eslint-disable-next-line no-param-reassign file.webkitRelativePath = item.fullPath.replace(/^\//, ''); Object.defineProperties(file, { webkitRelativePath: { writable: false } }); } callback([file]); } }); } else if (item.isDirectory) { loopFiles(item, function (entries) { entries.forEach(function (entryItem) { _traverseFileTree(entryItem, "".concat(path).concat(item.name, "/")); }); }); } }; files.forEach(function (file) { _traverseFileTree(file.webkitGetAsEntry()); }); }; var _default = traverseFileTree; exports.default = _default; },{}],857:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = uid; var now = +new Date(); var index = 0; function uid() { // eslint-disable-next-line no-plusplus return "rc-upload-".concat(now, "-").concat(++index); } },{}],858:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = toArray; var _react = _interopRequireDefault(require("react")); var _reactIs = require("react-is"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function toArray(children) { var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var ret = []; _react.default.Children.forEach(children, function (child) { if ((child === undefined || child === null) && !option.keepEmpty) { return; } if (Array.isArray(child)) { ret = ret.concat(toArray(child)); } else if ((0, _reactIs.isFragment)(child) && child.props) { ret = ret.concat(toArray(child.props.children, option)); } else { ret.push(child); } }); return ret; } },{"react":"react","react-is":897}],859:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = addEventListenerWrap; var _reactDom = _interopRequireDefault(require("react-dom")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function addEventListenerWrap(target, eventType, cb, option) { /* eslint camelcase: 2 */ var callback = _reactDom.default.unstable_batchedUpdates ? function run(e) { _reactDom.default.unstable_batchedUpdates(cb, e); } : cb; if (target.addEventListener) { target.addEventListener(eventType, callback, option); } return { remove: function remove() { if (target.removeEventListener) { target.removeEventListener(eventType, callback); } } }; } },{"react-dom":"react-dom"}],860:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = canUseDom; function canUseDom() { return !!(typeof window !== 'undefined' && window.document && window.document.createElement); } },{}],861:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = contains; function contains(root, n) { if (!root) { return false; } return root.contains(n); } },{}],862:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.get = get; exports.set = set; exports.getOuterWidth = getOuterWidth; exports.getOuterHeight = getOuterHeight; exports.getDocSize = getDocSize; exports.getClientSize = getClientSize; exports.getScroll = getScroll; exports.getOffset = getOffset; /* eslint-disable no-nested-ternary */ var PIXEL_PATTERN = /margin|padding|width|height|max|min|offset/; var removePixel = { left: true, top: true }; var floatMap = { cssFloat: 1, styleFloat: 1, float: 1 }; function getComputedStyle(node) { return node.nodeType === 1 ? node.ownerDocument.defaultView.getComputedStyle(node, null) : {}; } function getStyleValue(node, type, value) { type = type.toLowerCase(); if (value === 'auto') { if (type === 'height') { return node.offsetHeight; } if (type === 'width') { return node.offsetWidth; } } if (!(type in removePixel)) { removePixel[type] = PIXEL_PATTERN.test(type); } return removePixel[type] ? parseFloat(value) || 0 : value; } function get(node, name) { var length = arguments.length; var style = getComputedStyle(node); name = floatMap[name] ? 'cssFloat' in node.style ? 'cssFloat' : 'styleFloat' : name; return length === 1 ? style : getStyleValue(node, name, style[name] || node.style[name]); } function set(node, name, value) { var length = arguments.length; name = floatMap[name] ? 'cssFloat' in node.style ? 'cssFloat' : 'styleFloat' : name; if (length === 3) { if (typeof value === 'number' && PIXEL_PATTERN.test(name)) { value = "".concat(value, "px"); } node.style[name] = value; // Number return value; } for (var x in name) { if (name.hasOwnProperty(x)) { set(node, x, name[x]); } } return getComputedStyle(node); } function getOuterWidth(el) { if (el === document.body) { return document.documentElement.clientWidth; } return el.offsetWidth; } function getOuterHeight(el) { if (el === document.body) { return window.innerHeight || document.documentElement.clientHeight; } return el.offsetHeight; } function getDocSize() { var width = Math.max(document.documentElement.scrollWidth, document.body.scrollWidth); var height = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight); return { width: width, height: height }; } function getClientSize() { var width = document.documentElement.clientWidth; var height = window.innerHeight || document.documentElement.clientHeight; return { width: width, height: height }; } function getScroll() { return { scrollLeft: Math.max(document.documentElement.scrollLeft, document.body.scrollLeft), scrollTop: Math.max(document.documentElement.scrollTop, document.body.scrollTop) }; } function getOffset(node) { var box = node.getBoundingClientRect(); var docElem = document.documentElement; // < ie8 不支持 win.pageXOffset, 则使用 docElem.scrollLeft return { left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || document.body.clientLeft || 0), top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || document.body.clientTop || 0) }; } },{}],863:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = findDOMNode; var _reactDom = _interopRequireDefault(require("react-dom")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Return if a node is a DOM node. Else will return by `findDOMNode` */ function findDOMNode(node) { if (node instanceof HTMLElement) { return node; } return _reactDom.default.findDOMNode(node); } },{"react-dom":"react-dom"}],864:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _default = function _default(element) { if (!element) { return false; } if (element.offsetParent) { return true; } if (element.getBBox) { var box = element.getBBox(); if (box.width || box.height) { return true; } } if (element.getBoundingClientRect) { var _box = element.getBoundingClientRect(); if (_box.width || _box.height) { return true; } } return false; }; exports.default = _default; },{}],865:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** * @ignore * some key-codes definition and utils from closure-library * @author yiminghe@gmail.com */ var KeyCode = { /** * MAC_ENTER */ MAC_ENTER: 3, /** * BACKSPACE */ BACKSPACE: 8, /** * TAB */ TAB: 9, /** * NUMLOCK on FF/Safari Mac */ NUM_CENTER: 12, /** * ENTER */ ENTER: 13, /** * SHIFT */ SHIFT: 16, /** * CTRL */ CTRL: 17, /** * ALT */ ALT: 18, /** * PAUSE */ PAUSE: 19, /** * CAPS_LOCK */ CAPS_LOCK: 20, /** * ESC */ ESC: 27, /** * SPACE */ SPACE: 32, /** * PAGE_UP */ PAGE_UP: 33, /** * PAGE_DOWN */ PAGE_DOWN: 34, /** * END */ END: 35, /** * HOME */ HOME: 36, /** * LEFT */ LEFT: 37, /** * UP */ UP: 38, /** * RIGHT */ RIGHT: 39, /** * DOWN */ DOWN: 40, /** * PRINT_SCREEN */ PRINT_SCREEN: 44, /** * INSERT */ INSERT: 45, /** * DELETE */ DELETE: 46, /** * ZERO */ ZERO: 48, /** * ONE */ ONE: 49, /** * TWO */ TWO: 50, /** * THREE */ THREE: 51, /** * FOUR */ FOUR: 52, /** * FIVE */ FIVE: 53, /** * SIX */ SIX: 54, /** * SEVEN */ SEVEN: 55, /** * EIGHT */ EIGHT: 56, /** * NINE */ NINE: 57, /** * QUESTION_MARK */ QUESTION_MARK: 63, /** * A */ A: 65, /** * B */ B: 66, /** * C */ C: 67, /** * D */ D: 68, /** * E */ E: 69, /** * F */ F: 70, /** * G */ G: 71, /** * H */ H: 72, /** * I */ I: 73, /** * J */ J: 74, /** * K */ K: 75, /** * L */ L: 76, /** * M */ M: 77, /** * N */ N: 78, /** * O */ O: 79, /** * P */ P: 80, /** * Q */ Q: 81, /** * R */ R: 82, /** * S */ S: 83, /** * T */ T: 84, /** * U */ U: 85, /** * V */ V: 86, /** * W */ W: 87, /** * X */ X: 88, /** * Y */ Y: 89, /** * Z */ Z: 90, /** * META */ META: 91, /** * WIN_KEY_RIGHT */ WIN_KEY_RIGHT: 92, /** * CONTEXT_MENU */ CONTEXT_MENU: 93, /** * NUM_ZERO */ NUM_ZERO: 96, /** * NUM_ONE */ NUM_ONE: 97, /** * NUM_TWO */ NUM_TWO: 98, /** * NUM_THREE */ NUM_THREE: 99, /** * NUM_FOUR */ NUM_FOUR: 100, /** * NUM_FIVE */ NUM_FIVE: 101, /** * NUM_SIX */ NUM_SIX: 102, /** * NUM_SEVEN */ NUM_SEVEN: 103, /** * NUM_EIGHT */ NUM_EIGHT: 104, /** * NUM_NINE */ NUM_NINE: 105, /** * NUM_MULTIPLY */ NUM_MULTIPLY: 106, /** * NUM_PLUS */ NUM_PLUS: 107, /** * NUM_MINUS */ NUM_MINUS: 109, /** * NUM_PERIOD */ NUM_PERIOD: 110, /** * NUM_DIVISION */ NUM_DIVISION: 111, /** * F1 */ F1: 112, /** * F2 */ F2: 113, /** * F3 */ F3: 114, /** * F4 */ F4: 115, /** * F5 */ F5: 116, /** * F6 */ F6: 117, /** * F7 */ F7: 118, /** * F8 */ F8: 119, /** * F9 */ F9: 120, /** * F10 */ F10: 121, /** * F11 */ F11: 122, /** * F12 */ F12: 123, /** * NUMLOCK */ NUMLOCK: 144, /** * SEMICOLON */ SEMICOLON: 186, /** * DASH */ DASH: 189, /** * EQUALS */ EQUALS: 187, /** * COMMA */ COMMA: 188, /** * PERIOD */ PERIOD: 190, /** * SLASH */ SLASH: 191, /** * APOSTROPHE */ APOSTROPHE: 192, /** * SINGLE_QUOTE */ SINGLE_QUOTE: 222, /** * OPEN_SQUARE_BRACKET */ OPEN_SQUARE_BRACKET: 219, /** * BACKSLASH */ BACKSLASH: 220, /** * CLOSE_SQUARE_BRACKET */ CLOSE_SQUARE_BRACKET: 221, /** * WIN_KEY */ WIN_KEY: 224, /** * MAC_FF_META */ MAC_FF_META: 224, /** * WIN_IME */ WIN_IME: 229, // ======================== Function ======================== /** * whether text and modified key is entered at the same time. */ isTextModifyingKeyEvent: function isTextModifyingKeyEvent(e) { var keyCode = e.keyCode; if (e.altKey && !e.ctrlKey || e.metaKey || // Function keys don't generate text keyCode >= KeyCode.F1 && keyCode <= KeyCode.F12) { return false; } // The following keys are quite harmless, even in combination with // CTRL, ALT or SHIFT. switch (keyCode) { case KeyCode.ALT: case KeyCode.CAPS_LOCK: case KeyCode.CONTEXT_MENU: case KeyCode.CTRL: case KeyCode.DOWN: case KeyCode.END: case KeyCode.ESC: case KeyCode.HOME: case KeyCode.INSERT: case KeyCode.LEFT: case KeyCode.MAC_FF_META: case KeyCode.META: case KeyCode.NUMLOCK: case KeyCode.NUM_CENTER: case KeyCode.PAGE_DOWN: case KeyCode.PAGE_UP: case KeyCode.PAUSE: case KeyCode.PRINT_SCREEN: case KeyCode.RIGHT: case KeyCode.SHIFT: case KeyCode.UP: case KeyCode.WIN_KEY: case KeyCode.WIN_KEY_RIGHT: return false; default: return true; } }, /** * whether character is entered. */ isCharacterKey: function isCharacterKey(keyCode) { if (keyCode >= KeyCode.ZERO && keyCode <= KeyCode.NINE) { return true; } if (keyCode >= KeyCode.NUM_ZERO && keyCode <= KeyCode.NUM_MULTIPLY) { return true; } if (keyCode >= KeyCode.A && keyCode <= KeyCode.Z) { return true; } // Safari sends zero key code for non-latin characters. if (window.navigator.userAgent.indexOf('WebKit') !== -1 && keyCode === 0) { return true; } switch (keyCode) { case KeyCode.SPACE: case KeyCode.QUESTION_MARK: case KeyCode.NUM_PLUS: case KeyCode.NUM_MINUS: case KeyCode.NUM_PERIOD: case KeyCode.NUM_DIVISION: case KeyCode.SEMICOLON: case KeyCode.DASH: case KeyCode.EQUALS: case KeyCode.COMMA: case KeyCode.PERIOD: case KeyCode.SLASH: case KeyCode.APOSTROPHE: case KeyCode.SINGLE_QUOTE: case KeyCode.OPEN_SQUARE_BRACKET: case KeyCode.BACKSLASH: case KeyCode.CLOSE_SQUARE_BRACKET: return true; default: return false; } } }; var _default = KeyCode; exports.default = _default; },{}],866:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); var _reactDom = _interopRequireDefault(require("react-dom")); var _canUseDom = _interopRequireDefault(require("./Dom/canUseDom")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Portal = (0, _react.forwardRef)(function (props, ref) { var didUpdate = props.didUpdate, getContainer = props.getContainer, children = props.children; var containerRef = (0, _react.useRef)(); // Ref return nothing, only for wrapper check exist (0, _react.useImperativeHandle)(ref, function () { return {}; }); // Create container in client side with sync to avoid useEffect not get ref var initRef = (0, _react.useRef)(false); if (!initRef.current && (0, _canUseDom.default)()) { containerRef.current = getContainer(); initRef.current = true; } // [Legacy] Used by `rc-trigger` (0, _react.useEffect)(function () { didUpdate === null || didUpdate === void 0 ? void 0 : didUpdate(props); }); (0, _react.useEffect)(function () { return function () { var _containerRef$current, _containerRef$current2; // [Legacy] This should not be handle by Portal but parent PortalWrapper instead. // Since some component use `Portal` directly, we have to keep the logic here. (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : (_containerRef$current2 = _containerRef$current.parentNode) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.removeChild(containerRef.current); }; }, []); return containerRef.current ? _reactDom.default.createPortal(children, containerRef.current) : null; }); var _default = Portal; exports.default = _default; },{"./Dom/canUseDom":860,"react":"react","react-dom":"react-dom"}],867:[function(require,module,exports){ (function (process){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getOpenCount = getOpenCount; exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _raf = _interopRequireDefault(require("./raf")); var _Portal = _interopRequireDefault(require("./Portal")); var _switchScrollingEffect = _interopRequireDefault(require("./switchScrollingEffect")); var _setStyle = _interopRequireDefault(require("./setStyle")); var _canUseDom = _interopRequireDefault(require("./Dom/canUseDom")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var openCount = 0; var supportDom = (0, _canUseDom.default)(); /** @private Test usage only */ function getOpenCount() { return process.env.NODE_ENV === 'test' ? openCount : 0; } // https://github.com/ant-design/ant-design/issues/19340 // https://github.com/ant-design/ant-design/issues/19332 var cacheOverflow = {}; var getParent = function getParent(getContainer) { if (!supportDom) { return null; } if (getContainer) { if (typeof getContainer === 'string') { return document.querySelectorAll(getContainer)[0]; } if (typeof getContainer === 'function') { return getContainer(); } if (_typeof(getContainer) === 'object' && getContainer instanceof window.HTMLElement) { return getContainer; } } return document.body; }; var PortalWrapper = /*#__PURE__*/function (_React$Component) { _inherits(PortalWrapper, _React$Component); var _super = _createSuper(PortalWrapper); function PortalWrapper(props) { var _this; _classCallCheck(this, PortalWrapper); _this = _super.call(this, props); _this.componentRef = React.createRef(); _this.attachToParent = function () { var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (force || _this.container && !_this.container.parentNode) { var parent = getParent(_this.props.getContainer); if (parent) { parent.appendChild(_this.container); return true; } return false; } return true; }; _this.getContainer = function () { if (!supportDom) { return null; } if (!_this.container) { _this.container = document.createElement('div'); _this.attachToParent(true); } _this.setWrapperClassName(); return _this.container; }; _this.setWrapperClassName = function () { var wrapperClassName = _this.props.wrapperClassName; if (_this.container && wrapperClassName && wrapperClassName !== _this.container.className) { _this.container.className = wrapperClassName; } }; _this.removeCurrentContainer = function () { var _this$container, _this$container$paren; // Portal will remove from `parentNode`. // Let's handle this again to avoid refactor issue. (_this$container = _this.container) === null || _this$container === void 0 ? void 0 : (_this$container$paren = _this$container.parentNode) === null || _this$container$paren === void 0 ? void 0 : _this$container$paren.removeChild(_this.container); }; /** * Enhance ./switchScrollingEffect * 1. Simulate document body scroll bar with * 2. Record body has overflow style and recover when all of PortalWrapper invisible * 3. Disable body scroll when PortalWrapper has open * * @memberof PortalWrapper */ _this.switchScrollingEffect = function () { if (openCount === 1 && !Object.keys(cacheOverflow).length) { (0, _switchScrollingEffect.default)(); // Must be set after switchScrollingEffect cacheOverflow = (0, _setStyle.default)({ overflow: 'hidden', overflowX: 'hidden', overflowY: 'hidden' }); } else if (!openCount) { (0, _setStyle.default)(cacheOverflow); cacheOverflow = {}; (0, _switchScrollingEffect.default)(true); } }; var visible = props.visible, getContainer = props.getContainer; if (supportDom && getParent(getContainer) === document.body) { openCount = visible ? openCount + 1 : openCount; } _this.state = { _self: _assertThisInitialized(_this) }; return _this; } _createClass(PortalWrapper, [{ key: "componentDidMount", value: function componentDidMount() { var _this2 = this; if (!this.attachToParent()) { this.rafId = (0, _raf.default)(function () { _this2.forceUpdate(); }); } } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.setWrapperClassName(); this.attachToParent(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _this$props = this.props, visible = _this$props.visible, getContainer = _this$props.getContainer; if (supportDom && getParent(getContainer) === document.body) { // 离开时不会 render, 导到离开时数值不变,改用 func 。。 openCount = visible && openCount ? openCount - 1 : openCount; } this.removeCurrentContainer(); _raf.default.cancel(this.rafId); } }, { key: "render", value: function render() { var _this$props2 = this.props, children = _this$props2.children, forceRender = _this$props2.forceRender, visible = _this$props2.visible; var portal = null; var childProps = { getOpenCount: function getOpenCount() { return openCount; }, getContainer: this.getContainer, switchScrollingEffect: this.switchScrollingEffect }; if (forceRender || visible || this.componentRef.current) { portal = React.createElement(_Portal.default, { getContainer: this.getContainer, ref: this.componentRef }, children(childProps)); } return portal; } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, _ref) { var prevProps = _ref.prevProps, _self = _ref._self; var visible = props.visible, getContainer = props.getContainer; if (prevProps) { var prevVisible = prevProps.visible, prevGetContainer = prevProps.getContainer; if (visible !== prevVisible && supportDom && getParent(getContainer) === document.body) { openCount = visible && !prevVisible ? openCount + 1 : openCount - 1; } var getContainerIsFunc = typeof getContainer === 'function' && typeof prevGetContainer === 'function'; if (getContainerIsFunc ? getContainer.toString() !== prevGetContainer.toString() : getContainer !== prevGetContainer) { _self.removeCurrentContainer(); } } return { prevProps: props }; } }]); return PortalWrapper; }(React.Component); var _default = PortalWrapper; exports.default = _default; }).call(this,require('_process')) },{"./Dom/canUseDom":860,"./Portal":866,"./raf":873,"./setStyle":875,"./switchScrollingEffect":876,"_process":1,"react":"react"}],868:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = createChainedFunction; /** * Safe chained function * * Will only create a new function if needed, * otherwise will pass back existing functions or null. * * @returns {function|null} */ function createChainedFunction() { var args = [].slice.call(arguments, 0); if (args.length === 1) { return args[0]; } return function chainedFunction() { for (var i = 0; i < args.length; i++) { if (args[i] && args[i].apply) { args[i].apply(this, arguments); } } }; } },{}],869:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = getScrollBarSize; var cached; function getScrollBarSize(fresh) { if (typeof document === 'undefined') { return 0; } if (fresh || cached === undefined) { var inner = document.createElement('div'); inner.style.width = '100%'; inner.style.height = '200px'; var outer = document.createElement('div'); var outerStyle = outer.style; outerStyle.position = 'absolute'; outerStyle.top = 0; outerStyle.left = 0; outerStyle.pointerEvents = 'none'; outerStyle.visibility = 'hidden'; outerStyle.width = '200px'; outerStyle.height = '150px'; outerStyle.overflow = 'hidden'; outer.appendChild(inner); document.body.appendChild(outer); var widthContained = inner.offsetWidth; outer.style.overflow = 'scroll'; var widthScroll = inner.offsetWidth; if (widthContained === widthScroll) { widthScroll = outer.clientWidth; } document.body.removeChild(outer); cached = widthContained - widthScroll; } return cached; } },{}],870:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useMemo; var React = _interopRequireWildcard(require("react")); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function useMemo(getValue, condition, shouldUpdate) { var cacheRef = React.useRef({}); if (!('value' in cacheRef.current) || shouldUpdate(cacheRef.current.condition, condition)) { cacheRef.current.value = getValue(); cacheRef.current.condition = condition; } return cacheRef.current.value; } },{"react":"react"}],871:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useControlledState; var React = _interopRequireWildcard(require("react")); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function useControlledState(defaultStateValue, option) { var _ref = option || {}, defaultValue = _ref.defaultValue, value = _ref.value, onChange = _ref.onChange, postState = _ref.postState; var _React$useState = React.useState(function () { if (value !== undefined) { return value; } if (defaultValue !== undefined) { return typeof defaultValue === 'function' ? defaultValue() : defaultValue; } return typeof defaultStateValue === 'function' ? defaultStateValue() : defaultStateValue; }), _React$useState2 = _slicedToArray(_React$useState, 2), innerValue = _React$useState2[0], setInnerValue = _React$useState2[1]; var mergedValue = value !== undefined ? value : innerValue; if (postState) { mergedValue = postState(mergedValue); } function triggerChange(newValue) { setInnerValue(newValue); if (mergedValue !== newValue && onChange) { onChange(newValue, mergedValue); } } // Effect of reset value to `undefined` var firstRenderRef = React.useRef(true); React.useEffect(function () { if (firstRenderRef.current) { firstRenderRef.current = false; return; } if (value === undefined) { setInnerValue(value); } }, [value]); return [mergedValue, triggerChange]; } },{"react":"react"}],872:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = pickAttrs; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var attributes = "accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap"; var eventsName = "onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError"; var propList = "".concat(attributes, " ").concat(eventsName).split(/[\s\n]+/); /* eslint-enable max-len */ var ariaPrefix = 'aria-'; var dataPrefix = 'data-'; function match(key, prefix) { return key.indexOf(prefix) === 0; } /** * Picker props from exist props with filter * @param props Passed props * @param ariaOnly boolean | { aria?: boolean; data?: boolean; attr?: boolean; } filter config */ function pickAttrs(props) { var ariaOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var mergedConfig; if (ariaOnly === false) { mergedConfig = { aria: true, data: true, attr: true }; } else if (ariaOnly === true) { mergedConfig = { aria: true }; } else { mergedConfig = _objectSpread({}, ariaOnly); } var attrs = {}; Object.keys(props).forEach(function (key) { if ( // Aria mergedConfig.aria && (key === 'role' || match(key, ariaPrefix)) || // Data mergedConfig.data && match(key, dataPrefix) || // Attr mergedConfig.attr && propList.includes(key)) { attrs[key] = props[key]; } }); return attrs; } },{}],873:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = wrapperRaf; var raf = function raf(callback) { return +setTimeout(callback, 16); }; var caf = function caf(num) { return clearTimeout(num); }; if (typeof window !== 'undefined' && 'requestAnimationFrame' in window) { raf = function raf(callback) { return window.requestAnimationFrame(callback); }; caf = function caf(handle) { return window.cancelAnimationFrame(handle); }; } function wrapperRaf(callback) { return raf(callback); } wrapperRaf.cancel = caf; },{}],874:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fillRef = fillRef; exports.composeRef = composeRef; exports.supportRef = supportRef; var _reactIs = require("react-is"); function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function fillRef(ref, node) { if (typeof ref === 'function') { ref(node); } else if (_typeof(ref) === 'object' && ref && 'current' in ref) { ref.current = node; } } /** * Merge refs into one ref function to support ref passing. */ function composeRef() { for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) { refs[_key] = arguments[_key]; } return function (node) { refs.forEach(function (ref) { fillRef(ref, node); }); }; } function supportRef(nodeOrComponent) { var _type$prototype, _nodeOrComponent$prot; var type = (0, _reactIs.isMemo)(nodeOrComponent) ? nodeOrComponent.type.type : nodeOrComponent.type; // Function component node if (typeof type === 'function' && !((_type$prototype = type.prototype) === null || _type$prototype === void 0 ? void 0 : _type$prototype.render)) { return false; } // Class component if (typeof nodeOrComponent === 'function' && !((_nodeOrComponent$prot = nodeOrComponent.prototype) === null || _nodeOrComponent$prot === void 0 ? void 0 : _nodeOrComponent$prot.render)) { return false; } return true; } /* eslint-enable */ },{"react-is":897}],875:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** * Easy to set element style, return previous style * IE browser compatible(IE browser doesn't merge overflow style, need to set it separately) * https://github.com/ant-design/ant-design/issues/19393 * */ function setStyle(style) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var _options$element = options.element, element = _options$element === void 0 ? document.body : _options$element; var oldStyle = {}; var styleKeys = Object.keys(style); // IE browser compatible styleKeys.forEach(function (key) { oldStyle[key] = element.style[key]; }); styleKeys.forEach(function (key) { element.style[key] = style[key]; }); return oldStyle; } var _default = setStyle; exports.default = _default; },{}],876:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _getScrollBarSize = _interopRequireDefault(require("./getScrollBarSize")); var _setStyle = _interopRequireDefault(require("./setStyle")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function isBodyOverflowing() { return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight) && window.innerWidth > document.body.offsetWidth; } var cacheStyle = {}; var _default = function _default(close) { if (!isBodyOverflowing() && !close) { return; } // https://github.com/ant-design/ant-design/issues/19729 var scrollingEffectClassName = 'ant-scrolling-effect'; var scrollingEffectClassNameReg = new RegExp("".concat(scrollingEffectClassName), 'g'); var bodyClassName = document.body.className; if (close) { if (!scrollingEffectClassNameReg.test(bodyClassName)) return; (0, _setStyle.default)(cacheStyle); cacheStyle = {}; document.body.className = bodyClassName.replace(scrollingEffectClassNameReg, '').trim(); return; } var scrollBarSize = (0, _getScrollBarSize.default)(); if (scrollBarSize) { cacheStyle = (0, _setStyle.default)({ position: 'relative', width: "calc(100% - ".concat(scrollBarSize, "px)") }); if (!scrollingEffectClassNameReg.test(bodyClassName)) { var addClassName = "".concat(bodyClassName, " ").concat(scrollingEffectClassName); document.body.className = addClassName.trim(); } } }; exports.default = _default; },{"./getScrollBarSize":869,"./setStyle":875}],877:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = get; function get(entity, path) { var current = entity; for (var i = 0; i < path.length; i += 1) { if (current === null || current === undefined) { return undefined; } current = current[path[i]]; } return current; } },{}],878:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = set; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function set(entity, paths, value) { if (!paths.length) { return value; } var _paths = _toArray(paths), path = _paths[0], restPath = _paths.slice(1); var clone; if (!entity && typeof path === 'number') { clone = []; } else if (Array.isArray(entity)) { clone = _toConsumableArray(entity); } else { clone = _objectSpread({}, entity); } clone[path] = set(clone[path], restPath, value); return clone; } },{}],879:[function(require,module,exports){ (function (process){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.warning = warning; exports.note = note; exports.resetWarned = resetWarned; exports.call = call; exports.warningOnce = warningOnce; exports.noteOnce = noteOnce; exports.default = void 0; /* eslint-disable no-console */ var warned = {}; function warning(valid, message) { // Support uglify if (process.env.NODE_ENV !== 'production' && !valid && console !== undefined) { console.error("Warning: ".concat(message)); } } function note(valid, message) { // Support uglify if (process.env.NODE_ENV !== 'production' && !valid && console !== undefined) { console.warn("Note: ".concat(message)); } } function resetWarned() { warned = {}; } function call(method, valid, message) { if (!valid && !warned[message]) { method(false, message); warned[message] = true; } } function warningOnce(valid, message) { call(warning, valid, message); } function noteOnce(valid, message) { call(note, valid, message); } var _default = warningOnce; /* eslint-enable */ exports.default = _default; }).call(this,require('_process')) },{"_process":1}],880:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer")); var _classnames = _interopRequireDefault(require("classnames")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /** * Fill component to provided the scroll content real height. */ var Filler = function Filler(_ref) { var height = _ref.height, offset = _ref.offset, children = _ref.children, prefixCls = _ref.prefixCls, onInnerResize = _ref.onInnerResize; var outerStyle = {}; var innerStyle = { display: 'flex', flexDirection: 'column' }; if (offset !== undefined) { outerStyle = { height: height, position: 'relative', overflow: 'hidden' }; innerStyle = _objectSpread(_objectSpread({}, innerStyle), {}, { transform: "translateY(".concat(offset, "px)"), position: 'absolute', left: 0, right: 0, top: 0 }); } return React.createElement("div", { style: outerStyle }, React.createElement(_rcResizeObserver.default, { onResize: function onResize(_ref2) { var offsetHeight = _ref2.offsetHeight; if (offsetHeight && onInnerResize) { onInnerResize(); } } }, React.createElement("div", { style: innerStyle, className: (0, _classnames.default)(_defineProperty({}, "".concat(prefixCls, "-holder-inner"), prefixCls)) }, children))); }; var _default = Filler; exports.default = _default; },{"classnames":455,"rc-resize-observer":729,"react":"react"}],881:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.Item = Item; var React = _interopRequireWildcard(require("react")); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function Item(_ref) { var children = _ref.children, setRef = _ref.setRef; var refFunc = React.useCallback(function (node) { setRef(node); }, []); return React.cloneElement(children, { ref: refFunc }); } },{"react":"react"}],882:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.RawList = RawList; exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _Filler = _interopRequireDefault(require("./Filler")); var _ScrollBar = _interopRequireDefault(require("./ScrollBar")); var _useChildren = _interopRequireDefault(require("./hooks/useChildren")); var _useHeights3 = _interopRequireDefault(require("./hooks/useHeights")); var _useScrollTo = _interopRequireDefault(require("./hooks/useScrollTo")); var _useDiffItem3 = _interopRequireDefault(require("./hooks/useDiffItem")); var _useFrameWheel3 = _interopRequireDefault(require("./hooks/useFrameWheel")); var _useMobileTouchMove = _interopRequireDefault(require("./hooks/useMobileTouchMove")); var _useOriginScroll = _interopRequireDefault(require("./hooks/useOriginScroll")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } var EMPTY_DATA = []; var ScrollStyle = { overflowY: 'auto', overflowAnchor: 'none' }; function RawList(props, ref) { var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-virtual-list' : _props$prefixCls, className = props.className, height = props.height, itemHeight = props.itemHeight, _props$fullHeight = props.fullHeight, fullHeight = _props$fullHeight === void 0 ? true : _props$fullHeight, style = props.style, data = props.data, children = props.children, itemKey = props.itemKey, virtual = props.virtual, _props$component = props.component, Component = _props$component === void 0 ? 'div' : _props$component, onScroll = props.onScroll, restProps = _objectWithoutProperties(props, ["prefixCls", "className", "height", "itemHeight", "fullHeight", "style", "data", "children", "itemKey", "virtual", "component", "onScroll"]); // ================================= MISC ================================= var inVirtual = virtual !== false && height && itemHeight && data && itemHeight * data.length > height; var _useState = (0, React.useState)(0), _useState2 = _slicedToArray(_useState, 2), scrollTop = _useState2[0], setScrollTop = _useState2[1]; var _useState3 = (0, React.useState)(false), _useState4 = _slicedToArray(_useState3, 2), scrollMoving = _useState4[0], setScrollMoving = _useState4[1]; var mergedClassName = (0, _classnames.default)(prefixCls, className); var mergedData = data || EMPTY_DATA; var componentRef = (0, React.useRef)(); // =============================== Item Key =============================== var getKey = React.useCallback(function (item) { if (typeof itemKey === 'function') { return itemKey(item); } return item[itemKey]; }, [itemKey]); var sharedConfig = { getKey: getKey }; // ================================ Scroll ================================ function syncScrollTop(newTop) { setScrollTop(function (origin) { var value; if (typeof newTop === 'function') { value = newTop(origin); } else { value = newTop; } var alignedTop = keepInRange(value); componentRef.current.scrollTop = alignedTop; return alignedTop; }); } // ================================ Legacy ================================ // Put ref here since the range is generate by follow var rangeRef = (0, React.useRef)({ start: 0, end: mergedData.length }); var diffItemRef = (0, React.useRef)(); var _useDiffItem = (0, _useDiffItem3.default)(mergedData, getKey), _useDiffItem2 = _slicedToArray(_useDiffItem, 1), diffItem = _useDiffItem2[0]; diffItemRef.current = diffItem; // ================================ Height ================================ var _useHeights = (0, _useHeights3.default)(getKey, null, null), _useHeights2 = _slicedToArray(_useHeights, 4), setInstanceRef = _useHeights2[0], collectHeight = _useHeights2[1], heights = _useHeights2[2], heightUpdatedMark = _useHeights2[3]; // ========================== Visible Calculation ========================= var _React$useMemo = React.useMemo(function () { if (!inVirtual) { return { scrollHeight: undefined, start: 0, end: mergedData.length - 1, offset: undefined }; } var itemTop = 0; var startIndex; var startOffset; var endIndex; var dataLen = mergedData.length; for (var i = 0; i < dataLen; i += 1) { var item = mergedData[i]; var key = getKey(item); var cacheHeight = heights.get(key); var currentItemBottom = itemTop + (cacheHeight === undefined ? itemHeight : cacheHeight); // Check item top in the range if (currentItemBottom >= scrollTop && startIndex === undefined) { startIndex = i; startOffset = itemTop; } // Check item bottom in the range. We will render additional one item for motion usage if (currentItemBottom > scrollTop + height && endIndex === undefined) { endIndex = i; } itemTop = currentItemBottom; } // Fallback to normal if not match. This code should never reach /* istanbul ignore next */ if (startIndex === undefined) { startIndex = 0; startOffset = 0; } if (endIndex === undefined) { endIndex = mergedData.length - 1; } // Give cache to improve scroll experience endIndex = Math.min(endIndex + 1, mergedData.length); return { scrollHeight: itemTop, start: startIndex, end: endIndex, offset: startOffset }; }, [inVirtual, scrollTop, mergedData, heightUpdatedMark, height]), scrollHeight = _React$useMemo.scrollHeight, start = _React$useMemo.start, end = _React$useMemo.end, offset = _React$useMemo.offset; rangeRef.current.start = start; rangeRef.current.end = end; // =============================== In Range =============================== var maxScrollHeight = scrollHeight - height; var maxScrollHeightRef = (0, React.useRef)(maxScrollHeight); maxScrollHeightRef.current = maxScrollHeight; function keepInRange(newScrollTop) { var newTop = Math.max(newScrollTop, 0); if (!Number.isNaN(maxScrollHeightRef.current)) { newTop = Math.min(newTop, maxScrollHeightRef.current); } return newTop; } var isScrollAtTop = scrollTop <= 0; var isScrollAtBottom = scrollTop >= maxScrollHeight; var originScroll = (0, _useOriginScroll.default)(isScrollAtTop, isScrollAtBottom); // ================================ Scroll ================================ function onScrollBar(newScrollTop) { var newTop = newScrollTop; syncScrollTop(newTop); } // This code may only trigger in test case. // But we still need a sync if some special escape function onFallbackScroll(e) { var newScrollTop = e.currentTarget.scrollTop; if (newScrollTop !== scrollTop) { syncScrollTop(newScrollTop); } // Trigger origin onScroll onScroll === null || onScroll === void 0 ? void 0 : onScroll(e); } // Since this added in global,should use ref to keep update var _useFrameWheel = (0, _useFrameWheel3.default)(inVirtual, isScrollAtTop, isScrollAtBottom, function (offsetY) { syncScrollTop(function (top) { var newTop = top + offsetY; return newTop; }); }), _useFrameWheel2 = _slicedToArray(_useFrameWheel, 2), onRawWheel = _useFrameWheel2[0], onFireFoxScroll = _useFrameWheel2[1]; // Mobile touch move (0, _useMobileTouchMove.default)(inVirtual, componentRef, function (deltaY, smoothOffset) { if (originScroll(deltaY, smoothOffset)) { return false; } onRawWheel({ preventDefault: function preventDefault() {}, deltaY: deltaY }); return true; }); React.useEffect(function () { // Firefox only function onMozMousePixelScroll(e) { if (inVirtual) { e.preventDefault(); } } componentRef.current.addEventListener('wheel', onRawWheel); componentRef.current.addEventListener('DOMMouseScroll', onFireFoxScroll); componentRef.current.addEventListener('MozMousePixelScroll', onMozMousePixelScroll); return function () { componentRef.current.removeEventListener('wheel', onRawWheel); componentRef.current.removeEventListener('DOMMouseScroll', onFireFoxScroll); componentRef.current.removeEventListener('MozMousePixelScroll', onMozMousePixelScroll); }; }, [inVirtual]); // ================================= Ref ================================== var scrollTo = (0, _useScrollTo.default)(componentRef, mergedData, heights, itemHeight, getKey, collectHeight, syncScrollTop); React.useImperativeHandle(ref, function () { return { scrollTo: scrollTo }; }); // ================================ Render ================================ var listChildren = (0, _useChildren.default)(mergedData, start, end, setInstanceRef, children, sharedConfig); var componentStyle = null; if (height) { componentStyle = _objectSpread(_defineProperty({}, fullHeight ? 'height' : 'maxHeight', height), ScrollStyle); if (inVirtual) { componentStyle.overflowY = 'hidden'; if (scrollMoving) { componentStyle.pointerEvents = 'none'; } } } return React.createElement("div", Object.assign({ style: _objectSpread(_objectSpread({}, style), {}, { position: 'relative' }), className: mergedClassName }, restProps), React.createElement(Component, { className: "".concat(prefixCls, "-holder"), style: componentStyle, ref: componentRef, onScroll: onFallbackScroll }, React.createElement(_Filler.default, { prefixCls: prefixCls, height: scrollHeight, offset: offset, onInnerResize: collectHeight }, listChildren)), inVirtual && React.createElement(_ScrollBar.default, { prefixCls: prefixCls, scrollTop: scrollTop, height: height, scrollHeight: scrollHeight, count: mergedData.length, onScroll: onScrollBar, onStartMove: function onStartMove() { setScrollMoving(true); }, onStopMove: function onStopMove() { setScrollMoving(false); } })); } var List = React.forwardRef(RawList); List.displayName = 'List'; var _default = List; exports.default = _default; },{"./Filler":880,"./ScrollBar":883,"./hooks/useChildren":884,"./hooks/useDiffItem":885,"./hooks/useFrameWheel":886,"./hooks/useHeights":887,"./hooks/useMobileTouchMove":888,"./hooks/useOriginScroll":889,"./hooks/useScrollTo":890,"classnames":455,"react":"react"}],883:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _raf = _interopRequireDefault(require("rc-util/lib/raf")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var MIN_SIZE = 20; function getPageY(e) { return 'touches' in e ? e.touches[0].pageY : e.pageY; } var ScrollBar = /*#__PURE__*/function (_React$Component) { _inherits(ScrollBar, _React$Component); var _super = _createSuper(ScrollBar); function ScrollBar() { var _this; _classCallCheck(this, ScrollBar); _this = _super.apply(this, arguments); _this.moveRaf = null; _this.scrollbarRef = React.createRef(); _this.thumbRef = React.createRef(); _this.visibleTimeout = null; _this.state = { dragging: false, pageY: null, startTop: null, visible: false }; _this.delayHidden = function () { clearTimeout(_this.visibleTimeout); _this.setState({ visible: true }); _this.visibleTimeout = setTimeout(function () { _this.setState({ visible: false }); }, 2000); }; _this.onScrollbarTouchStart = function (e) { e.preventDefault(); }; _this.onContainerMouseDown = function (e) { e.stopPropagation(); e.preventDefault(); }; // ======================= Clean ======================= _this.patchEvents = function () { window.addEventListener('mousemove', _this.onMouseMove); window.addEventListener('mouseup', _this.onMouseUp); _this.thumbRef.current.addEventListener('touchmove', _this.onMouseMove); _this.thumbRef.current.addEventListener('touchend', _this.onMouseUp); }; _this.removeEvents = function () { window.removeEventListener('mousemove', _this.onMouseMove); window.removeEventListener('mouseup', _this.onMouseUp); _this.scrollbarRef.current.removeEventListener('touchstart', _this.onScrollbarTouchStart); _this.thumbRef.current.removeEventListener('touchstart', _this.onMouseDown); _this.thumbRef.current.removeEventListener('touchmove', _this.onMouseMove); _this.thumbRef.current.removeEventListener('touchend', _this.onMouseUp); _raf.default.cancel(_this.moveRaf); }; // ======================= Thumb ======================= _this.onMouseDown = function (e) { var onStartMove = _this.props.onStartMove; _this.setState({ dragging: true, pageY: getPageY(e), startTop: _this.getTop() }); onStartMove(); _this.patchEvents(); e.stopPropagation(); e.preventDefault(); }; _this.onMouseMove = function (e) { var _this$state = _this.state, dragging = _this$state.dragging, pageY = _this$state.pageY, startTop = _this$state.startTop; var onScroll = _this.props.onScroll; _raf.default.cancel(_this.moveRaf); if (dragging) { var offsetY = getPageY(e) - pageY; var newTop = startTop + offsetY; var enableScrollRange = _this.getEnableScrollRange(); var enableHeightRange = _this.getEnableHeightRange(); var ptg = newTop / enableHeightRange; var newScrollTop = Math.ceil(ptg * enableScrollRange); _this.moveRaf = (0, _raf.default)(function () { onScroll(newScrollTop); }); } }; _this.onMouseUp = function () { var onStopMove = _this.props.onStopMove; _this.setState({ dragging: false }); onStopMove(); _this.removeEvents(); }; // ===================== Calculate ===================== _this.getSpinHeight = function () { var _this$props = _this.props, height = _this$props.height, count = _this$props.count; var baseHeight = height / count * 10; baseHeight = Math.max(baseHeight, MIN_SIZE); baseHeight = Math.min(baseHeight, height / 2); return Math.floor(baseHeight); }; _this.getEnableScrollRange = function () { var _this$props2 = _this.props, scrollHeight = _this$props2.scrollHeight, height = _this$props2.height; return scrollHeight - height; }; _this.getEnableHeightRange = function () { var height = _this.props.height; var spinHeight = _this.getSpinHeight(); return height - spinHeight; }; _this.getTop = function () { var scrollTop = _this.props.scrollTop; var enableScrollRange = _this.getEnableScrollRange(); var enableHeightRange = _this.getEnableHeightRange(); var ptg = scrollTop / enableScrollRange; return ptg * enableHeightRange; }; return _this; } _createClass(ScrollBar, [{ key: "componentDidMount", value: function componentDidMount() { this.scrollbarRef.current.addEventListener('touchstart', this.onScrollbarTouchStart); this.thumbRef.current.addEventListener('touchstart', this.onMouseDown); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { if (prevProps.scrollTop !== this.props.scrollTop) { this.delayHidden(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.removeEvents(); clearTimeout(this.visibleTimeout); } }, { key: "render", value: function render() { var _this$state2 = this.state, visible = _this$state2.visible, dragging = _this$state2.dragging; var prefixCls = this.props.prefixCls; var spinHeight = this.getSpinHeight(); var top = this.getTop(); return React.createElement("div", { ref: this.scrollbarRef, className: "".concat(prefixCls, "-scrollbar"), style: { width: 8, top: 0, bottom: 0, right: 0, position: 'absolute', display: visible ? null : 'none' }, onMouseDown: this.onContainerMouseDown, onMouseMove: this.delayHidden }, React.createElement("div", { ref: this.thumbRef, className: (0, _classnames.default)("".concat(prefixCls, "-scrollbar-thumb"), _defineProperty({}, "".concat(prefixCls, "-scrollbar-thumb-moving"), dragging)), style: { width: '100%', height: spinHeight, top: top, left: 0, position: 'absolute', background: 'rgba(0, 0, 0, 0.5)', borderRadius: 99, cursor: 'pointer', userSelect: 'none' }, onMouseDown: this.onMouseDown })); } }]); return ScrollBar; }(React.Component); exports.default = ScrollBar; },{"classnames":455,"rc-util/lib/raf":873,"react":"react"}],884:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useChildren; var React = _interopRequireWildcard(require("react")); var _Item = require("../Item"); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function useChildren(list, startIndex, endIndex, setNodeRef, renderFunc, _ref) { var getKey = _ref.getKey; return list.slice(startIndex, endIndex + 1).map(function (item, index) { var eleIndex = startIndex + index; var node = renderFunc(item, eleIndex, {// style: status === 'MEASURE_START' ? { visibility: 'hidden' } : {}, }); var key = getKey(item); return React.createElement(_Item.Item, { key: key, setRef: function setRef(ele) { return setNodeRef(item, ele); } }, node); }); } },{"../Item":881,"react":"react"}],885:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useDiffItem; var React = _interopRequireWildcard(require("react")); var _algorithmUtil = require("../utils/algorithmUtil"); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function useDiffItem(data, getKey, onDiff) { var _React$useState = React.useState(data), _React$useState2 = _slicedToArray(_React$useState, 2), prevData = _React$useState2[0], setPrevData = _React$useState2[1]; var _React$useState3 = React.useState(null), _React$useState4 = _slicedToArray(_React$useState3, 2), diffItem = _React$useState4[0], setDiffItem = _React$useState4[1]; React.useEffect(function () { var diff = (0, _algorithmUtil.findListDiffIndex)(prevData || [], data || [], getKey); if ((diff === null || diff === void 0 ? void 0 : diff.index) !== undefined) { onDiff === null || onDiff === void 0 ? void 0 : onDiff(diff.index); setDiffItem(data[diff.index]); } setPrevData(data); }, [data]); return [diffItem]; } },{"../utils/algorithmUtil":893,"react":"react"}],886:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useFrameWheel; var _react = require("react"); var _raf = _interopRequireDefault(require("rc-util/lib/raf")); var _isFirefox = _interopRequireDefault(require("../utils/isFirefox")); var _useOriginScroll = _interopRequireDefault(require("./useOriginScroll")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function useFrameWheel(inVirtual, isScrollAtTop, isScrollAtBottom, onWheelDelta) { var offsetRef = (0, _react.useRef)(0); var nextFrameRef = (0, _react.useRef)(null); // Firefox patch var wheelValueRef = (0, _react.useRef)(null); var isMouseScrollRef = (0, _react.useRef)(false); // Scroll status sync var originScroll = (0, _useOriginScroll.default)(isScrollAtTop, isScrollAtBottom); function onWheel(event) { if (!inVirtual) return; _raf.default.cancel(nextFrameRef.current); var deltaY = event.deltaY; offsetRef.current += deltaY; wheelValueRef.current = deltaY; // Do nothing when scroll at the edge, Skip check when is in scroll if (originScroll(deltaY)) return; // Proxy of scroll events if (!_isFirefox.default) { event.preventDefault(); } nextFrameRef.current = (0, _raf.default)(function () { // Patch a multiple for Firefox to fix wheel number too small // ref: https://github.com/ant-design/ant-design/issues/26372#issuecomment-679460266 var patchMultiple = isMouseScrollRef.current ? 10 : 1; onWheelDelta(offsetRef.current * patchMultiple); offsetRef.current = 0; }); } // A patch for firefox function onFireFoxScroll(event) { if (!inVirtual) return; isMouseScrollRef.current = event.detail === wheelValueRef.current; } return [onWheel, onFireFoxScroll]; } },{"../utils/isFirefox":894,"./useOriginScroll":889,"rc-util/lib/raf":873,"react":"react"}],887:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useHeights; var React = _interopRequireWildcard(require("react")); var _findDOMNode = _interopRequireDefault(require("rc-util/lib/Dom/findDOMNode")); var _CacheMap = _interopRequireDefault(require("../utils/CacheMap")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function useHeights(getKey, onItemAdd, onItemRemove) { var _React$useState = React.useState(0), _React$useState2 = _slicedToArray(_React$useState, 2), updatedMark = _React$useState2[0], setUpdatedMark = _React$useState2[1]; var instanceRef = (0, React.useRef)(new Map()); var heightsRef = (0, React.useRef)(new _CacheMap.default()); var heightUpdateIdRef = (0, React.useRef)(0); function collectHeight() { heightUpdateIdRef.current += 1; var currentId = heightUpdateIdRef.current; Promise.resolve().then(function () { // Only collect when it's latest call if (currentId !== heightUpdateIdRef.current) return; var changed = false; instanceRef.current.forEach(function (element, key) { if (element && element.offsetParent) { var htmlElement = (0, _findDOMNode.default)(element); var offsetHeight = htmlElement.offsetHeight; if (heightsRef.current.get(key) !== offsetHeight) { changed = true; heightsRef.current.set(key, htmlElement.offsetHeight); } } }); if (changed) { setUpdatedMark(function (c) { return c + 1; }); } }); } function setInstanceRef(item, instance) { var key = getKey(item); var origin = instanceRef.current.get(key); if (instance) { instanceRef.current.set(key, instance); collectHeight(); } else { instanceRef.current.delete(key); } // Instance changed if (!origin !== !instance) { if (instance) { onItemAdd === null || onItemAdd === void 0 ? void 0 : onItemAdd(item); } else { onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(item); } } } return [setInstanceRef, collectHeight, heightsRef.current, updatedMark]; } },{"../utils/CacheMap":892,"rc-util/lib/Dom/findDOMNode":863,"react":"react"}],888:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useMobileTouchMove; var React = _interopRequireWildcard(require("react")); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var SMOOTH_PTG = 14 / 15; function useMobileTouchMove(inVirtual, listRef, callback) { var touchedRef = (0, React.useRef)(false); var touchYRef = (0, React.useRef)(0); var elementRef = (0, React.useRef)(null); // Smooth scroll var intervalRef = (0, React.useRef)(null); var cleanUpEvents; var onTouchMove = function onTouchMove(e) { if (touchedRef.current) { var currentY = Math.ceil(e.touches[0].pageY); var offsetY = touchYRef.current - currentY; touchYRef.current = currentY; if (callback(offsetY)) { e.preventDefault(); } // Smooth interval clearInterval(intervalRef.current); intervalRef.current = setInterval(function () { offsetY *= SMOOTH_PTG; if (!callback(offsetY, true) || Math.abs(offsetY) <= 0.1) { clearInterval(intervalRef.current); } }, 16); } }; var onTouchEnd = function onTouchEnd() { touchedRef.current = false; cleanUpEvents(); }; var onTouchStart = function onTouchStart(e) { cleanUpEvents(); if (e.touches.length === 1 && !touchedRef.current) { touchedRef.current = true; touchYRef.current = Math.ceil(e.touches[0].pageY); elementRef.current = e.target; elementRef.current.addEventListener('touchmove', onTouchMove); elementRef.current.addEventListener('touchend', onTouchEnd); } }; cleanUpEvents = function cleanUpEvents() { if (elementRef.current) { elementRef.current.removeEventListener('touchmove', onTouchMove); elementRef.current.removeEventListener('touchend', onTouchEnd); } }; React.useEffect(function () { if (inVirtual) { listRef.current.addEventListener('touchstart', onTouchStart); } return function () { listRef.current.removeEventListener('touchstart', onTouchStart); cleanUpEvents(); clearInterval(intervalRef.current); }; }, [inVirtual]); } },{"react":"react"}],889:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); var _default = function _default(isScrollAtTop, isScrollAtBottom) { // Do lock for a wheel when scrolling var lockRef = (0, _react.useRef)(false); var lockTimeoutRef = (0, _react.useRef)(null); function lockScroll() { clearTimeout(lockTimeoutRef.current); lockRef.current = true; lockTimeoutRef.current = setTimeout(function () { lockRef.current = false; }, 50); } // Pass to ref since global add is in closure var scrollPingRef = (0, _react.useRef)({ top: isScrollAtTop, bottom: isScrollAtBottom }); scrollPingRef.current.top = isScrollAtTop; scrollPingRef.current.bottom = isScrollAtBottom; return function (deltaY) { var smoothOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var originScroll = // Pass origin wheel when on the top deltaY < 0 && scrollPingRef.current.top || // Pass origin wheel when on the bottom deltaY > 0 && scrollPingRef.current.bottom; if (smoothOffset && originScroll) { // No need lock anymore when it's smooth offset from touchMove interval clearTimeout(lockTimeoutRef.current); lockRef.current = false; } else if (!originScroll || lockRef.current) { lockScroll(); } return !lockRef.current && originScroll; }; }; exports.default = _default; },{"react":"react"}],890:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useScrollTo; var React = _interopRequireWildcard(require("react")); var _raf = _interopRequireDefault(require("rc-util/lib/raf")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function useScrollTo(containerRef, data, heights, itemHeight, getKey, collectHeight, syncScrollTop) { var scrollRef = React.useRef(); return function (arg) { _raf.default.cancel(scrollRef.current); if (typeof arg === 'number') { syncScrollTop(arg); } else if (arg && _typeof(arg) === 'object') { var index; var align = arg.align; if ('index' in arg) { index = arg.index; } else { index = data.findIndex(function (item) { return getKey(item) === arg.key; }); } var _arg$offset = arg.offset, offset = _arg$offset === void 0 ? 0 : _arg$offset; // We will retry 3 times in case dynamic height shaking var syncScroll = function syncScroll(times, targetAlign) { if (times < 0 || !containerRef.current) return; var height = containerRef.current.clientHeight; var needCollectHeight = false; var newTargetAlign = targetAlign; // Go to next frame if height not exist if (height) { var mergedAlign = targetAlign || align; // Get top & bottom var stackTop = 0; var itemTop = 0; var itemBottom = 0; for (var i = 0; i <= index; i += 1) { var key = getKey(data[i]); itemTop = stackTop; var cacheHeight = heights.get(key); itemBottom = itemTop + (cacheHeight === undefined ? itemHeight : cacheHeight); stackTop = itemBottom; if (i === index && cacheHeight === undefined) { needCollectHeight = true; } } // Scroll to var targetTop = null; switch (mergedAlign) { case 'top': targetTop = itemTop - offset; break; case 'bottom': targetTop = itemBottom - height + offset; break; default: { var scrollTop = containerRef.current.scrollTop; var scrollBottom = scrollTop + height; if (itemTop < scrollTop) { newTargetAlign = 'top'; } else if (itemBottom > scrollBottom) { newTargetAlign = 'bottom'; } } } if (targetTop !== null && targetTop !== containerRef.current.scrollTop) { syncScrollTop(targetTop); } } // We will retry since element may not sync height as it described scrollRef.current = (0, _raf.default)(function () { if (needCollectHeight) { collectHeight(); } syncScroll(times - 1, newTargetAlign); }); }; syncScroll(3); } }; } },{"rc-util/lib/raf":873,"react":"react"}],891:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _List = _interopRequireDefault(require("./List")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _default = _List.default; exports.default = _default; },{"./List":882}],892:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } // Firefox has low performance of map. var CacheMap = /*#__PURE__*/function () { function CacheMap() { _classCallCheck(this, CacheMap); this.maps = {}; this.maps.prototype = null; } _createClass(CacheMap, [{ key: "set", value: function set(key, value) { this.maps[key] = value; } }, { key: "get", value: function get(key) { return this.maps[key]; } }]); return CacheMap; }(); var _default = CacheMap; exports.default = _default; },{}],893:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getIndexByStartLoc = getIndexByStartLoc; exports.findListDiffIndex = findListDiffIndex; /** * Get index with specific start index one by one. e.g. * min: 3, max: 9, start: 6 * * Return index is: * [0]: 6 * [1]: 7 * [2]: 5 * [3]: 8 * [4]: 4 * [5]: 9 * [6]: 3 */ function getIndexByStartLoc(min, max, start, index) { var beforeCount = start - min; var afterCount = max - start; var balanceCount = Math.min(beforeCount, afterCount) * 2; // Balance if (index <= balanceCount) { var stepIndex = Math.floor(index / 2); if (index % 2) { return start + stepIndex + 1; } return start - stepIndex; } // One is out of range if (beforeCount > afterCount) { return start - (index - afterCount); } return start + (index - beforeCount); } /** * We assume that 2 list has only 1 item diff and others keeping the order. * So we can use dichotomy algorithm to find changed one. */ function findListDiffIndex(originList, targetList, getKey) { var originLen = originList.length; var targetLen = targetList.length; var shortList; var longList; if (originLen === 0 && targetLen === 0) { return null; } if (originLen < targetLen) { shortList = originList; longList = targetList; } else { shortList = targetList; longList = originList; } var notExistKey = { __EMPTY_ITEM__: true }; function getItemKey(item) { if (item !== undefined) { return getKey(item); } return notExistKey; } // Loop to find diff one var diffIndex = null; var multiple = Math.abs(originLen - targetLen) !== 1; for (var i = 0; i < longList.length; i += 1) { var shortKey = getItemKey(shortList[i]); var longKey = getItemKey(longList[i]); if (shortKey !== longKey) { diffIndex = i; multiple = multiple || shortKey !== getItemKey(longList[i + 1]); break; } } return diffIndex === null ? null : { index: diffIndex, multiple: multiple }; } },{}],894:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var isFF = (typeof navigator === "undefined" ? "undefined" : _typeof(navigator)) === 'object' && /Firefox/i.test(navigator.userAgent); var _default = isFF; exports.default = _default; },{}],895:[function(require,module,exports){ (function (process){ /** @license React v16.13.1 * react-is.development.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ 'use strict'; if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; // The Symbol used to tag the ReactElement-like types. If there is no native Symbol // nor polyfill, then a plain number is used for performance. var hasSymbol = typeof Symbol === 'function' && Symbol.for; var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary // (unstable) APIs that have been removed. Can we remove the symbols? var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; function isValidElementType(type) { return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); } function typeOf(object) { if (typeof object === 'object' && object !== null) { var $$typeof = object.$$typeof; switch ($$typeof) { case REACT_ELEMENT_TYPE: var type = object.type; switch (type) { case REACT_ASYNC_MODE_TYPE: case REACT_CONCURRENT_MODE_TYPE: case REACT_FRAGMENT_TYPE: case REACT_PROFILER_TYPE: case REACT_STRICT_MODE_TYPE: case REACT_SUSPENSE_TYPE: return type; default: var $$typeofType = type && type.$$typeof; switch ($$typeofType) { case REACT_CONTEXT_TYPE: case REACT_FORWARD_REF_TYPE: case REACT_LAZY_TYPE: case REACT_MEMO_TYPE: case REACT_PROVIDER_TYPE: return $$typeofType; default: return $$typeof; } } case REACT_PORTAL_TYPE: return $$typeof; } } return undefined; } // AsyncMode is deprecated along with isAsyncMode var AsyncMode = REACT_ASYNC_MODE_TYPE; var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; var ContextConsumer = REACT_CONTEXT_TYPE; var ContextProvider = REACT_PROVIDER_TYPE; var Element = REACT_ELEMENT_TYPE; var ForwardRef = REACT_FORWARD_REF_TYPE; var Fragment = REACT_FRAGMENT_TYPE; var Lazy = REACT_LAZY_TYPE; var Memo = REACT_MEMO_TYPE; var Portal = REACT_PORTAL_TYPE; var Profiler = REACT_PROFILER_TYPE; var StrictMode = REACT_STRICT_MODE_TYPE; var Suspense = REACT_SUSPENSE_TYPE; var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated function isAsyncMode(object) { { if (!hasWarnedAboutDeprecatedIsAsyncMode) { hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); } } return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; } function isConcurrentMode(object) { return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; } function isContextConsumer(object) { return typeOf(object) === REACT_CONTEXT_TYPE; } function isContextProvider(object) { return typeOf(object) === REACT_PROVIDER_TYPE; } function isElement(object) { return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; } function isForwardRef(object) { return typeOf(object) === REACT_FORWARD_REF_TYPE; } function isFragment(object) { return typeOf(object) === REACT_FRAGMENT_TYPE; } function isLazy(object) { return typeOf(object) === REACT_LAZY_TYPE; } function isMemo(object) { return typeOf(object) === REACT_MEMO_TYPE; } function isPortal(object) { return typeOf(object) === REACT_PORTAL_TYPE; } function isProfiler(object) { return typeOf(object) === REACT_PROFILER_TYPE; } function isStrictMode(object) { return typeOf(object) === REACT_STRICT_MODE_TYPE; } function isSuspense(object) { return typeOf(object) === REACT_SUSPENSE_TYPE; } exports.AsyncMode = AsyncMode; exports.ConcurrentMode = ConcurrentMode; exports.ContextConsumer = ContextConsumer; exports.ContextProvider = ContextProvider; exports.Element = Element; exports.ForwardRef = ForwardRef; exports.Fragment = Fragment; exports.Lazy = Lazy; exports.Memo = Memo; exports.Portal = Portal; exports.Profiler = Profiler; exports.StrictMode = StrictMode; exports.Suspense = Suspense; exports.isAsyncMode = isAsyncMode; exports.isConcurrentMode = isConcurrentMode; exports.isContextConsumer = isContextConsumer; exports.isContextProvider = isContextProvider; exports.isElement = isElement; exports.isForwardRef = isForwardRef; exports.isFragment = isFragment; exports.isLazy = isLazy; exports.isMemo = isMemo; exports.isPortal = isPortal; exports.isProfiler = isProfiler; exports.isStrictMode = isStrictMode; exports.isSuspense = isSuspense; exports.isValidElementType = isValidElementType; exports.typeOf = typeOf; })(); } }).call(this,require('_process')) },{"_process":1}],896:[function(require,module,exports){ /** @license React v16.13.1 * react-is.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ 'use strict';var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b? Symbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119; function z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d; exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t}; exports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p}; exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z; },{}],897:[function(require,module,exports){ (function (process){ 'use strict'; if (process.env.NODE_ENV === 'production') { module.exports = require('./cjs/react-is.production.min.js'); } else { module.exports = require('./cjs/react-is.development.js'); } }).call(this,require('_process')) },{"./cjs/react-is.development.js":895,"./cjs/react-is.production.min.js":896,"_process":1}],898:[function(require,module,exports){ /** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ var runtime = (function (exports) { "use strict"; var Op = Object.prototype; var hasOwn = Op.hasOwnProperty; var undefined; // More compressible than void 0. var $Symbol = typeof Symbol === "function" ? Symbol : {}; var iteratorSymbol = $Symbol.iterator || "@@iterator"; var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); return obj[key]; } try { // IE 8 has a broken Object.defineProperty that only works on DOM objects. define({}, ""); } catch (err) { define = function(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; var generator = Object.create(protoGenerator.prototype); var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next, // .throw, and .return methods. generator._invoke = makeInvokeMethod(innerFn, self, context); return generator; } exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion // record like context.tryEntries[i].completion. This interface could // have been (and was previously) designed to take a closure to be // invoked without arguments, but in all the cases we care about we // already have an existing method we want to call, so there's no need // to create a new function object. We can even get away with assuming // the method takes exactly one argument, since that happens to be true // in every case, so we don't have to touch the arguments object. The // only additional allocation required is the completion record, which // has a stable shape and so hopefully should be cheap to allocate. function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } var GenStateSuspendedStart = "suspendedStart"; var GenStateSuspendedYield = "suspendedYield"; var GenStateExecuting = "executing"; var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as // breaking out of the dispatch switch statement. var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and // .constructor.prototype properties for functions that return Generator // objects. For full spec compliance, you may wish to configure your // minifier not to mangle the names of these two functions. function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that // don't natively support it. var IteratorPrototype = {}; IteratorPrototype[iteratorSymbol] = function () { return this; }; var getProto = Object.getPrototypeOf; var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { // This environment has a native %IteratorPrototype%; use it instead // of the polyfill. IteratorPrototype = NativeIteratorPrototype; } var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; GeneratorFunctionPrototype.constructor = GeneratorFunction; GeneratorFunction.displayName = define( GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction" ); // Helper for defining the .next, .throw, and .return methods of the // Iterator interface in terms of a single ._invoke method. function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function(method) { define(prototype, method, function(arg) { return this._invoke(method, arg); }); }); } exports.isGeneratorFunction = function(genFun) { var ctor = typeof genFun === "function" && genFun.constructor; return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can // do is to check its .name property. (ctor.displayName || ctor.name) === "GeneratorFunction" : false; }; exports.mark = function(genFun) { if (Object.setPrototypeOf) { Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); } else { genFun.__proto__ = GeneratorFunctionPrototype; define(genFun, toStringTagSymbol, "GeneratorFunction"); } genFun.prototype = Object.create(Gp); return genFun; }; // Within the body of any async function, `await x` is transformed to // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test // `hasOwn.call(value, "__await")` to determine if the yielded value is // meant to be awaited. exports.awrap = function(arg) { return { __await: arg }; }; function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (record.type === "throw") { reject(record.arg); } else { var result = record.arg; var value = result.value; if (value && typeof value === "object" && hasOwn.call(value, "__await")) { return PromiseImpl.resolve(value.__await).then(function(value) { invoke("next", value, resolve, reject); }, function(err) { invoke("throw", err, resolve, reject); }); } return PromiseImpl.resolve(value).then(function(unwrapped) { // When a yielded Promise is resolved, its final value becomes // the .value of the Promise<{value,done}> result for the // current iteration. result.value = unwrapped; resolve(result); }, function(error) { // If a rejected Promise was yielded, throw the rejection back // into the async generator function so it can be handled there. return invoke("throw", error, resolve, reject); }); } } var previousPromise; function enqueue(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function(resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = // If enqueue has been called before, then we want to wait until // all previous Promises have been resolved before calling invoke, // so that results are always delivered in the correct order. If // enqueue has not been called before, then it is important to // call invoke immediately, without waiting on a callback to fire, // so that the async generator function has the opportunity to do // any necessary setup in a predictable way. This predictability // is why the Promise constructor synchronously invokes its // executor callback, and why async functions synchronously // execute code before the first await. Since we implement simple // async functions in terms of async generators, it is especially // important to get this right, even though it requires care. previousPromise ? previousPromise.then( callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later // invocations of the iterator. callInvokeWithMethodAndArg ) : callInvokeWithMethodAndArg(); } // Define the unified helper method that is used to implement .next, // .throw, and .return (see defineIteratorMethods). this._invoke = enqueue; } defineIteratorMethods(AsyncIterator.prototype); AsyncIterator.prototype[asyncIteratorSymbol] = function () { return this; }; exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of // AsyncIterator objects; they just return a Promise for the value of // the final result produced by the iterator. exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) { if (PromiseImpl === void 0) PromiseImpl = Promise; var iter = new AsyncIterator( wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl ); return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator. : iter.next().then(function(result) { return result.done ? result.value : iter.next(); }); }; function makeInvokeMethod(innerFn, self, context) { var state = GenStateSuspendedStart; return function invoke(method, arg) { if (state === GenStateExecuting) { throw new Error("Generator is already running"); } if (state === GenStateCompleted) { if (method === "throw") { throw arg; } // Be forgiving, per 25.3.3.3.3 of the spec: // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume return doneResult(); } context.method = method; context.arg = arg; while (true) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (context.method === "next") { // Setting context._sent for legacy support of Babel's // function.sent implementation. context.sent = context._sent = context.arg; } else if (context.method === "throw") { if (state === GenStateSuspendedStart) { state = GenStateCompleted; throw context.arg; } context.dispatchException(context.arg); } else if (context.method === "return") { context.abrupt("return", context.arg); } state = GenStateExecuting; var record = tryCatch(innerFn, self, context); if (record.type === "normal") { // If an exception is thrown from innerFn, we leave state === // GenStateExecuting and loop back for another invocation. state = context.done ? GenStateCompleted : GenStateSuspendedYield; if (record.arg === ContinueSentinel) { continue; } return { value: record.arg, done: context.done }; } else if (record.type === "throw") { state = GenStateCompleted; // Dispatch the exception by looping back around to the // context.dispatchException(context.arg) call above. context.method = "throw"; context.arg = record.arg; } } }; } // Call delegate.iterator[context.method](context.arg) and handle the // result, either by returning a { value, done } result from the // delegate iterator, or by modifying context.method and context.arg, // setting context.delegate to null, and returning the ContinueSentinel. function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (method === undefined) { // A .throw or .return when the delegate iterator has no .throw // method always terminates the yield* loop. context.delegate = null; if (context.method === "throw") { // Note: ["return"] must be used for ES3 parsing compatibility. if (delegate.iterator["return"]) { // If the delegate iterator has a return method, give it a // chance to clean up. context.method = "return"; context.arg = undefined; maybeInvokeDelegate(delegate, context); if (context.method === "throw") { // If maybeInvokeDelegate(context) changed context.method from // "return" to "throw", let that override the TypeError below. return ContinueSentinel; } } context.method = "throw"; context.arg = new TypeError( "The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if (record.type === "throw") { context.method = "throw"; context.arg = record.arg; context.delegate = null; return ContinueSentinel; } var info = record.arg; if (! info) { context.method = "throw"; context.arg = new TypeError("iterator result is not an object"); context.delegate = null; return ContinueSentinel; } if (info.done) { // Assign the result of the finished delegate to the temporary // variable specified by delegate.resultName (see delegateYield). context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield). context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the // exception, let the outer generator proceed normally. If // context.method was "next", forget context.arg since it has been // "consumed" by the delegate iterator. If context.method was // "return", allow the original .return call to continue in the // outer generator. if (context.method !== "return") { context.method = "next"; context.arg = undefined; } } else { // Re-yield the result returned by the delegate method. return info; } // The delegate iterator is finished, so forget it and continue with // the outer generator. context.delegate = null; return ContinueSentinel; } // Define Generator.prototype.{next,throw,return} in terms of the // unified ._invoke helper method. defineIteratorMethods(Gp); define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the // @@iterator function is called on it. Some browsers' implementations of the // iterator prototype chain incorrectly implement this, causing the Generator // object to not be returned from this call. This ensures that doesn't happen. // See https://github.com/facebook/regenerator/issues/274 for more details. Gp[iteratorSymbol] = function() { return this; }; Gp.toString = function() { return "[object Generator]"; }; function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; if (1 in locs) { entry.catchLoc = locs[1]; } if (2 in locs) { entry.finallyLoc = locs[2]; entry.afterLoc = locs[3]; } this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal"; delete record.arg; entry.completion = record; } function Context(tryLocsList) { // The root entry object (effectively a try statement without a catch // or a finally block) gives us a place to store values thrown from // locations where there is no enclosing try statement. this.tryEntries = [{ tryLoc: "root" }]; tryLocsList.forEach(pushTryEntry, this); this.reset(true); } exports.keys = function(object) { var keys = []; for (var key in object) { keys.push(key); } keys.reverse(); // Rather than returning an object with a next method, we keep // things simple and return the next function itself. return function next() { while (keys.length) { var key = keys.pop(); if (key in object) { next.value = key; next.done = false; return next; } } // To avoid creating an additional object, we just hang the .value // and .done properties off the next function object itself. This // also ensures that the minifier will not anonymize the function. next.done = true; return next; }; }; function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) { return iteratorMethod.call(iterable); } if (typeof iterable.next === "function") { return iterable; } if (!isNaN(iterable.length)) { var i = -1, next = function next() { while (++i < iterable.length) { if (hasOwn.call(iterable, i)) { next.value = iterable[i]; next.done = false; return next; } } next.value = undefined; next.done = true; return next; }; return next.next = next; } } // Return an iterator with no values. return { next: doneResult }; } exports.values = values; function doneResult() { return { value: undefined, done: true }; } Context.prototype = { constructor: Context, reset: function(skipTempReset) { this.prev = 0; this.next = 0; // Resetting context._sent for legacy support of Babel's // function.sent implementation. this.sent = this._sent = undefined; this.done = false; this.delegate = null; this.method = "next"; this.arg = undefined; this.tryEntries.forEach(resetTryEntry); if (!skipTempReset) { for (var name in this) { // Not sure about the optimal order of these conditions: if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { this[name] = undefined; } } } }, stop: function() { this.done = true; var rootEntry = this.tryEntries[0]; var rootRecord = rootEntry.completion; if (rootRecord.type === "throw") { throw rootRecord.arg; } return this.rval; }, dispatchException: function(exception) { if (this.done) { throw exception; } var context = this; function handle(loc, caught) { record.type = "throw"; record.arg = exception; context.next = loc; if (caught) { // If the dispatched exception was caught by a catch block, // then let that catch block handle the exception normally. context.method = "next"; context.arg = undefined; } return !! caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; var record = entry.completion; if (entry.tryLoc === "root") { // Exception thrown outside of any try block that could handle // it, so set the completion value of the entire function to // throw the exception. return handle("end"); } if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"); var hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } else if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else if (hasCatch) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } } else if (hasFinally) { if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else { throw new Error("try statement without catch or finally"); } } } }, abrupt: function(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { // Ignore the finally entry if control is not jumping to a // location outside the try/catch block. finallyEntry = null; } var record = finallyEntry ? finallyEntry.completion : {}; record.type = type; record.arg = arg; if (finallyEntry) { this.method = "next"; this.next = finallyEntry.finallyLoc; return ContinueSentinel; } return this.complete(record); }, complete: function(record, afterLoc) { if (record.type === "throw") { throw record.arg; } if (record.type === "break" || record.type === "continue") { this.next = record.arg; } else if (record.type === "return") { this.rval = this.arg = record.arg; this.method = "return"; this.next = "end"; } else if (record.type === "normal" && afterLoc) { this.next = afterLoc; } return ContinueSentinel; }, finish: function(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) { this.complete(entry.completion, entry.afterLoc); resetTryEntry(entry); return ContinueSentinel; } } }, "catch": function(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (record.type === "throw") { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } // The context.catch method must only be called with a location // argument that corresponds to a known catch block. throw new Error("illegal catch attempt"); }, delegateYield: function(iterable, resultName, nextLoc) { this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }; if (this.method === "next") { // Deliberately forget the last sent value so that we don't // accidentally pass it on to the delegate. this.arg = undefined; } return ContinueSentinel; } }; // Regardless of whether this script is executing as a CommonJS module // or not, return the runtime object so that we can declare the variable // regeneratorRuntime in the outer scope, which allows this module to be // injected easily by `bin/regenerator --include-runtime script.js`. return exports; }( // If this script is executing as a CommonJS module, use module.exports // as the regeneratorRuntime namespace. Otherwise create a new empty // object. Either way, the resulting object will be used to initialize // the regeneratorRuntime variable at the top of this file. typeof module === "object" ? module.exports : {} )); try { regeneratorRuntime = runtime; } catch (accidentalStrictMode) { // This module should not be running in strict mode, so the above // assignment should always work unless something is misconfigured. Just // in case runtime.js accidentally runs in strict mode, we can escape // strict mode using a global Function call. This could conceivably fail // if a Content Security Policy forbids using Function, but in that case // the proper solution is to fix the accidental strict mode problem. If // you've misconfigured your bundler to force strict mode and applied a // CSP to forbid Function, and you're not willing to fix either of those // problems, please detail your unique predicament in a GitHub issue. Function("r", "regeneratorRuntime = r")(runtime); } },{}],899:[function(require,module,exports){ (function (global){ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.ResizeObserver = factory()); }(this, (function () { 'use strict'; /** * A collection of shims that provide minimal functionality of the ES6 collections. * * These implementations are not meant to be used outside of the ResizeObserver * modules as they cover only a limited range of use cases. */ /* eslint-disable require-jsdoc, valid-jsdoc */ var MapShim = (function () { if (typeof Map !== 'undefined') { return Map; } /** * Returns index in provided array that matches the specified key. * * @param {Array} arr * @param {*} key * @returns {number} */ function getIndex(arr, key) { var result = -1; arr.some(function (entry, index) { if (entry[0] === key) { result = index; return true; } return false; }); return result; } return /** @class */ (function () { function class_1() { this.__entries__ = []; } Object.defineProperty(class_1.prototype, "size", { /** * @returns {boolean} */ get: function () { return this.__entries__.length; }, enumerable: true, configurable: true }); /** * @param {*} key * @returns {*} */ class_1.prototype.get = function (key) { var index = getIndex(this.__entries__, key); var entry = this.__entries__[index]; return entry && entry[1]; }; /** * @param {*} key * @param {*} value * @returns {void} */ class_1.prototype.set = function (key, value) { var index = getIndex(this.__entries__, key); if (~index) { this.__entries__[index][1] = value; } else { this.__entries__.push([key, value]); } }; /** * @param {*} key * @returns {void} */ class_1.prototype.delete = function (key) { var entries = this.__entries__; var index = getIndex(entries, key); if (~index) { entries.splice(index, 1); } }; /** * @param {*} key * @returns {void} */ class_1.prototype.has = function (key) { return !!~getIndex(this.__entries__, key); }; /** * @returns {void} */ class_1.prototype.clear = function () { this.__entries__.splice(0); }; /** * @param {Function} callback * @param {*} [ctx=null] * @returns {void} */ class_1.prototype.forEach = function (callback, ctx) { if (ctx === void 0) { ctx = null; } for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) { var entry = _a[_i]; callback.call(ctx, entry[1], entry[0]); } }; return class_1; }()); })(); /** * Detects whether window and document objects are available in current environment. */ var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document; // Returns global object of a current environment. var global$1 = (function () { if (typeof global !== 'undefined' && global.Math === Math) { return global; } if (typeof self !== 'undefined' && self.Math === Math) { return self; } if (typeof window !== 'undefined' && window.Math === Math) { return window; } // eslint-disable-next-line no-new-func return Function('return this')(); })(); /** * A shim for the requestAnimationFrame which falls back to the setTimeout if * first one is not supported. * * @returns {number} Requests' identifier. */ var requestAnimationFrame$1 = (function () { if (typeof requestAnimationFrame === 'function') { // It's required to use a bounded function because IE sometimes throws // an "Invalid calling object" error if rAF is invoked without the global // object on the left hand side. return requestAnimationFrame.bind(global$1); } return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); }; })(); // Defines minimum timeout before adding a trailing call. var trailingTimeout = 2; /** * Creates a wrapper function which ensures that provided callback will be * invoked only once during the specified delay period. * * @param {Function} callback - Function to be invoked after the delay period. * @param {number} delay - Delay after which to invoke callback. * @returns {Function} */ function throttle (callback, delay) { var leadingCall = false, trailingCall = false, lastCallTime = 0; /** * Invokes the original callback function and schedules new invocation if * the "proxy" was called during current request. * * @returns {void} */ function resolvePending() { if (leadingCall) { leadingCall = false; callback(); } if (trailingCall) { proxy(); } } /** * Callback invoked after the specified delay. It will further postpone * invocation of the original function delegating it to the * requestAnimationFrame. * * @returns {void} */ function timeoutCallback() { requestAnimationFrame$1(resolvePending); } /** * Schedules invocation of the original function. * * @returns {void} */ function proxy() { var timeStamp = Date.now(); if (leadingCall) { // Reject immediately following calls. if (timeStamp - lastCallTime < trailingTimeout) { return; } // Schedule new call to be in invoked when the pending one is resolved. // This is important for "transitions" which never actually start // immediately so there is a chance that we might miss one if change // happens amids the pending invocation. trailingCall = true; } else { leadingCall = true; trailingCall = false; setTimeout(timeoutCallback, delay); } lastCallTime = timeStamp; } return proxy; } // Minimum delay before invoking the update of observers. var REFRESH_DELAY = 20; // A list of substrings of CSS properties used to find transition events that // might affect dimensions of observed elements. var transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight']; // Check if MutationObserver is available. var mutationObserverSupported = typeof MutationObserver !== 'undefined'; /** * Singleton controller class which handles updates of ResizeObserver instances. */ var ResizeObserverController = /** @class */ (function () { /** * Creates a new instance of ResizeObserverController. * * @private */ function ResizeObserverController() { /** * Indicates whether DOM listeners have been added. * * @private {boolean} */ this.connected_ = false; /** * Tells that controller has subscribed for Mutation Events. * * @private {boolean} */ this.mutationEventsAdded_ = false; /** * Keeps reference to the instance of MutationObserver. * * @private {MutationObserver} */ this.mutationsObserver_ = null; /** * A list of connected observers. * * @private {Array} */ this.observers_ = []; this.onTransitionEnd_ = this.onTransitionEnd_.bind(this); this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY); } /** * Adds observer to observers list. * * @param {ResizeObserverSPI} observer - Observer to be added. * @returns {void} */ ResizeObserverController.prototype.addObserver = function (observer) { if (!~this.observers_.indexOf(observer)) { this.observers_.push(observer); } // Add listeners if they haven't been added yet. if (!this.connected_) { this.connect_(); } }; /** * Removes observer from observers list. * * @param {ResizeObserverSPI} observer - Observer to be removed. * @returns {void} */ ResizeObserverController.prototype.removeObserver = function (observer) { var observers = this.observers_; var index = observers.indexOf(observer); // Remove observer if it's present in registry. if (~index) { observers.splice(index, 1); } // Remove listeners if controller has no connected observers. if (!observers.length && this.connected_) { this.disconnect_(); } }; /** * Invokes the update of observers. It will continue running updates insofar * it detects changes. * * @returns {void} */ ResizeObserverController.prototype.refresh = function () { var changesDetected = this.updateObservers_(); // Continue running updates if changes have been detected as there might // be future ones caused by CSS transitions. if (changesDetected) { this.refresh(); } }; /** * Updates every observer from observers list and notifies them of queued * entries. * * @private * @returns {boolean} Returns "true" if any observer has detected changes in * dimensions of it's elements. */ ResizeObserverController.prototype.updateObservers_ = function () { // Collect observers that have active observations. var activeObservers = this.observers_.filter(function (observer) { return observer.gatherActive(), observer.hasActive(); }); // Deliver notifications in a separate cycle in order to avoid any // collisions between observers, e.g. when multiple instances of // ResizeObserver are tracking the same element and the callback of one // of them changes content dimensions of the observed target. Sometimes // this may result in notifications being blocked for the rest of observers. activeObservers.forEach(function (observer) { return observer.broadcastActive(); }); return activeObservers.length > 0; }; /** * Initializes DOM listeners. * * @private * @returns {void} */ ResizeObserverController.prototype.connect_ = function () { // Do nothing if running in a non-browser environment or if listeners // have been already added. if (!isBrowser || this.connected_) { return; } // Subscription to the "Transitionend" event is used as a workaround for // delayed transitions. This way it's possible to capture at least the // final state of an element. document.addEventListener('transitionend', this.onTransitionEnd_); window.addEventListener('resize', this.refresh); if (mutationObserverSupported) { this.mutationsObserver_ = new MutationObserver(this.refresh); this.mutationsObserver_.observe(document, { attributes: true, childList: true, characterData: true, subtree: true }); } else { document.addEventListener('DOMSubtreeModified', this.refresh); this.mutationEventsAdded_ = true; } this.connected_ = true; }; /** * Removes DOM listeners. * * @private * @returns {void} */ ResizeObserverController.prototype.disconnect_ = function () { // Do nothing if running in a non-browser environment or if listeners // have been already removed. if (!isBrowser || !this.connected_) { return; } document.removeEventListener('transitionend', this.onTransitionEnd_); window.removeEventListener('resize', this.refresh); if (this.mutationsObserver_) { this.mutationsObserver_.disconnect(); } if (this.mutationEventsAdded_) { document.removeEventListener('DOMSubtreeModified', this.refresh); } this.mutationsObserver_ = null; this.mutationEventsAdded_ = false; this.connected_ = false; }; /** * "Transitionend" event handler. * * @private * @param {TransitionEvent} event * @returns {void} */ ResizeObserverController.prototype.onTransitionEnd_ = function (_a) { var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b; // Detect whether transition may affect dimensions of an element. var isReflowProperty = transitionKeys.some(function (key) { return !!~propertyName.indexOf(key); }); if (isReflowProperty) { this.refresh(); } }; /** * Returns instance of the ResizeObserverController. * * @returns {ResizeObserverController} */ ResizeObserverController.getInstance = function () { if (!this.instance_) { this.instance_ = new ResizeObserverController(); } return this.instance_; }; /** * Holds reference to the controller's instance. * * @private {ResizeObserverController} */ ResizeObserverController.instance_ = null; return ResizeObserverController; }()); /** * Defines non-writable/enumerable properties of the provided target object. * * @param {Object} target - Object for which to define properties. * @param {Object} props - Properties to be defined. * @returns {Object} Target object. */ var defineConfigurable = (function (target, props) { for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) { var key = _a[_i]; Object.defineProperty(target, key, { value: props[key], enumerable: false, writable: false, configurable: true }); } return target; }); /** * Returns the global object associated with provided element. * * @param {Object} target * @returns {Object} */ var getWindowOf = (function (target) { // Assume that the element is an instance of Node, which means that it // has the "ownerDocument" property from which we can retrieve a // corresponding global object. var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView; // Return the local global object if it's not possible extract one from // provided element. return ownerGlobal || global$1; }); // Placeholder of an empty content rectangle. var emptyRect = createRectInit(0, 0, 0, 0); /** * Converts provided string to a number. * * @param {number|string} value * @returns {number} */ function toFloat(value) { return parseFloat(value) || 0; } /** * Extracts borders size from provided styles. * * @param {CSSStyleDeclaration} styles * @param {...string} positions - Borders positions (top, right, ...) * @returns {number} */ function getBordersSize(styles) { var positions = []; for (var _i = 1; _i < arguments.length; _i++) { positions[_i - 1] = arguments[_i]; } return positions.reduce(function (size, position) { var value = styles['border-' + position + '-width']; return size + toFloat(value); }, 0); } /** * Extracts paddings sizes from provided styles. * * @param {CSSStyleDeclaration} styles * @returns {Object} Paddings box. */ function getPaddings(styles) { var positions = ['top', 'right', 'bottom', 'left']; var paddings = {}; for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) { var position = positions_1[_i]; var value = styles['padding-' + position]; paddings[position] = toFloat(value); } return paddings; } /** * Calculates content rectangle of provided SVG element. * * @param {SVGGraphicsElement} target - Element content rectangle of which needs * to be calculated. * @returns {DOMRectInit} */ function getSVGContentRect(target) { var bbox = target.getBBox(); return createRectInit(0, 0, bbox.width, bbox.height); } /** * Calculates content rectangle of provided HTMLElement. * * @param {HTMLElement} target - Element for which to calculate the content rectangle. * @returns {DOMRectInit} */ function getHTMLElementContentRect(target) { // Client width & height properties can't be // used exclusively as they provide rounded values. var clientWidth = target.clientWidth, clientHeight = target.clientHeight; // By this condition we can catch all non-replaced inline, hidden and // detached elements. Though elements with width & height properties less // than 0.5 will be discarded as well. // // Without it we would need to implement separate methods for each of // those cases and it's not possible to perform a precise and performance // effective test for hidden elements. E.g. even jQuery's ':visible' filter // gives wrong results for elements with width & height less than 0.5. if (!clientWidth && !clientHeight) { return emptyRect; } var styles = getWindowOf(target).getComputedStyle(target); var paddings = getPaddings(styles); var horizPad = paddings.left + paddings.right; var vertPad = paddings.top + paddings.bottom; // Computed styles of width & height are being used because they are the // only dimensions available to JS that contain non-rounded values. It could // be possible to utilize the getBoundingClientRect if only it's data wasn't // affected by CSS transformations let alone paddings, borders and scroll bars. var width = toFloat(styles.width), height = toFloat(styles.height); // Width & height include paddings and borders when the 'border-box' box // model is applied (except for IE). if (styles.boxSizing === 'border-box') { // Following conditions are required to handle Internet Explorer which // doesn't include paddings and borders to computed CSS dimensions. // // We can say that if CSS dimensions + paddings are equal to the "client" // properties then it's either IE, and thus we don't need to subtract // anything, or an element merely doesn't have paddings/borders styles. if (Math.round(width + horizPad) !== clientWidth) { width -= getBordersSize(styles, 'left', 'right') + horizPad; } if (Math.round(height + vertPad) !== clientHeight) { height -= getBordersSize(styles, 'top', 'bottom') + vertPad; } } // Following steps can't be applied to the document's root element as its // client[Width/Height] properties represent viewport area of the window. // Besides, it's as well not necessary as the itself neither has // rendered scroll bars nor it can be clipped. if (!isDocumentElement(target)) { // In some browsers (only in Firefox, actually) CSS width & height // include scroll bars size which can be removed at this step as scroll // bars are the only difference between rounded dimensions + paddings // and "client" properties, though that is not always true in Chrome. var vertScrollbar = Math.round(width + horizPad) - clientWidth; var horizScrollbar = Math.round(height + vertPad) - clientHeight; // Chrome has a rather weird rounding of "client" properties. // E.g. for an element with content width of 314.2px it sometimes gives // the client width of 315px and for the width of 314.7px it may give // 314px. And it doesn't happen all the time. So just ignore this delta // as a non-relevant. if (Math.abs(vertScrollbar) !== 1) { width -= vertScrollbar; } if (Math.abs(horizScrollbar) !== 1) { height -= horizScrollbar; } } return createRectInit(paddings.left, paddings.top, width, height); } /** * Checks whether provided element is an instance of the SVGGraphicsElement. * * @param {Element} target - Element to be checked. * @returns {boolean} */ var isSVGGraphicsElement = (function () { // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement // interface. if (typeof SVGGraphicsElement !== 'undefined') { return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; }; } // If it's so, then check that element is at least an instance of the // SVGElement and that it has the "getBBox" method. // eslint-disable-next-line no-extra-parens return function (target) { return (target instanceof getWindowOf(target).SVGElement && typeof target.getBBox === 'function'); }; })(); /** * Checks whether provided element is a document element (). * * @param {Element} target - Element to be checked. * @returns {boolean} */ function isDocumentElement(target) { return target === getWindowOf(target).document.documentElement; } /** * Calculates an appropriate content rectangle for provided html or svg element. * * @param {Element} target - Element content rectangle of which needs to be calculated. * @returns {DOMRectInit} */ function getContentRect(target) { if (!isBrowser) { return emptyRect; } if (isSVGGraphicsElement(target)) { return getSVGContentRect(target); } return getHTMLElementContentRect(target); } /** * Creates rectangle with an interface of the DOMRectReadOnly. * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly * * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions. * @returns {DOMRectReadOnly} */ function createReadOnlyRect(_a) { var x = _a.x, y = _a.y, width = _a.width, height = _a.height; // If DOMRectReadOnly is available use it as a prototype for the rectangle. var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object; var rect = Object.create(Constr.prototype); // Rectangle's properties are not writable and non-enumerable. defineConfigurable(rect, { x: x, y: y, width: width, height: height, top: y, right: x + width, bottom: height + y, left: x }); return rect; } /** * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates. * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit * * @param {number} x - X coordinate. * @param {number} y - Y coordinate. * @param {number} width - Rectangle's width. * @param {number} height - Rectangle's height. * @returns {DOMRectInit} */ function createRectInit(x, y, width, height) { return { x: x, y: y, width: width, height: height }; } /** * Class that is responsible for computations of the content rectangle of * provided DOM element and for keeping track of it's changes. */ var ResizeObservation = /** @class */ (function () { /** * Creates an instance of ResizeObservation. * * @param {Element} target - Element to be observed. */ function ResizeObservation(target) { /** * Broadcasted width of content rectangle. * * @type {number} */ this.broadcastWidth = 0; /** * Broadcasted height of content rectangle. * * @type {number} */ this.broadcastHeight = 0; /** * Reference to the last observed content rectangle. * * @private {DOMRectInit} */ this.contentRect_ = createRectInit(0, 0, 0, 0); this.target = target; } /** * Updates content rectangle and tells whether it's width or height properties * have changed since the last broadcast. * * @returns {boolean} */ ResizeObservation.prototype.isActive = function () { var rect = getContentRect(this.target); this.contentRect_ = rect; return (rect.width !== this.broadcastWidth || rect.height !== this.broadcastHeight); }; /** * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data * from the corresponding properties of the last observed content rectangle. * * @returns {DOMRectInit} Last observed content rectangle. */ ResizeObservation.prototype.broadcastRect = function () { var rect = this.contentRect_; this.broadcastWidth = rect.width; this.broadcastHeight = rect.height; return rect; }; return ResizeObservation; }()); var ResizeObserverEntry = /** @class */ (function () { /** * Creates an instance of ResizeObserverEntry. * * @param {Element} target - Element that is being observed. * @param {DOMRectInit} rectInit - Data of the element's content rectangle. */ function ResizeObserverEntry(target, rectInit) { var contentRect = createReadOnlyRect(rectInit); // According to the specification following properties are not writable // and are also not enumerable in the native implementation. // // Property accessors are not being used as they'd require to define a // private WeakMap storage which may cause memory leaks in browsers that // don't support this type of collections. defineConfigurable(this, { target: target, contentRect: contentRect }); } return ResizeObserverEntry; }()); var ResizeObserverSPI = /** @class */ (function () { /** * Creates a new instance of ResizeObserver. * * @param {ResizeObserverCallback} callback - Callback function that is invoked * when one of the observed elements changes it's content dimensions. * @param {ResizeObserverController} controller - Controller instance which * is responsible for the updates of observer. * @param {ResizeObserver} callbackCtx - Reference to the public * ResizeObserver instance which will be passed to callback function. */ function ResizeObserverSPI(callback, controller, callbackCtx) { /** * Collection of resize observations that have detected changes in dimensions * of elements. * * @private {Array} */ this.activeObservations_ = []; /** * Registry of the ResizeObservation instances. * * @private {Map} */ this.observations_ = new MapShim(); if (typeof callback !== 'function') { throw new TypeError('The callback provided as parameter 1 is not a function.'); } this.callback_ = callback; this.controller_ = controller; this.callbackCtx_ = callbackCtx; } /** * Starts observing provided element. * * @param {Element} target - Element to be observed. * @returns {void} */ ResizeObserverSPI.prototype.observe = function (target) { if (!arguments.length) { throw new TypeError('1 argument required, but only 0 present.'); } // Do nothing if current environment doesn't have the Element interface. if (typeof Element === 'undefined' || !(Element instanceof Object)) { return; } if (!(target instanceof getWindowOf(target).Element)) { throw new TypeError('parameter 1 is not of type "Element".'); } var observations = this.observations_; // Do nothing if element is already being observed. if (observations.has(target)) { return; } observations.set(target, new ResizeObservation(target)); this.controller_.addObserver(this); // Force the update of observations. this.controller_.refresh(); }; /** * Stops observing provided element. * * @param {Element} target - Element to stop observing. * @returns {void} */ ResizeObserverSPI.prototype.unobserve = function (target) { if (!arguments.length) { throw new TypeError('1 argument required, but only 0 present.'); } // Do nothing if current environment doesn't have the Element interface. if (typeof Element === 'undefined' || !(Element instanceof Object)) { return; } if (!(target instanceof getWindowOf(target).Element)) { throw new TypeError('parameter 1 is not of type "Element".'); } var observations = this.observations_; // Do nothing if element is not being observed. if (!observations.has(target)) { return; } observations.delete(target); if (!observations.size) { this.controller_.removeObserver(this); } }; /** * Stops observing all elements. * * @returns {void} */ ResizeObserverSPI.prototype.disconnect = function () { this.clearActive(); this.observations_.clear(); this.controller_.removeObserver(this); }; /** * Collects observation instances the associated element of which has changed * it's content rectangle. * * @returns {void} */ ResizeObserverSPI.prototype.gatherActive = function () { var _this = this; this.clearActive(); this.observations_.forEach(function (observation) { if (observation.isActive()) { _this.activeObservations_.push(observation); } }); }; /** * Invokes initial callback function with a list of ResizeObserverEntry * instances collected from active resize observations. * * @returns {void} */ ResizeObserverSPI.prototype.broadcastActive = function () { // Do nothing if observer doesn't have active observations. if (!this.hasActive()) { return; } var ctx = this.callbackCtx_; // Create ResizeObserverEntry instance for every active observation. var entries = this.activeObservations_.map(function (observation) { return new ResizeObserverEntry(observation.target, observation.broadcastRect()); }); this.callback_.call(ctx, entries, ctx); this.clearActive(); }; /** * Clears the collection of active observations. * * @returns {void} */ ResizeObserverSPI.prototype.clearActive = function () { this.activeObservations_.splice(0); }; /** * Tells whether observer has active observations. * * @returns {boolean} */ ResizeObserverSPI.prototype.hasActive = function () { return this.activeObservations_.length > 0; }; return ResizeObserverSPI; }()); // Registry of internal observers. If WeakMap is not available use current shim // for the Map collection as it has all required methods and because WeakMap // can't be fully polyfilled anyway. var observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim(); /** * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation * exposing only those methods and properties that are defined in the spec. */ var ResizeObserver = /** @class */ (function () { /** * Creates a new instance of ResizeObserver. * * @param {ResizeObserverCallback} callback - Callback that is invoked when * dimensions of the observed elements change. */ function ResizeObserver(callback) { if (!(this instanceof ResizeObserver)) { throw new TypeError('Cannot call a class as a function.'); } if (!arguments.length) { throw new TypeError('1 argument required, but only 0 present.'); } var controller = ResizeObserverController.getInstance(); var observer = new ResizeObserverSPI(callback, controller, this); observers.set(this, observer); } return ResizeObserver; }()); // Expose public methods of ResizeObserver. [ 'observe', 'unobserve', 'disconnect' ].forEach(function (method) { ResizeObserver.prototype[method] = function () { var _a; return (_a = observers.get(this))[method].apply(_a, arguments); }; }); var index = (function () { // Export existing implementation if available. if (typeof global$1.ResizeObserver !== 'undefined') { return global$1.ResizeObserver; } return ResizeObserver; })(); return index; }))); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],900:[function(require,module,exports){ "use strict"; exports.__esModule = true; exports["default"] = void 0; var _computeScrollIntoView = _interopRequireDefault(require("compute-scroll-into-view")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function isOptionsObject(options) { return options === Object(options) && Object.keys(options).length !== 0; } function defaultBehavior(actions, behavior) { if (behavior === void 0) { behavior = 'auto'; } var canSmoothScroll = ('scrollBehavior' in document.body.style); actions.forEach(function (_ref) { var el = _ref.el, top = _ref.top, left = _ref.left; if (el.scroll && canSmoothScroll) { el.scroll({ top: top, left: left, behavior: behavior }); } else { el.scrollTop = top; el.scrollLeft = left; } }); } function getOptions(options) { if (options === false) { return { block: 'end', inline: 'nearest' }; } if (isOptionsObject(options)) { return options; } return { block: 'start', inline: 'nearest' }; } function scrollIntoView(target, options) { var targetIsDetached = !target.ownerDocument.documentElement.contains(target); if (isOptionsObject(options) && typeof options.behavior === 'function') { return options.behavior(targetIsDetached ? [] : (0, _computeScrollIntoView["default"])(target, options)); } if (targetIsDetached) { return; } var computeOptions = getOptions(options); return defaultBehavior((0, _computeScrollIntoView["default"])(target, computeOptions), computeOptions.behavior); } var _default = scrollIntoView; exports["default"] = _default; module.exports = exports.default; },{"compute-scroll-into-view":456}],901:[function(require,module,exports){ // module.exports = function shallowEqual(objA, objB, compare, compareContext) { var ret = compare ? compare.call(compareContext, objA, objB) : void 0; if (ret !== void 0) { return !!ret; } if (objA === objB) { return true; } if (typeof objA !== "object" || !objA || typeof objB !== "object" || !objB) { return false; } var keysA = Object.keys(objA); var keysB = Object.keys(objB); if (keysA.length !== keysB.length) { return false; } var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB); // Test for A's keys different from B. for (var idx = 0; idx < keysA.length; idx++) { var key = keysA[idx]; if (!bHasOwnProperty(key)) { return false; } var valueA = objA[key]; var valueB = objB[key]; ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0; if (ret === false || (ret === void 0 && valueA !== valueB)) { return false; } } return true; }; },{}],902:[function(require,module,exports){ var camel2hyphen = function (str) { return str .replace(/[A-Z]/g, function (match) { return '-' + match.toLowerCase(); }) .toLowerCase(); }; module.exports = camel2hyphen; },{}],903:[function(require,module,exports){ // TinyColor v1.4.2 // https://github.com/bgrins/TinyColor // Brian Grinstead, MIT License (function(Math) { var trimLeft = /^\s+/, trimRight = /\s+$/, tinyCounter = 0, mathRound = Math.round, mathMin = Math.min, mathMax = Math.max, mathRandom = Math.random; function tinycolor (color, opts) { color = (color) ? color : ''; opts = opts || { }; // If input is already a tinycolor, return itself if (color instanceof tinycolor) { return color; } // If we are called as a function, call using new instead if (!(this instanceof tinycolor)) { return new tinycolor(color, opts); } var rgb = inputToRGB(color); this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = mathRound(100*this._a) / 100, this._format = opts.format || rgb.format; this._gradientType = opts.gradientType; // Don't let the range of [0,255] come back in [0,1]. // Potentially lose a little bit of precision here, but will fix issues where // .5 gets interpreted as half of the total, instead of half of 1 // If it was supposed to be 128, this was already taken care of by `inputToRgb` if (this._r < 1) { this._r = mathRound(this._r); } if (this._g < 1) { this._g = mathRound(this._g); } if (this._b < 1) { this._b = mathRound(this._b); } this._ok = rgb.ok; this._tc_id = tinyCounter++; } tinycolor.prototype = { isDark: function() { return this.getBrightness() < 128; }, isLight: function() { return !this.isDark(); }, isValid: function() { return this._ok; }, getOriginalInput: function() { return this._originalInput; }, getFormat: function() { return this._format; }, getAlpha: function() { return this._a; }, getBrightness: function() { //http://www.w3.org/TR/AERT#color-contrast var rgb = this.toRgb(); return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000; }, getLuminance: function() { //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef var rgb = this.toRgb(); var RsRGB, GsRGB, BsRGB, R, G, B; RsRGB = rgb.r/255; GsRGB = rgb.g/255; BsRGB = rgb.b/255; if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);} if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);} if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);} return (0.2126 * R) + (0.7152 * G) + (0.0722 * B); }, setAlpha: function(value) { this._a = boundAlpha(value); this._roundA = mathRound(100*this._a) / 100; return this; }, toHsv: function() { var hsv = rgbToHsv(this._r, this._g, this._b); return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a }; }, toHsvString: function() { var hsv = rgbToHsv(this._r, this._g, this._b); var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); return (this._a == 1) ? "hsv(" + h + ", " + s + "%, " + v + "%)" : "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")"; }, toHsl: function() { var hsl = rgbToHsl(this._r, this._g, this._b); return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a }; }, toHslString: function() { var hsl = rgbToHsl(this._r, this._g, this._b); var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); return (this._a == 1) ? "hsl(" + h + ", " + s + "%, " + l + "%)" : "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")"; }, toHex: function(allow3Char) { return rgbToHex(this._r, this._g, this._b, allow3Char); }, toHexString: function(allow3Char) { return '#' + this.toHex(allow3Char); }, toHex8: function(allow4Char) { return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char); }, toHex8String: function(allow4Char) { return '#' + this.toHex8(allow4Char); }, toRgb: function() { return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a }; }, toRgbString: function() { return (this._a == 1) ? "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")"; }, toPercentageRgb: function() { return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a }; }, toPercentageRgbString: function() { return (this._a == 1) ? "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")"; }, toName: function() { if (this._a === 0) { return "transparent"; } if (this._a < 1) { return false; } return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false; }, toFilter: function(secondColor) { var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a); var secondHex8String = hex8String; var gradientType = this._gradientType ? "GradientType = 1, " : ""; if (secondColor) { var s = tinycolor(secondColor); secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a); } return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; }, toString: function(format) { var formatSet = !!format; format = format || this._format; var formattedString = false; var hasAlpha = this._a < 1 && this._a >= 0; var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name"); if (needsAlphaFormat) { // Special case for "transparent", all other non-alpha formats // will return rgba when there is transparency. if (format === "name" && this._a === 0) { return this.toName(); } return this.toRgbString(); } if (format === "rgb") { formattedString = this.toRgbString(); } if (format === "prgb") { formattedString = this.toPercentageRgbString(); } if (format === "hex" || format === "hex6") { formattedString = this.toHexString(); } if (format === "hex3") { formattedString = this.toHexString(true); } if (format === "hex4") { formattedString = this.toHex8String(true); } if (format === "hex8") { formattedString = this.toHex8String(); } if (format === "name") { formattedString = this.toName(); } if (format === "hsl") { formattedString = this.toHslString(); } if (format === "hsv") { formattedString = this.toHsvString(); } return formattedString || this.toHexString(); }, clone: function() { return tinycolor(this.toString()); }, _applyModification: function(fn, args) { var color = fn.apply(null, [this].concat([].slice.call(args))); this._r = color._r; this._g = color._g; this._b = color._b; this.setAlpha(color._a); return this; }, lighten: function() { return this._applyModification(lighten, arguments); }, brighten: function() { return this._applyModification(brighten, arguments); }, darken: function() { return this._applyModification(darken, arguments); }, desaturate: function() { return this._applyModification(desaturate, arguments); }, saturate: function() { return this._applyModification(saturate, arguments); }, greyscale: function() { return this._applyModification(greyscale, arguments); }, spin: function() { return this._applyModification(spin, arguments); }, _applyCombination: function(fn, args) { return fn.apply(null, [this].concat([].slice.call(args))); }, analogous: function() { return this._applyCombination(analogous, arguments); }, complement: function() { return this._applyCombination(complement, arguments); }, monochromatic: function() { return this._applyCombination(monochromatic, arguments); }, splitcomplement: function() { return this._applyCombination(splitcomplement, arguments); }, triad: function() { return this._applyCombination(triad, arguments); }, tetrad: function() { return this._applyCombination(tetrad, arguments); } }; // If input is an object, force 1 into "1.0" to handle ratios properly // String input requires "1.0" as input, so 1 will be treated as 1 tinycolor.fromRatio = function(color, opts) { if (typeof color == "object") { var newColor = {}; for (var i in color) { if (color.hasOwnProperty(i)) { if (i === "a") { newColor[i] = color[i]; } else { newColor[i] = convertToPercentage(color[i]); } } } color = newColor; } return tinycolor(color, opts); }; // Given a string or object, convert that input to RGB // Possible string inputs: // // "red" // "#f00" or "f00" // "#ff0000" or "ff0000" // "#ff000000" or "ff000000" // "rgb 255 0 0" or "rgb (255, 0, 0)" // "rgb 1.0 0 0" or "rgb (1, 0, 0)" // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" // function inputToRGB(color) { var rgb = { r: 0, g: 0, b: 0 }; var a = 1; var s = null; var v = null; var l = null; var ok = false; var format = false; if (typeof color == "string") { color = stringInputToObject(color); } if (typeof color == "object") { if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) { rgb = rgbToRgb(color.r, color.g, color.b); ok = true; format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) { s = convertToPercentage(color.s); v = convertToPercentage(color.v); rgb = hsvToRgb(color.h, s, v); ok = true; format = "hsv"; } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) { s = convertToPercentage(color.s); l = convertToPercentage(color.l); rgb = hslToRgb(color.h, s, l); ok = true; format = "hsl"; } if (color.hasOwnProperty("a")) { a = color.a; } } a = boundAlpha(a); return { ok: ok, format: color.format || format, r: mathMin(255, mathMax(rgb.r, 0)), g: mathMin(255, mathMax(rgb.g, 0)), b: mathMin(255, mathMax(rgb.b, 0)), a: a }; } // Conversion Functions // -------------------- // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: // // `rgbToRgb` // Handle bounds / percentage checking to conform to CSS color spec // // *Assumes:* r, g, b in [0, 255] or [0, 1] // *Returns:* { r, g, b } in [0, 255] function rgbToRgb(r, g, b){ return { r: bound01(r, 255) * 255, g: bound01(g, 255) * 255, b: bound01(b, 255) * 255 }; } // `rgbToHsl` // Converts an RGB color value to HSL. // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] // *Returns:* { h, s, l } in [0,1] function rgbToHsl(r, g, b) { r = bound01(r, 255); g = bound01(g, 255); b = bound01(b, 255); var max = mathMax(r, g, b), min = mathMin(r, g, b); var h, s, l = (max + min) / 2; if(max == min) { h = s = 0; // achromatic } else { var d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch(max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return { h: h, s: s, l: l }; } // `hslToRgb` // Converts an HSL color value to RGB. // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] // *Returns:* { r, g, b } in the set [0, 255] function hslToRgb(h, s, l) { var r, g, b; h = bound01(h, 360); s = bound01(s, 100); l = bound01(l, 100); function hue2rgb(p, q, t) { if(t < 0) t += 1; if(t > 1) t -= 1; if(t < 1/6) return p + (q - p) * 6 * t; if(t < 1/2) return q; if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; return p; } if(s === 0) { r = g = b = l; // achromatic } else { var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = hue2rgb(p, q, h + 1/3); g = hue2rgb(p, q, h); b = hue2rgb(p, q, h - 1/3); } return { r: r * 255, g: g * 255, b: b * 255 }; } // `rgbToHsv` // Converts an RGB color value to HSV // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] // *Returns:* { h, s, v } in [0,1] function rgbToHsv(r, g, b) { r = bound01(r, 255); g = bound01(g, 255); b = bound01(b, 255); var max = mathMax(r, g, b), min = mathMin(r, g, b); var h, s, v = max; var d = max - min; s = max === 0 ? 0 : d / max; if(max == min) { h = 0; // achromatic } else { switch(max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return { h: h, s: s, v: v }; } // `hsvToRgb` // Converts an HSV color value to RGB. // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] // *Returns:* { r, g, b } in the set [0, 255] function hsvToRgb(h, s, v) { h = bound01(h, 360) * 6; s = bound01(s, 100); v = bound01(v, 100); var i = Math.floor(h), f = h - i, p = v * (1 - s), q = v * (1 - f * s), t = v * (1 - (1 - f) * s), mod = i % 6, r = [v, q, p, p, t, v][mod], g = [t, v, v, q, p, p][mod], b = [p, p, t, v, v, q][mod]; return { r: r * 255, g: g * 255, b: b * 255 }; } // `rgbToHex` // Converts an RGB color to hex // Assumes r, g, and b are contained in the set [0, 255] // Returns a 3 or 6 character hex function rgbToHex(r, g, b, allow3Char) { var hex = [ pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16)) ]; // Return a 3 character hex if possible if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); } return hex.join(""); } // `rgbaToHex` // Converts an RGBA color plus alpha transparency to hex // Assumes r, g, b are contained in the set [0, 255] and // a in [0, 1]. Returns a 4 or 8 character rgba hex function rgbaToHex(r, g, b, a, allow4Char) { var hex = [ pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16)), pad2(convertDecimalToHex(a)) ]; // Return a 4 character hex if possible if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) { return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0); } return hex.join(""); } // `rgbaToArgbHex` // Converts an RGBA color to an ARGB Hex8 string // Rarely used, but required for "toFilter()" function rgbaToArgbHex(r, g, b, a) { var hex = [ pad2(convertDecimalToHex(a)), pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16)) ]; return hex.join(""); } // `equals` // Can be called with any tinycolor input tinycolor.equals = function (color1, color2) { if (!color1 || !color2) { return false; } return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); }; tinycolor.random = function() { return tinycolor.fromRatio({ r: mathRandom(), g: mathRandom(), b: mathRandom() }); }; // Modification Functions // ---------------------- // Thanks to less.js for some of the basics here // function desaturate(color, amount) { amount = (amount === 0) ? 0 : (amount || 10); var hsl = tinycolor(color).toHsl(); hsl.s -= amount / 100; hsl.s = clamp01(hsl.s); return tinycolor(hsl); } function saturate(color, amount) { amount = (amount === 0) ? 0 : (amount || 10); var hsl = tinycolor(color).toHsl(); hsl.s += amount / 100; hsl.s = clamp01(hsl.s); return tinycolor(hsl); } function greyscale(color) { return tinycolor(color).desaturate(100); } function lighten (color, amount) { amount = (amount === 0) ? 0 : (amount || 10); var hsl = tinycolor(color).toHsl(); hsl.l += amount / 100; hsl.l = clamp01(hsl.l); return tinycolor(hsl); } function brighten(color, amount) { amount = (amount === 0) ? 0 : (amount || 10); var rgb = tinycolor(color).toRgb(); rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100)))); rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100)))); rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100)))); return tinycolor(rgb); } function darken (color, amount) { amount = (amount === 0) ? 0 : (amount || 10); var hsl = tinycolor(color).toHsl(); hsl.l -= amount / 100; hsl.l = clamp01(hsl.l); return tinycolor(hsl); } // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue. // Values outside of this range will be wrapped into this range. function spin(color, amount) { var hsl = tinycolor(color).toHsl(); var hue = (hsl.h + amount) % 360; hsl.h = hue < 0 ? 360 + hue : hue; return tinycolor(hsl); } // Combination Functions // --------------------- // Thanks to jQuery xColor for some of the ideas behind these // function complement(color) { var hsl = tinycolor(color).toHsl(); hsl.h = (hsl.h + 180) % 360; return tinycolor(hsl); } function triad(color) { var hsl = tinycolor(color).toHsl(); var h = hsl.h; return [ tinycolor(color), tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) ]; } function tetrad(color) { var hsl = tinycolor(color).toHsl(); var h = hsl.h; return [ tinycolor(color), tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) ]; } function splitcomplement(color) { var hsl = tinycolor(color).toHsl(); var h = hsl.h; return [ tinycolor(color), tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) ]; } function analogous(color, results, slices) { results = results || 6; slices = slices || 30; var hsl = tinycolor(color).toHsl(); var part = 360 / slices; var ret = [tinycolor(color)]; for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { hsl.h = (hsl.h + part) % 360; ret.push(tinycolor(hsl)); } return ret; } function monochromatic(color, results) { results = results || 6; var hsv = tinycolor(color).toHsv(); var h = hsv.h, s = hsv.s, v = hsv.v; var ret = []; var modification = 1 / results; while (results--) { ret.push(tinycolor({ h: h, s: s, v: v})); v = (v + modification) % 1; } return ret; } // Utility Functions // --------------------- tinycolor.mix = function(color1, color2, amount) { amount = (amount === 0) ? 0 : (amount || 50); var rgb1 = tinycolor(color1).toRgb(); var rgb2 = tinycolor(color2).toRgb(); var p = amount / 100; var rgba = { r: ((rgb2.r - rgb1.r) * p) + rgb1.r, g: ((rgb2.g - rgb1.g) * p) + rgb1.g, b: ((rgb2.b - rgb1.b) * p) + rgb1.b, a: ((rgb2.a - rgb1.a) * p) + rgb1.a }; return tinycolor(rgba); }; // Readability Functions // --------------------- // false // tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false tinycolor.isReadable = function(color1, color2, wcag2) { var readability = tinycolor.readability(color1, color2); var wcag2Parms, out; out = false; wcag2Parms = validateWCAG2Parms(wcag2); switch (wcag2Parms.level + wcag2Parms.size) { case "AAsmall": case "AAAlarge": out = readability >= 4.5; break; case "AAlarge": out = readability >= 3; break; case "AAAsmall": out = readability >= 7; break; } return out; }; // `mostReadable` // Given a base color and a list of possible foreground or background // colors for that base, returns the most readable color. // Optionally returns Black or White if the most readable color is unreadable. // *Example* // tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255" // tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff" // tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3" // tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff" tinycolor.mostReadable = function(baseColor, colorList, args) { var bestColor = null; var bestScore = 0; var readability; var includeFallbackColors, level, size ; args = args || {}; includeFallbackColors = args.includeFallbackColors ; level = args.level; size = args.size; for (var i= 0; i < colorList.length ; i++) { readability = tinycolor.readability(baseColor, colorList[i]); if (readability > bestScore) { bestScore = readability; bestColor = tinycolor(colorList[i]); } } if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) { return bestColor; } else { args.includeFallbackColors=false; return tinycolor.mostReadable(baseColor,["#fff", "#000"],args); } }; // Big List of Colors // ------------------ // var names = tinycolor.names = { aliceblue: "f0f8ff", antiquewhite: "faebd7", aqua: "0ff", aquamarine: "7fffd4", azure: "f0ffff", beige: "f5f5dc", bisque: "ffe4c4", black: "000", blanchedalmond: "ffebcd", blue: "00f", blueviolet: "8a2be2", brown: "a52a2a", burlywood: "deb887", burntsienna: "ea7e5d", cadetblue: "5f9ea0", chartreuse: "7fff00", chocolate: "d2691e", coral: "ff7f50", cornflowerblue: "6495ed", cornsilk: "fff8dc", crimson: "dc143c", cyan: "0ff", darkblue: "00008b", darkcyan: "008b8b", darkgoldenrod: "b8860b", darkgray: "a9a9a9", darkgreen: "006400", darkgrey: "a9a9a9", darkkhaki: "bdb76b", darkmagenta: "8b008b", darkolivegreen: "556b2f", darkorange: "ff8c00", darkorchid: "9932cc", darkred: "8b0000", darksalmon: "e9967a", darkseagreen: "8fbc8f", darkslateblue: "483d8b", darkslategray: "2f4f4f", darkslategrey: "2f4f4f", darkturquoise: "00ced1", darkviolet: "9400d3", deeppink: "ff1493", deepskyblue: "00bfff", dimgray: "696969", dimgrey: "696969", dodgerblue: "1e90ff", firebrick: "b22222", floralwhite: "fffaf0", forestgreen: "228b22", fuchsia: "f0f", gainsboro: "dcdcdc", ghostwhite: "f8f8ff", gold: "ffd700", goldenrod: "daa520", gray: "808080", green: "008000", greenyellow: "adff2f", grey: "808080", honeydew: "f0fff0", hotpink: "ff69b4", indianred: "cd5c5c", indigo: "4b0082", ivory: "fffff0", khaki: "f0e68c", lavender: "e6e6fa", lavenderblush: "fff0f5", lawngreen: "7cfc00", lemonchiffon: "fffacd", lightblue: "add8e6", lightcoral: "f08080", lightcyan: "e0ffff", lightgoldenrodyellow: "fafad2", lightgray: "d3d3d3", lightgreen: "90ee90", lightgrey: "d3d3d3", lightpink: "ffb6c1", lightsalmon: "ffa07a", lightseagreen: "20b2aa", lightskyblue: "87cefa", lightslategray: "789", lightslategrey: "789", lightsteelblue: "b0c4de", lightyellow: "ffffe0", lime: "0f0", limegreen: "32cd32", linen: "faf0e6", magenta: "f0f", maroon: "800000", mediumaquamarine: "66cdaa", mediumblue: "0000cd", mediumorchid: "ba55d3", mediumpurple: "9370db", mediumseagreen: "3cb371", mediumslateblue: "7b68ee", mediumspringgreen: "00fa9a", mediumturquoise: "48d1cc", mediumvioletred: "c71585", midnightblue: "191970", mintcream: "f5fffa", mistyrose: "ffe4e1", moccasin: "ffe4b5", navajowhite: "ffdead", navy: "000080", oldlace: "fdf5e6", olive: "808000", olivedrab: "6b8e23", orange: "ffa500", orangered: "ff4500", orchid: "da70d6", palegoldenrod: "eee8aa", palegreen: "98fb98", paleturquoise: "afeeee", palevioletred: "db7093", papayawhip: "ffefd5", peachpuff: "ffdab9", peru: "cd853f", pink: "ffc0cb", plum: "dda0dd", powderblue: "b0e0e6", purple: "800080", rebeccapurple: "663399", red: "f00", rosybrown: "bc8f8f", royalblue: "4169e1", saddlebrown: "8b4513", salmon: "fa8072", sandybrown: "f4a460", seagreen: "2e8b57", seashell: "fff5ee", sienna: "a0522d", silver: "c0c0c0", skyblue: "87ceeb", slateblue: "6a5acd", slategray: "708090", slategrey: "708090", snow: "fffafa", springgreen: "00ff7f", steelblue: "4682b4", tan: "d2b48c", teal: "008080", thistle: "d8bfd8", tomato: "ff6347", turquoise: "40e0d0", violet: "ee82ee", wheat: "f5deb3", white: "fff", whitesmoke: "f5f5f5", yellow: "ff0", yellowgreen: "9acd32" }; // Make it easy to access colors via `hexNames[hex]` var hexNames = tinycolor.hexNames = flip(names); // Utilities // --------- // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` function flip(o) { var flipped = { }; for (var i in o) { if (o.hasOwnProperty(i)) { flipped[o[i]] = i; } } return flipped; } // Return a valid alpha value [0,1] with all invalid values being set to 1 function boundAlpha(a) { a = parseFloat(a); if (isNaN(a) || a < 0 || a > 1) { a = 1; } return a; } // Take input from [0, n] and return it as [0, 1] function bound01(n, max) { if (isOnePointZero(n)) { n = "100%"; } var processPercent = isPercentage(n); n = mathMin(max, mathMax(0, parseFloat(n))); // Automatically convert percentage into number if (processPercent) { n = parseInt(n * max, 10) / 100; } // Handle floating point rounding errors if ((Math.abs(n - max) < 0.000001)) { return 1; } // Convert into [0, 1] range if it isn't already return (n % max) / parseFloat(max); } // Force a number between 0 and 1 function clamp01(val) { return mathMin(1, mathMax(0, val)); } // Parse a base-16 hex value into a base-10 integer function parseIntFromHex(val) { return parseInt(val, 16); } // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 // function isOnePointZero(n) { return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; } // Check to see if string passed in is a percentage function isPercentage(n) { return typeof n === "string" && n.indexOf('%') != -1; } // Force a hex value to have 2 characters function pad2(c) { return c.length == 1 ? '0' + c : '' + c; } // Replace a decimal with it's percentage value function convertToPercentage(n) { if (n <= 1) { n = (n * 100) + "%"; } return n; } // Converts a decimal to a hex value function convertDecimalToHex(d) { return Math.round(parseFloat(d) * 255).toString(16); } // Converts a hex value to a decimal function convertHexToDecimal(h) { return (parseIntFromHex(h) / 255); } var matchers = (function() { // var CSS_INTEGER = "[-\\+]?\\d+%?"; // var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; // Actual matching. // Parentheses and commas are optional, but not required. // Whitespace can take the place of commas or opening paren var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; return { CSS_UNIT: new RegExp(CSS_UNIT), rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), hsva: new RegExp("hsva" + PERMISSIVE_MATCH4), hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ }; })(); // `isValidCSSUnit` // Take in a single string / number and check to see if it looks like a CSS unit // (see `matchers` above for definition). function isValidCSSUnit(color) { return !!matchers.CSS_UNIT.exec(color); } // `stringInputToObject` // Permissive string parsing. Take in a number of formats, and output an object // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` function stringInputToObject(color) { color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); var named = false; if (names[color]) { color = names[color]; named = true; } else if (color == 'transparent') { return { r: 0, g: 0, b: 0, a: 0, format: "name" }; } // Try to match string input using regular expressions. // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] // Just return an object and let the conversion functions handle that. // This way the result will be the same whether the tinycolor is initialized with string or object. var match; if ((match = matchers.rgb.exec(color))) { return { r: match[1], g: match[2], b: match[3] }; } if ((match = matchers.rgba.exec(color))) { return { r: match[1], g: match[2], b: match[3], a: match[4] }; } if ((match = matchers.hsl.exec(color))) { return { h: match[1], s: match[2], l: match[3] }; } if ((match = matchers.hsla.exec(color))) { return { h: match[1], s: match[2], l: match[3], a: match[4] }; } if ((match = matchers.hsv.exec(color))) { return { h: match[1], s: match[2], v: match[3] }; } if ((match = matchers.hsva.exec(color))) { return { h: match[1], s: match[2], v: match[3], a: match[4] }; } if ((match = matchers.hex8.exec(color))) { return { r: parseIntFromHex(match[1]), g: parseIntFromHex(match[2]), b: parseIntFromHex(match[3]), a: convertHexToDecimal(match[4]), format: named ? "name" : "hex8" }; } if ((match = matchers.hex6.exec(color))) { return { r: parseIntFromHex(match[1]), g: parseIntFromHex(match[2]), b: parseIntFromHex(match[3]), format: named ? "name" : "hex" }; } if ((match = matchers.hex4.exec(color))) { return { r: parseIntFromHex(match[1] + '' + match[1]), g: parseIntFromHex(match[2] + '' + match[2]), b: parseIntFromHex(match[3] + '' + match[3]), a: convertHexToDecimal(match[4] + '' + match[4]), format: named ? "name" : "hex8" }; } if ((match = matchers.hex3.exec(color))) { return { r: parseIntFromHex(match[1] + '' + match[1]), g: parseIntFromHex(match[2] + '' + match[2]), b: parseIntFromHex(match[3] + '' + match[3]), format: named ? "name" : "hex" }; } return false; } function validateWCAG2Parms(parms) { // return valid WCAG2 parms for isReadable. // If input parms are invalid, return {"level":"AA", "size":"small"} var level, size; parms = parms || {"level":"AA", "size":"small"}; level = (parms.level || "AA").toUpperCase(); size = (parms.size || "small").toLowerCase(); if (level !== "AA" && level !== "AAA") { level = "AA"; } if (size !== "small" && size !== "large") { size = "small"; } return {"level":level, "size":size}; } // Node: Export function if (typeof module !== "undefined" && module.exports) { module.exports = tinycolor; } // AMD/requirejs: Define the module else if (typeof define === 'function' && define.amd) { define(function () {return tinycolor;}); } // Browser: Expose to window else { window.tinycolor = tinycolor; } })(Math); },{}],904:[function(require,module,exports){ module.exports = function () { var selection = document.getSelection(); if (!selection.rangeCount) { return function () {}; } var active = document.activeElement; var ranges = []; for (var i = 0; i < selection.rangeCount; i++) { ranges.push(selection.getRangeAt(i)); } switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML case 'INPUT': case 'TEXTAREA': active.blur(); break; default: active = null; break; } selection.removeAllRanges(); return function () { selection.type === 'Caret' && selection.removeAllRanges(); if (!selection.rangeCount) { ranges.forEach(function(range) { selection.addRange(range); }); } active && active.focus(); }; }; },{}],905:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ 'use strict'; /** * Similar to invariant but only logs a warning if the condition is not met. * This can be used to log issues in development environments in critical * paths. Removing the logging code for production environments will keep the * same logic and follow the same code paths. */ var __DEV__ = process.env.NODE_ENV !== 'production'; var warning = function() {}; if (__DEV__) { var printWarning = function printWarning(format, args) { var len = arguments.length; args = new Array(len > 1 ? len - 1 : 0); for (var key = 1; key < len; key++) { args[key - 1] = arguments[key]; } var argIndex = 0; var message = 'Warning: ' + format.replace(/%s/g, function() { return args[argIndex++]; }); if (typeof console !== 'undefined') { console.error(message); } try { // --- Welcome to debugging React --- // This error was thrown as a convenience so that you can use this stack // to find the callsite that caused this warning to fire. throw new Error(message); } catch (x) {} } warning = function(condition, format, args) { var len = arguments.length; args = new Array(len > 2 ? len - 2 : 0); for (var key = 2; key < len; key++) { args[key - 2] = arguments[key]; } if (format === undefined) { throw new Error( '`warning(condition, format, ...args)` requires a warning ' + 'message argument' ); } if (!condition) { printWarning.apply(null, [format].concat(args)); } }; } module.exports = warning; }).call(this,require('_process')) },{"_process":1}],"antd":[function(require,module,exports){ (function (process){ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Affix", { enumerable: true, get: function get() { return _affix["default"]; } }); Object.defineProperty(exports, "Anchor", { enumerable: true, get: function get() { return _anchor["default"]; } }); Object.defineProperty(exports, "AutoComplete", { enumerable: true, get: function get() { return _autoComplete["default"]; } }); Object.defineProperty(exports, "Alert", { enumerable: true, get: function get() { return _alert["default"]; } }); Object.defineProperty(exports, "Avatar", { enumerable: true, get: function get() { return _avatar["default"]; } }); Object.defineProperty(exports, "BackTop", { enumerable: true, get: function get() { return _backTop["default"]; } }); Object.defineProperty(exports, "Badge", { enumerable: true, get: function get() { return _badge["default"]; } }); Object.defineProperty(exports, "Breadcrumb", { enumerable: true, get: function get() { return _breadcrumb["default"]; } }); Object.defineProperty(exports, "Button", { enumerable: true, get: function get() { return _button["default"]; } }); Object.defineProperty(exports, "Calendar", { enumerable: true, get: function get() { return _calendar["default"]; } }); Object.defineProperty(exports, "Card", { enumerable: true, get: function get() { return _card["default"]; } }); Object.defineProperty(exports, "Collapse", { enumerable: true, get: function get() { return _collapse["default"]; } }); Object.defineProperty(exports, "Carousel", { enumerable: true, get: function get() { return _carousel["default"]; } }); Object.defineProperty(exports, "Cascader", { enumerable: true, get: function get() { return _cascader["default"]; } }); Object.defineProperty(exports, "Checkbox", { enumerable: true, get: function get() { return _checkbox["default"]; } }); Object.defineProperty(exports, "Col", { enumerable: true, get: function get() { return _col["default"]; } }); Object.defineProperty(exports, "Comment", { enumerable: true, get: function get() { return _comment["default"]; } }); Object.defineProperty(exports, "ConfigProvider", { enumerable: true, get: function get() { return _configProvider["default"]; } }); Object.defineProperty(exports, "DatePicker", { enumerable: true, get: function get() { return _datePicker["default"]; } }); Object.defineProperty(exports, "Descriptions", { enumerable: true, get: function get() { return _descriptions["default"]; } }); Object.defineProperty(exports, "Divider", { enumerable: true, get: function get() { return _divider["default"]; } }); Object.defineProperty(exports, "Dropdown", { enumerable: true, get: function get() { return _dropdown["default"]; } }); Object.defineProperty(exports, "Drawer", { enumerable: true, get: function get() { return _drawer["default"]; } }); Object.defineProperty(exports, "Empty", { enumerable: true, get: function get() { return _empty["default"]; } }); Object.defineProperty(exports, "Form", { enumerable: true, get: function get() { return _form["default"]; } }); Object.defineProperty(exports, "Grid", { enumerable: true, get: function get() { return _grid["default"]; } }); Object.defineProperty(exports, "Input", { enumerable: true, get: function get() { return _input["default"]; } }); Object.defineProperty(exports, "Image", { enumerable: true, get: function get() { return _image["default"]; } }); Object.defineProperty(exports, "InputNumber", { enumerable: true, get: function get() { return _inputNumber["default"]; } }); Object.defineProperty(exports, "Layout", { enumerable: true, get: function get() { return _layout["default"]; } }); Object.defineProperty(exports, "List", { enumerable: true, get: function get() { return _list["default"]; } }); Object.defineProperty(exports, "message", { enumerable: true, get: function get() { return _message["default"]; } }); Object.defineProperty(exports, "Menu", { enumerable: true, get: function get() { return _menu["default"]; } }); Object.defineProperty(exports, "Mentions", { enumerable: true, get: function get() { return _mentions["default"]; } }); Object.defineProperty(exports, "Modal", { enumerable: true, get: function get() { return _modal["default"]; } }); Object.defineProperty(exports, "Statistic", { enumerable: true, get: function get() { return _statistic["default"]; } }); Object.defineProperty(exports, "notification", { enumerable: true, get: function get() { return _notification["default"]; } }); Object.defineProperty(exports, "PageHeader", { enumerable: true, get: function get() { return _pageHeader["default"]; } }); Object.defineProperty(exports, "Pagination", { enumerable: true, get: function get() { return _pagination["default"]; } }); Object.defineProperty(exports, "Popconfirm", { enumerable: true, get: function get() { return _popconfirm["default"]; } }); Object.defineProperty(exports, "Popover", { enumerable: true, get: function get() { return _popover["default"]; } }); Object.defineProperty(exports, "Progress", { enumerable: true, get: function get() { return _progress["default"]; } }); Object.defineProperty(exports, "Radio", { enumerable: true, get: function get() { return _radio["default"]; } }); Object.defineProperty(exports, "Rate", { enumerable: true, get: function get() { return _rate["default"]; } }); Object.defineProperty(exports, "Result", { enumerable: true, get: function get() { return _result["default"]; } }); Object.defineProperty(exports, "Row", { enumerable: true, get: function get() { return _row["default"]; } }); Object.defineProperty(exports, "Select", { enumerable: true, get: function get() { return _select["default"]; } }); Object.defineProperty(exports, "Skeleton", { enumerable: true, get: function get() { return _skeleton["default"]; } }); Object.defineProperty(exports, "Slider", { enumerable: true, get: function get() { return _slider["default"]; } }); Object.defineProperty(exports, "Space", { enumerable: true, get: function get() { return _space["default"]; } }); Object.defineProperty(exports, "Spin", { enumerable: true, get: function get() { return _spin["default"]; } }); Object.defineProperty(exports, "Steps", { enumerable: true, get: function get() { return _steps["default"]; } }); Object.defineProperty(exports, "Switch", { enumerable: true, get: function get() { return _switch["default"]; } }); Object.defineProperty(exports, "Table", { enumerable: true, get: function get() { return _table["default"]; } }); Object.defineProperty(exports, "Transfer", { enumerable: true, get: function get() { return _transfer["default"]; } }); Object.defineProperty(exports, "Tree", { enumerable: true, get: function get() { return _tree["default"]; } }); Object.defineProperty(exports, "TreeSelect", { enumerable: true, get: function get() { return _treeSelect["default"]; } }); Object.defineProperty(exports, "Tabs", { enumerable: true, get: function get() { return _tabs["default"]; } }); Object.defineProperty(exports, "Tag", { enumerable: true, get: function get() { return _tag["default"]; } }); Object.defineProperty(exports, "TimePicker", { enumerable: true, get: function get() { return _timePicker["default"]; } }); Object.defineProperty(exports, "Timeline", { enumerable: true, get: function get() { return _timeline["default"]; } }); Object.defineProperty(exports, "Tooltip", { enumerable: true, get: function get() { return _tooltip["default"]; } }); Object.defineProperty(exports, "Typography", { enumerable: true, get: function get() { return _typography["default"]; } }); Object.defineProperty(exports, "Upload", { enumerable: true, get: function get() { return _upload["default"]; } }); Object.defineProperty(exports, "version", { enumerable: true, get: function get() { return _version["default"]; } }); var _affix = _interopRequireDefault(require("./affix")); var _anchor = _interopRequireDefault(require("./anchor")); var _autoComplete = _interopRequireDefault(require("./auto-complete")); var _alert = _interopRequireDefault(require("./alert")); var _avatar = _interopRequireDefault(require("./avatar")); var _backTop = _interopRequireDefault(require("./back-top")); var _badge = _interopRequireDefault(require("./badge")); var _breadcrumb = _interopRequireDefault(require("./breadcrumb")); var _button = _interopRequireDefault(require("./button")); var _calendar = _interopRequireDefault(require("./calendar")); var _card = _interopRequireDefault(require("./card")); var _collapse = _interopRequireDefault(require("./collapse")); var _carousel = _interopRequireDefault(require("./carousel")); var _cascader = _interopRequireDefault(require("./cascader")); var _checkbox = _interopRequireDefault(require("./checkbox")); var _col = _interopRequireDefault(require("./col")); var _comment = _interopRequireDefault(require("./comment")); var _configProvider = _interopRequireDefault(require("./config-provider")); var _datePicker = _interopRequireDefault(require("./date-picker")); var _descriptions = _interopRequireDefault(require("./descriptions")); var _divider = _interopRequireDefault(require("./divider")); var _dropdown = _interopRequireDefault(require("./dropdown")); var _drawer = _interopRequireDefault(require("./drawer")); var _empty = _interopRequireDefault(require("./empty")); var _form = _interopRequireDefault(require("./form")); var _grid = _interopRequireDefault(require("./grid")); var _input = _interopRequireDefault(require("./input")); var _image = _interopRequireDefault(require("./image")); var _inputNumber = _interopRequireDefault(require("./input-number")); var _layout = _interopRequireDefault(require("./layout")); var _list = _interopRequireDefault(require("./list")); var _message = _interopRequireDefault(require("./message")); var _menu = _interopRequireDefault(require("./menu")); var _mentions = _interopRequireDefault(require("./mentions")); var _modal = _interopRequireDefault(require("./modal")); var _statistic = _interopRequireDefault(require("./statistic")); var _notification = _interopRequireDefault(require("./notification")); var _pageHeader = _interopRequireDefault(require("./page-header")); var _pagination = _interopRequireDefault(require("./pagination")); var _popconfirm = _interopRequireDefault(require("./popconfirm")); var _popover = _interopRequireDefault(require("./popover")); var _progress = _interopRequireDefault(require("./progress")); var _radio = _interopRequireDefault(require("./radio")); var _rate = _interopRequireDefault(require("./rate")); var _result = _interopRequireDefault(require("./result")); var _row = _interopRequireDefault(require("./row")); var _select = _interopRequireDefault(require("./select")); var _skeleton = _interopRequireDefault(require("./skeleton")); var _slider = _interopRequireDefault(require("./slider")); var _space = _interopRequireDefault(require("./space")); var _spin = _interopRequireDefault(require("./spin")); var _steps = _interopRequireDefault(require("./steps")); var _switch = _interopRequireDefault(require("./switch")); var _table = _interopRequireDefault(require("./table")); var _transfer = _interopRequireDefault(require("./transfer")); var _tree = _interopRequireDefault(require("./tree")); var _treeSelect = _interopRequireDefault(require("./tree-select")); var _tabs = _interopRequireDefault(require("./tabs")); var _tag = _interopRequireDefault(require("./tag")); var _timePicker = _interopRequireDefault(require("./time-picker")); var _timeline = _interopRequireDefault(require("./timeline")); var _tooltip = _interopRequireDefault(require("./tooltip")); var _typography = _interopRequireDefault(require("./typography")); var _upload = _interopRequireDefault(require("./upload")); var _version = _interopRequireDefault(require("./version")); /* @remove-on-es-build-begin */ // this file is not used if use https://github.com/ant-design/babel-plugin-import var ENV = process.env.NODE_ENV; if (ENV !== 'production' && ENV !== 'test' && typeof console !== 'undefined' && console.warn && // eslint-disable-line no-console typeof window !== 'undefined') { // eslint-disable-next-line no-console console.warn('You are using a whole package of antd, ' + 'please use https://www.npmjs.com/package/babel-plugin-import to reduce app bundle size.'); } /* @remove-on-es-build-end */ }).call(this,require('_process')) },{"./affix":233,"./alert":236,"./anchor":240,"./auto-complete":241,"./avatar":244,"./back-top":245,"./badge":248,"./breadcrumb":253,"./button":257,"./calendar":260,"./card":264,"./carousel":265,"./cascader":266,"./checkbox":269,"./col":270,"./collapse":273,"./comment":275,"./config-provider":278,"./date-picker":285,"./descriptions":291,"./divider":292,"./drawer":293,"./dropdown":296,"./empty":298,"./form":310,"./grid":315,"./image":317,"./input":325,"./input-number":318,"./layout":327,"./list":330,"./mentions":337,"./menu":341,"./message":343,"./modal":348,"./notification":353,"./page-header":354,"./pagination":357,"./popconfirm":358,"./popover":359,"./progress":363,"./radio":368,"./rate":371,"./result":372,"./row":376,"./select":377,"./skeleton":387,"./slider":389,"./space":391,"./spin":392,"./statistic":396,"./steps":398,"./switch":399,"./table":412,"./tabs":414,"./tag":416,"./time-picker":417,"./timeline":421,"./tooltip":422,"./transfer":426,"./tree":433,"./tree-select":430,"./typography":443,"./upload":448,"./version":451,"@babel/runtime/helpers/interopRequireDefault":192,"_process":1}]},{},[]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2NvbG9ycy9kaXN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzcy1hbmltYXRpb24vbGliL0V2ZW50LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzcy1hbmltYXRpb24vbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Fycm93TGVmdE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Fycm93UmlnaHRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9CYXJzT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ2FsZW5kYXJPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9DYXJldERvd25GaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ2FyZXREb3duT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ2FyZXRVcE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0NoZWNrQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0NoZWNrQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ2hlY2tPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9DbG9ja0NpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Nsb3NlQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Nsb3NlQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ2xvc2VPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Db3B5T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRGVsZXRlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRG91YmxlTGVmdE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0RvdWJsZVJpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Rvd25sb2FkT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRWRpdE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0VsbGlwc2lzT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRW50ZXJPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0V5ZUludmlzaWJsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0V5ZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0ZpbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9GaWxlVHdvVG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9GaWx0ZXJGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRm9sZGVyT3Blbk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0ZvbGRlck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0luZm9DaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vSW5mb0NpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0xlZnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Mb2FkaW5nT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vTWludXNTcXVhcmVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9QYXBlckNsaXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9QaWN0dXJlVHdvVG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9QbHVzT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vUGx1c1NxdWFyZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL1JlZG9PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9SaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL1JvdGF0ZUxlZnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Sb3RhdGVSaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL1NlYXJjaE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL1N0YXJGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vU3dhcFJpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vVXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9WZXJ0aWNhbEFsaWduVG9wT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vV2FybmluZ0ZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9ab29tSW5PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9ab29tT3V0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvQXJyb3dMZWZ0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvQXJyb3dSaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL0JhcnNPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9DYWxlbmRhck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL0NhcmV0RG93bkZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9DYXJldERvd25PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9DYXJldFVwT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvQ2hlY2tDaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvQ2hlY2tDaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9DaGVja091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL0Nsb2NrQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9DbG9zZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL0NvcHlPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9EZWxldGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9Eb3VibGVMZWZ0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvRG91YmxlUmlnaHRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9Eb3duT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvRG93bmxvYWRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9FZGl0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvRWxsaXBzaXNPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9FbnRlck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL0V4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvRXllSW52aXNpYmxlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvRXllT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvRmlsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL0ZpbGVUd29Ub25lLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL0ZpbHRlckZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9Gb2xkZXJPcGVuT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvRm9sZGVyT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvSW5mb0NpcmNsZUZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9JbmZvQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvTGVmdE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL0xvYWRpbmdPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9NaW51c1NxdWFyZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL1BhcGVyQ2xpcE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL1BpY3R1cmVUd29Ub25lLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL1BsdXNPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9QbHVzU3F1YXJlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvUmVkb091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL1JpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvUm90YXRlTGVmdE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL1JvdGF0ZVJpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvU2VhcmNoT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvU3RhckZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9Td2FwUmlnaHRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9VcE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL1ZlcnRpY2FsQWxpZ25Ub3BPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9XYXJuaW5nRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL1pvb21Jbk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL1pvb21PdXRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvY29tcG9uZW50cy9BbnRkSWNvbi5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvY29tcG9uZW50cy9JY29uQmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvY29tcG9uZW50cy90d29Ub25lUHJpbWFyeUNvbG9yLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9BcnJvd0xlZnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvQXJyb3dSaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9CYXJzT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NhbGVuZGFyT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NhcmV0RG93bkZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvQ2FyZXREb3duT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NhcmV0VXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvQ2hlY2tDaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NoZWNrQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NoZWNrT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Nsb2NrQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9DbG9zZUNpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9DbG9zZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9Db3B5T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0RlbGV0ZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9Eb3VibGVMZWZ0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0RvdWJsZVJpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Rvd25PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvRG93bmxvYWRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvRWRpdE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9FbGxpcHNpc091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9FbnRlck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvRXllSW52aXNpYmxlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0V5ZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9GaWxlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0ZpbGVUd29Ub25lLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9GaWx0ZXJGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0ZvbGRlck9wZW5PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvRm9sZGVyT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0luZm9DaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0luZm9DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvTGVmdE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9Mb2FkaW5nT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL01pbnVzU3F1YXJlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1BhcGVyQ2xpcE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9QaWN0dXJlVHdvVG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvUGx1c091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9QbHVzU3F1YXJlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1JlZG9PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvUmlnaHRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvUm90YXRlTGVmdE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9Sb3RhdGVSaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9TZWFyY2hPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvU3RhckZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvU3dhcFJpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1VwT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1ZlcnRpY2FsQWxpZ25Ub3BPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvV2FybmluZ0ZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvWm9vbUluT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1pvb21PdXRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2NvbG9ycy9saWIvZ2VuZXJhdGUuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2NvbG9ycy9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vcmVhY3Qtc2xpY2svbGliL2Fycm93cy5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9yZWFjdC1zbGljay9saWIvZGVmYXVsdC1wcm9wcy5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9yZWFjdC1zbGljay9saWIvZG90cy5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9yZWFjdC1zbGljay9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vcmVhY3Qtc2xpY2svbGliL2luaXRpYWwtc3RhdGUuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vcmVhY3Qtc2xpY2svbGliL2lubmVyLXNsaWRlci5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9yZWFjdC1zbGljay9saWIvc2xpZGVyLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL3JlYWN0LXNsaWNrL2xpYi90cmFjay5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9yZWFjdC1zbGljay9saWIvdXRpbHMvaW5uZXJTbGlkZXJVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhIb2xlcy5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlci5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcy5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHQuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5TGltaXQuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVNwcmVhZC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDIuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2V0UHJvdG90eXBlT2YuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc3VwZXJQcm9wQmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2NvbG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9kZXZXYXJuaW5nLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2Vhc2luZ3MuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvZ2V0RGF0YU9yQXJpYVByb3BzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2dldFJlbmRlclByb3BWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9nZXRTY3JvbGwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlRm9yY2VVcGRhdGUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlUGF0Y2hFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2hvb2tzL3VzZVN5bmNTdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9pc051bWVyaWMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvbW90aW9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3JhZi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9yZWFjdE5vZGUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvcmVmLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3Jlc3BvbnNpdmVPYnNlcnZlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3Njcm9sbFRvLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3N0eWxlQ2hlY2tlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC90aHJvdHRsZUJ5QW5pbWF0aW9uRnJhbWUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvdHJhbnNCdXR0b24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC91bnJlYWNoYWJsZUV4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC93YXZlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2FmZml4L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2FmZml4L3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2FsZXJ0L0Vycm9yQm91bmRhcnkuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvYWxlcnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvYW5jaG9yL0FuY2hvci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9hbmNob3IvQW5jaG9yTGluay5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9hbmNob3IvY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9hbmNob3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvYXV0by1jb21wbGV0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9hdmF0YXIvYXZhdGFyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2F2YXRhci9ncm91cC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9hdmF0YXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvYmFjay10b3AvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvYmFkZ2UvUmliYm9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2JhZGdlL1Njcm9sbE51bWJlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9iYWRnZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9iYWRnZS91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9icmVhZGNydW1iL0JyZWFkY3J1bWIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvYnJlYWRjcnVtYi9CcmVhZGNydW1iSXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9icmVhZGNydW1iL0JyZWFkY3J1bWJTZXBhcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvYnJlYWRjcnVtYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9idXR0b24vTG9hZGluZ0ljb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvYnV0dG9uL2J1dHRvbi1ncm91cC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9idXR0b24vYnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2J1dHRvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9jYWxlbmRhci9IZWFkZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvY2FsZW5kYXIvZ2VuZXJhdGVDYWxlbmRhci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9jYWxlbmRhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9jYWxlbmRhci9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvY2FyZC9HcmlkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NhcmQvTWV0YS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9jYXJkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2Nhcm91c2VsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2Nhc2NhZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NoZWNrYm94L0NoZWNrYm94LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NoZWNrYm94L0dyb3VwLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NoZWNrYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NvbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9jb2xsYXBzZS9Db2xsYXBzZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9jb2xsYXBzZS9Db2xsYXBzZVBhbmVsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NvbGxhcHNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NvbGxhcHNlL29wZW5BbmltYXRpb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvY29tbWVudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvY29uZmlnLXByb3ZpZGVyL2NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvY29uZmlnLXByb3ZpZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NvbmZpZy1wcm92aWRlci9yZW5kZXJFbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9kYXRlLXBpY2tlci9QaWNrZXJCdXR0b24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGF0ZS1waWNrZXIvUGlja2VyVGFnLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2RhdGUtcGlja2VyL2dlbmVyYXRlUGlja2VyL2dlbmVyYXRlUmFuZ2VQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGF0ZS1waWNrZXIvZ2VuZXJhdGVQaWNrZXIvZ2VuZXJhdGVTaW5nbGVQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGF0ZS1waWNrZXIvZ2VuZXJhdGVQaWNrZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGF0ZS1waWNrZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGF0ZS1waWNrZXIvbG9jYWxlL2VuX1VTLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2RhdGUtcGlja2VyL3V0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGVzY3JpcHRpb25zL0NlbGwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGVzY3JpcHRpb25zL0l0ZW0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGVzY3JpcHRpb25zL1Jvdy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9kZXNjcmlwdGlvbnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGl2aWRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9kcmF3ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZHJvcGRvd24vZHJvcGRvd24tYnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2Ryb3Bkb3duL2Ryb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2Ryb3Bkb3duL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2VtcHR5L2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2VtcHR5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2VtcHR5L3NpbXBsZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9mb3JtL0Zvcm0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZm9ybS9Gb3JtSXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9mb3JtL0Zvcm1JdGVtSW5wdXQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZm9ybS9Gb3JtSXRlbUxhYmVsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2Zvcm0vRm9ybUxpc3QuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZm9ybS9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2Zvcm0vaG9va3MvdXNlQ2FjaGVFcnJvcnMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZm9ybS9ob29rcy91c2VGb3JtLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2Zvcm0vaG9va3MvdXNlRnJhbWVTdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9mb3JtL2hvb2tzL3VzZUl0ZW1SZWYuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZm9ybS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9mb3JtL3V0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZ3JpZC9Sb3dDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2dyaWQvY29sLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2dyaWQvaG9va3MvdXNlQnJlYWtwb2ludC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9ncmlkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2dyaWQvcm93LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2ltYWdlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2lucHV0LW51bWJlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9pbnB1dC9DbGVhcmFibGVMYWJlbGVkSW5wdXQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvaW5wdXQvR3JvdXAuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvaW5wdXQvSW5wdXQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvaW5wdXQvUGFzc3dvcmQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvaW5wdXQvU2VhcmNoLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2lucHV0L1RleHRBcmVhLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2lucHV0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2xheW91dC9TaWRlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9sYXlvdXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbGF5b3V0L2xheW91dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9saXN0L0l0ZW0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9sb2NhbGUtcHJvdmlkZXIvTG9jYWxlUmVjZWl2ZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbG9jYWxlLXByb3ZpZGVyL2NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbG9jYWxlLXByb3ZpZGVyL2RlZmF1bHQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbG9jYWxlLXByb3ZpZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2xvY2FsZS9kZWZhdWx0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2xvY2FsZS9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9tZW50aW9ucy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9tZW51L01lbnVDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL21lbnUvTWVudUl0ZW0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbWVudS9TdWJNZW51LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL21lbnUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbWVzc2FnZS9ob29rcy91c2VNZXNzYWdlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL21lc3NhZ2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbW9kYWwvQWN0aW9uQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL21vZGFsL0NvbmZpcm1EaWFsb2cuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbW9kYWwvTW9kYWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbW9kYWwvY29uZmlybS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9tb2RhbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9tb2RhbC9sb2NhbGUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbW9kYWwvdXNlTW9kYWwvSG9va01vZGFsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL21vZGFsL3VzZU1vZGFsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL25vdGlmaWNhdGlvbi9ob29rcy91c2VOb3RpZmljYXRpb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbm90aWZpY2F0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3BhZ2UtaGVhZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3BhZ2luYXRpb24vTWluaVNlbGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9wYWdpbmF0aW9uL1BhZ2luYXRpb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvcGFnaW5hdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9wb3Bjb25maXJtL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3BvcG92ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvcHJvZ3Jlc3MvQ2lyY2xlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3Byb2dyZXNzL0xpbmUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvcHJvZ3Jlc3MvU3RlcHMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvcHJvZ3Jlc3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvcHJvZ3Jlc3MvcHJvZ3Jlc3MuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvcHJvZ3Jlc3MvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvcmFkaW8vY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9yYWRpby9ncm91cC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9yYWRpby9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9yYWRpby9yYWRpby5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9yYWRpby9yYWRpb0J1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9yYXRlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3Jlc3VsdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9yZXN1bHQvbm9Gb3VuZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9yZXN1bHQvc2VydmVyRXJyb3IuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvcmVzdWx0L3VuYXV0aG9yaXplZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9yb3cvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvc2VsZWN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3NlbGVjdC91dGlscy9pY29uVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9za2VsZXRvbi9BdmF0YXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvc2tlbGV0b24vQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3NrZWxldG9uL0VsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvc2tlbGV0b24vSW1hZ2UuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvc2tlbGV0b24vSW5wdXQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvc2tlbGV0b24vUGFyYWdyYXBoLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3NrZWxldG9uL1NrZWxldG9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3NrZWxldG9uL1RpdGxlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3NrZWxldG9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3NsaWRlci9TbGlkZXJUb29sdGlwLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3NsaWRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9zcGFjZS9JdGVtLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3NwYWNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3NwaW4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvc3RhdGlzdGljL0NvdW50ZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9zdGF0aXN0aWMvTnVtYmVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3N0YXRpc3RpYy9TdGF0aXN0aWMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvc3RhdGlzdGljL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3N0YXRpc3RpYy91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9zdGVwcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9zd2l0Y2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvQ29sdW1uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL0NvbHVtbkdyb3VwLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL0V4cGFuZEljb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvVGFibGUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlRmlsdGVyL0ZpbHRlckRyb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZUZpbHRlci9GaWx0ZXJXcmFwcGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZUZpbHRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9ob29rcy91c2VMYXp5S1ZNYXAuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlUGFnaW5hdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9ob29rcy91c2VTZWxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlU29ydGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZVRpdGxlQ29sdW1ucy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGFnL0NoZWNrYWJsZVRhZy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGltZS1waWNrZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGltZS1waWNrZXIvbG9jYWxlL2VuX1VTLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RpbWVsaW5lL1RpbWVsaW5lLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RpbWVsaW5lL1RpbWVsaW5lSXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90aW1lbGluZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90b29sdGlwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3Rvb2x0aXAvcGxhY2VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90cmFuc2Zlci9MaXN0Qm9keS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90cmFuc2Zlci9MaXN0SXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90cmFuc2Zlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90cmFuc2Zlci9saXN0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RyYW5zZmVyL29wZXJhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90cmFuc2Zlci9zZWFyY2guanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdHJlZS1zZWxlY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdHJlZS9EaXJlY3RvcnlUcmVlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RyZWUvVHJlZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90cmVlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3RyZWUvdXRpbHMvZGljdFV0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdHJlZS91dGlscy9pY29uVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90eXBvZ3JhcGh5L0Jhc2UuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdHlwb2dyYXBoeS9FZGl0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90eXBvZ3JhcGh5L0xpbmsuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdHlwb2dyYXBoeS9QYXJhZ3JhcGguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdHlwb2dyYXBoeS9UZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3R5cG9ncmFwaHkvVGl0bGUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdHlwb2dyYXBoeS9UeXBvZ3JhcGh5LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3R5cG9ncmFwaHkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdHlwb2dyYXBoeS91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3VwbG9hZC9EcmFnZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3VwbG9hZC9VcGxvYWQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdXBsb2FkL1VwbG9hZExpc3QuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdXBsb2FkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3VwbG9hZC91c2VGcmVzaFN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3VwbG9hZC91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi92ZXJzaW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL3ZlcnNpb24vdmVyc2lvbi5qcyIsIm5vZGVfbW9kdWxlcy9hcnJheS10cmVlLWZpbHRlci9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYXN5bmMtdmFsaWRhdG9yL2Rpc3Qtbm9kZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXB1dGUtc2Nyb2xsLWludG8tdmlldy9kaXN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcHktdG8tY2xpcGJvYXJkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RvbS1hbGlnbi9kaXN0LW5vZGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MvZGlzdC9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy5janMuanMiLCJub2RlX21vZHVsZXMvaW5zZXJ0LWNzcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qc29uMm1xL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fTGlzdENhY2hlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwQ2FjaGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0Q2FjaGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TdGFjay5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1VpbnQ4QXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19XZWFrTWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlGaWx0ZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVB1c2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVNvbWUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVNpemUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0QWxsS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsRGVlcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZXBlYXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2xpY2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RTbGljZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcmVKc0RhdGEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVQYWRkaW5nLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxBcnJheXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEJ5VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxPYmplY3RzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldEFsbEtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXBEYXRhLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzVW5pY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXlhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNNYXNrZWQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwVG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUFkZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrQ2xlYXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0RlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja1NldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1NpemUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlU2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3VuaWNvZGVUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJndW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzRXF1YWwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9ub3cuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3BhZEVuZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvcGFkU3RhcnQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkZhbHNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC90b0Zpbml0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdG9JbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC90b051bWJlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbWluaS1zdG9yZS9janMvUHJvdmlkZXIuanMiLCJub2RlX21vZHVsZXMvbWluaS1zdG9yZS9janMvY29ubmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9taW5pLXN0b3JlL2Nqcy9jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvbWluaS1zdG9yZS9janMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbW9tZW50L21vbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9vbWl0LmpzL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wZXJmb3JtYW5jZS1ub3cvbGliL3BlcmZvcm1hbmNlLW5vdy5qcyIsIm5vZGVfbW9kdWxlcy9yYWYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtYWxpZ24vbGliL0FsaWduLmpzIiwibm9kZV9tb2R1bGVzL3JjLWFsaWduL2xpYi9ob29rcy91c2VCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvcmMtYWxpZ24vbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWFsaWduL2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLWFuaW1hdGUvbGliL0FuaW1hdGUuanMiLCJub2RlX21vZHVsZXMvcmMtYW5pbWF0ZS9saWIvQW5pbWF0ZUNoaWxkLmpzIiwibm9kZV9tb2R1bGVzL3JjLWFuaW1hdGUvbGliL0NoaWxkcmVuVXRpbHMuanMiLCJub2RlX21vZHVsZXMvcmMtYW5pbWF0ZS9saWIvdXRpbC9hbmltYXRlLmpzIiwibm9kZV9tb2R1bGVzL3JjLWFuaW1hdGUvbm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL3Vuc2FmZUxpZmVjeWNsZXNQb2x5ZmlsbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jYXNjYWRlci9saWIvQ2FzY2FkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtY2FzY2FkZXIvbGliL01lbnVzLmpzIiwibm9kZV9tb2R1bGVzL3JjLWNhc2NhZGVyL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jYXNjYWRlci9saWIvcGxhY2VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jYXNjYWRlci9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvcmMtY2hlY2tib3gvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWNvbGxhcHNlL2xpYi9Db2xsYXBzZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jb2xsYXBzZS9saWIvUGFuZWwuanMiLCJub2RlX21vZHVsZXMvcmMtY29sbGFwc2UvbGliL1BhbmVsQ29udGVudC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jb2xsYXBzZS9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtY29sbGFwc2UvbGliL29wZW5BbmltYXRpb25GYWN0b3J5LmpzIiwibm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9saWIvRGlhbG9nLmpzIiwibm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9saWIvRGlhbG9nV3JhcC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kaWFsb2cvbGliL0xhenlSZW5kZXJCb3guanMiLCJub2RlX21vZHVsZXMvcmMtZGlhbG9nL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcmF3ZXIvbGliL0RyYXdlckNoaWxkLmpzIiwibm9kZV9tb2R1bGVzL3JjLWRyYXdlci9saWIvRHJhd2VyV3JhcHBlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcmF3ZXIvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWRyYXdlci9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvcmMtZHJvcGRvd24vbGliL0Ryb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL3JjLWRyb3Bkb3duL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcm9wZG93bi9saWIvcGxhY2VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2xpYi9GaWVsZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2xpYi9GaWVsZENvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9saWIvRm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2xpYi9Gb3JtQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2xpYi9MaXN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vbGliL3VzZUZvcm0uanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9saWIvdXRpbHMvTmFtZU1hcC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2xpYi91dGlscy9hc3luY1V0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9saWIvdXRpbHMvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9saWIvdXRpbHMvdHlwZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9saWIvdXRpbHMvdmFsaWRhdGVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vbGliL3V0aWxzL3ZhbHVlVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbWFnZS9saWIvSW1hZ2UuanMiLCJub2RlX21vZHVsZXMvcmMtaW1hZ2UvbGliL1ByZXZpZXcuanMiLCJub2RlX21vZHVsZXMvcmMtaW1hZ2UvbGliL2dldEZpeFNjYWxlRWxlVHJhbnNQb3NpdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbWFnZS9saWIvaG9va3MvdXNlRnJhbWVTZXRTdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbWFnZS9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtaW5wdXQtbnVtYmVyL2xpYi9JbnB1dE51bWJlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnRpb25zL2xpYi9Ecm9wZG93bk1lbnUuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudGlvbnMvbGliL0tleXdvcmRUcmlnZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnRpb25zL2xpYi9NZW50aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW50aW9ucy9saWIvTWVudGlvbnNDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnRpb25zL2xpYi9PcHRpb24uanMiLCJub2RlX21vZHVsZXMvcmMtbWVudGlvbnMvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnRpb25zL2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvbGliL0RPTVdyYXAuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9saWIvRGl2aWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2xpYi9NZW51LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvbGliL01lbnVJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvbGliL01lbnVJdGVtR3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9saWIvU3ViTWVudS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2xpYi9TdWJQb3B1cE1lbnUuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9saWIvcGxhY2VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvbGliL3V0aWxzL2lzTW9iaWxlLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvbGliL3V0aWxzL2xlZ2FjeVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2xpYi9DU1NNb3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2xpYi9DU1NNb3Rpb25MaXN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9saWIvRG9tV3JhcHBlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vbGliL2hvb2tzL3VzZURvbU1vdGlvbkV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vbGliL2hvb2tzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QuanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2xpYi9ob29rcy91c2VOZXh0RnJhbWUuanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2xpYi9ob29rcy91c2VTdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vbGliL2hvb2tzL3VzZVN0YXR1cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vbGliL2hvb2tzL3VzZVN0ZXBRdWV1ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9saWIvaW50ZXJmYWNlLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9saWIvdXRpbC9kaWZmLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9saWIvdXRpbC9tb3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmMtbm90aWZpY2F0aW9uL2xpYi9Ob3RpY2UuanMiLCJub2RlX21vZHVsZXMvcmMtbm90aWZpY2F0aW9uL2xpYi9Ob3RpZmljYXRpb24uanMiLCJub2RlX21vZHVsZXMvcmMtbm90aWZpY2F0aW9uL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1ub3RpZmljYXRpb24vbGliL3VzZU5vdGlmaWNhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1wYWdpbmF0aW9uL2xpYi9LZXlDb2RlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vbGliL09wdGlvbnMuanMiLCJub2RlX21vZHVsZXMvcmMtcGFnaW5hdGlvbi9saWIvUGFnZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGFnaW5hdGlvbi9saWIvUGFnaW5hdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1wYWdpbmF0aW9uL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1wYWdpbmF0aW9uL2xpYi9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvcmMtcGFnaW5hdGlvbi9saWIvbG9jYWxlL3poX0NOLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvUGFuZWxDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvUGlja2VyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvUGlja2VyUGFuZWwuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9QaWNrZXJUcmlnZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvUmFuZ2VDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvUmFuZ2VQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9nZW5lcmF0ZS9tb21lbnQuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9ob29rcy91c2VDZWxsQ2xhc3NOYW1lLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvaG9va3MvdXNlSG92ZXJWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL2hvb2tzL3VzZVBpY2tlcklucHV0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvaG9va3MvdXNlUmFuZ2VEaXNhYmxlZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL2hvb2tzL3VzZVJhbmdlVmlld0RhdGVzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvaG9va3MvdXNlVGV4dFZhbHVlTWFwcGluZy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL2hvb2tzL3VzZVZhbHVlVGV4dHMuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL2xvY2FsZS9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL3BhbmVscy9EYXRlUGFuZWwvRGF0ZUJvZHkuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvRGF0ZVBhbmVsL0RhdGVIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvRGF0ZVBhbmVsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvcGFuZWxzL0RhdGV0aW1lUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvRGVjYWRlUGFuZWwvRGVjYWRlQm9keS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL3BhbmVscy9EZWNhZGVQYW5lbC9EZWNhZGVIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvRGVjYWRlUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvSGVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvcGFuZWxzL01vbnRoUGFuZWwvTW9udGhCb2R5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvcGFuZWxzL01vbnRoUGFuZWwvTW9udGhIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvTW9udGhQYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL3BhbmVscy9QYW5lbEJvZHkuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvUXVhcnRlclBhbmVsL1F1YXJ0ZXJCb2R5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvcGFuZWxzL1F1YXJ0ZXJQYW5lbC9RdWFydGVySGVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvcGFuZWxzL1F1YXJ0ZXJQYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL3BhbmVscy9UaW1lUGFuZWwvVGltZUJvZHkuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvVGltZVBhbmVsL1RpbWVIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvVGltZVBhbmVsL1RpbWVVbml0Q29sdW1uLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvcGFuZWxzL1RpbWVQYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL3BhbmVscy9XZWVrUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9wYW5lbHMvWWVhclBhbmVsL1llYXJCb2R5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvcGFuZWxzL1llYXJQYW5lbC9ZZWFySGVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvcGFuZWxzL1llYXJQYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL3V0aWxzL2RhdGVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvdXRpbHMvZ2V0RXh0cmFGb290ZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi91dGlscy9nZXRSYW5nZXMuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi91dGlscy9taXNjVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL3V0aWxzL3RpbWVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9saWIvdXRpbHMvdWlVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXByb2dyZXNzL2xpYi9DaXJjbGUuanMiLCJub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvbGliL0xpbmUuanMiLCJub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvbGliL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1wcm9ncmVzcy9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcmF0ZS9saWIvUmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1yYXRlL2xpYi9TdGFyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXJhdGUvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXJhdGUvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtcmVzaXplLW9ic2VydmVyL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL09wdEdyb3VwLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9saWIvT3B0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9saWIvT3B0aW9uTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL1NlbGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL1NlbGVjdFRyaWdnZXIuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2xpYi9TZWxlY3Rvci9JbnB1dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL1NlbGVjdG9yL011bHRpcGxlU2VsZWN0b3IuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2xpYi9TZWxlY3Rvci9TaW5nbGVTZWxlY3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL1NlbGVjdG9yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9saWIvVHJhbnNCdG4uanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2xpYi9nZW5lcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL2hvb2tzL3VzZUNhY2hlRGlzcGxheVZhbHVlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9saWIvaG9va3MvdXNlQ2FjaGVPcHRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9saWIvaG9va3MvdXNlRGVsYXlSZXNldC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL2hvb2tzL3VzZUxheW91dEVmZmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL2hvb2tzL3VzZUxvY2suanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2xpYi9ob29rcy91c2VTZWxlY3RUcmlnZ2VyQ29udHJvbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9saWIvaW50ZXJmYWNlL2dlbmVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvbGliL3V0aWxzL2NvbW1vblV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2xpYi91dGlscy9sZWdhY3lVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9saWIvdXRpbHMvdmFsdWVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9saWIvdXRpbHMvd2FybmluZ1Byb3BzVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvbGliL0hhbmRsZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvbGliL1JhbmdlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9saWIvU2xpZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9saWIvY29tbW9uL01hcmtzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9saWIvY29tbW9uL1N0ZXBzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9saWIvY29tbW9uL1RyYWNrLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9saWIvY29tbW9uL2NyZWF0ZVNsaWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvbGliL2NyZWF0ZVNsaWRlcldpdGhUb29sdGlwLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zdGVwcy9saWIvU3RlcC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zdGVwcy9saWIvU3RlcHMuanMiLCJub2RlX21vZHVsZXMvcmMtc3RlcHMvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXN3aXRjaC9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvbGliL0JvZHkvQm9keVJvdy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvQm9keS9FeHBhbmRlZFJvdy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvQm9keS9NZWFzdXJlQ2VsbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvQm9keS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvQ2VsbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvQ29sR3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvbGliL0Zvb3Rlci9DZWxsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi9Gb290ZXIvUm93LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi9Gb290ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvbGliL0hlYWRlci9GaXhlZEhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvSGVhZGVyL0hlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvSGVhZGVyL0hlYWRlclJvdy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvbGliL1RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi9jb250ZXh0L0JvZHlDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi9jb250ZXh0L1Jlc2l6ZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvbGliL2NvbnRleHQvVGFibGVDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi9ob29rcy91c2VDb2x1bW5zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi9ob29rcy91c2VGcmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvaG9va3MvdXNlU3RpY2t5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi9ob29rcy91c2VTdGlja3lPZmZzZXRzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9saWIvc3RpY2t5U2Nyb2xsQmFyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi9zdWdhci9Db2x1bW4uanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvbGliL3N1Z2FyL0NvbHVtbkdyb3VwLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi91dGlscy9leHBhbmRVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi91dGlscy9maXhVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi91dGlscy9sZWdhY3lVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2xpYi91dGlscy92YWx1ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9saWIvVGFiQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2xpYi9UYWJOYXZMaXN0L0FkZEJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2xpYi9UYWJOYXZMaXN0L09wZXJhdGlvbk5vZGUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9saWIvVGFiTmF2TGlzdC9UYWJOb2RlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYnMvbGliL1RhYk5hdkxpc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9saWIvVGFiUGFuZWxMaXN0L1RhYlBhbmUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9saWIvVGFiUGFuZWxMaXN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYnMvbGliL1RhYnMuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9saWIvaG9va3MvdXNlT2Zmc2V0cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2xpYi9ob29rcy91c2VSYWYuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9saWIvaG9va3MvdXNlUmVmcy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2xpYi9ob29rcy91c2VTeW5jU3RhdGUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9saWIvaG9va3MvdXNlVG91Y2hNb3ZlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYnMvbGliL2hvb2tzL3VzZVZpc2libGVSYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10ZXh0YXJlYS9saWIvUmVzaXphYmxlVGV4dEFyZWEuanMiLCJub2RlX21vZHVsZXMvcmMtdGV4dGFyZWEvbGliL2NhbGN1bGF0ZU5vZGVIZWlnaHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGV4dGFyZWEvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRvb2x0aXAvbGliL0NvbnRlbnQuanMiLCJub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9saWIvVG9vbHRpcC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10b29sdGlwL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10b29sdGlwL2xpYi9wbGFjZW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUtc2VsZWN0L2xpYi9Db250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUtc2VsZWN0L2xpYi9PcHRpb25MaXN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUtc2VsZWN0L2xpYi9UcmVlTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9saWIvVHJlZVNlbGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9saWIvaG9va3MvdXNlS2V5VmFsdWVNYXAuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS1zZWxlY3QvbGliL2hvb2tzL3VzZUtleVZhbHVlTWFwcGluZy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9saWIvaG9va3MvdXNlU2VsZWN0VmFsdWVzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUtc2VsZWN0L2xpYi9ob29rcy91c2VUcmVlRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS1zZWxlY3QvbGliL3V0aWxzL2xlZ2FjeVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS1zZWxlY3QvbGliL3V0aWxzL3N0cmF0ZWd5VXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9saWIvdXRpbHMvdmFsdWVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUtc2VsZWN0L2xpYi91dGlscy93YXJuaW5nUHJvcHNVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvbGliL0luZGVudC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2xpYi9Nb3Rpb25UcmVlTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2xpYi9Ob2RlTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2xpYi9UcmVlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvbGliL1RyZWVOb2RlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvbGliL2NvbnRleHRUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvbGliL3V0aWxzL2NvbmR1Y3RVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvbGliL3V0aWxzL2RpZmZVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvbGliL3V0aWxzL3RyZWVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvbGliL1BvcHVwL01hc2suanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9saWIvUG9wdXAvUG9wdXBJbm5lci5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2xpYi9Qb3B1cC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2xpYi9Qb3B1cC91c2VTdHJldGNoU3R5bGUuanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9saWIvUG9wdXAvdXNlVmlzaWJsZVN0YXR1cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2xpYi9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvbGliL3V0aWxzL2FsaWduVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2xpYi91dGlscy9sZWdhY3lVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXVwbG9hZC9saWIvQWpheFVwbG9hZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXVwbG9hZC9saWIvVXBsb2FkLmpzIiwibm9kZV9tb2R1bGVzL3JjLXVwbG9hZC9saWIvYXR0ci1hY2NlcHQuanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11cGxvYWQvbGliL3JlcXVlc3QuanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2xpYi90cmF2ZXJzZUZpbGVUcmVlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXVwbG9hZC9saWIvdWlkLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL0NoaWxkcmVuL3RvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvRG9tL2FkZEV2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvRG9tL2NhblVzZURvbS5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2xpYi9Eb20vY29udGFpbnMuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvRG9tL2Nzcy5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2xpYi9Eb20vZmluZERPTU5vZGUuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvRG9tL2lzVmlzaWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2xpYi9LZXlDb2RlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL1BvcnRhbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2xpYi9Qb3J0YWxXcmFwcGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL2NyZWF0ZUNoYWluZWRGdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2xpYi9nZXRTY3JvbGxCYXJTaXplLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL2hvb2tzL3VzZU1lbW8uanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvaG9va3MvdXNlTWVyZ2VkU3RhdGUuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvcGlja0F0dHJzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL3JhZi5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2xpYi9yZWYuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvc2V0U3R5bGUuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvc3dpdGNoU2Nyb2xsaW5nRWZmZWN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL3V0aWxzL2dldC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2xpYi91dGlscy9zZXQuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvd2FybmluZy5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvbGliL0ZpbGxlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvbGliL0l0ZW0uanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2xpYi9MaXN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9saWIvU2Nyb2xsQmFyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9saWIvaG9va3MvdXNlQ2hpbGRyZW4uanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2xpYi9ob29rcy91c2VEaWZmSXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvbGliL2hvb2tzL3VzZUZyYW1lV2hlZWwuanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2xpYi9ob29rcy91c2VIZWlnaHRzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9saWIvaG9va3MvdXNlTW9iaWxlVG91Y2hNb3ZlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9saWIvaG9va3MvdXNlT3JpZ2luU2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9saWIvaG9va3MvdXNlU2Nyb2xsVG8uanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvbGliL3V0aWxzL0NhY2hlTWFwLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9saWIvdXRpbHMvYWxnb3JpdGhtVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvbGliL3V0aWxzL2lzRmlyZWZveC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIm5vZGVfbW9kdWxlcy9yZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwvZGlzdC9SZXNpemVPYnNlcnZlci5qcyIsIm5vZGVfbW9kdWxlcy9zY3JvbGwtaW50by12aWV3LWlmLW5lZWRlZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaW5nLWNvbnZlcnQvY2FtZWwyaHlwaGVuLmpzIiwibm9kZV9tb2R1bGVzL3Rpbnljb2xvcjIvdGlueWNvbG9yLmpzIiwibm9kZV9tb2R1bGVzL3RvZ2dsZS1zZWxlY3Rpb24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvd2FybmluZy93YXJuaW5nLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25SQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN1FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3g2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9VQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNobUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9NQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0VEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbGlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9kQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0akJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0V0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcDZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNXpDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2aUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDck5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdGVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbG1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDeGhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdHlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeldBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzM0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeGJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6V0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdmFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDNUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbnJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDOWRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3gvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN0M0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNscEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDak1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Z0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDNU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25NQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDelJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxaUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOXhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0bkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNyTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM1dUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDeDZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM3FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIHRpbnljb2xvciA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCd0aW55Y29sb3IyJykpO1xuXG52YXIgaHVlU3RlcCA9IDI7IC8vIOiJsuebuOmYtuair1xuXG52YXIgc2F0dXJhdGlvblN0ZXAgPSAwLjE2OyAvLyDppbHlkozluqbpmLbmoq/vvIzmtYXoibLpg6jliIZcblxudmFyIHNhdHVyYXRpb25TdGVwMiA9IDAuMDU7IC8vIOmlseWSjOW6pumYtuair++8jOa3seiJsumDqOWIhlxuXG52YXIgYnJpZ2h0bmVzc1N0ZXAxID0gMC4wNTsgLy8g5Lqu5bqm6Zi25qKv77yM5rWF6Imy6YOo5YiGXG5cbnZhciBicmlnaHRuZXNzU3RlcDIgPSAwLjE1OyAvLyDkuq7luqbpmLbmoq/vvIzmt7HoibLpg6jliIZcblxudmFyIGxpZ2h0Q29sb3JDb3VudCA9IDU7IC8vIOa1heiJsuaVsOmHj++8jOS4u+iJsuS4ilxuXG52YXIgZGFya0NvbG9yQ291bnQgPSA0OyAvLyDmt7HoibLmlbDph4/vvIzkuLvoibLkuItcbi8vIOaal+iJsuS4u+mimOminOiJsuaYoOWwhOWFs+ezu+ihqFxuXG52YXIgZGFya0NvbG9yTWFwID0gW3tcbiAgaW5kZXg6IDcsXG4gIG9wYWNpdHk6IDAuMTVcbn0sIHtcbiAgaW5kZXg6IDYsXG4gIG9wYWNpdHk6IDAuMjVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIG9wYWNpdHk6IDAuM1xufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC40NVxufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC42NVxufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC44NVxufSwge1xuICBpbmRleDogNCxcbiAgb3BhY2l0eTogMC45XG59LCB7XG4gIGluZGV4OiAzLFxuICBvcGFjaXR5OiAwLjk1XG59LCB7XG4gIGluZGV4OiAyLFxuICBvcGFjaXR5OiAwLjk3XG59LCB7XG4gIGluZGV4OiAxLFxuICBvcGFjaXR5OiAwLjk4XG59XTtcblxuZnVuY3Rpb24gZ2V0SHVlKGhzdiwgaSwgbGlnaHQpIHtcbiAgdmFyIGh1ZTsgLy8g5qC55o2u6Imy55u45LiN5ZCM77yM6Imy55u46L2s5ZCR5LiN5ZCMXG5cbiAgaWYgKE1hdGgucm91bmQoaHN2LmgpID49IDYwICYmIE1hdGgucm91bmQoaHN2LmgpIDw9IDI0MCkge1xuICAgIGh1ZSA9IGxpZ2h0ID8gTWF0aC5yb3VuZChoc3YuaCkgLSBodWVTdGVwICogaSA6IE1hdGgucm91bmQoaHN2LmgpICsgaHVlU3RlcCAqIGk7XG4gIH0gZWxzZSB7XG4gICAgaHVlID0gbGlnaHQgPyBNYXRoLnJvdW5kKGhzdi5oKSArIGh1ZVN0ZXAgKiBpIDogTWF0aC5yb3VuZChoc3YuaCkgLSBodWVTdGVwICogaTtcbiAgfVxuXG4gIGlmIChodWUgPCAwKSB7XG4gICAgaHVlICs9IDM2MDtcbiAgfSBlbHNlIGlmIChodWUgPj0gMzYwKSB7XG4gICAgaHVlIC09IDM2MDtcbiAgfVxuXG4gIHJldHVybiBodWU7XG59XG5cbmZ1bmN0aW9uIGdldFNhdHVyYXRpb24oaHN2LCBpLCBsaWdodCkge1xuICAvLyBncmV5IGNvbG9yIGRvbid0IGNoYW5nZSBzYXR1cmF0aW9uXG4gIGlmIChoc3YuaCA9PT0gMCAmJiBoc3YucyA9PT0gMCkge1xuICAgIHJldHVybiBoc3YucztcbiAgfVxuXG4gIHZhciBzYXR1cmF0aW9uO1xuXG4gIGlmIChsaWdodCkge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyAtIHNhdHVyYXRpb25TdGVwICogaTtcbiAgfSBlbHNlIGlmIChpID09PSBkYXJrQ29sb3JDb3VudCkge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyArIHNhdHVyYXRpb25TdGVwO1xuICB9IGVsc2Uge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyArIHNhdHVyYXRpb25TdGVwMiAqIGk7XG4gIH0gLy8g6L6555WM5YC85L+u5q2jXG5cblxuICBpZiAoc2F0dXJhdGlvbiA+IDEpIHtcbiAgICBzYXR1cmF0aW9uID0gMTtcbiAgfSAvLyDnrKzkuIDmoLznmoQgcyDpmZDliLblnKggMC4wNi0wLjEg5LmL6Ze0XG5cblxuICBpZiAobGlnaHQgJiYgaSA9PT0gbGlnaHRDb2xvckNvdW50ICYmIHNhdHVyYXRpb24gPiAwLjEpIHtcbiAgICBzYXR1cmF0aW9uID0gMC4xO1xuICB9XG5cbiAgaWYgKHNhdHVyYXRpb24gPCAwLjA2KSB7XG4gICAgc2F0dXJhdGlvbiA9IDAuMDY7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyKHNhdHVyYXRpb24udG9GaXhlZCgyKSk7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKGhzdiwgaSwgbGlnaHQpIHtcbiAgdmFyIHZhbHVlO1xuXG4gIGlmIChsaWdodCkge1xuICAgIHZhbHVlID0gaHN2LnYgKyBicmlnaHRuZXNzU3RlcDEgKiBpO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gaHN2LnYgLSBicmlnaHRuZXNzU3RlcDIgKiBpO1xuICB9XG5cbiAgaWYgKHZhbHVlID4gMSkge1xuICAgIHZhbHVlID0gMTtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9GaXhlZCgyKSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlKGNvbG9yKSB7XG4gIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHBhdHRlcm5zID0gW107XG4gIHZhciBwQ29sb3IgPSB0aW55Y29sb3IoY29sb3IpO1xuXG4gIGZvciAodmFyIGkgPSBsaWdodENvbG9yQ291bnQ7IGkgPiAwOyBpIC09IDEpIHtcbiAgICB2YXIgaHN2ID0gcENvbG9yLnRvSHN2KCk7XG4gICAgdmFyIGNvbG9yU3RyaW5nID0gdGlueWNvbG9yKHtcbiAgICAgIGg6IGdldEh1ZShoc3YsIGksIHRydWUpLFxuICAgICAgczogZ2V0U2F0dXJhdGlvbihoc3YsIGksIHRydWUpLFxuICAgICAgdjogZ2V0VmFsdWUoaHN2LCBpLCB0cnVlKVxuICAgIH0pLnRvSGV4U3RyaW5nKCk7XG4gICAgcGF0dGVybnMucHVzaChjb2xvclN0cmluZyk7XG4gIH1cblxuICBwYXR0ZXJucy5wdXNoKHBDb2xvci50b0hleFN0cmluZygpKTtcblxuICBmb3IgKHZhciBfaSA9IDE7IF9pIDw9IGRhcmtDb2xvckNvdW50OyBfaSArPSAxKSB7XG4gICAgdmFyIF9oc3YgPSBwQ29sb3IudG9Ic3YoKTtcblxuICAgIHZhciBfY29sb3JTdHJpbmcgPSB0aW55Y29sb3Ioe1xuICAgICAgaDogZ2V0SHVlKF9oc3YsIF9pKSxcbiAgICAgIHM6IGdldFNhdHVyYXRpb24oX2hzdiwgX2kpLFxuICAgICAgdjogZ2V0VmFsdWUoX2hzdiwgX2kpXG4gICAgfSkudG9IZXhTdHJpbmcoKTtcblxuICAgIHBhdHRlcm5zLnB1c2goX2NvbG9yU3RyaW5nKTtcbiAgfSAvLyBkYXJrIHRoZW1lIHBhdHRlcm5zXG5cblxuICBpZiAob3B0cy50aGVtZSA9PT0gJ2RhcmsnKSB7XG4gICAgcmV0dXJuIGRhcmtDb2xvck1hcC5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBpbmRleCA9IF9yZWYuaW5kZXgsXG4gICAgICAgICAgb3BhY2l0eSA9IF9yZWYub3BhY2l0eTtcbiAgICAgIHZhciBkYXJrQ29sb3JTdHJpbmcgPSB0aW55Y29sb3IubWl4KG9wdHMuYmFja2dyb3VuZENvbG9yIHx8ICcjMTQxNDE0JywgcGF0dGVybnNbaW5kZXhdLCBvcGFjaXR5ICogMTAwKS50b0hleFN0cmluZygpO1xuICAgICAgcmV0dXJuIGRhcmtDb2xvclN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwYXR0ZXJucztcbn1cblxudmFyIHByZXNldFByaW1hcnlDb2xvcnMgPSB7XG4gIHJlZDogJyNGNTIyMkQnLFxuICB2b2xjYW5vOiAnI0ZBNTQxQycsXG4gIG9yYW5nZTogJyNGQThDMTYnLFxuICBnb2xkOiAnI0ZBQUQxNCcsXG4gIHllbGxvdzogJyNGQURCMTQnLFxuICBsaW1lOiAnI0EwRDkxMScsXG4gIGdyZWVuOiAnIzUyQzQxQScsXG4gIGN5YW46ICcjMTNDMkMyJyxcbiAgYmx1ZTogJyMxODkwRkYnLFxuICBnZWVrYmx1ZTogJyMyRjU0RUInLFxuICBwdXJwbGU6ICcjNzIyRUQxJyxcbiAgbWFnZW50YTogJyNFQjJGOTYnLFxuICBncmV5OiAnIzY2NjY2Nidcbn07XG52YXIgcHJlc2V0UGFsZXR0ZXMgPSB7fTtcbnZhciBwcmVzZXREYXJrUGFsZXR0ZXMgPSB7fTtcbk9iamVjdC5rZXlzKHByZXNldFByaW1hcnlDb2xvcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBwcmVzZXRQYWxldHRlc1trZXldID0gZ2VuZXJhdGUocHJlc2V0UHJpbWFyeUNvbG9yc1trZXldKTtcbiAgcHJlc2V0UGFsZXR0ZXNba2V5XS5wcmltYXJ5ID0gcHJlc2V0UGFsZXR0ZXNba2V5XVs1XTsgLy8gZGFyayBwcmVzZXRQYWxldHRlc1xuXG4gIHByZXNldERhcmtQYWxldHRlc1trZXldID0gZ2VuZXJhdGUocHJlc2V0UHJpbWFyeUNvbG9yc1trZXldLCB7XG4gICAgdGhlbWU6ICdkYXJrJyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMTQxNDE0J1xuICB9KTtcbiAgcHJlc2V0RGFya1BhbGV0dGVzW2tleV0ucHJpbWFyeSA9IHByZXNldERhcmtQYWxldHRlc1trZXldWzVdO1xufSk7XG52YXIgcmVkID0gcHJlc2V0UGFsZXR0ZXMucmVkO1xudmFyIHZvbGNhbm8gPSBwcmVzZXRQYWxldHRlcy52b2xjYW5vO1xudmFyIGdvbGQgPSBwcmVzZXRQYWxldHRlcy5nb2xkO1xudmFyIG9yYW5nZSA9IHByZXNldFBhbGV0dGVzLm9yYW5nZTtcbnZhciB5ZWxsb3cgPSBwcmVzZXRQYWxldHRlcy55ZWxsb3c7XG52YXIgbGltZSA9IHByZXNldFBhbGV0dGVzLmxpbWU7XG52YXIgZ3JlZW4gPSBwcmVzZXRQYWxldHRlcy5ncmVlbjtcbnZhciBjeWFuID0gcHJlc2V0UGFsZXR0ZXMuY3lhbjtcbnZhciBibHVlID0gcHJlc2V0UGFsZXR0ZXMuYmx1ZTtcbnZhciBnZWVrYmx1ZSA9IHByZXNldFBhbGV0dGVzLmdlZWtibHVlO1xudmFyIHB1cnBsZSA9IHByZXNldFBhbGV0dGVzLnB1cnBsZTtcbnZhciBtYWdlbnRhID0gcHJlc2V0UGFsZXR0ZXMubWFnZW50YTtcbnZhciBncmV5ID0gcHJlc2V0UGFsZXR0ZXMuZ3JleTtcblxuZXhwb3J0cy5ibHVlID0gYmx1ZTtcbmV4cG9ydHMuY3lhbiA9IGN5YW47XG5leHBvcnRzLmdlZWtibHVlID0gZ2Vla2JsdWU7XG5leHBvcnRzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG5leHBvcnRzLmdvbGQgPSBnb2xkO1xuZXhwb3J0cy5ncmVlbiA9IGdyZWVuO1xuZXhwb3J0cy5ncmV5ID0gZ3JleTtcbmV4cG9ydHMubGltZSA9IGxpbWU7XG5leHBvcnRzLm1hZ2VudGEgPSBtYWdlbnRhO1xuZXhwb3J0cy5vcmFuZ2UgPSBvcmFuZ2U7XG5leHBvcnRzLnByZXNldERhcmtQYWxldHRlcyA9IHByZXNldERhcmtQYWxldHRlcztcbmV4cG9ydHMucHJlc2V0UGFsZXR0ZXMgPSBwcmVzZXRQYWxldHRlcztcbmV4cG9ydHMucHJlc2V0UHJpbWFyeUNvbG9ycyA9IHByZXNldFByaW1hcnlDb2xvcnM7XG5leHBvcnRzLnB1cnBsZSA9IHB1cnBsZTtcbmV4cG9ydHMucmVkID0gcmVkO1xuZXhwb3J0cy52b2xjYW5vID0gdm9sY2FubztcbmV4cG9ydHMueWVsbG93ID0geWVsbG93O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xudmFyIFNUQVJUX0VWRU5UX05BTUVfTUFQID0ge1xuICB0cmFuc2l0aW9uc3RhcnQ6IHtcbiAgICB0cmFuc2l0aW9uOiAndHJhbnNpdGlvbnN0YXJ0JyxcbiAgICBXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvblN0YXJ0JyxcbiAgICBNb3pUcmFuc2l0aW9uOiAnbW96VHJhbnNpdGlvblN0YXJ0JyxcbiAgICBPVHJhbnNpdGlvbjogJ29UcmFuc2l0aW9uU3RhcnQnLFxuICAgIG1zVHJhbnNpdGlvbjogJ01TVHJhbnNpdGlvblN0YXJ0J1xuICB9LFxuXG4gIGFuaW1hdGlvbnN0YXJ0OiB7XG4gICAgYW5pbWF0aW9uOiAnYW5pbWF0aW9uc3RhcnQnLFxuICAgIFdlYmtpdEFuaW1hdGlvbjogJ3dlYmtpdEFuaW1hdGlvblN0YXJ0JyxcbiAgICBNb3pBbmltYXRpb246ICdtb3pBbmltYXRpb25TdGFydCcsXG4gICAgT0FuaW1hdGlvbjogJ29BbmltYXRpb25TdGFydCcsXG4gICAgbXNBbmltYXRpb246ICdNU0FuaW1hdGlvblN0YXJ0J1xuICB9XG59O1xuXG52YXIgRU5EX0VWRU5UX05BTUVfTUFQID0ge1xuICB0cmFuc2l0aW9uZW5kOiB7XG4gICAgdHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnLFxuICAgIFdlYmtpdFRyYW5zaXRpb246ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICBNb3pUcmFuc2l0aW9uOiAnbW96VHJhbnNpdGlvbkVuZCcsXG4gICAgT1RyYW5zaXRpb246ICdvVHJhbnNpdGlvbkVuZCcsXG4gICAgbXNUcmFuc2l0aW9uOiAnTVNUcmFuc2l0aW9uRW5kJ1xuICB9LFxuXG4gIGFuaW1hdGlvbmVuZDoge1xuICAgIGFuaW1hdGlvbjogJ2FuaW1hdGlvbmVuZCcsXG4gICAgV2Via2l0QW5pbWF0aW9uOiAnd2Via2l0QW5pbWF0aW9uRW5kJyxcbiAgICBNb3pBbmltYXRpb246ICdtb3pBbmltYXRpb25FbmQnLFxuICAgIE9BbmltYXRpb246ICdvQW5pbWF0aW9uRW5kJyxcbiAgICBtc0FuaW1hdGlvbjogJ01TQW5pbWF0aW9uRW5kJ1xuICB9XG59O1xuXG52YXIgc3RhcnRFdmVudHMgPSBbXTtcbnZhciBlbmRFdmVudHMgPSBbXTtcblxuZnVuY3Rpb24gZGV0ZWN0RXZlbnRzKCkge1xuICB2YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBzdHlsZSA9IHRlc3RFbC5zdHlsZTtcblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgU1RBUlRfRVZFTlRfTkFNRV9NQVAuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSBFTkRfRVZFTlRfTkFNRV9NQVAuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgfVxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgU1RBUlRfRVZFTlRfTkFNRV9NQVAudHJhbnNpdGlvbnN0YXJ0LnRyYW5zaXRpb247XG4gICAgZGVsZXRlIEVORF9FVkVOVF9OQU1FX01BUC50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzKEVWRU5UX05BTUVfTUFQLCBldmVudHMpIHtcbiAgICBmb3IgKHZhciBiYXNlRXZlbnROYW1lIGluIEVWRU5UX05BTUVfTUFQKSB7XG4gICAgICBpZiAoRVZFTlRfTkFNRV9NQVAuaGFzT3duUHJvcGVydHkoYmFzZUV2ZW50TmFtZSkpIHtcbiAgICAgICAgdmFyIGJhc2VFdmVudHMgPSBFVkVOVF9OQU1FX01BUFtiYXNlRXZlbnROYW1lXTtcbiAgICAgICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIGJhc2VFdmVudHMpIHtcbiAgICAgICAgICBpZiAoc3R5bGVOYW1lIGluIHN0eWxlKSB7XG4gICAgICAgICAgICBldmVudHMucHVzaChiYXNlRXZlbnRzW3N0eWxlTmFtZV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvY2VzcyhTVEFSVF9FVkVOVF9OQU1FX01BUCwgc3RhcnRFdmVudHMpO1xuICBwcm9jZXNzKEVORF9FVkVOVF9OQU1FX01BUCwgZW5kRXZlbnRzKTtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZGV0ZWN0RXZlbnRzKCk7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudExpc3RlbmVyKSB7XG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xufVxuXG52YXIgVHJhbnNpdGlvbkV2ZW50cyA9IHtcbiAgLy8gU3RhcnQgZXZlbnRzXG4gIHN0YXJ0RXZlbnRzOiBzdGFydEV2ZW50cyxcblxuICBhZGRTdGFydEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZFN0YXJ0RXZlbnRMaXN0ZW5lcihub2RlLCBldmVudExpc3RlbmVyKSB7XG4gICAgaWYgKHN0YXJ0RXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LnNldFRpbWVvdXQoZXZlbnRMaXN0ZW5lciwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXJ0RXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHN0YXJ0RXZlbnQpIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgc3RhcnRFdmVudCwgZXZlbnRMaXN0ZW5lcik7XG4gICAgfSk7XG4gIH0sXG4gIHJlbW92ZVN0YXJ0RXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlU3RhcnRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgICBpZiAoc3RhcnRFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXJ0RXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHN0YXJ0RXZlbnQpIHtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgc3RhcnRFdmVudCwgZXZlbnRMaXN0ZW5lcik7XG4gICAgfSk7XG4gIH0sXG5cblxuICAvLyBFbmQgZXZlbnRzXG4gIGVuZEV2ZW50czogZW5kRXZlbnRzLFxuXG4gIGFkZEVuZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEVuZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnRMaXN0ZW5lcikge1xuICAgIGlmIChlbmRFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB3aW5kb3cuc2V0VGltZW91dChldmVudExpc3RlbmVyLCAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGVuZEV2ZW50KSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKG5vZGUsIGVuZEV2ZW50LCBldmVudExpc3RlbmVyKTtcbiAgICB9KTtcbiAgfSxcbiAgcmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudExpc3RlbmVyKSB7XG4gICAgaWYgKGVuZEV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGVuZEV2ZW50KSB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIGVuZEV2ZW50LCBldmVudExpc3RlbmVyKTtcbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gVHJhbnNpdGlvbkV2ZW50cztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQgPSB1bmRlZmluZWQ7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9FdmVudCA9IHJlcXVpcmUoJy4vRXZlbnQnKTtcblxudmFyIF9FdmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9FdmVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIGlzQ3NzQW5pbWF0aW9uU3VwcG9ydGVkID0gX0V2ZW50MlsnZGVmYXVsdCddLmVuZEV2ZW50cy5sZW5ndGggIT09IDA7XG52YXIgY2FwaXRhbFByZWZpeGVzID0gWydXZWJraXQnLCAnTW96JywgJ08nLFxuLy8gbXMgaXMgc3BlY2lhbCAuLi4uICFcbidtcyddO1xudmFyIHByZWZpeGVzID0gWyctd2Via2l0LScsICctbW96LScsICctby0nLCAnbXMtJywgJyddO1xuXG5mdW5jdGlvbiBnZXRTdHlsZVByb3BlcnR5KG5vZGUsIG5hbWUpIHtcbiAgLy8gb2xkIGZmIG5lZWQgbnVsbCwgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9nZXRDb21wdXRlZFN0eWxlXG4gIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpO1xuICB2YXIgcmV0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICByZXQgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHByZWZpeGVzW2ldICsgbmFtZSk7XG4gICAgaWYgKHJldCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGZpeEJyb3dzZXJCeVRpbWVvdXQobm9kZSkge1xuICBpZiAoaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQpIHtcbiAgICB2YXIgdHJhbnNpdGlvbkRlbGF5ID0gcGFyc2VGbG9hdChnZXRTdHlsZVByb3BlcnR5KG5vZGUsICd0cmFuc2l0aW9uLWRlbGF5JykpIHx8IDA7XG4gICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IHBhcnNlRmxvYXQoZ2V0U3R5bGVQcm9wZXJ0eShub2RlLCAndHJhbnNpdGlvbi1kdXJhdGlvbicpKSB8fCAwO1xuICAgIHZhciBhbmltYXRpb25EZWxheSA9IHBhcnNlRmxvYXQoZ2V0U3R5bGVQcm9wZXJ0eShub2RlLCAnYW5pbWF0aW9uLWRlbGF5JykpIHx8IDA7XG4gICAgdmFyIGFuaW1hdGlvbkR1cmF0aW9uID0gcGFyc2VGbG9hdChnZXRTdHlsZVByb3BlcnR5KG5vZGUsICdhbmltYXRpb24tZHVyYXRpb24nKSkgfHwgMDtcbiAgICB2YXIgdGltZSA9IE1hdGgubWF4KHRyYW5zaXRpb25EdXJhdGlvbiArIHRyYW5zaXRpb25EZWxheSwgYW5pbWF0aW9uRHVyYXRpb24gKyBhbmltYXRpb25EZWxheSk7XG4gICAgLy8gc29tZXRpbWVzLCBicm93c2VyIGJ1Z1xuICAgIG5vZGUucmNFbmRBbmltVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5yY0VuZEFuaW1UaW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmIChub2RlLnJjRW5kTGlzdGVuZXIpIHtcbiAgICAgICAgbm9kZS5yY0VuZExpc3RlbmVyKCk7XG4gICAgICB9XG4gICAgfSwgdGltZSAqIDEwMDAgKyAyMDApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFyQnJvd3NlckJ1Z1RpbWVvdXQobm9kZSkge1xuICBpZiAobm9kZS5yY0VuZEFuaW1UaW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KG5vZGUucmNFbmRBbmltVGltZW91dCk7XG4gICAgbm9kZS5yY0VuZEFuaW1UaW1lb3V0ID0gbnVsbDtcbiAgfVxufVxuXG52YXIgY3NzQW5pbWF0aW9uID0gZnVuY3Rpb24gY3NzQW5pbWF0aW9uKG5vZGUsIHRyYW5zaXRpb25OYW1lLCBlbmRDYWxsYmFjaykge1xuICB2YXIgbmFtZUlzT2JqID0gKHR5cGVvZiB0cmFuc2l0aW9uTmFtZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodHJhbnNpdGlvbk5hbWUpKSA9PT0gJ29iamVjdCc7XG4gIHZhciBjbGFzc05hbWUgPSBuYW1lSXNPYmogPyB0cmFuc2l0aW9uTmFtZS5uYW1lIDogdHJhbnNpdGlvbk5hbWU7XG4gIHZhciBhY3RpdmVDbGFzc05hbWUgPSBuYW1lSXNPYmogPyB0cmFuc2l0aW9uTmFtZS5hY3RpdmUgOiB0cmFuc2l0aW9uTmFtZSArICctYWN0aXZlJztcbiAgdmFyIGVuZCA9IGVuZENhbGxiYWNrO1xuICB2YXIgc3RhcnQgPSB2b2lkIDA7XG4gIHZhciBhY3RpdmUgPSB2b2lkIDA7XG5cbiAgaWYgKGVuZENhbGxiYWNrICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbmRDYWxsYmFjaykgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgZW5kID0gZW5kQ2FsbGJhY2suZW5kO1xuICAgIHN0YXJ0ID0gZW5kQ2FsbGJhY2suc3RhcnQ7XG4gICAgYWN0aXZlID0gZW5kQ2FsbGJhY2suYWN0aXZlO1xuICB9XG5cbiAgaWYgKG5vZGUucmNFbmRMaXN0ZW5lcikge1xuICAgIG5vZGUucmNFbmRMaXN0ZW5lcigpO1xuICB9XG5cbiAgbm9kZS5yY0VuZExpc3RlbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZSAmJiBlLnRhcmdldCAhPT0gbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLnJjQW5pbVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChub2RlLnJjQW5pbVRpbWVvdXQpO1xuICAgICAgbm9kZS5yY0FuaW1UaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBjbGVhckJyb3dzZXJCdWdUaW1lb3V0KG5vZGUpO1xuXG4gICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzTmFtZSk7XG5cbiAgICBfRXZlbnQyWydkZWZhdWx0J10ucmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBub2RlLnJjRW5kTGlzdGVuZXIpO1xuICAgIG5vZGUucmNFbmRMaXN0ZW5lciA9IG51bGw7XG5cbiAgICAvLyBVc3VhbGx5IHRoaXMgb3B0aW9uYWwgZW5kIGlzIHVzZWQgZm9yIGluZm9ybWluZyBhbiBvd25lciBvZlxuICAgIC8vIGEgbGVhdmUgYW5pbWF0aW9uIGFuZCB0ZWxsaW5nIGl0IHRvIHJlbW92ZSB0aGUgY2hpbGQuXG4gICAgaWYgKGVuZCkge1xuICAgICAgZW5kKCk7XG4gICAgfVxuICB9O1xuXG4gIF9FdmVudDJbJ2RlZmF1bHQnXS5hZGRFbmRFdmVudExpc3RlbmVyKG5vZGUsIG5vZGUucmNFbmRMaXN0ZW5lcik7XG5cbiAgaWYgKHN0YXJ0KSB7XG4gICAgc3RhcnQoKTtcbiAgfVxuICBub2RlLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcblxuICBub2RlLnJjQW5pbVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBub2RlLnJjQW5pbVRpbWVvdXQgPSBudWxsO1xuICAgIG5vZGUuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzc05hbWUpO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIGFjdGl2ZSgpO1xuICAgIH1cbiAgICBmaXhCcm93c2VyQnlUaW1lb3V0KG5vZGUpO1xuICB9LCAwKTtcblxuICByZXR1cm4ge1xuICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICBpZiAobm9kZS5yY0VuZExpc3RlbmVyKSB7XG4gICAgICAgIG5vZGUucmNFbmRMaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbmNzc0FuaW1hdGlvbi5zdHlsZSA9IGZ1bmN0aW9uIChub2RlLCBzdHlsZSwgY2FsbGJhY2spIHtcbiAgaWYgKG5vZGUucmNFbmRMaXN0ZW5lcikge1xuICAgIG5vZGUucmNFbmRMaXN0ZW5lcigpO1xuICB9XG5cbiAgbm9kZS5yY0VuZExpc3RlbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZSAmJiBlLnRhcmdldCAhPT0gbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLnJjQW5pbVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChub2RlLnJjQW5pbVRpbWVvdXQpO1xuICAgICAgbm9kZS5yY0FuaW1UaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBjbGVhckJyb3dzZXJCdWdUaW1lb3V0KG5vZGUpO1xuXG4gICAgX0V2ZW50MlsnZGVmYXVsdCddLnJlbW92ZUVuZEV2ZW50TGlzdGVuZXIobm9kZSwgbm9kZS5yY0VuZExpc3RlbmVyKTtcbiAgICBub2RlLnJjRW5kTGlzdGVuZXIgPSBudWxsO1xuXG4gICAgLy8gVXN1YWxseSB0aGlzIG9wdGlvbmFsIGNhbGxiYWNrIGlzIHVzZWQgZm9yIGluZm9ybWluZyBhbiBvd25lciBvZlxuICAgIC8vIGEgbGVhdmUgYW5pbWF0aW9uIGFuZCB0ZWxsaW5nIGl0IHRvIHJlbW92ZSB0aGUgY2hpbGQuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfTtcblxuICBfRXZlbnQyWydkZWZhdWx0J10uYWRkRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBub2RlLnJjRW5kTGlzdGVuZXIpO1xuXG4gIG5vZGUucmNBbmltVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIHMgaW4gc3R5bGUpIHtcbiAgICAgIGlmIChzdHlsZS5oYXNPd25Qcm9wZXJ0eShzKSkge1xuICAgICAgICBub2RlLnN0eWxlW3NdID0gc3R5bGVbc107XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUucmNBbmltVGltZW91dCA9IG51bGw7XG4gICAgZml4QnJvd3NlckJ5VGltZW91dChub2RlKTtcbiAgfSwgMCk7XG59O1xuXG5jc3NBbmltYXRpb24uc2V0VHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBwLCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHkgPSBwO1xuICB2YXIgdiA9IHZhbHVlO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHYgPSBwcm9wZXJ0eTtcbiAgICBwcm9wZXJ0eSA9ICcnO1xuICB9XG4gIHByb3BlcnR5ID0gcHJvcGVydHkgfHwgJyc7XG4gIGNhcGl0YWxQcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBub2RlLnN0eWxlW3ByZWZpeCArICdUcmFuc2l0aW9uJyArIHByb3BlcnR5XSA9IHY7XG4gIH0pO1xufTtcblxuY3NzQW5pbWF0aW9uLmlzQ3NzQW5pbWF0aW9uU3VwcG9ydGVkID0gaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQ7XG5cbmV4cG9ydHMuaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQgPSBpc0Nzc0FuaW1hdGlvblN1cHBvcnRlZDtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNzc0FuaW1hdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEFycm93TGVmdE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04NzIgNDc0SDI4Ni45bDM1MC4yLTMwNGM1LjYtNC45IDIuMi0xNC01LjItMTRoLTg4LjVjLTMuOSAwLTcuNiAxLjQtMTAuNSAzLjlMMTU1IDQ4Ny44YTMxLjk2IDMxLjk2IDAgMDAwIDQ4LjNMNTM1LjEgODY2YzEuNSAxLjMgMy4zIDIgNS4yIDJoOTEuNWM3LjQgMCAxMC44LTkuMiA1LjItMTRMMjg2LjkgNTUwSDg3MmM0LjQgMCA4LTMuNiA4LTh2LTYwYzAtNC40LTMuNi04LTgtOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImFycm93LWxlZnRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IEFycm93TGVmdE91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBBcnJvd1JpZ2h0T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg2OSA0ODcuOEw0OTEuMiAxNTkuOWMtMi45LTIuNS02LjYtMy45LTEwLjUtMy45aC04OC41Yy03LjQgMC0xMC44IDkuMi01LjIgMTRsMzUwLjIgMzA0SDE1MmMtNC40IDAtOCAzLjYtOCA4djYwYzAgNC40IDMuNiA4IDggOGg1ODUuMUwzODYuOSA4NTRjLTUuNiA0LjktMi4yIDE0IDUuMiAxNGg5MS41YzEuOSAwIDMuOC0uNyA1LjItMkw4NjkgNTM2LjJhMzIuMDcgMzIuMDcgMCAwMDAtNDguNHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImFycm93LXJpZ2h0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBBcnJvd1JpZ2h0T3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEJhcnNPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjAgMCAxMDI0IDEwMjRcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTEyIDE5MkgzMjhjLTQuNCAwLTggMy42LTggOHY1NmMwIDQuNCAzLjYgOCA4IDhoNTg0YzQuNCAwIDgtMy42IDgtOHYtNTZjMC00LjQtMy42LTgtOC04em0wIDI4NEgzMjhjLTQuNCAwLTggMy42LTggOHY1NmMwIDQuNCAzLjYgOCA4IDhoNTg0YzQuNCAwIDgtMy42IDgtOHYtNTZjMC00LjQtMy42LTgtOC04em0wIDI4NEgzMjhjLTQuNCAwLTggMy42LTggOHY1NmMwIDQuNCAzLjYgOCA4IDhoNTg0YzQuNCAwIDgtMy42IDgtOHYtNTZjMC00LjQtMy42LTgtOC04ek0xMDQgMjI4YTU2IDU2IDAgMTAxMTIgMCA1NiA1NiAwIDEwLTExMiAwem0wIDI4NGE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAxMC0xMTIgMHptMCAyODRhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMTAtMTEyIDB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJiYXJzXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBCYXJzT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENhbGVuZGFyT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg4MCAxODRINzEydi02NGMwLTQuNC0zLjYtOC04LThoLTU2Yy00LjQgMC04IDMuNi04IDh2NjRIMzg0di02NGMwLTQuNC0zLjYtOC04LThoLTU2Yy00LjQgMC04IDMuNi04IDh2NjRIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY2NjRjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjIxNmMwLTE3LjctMTQuMy0zMi0zMi0zMnptLTQwIDY1NkgxODRWNDYwaDY1NnYzODB6TTE4NCAzOTJWMjU2aDEyOHY0OGMwIDQuNCAzLjYgOCA4IDhoNTZjNC40IDAgOC0zLjYgOC04di00OGgyNTZ2NDhjMCA0LjQgMy42IDggOCA4aDU2YzQuNCAwIDgtMy42IDgtOHYtNDhoMTI4djEzNkgxODR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjYWxlbmRhclwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gQ2FsZW5kYXJPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ2FyZXREb3duRmlsbGVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiMCAwIDEwMjQgMTAyNFwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04NDAuNCAzMDBIMTgzLjZjLTE5LjcgMC0zMC43IDIwLjgtMTguNSAzNWwzMjguNCAzODAuOGM5LjQgMTAuOSAyNy41IDEwLjkgMzcgMEw4NTguOSAzMzVjMTIuMi0xNC4yIDEuMi0zNS0xOC41LTM1elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2FyZXQtZG93blwiLCBcInRoZW1lXCI6IFwiZmlsbGVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IENhcmV0RG93bkZpbGxlZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ2FyZXREb3duT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCIwIDAgMTAyNCAxMDI0XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg0MC40IDMwMEgxODMuNmMtMTkuNyAwLTMwLjcgMjAuOC0xOC41IDM1bDMyOC40IDM4MC44YzkuNCAxMC45IDI3LjUgMTAuOSAzNyAwTDg1OC45IDMzNWMxMi4yLTE0LjIgMS4yLTM1LTE4LjUtMzV6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjYXJldC1kb3duXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBDYXJldERvd25PdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ2FyZXRVcE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiMCAwIDEwMjQgMTAyNFwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04NTguOSA2ODlMNTMwLjUgMzA4LjJjLTkuNC0xMC45LTI3LjUtMTAuOS0zNyAwTDE2NS4xIDY4OWMtMTIuMiAxNC4yLTEuMiAzNSAxOC41IDM1aDY1Ni44YzE5LjcgMCAzMC43LTIwLjggMTguNS0zNXpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNhcmV0LXVwXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBDYXJldFVwT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENoZWNrQ2lyY2xlRmlsbGVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MTIgNjRDMjY0LjYgNjQgNjQgMjY0LjYgNjQgNTEyczIwMC42IDQ0OCA0NDggNDQ4IDQ0OC0yMDAuNiA0NDgtNDQ4Uzc1OS40IDY0IDUxMiA2NHptMTkzLjUgMzAxLjdsLTIxMC42IDI5MmEzMS44IDMxLjggMCAwMS01MS43IDBMMzE4LjUgNDg0LjljLTMuOC01LjMgMC0xMi43IDYuNS0xMi43aDQ2LjljMTAuMiAwIDE5LjkgNC45IDI1LjkgMTMuM2w3MS4yIDk4LjggMTU3LjItMjE4YzYtOC4zIDE1LjYtMTMuMyAyNS45LTEzLjNINjk5YzYuNSAwIDEwLjMgNy40IDYuNSAxMi43elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2hlY2stY2lyY2xlXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gQ2hlY2tDaXJjbGVGaWxsZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENoZWNrQ2lyY2xlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTY5OSAzNTNoLTQ2LjljLTEwLjIgMC0xOS45IDQuOS0yNS45IDEzLjNMNDY5IDU4NC4zbC03MS4yLTk4LjhjLTYtOC4zLTE1LjYtMTMuMy0yNS45LTEzLjNIMzI1Yy02LjUgMC0xMC4zIDcuNC02LjUgMTIuN2wxMjQuNiAxNzIuOGEzMS44IDMxLjggMCAwMDUxLjcgMGwyMTAuNi0yOTJjMy45LTUuMy4xLTEyLjctNi40LTEyLjd6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0wIDgyMGMtMjA1LjQgMC0zNzItMTY2LjYtMzcyLTM3MnMxNjYuNi0zNzIgMzcyLTM3MiAzNzIgMTY2LjYgMzcyIDM3Mi0xNjYuNiAzNzItMzcyIDM3MnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNoZWNrLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gQ2hlY2tDaXJjbGVPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ2hlY2tPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTEyIDE5MGgtNjkuOWMtOS44IDAtMTkuMSA0LjUtMjUuMSAxMi4yTDQwNC43IDcyNC41IDIwNyA0NzRhMzIgMzIgMCAwMC0yNS4xLTEyLjJIMTEyYy02LjcgMC0xMC40IDcuNy02LjMgMTIuOWwyNzMuOSAzNDdjMTIuOCAxNi4yIDM3LjQgMTYuMiA1MC4zIDBsNDg4LjQtNjE4LjljNC4xLTUuMS40LTEyLjgtNi4zLTEyLjh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjaGVja1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gQ2hlY2tPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ2xvY2tDaXJjbGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTAgODIwYy0yMDUuNCAwLTM3Mi0xNjYuNi0zNzItMzcyczE2Ni42LTM3MiAzNzItMzcyIDM3MiAxNjYuNiAzNzIgMzcyLTE2Ni42IDM3Mi0zNzIgMzcyelwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02ODYuNyA2MzguNkw1NDQuMSA1MzUuNVYyODhjMC00LjQtMy42LTgtOC04SDQ4OGMtNC40IDAtOCAzLjYtOCA4djI3NS40YzAgMi42IDEuMiA1IDMuMyA2LjVsMTY1LjQgMTIwLjZjMy42IDIuNiA4LjYgMS44IDExLjItMS43bDI4LjYtMzljMi42LTMuNyAxLjgtOC43LTEuOC0xMS4yelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvY2stY2lyY2xlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBDbG9ja0NpcmNsZU91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBDbG9zZUNpcmNsZUZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTE2NS40IDYxOC4ybC02Ni0uM0w1MTIgNTYzLjRsLTk5LjMgMTE4LjQtNjYuMS4zYy00LjQgMC04LTMuNS04LTggMC0xLjkuNy0zLjcgMS45LTUuMmwxMzAuMS0xNTVMMzQwLjUgMzU5YTguMzIgOC4zMiAwIDAxLTEuOS01LjJjMC00LjQgMy42LTggOC04bDY2LjEuM0w1MTIgNDY0LjZsOTkuMy0xMTguNCA2Ni0uM2M0LjQgMCA4IDMuNSA4IDggMCAxLjktLjcgMy43LTEuOSA1LjJMNTUzLjUgNTE0bDEzMCAxNTVjMS4yIDEuNSAxLjkgMy4zIDEuOSA1LjIgMCA0LjQtMy42IDgtOCA4elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvc2UtY2lyY2xlXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gQ2xvc2VDaXJjbGVGaWxsZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENsb3NlQ2lyY2xlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTY4NS40IDM1NC44YzAtNC40LTMuNi04LTgtOGwtNjYgLjNMNTEyIDQ2NS42bC05OS4zLTExOC40LTY2LjEtLjNjLTQuNCAwLTggMy41LTggOCAwIDEuOS43IDMuNyAxLjkgNS4ybDEzMC4xIDE1NUwzNDAuNSA2NzBhOC4zMiA4LjMyIDAgMDAtMS45IDUuMmMwIDQuNCAzLjYgOCA4IDhsNjYuMS0uM0w1MTIgNTY0LjRsOTkuMyAxMTguNCA2NiAuM2M0LjQgMCA4LTMuNSA4LTggMC0xLjktLjctMy43LTEuOS01LjJMNTUzLjUgNTE1bDEzMC4xLTE1NWMxLjItMS40IDEuOC0zLjMgMS44LTUuMnpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY1QzI2NC42IDY1IDY0IDI2NS42IDY0IDUxM3MyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NSA1MTIgNjV6bTAgODIwYy0yMDUuNCAwLTM3Mi0xNjYuNi0zNzItMzcyczE2Ni42LTM3MiAzNzItMzcyIDM3MiAxNjYuNiAzNzIgMzcyLTE2Ni42IDM3Mi0zNzIgMzcyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvc2UtY2lyY2xlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBDbG9zZUNpcmNsZU91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBDbG9zZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01NjMuOCA1MTJsMjYyLjUtMzEyLjljNC40LTUuMi43LTEzLjEtNi4xLTEzLjFoLTc5LjhjLTQuNyAwLTkuMiAyLjEtMTIuMyA1LjdMNTExLjYgNDQ5LjggMjk1LjEgMTkxLjdjLTMtMy42LTcuNS01LjctMTIuMy01LjdIMjAzYy02LjggMC0xMC41IDcuOS02LjEgMTMuMUw0NTkuNCA1MTIgMTk2LjkgODI0LjlBNy45NSA3Ljk1IDAgMDAyMDMgODM4aDc5LjhjNC43IDAgOS4yLTIuMSAxMi4zLTUuN2wyMTYuNS0yNTguMSAyMTYuNSAyNTguMWMzIDMuNiA3LjUgNS43IDEyLjMgNS43aDc5LjhjNi44IDAgMTAuNS03LjkgNi4xLTEzLjFMNTYzLjggNTEyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvc2VcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IENsb3NlT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENvcHlPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODMyIDY0SDI5NmMtNC40IDAtOCAzLjYtOCA4djU2YzAgNC40IDMuNiA4IDggOGg0OTZ2Njg4YzAgNC40IDMuNiA4IDggOGg1NmM0LjQgMCA4LTMuNiA4LThWOTZjMC0xNy43LTE0LjMtMzItMzItMzJ6TTcwNCAxOTJIMTkyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnY1MzAuN2MwIDguNSAzLjQgMTYuNiA5LjQgMjIuNmwxNzMuMyAxNzMuM2MyLjIgMi4yIDQuNyA0IDcuNCA1LjV2MS45aDQuMmMzLjUgMS4zIDcuMiAyIDExIDJINzA0YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjIyNGMwLTE3LjctMTQuMy0zMi0zMi0zMnpNMzUwIDg1Ni4yTDI2My45IDc3MEgzNTB2ODYuMnpNNjY0IDg4OEg0MTRWNzQ2YzAtMjIuMS0xNy45LTQwLTQwLTQwSDIzMlYyNjRoNDMydjYyNHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNvcHlcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IENvcHlPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRGVsZXRlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTM2MCAxODRoLThjNC40IDAgOC0zLjYgOC04djhoMzA0di04YzAgNC40IDMuNiA4IDggOGgtOHY3Mmg3MnYtODBjMC0zNS4zLTI4LjctNjQtNjQtNjRIMzUyYy0zNS4zIDAtNjQgMjguNy02NCA2NHY4MGg3MnYtNzJ6bTUwNCA3MkgxNjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjMyYzAgNC40IDMuNiA4IDggOGg2MC40bDI0LjcgNTIzYzEuNiAzNC4xIDI5LjggNjEgNjMuOSA2MWg0NTRjMzQuMiAwIDYyLjMtMjYuOCA2My45LTYxbDI0LjctNTIzSDg4OGM0LjQgMCA4LTMuNiA4LTh2LTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyek03MzEuMyA4NDBIMjkyLjdsLTI0LjItNTEyaDQ4N2wtMjQuMiA1MTJ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJkZWxldGVcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IERlbGV0ZU91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBEb3VibGVMZWZ0T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTI3Mi45IDUxMmwyNjUuNC0zMzkuMWM0LjEtNS4yLjQtMTIuOS02LjMtMTIuOWgtNzcuM2MtNC45IDAtOS42IDIuMy0xMi42IDYuMUwxODYuOCA0OTIuM2EzMS45OSAzMS45OSAwIDAwMCAzOS41bDI1NS4zIDMyNi4xYzMgMy45IDcuNyA2LjEgMTIuNiA2LjFINTMyYzYuNyAwIDEwLjQtNy43IDYuMy0xMi45TDI3Mi45IDUxMnptMzA0IDBsMjY1LjQtMzM5LjFjNC4xLTUuMi40LTEyLjktNi4zLTEyLjloLTc3LjNjLTQuOSAwLTkuNiAyLjMtMTIuNiA2LjFMNDkwLjggNDkyLjNhMzEuOTkgMzEuOTkgMCAwMDAgMzkuNWwyNTUuMyAzMjYuMWMzIDMuOSA3LjcgNi4xIDEyLjYgNi4xSDgzNmM2LjcgMCAxMC40LTcuNyA2LjMtMTIuOUw1NzYuOSA1MTJ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJkb3VibGUtbGVmdFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gRG91YmxlTGVmdE91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBEb3VibGVSaWdodE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MzMuMiA0OTIuM0wyNzcuOSAxNjYuMWMtMy0zLjktNy43LTYuMS0xMi42LTYuMUgxODhjLTYuNyAwLTEwLjQgNy43LTYuMyAxMi45TDQ0Ny4xIDUxMiAxODEuNyA4NTEuMUE3Ljk4IDcuOTggMCAwMDE4OCA4NjRoNzcuM2M0LjkgMCA5LjYtMi4zIDEyLjYtNi4xbDI1NS4zLTMyNi4xYzkuMS0xMS43IDkuMS0yNy45IDAtMzkuNXptMzA0IDBMNTgxLjkgMTY2LjFjLTMtMy45LTcuNy02LjEtMTIuNi02LjFINDkyYy02LjcgMC0xMC40IDcuNy02LjMgMTIuOUw3NTEuMSA1MTIgNDg1LjcgODUxLjFBNy45OCA3Ljk4IDAgMDA0OTIgODY0aDc3LjNjNC45IDAgOS42LTIuMyAxMi42LTYuMWwyNTUuMy0zMjYuMWM5LjEtMTEuNyA5LjEtMjcuOSAwLTM5LjV6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJkb3VibGUtcmlnaHRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IERvdWJsZVJpZ2h0T3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIERvd25PdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODg0IDI1NmgtNzVjLTUuMSAwLTkuOSAyLjUtMTIuOSA2LjZMNTEyIDY1NC4yIDIyNy45IDI2Mi42Yy0zLTQuMS03LjgtNi42LTEyLjktNi42aC03NWMtNi41IDAtMTAuMyA3LjQtNi41IDEyLjdsMzUyLjYgNDg2LjFjMTIuOCAxNy42IDM5IDE3LjYgNTEuNyAwbDM1Mi42LTQ4Ni4xYzMuOS01LjMuMS0xMi43LTYuNC0xMi43elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZG93blwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gRG93bk91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBEb3dubG9hZE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MDUuNyA2NjFhOCA4IDAgMDAxMi42IDBsMTEyLTE0MS43YzQuMS01LjIuNC0xMi45LTYuMy0xMi45aC03NC4xVjE2OGMwLTQuNC0zLjYtOC04LThoLTYwYy00LjQgMC04IDMuNi04IDh2MzM4LjNINDAwYy02LjcgMC0xMC40IDcuNy02LjMgMTIuOWwxMTIgMTQxLjh6TTg3OCA2MjZoLTYwYy00LjQgMC04IDMuNi04IDh2MTU0SDIxNFY2MzRjMC00LjQtMy42LTgtOC04aC02MGMtNC40IDAtOCAzLjYtOCA4djE5OGMwIDE3LjcgMTQuMyAzMiAzMiAzMmg2ODRjMTcuNyAwIDMyLTE0LjMgMzItMzJWNjM0YzAtNC40LTMuNi04LTgtOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRvd25sb2FkXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBEb3dubG9hZE91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBFZGl0T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTI1Ny43IDc1MmMyIDAgNC0uMiA2LS41TDQzMS45IDcyMmMyLS40IDMuOS0xLjMgNS4zLTIuOGw0MjMuOS00MjMuOWE5Ljk2IDkuOTYgMCAwMDAtMTQuMUw2OTQuOSAxMTQuOWMtMS45LTEuOS00LjQtMi45LTcuMS0yLjlzLTUuMiAxLTcuMSAyLjlMMjU2LjggNTM4LjhjLTEuNSAxLjUtMi40IDMuMy0yLjggNS4zbC0yOS41IDE2OC4yYTMzLjUgMzMuNSAwIDAwOS40IDI5LjhjNi42IDYuNCAxNC45IDkuOSAyMy44IDkuOXptNjcuNC0xNzQuNEw2ODcuOCAyMTVsNzMuMyA3My4zLTM2Mi43IDM2Mi42LTg4LjkgMTUuNyAxNS42LTg5ek04ODAgODM2SDE0NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2MzZjMCA0LjQgMy42IDggOCA4aDc4NGM0LjQgMCA4LTMuNiA4LTh2LTM2YzAtMTcuNy0xNC4zLTMyLTMyLTMyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZWRpdFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gRWRpdE91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBFbGxpcHNpc091dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk0xNzYgNTExYTU2IDU2IDAgMTAxMTIgMCA1NiA1NiAwIDEwLTExMiAwem0yODAgMGE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAxMC0xMTIgMHptMjgwIDBhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMTAtMTEyIDB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJlbGxpcHNpc1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gRWxsaXBzaXNPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRW50ZXJPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODY0IDE3MGgtNjBjLTQuNCAwLTggMy42LTggOHY1MThIMzEwdi03M2MwLTYuNy03LjgtMTAuNS0xMy02LjNsLTE0MS45IDExMmE4IDggMCAwMDAgMTIuNmwxNDEuOSAxMTJjNS4zIDQuMiAxMyAuNCAxMy02LjN2LTc1aDQ5OGMzNS4zIDAgNjQtMjguNyA2NC02NFYxNzhjMC00LjQtMy42LTgtOC04elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZW50ZXJcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IEVudGVyT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MTIgNjRDMjY0LjYgNjQgNjQgMjY0LjYgNjQgNTEyczIwMC42IDQ0OCA0NDggNDQ4IDQ0OC0yMDAuNiA0NDgtNDQ4Uzc1OS40IDY0IDUxMiA2NHptLTMyIDIzMmMwLTQuNCAzLjYtOCA4LThoNDhjNC40IDAgOCAzLjYgOCA4djI3MmMwIDQuNC0zLjYgOC04IDhoLTQ4Yy00LjQgMC04LTMuNi04LThWMjk2em0zMiA0NDBhNDguMDEgNDguMDEgMCAwMTAtOTYgNDguMDEgNDguMDEgMCAwMTAgOTZ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJleGNsYW1hdGlvbi1jaXJjbGVcIiwgXCJ0aGVtZVwiOiBcImZpbGxlZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBFeGNsYW1hdGlvbkNpcmNsZUZpbGxlZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTAgODIwYy0yMDUuNCAwLTM3Mi0xNjYuNi0zNzItMzcyczE2Ni42LTM3MiAzNzItMzcyIDM3MiAxNjYuNiAzNzIgMzcyLTE2Ni42IDM3Mi0zNzIgMzcyelwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk00NjQgNjg4YTQ4IDQ4IDAgMTA5NiAwIDQ4IDQ4IDAgMTAtOTYgMHptMjQtMTEyaDQ4YzQuNCAwIDgtMy42IDgtOFYyOTZjMC00LjQtMy42LTgtOC04aC00OGMtNC40IDAtOCAzLjYtOCA4djI3MmMwIDQuNCAzLjYgOCA4IDh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJleGNsYW1hdGlvbi1jaXJjbGVcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEV5ZUludmlzaWJsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05NDIuMiA0ODYuMlE4ODkuNDcgMzc1LjExIDgxNi43IDMwNWwtNTAuODggNTAuODhDODA3LjMxIDM5NS41MyA4NDMuNDUgNDQ3LjQgODc0LjcgNTEyIDc5MS41IDY4NC4yIDY3My40IDc2NiA1MTIgNzY2cS03Mi42NyAwLTEzMy44Ny0yMi4zOEwzMjMgNzk4Ljc1UTQwOCA4MzggNTEyIDgzOHEyODguMyAwIDQzMC4yLTMwMC4zYTYwLjI5IDYwLjI5IDAgMDAwLTUxLjV6bS02My41Ny0zMjAuNjRMODM2IDEyMi44OGE4IDggMCAwMC0xMS4zMiAwTDcxNS4zMSAyMzIuMlE2MjQuODYgMTg2IDUxMiAxODZxLTI4OC4zIDAtNDMwLjIgMzAwLjNhNjAuMyA2MC4zIDAgMDAwIDUxLjVxNTYuNjkgMTE5LjQgMTM2LjUgMTkxLjQxTDExMi40OCA4MzVhOCA4IDAgMDAwIDExLjMxTDE1NS4xNyA4ODlhOCA4IDAgMDAxMS4zMSAwbDcxMi4xNS03MTIuMTJhOCA4IDAgMDAwLTExLjMyek0xNDkuMyA1MTJDMjMyLjYgMzM5LjggMzUwLjcgMjU4IDUxMiAyNThjNTQuNTQgMCAxMDQuMTMgOS4zNiAxNDkuMTIgMjguMzlsLTcwLjMgNzAuM2ExNzYgMTc2IDAgMDAtMjM4LjEzIDIzOC4xM2wtODMuNDIgODMuNDJDMjIzLjEgNjM3LjQ5IDE4My4zIDU4Mi4yOCAxNDkuMyA1MTJ6bTI0Ni43IDBhMTEyLjExIDExMi4xMSAwIDAxMTQ2LjItMTA2LjY5TDQwMS4zMSA1NDYuMkExMTIgMTEyIDAgMDEzOTYgNTEyelwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MDggNjI0Yy0zLjQ2IDAtNi44Ny0uMTYtMTAuMjUtLjQ3bC01Mi44MiA1Mi44MmExNzYuMDkgMTc2LjA5IDAgMDAyMjcuNDItMjI3LjQybC01Mi44MiA1Mi44MmMuMzEgMy4zOC40NyA2Ljc5LjQ3IDEwLjI1YTExMS45NCAxMTEuOTQgMCAwMS0xMTIgMTEyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZXllLWludmlzaWJsZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gRXllSW52aXNpYmxlT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEV5ZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05NDIuMiA0ODYuMkM4NDcuNCAyODYuNSA3MDQuMSAxODYgNTEyIDE4NmMtMTkyLjIgMC0zMzUuNCAxMDAuNS00MzAuMiAzMDAuM2E2MC4zIDYwLjMgMCAwMDAgNTEuNUMxNzYuNiA3MzcuNSAzMTkuOSA4MzggNTEyIDgzOGMxOTIuMiAwIDMzNS40LTEwMC41IDQzMC4yLTMwMC4zIDcuNy0xNi4yIDcuNy0zNSAwLTUxLjV6TTUxMiA3NjZjLTE2MS4zIDAtMjc5LjQtODEuOC0zNjIuNy0yNTRDMjMyLjYgMzM5LjggMzUwLjcgMjU4IDUxMiAyNThjMTYxLjMgMCAyNzkuNCA4MS44IDM2Mi43IDI1NEM3OTEuNSA2ODQuMiA2NzMuNCA3NjYgNTEyIDc2NnptLTQtNDMwYy05Ny4yIDAtMTc2IDc4LjgtMTc2IDE3NnM3OC44IDE3NiAxNzYgMTc2IDE3Ni03OC44IDE3Ni0xNzYtNzguOC0xNzYtMTc2LTE3NnptMCAyODhjLTYxLjkgMC0xMTItNTAuMS0xMTItMTEyczUwLjEtMTEyIDExMi0xMTIgMTEyIDUwLjEgMTEyIDExMi01MC4xIDExMi0xMTIgMTEyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZXllXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBFeWVPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRmlsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04NTQuNiAyODguNkw2MzkuNCA3My40Yy02LTYtMTQuMS05LjQtMjIuNi05LjRIMTkyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnY4MzJjMCAxNy43IDE0LjMgMzIgMzIgMzJoNjQwYzE3LjcgMCAzMi0xNC4zIDMyLTMyVjMxMS4zYzAtOC41LTMuNC0xNi43LTkuNC0yMi43ek03OTAuMiAzMjZINjAyVjEzNy44TDc5MC4yIDMyNnptMS44IDU2MkgyMzJWMTM2aDMwMnYyMTZhNDIgNDIgMCAwMDQyIDQyaDIxNnY0OTR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJmaWxlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBGaWxlT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEZpbGVUd29Ub25lID0geyBcImljb25cIjogZnVuY3Rpb24gcmVuZGVyKHByaW1hcnlDb2xvciwgc2Vjb25kYXJ5Q29sb3IpIHsgcmV0dXJuIHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTM0IDM1MlYxMzZIMjMydjc1Mmg1NjBWMzk0SDU3NmE0MiA0MiAwIDAxLTQyLTQyelwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg1NC42IDI4OC42TDYzOS40IDczLjRjLTYtNi0xNC4xLTkuNC0yMi42LTkuNEgxOTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjgzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg2NDBjMTcuNyAwIDMyLTE0LjMgMzItMzJWMzExLjNjMC04LjUtMy40LTE2LjctOS40LTIyLjd6TTYwMiAxMzcuOEw3OTAuMiAzMjZINjAyVjEzNy44ek03OTIgODg4SDIzMlYxMzZoMzAydjIxNmE0MiA0MiAwIDAwNDIgNDJoMjE2djQ5NHpcIiwgXCJmaWxsXCI6IHByaW1hcnlDb2xvciB9IH1dIH07IH0sIFwibmFtZVwiOiBcImZpbGVcIiwgXCJ0aGVtZVwiOiBcInR3b3RvbmVcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gRmlsZVR3b1RvbmU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEZpbHRlckZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNMzQ5IDgzOGMwIDE3LjcgMTQuMiAzMiAzMS44IDMyaDI2Mi40YzE3LjYgMCAzMS44LTE0LjMgMzEuOC0zMlY2NDJIMzQ5djE5NnptNTMxLjEtNjg0SDE0My45Yy0yNC41IDAtMzkuOCAyNi43LTI3LjUgNDhsMjIxLjMgMzc2aDM0OC44bDIyMS4zLTM3NmMxMi4xLTIxLjMtMy4yLTQ4LTI3LjctNDh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJmaWx0ZXJcIiwgXCJ0aGVtZVwiOiBcImZpbGxlZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBGaWx0ZXJGaWxsZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEZvbGRlck9wZW5PdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTI4IDQ0NEg4MjBWMzMwLjRjMC0xNy43LTE0LjMtMzItMzItMzJINDczTDM1NS43IDE4Ni4yYTguMTUgOC4xNSAwIDAwLTUuNS0yLjJIOTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjU5MmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg2OThjMTMgMCAyNC44LTcuOSAyOS43LTIwbDEzNC0zMzJjMS41LTMuOCAyLjMtNy45IDIuMy0xMiAwLTE3LjctMTQuMy0zMi0zMi0zMnpNMTM2IDI1NmgxODguNWwxMTkuNiAxMTQuNEg3NDhWNDQ0SDIzOGMtMTMgMC0yNC44IDcuOS0yOS43IDIwTDEzNiA2NDMuMlYyNTZ6bTYzNS4zIDUxMkgxNTlsMTAzLjMtMjU2aDYxMi40TDc3MS4zIDc2OHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImZvbGRlci1vcGVuXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBGb2xkZXJPcGVuT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEZvbGRlck91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04ODAgMjk4LjRINTIxTDQwMy43IDE4Ni4yYTguMTUgOC4xNSAwIDAwLTUuNS0yLjJIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY1OTJjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjMzMC40YzAtMTcuNy0xNC4zLTMyLTMyLTMyek04NDAgNzY4SDE4NFYyNTZoMTg4LjVsMTE5LjYgMTE0LjRIODQwVjc2OHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImZvbGRlclwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gRm9sZGVyT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEluZm9DaXJjbGVGaWxsZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0zMiA2NjRjMCA0LjQtMy42IDgtOCA4aC00OGMtNC40IDAtOC0zLjYtOC04VjQ1NmMwLTQuNCAzLjYtOCA4LThoNDhjNC40IDAgOCAzLjYgOCA4djI3MnptLTMyLTM0NGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImluZm8tY2lyY2xlXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gSW5mb0NpcmNsZUZpbGxlZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgSW5mb0NpcmNsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MTIgNjRDMjY0LjYgNjQgNjQgMjY0LjYgNjQgNTEyczIwMC42IDQ0OCA0NDggNDQ4IDQ0OC0yMDAuNiA0NDgtNDQ4Uzc1OS40IDY0IDUxMiA2NHptMCA4MjBjLTIwNS40IDAtMzcyLTE2Ni42LTM3Mi0zNzJzMTY2LjYtMzcyIDM3Mi0zNzIgMzcyIDE2Ni42IDM3MiAzNzItMTY2LjYgMzcyLTM3MiAzNzJ6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQ2NCAzMzZhNDggNDggMCAxMDk2IDAgNDggNDggMCAxMC05NiAwem03MiAxMTJoLTQ4Yy00LjQgMC04IDMuNi04IDh2MjcyYzAgNC40IDMuNiA4IDggOGg0OGM0LjQgMCA4LTMuNiA4LThWNDU2YzAtNC40LTMuNi04LTgtOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImluZm8tY2lyY2xlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBJbmZvQ2lyY2xlT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIExlZnRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzI0IDIxOC4zVjE0MWMwLTYuNy03LjctMTAuNC0xMi45LTYuM0wyNjAuMyA0ODYuOGEzMS44NiAzMS44NiAwIDAwMCA1MC4zbDQ1MC44IDM1Mi4xYzUuMyA0LjEgMTIuOS40IDEyLjktNi4zdi03Ny4zYzAtNC45LTIuMy05LjYtNi4xLTEyLjZsLTM2MC0yODEgMzYwLTI4MS4xYzMuOC0zIDYuMS03LjcgNi4xLTEyLjZ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJsZWZ0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBMZWZ0T3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIExvYWRpbmdPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjAgMCAxMDI0IDEwMjRcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTg4IDU0OGMtMTkuOSAwLTM2LTE2LjEtMzYtMzYgMC01OS40LTExLjYtMTE3LTM0LjYtMTcxLjNhNDQwLjQ1IDQ0MC40NSAwIDAwLTk0LjMtMTM5LjkgNDM3LjcxIDQzNy43MSAwIDAwLTEzOS45LTk0LjNDNjI5IDgzLjYgNTcxLjQgNzIgNTEyIDcyYy0xOS45IDAtMzYtMTYuMS0zNi0zNnMxNi4xLTM2IDM2LTM2YzY5LjEgMCAxMzYuMiAxMy41IDE5OS4zIDQwLjNDNzcyLjMgNjYgODI3IDEwMyA4NzQgMTUwYzQ3IDQ3IDgzLjkgMTAxLjggMTA5LjcgMTYyLjcgMjYuNyA2My4xIDQwLjIgMTMwLjIgNDAuMiAxOTkuMy4xIDE5LjktMTYgMzYtMzUuOSAzNnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImxvYWRpbmdcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IExvYWRpbmdPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgTWludXNTcXVhcmVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNMzI4IDU0NGgzNjhjNC40IDAgOC0zLjYgOC04di00OGMwLTQuNC0zLjYtOC04LThIMzI4Yy00LjQgMC04IDMuNi04IDh2NDhjMCA0LjQgMy42IDggOCA4elwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04ODAgMTEySDE0NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NzM2YzAgMTcuNyAxNC4zIDMyIDMyIDMyaDczNmMxNy43IDAgMzItMTQuMyAzMi0zMlYxNDRjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00MCA3MjhIMTg0VjE4NGg2NTZ2NjU2elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwibWludXMtc3F1YXJlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBNaW51c1NxdWFyZU91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBQYXBlckNsaXBPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzc5LjMgMTk2LjZjLTk0LjItOTQuMi0yNDcuNi05NC4yLTM0MS43IDBsLTI2MSAyNjAuOGMtMS43IDEuNy0yLjYgNC0yLjYgNi40cy45IDQuNyAyLjYgNi40bDM2LjkgMzYuOWE5IDkgMCAwMDEyLjcgMGwyNjEtMjYwLjhjMzIuNC0zMi40IDc1LjUtNTAuMiAxMjEuMy01MC4yczg4LjkgMTcuOCAxMjEuMiA1MC4yYzMyLjQgMzIuNCA1MC4yIDc1LjUgNTAuMiAxMjEuMiAwIDQ1LjgtMTcuOCA4OC44LTUwLjIgMTIxLjJsLTI2NiAyNjUuOS00My4xIDQzLjFjLTQwLjMgNDAuMy0xMDUuOCA0MC4zLTE0Ni4xIDAtMTkuNS0xOS41LTMwLjItNDUuNC0zMC4yLTczczEwLjctNTMuNSAzMC4yLTczbDI2My45LTI2My44YzYuNy02LjYgMTUuNS0xMC4zIDI0LjktMTAuM2guMWM5LjQgMCAxOC4xIDMuNyAyNC43IDEwLjMgNi43IDYuNyAxMC4zIDE1LjUgMTAuMyAyNC45IDAgOS4zLTMuNyAxOC4xLTEwLjMgMjQuN0wzNzIuNCA2NTNjLTEuNyAxLjctMi42IDQtMi42IDYuNHMuOSA0LjcgMi42IDYuNGwzNi45IDM2LjlhOSA5IDAgMDAxMi43IDBsMjE1LjYtMjE1LjZjMTkuOS0xOS45IDMwLjgtNDYuMyAzMC44LTc0LjRzLTExLTU0LjYtMzAuOC03NC40Yy00MS4xLTQxLjEtMTA3LjktNDEtMTQ5IDBMNDYzIDM2NCAyMjQuOCA2MDIuMUExNzIuMjIgMTcyLjIyIDAgMDAxNzQgNzI0LjhjMCA0Ni4zIDE4LjEgODkuOCA1MC44IDEyMi41IDMzLjkgMzMuOCA3OC4zIDUwLjcgMTIyLjcgNTAuNyA0NC40IDAgODguOC0xNi45IDEyMi42LTUwLjdsMzA5LjItMzA5QzgyNC44IDQ5Mi43IDg1MCA0MzIgODUwIDM2Ny41Yy4xLTY0LjYtMjUuMS0xMjUuMy03MC43LTE3MC45elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicGFwZXItY2xpcFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gUGFwZXJDbGlwT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFBpY3R1cmVUd29Ub25lID0geyBcImljb25cIjogZnVuY3Rpb24gcmVuZGVyKHByaW1hcnlDb2xvciwgc2Vjb25kYXJ5Q29sb3IpIHsgcmV0dXJuIHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTI4IDE2MEg5NmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NjQwYzAgMTcuNyAxNC4zIDMyIDMyIDMyaDgzMmMxNy43IDAgMzItMTQuMyAzMi0zMlYxOTJjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00MCA2MzJIMTM2di0zOS45bDEzOC41LTE2NC4zIDE1MC4xIDE3OEw2NTguMSA0ODkgODg4IDc2MS42Vjc5MnptMC0xMjkuOEw2NjQuMiAzOTYuOGMtMy4yLTMuOC05LTMuOC0xMi4yIDBMNDI0LjYgNjY2LjRsLTE0NC0xNzAuN2MtMy4yLTMuOC05LTMuOC0xMi4yIDBMMTM2IDY1Mi43VjIzMmg3NTJ2NDMwLjJ6XCIsIFwiZmlsbFwiOiBwcmltYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQyNC42IDc2NS44bC0xNTAuMS0xNzhMMTM2IDc1Mi4xVjc5Mmg3NTJ2LTMwLjRMNjU4LjEgNDg5elwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTEzNiA2NTIuN2wxMzIuNC0xNTdjMy4yLTMuOCA5LTMuOCAxMi4yIDBsMTQ0IDE3MC43TDY1MiAzOTYuOGMzLjItMy44IDktMy44IDEyLjIgMEw4ODggNjYyLjJWMjMySDEzNnY0MjAuN3pNMzA0IDI4MGE4OCA4OCAwIDExMCAxNzYgODggODggMCAwMTAtMTc2elwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTI3NiAzNjhhMjggMjggMCAxMDU2IDAgMjggMjggMCAxMC01NiAwelwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTMwNCA0NTZhODggODggMCAxMDAtMTc2IDg4IDg4IDAgMDAwIDE3NnptMC0xMTZjMTUuNSAwIDI4IDEyLjUgMjggMjhzLTEyLjUgMjgtMjggMjgtMjgtMTIuNS0yOC0yOCAxMi41LTI4IDI4LTI4elwiLCBcImZpbGxcIjogcHJpbWFyeUNvbG9yIH0gfV0gfTsgfSwgXCJuYW1lXCI6IFwicGljdHVyZVwiLCBcInRoZW1lXCI6IFwidHdvdG9uZVwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBQaWN0dXJlVHdvVG9uZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgUGx1c091dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcImRlZnNcIiwgXCJhdHRyc1wiOiB7fSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInN0eWxlXCIsIFwiYXR0cnNcIjoge30gfV0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk00ODIgMTUyaDYwcTggMCA4IDh2NzA0cTAgOC04IDhoLTYwcS04IDAtOC04VjE2MHEwLTggOC04elwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk0xNzYgNDc0aDY3MnE4IDAgOCA4djYwcTAgOC04IDhIMTc2cS04IDAtOC04di02MHEwLTggOC04elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicGx1c1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gUGx1c091dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBQbHVzU3F1YXJlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTMyOCA1NDRoMTUydjE1MmMwIDQuNCAzLjYgOCA4IDhoNDhjNC40IDAgOC0zLjYgOC04VjU0NGgxNTJjNC40IDAgOC0zLjYgOC04di00OGMwLTQuNC0zLjYtOC04LThINTQ0VjMyOGMwLTQuNC0zLjYtOC04LThoLTQ4Yy00LjQgMC04IDMuNi04IDh2MTUySDMyOGMtNC40IDAtOCAzLjYtOCA4djQ4YzAgNC40IDMuNiA4IDggOHpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODgwIDExMkgxNDRjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjczNmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg3MzZjMTcuNyAwIDMyLTE0LjMgMzItMzJWMTQ0YzAtMTcuNy0xNC4zLTMyLTMyLTMyem0tNDAgNzI4SDE4NFYxODRoNjU2djY1NnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInBsdXMtc3F1YXJlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBQbHVzU3F1YXJlT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFJlZG9PdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzU4LjIgODM5LjFDODUxLjggNzY1LjkgOTEyIDY1MS45IDkxMiA1MjMuOSA5MTIgMzAzIDczMy41IDEyNC4zIDUxMi42IDEyNCAyOTEuNCAxMjMuNyAxMTIgMzAyLjggMTEyIDUyMy45YzAgMTI1LjIgNTcuNSAyMzYuOSAxNDcuNiAzMTAuMiAzLjUgMi44IDguNiAyLjIgMTEuNC0xLjNsMzkuNC01MC41YzIuNy0zLjQgMi4xLTguMy0xLjItMTEuMS04LjEtNi42LTE1LjktMTMuNy0yMy40LTIxLjJhMzE4LjY0IDMxOC42NCAwIDAxLTY4LjYtMTAxLjdDMjAwLjQgNjA5IDE5MiA1NjcuMSAxOTIgNTIzLjlzOC40LTg1LjEgMjUuMS0xMjQuNWMxNi4xLTM4LjEgMzkuMi03Mi4zIDY4LjYtMTAxLjcgMjkuNC0yOS40IDYzLjYtNTIuNSAxMDEuNy02OC42QzQyNi45IDIxMi40IDQ2OC44IDIwNCA1MTIgMjA0czg1LjEgOC40IDEyNC41IDI1LjFjMzguMSAxNi4xIDcyLjMgMzkuMiAxMDEuNyA2OC42IDI5LjQgMjkuNCA1Mi41IDYzLjYgNjguNiAxMDEuNyAxNi43IDM5LjQgMjUuMSA4MS4zIDI1LjEgMTI0LjVzLTguNCA4NS4xLTI1LjEgMTI0LjVhMzE4LjY0IDMxOC42NCAwIDAxLTY4LjYgMTAxLjdjLTkuMyA5LjMtMTkuMSAxOC0yOS4zIDI2TDY2OC4yIDcyNGE4IDggMCAwMC0xNC4xIDNsLTM5LjYgMTYyLjJjLTEuMiA1IDIuNiA5LjkgNy43IDkuOWwxNjcgLjhjNi43IDAgMTAuNS03LjcgNi4zLTEyLjlsLTM3LjMtNDcuOXpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInJlZG9cIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJlZG9PdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgUmlnaHRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzY1LjcgNDg2LjhMMzE0LjkgMTM0LjdBNy45NyA3Ljk3IDAgMDAzMDIgMTQxdjc3LjNjMCA0LjkgMi4zIDkuNiA2LjEgMTIuNmwzNjAgMjgxLjEtMzYwIDI4MS4xYy0zLjkgMy02LjEgNy43LTYuMSAxMi42Vjg4M2MwIDYuNyA3LjcgMTAuNCAxMi45IDYuM2w0NTAuOC0zNTIuMWEzMS45NiAzMS45NiAwIDAwMC01MC40elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicmlnaHRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJpZ2h0T3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFJvdGF0ZUxlZnRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJkZWZzXCIsIFwiYXR0cnNcIjoge30sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJzdHlsZVwiLCBcImF0dHJzXCI6IHt9IH1dIH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNjcyIDQxOEgxNDRjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjQxNGMwIDE3LjcgMTQuMyAzMiAzMiAzMmg1MjhjMTcuNyAwIDMyLTE0LjMgMzItMzJWNDUwYzAtMTcuNy0xNC4zLTMyLTMyLTMyem0tNDQgNDAySDE4OFY0OTRoNDQwdjMyNnpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODE5LjMgMzI4LjVjLTc4LjgtMTAwLjctMTk2LTE1My42LTMxNC42LTE1NC4ybC0uMi02NGMwLTYuNS03LjYtMTAuMS0xMi42LTYuMWwtMTI4IDEwMWMtNCAzLjEtMy45IDkuMSAwIDEyLjNMNDkyIDMxOC42YzUuMSA0IDEyLjcuNCAxMi42LTYuMXYtNjMuOWMxMi45LjEgMjUuOS45IDM4LjggMi41IDQyLjEgNS4yIDgyLjEgMTguMiAxMTkgMzguNyAzOC4xIDIxLjIgNzEuMiA0OS43IDk4LjQgODQuMyAyNy4xIDM0LjcgNDYuNyA3My43IDU4LjEgMTE1LjhhMzI1Ljk1IDMyNS45NSAwIDAxNi41IDE0MC45aDc0LjljMTQuOC0xMDMuNi0xMS4zLTIxMy04MS0zMDIuM3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcInJvdGF0ZS1sZWZ0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBSb3RhdGVMZWZ0T3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFJvdGF0ZVJpZ2h0T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwiZGVmc1wiLCBcImF0dHJzXCI6IHt9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwic3R5bGVcIiwgXCJhdHRyc1wiOiB7fSB9XSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQ4MC41IDI1MS4yYzEzLTEuNiAyNS45LTIuNCAzOC44LTIuNXY2My45YzAgNi41IDcuNSAxMC4xIDEyLjYgNi4xTDY2MCAyMTcuNmM0LTMuMiA0LTkuMiAwLTEyLjNsLTEyOC0xMDFjLTUuMS00LTEyLjYtLjQtMTIuNiA2LjFsLS4yIDY0Yy0xMTguNi41LTIzNS44IDUzLjQtMzE0LjYgMTU0LjJBMzk5Ljc1IDM5OS43NSAwIDAwMTIzLjUgNjMxaDc0LjljLS45LTUuMy0xLjctMTAuNy0yLjQtMTYuMS01LjEtNDIuMS0yLjEtODQuMSA4LjktMTI0LjggMTEuNC00Mi4yIDMxLTgxLjEgNTguMS0xMTUuOCAyNy4yLTM0LjcgNjAuMy02My4yIDk4LjQtODQuMyAzNy0yMC42IDc2LjktMzMuNiAxMTkuMS0zOC44elwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04ODAgNDE4SDM1MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NDE0YzAgMTcuNyAxNC4zIDMyIDMyIDMyaDUyOGMxNy43IDAgMzItMTQuMyAzMi0zMlY0NTBjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00NCA0MDJIMzk2VjQ5NGg0NDB2MzI2elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicm90YXRlLXJpZ2h0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBSb3RhdGVSaWdodE91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBTZWFyY2hPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTA5LjYgODU0LjVMNjQ5LjkgNTk0LjhDNjkwLjIgNTQyLjcgNzEyIDQ3OSA3MTIgNDEyYzAtODAuMi0zMS4zLTE1NS40LTg3LjktMjEyLjEtNTYuNi01Ni43LTEzMi04Ny45LTIxMi4xLTg3LjlzLTE1NS41IDMxLjMtMjEyLjEgODcuOUMxNDMuMiAyNTYuNSAxMTIgMzMxLjggMTEyIDQxMmMwIDgwLjEgMzEuMyAxNTUuNSA4Ny45IDIxMi4xQzI1Ni41IDY4MC44IDMzMS44IDcxMiA0MTIgNzEyYzY3IDAgMTMwLjYtMjEuOCAxODIuNy02MmwyNTkuNyAyNTkuNmE4LjIgOC4yIDAgMDAxMS42IDBsNDMuNi00My41YTguMiA4LjIgMCAwMDAtMTEuNnpNNTcwLjQgNTcwLjRDNTI4IDYxMi43IDQ3MS44IDYzNiA0MTIgNjM2cy0xMTYtMjMuMy0xNTguNC02NS42QzIxMS4zIDUyOCAxODggNDcxLjggMTg4IDQxMnMyMy4zLTExNi4xIDY1LjYtMTU4LjRDMjk2IDIxMS4zIDM1Mi4yIDE4OCA0MTIgMTg4czExNi4xIDIzLjIgMTU4LjQgNjUuNlM2MzYgMzUyLjIgNjM2IDQxMnMtMjMuMyAxMTYuMS02NS42IDE1OC40elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwic2VhcmNoXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBTZWFyY2hPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgU3RhckZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTA4LjEgMzUzLjFsLTI1My45LTM2LjlMNTQwLjcgODYuMWMtMy4xLTYuMy04LjItMTEuNC0xNC41LTE0LjUtMTUuOC03LjgtMzUtMS4zLTQyLjkgMTQuNUwzNjkuOCAzMTYuMmwtMjUzLjkgMzYuOWMtNyAxLTEzLjQgNC4zLTE4LjMgOS4zYTMyLjA1IDMyLjA1IDAgMDAuNiA0NS4zbDE4My43IDE3OS4xLTQzLjQgMjUyLjlhMzEuOTUgMzEuOTUgMCAwMDQ2LjQgMzMuN0w1MTIgNzU0bDIyNy4xIDExOS40YzYuMiAzLjMgMTMuNCA0LjQgMjAuMyAzLjIgMTcuNC0zIDI5LjEtMTkuNSAyNi4xLTM2LjlsLTQzLjQtMjUyLjkgMTgzLjctMTc5LjFjNS00LjkgOC4zLTExLjMgOS4zLTE4LjMgMi43LTE3LjUtOS41LTMzLjctMjctMzYuM3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcInN0YXJcIiwgXCJ0aGVtZVwiOiBcImZpbGxlZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBTdGFyRmlsbGVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBTd2FwUmlnaHRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjAgMCAxMDI0IDEwMjRcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODczLjEgNTk2LjJsLTE2NC0yMDhBMzIgMzIgMCAwMDY4NCAzNzZoLTY0LjhjLTYuNyAwLTEwLjQgNy43LTYuMyAxM2wxNDQuMyAxODNIMTUyYy00LjQgMC04IDMuNi04IDh2NjBjMCA0LjQgMy42IDggOCA4aDY5NS45YzI2LjggMCA0MS43LTMwLjggMjUuMi01MS44elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwic3dhcC1yaWdodFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gU3dhcFJpZ2h0T3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFVwT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg5MC41IDc1NS4zTDUzNy45IDI2OS4yYy0xMi44LTE3LjYtMzktMTcuNi01MS43IDBMMTMzLjUgNzU1LjNBOCA4IDAgMDAxNDAgNzY4aDc1YzUuMSAwIDkuOS0yLjUgMTIuOS02LjZMNTEyIDM2OS44bDI4NC4xIDM5MS42YzMgNC4xIDcuOCA2LjYgMTIuOSA2LjZoNzVjNi41IDAgMTAuMy03LjQgNi41LTEyLjd6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJ1cFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gVXBPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgVmVydGljYWxBbGlnblRvcE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04NTkuOSAxNjhIMTY0LjFjLTQuNSAwLTguMSAzLjYtOC4xIDh2NjBjMCA0LjQgMy42IDggOC4xIDhoNjk1LjhjNC41IDAgOC4xLTMuNiA4LjEtOHYtNjBjMC00LjQtMy42LTgtOC4xLTh6TTUxOC4zIDM1NWE4IDggMCAwMC0xMi42IDBsLTExMiAxNDEuN2E3Ljk4IDcuOTggMCAwMDYuMyAxMi45aDczLjlWODQ4YzAgNC40IDMuNiA4IDggOGg2MGM0LjQgMCA4LTMuNiA4LThWNTA5LjdINjI0YzYuNyAwIDEwLjQtNy43IDYuMy0xMi45TDUxOC4zIDM1NXpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInZlcnRpY2FsLWFsaWduLXRvcFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gVmVydGljYWxBbGlnblRvcE91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBXYXJuaW5nRmlsbGVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05NTUuNyA4NTZsLTQxNi03MjBjLTYuMi0xMC43LTE2LjktMTYtMjcuNy0xNnMtMjEuNiA1LjMtMjcuNyAxNmwtNDE2IDcyMEM1NiA4NzcuNCA3MS40IDkwNCA5NiA5MDRoODMyYzI0LjYgMCA0MC0yNi42IDI3LjctNDh6TTQ4MCA0MTZjMC00LjQgMy42LTggOC04aDQ4YzQuNCAwIDggMy42IDggOHYxODRjMCA0LjQtMy42IDgtOCA4aC00OGMtNC40IDAtOC0zLjYtOC04VjQxNnptMzIgMzUyYTQ4LjAxIDQ4LjAxIDAgMDEwLTk2IDQ4LjAxIDQ4LjAxIDAgMDEwIDk2elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwid2FybmluZ1wiLCBcInRoZW1lXCI6IFwiZmlsbGVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IFdhcm5pbmdGaWxsZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFpvb21Jbk91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02MzcgNDQzSDUxOVYzMDljMC00LjQtMy42LTgtOC04aC02MGMtNC40IDAtOCAzLjYtOCA4djEzNEgzMjVjLTQuNCAwLTggMy42LTggOHY2MGMwIDQuNCAzLjYgOCA4IDhoMTE4djEzNGMwIDQuNCAzLjYgOCA4IDhoNjBjNC40IDAgOC0zLjYgOC04VjUxOWgxMThjNC40IDAgOC0zLjYgOC04di02MGMwLTQuNC0zLjYtOC04LTh6bTI4NCA0MjRMNzc1IDcyMWMxMjIuMS0xNDguOSAxMTMuNi0zNjkuNS0yNi01MDktMTQ4LTE0OC4xLTM4OC40LTE0OC4xLTUzNyAwLTE0OC4xIDE0OC42LTE0OC4xIDM4OSAwIDUzNyAxMzkuNSAxMzkuNiAzNjAuMSAxNDguMSA1MDkgMjZsMTQ2IDE0NmMzLjIgMi44IDguMyAyLjggMTEgMGw0My00M2MyLjgtMi43IDIuOC03LjggMC0xMXpNNjk2IDY5NmMtMTE4LjggMTE4LjctMzExLjIgMTE4LjctNDMwIDAtMTE4LjctMTE4LjgtMTE4LjctMzExLjIgMC00MzAgMTE4LjgtMTE4LjcgMzExLjItMTE4LjcgNDMwIDAgMTE4LjcgMTE4LjggMTE4LjcgMzExLjIgMCA0MzB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJ6b29tLWluXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBab29tSW5PdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgWm9vbU91dE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02MzcgNDQzSDMyNWMtNC40IDAtOCAzLjYtOCA4djYwYzAgNC40IDMuNiA4IDggOGgzMTJjNC40IDAgOC0zLjYgOC04di02MGMwLTQuNC0zLjYtOC04LTh6bTI4NCA0MjRMNzc1IDcyMWMxMjIuMS0xNDguOSAxMTMuNi0zNjkuNS0yNi01MDktMTQ4LTE0OC4xLTM4OC40LTE0OC4xLTUzNyAwLTE0OC4xIDE0OC42LTE0OC4xIDM4OSAwIDUzNyAxMzkuNSAxMzkuNiAzNjAuMSAxNDguMSA1MDkgMjZsMTQ2IDE0NmMzLjIgMi44IDguMyAyLjggMTEgMGw0My00M2MyLjgtMi43IDIuOC03LjggMC0xMXpNNjk2IDY5NmMtMTE4LjggMTE4LjctMzExLjIgMTE4LjctNDMwIDAtMTE4LjctMTE4LjgtMTE4LjctMzExLjIgMC00MzAgMTE4LjgtMTE4LjcgMzExLjItMTE4LjcgNDMwIDAgMTE4LjcgMTE4LjggMTE4LjcgMzExLjIgMCA0MzB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJ6b29tLW91dFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gWm9vbU91dE91dGxpbmVkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9BcnJvd0xlZnRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvQXJyb3dMZWZ0T3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfQXJyb3dMZWZ0T3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfQXJyb3dSaWdodE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9BcnJvd1JpZ2h0T3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfQXJyb3dSaWdodE91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0JhcnNPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvQmFyc091dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0JhcnNPdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9DYWxlbmRhck91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9DYWxlbmRhck91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0NhbGVuZGFyT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfQ2FyZXREb3duRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9DYXJldERvd25GaWxsZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfQ2FyZXREb3duRmlsbGVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0NhcmV0RG93bk91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9DYXJldERvd25PdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9DYXJldERvd25PdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9DYXJldFVwT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0NhcmV0VXBPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9DYXJldFVwT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfQ2hlY2tDaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0NoZWNrQ2lyY2xlRmlsbGVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0NoZWNrQ2lyY2xlRmlsbGVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0NoZWNrQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0NoZWNrQ2lyY2xlT3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfQ2hlY2tDaXJjbGVPdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9DaGVja091dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9DaGVja091dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0NoZWNrT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfQ2xvY2tDaXJjbGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvQ2xvY2tDaXJjbGVPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9DbG9ja0NpcmNsZU91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0Nsb3NlQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9DbG9zZUNpcmNsZUZpbGxlZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9DbG9zZUNpcmNsZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9DbG9zZUNpcmNsZU91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0Nsb3NlQ2lyY2xlT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfQ2xvc2VPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvQ2xvc2VPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9DbG9zZU91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0NvcHlPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvQ29weU91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0NvcHlPdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9EZWxldGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvRGVsZXRlT3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfRGVsZXRlT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfRG91YmxlTGVmdE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9Eb3VibGVMZWZ0T3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfRG91YmxlTGVmdE91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0RvdWJsZVJpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0RvdWJsZVJpZ2h0T3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfRG91YmxlUmlnaHRPdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9Eb3duT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0Rvd25PdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9Eb3duT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfRG93bmxvYWRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvRG93bmxvYWRPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9Eb3dubG9hZE91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0VkaXRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvRWRpdE91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0VkaXRPdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9FbGxpcHNpc091dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9FbGxpcHNpc091dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0VsbGlwc2lzT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfRW50ZXJPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvRW50ZXJPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9FbnRlck91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0V4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfRXllSW52aXNpYmxlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0V5ZUludmlzaWJsZU91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0V5ZUludmlzaWJsZU91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0V5ZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9FeWVPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9FeWVPdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9GaWxlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0ZpbGVPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9GaWxlT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfRmlsZVR3b1RvbmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0ZpbGVUd29Ub25lJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0ZpbGVUd29Ub25lO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0ZpbHRlckZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvRmlsdGVyRmlsbGVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0ZpbHRlckZpbGxlZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9Gb2xkZXJPcGVuT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0ZvbGRlck9wZW5PdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9Gb2xkZXJPcGVuT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfRm9sZGVyT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0ZvbGRlck91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0ZvbGRlck91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0luZm9DaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0luZm9DaXJjbGVGaWxsZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfSW5mb0NpcmNsZUZpbGxlZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9JbmZvQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL0luZm9DaXJjbGVPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9JbmZvQ2lyY2xlT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfTGVmdE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9MZWZ0T3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfTGVmdE91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX0xvYWRpbmdPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvTG9hZGluZ091dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX0xvYWRpbmdPdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9NaW51c1NxdWFyZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9NaW51c1NxdWFyZU91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX01pbnVzU3F1YXJlT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfUGFwZXJDbGlwT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL1BhcGVyQ2xpcE91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX1BhcGVyQ2xpcE91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX1BpY3R1cmVUd29Ub25lID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9QaWN0dXJlVHdvVG9uZScpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9QaWN0dXJlVHdvVG9uZTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9QbHVzT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL1BsdXNPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9QbHVzT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfUGx1c1NxdWFyZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9QbHVzU3F1YXJlT3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfUGx1c1NxdWFyZU91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX1JlZG9PdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvUmVkb091dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX1JlZG9PdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9SaWdodE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9SaWdodE91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX1JpZ2h0T3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfUm90YXRlTGVmdE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9Sb3RhdGVMZWZ0T3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfUm90YXRlTGVmdE91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX1JvdGF0ZVJpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL1JvdGF0ZVJpZ2h0T3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfUm90YXRlUmlnaHRPdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9TZWFyY2hPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvU2VhcmNoT3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfU2VhcmNoT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfU3RhckZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvU3RhckZpbGxlZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9TdGFyRmlsbGVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX1N3YXBSaWdodE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9Td2FwUmlnaHRPdXRsaW5lZCcpKTtcbiAgXG4gIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cbiAgXG4gIHZhciBfZGVmYXVsdCA9IF9Td2FwUmlnaHRPdXRsaW5lZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9VcE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9VcE91dGxpbmVkJykpO1xuICBcbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuICBcbiAgdmFyIF9kZWZhdWx0ID0gX1VwT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfVmVydGljYWxBbGlnblRvcE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9WZXJ0aWNhbEFsaWduVG9wT3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfVmVydGljYWxBbGlnblRvcE91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gIFxuICB2YXIgX1dhcm5pbmdGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoJy4vbGliL2ljb25zL1dhcm5pbmdGaWxsZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfV2FybmluZ0ZpbGxlZDtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4gIG1vZHVsZS5leHBvcnRzID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICBcbiAgdmFyIF9ab29tSW5PdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9saWIvaWNvbnMvWm9vbUluT3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfWm9vbUluT3V0bGluZWQ7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuICBtb2R1bGUuZXhwb3J0cyA9IF9kZWZhdWx0OyIsIid1c2Ugc3RyaWN0JztcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgXG4gIHZhciBfWm9vbU91dE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL2xpYi9pY29ucy9ab29tT3V0T3V0bGluZWQnKSk7XG4gIFxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG4gIFxuICB2YXIgX2RlZmF1bHQgPSBfWm9vbU91dE91dGxpbmVkO1xuICBleHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9JY29uQmFzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSWNvbkJhc2VcIikpO1xuXG52YXIgX3R3b1RvbmVQcmltYXJ5Q29sb3IgPSByZXF1aXJlKFwiLi90d29Ub25lUHJpbWFyeUNvbG9yXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuXG4vLyBJbml0aWFsIHNldHRpbmdcbi8vIHNob3VsZCBtb3ZlIGl0IHRvIGFudGQgbWFpbiByZXBvP1xuKDAsIF90d29Ub25lUHJpbWFyeUNvbG9yLnNldFR3b1RvbmVDb2xvcikoJyMxODkwZmYnKTtcbnZhciBJY29uID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgICBzcGluID0gcHJvcHMuc3BpbixcbiAgICAgIHJvdGF0ZSA9IHByb3BzLnJvdGF0ZSxcbiAgICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICAgIHR3b1RvbmVDb2xvciA9IHByb3BzLnR3b1RvbmVDb2xvcixcbiAgICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKHByb3BzLCBbXCJjbGFzc05hbWVcIiwgXCJpY29uXCIsIFwic3BpblwiLCBcInJvdGF0ZVwiLCBcInRhYkluZGV4XCIsIFwib25DbGlja1wiLCBcInR3b1RvbmVDb2xvclwiXSk7XG4gIHZhciBjbGFzc1N0cmluZyA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KSgnYW50aWNvbicsICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcImFudGljb24tXCIuY29uY2F0KGljb24ubmFtZSksIEJvb2xlYW4oaWNvbi5uYW1lKSksIGNsYXNzTmFtZSk7XG4gIHZhciBzdmdDbGFzc1N0cmluZyA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KSh7XG4gICAgJ2FudGljb24tc3Bpbic6ICEhc3BpbiB8fCBpY29uLm5hbWUgPT09ICdsb2FkaW5nJ1xuICB9KTtcbiAgdmFyIGljb25UYWJJbmRleCA9IHRhYkluZGV4O1xuXG4gIGlmIChpY29uVGFiSW5kZXggPT09IHVuZGVmaW5lZCAmJiBvbkNsaWNrKSB7XG4gICAgaWNvblRhYkluZGV4ID0gLTE7XG4gIH1cblxuICB2YXIgc3ZnU3R5bGUgPSByb3RhdGUgPyB7XG4gICAgbXNUcmFuc2Zvcm06IFwicm90YXRlKFwiLmNvbmNhdChyb3RhdGUsIFwiZGVnKVwiKSxcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiLmNvbmNhdChyb3RhdGUsIFwiZGVnKVwiKVxuICB9IDogdW5kZWZpbmVkO1xuXG4gIHZhciBfbm9ybWFsaXplVHdvVG9uZUNvbG8gPSAoMCwgX3V0aWxzLm5vcm1hbGl6ZVR3b1RvbmVDb2xvcnMpKHR3b1RvbmVDb2xvciksXG4gICAgICBfbm9ybWFsaXplVHdvVG9uZUNvbG8yID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfbm9ybWFsaXplVHdvVG9uZUNvbG8sIDIpLFxuICAgICAgcHJpbWFyeUNvbG9yID0gX25vcm1hbGl6ZVR3b1RvbmVDb2xvMlswXSxcbiAgICAgIHNlY29uZGFyeUNvbG9yID0gX25vcm1hbGl6ZVR3b1RvbmVDb2xvMlsxXTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgcm9sZTogXCJpbWdcIixcbiAgICBcImFyaWEtbGFiZWxcIjogaWNvbi5uYW1lXG4gIH0sIHJlc3RQcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIHRhYkluZGV4OiBpY29uVGFiSW5kZXgsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nXG4gIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9JY29uQmFzZS5kZWZhdWx0LCB7XG4gICAgY2xhc3NOYW1lOiBzdmdDbGFzc1N0cmluZyxcbiAgICBpY29uOiBpY29uLFxuICAgIHByaW1hcnlDb2xvcjogcHJpbWFyeUNvbG9yLFxuICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvcixcbiAgICBzdHlsZTogc3ZnU3R5bGVcbiAgfSkpO1xufSk7XG5JY29uLmRpc3BsYXlOYW1lID0gJ0FudGRJY29uJztcbkljb24uZ2V0VHdvVG9uZUNvbG9yID0gX3R3b1RvbmVQcmltYXJ5Q29sb3IuZ2V0VHdvVG9uZUNvbG9yO1xuSWNvbi5zZXRUd29Ub25lQ29sb3IgPSBfdHdvVG9uZVByaW1hcnlDb2xvci5zZXRUd29Ub25lQ29sb3I7XG52YXIgX2RlZmF1bHQgPSBJY29uO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuXG52YXIgdHdvVG9uZUNvbG9yUGFsZXR0ZSA9IHtcbiAgcHJpbWFyeUNvbG9yOiAnIzMzMycsXG4gIHNlY29uZGFyeUNvbG9yOiAnI0U2RTZFNicsXG4gIGNhbGN1bGF0ZWQ6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBzZXRUd29Ub25lQ29sb3JzKF9yZWYpIHtcbiAgdmFyIHByaW1hcnlDb2xvciA9IF9yZWYucHJpbWFyeUNvbG9yLFxuICAgICAgc2Vjb25kYXJ5Q29sb3IgPSBfcmVmLnNlY29uZGFyeUNvbG9yO1xuICB0d29Ub25lQ29sb3JQYWxldHRlLnByaW1hcnlDb2xvciA9IHByaW1hcnlDb2xvcjtcbiAgdHdvVG9uZUNvbG9yUGFsZXR0ZS5zZWNvbmRhcnlDb2xvciA9IHNlY29uZGFyeUNvbG9yIHx8ICgwLCBfdXRpbHMuZ2V0U2Vjb25kYXJ5Q29sb3IpKHByaW1hcnlDb2xvcik7XG4gIHR3b1RvbmVDb2xvclBhbGV0dGUuY2FsY3VsYXRlZCA9ICEhc2Vjb25kYXJ5Q29sb3I7XG59XG5cbmZ1bmN0aW9uIGdldFR3b1RvbmVDb2xvcnMoKSB7XG4gIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHR3b1RvbmVDb2xvclBhbGV0dGUpO1xufVxuXG52YXIgSWNvbkJhc2UgPSBmdW5jdGlvbiBJY29uQmFzZShwcm9wcykge1xuICB2YXIgaWNvbiA9IHByb3BzLmljb24sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBwcmltYXJ5Q29sb3IgPSBwcm9wcy5wcmltYXJ5Q29sb3IsXG4gICAgICBzZWNvbmRhcnlDb2xvciA9IHByb3BzLnNlY29uZGFyeUNvbG9yLFxuICAgICAgcmVzdFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkocHJvcHMsIFtcImljb25cIiwgXCJjbGFzc05hbWVcIiwgXCJvbkNsaWNrXCIsIFwic3R5bGVcIiwgXCJwcmltYXJ5Q29sb3JcIiwgXCJzZWNvbmRhcnlDb2xvclwiXSk7XG4gIHZhciBjb2xvcnMgPSB0d29Ub25lQ29sb3JQYWxldHRlO1xuXG4gIGlmIChwcmltYXJ5Q29sb3IpIHtcbiAgICBjb2xvcnMgPSB7XG4gICAgICBwcmltYXJ5Q29sb3I6IHByaW1hcnlDb2xvcixcbiAgICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvciB8fCAoMCwgX3V0aWxzLmdldFNlY29uZGFyeUNvbG9yKShwcmltYXJ5Q29sb3IpXG4gICAgfTtcbiAgfVxuXG4gICgwLCBfdXRpbHMudXNlSW5zZXJ0U3R5bGVzKSgpO1xuICAoMCwgX3V0aWxzLndhcm5pbmcpKCgwLCBfdXRpbHMuaXNJY29uRGVmaW5pdGlvbikoaWNvbiksIFwiaWNvbiBzaG91bGQgYmUgaWNvbiBkZWZpbml0b24sIGJ1dCBnb3QgXCIuY29uY2F0KGljb24pKTtcblxuICBpZiAoISgwLCBfdXRpbHMuaXNJY29uRGVmaW5pdGlvbikoaWNvbikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSBpY29uO1xuXG4gIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC5pY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGFyZ2V0ID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgdGFyZ2V0KSwge30sIHtcbiAgICAgIGljb246IHRhcmdldC5pY29uKGNvbG9ycy5wcmltYXJ5Q29sb3IsIGNvbG9ycy5zZWNvbmRhcnlDb2xvcilcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiAoMCwgX3V0aWxzLmdlbmVyYXRlKSh0YXJnZXQuaWNvbiwgXCJzdmctXCIuY29uY2F0KHRhcmdldC5uYW1lKSwgKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICAnZGF0YS1pY29uJzogdGFyZ2V0Lm5hbWUsXG4gICAgd2lkdGg6ICcxZW0nLFxuICAgIGhlaWdodDogJzFlbScsXG4gICAgZmlsbDogJ2N1cnJlbnRDb2xvcicsXG4gICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnXG4gIH0sIHJlc3RQcm9wcykpO1xufTtcblxuSWNvbkJhc2UuZGlzcGxheU5hbWUgPSAnSWNvblJlYWN0Jztcbkljb25CYXNlLmdldFR3b1RvbmVDb2xvcnMgPSBnZXRUd29Ub25lQ29sb3JzO1xuSWNvbkJhc2Uuc2V0VHdvVG9uZUNvbG9ycyA9IHNldFR3b1RvbmVDb2xvcnM7XG52YXIgX2RlZmF1bHQgPSBJY29uQmFzZTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuc2V0VHdvVG9uZUNvbG9yID0gc2V0VHdvVG9uZUNvbG9yO1xuZXhwb3J0cy5nZXRUd29Ub25lQ29sb3IgPSBnZXRUd29Ub25lQ29sb3I7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX0ljb25CYXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JY29uQmFzZVwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbmZ1bmN0aW9uIHNldFR3b1RvbmVDb2xvcih0d29Ub25lQ29sb3IpIHtcbiAgdmFyIF9ub3JtYWxpemVUd29Ub25lQ29sbyA9ICgwLCBfdXRpbHMubm9ybWFsaXplVHdvVG9uZUNvbG9ycykodHdvVG9uZUNvbG9yKSxcbiAgICAgIF9ub3JtYWxpemVUd29Ub25lQ29sbzIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9ub3JtYWxpemVUd29Ub25lQ29sbywgMiksXG4gICAgICBwcmltYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzBdLFxuICAgICAgc2Vjb25kYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzFdO1xuXG4gIHJldHVybiBfSWNvbkJhc2UuZGVmYXVsdC5zZXRUd29Ub25lQ29sb3JzKHtcbiAgICBwcmltYXJ5Q29sb3I6IHByaW1hcnlDb2xvcixcbiAgICBzZWNvbmRhcnlDb2xvcjogc2Vjb25kYXJ5Q29sb3JcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFR3b1RvbmVDb2xvcigpIHtcbiAgdmFyIGNvbG9ycyA9IF9JY29uQmFzZS5kZWZhdWx0LmdldFR3b1RvbmVDb2xvcnMoKTtcblxuICBpZiAoIWNvbG9ycy5jYWxjdWxhdGVkKSB7XG4gICAgcmV0dXJuIGNvbG9ycy5wcmltYXJ5Q29sb3I7XG4gIH1cblxuICByZXR1cm4gW2NvbG9ycy5wcmltYXJ5Q29sb3IsIGNvbG9ycy5zZWNvbmRhcnlDb2xvcl07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0Fycm93TGVmdE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQXJyb3dMZWZ0T3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgQXJyb3dMZWZ0T3V0bGluZWQgPSBmdW5jdGlvbiBBcnJvd0xlZnRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9BcnJvd0xlZnRPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkFycm93TGVmdE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0Fycm93TGVmdE91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihBcnJvd0xlZnRPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9BcnJvd1JpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9BcnJvd1JpZ2h0T3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgQXJyb3dSaWdodE91dGxpbmVkID0gZnVuY3Rpb24gQXJyb3dSaWdodE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0Fycm93UmlnaHRPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkFycm93UmlnaHRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdBcnJvd1JpZ2h0T3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKEFycm93UmlnaHRPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9CYXJzT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9CYXJzT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgQmFyc091dGxpbmVkID0gZnVuY3Rpb24gQmFyc091dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0JhcnNPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkJhcnNPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdCYXJzT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKEJhcnNPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9DYWxlbmRhck91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ2FsZW5kYXJPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBDYWxlbmRhck91dGxpbmVkID0gZnVuY3Rpb24gQ2FsZW5kYXJPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9DYWxlbmRhck91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuQ2FsZW5kYXJPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdDYWxlbmRhck91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihDYWxlbmRhck91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0NhcmV0RG93bkZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0NhcmV0RG93bkZpbGxlZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBDYXJldERvd25GaWxsZWQgPSBmdW5jdGlvbiBDYXJldERvd25GaWxsZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfQ2FyZXREb3duRmlsbGVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuQ2FyZXREb3duRmlsbGVkLmRpc3BsYXlOYW1lID0gJ0NhcmV0RG93bkZpbGxlZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoQ2FyZXREb3duRmlsbGVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0NhcmV0RG93bk91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ2FyZXREb3duT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgQ2FyZXREb3duT3V0bGluZWQgPSBmdW5jdGlvbiBDYXJldERvd25PdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9DYXJldERvd25PdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkNhcmV0RG93bk91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0NhcmV0RG93bk91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihDYXJldERvd25PdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9DYXJldFVwT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9DYXJldFVwT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgQ2FyZXRVcE91dGxpbmVkID0gZnVuY3Rpb24gQ2FyZXRVcE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0NhcmV0VXBPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkNhcmV0VXBPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdDYXJldFVwT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKENhcmV0VXBPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9DaGVja0NpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0NoZWNrQ2lyY2xlRmlsbGVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIENoZWNrQ2lyY2xlRmlsbGVkID0gZnVuY3Rpb24gQ2hlY2tDaXJjbGVGaWxsZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfQ2hlY2tDaXJjbGVGaWxsZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5DaGVja0NpcmNsZUZpbGxlZC5kaXNwbGF5TmFtZSA9ICdDaGVja0NpcmNsZUZpbGxlZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoQ2hlY2tDaXJjbGVGaWxsZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfQ2hlY2tDaXJjbGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0NoZWNrQ2lyY2xlT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgQ2hlY2tDaXJjbGVPdXRsaW5lZCA9IGZ1bmN0aW9uIENoZWNrQ2lyY2xlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfQ2hlY2tDaXJjbGVPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkNoZWNrQ2lyY2xlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2hlY2tDaXJjbGVPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoQ2hlY2tDaXJjbGVPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9DaGVja091dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ2hlY2tPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBDaGVja091dGxpbmVkID0gZnVuY3Rpb24gQ2hlY2tPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9DaGVja091dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuQ2hlY2tPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdDaGVja091dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihDaGVja091dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0Nsb2NrQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9DbG9ja0NpcmNsZU91dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIENsb2NrQ2lyY2xlT3V0bGluZWQgPSBmdW5jdGlvbiBDbG9ja0NpcmNsZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0Nsb2NrQ2lyY2xlT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5DbG9ja0NpcmNsZU91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0Nsb2NrQ2lyY2xlT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKENsb2NrQ2lyY2xlT3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfQ2xvc2VDaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9DbG9zZUNpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBDbG9zZUNpcmNsZUZpbGxlZCA9IGZ1bmN0aW9uIENsb3NlQ2lyY2xlRmlsbGVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0Nsb3NlQ2lyY2xlRmlsbGVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuQ2xvc2VDaXJjbGVGaWxsZWQuZGlzcGxheU5hbWUgPSAnQ2xvc2VDaXJjbGVGaWxsZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKENsb3NlQ2lyY2xlRmlsbGVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0Nsb3NlQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9DbG9zZUNpcmNsZU91dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIENsb3NlQ2lyY2xlT3V0bGluZWQgPSBmdW5jdGlvbiBDbG9zZUNpcmNsZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0Nsb3NlQ2lyY2xlT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5DbG9zZUNpcmNsZU91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0Nsb3NlQ2lyY2xlT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKENsb3NlQ2lyY2xlT3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfQ2xvc2VPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Nsb3NlT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgQ2xvc2VPdXRsaW5lZCA9IGZ1bmN0aW9uIENsb3NlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfQ2xvc2VPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkNsb3NlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2xvc2VPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoQ2xvc2VPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Db3B5T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Db3B5T3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgQ29weU91dGxpbmVkID0gZnVuY3Rpb24gQ29weU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0NvcHlPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkNvcHlPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdDb3B5T3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKENvcHlPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9EZWxldGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0RlbGV0ZU91dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIERlbGV0ZU91dGxpbmVkID0gZnVuY3Rpb24gRGVsZXRlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRGVsZXRlT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5EZWxldGVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdEZWxldGVPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRGVsZXRlT3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfRG91YmxlTGVmdE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRG91YmxlTGVmdE91dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIERvdWJsZUxlZnRPdXRsaW5lZCA9IGZ1bmN0aW9uIERvdWJsZUxlZnRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9Eb3VibGVMZWZ0T3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5Eb3VibGVMZWZ0T3V0bGluZWQuZGlzcGxheU5hbWUgPSAnRG91YmxlTGVmdE91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihEb3VibGVMZWZ0T3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfRG91YmxlUmlnaHRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0RvdWJsZVJpZ2h0T3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgRG91YmxlUmlnaHRPdXRsaW5lZCA9IGZ1bmN0aW9uIERvdWJsZVJpZ2h0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRG91YmxlUmlnaHRPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkRvdWJsZVJpZ2h0T3V0bGluZWQuZGlzcGxheU5hbWUgPSAnRG91YmxlUmlnaHRPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRG91YmxlUmlnaHRPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Eb3duT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Eb3duT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgRG93bk91dGxpbmVkID0gZnVuY3Rpb24gRG93bk91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0Rvd25PdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkRvd25PdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdEb3duT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKERvd25PdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Eb3dubG9hZE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRG93bmxvYWRPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBEb3dubG9hZE91dGxpbmVkID0gZnVuY3Rpb24gRG93bmxvYWRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9Eb3dubG9hZE91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuRG93bmxvYWRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdEb3dubG9hZE91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihEb3dubG9hZE91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0VkaXRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0VkaXRPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBFZGl0T3V0bGluZWQgPSBmdW5jdGlvbiBFZGl0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRWRpdE91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuRWRpdE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0VkaXRPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRWRpdE91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0VsbGlwc2lzT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9FbGxpcHNpc091dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIEVsbGlwc2lzT3V0bGluZWQgPSBmdW5jdGlvbiBFbGxpcHNpc091dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0VsbGlwc2lzT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5FbGxpcHNpc091dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0VsbGlwc2lzT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKEVsbGlwc2lzT3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfRW50ZXJPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0VudGVyT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgRW50ZXJPdXRsaW5lZCA9IGZ1bmN0aW9uIEVudGVyT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRW50ZXJPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkVudGVyT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnRW50ZXJPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRW50ZXJPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkID0gZnVuY3Rpb24gRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZC5kaXNwbGF5TmFtZSA9ICdFeGNsYW1hdGlvbkNpcmNsZUZpbGxlZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0V4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCA9IGZ1bmN0aW9uIEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9FeWVJbnZpc2libGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0V5ZUludmlzaWJsZU91dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIEV5ZUludmlzaWJsZU91dGxpbmVkID0gZnVuY3Rpb24gRXllSW52aXNpYmxlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRXllSW52aXNpYmxlT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5FeWVJbnZpc2libGVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdFeWVJbnZpc2libGVPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRXllSW52aXNpYmxlT3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfRXllT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9FeWVPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBFeWVPdXRsaW5lZCA9IGZ1bmN0aW9uIEV5ZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0V5ZU91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuRXllT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnRXllT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKEV5ZU91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0ZpbGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0ZpbGVPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBGaWxlT3V0bGluZWQgPSBmdW5jdGlvbiBGaWxlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRmlsZU91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuRmlsZU91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0ZpbGVPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRmlsZU91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0ZpbGVUd29Ub25lID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRmlsZVR3b1RvbmVcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgRmlsZVR3b1RvbmUgPSBmdW5jdGlvbiBGaWxlVHdvVG9uZShwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9GaWxlVHdvVG9uZS5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkZpbGVUd29Ub25lLmRpc3BsYXlOYW1lID0gJ0ZpbGVUd29Ub25lJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihGaWxlVHdvVG9uZSk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9GaWx0ZXJGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9GaWx0ZXJGaWxsZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgRmlsdGVyRmlsbGVkID0gZnVuY3Rpb24gRmlsdGVyRmlsbGVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0ZpbHRlckZpbGxlZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkZpbHRlckZpbGxlZC5kaXNwbGF5TmFtZSA9ICdGaWx0ZXJGaWxsZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKEZpbHRlckZpbGxlZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Gb2xkZXJPcGVuT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Gb2xkZXJPcGVuT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgRm9sZGVyT3Blbk91dGxpbmVkID0gZnVuY3Rpb24gRm9sZGVyT3Blbk91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0ZvbGRlck9wZW5PdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkZvbGRlck9wZW5PdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdGb2xkZXJPcGVuT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKEZvbGRlck9wZW5PdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Gb2xkZXJPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0ZvbGRlck91dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIEZvbGRlck91dGxpbmVkID0gZnVuY3Rpb24gRm9sZGVyT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRm9sZGVyT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5Gb2xkZXJPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdGb2xkZXJPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRm9sZGVyT3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfSW5mb0NpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0luZm9DaXJjbGVGaWxsZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgSW5mb0NpcmNsZUZpbGxlZCA9IGZ1bmN0aW9uIEluZm9DaXJjbGVGaWxsZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfSW5mb0NpcmNsZUZpbGxlZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkluZm9DaXJjbGVGaWxsZWQuZGlzcGxheU5hbWUgPSAnSW5mb0NpcmNsZUZpbGxlZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoSW5mb0NpcmNsZUZpbGxlZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9JbmZvQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9JbmZvQ2lyY2xlT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgSW5mb0NpcmNsZU91dGxpbmVkID0gZnVuY3Rpb24gSW5mb0NpcmNsZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0luZm9DaXJjbGVPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkluZm9DaXJjbGVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdJbmZvQ2lyY2xlT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKEluZm9DaXJjbGVPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9MZWZ0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9MZWZ0T3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgTGVmdE91dGxpbmVkID0gZnVuY3Rpb24gTGVmdE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0xlZnRPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkxlZnRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdMZWZ0T3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKExlZnRPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Mb2FkaW5nT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Mb2FkaW5nT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgTG9hZGluZ091dGxpbmVkID0gZnVuY3Rpb24gTG9hZGluZ091dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0xvYWRpbmdPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cbkxvYWRpbmdPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdMb2FkaW5nT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKExvYWRpbmdPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9NaW51c1NxdWFyZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vTWludXNTcXVhcmVPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBNaW51c1NxdWFyZU91dGxpbmVkID0gZnVuY3Rpb24gTWludXNTcXVhcmVPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9NaW51c1NxdWFyZU91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuTWludXNTcXVhcmVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdNaW51c1NxdWFyZU91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihNaW51c1NxdWFyZU91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1BhcGVyQ2xpcE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vUGFwZXJDbGlwT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgUGFwZXJDbGlwT3V0bGluZWQgPSBmdW5jdGlvbiBQYXBlckNsaXBPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9QYXBlckNsaXBPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cblBhcGVyQ2xpcE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1BhcGVyQ2xpcE91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihQYXBlckNsaXBPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9QaWN0dXJlVHdvVG9uZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL1BpY3R1cmVUd29Ub25lXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIFBpY3R1cmVUd29Ub25lID0gZnVuY3Rpb24gUGljdHVyZVR3b1RvbmUocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfUGljdHVyZVR3b1RvbmUuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5QaWN0dXJlVHdvVG9uZS5kaXNwbGF5TmFtZSA9ICdQaWN0dXJlVHdvVG9uZSc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoUGljdHVyZVR3b1RvbmUpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfUGx1c091dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vUGx1c091dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIFBsdXNPdXRsaW5lZCA9IGZ1bmN0aW9uIFBsdXNPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9QbHVzT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5QbHVzT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnUGx1c091dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihQbHVzT3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfUGx1c1NxdWFyZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vUGx1c1NxdWFyZU91dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIFBsdXNTcXVhcmVPdXRsaW5lZCA9IGZ1bmN0aW9uIFBsdXNTcXVhcmVPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9QbHVzU3F1YXJlT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5QbHVzU3F1YXJlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnUGx1c1NxdWFyZU91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihQbHVzU3F1YXJlT3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfUmVkb091dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vUmVkb091dGxpbmVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIFJlZG9PdXRsaW5lZCA9IGZ1bmN0aW9uIFJlZG9PdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9SZWRvT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5SZWRvT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnUmVkb091dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihSZWRvT3V0bGluZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfUmlnaHRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL1JpZ2h0T3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgUmlnaHRPdXRsaW5lZCA9IGZ1bmN0aW9uIFJpZ2h0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfUmlnaHRPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cblJpZ2h0T3V0bGluZWQuZGlzcGxheU5hbWUgPSAnUmlnaHRPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoUmlnaHRPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Sb3RhdGVMZWZ0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Sb3RhdGVMZWZ0T3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgUm90YXRlTGVmdE91dGxpbmVkID0gZnVuY3Rpb24gUm90YXRlTGVmdE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX1JvdGF0ZUxlZnRPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cblJvdGF0ZUxlZnRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdSb3RhdGVMZWZ0T3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKFJvdGF0ZUxlZnRPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Sb3RhdGVSaWdodE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vUm90YXRlUmlnaHRPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBSb3RhdGVSaWdodE91dGxpbmVkID0gZnVuY3Rpb24gUm90YXRlUmlnaHRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9Sb3RhdGVSaWdodE91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuUm90YXRlUmlnaHRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdSb3RhdGVSaWdodE91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihSb3RhdGVSaWdodE91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1NlYXJjaE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vU2VhcmNoT3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgU2VhcmNoT3V0bGluZWQgPSBmdW5jdGlvbiBTZWFyY2hPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9TZWFyY2hPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cblNlYXJjaE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1NlYXJjaE91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihTZWFyY2hPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9TdGFyRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vU3RhckZpbGxlZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBTdGFyRmlsbGVkID0gZnVuY3Rpb24gU3RhckZpbGxlZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9TdGFyRmlsbGVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuU3RhckZpbGxlZC5kaXNwbGF5TmFtZSA9ICdTdGFyRmlsbGVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihTdGFyRmlsbGVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1N3YXBSaWdodE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vU3dhcFJpZ2h0T3V0bGluZWRcIikpO1xuXG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG52YXIgU3dhcFJpZ2h0T3V0bGluZWQgPSBmdW5jdGlvbiBTd2FwUmlnaHRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9Td2FwUmlnaHRPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5cblN3YXBSaWdodE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1N3YXBSaWdodE91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihTd2FwUmlnaHRPdXRsaW5lZCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9VcE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vVXBPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBVcE91dGxpbmVkID0gZnVuY3Rpb24gVXBPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9VcE91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuVXBPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdVcE91dGxpbmVkJztcblxudmFyIF9kZWZhdWx0ID0gUmVhY3QuZm9yd2FyZFJlZihVcE91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1ZlcnRpY2FsQWxpZ25Ub3BPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL1ZlcnRpY2FsQWxpZ25Ub3BPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBWZXJ0aWNhbEFsaWduVG9wT3V0bGluZWQgPSBmdW5jdGlvbiBWZXJ0aWNhbEFsaWduVG9wT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfVmVydGljYWxBbGlnblRvcE91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuVmVydGljYWxBbGlnblRvcE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1ZlcnRpY2FsQWxpZ25Ub3BPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoVmVydGljYWxBbGlnblRvcE91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1dhcm5pbmdGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9XYXJuaW5nRmlsbGVkXCIpKTtcblxudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuXG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxudmFyIFdhcm5pbmdGaWxsZWQgPSBmdW5jdGlvbiBXYXJuaW5nRmlsbGVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX1dhcm5pbmdGaWxsZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuXG5XYXJuaW5nRmlsbGVkLmRpc3BsYXlOYW1lID0gJ1dhcm5pbmdGaWxsZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKFdhcm5pbmdGaWxsZWQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfWm9vbUluT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9ab29tSW5PdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBab29tSW5PdXRsaW5lZCA9IGZ1bmN0aW9uIFpvb21Jbk91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX1pvb21Jbk91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuWm9vbUluT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnWm9vbUluT3V0bGluZWQnO1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKFpvb21Jbk91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1pvb21PdXRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL1pvb21PdXRPdXRsaW5lZFwiKSk7XG5cbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcblxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbnZhciBab29tT3V0T3V0bGluZWQgPSBmdW5jdGlvbiBab29tT3V0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfWm9vbU91dE91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcblxuWm9vbU91dE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1pvb21PdXRPdXRsaW5lZCc7XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoWm9vbU91dE91dGxpbmVkKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy53YXJuaW5nID0gd2FybmluZztcbmV4cG9ydHMuaXNJY29uRGVmaW5pdGlvbiA9IGlzSWNvbkRlZmluaXRpb247XG5leHBvcnRzLm5vcm1hbGl6ZUF0dHJzID0gbm9ybWFsaXplQXR0cnM7XG5leHBvcnRzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG5leHBvcnRzLmdldFNlY29uZGFyeUNvbG9yID0gZ2V0U2Vjb25kYXJ5Q29sb3I7XG5leHBvcnRzLm5vcm1hbGl6ZVR3b1RvbmVDb2xvcnMgPSBub3JtYWxpemVUd29Ub25lQ29sb3JzO1xuZXhwb3J0cy51c2VJbnNlcnRTdHlsZXMgPSBleHBvcnRzLmljb25TdHlsZXMgPSBleHBvcnRzLnN2Z0Jhc2VQcm9wcyA9IHZvaWQgMDtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX2NvbG9ycyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jb2xvcnNcIik7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3dhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi93YXJuaW5nXCIpKTtcblxudmFyIF9pbnNlcnRDc3MgPSByZXF1aXJlKFwiaW5zZXJ0LWNzc1wiKTtcblxuZnVuY3Rpb24gd2FybmluZyh2YWxpZCwgbWVzc2FnZSkge1xuICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkodmFsaWQsIFwiW0BhbnQtZGVzaWduL2ljb25zXSBcIi5jb25jYXQobWVzc2FnZSkpO1xufVxuXG5mdW5jdGlvbiBpc0ljb25EZWZpbml0aW9uKHRhcmdldCkge1xuICByZXR1cm4gKDAsIF90eXBlb2YyLmRlZmF1bHQpKHRhcmdldCkgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXQubmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHRhcmdldC50aGVtZSA9PT0gJ3N0cmluZycgJiYgKCgwLCBfdHlwZW9mMi5kZWZhdWx0KSh0YXJnZXQuaWNvbikgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB0YXJnZXQuaWNvbiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF0dHJzKCkge1xuICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cnMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICB2YXIgdmFsID0gYXR0cnNba2V5XTtcblxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIGFjYy5jbGFzc05hbWUgPSB2YWw7XG4gICAgICAgIGRlbGV0ZSBhY2MuY2xhc3M7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhY2Nba2V5XSA9IHZhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlKG5vZGUsIGtleSwgcm9vdFByb3BzKSB7XG4gIGlmICghcm9vdFByb3BzKSB7XG4gICAgcmV0dXJuIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobm9kZS50YWcsICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAgICBrZXk6IGtleVxuICAgIH0sIG5vcm1hbGl6ZUF0dHJzKG5vZGUuYXR0cnMpKSwgKG5vZGUuY2hpbGRyZW4gfHwgW10pLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGUoY2hpbGQsIFwiXCIuY29uY2F0KGtleSwgXCItXCIpLmNvbmNhdChub2RlLnRhZywgXCItXCIpLmNvbmNhdChpbmRleCkpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG5vZGUudGFnLCAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHtcbiAgICBrZXk6IGtleVxuICB9LCBub3JtYWxpemVBdHRycyhub2RlLmF0dHJzKSksIHJvb3RQcm9wcyksIChub2RlLmNoaWxkcmVuIHx8IFtdKS5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2Vjb25kYXJ5Q29sb3IocHJpbWFyeUNvbG9yKSB7XG4gIC8vIGNob29zZSB0aGUgc2Vjb25kIGNvbG9yXG4gIHJldHVybiAoMCwgX2NvbG9ycy5nZW5lcmF0ZSkocHJpbWFyeUNvbG9yKVswXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVHdvVG9uZUNvbG9ycyh0d29Ub25lQ29sb3IpIHtcbiAgaWYgKCF0d29Ub25lQ29sb3IpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0d29Ub25lQ29sb3IpID8gdHdvVG9uZUNvbG9yIDogW3R3b1RvbmVDb2xvcl07XG59IC8vIFRoZXNlIHByb3BzIG1ha2Ugc3VyZSB0aGF0IHRoZSBTVkcgYmVoYXZpb3VycyBsaWtlIGdlbmVyYWwgdGV4dC5cbi8vIFJlZmVyZW5jZTogaHR0cHM6Ly9ibG9nLnByb3RvdHlwci5pby9hbGlnbi1zdmctaWNvbnMtdG8tdGV4dC1hbmQtc2F5LWdvb2RieWUtdG8tZm9udC1pY29ucy1kNDRiM2Q3YjI2YjRcblxuXG52YXIgc3ZnQmFzZVByb3BzID0ge1xuICB3aWR0aDogJzFlbScsXG4gIGhlaWdodDogJzFlbScsXG4gIGZpbGw6ICdjdXJyZW50Q29sb3InLFxuICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsXG4gIGZvY3VzYWJsZTogJ2ZhbHNlJ1xufTtcbmV4cG9ydHMuc3ZnQmFzZVByb3BzID0gc3ZnQmFzZVByb3BzO1xudmFyIGljb25TdHlsZXMgPSBcIlxcbi5hbnRpY29uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIGNvbG9yOiBpbmhlcml0O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGluZS1oZWlnaHQ6IDA7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG4gIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTtcXG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XFxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XFxufVxcblxcbi5hbnRpY29uID4gKiB7XFxuICBsaW5lLWhlaWdodDogMTtcXG59XFxuXFxuLmFudGljb24gc3ZnIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmFudGljb246OmJlZm9yZSB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uYW50aWNvbiAuYW50aWNvbi1pY29uIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4uYW50aWNvblt0YWJpbmRleF0ge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG4uYW50aWNvbi1zcGluOjpiZWZvcmUsXFxuLmFudGljb24tc3BpbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XFxuICBhbmltYXRpb246IGxvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xcbn1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZGluZ0NpcmNsZSB7XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgfVxcbn1cXG5cXG5Aa2V5ZnJhbWVzIGxvYWRpbmdDaXJjbGUge1xcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXG4gIH1cXG59XFxuXCI7XG5leHBvcnRzLmljb25TdHlsZXMgPSBpY29uU3R5bGVzO1xudmFyIGNzc0luamVjdGVkRmxhZyA9IGZhbHNlO1xuXG52YXIgdXNlSW5zZXJ0U3R5bGVzID0gZnVuY3Rpb24gdXNlSW5zZXJ0U3R5bGVzKCkge1xuICB2YXIgc3R5bGVTdHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGljb25TdHlsZXM7XG4gICgwLCBfcmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFjc3NJbmplY3RlZEZsYWcpIHtcbiAgICAgICgwLCBfaW5zZXJ0Q3NzLmluc2VydENzcykoc3R5bGVTdHIsIHtcbiAgICAgICAgcHJlcGVuZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjc3NJbmplY3RlZEZsYWcgPSB0cnVlO1xuICAgIH1cbiAgfSwgW10pO1xufTtcblxuZXhwb3J0cy51c2VJbnNlcnRTdHlsZXMgPSB1c2VJbnNlcnRTdHlsZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdGlueWNvbG9yMl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJ0aW55Y29sb3IyXCIpKTtcbnZhciBodWVTdGVwID0gMjsgLy8g6Imy55u46Zi25qKvXG52YXIgc2F0dXJhdGlvblN0ZXAgPSAxNjsgLy8g6aWx5ZKM5bqm6Zi25qKv77yM5rWF6Imy6YOo5YiGXG52YXIgc2F0dXJhdGlvblN0ZXAyID0gNTsgLy8g6aWx5ZKM5bqm6Zi25qKv77yM5rex6Imy6YOo5YiGXG52YXIgYnJpZ2h0bmVzc1N0ZXAxID0gNTsgLy8g5Lqu5bqm6Zi25qKv77yM5rWF6Imy6YOo5YiGXG52YXIgYnJpZ2h0bmVzc1N0ZXAyID0gMTU7IC8vIOS6ruW6pumYtuair++8jOa3seiJsumDqOWIhlxudmFyIGxpZ2h0Q29sb3JDb3VudCA9IDU7IC8vIOa1heiJsuaVsOmHj++8jOS4u+iJsuS4ilxudmFyIGRhcmtDb2xvckNvdW50ID0gNDsgLy8g5rex6Imy5pWw6YeP77yM5Li76Imy5LiLXG5mdW5jdGlvbiBnZXRIdWUoaHN2LCBpLCBsaWdodCkge1xuICAgIHZhciBodWU7XG4gICAgLy8g5qC55o2u6Imy55u45LiN5ZCM77yM6Imy55u46L2s5ZCR5LiN5ZCMXG4gICAgaWYgKE1hdGgucm91bmQoaHN2LmgpID49IDYwICYmIE1hdGgucm91bmQoaHN2LmgpIDw9IDI0MCkge1xuICAgICAgICBodWUgPSBsaWdodCA/IE1hdGgucm91bmQoaHN2LmgpIC0gaHVlU3RlcCAqIGkgOiBNYXRoLnJvdW5kKGhzdi5oKSArIGh1ZVN0ZXAgKiBpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaHVlID0gbGlnaHQgPyBNYXRoLnJvdW5kKGhzdi5oKSArIGh1ZVN0ZXAgKiBpIDogTWF0aC5yb3VuZChoc3YuaCkgLSBodWVTdGVwICogaTtcbiAgICB9XG4gICAgaWYgKGh1ZSA8IDApIHtcbiAgICAgICAgaHVlICs9IDM2MDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaHVlID49IDM2MCkge1xuICAgICAgICBodWUgLT0gMzYwO1xuICAgIH1cbiAgICByZXR1cm4gaHVlO1xufVxuZnVuY3Rpb24gZ2V0U2F0dXJhdGlvbihoc3YsIGksIGxpZ2h0KSB7XG4gICAgLy8gZ3JleSBjb2xvciBkb24ndCBjaGFuZ2Ugc2F0dXJhdGlvblxuICAgIGlmIChoc3YuaCA9PT0gMCAmJiBoc3YucyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaHN2LnM7XG4gICAgfVxuICAgIHZhciBzYXR1cmF0aW9uO1xuICAgIGlmIChsaWdodCkge1xuICAgICAgICBzYXR1cmF0aW9uID0gTWF0aC5yb3VuZChoc3YucyAqIDEwMCkgLSBzYXR1cmF0aW9uU3RlcCAqIGk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGkgPT09IGRhcmtDb2xvckNvdW50KSB7XG4gICAgICAgIHNhdHVyYXRpb24gPSBNYXRoLnJvdW5kKGhzdi5zICogMTAwKSArIHNhdHVyYXRpb25TdGVwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2F0dXJhdGlvbiA9IE1hdGgucm91bmQoaHN2LnMgKiAxMDApICsgc2F0dXJhdGlvblN0ZXAyICogaTtcbiAgICB9XG4gICAgLy8g6L6555WM5YC85L+u5q2jXG4gICAgaWYgKHNhdHVyYXRpb24gPiAxMDApIHtcbiAgICAgICAgc2F0dXJhdGlvbiA9IDEwMDtcbiAgICB9XG4gICAgLy8g56ys5LiA5qC855qEIHMg6ZmQ5Yi25ZyoIDYtMTAg5LmL6Ze0XG4gICAgaWYgKGxpZ2h0ICYmIGkgPT09IGxpZ2h0Q29sb3JDb3VudCAmJiBzYXR1cmF0aW9uID4gMTApIHtcbiAgICAgICAgc2F0dXJhdGlvbiA9IDEwO1xuICAgIH1cbiAgICBpZiAoc2F0dXJhdGlvbiA8IDYpIHtcbiAgICAgICAgc2F0dXJhdGlvbiA9IDY7XG4gICAgfVxuICAgIHJldHVybiBzYXR1cmF0aW9uO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWUoaHN2LCBpLCBsaWdodCkge1xuICAgIGlmIChsaWdodCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoc3YudiAqIDEwMCkgKyBicmlnaHRuZXNzU3RlcDEgKiBpO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5yb3VuZChoc3YudiAqIDEwMCkgLSBicmlnaHRuZXNzU3RlcDIgKiBpO1xufVxuZnVuY3Rpb24gZ2VuZXJhdGUoY29sb3IpIHtcbiAgICB2YXIgcGF0dGVybnMgPSBbXTtcbiAgICB2YXIgcENvbG9yID0gdGlueWNvbG9yMl8xLmRlZmF1bHQoY29sb3IpO1xuICAgIGZvciAodmFyIGkgPSBsaWdodENvbG9yQ291bnQ7IGkgPiAwOyBpIC09IDEpIHtcbiAgICAgICAgdmFyIGhzdiA9IHBDb2xvci50b0hzdigpO1xuICAgICAgICB2YXIgY29sb3JTdHJpbmcgPSB0aW55Y29sb3IyXzEuZGVmYXVsdCh7XG4gICAgICAgICAgICBoOiBnZXRIdWUoaHN2LCBpLCB0cnVlKSxcbiAgICAgICAgICAgIHM6IGdldFNhdHVyYXRpb24oaHN2LCBpLCB0cnVlKSxcbiAgICAgICAgICAgIHY6IGdldFZhbHVlKGhzdiwgaSwgdHJ1ZSksXG4gICAgICAgIH0pLnRvSGV4U3RyaW5nKCk7XG4gICAgICAgIHBhdHRlcm5zLnB1c2goY29sb3JTdHJpbmcpO1xuICAgIH1cbiAgICBwYXR0ZXJucy5wdXNoKHBDb2xvci50b0hleFN0cmluZygpKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBkYXJrQ29sb3JDb3VudDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBoc3YgPSBwQ29sb3IudG9Ic3YoKTtcbiAgICAgICAgdmFyIGNvbG9yU3RyaW5nID0gdGlueWNvbG9yMl8xLmRlZmF1bHQoe1xuICAgICAgICAgICAgaDogZ2V0SHVlKGhzdiwgaSksXG4gICAgICAgICAgICBzOiBnZXRTYXR1cmF0aW9uKGhzdiwgaSksXG4gICAgICAgICAgICB2OiBnZXRWYWx1ZShoc3YsIGkpLFxuICAgICAgICB9KS50b0hleFN0cmluZygpO1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGNvbG9yU3RyaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm5zO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZ2VuZXJhdGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBnZW5lcmF0ZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2dlbmVyYXRlXCIpKTtcbmV4cG9ydHMuZ2VuZXJhdGUgPSBnZW5lcmF0ZV8xLmRlZmF1bHQ7XG52YXIgcHJlc2V0UHJpbWFyeUNvbG9ycyA9IHtcbiAgICByZWQ6ICcjRjUyMjJEJyxcbiAgICB2b2xjYW5vOiAnI0ZBNTQxQycsXG4gICAgb3JhbmdlOiAnI0ZBOEMxNicsXG4gICAgZ29sZDogJyNGQUFEMTQnLFxuICAgIHllbGxvdzogJyNGQURCMTQnLFxuICAgIGxpbWU6ICcjQTBEOTExJyxcbiAgICBncmVlbjogJyM1MkM0MUEnLFxuICAgIGN5YW46ICcjMTNDMkMyJyxcbiAgICBibHVlOiAnIzE4OTBGRicsXG4gICAgZ2Vla2JsdWU6ICcjMkY1NEVCJyxcbiAgICBwdXJwbGU6ICcjNzIyRUQxJyxcbiAgICBtYWdlbnRhOiAnI0VCMkY5NicsXG4gICAgZ3JleTogJyM2NjY2NjYnLFxufTtcbmV4cG9ydHMucHJlc2V0UHJpbWFyeUNvbG9ycyA9IHByZXNldFByaW1hcnlDb2xvcnM7XG52YXIgcHJlc2V0UGFsZXR0ZXMgPSB7fTtcbmV4cG9ydHMucHJlc2V0UGFsZXR0ZXMgPSBwcmVzZXRQYWxldHRlcztcbk9iamVjdC5rZXlzKHByZXNldFByaW1hcnlDb2xvcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHByZXNldFBhbGV0dGVzW2tleV0gPSBnZW5lcmF0ZV8xLmRlZmF1bHQocHJlc2V0UHJpbWFyeUNvbG9yc1trZXldKTtcbiAgICBwcmVzZXRQYWxldHRlc1trZXldLnByaW1hcnkgPSBwcmVzZXRQYWxldHRlc1trZXldWzVdO1xufSk7XG52YXIgcmVkID0gcHJlc2V0UGFsZXR0ZXMucmVkO1xuZXhwb3J0cy5yZWQgPSByZWQ7XG52YXIgdm9sY2FubyA9IHByZXNldFBhbGV0dGVzLnZvbGNhbm87XG5leHBvcnRzLnZvbGNhbm8gPSB2b2xjYW5vO1xudmFyIGdvbGQgPSBwcmVzZXRQYWxldHRlcy5nb2xkO1xuZXhwb3J0cy5nb2xkID0gZ29sZDtcbnZhciBvcmFuZ2UgPSBwcmVzZXRQYWxldHRlcy5vcmFuZ2U7XG5leHBvcnRzLm9yYW5nZSA9IG9yYW5nZTtcbnZhciB5ZWxsb3cgPSBwcmVzZXRQYWxldHRlcy55ZWxsb3c7XG5leHBvcnRzLnllbGxvdyA9IHllbGxvdztcbnZhciBsaW1lID0gcHJlc2V0UGFsZXR0ZXMubGltZTtcbmV4cG9ydHMubGltZSA9IGxpbWU7XG52YXIgZ3JlZW4gPSBwcmVzZXRQYWxldHRlcy5ncmVlbjtcbmV4cG9ydHMuZ3JlZW4gPSBncmVlbjtcbnZhciBjeWFuID0gcHJlc2V0UGFsZXR0ZXMuY3lhbjtcbmV4cG9ydHMuY3lhbiA9IGN5YW47XG52YXIgYmx1ZSA9IHByZXNldFBhbGV0dGVzLmJsdWU7XG5leHBvcnRzLmJsdWUgPSBibHVlO1xudmFyIGdlZWtibHVlID0gcHJlc2V0UGFsZXR0ZXMuZ2Vla2JsdWU7XG5leHBvcnRzLmdlZWtibHVlID0gZ2Vla2JsdWU7XG52YXIgcHVycGxlID0gcHJlc2V0UGFsZXR0ZXMucHVycGxlO1xuZXhwb3J0cy5wdXJwbGUgPSBwdXJwbGU7XG52YXIgbWFnZW50YSA9IHByZXNldFBhbGV0dGVzLm1hZ2VudGE7XG5leHBvcnRzLm1hZ2VudGEgPSBtYWdlbnRhO1xudmFyIGdyZXkgPSBwcmVzZXRQYWxldHRlcy5ncmV5O1xuZXhwb3J0cy5ncmV5ID0gZ3JleTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuTmV4dEFycm93ID0gZXhwb3J0cy5QcmV2QXJyb3cgPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9pbm5lclNsaWRlclV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHMvaW5uZXJTbGlkZXJVdGlsc1wiKTtcblxudmFyIFByZXZBcnJvdyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JFB1cmVDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShQcmV2QXJyb3csIF9SZWFjdCRQdXJlQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShQcmV2QXJyb3cpO1xuXG4gIGZ1bmN0aW9uIFByZXZBcnJvdygpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIFByZXZBcnJvdyk7XG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShQcmV2QXJyb3csIFt7XG4gICAga2V5OiBcImNsaWNrSGFuZGxlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGlja0hhbmRsZXIob3B0aW9ucywgZSkge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb3BzLmNsaWNrSGFuZGxlcihvcHRpb25zLCBlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBwcmV2Q2xhc3NlcyA9IHtcbiAgICAgICAgXCJzbGljay1hcnJvd1wiOiB0cnVlLFxuICAgICAgICBcInNsaWNrLXByZXZcIjogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHZhciBwcmV2SGFuZGxlciA9IHRoaXMuY2xpY2tIYW5kbGVyLmJpbmQodGhpcywge1xuICAgICAgICBtZXNzYWdlOiBcInByZXZpb3VzXCJcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRoaXMucHJvcHMuaW5maW5pdGUgJiYgKHRoaXMucHJvcHMuY3VycmVudFNsaWRlID09PSAwIHx8IHRoaXMucHJvcHMuc2xpZGVDb3VudCA8PSB0aGlzLnByb3BzLnNsaWRlc1RvU2hvdykpIHtcbiAgICAgICAgcHJldkNsYXNzZXNbXCJzbGljay1kaXNhYmxlZFwiXSA9IHRydWU7XG4gICAgICAgIHByZXZIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHByZXZBcnJvd1Byb3BzID0ge1xuICAgICAgICBrZXk6IFwiMFwiLFxuICAgICAgICBcImRhdGEtcm9sZVwiOiBcIm5vbmVcIixcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmV2Q2xhc3NlcyksXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgZGlzcGxheTogXCJibG9ja1wiXG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xpY2s6IHByZXZIYW5kbGVyXG4gICAgICB9O1xuICAgICAgdmFyIGN1c3RvbVByb3BzID0ge1xuICAgICAgICBjdXJyZW50U2xpZGU6IHRoaXMucHJvcHMuY3VycmVudFNsaWRlLFxuICAgICAgICBzbGlkZUNvdW50OiB0aGlzLnByb3BzLnNsaWRlQ291bnRcbiAgICAgIH07XG4gICAgICB2YXIgcHJldkFycm93O1xuXG4gICAgICBpZiAodGhpcy5wcm9wcy5wcmV2QXJyb3cpIHtcbiAgICAgICAgcHJldkFycm93ID0gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY2xvbmVFbGVtZW50KHRoaXMucHJvcHMucHJldkFycm93LCAoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgcHJldkFycm93UHJvcHMpLCBjdXN0b21Qcm9wcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJldkFycm93ID0gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgIGtleTogXCIwXCIsXG4gICAgICAgICAgdHlwZTogXCJidXR0b25cIlxuICAgICAgICB9LCBwcmV2QXJyb3dQcm9wcyksIFwiIFwiLCBcIlByZXZpb3VzXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldkFycm93O1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gUHJldkFycm93O1xufShfcmVhY3RbXCJkZWZhdWx0XCJdLlB1cmVDb21wb25lbnQpO1xuXG5leHBvcnRzLlByZXZBcnJvdyA9IFByZXZBcnJvdztcblxudmFyIE5leHRBcnJvdyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JFB1cmVDb21wb25lbnQyKSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoTmV4dEFycm93LCBfUmVhY3QkUHVyZUNvbXBvbmVudDIpO1xuXG4gIHZhciBfc3VwZXIyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShOZXh0QXJyb3cpO1xuXG4gIGZ1bmN0aW9uIE5leHRBcnJvdygpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIE5leHRBcnJvdyk7XG4gICAgcmV0dXJuIF9zdXBlcjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoTmV4dEFycm93LCBbe1xuICAgIGtleTogXCJjbGlja0hhbmRsZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2tIYW5kbGVyKG9wdGlvbnMsIGUpIHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9wcy5jbGlja0hhbmRsZXIob3B0aW9ucywgZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgbmV4dENsYXNzZXMgPSB7XG4gICAgICAgIFwic2xpY2stYXJyb3dcIjogdHJ1ZSxcbiAgICAgICAgXCJzbGljay1uZXh0XCI6IHRydWVcbiAgICAgIH07XG4gICAgICB2YXIgbmV4dEhhbmRsZXIgPSB0aGlzLmNsaWNrSGFuZGxlci5iaW5kKHRoaXMsIHtcbiAgICAgICAgbWVzc2FnZTogXCJuZXh0XCJcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoISgwLCBfaW5uZXJTbGlkZXJVdGlscy5jYW5Hb05leHQpKHRoaXMucHJvcHMpKSB7XG4gICAgICAgIG5leHRDbGFzc2VzW1wic2xpY2stZGlzYWJsZWRcIl0gPSB0cnVlO1xuICAgICAgICBuZXh0SGFuZGxlciA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0QXJyb3dQcm9wcyA9IHtcbiAgICAgICAga2V5OiBcIjFcIixcbiAgICAgICAgXCJkYXRhLXJvbGVcIjogXCJub25lXCIsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkobmV4dENsYXNzZXMpLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIlxuICAgICAgICB9LFxuICAgICAgICBvbkNsaWNrOiBuZXh0SGFuZGxlclxuICAgICAgfTtcbiAgICAgIHZhciBjdXN0b21Qcm9wcyA9IHtcbiAgICAgICAgY3VycmVudFNsaWRlOiB0aGlzLnByb3BzLmN1cnJlbnRTbGlkZSxcbiAgICAgICAgc2xpZGVDb3VudDogdGhpcy5wcm9wcy5zbGlkZUNvdW50XG4gICAgICB9O1xuICAgICAgdmFyIG5leHRBcnJvdztcblxuICAgICAgaWYgKHRoaXMucHJvcHMubmV4dEFycm93KSB7XG4gICAgICAgIG5leHRBcnJvdyA9IC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNsb25lRWxlbWVudCh0aGlzLnByb3BzLm5leHRBcnJvdywgKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIG5leHRBcnJvd1Byb3BzKSwgY3VzdG9tUHJvcHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRBcnJvdyA9IC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgICBrZXk6IFwiMVwiLFxuICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCJcbiAgICAgICAgfSwgbmV4dEFycm93UHJvcHMpLCBcIiBcIiwgXCJOZXh0XCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dEFycm93O1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gTmV4dEFycm93O1xufShfcmVhY3RbXCJkZWZhdWx0XCJdLlB1cmVDb21wb25lbnQpO1xuXG5leHBvcnRzLk5leHRBcnJvdyA9IE5leHRBcnJvdzsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYWNjZXNzaWJpbGl0eTogdHJ1ZSxcbiAgYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICBhZnRlckNoYW5nZTogbnVsbCxcbiAgYXBwZW5kRG90czogZnVuY3Rpb24gYXBwZW5kRG90cyhkb3RzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCJcbiAgICAgIH1cbiAgICB9LCBkb3RzKTtcbiAgfSxcbiAgYXJyb3dzOiB0cnVlLFxuICBhdXRvcGxheTogZmFsc2UsXG4gIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXG4gIGJlZm9yZUNoYW5nZTogbnVsbCxcbiAgY2VudGVyTW9kZTogZmFsc2UsXG4gIGNlbnRlclBhZGRpbmc6IFwiNTBweFwiLFxuICBjbGFzc05hbWU6IFwiXCIsXG4gIGNzc0Vhc2U6IFwiZWFzZVwiLFxuICBjdXN0b21QYWdpbmc6IGZ1bmN0aW9uIGN1c3RvbVBhZ2luZyhpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgbnVsbCwgaSArIDEpO1xuICB9LFxuICBkb3RzOiBmYWxzZSxcbiAgZG90c0NsYXNzOiBcInNsaWNrLWRvdHNcIixcbiAgZHJhZ2dhYmxlOiB0cnVlLFxuICBlYXNpbmc6IFwibGluZWFyXCIsXG4gIGVkZ2VGcmljdGlvbjogMC4zNSxcbiAgZmFkZTogZmFsc2UsXG4gIGZvY3VzT25TZWxlY3Q6IGZhbHNlLFxuICBpbmZpbml0ZTogdHJ1ZSxcbiAgaW5pdGlhbFNsaWRlOiAwLFxuICBsYXp5TG9hZDogbnVsbCxcbiAgbmV4dEFycm93OiBudWxsLFxuICBvbkVkZ2U6IG51bGwsXG4gIG9uSW5pdDogbnVsbCxcbiAgb25MYXp5TG9hZEVycm9yOiBudWxsLFxuICBvblJlSW5pdDogbnVsbCxcbiAgcGF1c2VPbkRvdHNIb3ZlcjogZmFsc2UsXG4gIHBhdXNlT25Gb2N1czogZmFsc2UsXG4gIHBhdXNlT25Ib3ZlcjogdHJ1ZSxcbiAgcHJldkFycm93OiBudWxsLFxuICByZXNwb25zaXZlOiBudWxsLFxuICByb3dzOiAxLFxuICBydGw6IGZhbHNlLFxuICBzbGlkZTogXCJkaXZcIixcbiAgc2xpZGVzUGVyUm93OiAxLFxuICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgc2xpZGVzVG9TaG93OiAxLFxuICBzcGVlZDogNTAwLFxuICBzd2lwZTogdHJ1ZSxcbiAgc3dpcGVFdmVudDogbnVsbCxcbiAgc3dpcGVUb1NsaWRlOiBmYWxzZSxcbiAgdG91Y2hNb3ZlOiB0cnVlLFxuICB0b3VjaFRocmVzaG9sZDogNSxcbiAgdXNlQ1NTOiB0cnVlLFxuICB1c2VUcmFuc2Zvcm06IHRydWUsXG4gIHZhcmlhYmxlV2lkdGg6IGZhbHNlLFxuICB2ZXJ0aWNhbDogZmFsc2UsXG4gIHdhaXRGb3JBbmltYXRlOiB0cnVlXG59O1xudmFyIF9kZWZhdWx0ID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkRvdHMgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2lubmVyU2xpZGVyVXRpbHMgPSByZXF1aXJlKFwiLi91dGlscy9pbm5lclNsaWRlclV0aWxzXCIpO1xuXG52YXIgZ2V0RG90Q291bnQgPSBmdW5jdGlvbiBnZXREb3RDb3VudChzcGVjKSB7XG4gIHZhciBkb3RzO1xuXG4gIGlmIChzcGVjLmluZmluaXRlKSB7XG4gICAgZG90cyA9IE1hdGguY2VpbChzcGVjLnNsaWRlQ291bnQgLyBzcGVjLnNsaWRlc1RvU2Nyb2xsKTtcbiAgfSBlbHNlIHtcbiAgICBkb3RzID0gTWF0aC5jZWlsKChzcGVjLnNsaWRlQ291bnQgLSBzcGVjLnNsaWRlc1RvU2hvdykgLyBzcGVjLnNsaWRlc1RvU2Nyb2xsKSArIDE7XG4gIH1cblxuICByZXR1cm4gZG90cztcbn07XG5cbnZhciBEb3RzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkUHVyZUNvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKERvdHMsIF9SZWFjdCRQdXJlQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShEb3RzKTtcblxuICBmdW5jdGlvbiBEb3RzKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgRG90cyk7XG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShEb3RzLCBbe1xuICAgIGtleTogXCJjbGlja0hhbmRsZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2tIYW5kbGVyKG9wdGlvbnMsIGUpIHtcbiAgICAgIC8vIEluIEF1dG9wbGF5IHRoZSBmb2N1cyBzdGF5cyBvbiBjbGlja2VkIGJ1dHRvbiBldmVuIGFmdGVyIHRyYW5zaXRpb25cbiAgICAgIC8vIHRvIG5leHQgc2xpZGUuIFRoYXQgb25seSBnb2VzIGF3YXkgYnkgY2xpY2sgc29tZXdoZXJlIG91dHNpZGVcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMucHJvcHMuY2xpY2tIYW5kbGVyKG9wdGlvbnMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbk1vdXNlRW50ZXIgPSBfdGhpcyRwcm9wcy5vbk1vdXNlRW50ZXIsXG4gICAgICAgICAgb25Nb3VzZU92ZXIgPSBfdGhpcyRwcm9wcy5vbk1vdXNlT3ZlcixcbiAgICAgICAgICBvbk1vdXNlTGVhdmUgPSBfdGhpcyRwcm9wcy5vbk1vdXNlTGVhdmUsXG4gICAgICAgICAgaW5maW5pdGUgPSBfdGhpcyRwcm9wcy5pbmZpbml0ZSxcbiAgICAgICAgICBzbGlkZXNUb1Njcm9sbCA9IF90aGlzJHByb3BzLnNsaWRlc1RvU2Nyb2xsLFxuICAgICAgICAgIHNsaWRlc1RvU2hvdyA9IF90aGlzJHByb3BzLnNsaWRlc1RvU2hvdyxcbiAgICAgICAgICBzbGlkZUNvdW50ID0gX3RoaXMkcHJvcHMuc2xpZGVDb3VudCxcbiAgICAgICAgICBjdXJyZW50U2xpZGUgPSBfdGhpcyRwcm9wcy5jdXJyZW50U2xpZGU7XG4gICAgICB2YXIgZG90Q291bnQgPSBnZXREb3RDb3VudCh7XG4gICAgICAgIHNsaWRlQ291bnQ6IHNsaWRlQ291bnQsXG4gICAgICAgIHNsaWRlc1RvU2Nyb2xsOiBzbGlkZXNUb1Njcm9sbCxcbiAgICAgICAgc2xpZGVzVG9TaG93OiBzbGlkZXNUb1Nob3csXG4gICAgICAgIGluZmluaXRlOiBpbmZpbml0ZVxuICAgICAgfSk7XG4gICAgICB2YXIgbW91c2VFdmVudHMgPSB7XG4gICAgICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlT3Zlcjogb25Nb3VzZU92ZXIsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlXG4gICAgICB9O1xuICAgICAgdmFyIGRvdHMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb3RDb3VudDsgaSsrKSB7XG4gICAgICAgIHZhciBfcmlnaHRCb3VuZCA9IChpICsgMSkgKiBzbGlkZXNUb1Njcm9sbCAtIDE7XG5cbiAgICAgICAgdmFyIHJpZ2h0Qm91bmQgPSBpbmZpbml0ZSA/IF9yaWdodEJvdW5kIDogKDAsIF9pbm5lclNsaWRlclV0aWxzLmNsYW1wKShfcmlnaHRCb3VuZCwgMCwgc2xpZGVDb3VudCAtIDEpO1xuXG4gICAgICAgIHZhciBfbGVmdEJvdW5kID0gcmlnaHRCb3VuZCAtIChzbGlkZXNUb1Njcm9sbCAtIDEpO1xuXG4gICAgICAgIHZhciBsZWZ0Qm91bmQgPSBpbmZpbml0ZSA/IF9sZWZ0Qm91bmQgOiAoMCwgX2lubmVyU2xpZGVyVXRpbHMuY2xhbXApKF9sZWZ0Qm91bmQsIDAsIHNsaWRlQ291bnQgLSAxKTtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgICBcInNsaWNrLWFjdGl2ZVwiOiBpbmZpbml0ZSA/IGN1cnJlbnRTbGlkZSA+PSBsZWZ0Qm91bmQgJiYgY3VycmVudFNsaWRlIDw9IHJpZ2h0Qm91bmQgOiBjdXJyZW50U2xpZGUgPT09IGxlZnRCb3VuZFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGRvdE9wdGlvbnMgPSB7XG4gICAgICAgICAgbWVzc2FnZTogXCJkb3RzXCIsXG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgc2xpZGVzVG9TY3JvbGw6IHNsaWRlc1RvU2Nyb2xsLFxuICAgICAgICAgIGN1cnJlbnRTbGlkZTogY3VycmVudFNsaWRlXG4gICAgICAgIH07XG4gICAgICAgIHZhciBvbkNsaWNrID0gdGhpcy5jbGlja0hhbmRsZXIuYmluZCh0aGlzLCBkb3RPcHRpb25zKTtcbiAgICAgICAgZG90cyA9IGRvdHMuY29uY2F0KCAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICAgIGtleTogaSxcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jbG9uZUVsZW1lbnQodGhpcy5wcm9wcy5jdXN0b21QYWdpbmcoaSksIHtcbiAgICAgICAgICBvbkNsaWNrOiBvbkNsaWNrXG4gICAgICAgIH0pKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jbG9uZUVsZW1lbnQodGhpcy5wcm9wcy5hcHBlbmREb3RzKGRvdHMpLCAoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIGNsYXNzTmFtZTogdGhpcy5wcm9wcy5kb3RzQ2xhc3NcbiAgICAgIH0sIG1vdXNlRXZlbnRzKSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBEb3RzO1xufShfcmVhY3RbXCJkZWZhdWx0XCJdLlB1cmVDb21wb25lbnQpO1xuXG5leHBvcnRzLkRvdHMgPSBEb3RzOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3NsaWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc2xpZGVyXCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX3NsaWRlcltcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG52YXIgaW5pdGlhbFN0YXRlID0ge1xuICBhbmltYXRpbmc6IGZhbHNlLFxuICBhdXRvcGxheWluZzogbnVsbCxcbiAgY3VycmVudERpcmVjdGlvbjogMCxcbiAgY3VycmVudExlZnQ6IG51bGwsXG4gIGN1cnJlbnRTbGlkZTogMCxcbiAgZGlyZWN0aW9uOiAxLFxuICBkcmFnZ2luZzogZmFsc2UsXG4gIGVkZ2VEcmFnZ2VkOiBmYWxzZSxcbiAgaW5pdGlhbGl6ZWQ6IGZhbHNlLFxuICBsYXp5TG9hZGVkTGlzdDogW10sXG4gIGxpc3RIZWlnaHQ6IG51bGwsXG4gIGxpc3RXaWR0aDogbnVsbCxcbiAgc2Nyb2xsaW5nOiBmYWxzZSxcbiAgc2xpZGVDb3VudDogbnVsbCxcbiAgc2xpZGVIZWlnaHQ6IG51bGwsXG4gIHNsaWRlV2lkdGg6IG51bGwsXG4gIHN3aXBlTGVmdDogbnVsbCxcbiAgc3dpcGVkOiBmYWxzZSxcbiAgLy8gdXNlZCBieSBzd2lwZUV2ZW50LiBkaWZmZXJlbnRpdGVzIGJldHdlZW4gdG91Y2ggYW5kIHN3aXBlLlxuICBzd2lwaW5nOiBmYWxzZSxcbiAgdG91Y2hPYmplY3Q6IHtcbiAgICBzdGFydFg6IDAsXG4gICAgc3RhcnRZOiAwLFxuICAgIGN1clg6IDAsXG4gICAgY3VyWTogMFxuICB9LFxuICB0cmFja1N0eWxlOiB7fSxcbiAgdHJhY2tXaWR0aDogMCxcbiAgdGFyZ2V0U2xpZGU6IDBcbn07XG52YXIgX2RlZmF1bHQgPSBpbml0aWFsU3RhdGU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuSW5uZXJTbGlkZXIgPSB2b2lkIDA7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9pbml0aWFsU3RhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2luaXRpYWwtc3RhdGVcIikpO1xuXG52YXIgX2RlYm91bmNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwibG9kYXNoL2RlYm91bmNlXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfaW5uZXJTbGlkZXJVdGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzL2lubmVyU2xpZGVyVXRpbHNcIik7XG5cbnZhciBfdHJhY2sgPSByZXF1aXJlKFwiLi90cmFja1wiKTtcblxudmFyIF9kb3RzID0gcmVxdWlyZShcIi4vZG90c1wiKTtcblxudmFyIF9hcnJvd3MgPSByZXF1aXJlKFwiLi9hcnJvd3NcIik7XG5cbnZhciBfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbFwiKSk7XG5cbnZhciBJbm5lclNsaWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKElubmVyU2xpZGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShJbm5lclNsaWRlcik7XG5cbiAgZnVuY3Rpb24gSW5uZXJTbGlkZXIocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIElubmVyU2xpZGVyKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJsaXN0UmVmSGFuZGxlclwiLCBmdW5jdGlvbiAocmVmKSB7XG4gICAgICByZXR1cm4gX3RoaXMubGlzdCA9IHJlZjtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJ0cmFja1JlZkhhbmRsZXJcIiwgZnVuY3Rpb24gKHJlZikge1xuICAgICAgcmV0dXJuIF90aGlzLnRyYWNrID0gcmVmO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcImFkYXB0SGVpZ2h0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5hZGFwdGl2ZUhlaWdodCAmJiBfdGhpcy5saXN0KSB7XG4gICAgICAgIHZhciBlbGVtID0gX3RoaXMubGlzdC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtaW5kZXg9XFxcIlwiLmNvbmNhdChfdGhpcy5zdGF0ZS5jdXJyZW50U2xpZGUsIFwiXFxcIl1cIikpO1xuXG4gICAgICAgIF90aGlzLmxpc3Quc3R5bGUuaGVpZ2h0ID0gKDAsIF9pbm5lclNsaWRlclV0aWxzLmdldEhlaWdodCkoZWxlbSkgKyBcInB4XCI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwiY29tcG9uZW50RGlkTW91bnRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMucHJvcHMub25Jbml0ICYmIF90aGlzLnByb3BzLm9uSW5pdCgpO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMubGF6eUxvYWQpIHtcbiAgICAgICAgdmFyIHNsaWRlc1RvTG9hZCA9ICgwLCBfaW5uZXJTbGlkZXJVdGlscy5nZXRPbkRlbWFuZExhenlTbGlkZXMpKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBfdGhpcy5wcm9wcyksIF90aGlzLnN0YXRlKSk7XG5cbiAgICAgICAgaWYgKHNsaWRlc1RvTG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbGF6eUxvYWRlZExpc3Q6IHByZXZTdGF0ZS5sYXp5TG9hZGVkTGlzdC5jb25jYXQoc2xpZGVzVG9Mb2FkKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkxhenlMb2FkKSB7XG4gICAgICAgICAgICBfdGhpcy5wcm9wcy5vbkxhenlMb2FkKHNsaWRlc1RvTG9hZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBzcGVjID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICBsaXN0UmVmOiBfdGhpcy5saXN0LFxuICAgICAgICB0cmFja1JlZjogX3RoaXMudHJhY2tcbiAgICAgIH0sIF90aGlzLnByb3BzKTtcblxuICAgICAgX3RoaXMudXBkYXRlU3RhdGUoc3BlYywgdHJ1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5hZGFwdEhlaWdodCgpO1xuXG4gICAgICAgIF90aGlzLnByb3BzLmF1dG9wbGF5ICYmIF90aGlzLmF1dG9QbGF5KFwidXBkYXRlXCIpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5sYXp5TG9hZCA9PT0gXCJwcm9ncmVzc2l2ZVwiKSB7XG4gICAgICAgIF90aGlzLmxhenlMb2FkVGltZXIgPSBzZXRJbnRlcnZhbChfdGhpcy5wcm9ncmVzc2l2ZUxhenlMb2FkLCAxMDAwKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMucm8gPSBuZXcgX3Jlc2l6ZU9ic2VydmVyUG9seWZpbGxbXCJkZWZhdWx0XCJdKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzLnN0YXRlLmFuaW1hdGluZykge1xuICAgICAgICAgIF90aGlzLm9uV2luZG93UmVzaXplZChmYWxzZSk7IC8vIGRvbid0IHNldCB0cmFja1N0eWxlIGhlbmNlIGRvbid0IGJyZWFrIGFuaW1hdGlvblxuXG5cbiAgICAgICAgICBfdGhpcy5jYWxsYmFja1RpbWVycy5wdXNoKHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLm9uV2luZG93UmVzaXplZCgpO1xuICAgICAgICAgIH0sIF90aGlzLnByb3BzLnNwZWVkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMub25XaW5kb3dSZXNpemVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5yby5vYnNlcnZlKF90aGlzLmxpc3QpO1xuXG4gICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuc2xpY2stc2xpZGVcIiksIGZ1bmN0aW9uIChzbGlkZSkge1xuICAgICAgICBzbGlkZS5vbmZvY3VzID0gX3RoaXMucHJvcHMucGF1c2VPbkZvY3VzID8gX3RoaXMub25TbGlkZUZvY3VzIDogbnVsbDtcbiAgICAgICAgc2xpZGUub25ibHVyID0gX3RoaXMucHJvcHMucGF1c2VPbkZvY3VzID8gX3RoaXMub25TbGlkZUJsdXIgOiBudWxsO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBfdGhpcy5vbldpbmRvd1Jlc2l6ZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmF0dGFjaEV2ZW50KFwib25yZXNpemVcIiwgX3RoaXMub25XaW5kb3dSZXNpemVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuYW5pbWF0aW9uRW5kQ2FsbGJhY2spIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLmFuaW1hdGlvbkVuZENhbGxiYWNrKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLmxhenlMb2FkVGltZXIpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChfdGhpcy5sYXp5TG9hZFRpbWVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLmNhbGxiYWNrVGltZXJzLmxlbmd0aCkge1xuICAgICAgICBfdGhpcy5jYWxsYmFja1RpbWVycy5mb3JFYWNoKGZ1bmN0aW9uICh0aW1lcikge1xuICAgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpcy5jYWxsYmFja1RpbWVycyA9IFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgX3RoaXMub25XaW5kb3dSZXNpemVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kZXRhY2hFdmVudChcIm9ucmVzaXplXCIsIF90aGlzLm9uV2luZG93UmVzaXplZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5hdXRvcGxheVRpbWVyKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoX3RoaXMuYXV0b3BsYXlUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnJvLmRpc2Nvbm5lY3QoKTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJjb21wb25lbnREaWRVcGRhdGVcIiwgZnVuY3Rpb24gKHByZXZQcm9wcykge1xuICAgICAgX3RoaXMuY2hlY2tJbWFnZXNMb2FkKCk7XG5cbiAgICAgIF90aGlzLnByb3BzLm9uUmVJbml0ICYmIF90aGlzLnByb3BzLm9uUmVJbml0KCk7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5sYXp5TG9hZCkge1xuICAgICAgICB2YXIgc2xpZGVzVG9Mb2FkID0gKDAsIF9pbm5lclNsaWRlclV0aWxzLmdldE9uRGVtYW5kTGF6eVNsaWRlcykoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIF90aGlzLnByb3BzKSwgX3RoaXMuc3RhdGUpKTtcblxuICAgICAgICBpZiAoc2xpZGVzVG9Mb2FkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBsYXp5TG9hZGVkTGlzdDogcHJldlN0YXRlLmxhenlMb2FkZWRMaXN0LmNvbmNhdChzbGlkZXNUb0xvYWQpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKF90aGlzLnByb3BzLm9uTGF6eUxvYWQpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uTGF6eUxvYWQoc2xpZGVzVG9Mb2FkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gaWYgKHRoaXMucHJvcHMub25MYXp5TG9hZCkge1xuICAgICAgLy8gICB0aGlzLnByb3BzLm9uTGF6eUxvYWQoW2xlZnRNb3N0U2xpZGVdKVxuICAgICAgLy8gfVxuXG5cbiAgICAgIF90aGlzLmFkYXB0SGVpZ2h0KCk7XG5cbiAgICAgIHZhciBzcGVjID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICBsaXN0UmVmOiBfdGhpcy5saXN0LFxuICAgICAgICB0cmFja1JlZjogX3RoaXMudHJhY2tcbiAgICAgIH0sIF90aGlzLnByb3BzKSwgX3RoaXMuc3RhdGUpO1xuXG4gICAgICB2YXIgc2V0VHJhY2tTdHlsZSA9IF90aGlzLmRpZFByb3BzQ2hhbmdlKHByZXZQcm9wcyk7XG5cbiAgICAgIHNldFRyYWNrU3R5bGUgJiYgX3RoaXMudXBkYXRlU3RhdGUoc3BlYywgc2V0VHJhY2tTdHlsZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuc3RhdGUuY3VycmVudFNsaWRlID49IF9yZWFjdFtcImRlZmF1bHRcIl0uQ2hpbGRyZW4uY291bnQoX3RoaXMucHJvcHMuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgX3RoaXMuY2hhbmdlU2xpZGUoe1xuICAgICAgICAgICAgbWVzc2FnZTogXCJpbmRleFwiLFxuICAgICAgICAgICAgaW5kZXg6IF9yZWFjdFtcImRlZmF1bHRcIl0uQ2hpbGRyZW4uY291bnQoX3RoaXMucHJvcHMuY2hpbGRyZW4pIC0gX3RoaXMucHJvcHMuc2xpZGVzVG9TaG93LFxuICAgICAgICAgICAgY3VycmVudFNsaWRlOiBfdGhpcy5zdGF0ZS5jdXJyZW50U2xpZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2UHJvcHMuYXV0b3BsYXkgIT09IF90aGlzLnByb3BzLmF1dG9wbGF5IHx8IHByZXZQcm9wcy5hdXRvcGxheVNwZWVkICE9PSBfdGhpcy5wcm9wcy5hdXRvcGxheVNwZWVkKSB7XG4gICAgICAgICAgaWYgKF90aGlzLnByb3BzLmF1dG9wbGF5KSB7XG4gICAgICAgICAgICBfdGhpcy5hdXRvUGxheShcInVwZGF0ZVwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMucGF1c2UoXCJwYXVzZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJvbldpbmRvd1Jlc2l6ZWRcIiwgZnVuY3Rpb24gKHNldFRyYWNrU3R5bGUpIHtcbiAgICAgIGlmIChfdGhpcy5kZWJvdW5jZWRSZXNpemUpIF90aGlzLmRlYm91bmNlZFJlc2l6ZS5jYW5jZWwoKTtcbiAgICAgIF90aGlzLmRlYm91bmNlZFJlc2l6ZSA9ICgwLCBfZGVib3VuY2VbXCJkZWZhdWx0XCJdKShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5yZXNpemVXaW5kb3coc2V0VHJhY2tTdHlsZSk7XG4gICAgICB9LCA1MCk7XG5cbiAgICAgIF90aGlzLmRlYm91bmNlZFJlc2l6ZSgpO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcInJlc2l6ZVdpbmRvd1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2V0VHJhY2tTdHlsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICAgIHZhciBpc1RyYWNrTW91bnRlZCA9IEJvb2xlYW4oX3RoaXMudHJhY2sgJiYgX3RoaXMudHJhY2subm9kZSk7IC8vIHByZXZlbnQgd2FybmluZzogc2V0dGluZyBzdGF0ZSBvbiB1bm1vdW50ZWQgY29tcG9uZW50IChzZXJ2ZXIgc2lkZSByZW5kZXJpbmcpXG5cbiAgICAgIGlmICghaXNUcmFja01vdW50ZWQpIHJldHVybjtcbiAgICAgIHZhciBzcGVjID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICBsaXN0UmVmOiBfdGhpcy5saXN0LFxuICAgICAgICB0cmFja1JlZjogX3RoaXMudHJhY2tcbiAgICAgIH0sIF90aGlzLnByb3BzKSwgX3RoaXMuc3RhdGUpO1xuXG4gICAgICBfdGhpcy51cGRhdGVTdGF0ZShzcGVjLCBzZXRUcmFja1N0eWxlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy5hdXRvcGxheSkgX3RoaXMuYXV0b1BsYXkoXCJ1cGRhdGVcIik7ZWxzZSBfdGhpcy5wYXVzZShcInBhdXNlZFwiKTtcbiAgICAgIH0pOyAvLyBhbmltYXRpbmcgc3RhdGUgc2hvdWxkIGJlIGNsZWFyZWQgd2hpbGUgcmVzaXppbmcsIG90aGVyd2lzZSBhdXRvcGxheSBzdG9wcyB3b3JraW5nXG5cblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhbmltYXRpbmc6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLmFuaW1hdGlvbkVuZENhbGxiYWNrKTtcbiAgICAgIGRlbGV0ZSBfdGhpcy5hbmltYXRpb25FbmRDYWxsYmFjaztcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJ1cGRhdGVTdGF0ZVwiLCBmdW5jdGlvbiAoc3BlYywgc2V0VHJhY2tTdHlsZSwgY2FsbGJhY2spIHtcbiAgICAgIHZhciB1cGRhdGVkU3RhdGUgPSAoMCwgX2lubmVyU2xpZGVyVXRpbHMuaW5pdGlhbGl6ZWRTdGF0ZSkoc3BlYyk7XG4gICAgICBzcGVjID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIHNwZWMpLCB1cGRhdGVkU3RhdGUpLCB7fSwge1xuICAgICAgICBzbGlkZUluZGV4OiB1cGRhdGVkU3RhdGUuY3VycmVudFNsaWRlXG4gICAgICB9KTtcbiAgICAgIHZhciB0YXJnZXRMZWZ0ID0gKDAsIF9pbm5lclNsaWRlclV0aWxzLmdldFRyYWNrTGVmdCkoc3BlYyk7XG4gICAgICBzcGVjID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIHNwZWMpLCB7fSwge1xuICAgICAgICBsZWZ0OiB0YXJnZXRMZWZ0XG4gICAgICB9KTtcbiAgICAgIHZhciB0cmFja1N0eWxlID0gKDAsIF9pbm5lclNsaWRlclV0aWxzLmdldFRyYWNrQ1NTKShzcGVjKTtcblxuICAgICAgaWYgKHNldFRyYWNrU3R5bGUgfHwgX3JlYWN0W1wiZGVmYXVsdFwiXS5DaGlsZHJlbi5jb3VudChfdGhpcy5wcm9wcy5jaGlsZHJlbikgIT09IF9yZWFjdFtcImRlZmF1bHRcIl0uQ2hpbGRyZW4uY291bnQoc3BlYy5jaGlsZHJlbikpIHtcbiAgICAgICAgdXBkYXRlZFN0YXRlW1widHJhY2tTdHlsZVwiXSA9IHRyYWNrU3R5bGU7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHVwZGF0ZWRTdGF0ZSwgY2FsbGJhY2spO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcInNzckluaXRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLnZhcmlhYmxlV2lkdGgpIHtcbiAgICAgICAgdmFyIF90cmFja1dpZHRoID0gMCxcbiAgICAgICAgICAgIF90cmFja0xlZnQgPSAwO1xuICAgICAgICB2YXIgY2hpbGRyZW5XaWR0aHMgPSBbXTtcbiAgICAgICAgdmFyIHByZUNsb25lcyA9ICgwLCBfaW5uZXJTbGlkZXJVdGlscy5nZXRQcmVDbG9uZXMpKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBfdGhpcy5wcm9wcyksIF90aGlzLnN0YXRlKSwge30sIHtcbiAgICAgICAgICBzbGlkZUNvdW50OiBfdGhpcy5wcm9wcy5jaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgfSkpO1xuICAgICAgICB2YXIgcG9zdENsb25lcyA9ICgwLCBfaW5uZXJTbGlkZXJVdGlscy5nZXRQb3N0Q2xvbmVzKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgX3RoaXMucHJvcHMpLCBfdGhpcy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgc2xpZGVDb3VudDogX3RoaXMucHJvcHMuY2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgIH0pKTtcblxuICAgICAgICBfdGhpcy5wcm9wcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGNoaWxkcmVuV2lkdGhzLnB1c2goY2hpbGQucHJvcHMuc3R5bGUud2lkdGgpO1xuICAgICAgICAgIF90cmFja1dpZHRoICs9IGNoaWxkLnByb3BzLnN0eWxlLndpZHRoO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZUNsb25lczsgaSsrKSB7XG4gICAgICAgICAgX3RyYWNrTGVmdCArPSBjaGlsZHJlbldpZHRoc1tjaGlsZHJlbldpZHRocy5sZW5ndGggLSAxIC0gaV07XG4gICAgICAgICAgX3RyYWNrV2lkdGggKz0gY2hpbGRyZW5XaWR0aHNbY2hpbGRyZW5XaWR0aHMubGVuZ3RoIC0gMSAtIGldO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHBvc3RDbG9uZXM7IF9pKyspIHtcbiAgICAgICAgICBfdHJhY2tXaWR0aCArPSBjaGlsZHJlbldpZHRoc1tfaV07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBfdGhpcy5zdGF0ZS5jdXJyZW50U2xpZGU7IF9pMisrKSB7XG4gICAgICAgICAgX3RyYWNrTGVmdCArPSBjaGlsZHJlbldpZHRoc1tfaTJdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF90cmFja1N0eWxlID0ge1xuICAgICAgICAgIHdpZHRoOiBfdHJhY2tXaWR0aCArIFwicHhcIixcbiAgICAgICAgICBsZWZ0OiAtX3RyYWNrTGVmdCArIFwicHhcIlxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy5jZW50ZXJNb2RlKSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRXaWR0aCA9IFwiXCIuY29uY2F0KGNoaWxkcmVuV2lkdGhzW190aGlzLnN0YXRlLmN1cnJlbnRTbGlkZV0sIFwicHhcIik7XG4gICAgICAgICAgX3RyYWNrU3R5bGUubGVmdCA9IFwiY2FsYyhcIi5jb25jYXQoX3RyYWNrU3R5bGUubGVmdCwgXCIgKyAoMTAwJSAtIFwiKS5jb25jYXQoY3VycmVudFdpZHRoLCBcIikgLyAyICkgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0cmFja1N0eWxlOiBfdHJhY2tTdHlsZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hpbGRyZW5Db3VudCA9IF9yZWFjdFtcImRlZmF1bHRcIl0uQ2hpbGRyZW4uY291bnQoX3RoaXMucHJvcHMuY2hpbGRyZW4pO1xuXG4gICAgICB2YXIgc3BlYyA9ICgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBfdGhpcy5wcm9wcyksIF90aGlzLnN0YXRlKSwge30sIHtcbiAgICAgICAgc2xpZGVDb3VudDogY2hpbGRyZW5Db3VudFxuICAgICAgfSk7XG4gICAgICB2YXIgc2xpZGVDb3VudCA9ICgwLCBfaW5uZXJTbGlkZXJVdGlscy5nZXRQcmVDbG9uZXMpKHNwZWMpICsgKDAsIF9pbm5lclNsaWRlclV0aWxzLmdldFBvc3RDbG9uZXMpKHNwZWMpICsgY2hpbGRyZW5Db3VudDtcbiAgICAgIHZhciB0cmFja1dpZHRoID0gMTAwIC8gX3RoaXMucHJvcHMuc2xpZGVzVG9TaG93ICogc2xpZGVDb3VudDtcbiAgICAgIHZhciBzbGlkZVdpZHRoID0gMTAwIC8gc2xpZGVDb3VudDtcbiAgICAgIHZhciB0cmFja0xlZnQgPSAtc2xpZGVXaWR0aCAqICgoMCwgX2lubmVyU2xpZGVyVXRpbHMuZ2V0UHJlQ2xvbmVzKShzcGVjKSArIF90aGlzLnN0YXRlLmN1cnJlbnRTbGlkZSkgKiB0cmFja1dpZHRoIC8gMTAwO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMuY2VudGVyTW9kZSkge1xuICAgICAgICB0cmFja0xlZnQgKz0gKDEwMCAtIHNsaWRlV2lkdGggKiB0cmFja1dpZHRoIC8gMTAwKSAvIDI7XG4gICAgICB9XG5cbiAgICAgIHZhciB0cmFja1N0eWxlID0ge1xuICAgICAgICB3aWR0aDogdHJhY2tXaWR0aCArIFwiJVwiLFxuICAgICAgICBsZWZ0OiB0cmFja0xlZnQgKyBcIiVcIlxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNsaWRlV2lkdGg6IHNsaWRlV2lkdGggKyBcIiVcIixcbiAgICAgICAgdHJhY2tTdHlsZTogdHJhY2tTdHlsZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJjaGVja0ltYWdlc0xvYWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGltYWdlcyA9IF90aGlzLmxpc3QucXVlcnlTZWxlY3RvckFsbChcIi5zbGljay1zbGlkZSBpbWdcIik7XG5cbiAgICAgIHZhciBpbWFnZXNDb3VudCA9IGltYWdlcy5sZW5ndGgsXG4gICAgICAgICAgbG9hZGVkQ291bnQgPSAwO1xuICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpbWFnZXMsIGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICsrbG9hZGVkQ291bnQgJiYgbG9hZGVkQ291bnQgPj0gaW1hZ2VzQ291bnQgJiYgX3RoaXMub25XaW5kb3dSZXNpemVkKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFpbWFnZS5vbmNsaWNrKSB7XG4gICAgICAgICAgaW1hZ2Uub25jbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbWFnZS5wYXJlbnROb2RlLmZvY3VzKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJldkNsaWNrSGFuZGxlciA9IGltYWdlLm9uY2xpY2s7XG5cbiAgICAgICAgICBpbWFnZS5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcHJldkNsaWNrSGFuZGxlcigpO1xuICAgICAgICAgICAgaW1hZ2UucGFyZW50Tm9kZS5mb2N1cygpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWltYWdlLm9ubG9hZCkge1xuICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5sYXp5TG9hZCkge1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBfdGhpcy5hZGFwdEhlaWdodCgpO1xuXG4gICAgICAgICAgICAgIF90aGlzLmNhbGxiYWNrVGltZXJzLnB1c2goc2V0VGltZW91dChfdGhpcy5vbldpbmRvd1Jlc2l6ZWQsIF90aGlzLnByb3BzLnNwZWVkKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSBoYW5kbGVyO1xuXG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBoYW5kbGVyKCk7XG4gICAgICAgICAgICAgIF90aGlzLnByb3BzLm9uTGF6eUxvYWRFcnJvciAmJiBfdGhpcy5wcm9wcy5vbkxhenlMb2FkRXJyb3IoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJwcm9ncmVzc2l2ZUxhenlMb2FkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzbGlkZXNUb0xvYWQgPSBbXTtcbiAgICAgIHZhciBzcGVjID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIF90aGlzLnByb3BzKSwgX3RoaXMuc3RhdGUpO1xuXG4gICAgICBmb3IgKHZhciBpbmRleCA9IF90aGlzLnN0YXRlLmN1cnJlbnRTbGlkZTsgaW5kZXggPCBfdGhpcy5zdGF0ZS5zbGlkZUNvdW50ICsgKDAsIF9pbm5lclNsaWRlclV0aWxzLmdldFBvc3RDbG9uZXMpKHNwZWMpOyBpbmRleCsrKSB7XG4gICAgICAgIGlmIChfdGhpcy5zdGF0ZS5sYXp5TG9hZGVkTGlzdC5pbmRleE9mKGluZGV4KSA8IDApIHtcbiAgICAgICAgICBzbGlkZXNUb0xvYWQucHVzaChpbmRleCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2luZGV4ID0gX3RoaXMuc3RhdGUuY3VycmVudFNsaWRlIC0gMTsgX2luZGV4ID49IC0oMCwgX2lubmVyU2xpZGVyVXRpbHMuZ2V0UHJlQ2xvbmVzKShzcGVjKTsgX2luZGV4LS0pIHtcbiAgICAgICAgaWYgKF90aGlzLnN0YXRlLmxhenlMb2FkZWRMaXN0LmluZGV4T2YoX2luZGV4KSA8IDApIHtcbiAgICAgICAgICBzbGlkZXNUb0xvYWQucHVzaChfaW5kZXgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzbGlkZXNUb0xvYWQubGVuZ3RoID4gMCkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF6eUxvYWRlZExpc3Q6IHN0YXRlLmxhenlMb2FkZWRMaXN0LmNvbmNhdChzbGlkZXNUb0xvYWQpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF90aGlzLnByb3BzLm9uTGF6eUxvYWQpIHtcbiAgICAgICAgICBfdGhpcy5wcm9wcy5vbkxhenlMb2FkKHNsaWRlc1RvTG9hZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfdGhpcy5sYXp5TG9hZFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChfdGhpcy5sYXp5TG9hZFRpbWVyKTtcbiAgICAgICAgICBkZWxldGUgX3RoaXMubGF6eUxvYWRUaW1lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcInNsaWRlSGFuZGxlclwiLCBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHZhciBkb250QW5pbWF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBhc05hdkZvciA9IF90aGlzJHByb3BzLmFzTmF2Rm9yLFxuICAgICAgICAgIGJlZm9yZUNoYW5nZSA9IF90aGlzJHByb3BzLmJlZm9yZUNoYW5nZSxcbiAgICAgICAgICBvbkxhenlMb2FkID0gX3RoaXMkcHJvcHMub25MYXp5TG9hZCxcbiAgICAgICAgICBzcGVlZCA9IF90aGlzJHByb3BzLnNwZWVkLFxuICAgICAgICAgIGFmdGVyQ2hhbmdlID0gX3RoaXMkcHJvcHMuYWZ0ZXJDaGFuZ2U7IC8vIGNhcHR1cmUgY3VycmVudHNsaWRlIGJlZm9yZSBzdGF0ZSBpcyB1cGRhdGVkXG5cbiAgICAgIHZhciBjdXJyZW50U2xpZGUgPSBfdGhpcy5zdGF0ZS5jdXJyZW50U2xpZGU7XG5cbiAgICAgIHZhciBfc2xpZGVIYW5kbGVyID0gKDAsIF9pbm5lclNsaWRlclV0aWxzLnNsaWRlSGFuZGxlcikoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgIH0sIF90aGlzLnByb3BzKSwgX3RoaXMuc3RhdGUpLCB7fSwge1xuICAgICAgICB0cmFja1JlZjogX3RoaXMudHJhY2ssXG4gICAgICAgIHVzZUNTUzogX3RoaXMucHJvcHMudXNlQ1NTICYmICFkb250QW5pbWF0ZVxuICAgICAgfSkpLFxuICAgICAgICAgIHN0YXRlID0gX3NsaWRlSGFuZGxlci5zdGF0ZSxcbiAgICAgICAgICBuZXh0U3RhdGUgPSBfc2xpZGVIYW5kbGVyLm5leHRTdGF0ZTtcblxuICAgICAgaWYgKCFzdGF0ZSkgcmV0dXJuO1xuICAgICAgYmVmb3JlQ2hhbmdlICYmIGJlZm9yZUNoYW5nZShjdXJyZW50U2xpZGUsIHN0YXRlLmN1cnJlbnRTbGlkZSk7XG4gICAgICB2YXIgc2xpZGVzVG9Mb2FkID0gc3RhdGUubGF6eUxvYWRlZExpc3QuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGUubGF6eUxvYWRlZExpc3QuaW5kZXhPZih2YWx1ZSkgPCAwO1xuICAgICAgfSk7XG4gICAgICBvbkxhenlMb2FkICYmIHNsaWRlc1RvTG9hZC5sZW5ndGggPiAwICYmIG9uTGF6eUxvYWQoc2xpZGVzVG9Mb2FkKTtcblxuICAgICAgaWYgKCFfdGhpcy5wcm9wcy53YWl0Rm9yQW5pbWF0ZSAmJiBfdGhpcy5hbmltYXRpb25FbmRDYWxsYmFjaykge1xuICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMuYW5pbWF0aW9uRW5kQ2FsbGJhY2spO1xuICAgICAgICBhZnRlckNoYW5nZSAmJiBhZnRlckNoYW5nZShjdXJyZW50U2xpZGUpO1xuICAgICAgICBkZWxldGUgX3RoaXMuYW5pbWF0aW9uRW5kQ2FsbGJhY2s7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHN0YXRlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGFzTmF2Rm9ySW5kZXggY2hlY2sgaXMgdG8gYXZvaWQgcmVjdXJzaXZlIGNhbGxzIG9mIHNsaWRlSGFuZGxlciBpbiB3YWl0Rm9yQW5pbWF0ZT1mYWxzZSBtb2RlXG4gICAgICAgIGlmIChhc05hdkZvciAmJiBfdGhpcy5hc05hdkZvckluZGV4ICE9PSBpbmRleCkge1xuICAgICAgICAgIF90aGlzLmFzTmF2Rm9ySW5kZXggPSBpbmRleDtcbiAgICAgICAgICBhc05hdkZvci5pbm5lclNsaWRlci5zbGlkZUhhbmRsZXIoaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXh0U3RhdGUpIHJldHVybjtcbiAgICAgICAgX3RoaXMuYW5pbWF0aW9uRW5kQ2FsbGJhY2sgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgYW5pbWF0aW5nID0gbmV4dFN0YXRlLmFuaW1hdGluZyxcbiAgICAgICAgICAgICAgZmlyc3RCYXRjaCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyW1wiZGVmYXVsdFwiXSkobmV4dFN0YXRlLCBbXCJhbmltYXRpbmdcIl0pO1xuXG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoZmlyc3RCYXRjaCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuY2FsbGJhY2tUaW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhbmltYXRpbmc6IGFuaW1hdGluZ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDEwKSk7XG5cbiAgICAgICAgICAgIGFmdGVyQ2hhbmdlICYmIGFmdGVyQ2hhbmdlKHN0YXRlLmN1cnJlbnRTbGlkZSk7XG4gICAgICAgICAgICBkZWxldGUgX3RoaXMuYW5pbWF0aW9uRW5kQ2FsbGJhY2s7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIHNwZWVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcImNoYW5nZVNsaWRlXCIsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICB2YXIgZG9udEFuaW1hdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgdmFyIHNwZWMgPSAoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgX3RoaXMucHJvcHMpLCBfdGhpcy5zdGF0ZSk7XG4gICAgICB2YXIgdGFyZ2V0U2xpZGUgPSAoMCwgX2lubmVyU2xpZGVyVXRpbHMuY2hhbmdlU2xpZGUpKHNwZWMsIG9wdGlvbnMpO1xuICAgICAgaWYgKHRhcmdldFNsaWRlICE9PSAwICYmICF0YXJnZXRTbGlkZSkgcmV0dXJuO1xuXG4gICAgICBpZiAoZG9udEFuaW1hdGUgPT09IHRydWUpIHtcbiAgICAgICAgX3RoaXMuc2xpZGVIYW5kbGVyKHRhcmdldFNsaWRlLCBkb250QW5pbWF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5zbGlkZUhhbmRsZXIodGFyZ2V0U2xpZGUpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5wcm9wcy5hdXRvcGxheSAmJiBfdGhpcy5hdXRvUGxheShcInVwZGF0ZVwiKTtcblxuICAgICAgaWYgKF90aGlzLnByb3BzLmZvY3VzT25TZWxlY3QpIHtcbiAgICAgICAgdmFyIG5vZGVzID0gX3RoaXMubGlzdC5xdWVyeVNlbGVjdG9yQWxsKFwiLnNsaWNrLWN1cnJlbnRcIik7XG5cbiAgICAgICAgbm9kZXNbMF0gJiYgbm9kZXNbMF0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJjbGlja0hhbmRsZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChfdGhpcy5jbGlja2FibGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuY2xpY2thYmxlID0gdHJ1ZTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJrZXlIYW5kbGVyXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZGlyID0gKDAsIF9pbm5lclNsaWRlclV0aWxzLmtleUhhbmRsZXIpKGUsIF90aGlzLnByb3BzLmFjY2Vzc2liaWxpdHksIF90aGlzLnByb3BzLnJ0bCk7XG4gICAgICBkaXIgIT09IFwiXCIgJiYgX3RoaXMuY2hhbmdlU2xpZGUoe1xuICAgICAgICBtZXNzYWdlOiBkaXJcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcInNlbGVjdEhhbmRsZXJcIiwgZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIF90aGlzLmNoYW5nZVNsaWRlKG9wdGlvbnMpO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcImRpc2FibGVCb2R5U2Nyb2xsXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KGUpIHtcbiAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xuICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICB3aW5kb3cub250b3VjaG1vdmUgPSBwcmV2ZW50RGVmYXVsdDtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJlbmFibGVCb2R5U2Nyb2xsXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5vbnRvdWNobW92ZSA9IG51bGw7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwic3dpcGVTdGFydFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLnZlcnRpY2FsU3dpcGluZykge1xuICAgICAgICBfdGhpcy5kaXNhYmxlQm9keVNjcm9sbCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RhdGUgPSAoMCwgX2lubmVyU2xpZGVyVXRpbHMuc3dpcGVTdGFydCkoZSwgX3RoaXMucHJvcHMuc3dpcGUsIF90aGlzLnByb3BzLmRyYWdnYWJsZSk7XG4gICAgICBzdGF0ZSAhPT0gXCJcIiAmJiBfdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwic3dpcGVNb3ZlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgc3RhdGUgPSAoMCwgX2lubmVyU2xpZGVyVXRpbHMuc3dpcGVNb3ZlKShlLCAoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgX3RoaXMucHJvcHMpLCBfdGhpcy5zdGF0ZSksIHt9LCB7XG4gICAgICAgIHRyYWNrUmVmOiBfdGhpcy50cmFjayxcbiAgICAgICAgbGlzdFJlZjogX3RoaXMubGlzdCxcbiAgICAgICAgc2xpZGVJbmRleDogX3RoaXMuc3RhdGUuY3VycmVudFNsaWRlXG4gICAgICB9KSk7XG4gICAgICBpZiAoIXN0YXRlKSByZXR1cm47XG5cbiAgICAgIGlmIChzdGF0ZVtcInN3aXBpbmdcIl0pIHtcbiAgICAgICAgX3RoaXMuY2xpY2thYmxlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHN0YXRlKTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJzd2lwZUVuZFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHN0YXRlID0gKDAsIF9pbm5lclNsaWRlclV0aWxzLnN3aXBlRW5kKShlLCAoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgX3RoaXMucHJvcHMpLCBfdGhpcy5zdGF0ZSksIHt9LCB7XG4gICAgICAgIHRyYWNrUmVmOiBfdGhpcy50cmFjayxcbiAgICAgICAgbGlzdFJlZjogX3RoaXMubGlzdCxcbiAgICAgICAgc2xpZGVJbmRleDogX3RoaXMuc3RhdGUuY3VycmVudFNsaWRlXG4gICAgICB9KSk7XG4gICAgICBpZiAoIXN0YXRlKSByZXR1cm47XG4gICAgICB2YXIgdHJpZ2dlclNsaWRlSGFuZGxlciA9IHN0YXRlW1widHJpZ2dlclNsaWRlSGFuZGxlclwiXTtcbiAgICAgIGRlbGV0ZSBzdGF0ZVtcInRyaWdnZXJTbGlkZUhhbmRsZXJcIl07XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHN0YXRlKTtcblxuICAgICAgaWYgKHRyaWdnZXJTbGlkZUhhbmRsZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICBfdGhpcy5zbGlkZUhhbmRsZXIodHJpZ2dlclNsaWRlSGFuZGxlcik7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy52ZXJ0aWNhbFN3aXBpbmcpIHtcbiAgICAgICAgX3RoaXMuZW5hYmxlQm9keVNjcm9sbCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcInRvdWNoRW5kXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5zd2lwZUVuZChlKTtcblxuICAgICAgX3RoaXMuY2xpY2thYmxlID0gdHJ1ZTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJzbGlja1ByZXZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gdGhpcyBhbmQgZmVsbG93IG1ldGhvZHMgYXJlIHdyYXBwZWQgaW4gc2V0VGltZW91dFxuICAgICAgLy8gdG8gbWFrZSBzdXJlIGluaXRpYWxpemUgc2V0U3RhdGUgaGFzIGhhcHBlbmVkIGJlZm9yZVxuICAgICAgLy8gYW55IG9mIHN1Y2ggbWV0aG9kcyBhcmUgY2FsbGVkXG4gICAgICBfdGhpcy5jYWxsYmFja1RpbWVycy5wdXNoKHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuY2hhbmdlU2xpZGUoe1xuICAgICAgICAgIG1lc3NhZ2U6IFwicHJldmlvdXNcIlxuICAgICAgICB9KTtcbiAgICAgIH0sIDApKTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJzbGlja05leHRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuY2FsbGJhY2tUaW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmNoYW5nZVNsaWRlKHtcbiAgICAgICAgICBtZXNzYWdlOiBcIm5leHRcIlxuICAgICAgICB9KTtcbiAgICAgIH0sIDApKTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJzbGlja0dvVG9cIiwgZnVuY3Rpb24gKHNsaWRlKSB7XG4gICAgICB2YXIgZG9udEFuaW1hdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgc2xpZGUgPSBOdW1iZXIoc2xpZGUpO1xuICAgICAgaWYgKGlzTmFOKHNsaWRlKSkgcmV0dXJuIFwiXCI7XG5cbiAgICAgIF90aGlzLmNhbGxiYWNrVGltZXJzLnB1c2goc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5jaGFuZ2VTbGlkZSh7XG4gICAgICAgICAgbWVzc2FnZTogXCJpbmRleFwiLFxuICAgICAgICAgIGluZGV4OiBzbGlkZSxcbiAgICAgICAgICBjdXJyZW50U2xpZGU6IF90aGlzLnN0YXRlLmN1cnJlbnRTbGlkZVxuICAgICAgICB9LCBkb250QW5pbWF0ZSk7XG4gICAgICB9LCAwKSk7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwicGxheVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmV4dEluZGV4O1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMucnRsKSB7XG4gICAgICAgIG5leHRJbmRleCA9IF90aGlzLnN0YXRlLmN1cnJlbnRTbGlkZSAtIF90aGlzLnByb3BzLnNsaWRlc1RvU2Nyb2xsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCgwLCBfaW5uZXJTbGlkZXJVdGlscy5jYW5Hb05leHQpKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBfdGhpcy5wcm9wcyksIF90aGlzLnN0YXRlKSkpIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBfdGhpcy5zdGF0ZS5jdXJyZW50U2xpZGUgKyBfdGhpcy5wcm9wcy5zbGlkZXNUb1Njcm9sbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2xpZGVIYW5kbGVyKG5leHRJbmRleCk7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwiYXV0b1BsYXlcIiwgZnVuY3Rpb24gKHBsYXlUeXBlKSB7XG4gICAgICBpZiAoX3RoaXMuYXV0b3BsYXlUaW1lcikge1xuICAgICAgICBjbGVhckludGVydmFsKF90aGlzLmF1dG9wbGF5VGltZXIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXV0b3BsYXlpbmcgPSBfdGhpcy5zdGF0ZS5hdXRvcGxheWluZztcblxuICAgICAgaWYgKHBsYXlUeXBlID09PSBcInVwZGF0ZVwiKSB7XG4gICAgICAgIGlmIChhdXRvcGxheWluZyA9PT0gXCJob3ZlcmVkXCIgfHwgYXV0b3BsYXlpbmcgPT09IFwiZm9jdXNlZFwiIHx8IGF1dG9wbGF5aW5nID09PSBcInBhdXNlZFwiKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBsYXlUeXBlID09PSBcImxlYXZlXCIpIHtcbiAgICAgICAgaWYgKGF1dG9wbGF5aW5nID09PSBcInBhdXNlZFwiIHx8IGF1dG9wbGF5aW5nID09PSBcImZvY3VzZWRcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwbGF5VHlwZSA9PT0gXCJibHVyXCIpIHtcbiAgICAgICAgaWYgKGF1dG9wbGF5aW5nID09PSBcInBhdXNlZFwiIHx8IGF1dG9wbGF5aW5nID09PSBcImhvdmVyZWRcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfdGhpcy5hdXRvcGxheVRpbWVyID0gc2V0SW50ZXJ2YWwoX3RoaXMucGxheSwgX3RoaXMucHJvcHMuYXV0b3BsYXlTcGVlZCArIDUwKTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhdXRvcGxheWluZzogXCJwbGF5aW5nXCJcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcInBhdXNlXCIsIGZ1bmN0aW9uIChwYXVzZVR5cGUpIHtcbiAgICAgIGlmIChfdGhpcy5hdXRvcGxheVRpbWVyKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoX3RoaXMuYXV0b3BsYXlUaW1lcik7XG4gICAgICAgIF90aGlzLmF1dG9wbGF5VGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXV0b3BsYXlpbmcgPSBfdGhpcy5zdGF0ZS5hdXRvcGxheWluZztcblxuICAgICAgaWYgKHBhdXNlVHlwZSA9PT0gXCJwYXVzZWRcIikge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgYXV0b3BsYXlpbmc6IFwicGF1c2VkXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHBhdXNlVHlwZSA9PT0gXCJmb2N1c2VkXCIpIHtcbiAgICAgICAgaWYgKGF1dG9wbGF5aW5nID09PSBcImhvdmVyZWRcIiB8fCBhdXRvcGxheWluZyA9PT0gXCJwbGF5aW5nXCIpIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBhdXRvcGxheWluZzogXCJmb2N1c2VkXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcGF1c2VUeXBlICBpcyAnaG92ZXJlZCdcbiAgICAgICAgaWYgKGF1dG9wbGF5aW5nID09PSBcInBsYXlpbmdcIikge1xuICAgICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGF1dG9wbGF5aW5nOiBcImhvdmVyZWRcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwib25Eb3RzT3ZlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMuYXV0b3BsYXkgJiYgX3RoaXMucGF1c2UoXCJob3ZlcmVkXCIpO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcIm9uRG90c0xlYXZlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5hdXRvcGxheSAmJiBfdGhpcy5zdGF0ZS5hdXRvcGxheWluZyA9PT0gXCJob3ZlcmVkXCIgJiYgX3RoaXMuYXV0b1BsYXkoXCJsZWF2ZVwiKTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJvblRyYWNrT3ZlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMuYXV0b3BsYXkgJiYgX3RoaXMucGF1c2UoXCJob3ZlcmVkXCIpO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcIm9uVHJhY2tMZWF2ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMuYXV0b3BsYXkgJiYgX3RoaXMuc3RhdGUuYXV0b3BsYXlpbmcgPT09IFwiaG92ZXJlZFwiICYmIF90aGlzLmF1dG9QbGF5KFwibGVhdmVcIik7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwib25TbGlkZUZvY3VzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5hdXRvcGxheSAmJiBfdGhpcy5wYXVzZShcImZvY3VzZWRcIik7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwib25TbGlkZUJsdXJcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnByb3BzLmF1dG9wbGF5ICYmIF90aGlzLnN0YXRlLmF1dG9wbGF5aW5nID09PSBcImZvY3VzZWRcIiAmJiBfdGhpcy5hdXRvUGxheShcImJsdXJcIik7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwicmVuZGVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcInNsaWNrLXNsaWRlclwiLCBfdGhpcy5wcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgXCJzbGljay12ZXJ0aWNhbFwiOiBfdGhpcy5wcm9wcy52ZXJ0aWNhbCxcbiAgICAgICAgXCJzbGljay1pbml0aWFsaXplZFwiOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHZhciBzcGVjID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIF90aGlzLnByb3BzKSwgX3RoaXMuc3RhdGUpO1xuICAgICAgdmFyIHRyYWNrUHJvcHMgPSAoMCwgX2lubmVyU2xpZGVyVXRpbHMuZXh0cmFjdE9iamVjdCkoc3BlYywgW1wiZmFkZVwiLCBcImNzc0Vhc2VcIiwgXCJzcGVlZFwiLCBcImluZmluaXRlXCIsIFwiY2VudGVyTW9kZVwiLCBcImZvY3VzT25TZWxlY3RcIiwgXCJjdXJyZW50U2xpZGVcIiwgXCJsYXp5TG9hZFwiLCBcImxhenlMb2FkZWRMaXN0XCIsIFwicnRsXCIsIFwic2xpZGVXaWR0aFwiLCBcInNsaWRlSGVpZ2h0XCIsIFwibGlzdEhlaWdodFwiLCBcInZlcnRpY2FsXCIsIFwic2xpZGVzVG9TaG93XCIsIFwic2xpZGVzVG9TY3JvbGxcIiwgXCJzbGlkZUNvdW50XCIsIFwidHJhY2tTdHlsZVwiLCBcInZhcmlhYmxlV2lkdGhcIiwgXCJ1bnNsaWNrXCIsIFwiY2VudGVyUGFkZGluZ1wiLCBcInRhcmdldFNsaWRlXCIsIFwidXNlQ1NTXCJdKTtcbiAgICAgIHZhciBwYXVzZU9uSG92ZXIgPSBfdGhpcy5wcm9wcy5wYXVzZU9uSG92ZXI7XG4gICAgICB0cmFja1Byb3BzID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIHRyYWNrUHJvcHMpLCB7fSwge1xuICAgICAgICBvbk1vdXNlRW50ZXI6IHBhdXNlT25Ib3ZlciA/IF90aGlzLm9uVHJhY2tPdmVyIDogbnVsbCxcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBwYXVzZU9uSG92ZXIgPyBfdGhpcy5vblRyYWNrTGVhdmUgOiBudWxsLFxuICAgICAgICBvbk1vdXNlT3ZlcjogcGF1c2VPbkhvdmVyID8gX3RoaXMub25UcmFja092ZXIgOiBudWxsLFxuICAgICAgICBmb2N1c09uU2VsZWN0OiBfdGhpcy5wcm9wcy5mb2N1c09uU2VsZWN0ICYmIF90aGlzLmNsaWNrYWJsZSA/IF90aGlzLnNlbGVjdEhhbmRsZXIgOiBudWxsXG4gICAgICB9KTtcbiAgICAgIHZhciBkb3RzO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMuZG90cyA9PT0gdHJ1ZSAmJiBfdGhpcy5zdGF0ZS5zbGlkZUNvdW50ID49IF90aGlzLnByb3BzLnNsaWRlc1RvU2hvdykge1xuICAgICAgICB2YXIgZG90UHJvcHMgPSAoMCwgX2lubmVyU2xpZGVyVXRpbHMuZXh0cmFjdE9iamVjdCkoc3BlYywgW1wiZG90c0NsYXNzXCIsIFwic2xpZGVDb3VudFwiLCBcInNsaWRlc1RvU2hvd1wiLCBcImN1cnJlbnRTbGlkZVwiLCBcInNsaWRlc1RvU2Nyb2xsXCIsIFwiY2xpY2tIYW5kbGVyXCIsIFwiY2hpbGRyZW5cIiwgXCJjdXN0b21QYWdpbmdcIiwgXCJpbmZpbml0ZVwiLCBcImFwcGVuZERvdHNcIl0pO1xuICAgICAgICB2YXIgcGF1c2VPbkRvdHNIb3ZlciA9IF90aGlzLnByb3BzLnBhdXNlT25Eb3RzSG92ZXI7XG4gICAgICAgIGRvdFByb3BzID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIGRvdFByb3BzKSwge30sIHtcbiAgICAgICAgICBjbGlja0hhbmRsZXI6IF90aGlzLmNoYW5nZVNsaWRlLFxuICAgICAgICAgIG9uTW91c2VFbnRlcjogcGF1c2VPbkRvdHNIb3ZlciA/IF90aGlzLm9uRG90c0xlYXZlIDogbnVsbCxcbiAgICAgICAgICBvbk1vdXNlT3ZlcjogcGF1c2VPbkRvdHNIb3ZlciA/IF90aGlzLm9uRG90c092ZXIgOiBudWxsLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZTogcGF1c2VPbkRvdHNIb3ZlciA/IF90aGlzLm9uRG90c0xlYXZlIDogbnVsbFxuICAgICAgICB9KTtcbiAgICAgICAgZG90cyA9IC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoX2RvdHMuRG90cywgZG90UHJvcHMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJldkFycm93LCBuZXh0QXJyb3c7XG4gICAgICB2YXIgYXJyb3dQcm9wcyA9ICgwLCBfaW5uZXJTbGlkZXJVdGlscy5leHRyYWN0T2JqZWN0KShzcGVjLCBbXCJpbmZpbml0ZVwiLCBcImNlbnRlck1vZGVcIiwgXCJjdXJyZW50U2xpZGVcIiwgXCJzbGlkZUNvdW50XCIsIFwic2xpZGVzVG9TaG93XCIsIFwicHJldkFycm93XCIsIFwibmV4dEFycm93XCJdKTtcbiAgICAgIGFycm93UHJvcHMuY2xpY2tIYW5kbGVyID0gX3RoaXMuY2hhbmdlU2xpZGU7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5hcnJvd3MpIHtcbiAgICAgICAgcHJldkFycm93ID0gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChfYXJyb3dzLlByZXZBcnJvdywgYXJyb3dQcm9wcyk7XG4gICAgICAgIG5leHRBcnJvdyA9IC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoX2Fycm93cy5OZXh0QXJyb3csIGFycm93UHJvcHMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmVydGljYWxIZWlnaHRTdHlsZSA9IG51bGw7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy52ZXJ0aWNhbCkge1xuICAgICAgICB2ZXJ0aWNhbEhlaWdodFN0eWxlID0ge1xuICAgICAgICAgIGhlaWdodDogX3RoaXMuc3RhdGUubGlzdEhlaWdodFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgY2VudGVyUGFkZGluZ1N0eWxlID0gbnVsbDtcblxuICAgICAgaWYgKF90aGlzLnByb3BzLnZlcnRpY2FsID09PSBmYWxzZSkge1xuICAgICAgICBpZiAoX3RoaXMucHJvcHMuY2VudGVyTW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNlbnRlclBhZGRpbmdTdHlsZSA9IHtcbiAgICAgICAgICAgIHBhZGRpbmc6IFwiMHB4IFwiICsgX3RoaXMucHJvcHMuY2VudGVyUGFkZGluZ1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy5jZW50ZXJNb2RlID09PSB0cnVlKSB7XG4gICAgICAgICAgY2VudGVyUGFkZGluZ1N0eWxlID0ge1xuICAgICAgICAgICAgcGFkZGluZzogX3RoaXMucHJvcHMuY2VudGVyUGFkZGluZyArIFwiIDBweFwiXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgbGlzdFN0eWxlID0gKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIHZlcnRpY2FsSGVpZ2h0U3R5bGUpLCBjZW50ZXJQYWRkaW5nU3R5bGUpO1xuICAgICAgdmFyIHRvdWNoTW92ZSA9IF90aGlzLnByb3BzLnRvdWNoTW92ZTtcbiAgICAgIHZhciBsaXN0UHJvcHMgPSB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJzbGljay1saXN0XCIsXG4gICAgICAgIHN0eWxlOiBsaXN0U3R5bGUsXG4gICAgICAgIG9uQ2xpY2s6IF90aGlzLmNsaWNrSGFuZGxlcixcbiAgICAgICAgb25Nb3VzZURvd246IHRvdWNoTW92ZSA/IF90aGlzLnN3aXBlU3RhcnQgOiBudWxsLFxuICAgICAgICBvbk1vdXNlTW92ZTogX3RoaXMuc3RhdGUuZHJhZ2dpbmcgJiYgdG91Y2hNb3ZlID8gX3RoaXMuc3dpcGVNb3ZlIDogbnVsbCxcbiAgICAgICAgb25Nb3VzZVVwOiB0b3VjaE1vdmUgPyBfdGhpcy5zd2lwZUVuZCA6IG51bGwsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogX3RoaXMuc3RhdGUuZHJhZ2dpbmcgJiYgdG91Y2hNb3ZlID8gX3RoaXMuc3dpcGVFbmQgOiBudWxsLFxuICAgICAgICBvblRvdWNoU3RhcnQ6IHRvdWNoTW92ZSA/IF90aGlzLnN3aXBlU3RhcnQgOiBudWxsLFxuICAgICAgICBvblRvdWNoTW92ZTogX3RoaXMuc3RhdGUuZHJhZ2dpbmcgJiYgdG91Y2hNb3ZlID8gX3RoaXMuc3dpcGVNb3ZlIDogbnVsbCxcbiAgICAgICAgb25Ub3VjaEVuZDogdG91Y2hNb3ZlID8gX3RoaXMudG91Y2hFbmQgOiBudWxsLFxuICAgICAgICBvblRvdWNoQ2FuY2VsOiBfdGhpcy5zdGF0ZS5kcmFnZ2luZyAmJiB0b3VjaE1vdmUgPyBfdGhpcy5zd2lwZUVuZCA6IG51bGwsXG4gICAgICAgIG9uS2V5RG93bjogX3RoaXMucHJvcHMuYWNjZXNzaWJpbGl0eSA/IF90aGlzLmtleUhhbmRsZXIgOiBudWxsXG4gICAgICB9O1xuICAgICAgdmFyIGlubmVyU2xpZGVyUHJvcHMgPSB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICBkaXI6IFwibHRyXCIsXG4gICAgICAgIHN0eWxlOiBfdGhpcy5wcm9wcy5zdHlsZVxuICAgICAgfTtcblxuICAgICAgaWYgKF90aGlzLnByb3BzLnVuc2xpY2spIHtcbiAgICAgICAgbGlzdFByb3BzID0ge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJzbGljay1saXN0XCJcbiAgICAgICAgfTtcbiAgICAgICAgaW5uZXJTbGlkZXJQcm9wcyA9IHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCBpbm5lclNsaWRlclByb3BzLCAhX3RoaXMucHJvcHMudW5zbGljayA/IHByZXZBcnJvdyA6IFwiXCIsIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgcmVmOiBfdGhpcy5saXN0UmVmSGFuZGxlclxuICAgICAgfSwgbGlzdFByb3BzKSwgLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChfdHJhY2suVHJhY2ssICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIHJlZjogX3RoaXMudHJhY2tSZWZIYW5kbGVyXG4gICAgICB9LCB0cmFja1Byb3BzKSwgX3RoaXMucHJvcHMuY2hpbGRyZW4pKSwgIV90aGlzLnByb3BzLnVuc2xpY2sgPyBuZXh0QXJyb3cgOiBcIlwiLCAhX3RoaXMucHJvcHMudW5zbGljayA/IGRvdHMgOiBcIlwiKTtcbiAgICB9KTtcbiAgICBfdGhpcy5saXN0ID0gbnVsbDtcbiAgICBfdGhpcy50cmFjayA9IG51bGw7XG4gICAgX3RoaXMuc3RhdGUgPSAoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgX2luaXRpYWxTdGF0ZVtcImRlZmF1bHRcIl0pLCB7fSwge1xuICAgICAgY3VycmVudFNsaWRlOiBfdGhpcy5wcm9wcy5pbml0aWFsU2xpZGUsXG4gICAgICBzbGlkZUNvdW50OiBfcmVhY3RbXCJkZWZhdWx0XCJdLkNoaWxkcmVuLmNvdW50KF90aGlzLnByb3BzLmNoaWxkcmVuKVxuICAgIH0pO1xuICAgIF90aGlzLmNhbGxiYWNrVGltZXJzID0gW107XG4gICAgX3RoaXMuY2xpY2thYmxlID0gdHJ1ZTtcbiAgICBfdGhpcy5kZWJvdW5jZWRSZXNpemUgPSBudWxsO1xuXG4gICAgdmFyIHNzclN0YXRlID0gX3RoaXMuc3NySW5pdCgpO1xuXG4gICAgX3RoaXMuc3RhdGUgPSAoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgX3RoaXMuc3RhdGUpLCBzc3JTdGF0ZSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShJbm5lclNsaWRlciwgW3tcbiAgICBrZXk6IFwiZGlkUHJvcHNDaGFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlkUHJvcHNDaGFuZ2UocHJldlByb3BzKSB7XG4gICAgICB2YXIgc2V0VHJhY2tTdHlsZSA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBfaTMgPSAwLCBfT2JqZWN0JGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BzKTsgX2kzIDwgX09iamVjdCRrZXlzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgdmFyIGtleSA9IF9PYmplY3Qka2V5c1tfaTNdO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgaWYgKCFwcmV2UHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHNldFRyYWNrU3R5bGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKHByZXZQcm9wc1trZXldKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgcHJldlByb3BzW2tleV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZQcm9wc1trZXldICE9PSB0aGlzLnByb3BzW2tleV0pIHtcbiAgICAgICAgICBzZXRUcmFja1N0eWxlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2V0VHJhY2tTdHlsZSB8fCBfcmVhY3RbXCJkZWZhdWx0XCJdLkNoaWxkcmVuLmNvdW50KHRoaXMucHJvcHMuY2hpbGRyZW4pICE9PSBfcmVhY3RbXCJkZWZhdWx0XCJdLkNoaWxkcmVuLmNvdW50KHByZXZQcm9wcy5jaGlsZHJlbik7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbm5lclNsaWRlcjtcbn0oX3JlYWN0W1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5leHBvcnRzLklubmVyU2xpZGVyID0gSW5uZXJTbGlkZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfaW5uZXJTbGlkZXIgPSByZXF1aXJlKFwiLi9pbm5lci1zbGlkZXJcIik7XG5cbnZhciBfanNvbjJtcSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImpzb24ybXFcIikpO1xuXG52YXIgX2RlZmF1bHRQcm9wcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVmYXVsdC1wcm9wc1wiKSk7XG5cbnZhciBfaW5uZXJTbGlkZXJVdGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzL2lubmVyU2xpZGVyVXRpbHNcIik7XG5cbnZhciBTbGlkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShTbGlkZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKFNsaWRlcik7XG5cbiAgZnVuY3Rpb24gU2xpZGVyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBTbGlkZXIpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcImlubmVyU2xpZGVyUmVmSGFuZGxlclwiLCBmdW5jdGlvbiAocmVmKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaW5uZXJTbGlkZXIgPSByZWY7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwic2xpY2tQcmV2XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5pbm5lclNsaWRlci5zbGlja1ByZXYoKTtcbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJzbGlja05leHRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmlubmVyU2xpZGVyLnNsaWNrTmV4dCgpO1xuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcInNsaWNrR29Ub1wiLCBmdW5jdGlvbiAoc2xpZGUpIHtcbiAgICAgIHZhciBkb250QW5pbWF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICByZXR1cm4gX3RoaXMuaW5uZXJTbGlkZXIuc2xpY2tHb1RvKHNsaWRlLCBkb250QW5pbWF0ZSk7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwic2xpY2tQYXVzZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaW5uZXJTbGlkZXIucGF1c2UoXCJwYXVzZWRcIik7XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksIFwic2xpY2tQbGF5XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5pbm5lclNsaWRlci5hdXRvUGxheShcInBsYXlcIik7XG4gICAgfSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBicmVha3BvaW50OiBudWxsXG4gICAgfTtcbiAgICBfdGhpcy5fcmVzcG9uc2l2ZU1lZGlhSGFuZGxlcnMgPSBbXTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKFNsaWRlciwgW3tcbiAgICBrZXk6IFwibWVkaWFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWVkaWEocXVlcnksIGhhbmRsZXIpIHtcbiAgICAgIC8vIGphdmFzY3JpcHQgaGFuZGxlciBmb3IgIGNzcyBtZWRpYSBxdWVyeVxuICAgICAgdmFyIG1xbCA9IHdpbmRvdy5tYXRjaE1lZGlhKHF1ZXJ5KTtcblxuICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gbGlzdGVuZXIoX3JlZikge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IF9yZWYubWF0Y2hlcztcblxuICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgIGhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbXFsLmFkZExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIGxpc3RlbmVyKG1xbCk7XG5cbiAgICAgIHRoaXMuX3Jlc3BvbnNpdmVNZWRpYUhhbmRsZXJzLnB1c2goe1xuICAgICAgICBtcWw6IG1xbCxcbiAgICAgICAgcXVlcnk6IHF1ZXJ5LFxuICAgICAgICBsaXN0ZW5lcjogbGlzdGVuZXJcbiAgICAgIH0pO1xuICAgIH0gLy8gaGFuZGxlcyByZXNwb25zaXZlIGJyZWFrcG9pbnRzXG5cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAvLyBwZXJmb3JtYW5jZSBtb25pdG9yaW5nXG4gICAgICAvL2lmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvL2NvbnN0IHsgd2h5RGlkWW91VXBkYXRlIH0gPSByZXF1aXJlKCd3aHktZGlkLXlvdS11cGRhdGUnKVxuICAgICAgLy93aHlEaWRZb3VVcGRhdGUoUmVhY3QpXG4gICAgICAvL31cbiAgICAgIGlmICh0aGlzLnByb3BzLnJlc3BvbnNpdmUpIHtcbiAgICAgICAgdmFyIGJyZWFrcG9pbnRzID0gdGhpcy5wcm9wcy5yZXNwb25zaXZlLm1hcChmdW5jdGlvbiAoYnJlYWtwdCkge1xuICAgICAgICAgIHJldHVybiBicmVha3B0LmJyZWFrcG9pbnQ7XG4gICAgICAgIH0pOyAvLyBzb3J0IHRoZW0gaW4gaW5jcmVhc2luZyBvcmRlciBvZiB0aGVpciBudW1lcmljYWwgdmFsdWVcblxuICAgICAgICBicmVha3BvaW50cy5zb3J0KGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgICAgcmV0dXJuIHggLSB5O1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWtwb2ludHMuZm9yRWFjaChmdW5jdGlvbiAoYnJlYWtwb2ludCwgaW5kZXgpIHtcbiAgICAgICAgICAvLyBtZWRpYSBxdWVyeSBmb3IgZWFjaCBicmVha3BvaW50XG4gICAgICAgICAgdmFyIGJRdWVyeTtcblxuICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgYlF1ZXJ5ID0gKDAsIF9qc29uMm1xW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgICAgICBtaW5XaWR0aDogMCxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IGJyZWFrcG9pbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiUXVlcnkgPSAoMCwgX2pzb24ybXFbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgICAgICAgIG1pbldpZHRoOiBicmVha3BvaW50c1tpbmRleCAtIDFdICsgMSxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IGJyZWFrcG9pbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gLy8gd2hlbiBub3QgdXNpbmcgc2VydmVyIHNpZGUgcmVuZGVyaW5nXG5cblxuICAgICAgICAgICgwLCBfaW5uZXJTbGlkZXJVdGlscy5jYW5Vc2VET00pKCkgJiYgX3RoaXMyLm1lZGlhKGJRdWVyeSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgYnJlYWtwb2ludDogYnJlYWtwb2ludFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pOyAvLyBSZWdpc3RlciBtZWRpYSBxdWVyeSBmb3IgZnVsbCBzY3JlZW4uIE5lZWQgdG8gc3VwcG9ydCByZXNpemUgZnJvbSBzbWFsbCB0byBsYXJnZVxuICAgICAgICAvLyBjb252ZXJ0IGphdmFzY3JpcHQgb2JqZWN0IHRvIG1lZGlhIHF1ZXJ5IHN0cmluZ1xuXG4gICAgICAgIHZhciBxdWVyeSA9ICgwLCBfanNvbjJtcVtcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgICBtaW5XaWR0aDogYnJlYWtwb2ludHMuc2xpY2UoLTEpWzBdXG4gICAgICAgIH0pO1xuICAgICAgICAoMCwgX2lubmVyU2xpZGVyVXRpbHMuY2FuVXNlRE9NKSgpICYmIHRoaXMubWVkaWEocXVlcnksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIuc2V0U3RhdGUoe1xuICAgICAgICAgICAgYnJlYWtwb2ludDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLl9yZXNwb25zaXZlTWVkaWFIYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgb2JqLm1xbC5yZW1vdmVMaXN0ZW5lcihvYmoubGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIHNldHRpbmdzO1xuICAgICAgdmFyIG5ld1Byb3BzO1xuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5icmVha3BvaW50KSB7XG4gICAgICAgIG5ld1Byb3BzID0gdGhpcy5wcm9wcy5yZXNwb25zaXZlLmZpbHRlcihmdW5jdGlvbiAocmVzcCkge1xuICAgICAgICAgIHJldHVybiByZXNwLmJyZWFrcG9pbnQgPT09IF90aGlzMy5zdGF0ZS5icmVha3BvaW50O1xuICAgICAgICB9KTtcbiAgICAgICAgc2V0dGluZ3MgPSBuZXdQcm9wc1swXS5zZXR0aW5ncyA9PT0gXCJ1bnNsaWNrXCIgPyBcInVuc2xpY2tcIiA6ICgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBfZGVmYXVsdFByb3BzW1wiZGVmYXVsdFwiXSksIHRoaXMucHJvcHMpLCBuZXdQcm9wc1swXS5zZXR0aW5ncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXR0aW5ncyA9ICgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBfZGVmYXVsdFByb3BzW1wiZGVmYXVsdFwiXSksIHRoaXMucHJvcHMpO1xuICAgICAgfSAvLyBmb3JjZSBzY3JvbGxpbmcgYnkgb25lIGlmIGNlbnRlck1vZGUgaXMgb25cblxuXG4gICAgICBpZiAoc2V0dGluZ3MuY2VudGVyTW9kZSkge1xuICAgICAgICBpZiAoc2V0dGluZ3Muc2xpZGVzVG9TY3JvbGwgPiAxICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcInNsaWRlc1RvU2Nyb2xsIHNob3VsZCBiZSBlcXVhbCB0byAxIGluIGNlbnRlck1vZGUsIHlvdSBhcmUgdXNpbmcgXCIuY29uY2F0KHNldHRpbmdzLnNsaWRlc1RvU2Nyb2xsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0aW5ncy5zbGlkZXNUb1Njcm9sbCA9IDE7XG4gICAgICB9IC8vIGZvcmNlIHNob3dpbmcgb25lIHNsaWRlIGFuZCBzY3JvbGxpbmcgYnkgb25lIGlmIHRoZSBmYWRlIG1vZGUgaXMgb25cblxuXG4gICAgICBpZiAoc2V0dGluZ3MuZmFkZSkge1xuICAgICAgICBpZiAoc2V0dGluZ3Muc2xpZGVzVG9TaG93ID4gMSAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJzbGlkZXNUb1Nob3cgc2hvdWxkIGJlIGVxdWFsIHRvIDEgd2hlbiBmYWRlIGlzIHRydWUsIHlvdSdyZSB1c2luZyBcIi5jb25jYXQoc2V0dGluZ3Muc2xpZGVzVG9TaG93KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3Muc2xpZGVzVG9TY3JvbGwgPiAxICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcInNsaWRlc1RvU2Nyb2xsIHNob3VsZCBiZSBlcXVhbCB0byAxIHdoZW4gZmFkZSBpcyB0cnVlLCB5b3UncmUgdXNpbmcgXCIuY29uY2F0KHNldHRpbmdzLnNsaWRlc1RvU2Nyb2xsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0aW5ncy5zbGlkZXNUb1Nob3cgPSAxO1xuICAgICAgICBzZXR0aW5ncy5zbGlkZXNUb1Njcm9sbCA9IDE7XG4gICAgICB9IC8vIG1ha2VzIHN1cmUgdGhhdCBjaGlsZHJlbiBpcyBhbiBhcnJheSwgZXZlbiB3aGVuIHRoZXJlIGlzIG9ubHkgMSBjaGlsZFxuXG5cbiAgICAgIHZhciBjaGlsZHJlbiA9IF9yZWFjdFtcImRlZmF1bHRcIl0uQ2hpbGRyZW4udG9BcnJheSh0aGlzLnByb3BzLmNoaWxkcmVuKTsgLy8gQ2hpbGRyZW4gbWF5IGNvbnRhaW4gZmFsc2Ugb3IgbnVsbCwgc28gd2Ugc2hvdWxkIGZpbHRlciB0aGVtXG4gICAgICAvLyBjaGlsZHJlbiBtYXkgYWxzbyBjb250YWluIHN0cmluZyBmaWxsZWQgd2l0aCBzcGFjZXMgKGluIGNlcnRhaW4gY2FzZXMgd2hlcmUgd2UgdXNlIGpzeCBzdHJpbmdzKVxuXG5cbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuICEhY2hpbGQudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhY2hpbGQ7XG4gICAgICB9KTsgLy8gcm93cyBhbmQgc2xpZGVzUGVyUm93IGxvZ2ljIGlzIGhhbmRsZWQgaGVyZVxuXG4gICAgICBpZiAoc2V0dGluZ3MudmFyaWFibGVXaWR0aCAmJiAoc2V0dGluZ3Mucm93cyA+IDEgfHwgc2V0dGluZ3Muc2xpZGVzUGVyUm93ID4gMSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwidmFyaWFibGVXaWR0aCBpcyBub3Qgc3VwcG9ydGVkIGluIGNhc2Ugb2Ygcm93cyA+IDEgb3Igc2xpZGVzUGVyUm93ID4gMVwiKTtcbiAgICAgICAgc2V0dGluZ3MudmFyaWFibGVXaWR0aCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICAgIHZhciBjdXJyZW50V2lkdGggPSBudWxsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSBzZXR0aW5ncy5yb3dzICogc2V0dGluZ3Muc2xpZGVzUGVyUm93KSB7XG4gICAgICAgIHZhciBuZXdTbGlkZSA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGogPSBpOyBqIDwgaSArIHNldHRpbmdzLnJvd3MgKiBzZXR0aW5ncy5zbGlkZXNQZXJSb3c7IGogKz0gc2V0dGluZ3Muc2xpZGVzUGVyUm93KSB7XG4gICAgICAgICAgdmFyIHJvdyA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgayA9IGo7IGsgPCBqICsgc2V0dGluZ3Muc2xpZGVzUGVyUm93OyBrICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy52YXJpYWJsZVdpZHRoICYmIGNoaWxkcmVuW2tdLnByb3BzLnN0eWxlKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IGNoaWxkcmVuW2tdLnByb3BzLnN0eWxlLndpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoayA+PSBjaGlsZHJlbi5sZW5ndGgpIGJyZWFrO1xuICAgICAgICAgICAgcm93LnB1c2goIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNsb25lRWxlbWVudChjaGlsZHJlbltrXSwge1xuICAgICAgICAgICAgICBrZXk6IDEwMCAqIGkgKyAxMCAqIGogKyBrLFxuICAgICAgICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiXCIuY29uY2F0KDEwMCAvIHNldHRpbmdzLnNsaWRlc1BlclJvdywgXCIlXCIpLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld1NsaWRlLnB1c2goIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAga2V5OiAxMCAqIGkgKyBqXG4gICAgICAgICAgfSwgcm93KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MudmFyaWFibGVXaWR0aCkge1xuICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2goIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAga2V5OiBpLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIG5ld1NsaWRlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaCggLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICBrZXk6IGlcbiAgICAgICAgICB9LCBuZXdTbGlkZSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXR0aW5ncyA9PT0gXCJ1bnNsaWNrXCIpIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFwicmVndWxhciBzbGlkZXIgXCIgKyAodGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIik7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgICAgICB9LCBjaGlsZHJlbik7XG4gICAgICB9IGVsc2UgaWYgKG5ld0NoaWxkcmVuLmxlbmd0aCA8PSBzZXR0aW5ncy5zbGlkZXNUb1Nob3cpIHtcbiAgICAgICAgc2V0dGluZ3MudW5zbGljayA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KF9pbm5lclNsaWRlci5Jbm5lclNsaWRlciwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgc3R5bGU6IHRoaXMucHJvcHMuc3R5bGUsXG4gICAgICAgIHJlZjogdGhpcy5pbm5lclNsaWRlclJlZkhhbmRsZXJcbiAgICAgIH0sIHNldHRpbmdzKSwgbmV3Q2hpbGRyZW4pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gU2xpZGVyO1xufShfcmVhY3RbXCJkZWZhdWx0XCJdLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU2xpZGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuVHJhY2sgPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2lubmVyU2xpZGVyVXRpbHMgPSByZXF1aXJlKFwiLi91dGlscy9pbm5lclNsaWRlclV0aWxzXCIpO1xuXG4vLyBnaXZlbiBzcGVjaWZpY2F0aW9ucy9wcm9wcyBmb3IgYSBzbGlkZSwgZmV0Y2ggYWxsIHRoZSBjbGFzc2VzIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkIHRvIHRoZSBzbGlkZVxudmFyIGdldFNsaWRlQ2xhc3NlcyA9IGZ1bmN0aW9uIGdldFNsaWRlQ2xhc3NlcyhzcGVjKSB7XG4gIHZhciBzbGlja0FjdGl2ZSwgc2xpY2tDZW50ZXIsIHNsaWNrQ2xvbmVkO1xuICB2YXIgY2VudGVyT2Zmc2V0LCBpbmRleDtcblxuICBpZiAoc3BlYy5ydGwpIHtcbiAgICBpbmRleCA9IHNwZWMuc2xpZGVDb3VudCAtIDEgLSBzcGVjLmluZGV4O1xuICB9IGVsc2Uge1xuICAgIGluZGV4ID0gc3BlYy5pbmRleDtcbiAgfVxuXG4gIHNsaWNrQ2xvbmVkID0gaW5kZXggPCAwIHx8IGluZGV4ID49IHNwZWMuc2xpZGVDb3VudDtcblxuICBpZiAoc3BlYy5jZW50ZXJNb2RlKSB7XG4gICAgY2VudGVyT2Zmc2V0ID0gTWF0aC5mbG9vcihzcGVjLnNsaWRlc1RvU2hvdyAvIDIpO1xuICAgIHNsaWNrQ2VudGVyID0gKGluZGV4IC0gc3BlYy5jdXJyZW50U2xpZGUpICUgc3BlYy5zbGlkZUNvdW50ID09PSAwO1xuXG4gICAgaWYgKGluZGV4ID4gc3BlYy5jdXJyZW50U2xpZGUgLSBjZW50ZXJPZmZzZXQgLSAxICYmIGluZGV4IDw9IHNwZWMuY3VycmVudFNsaWRlICsgY2VudGVyT2Zmc2V0KSB7XG4gICAgICBzbGlja0FjdGl2ZSA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNsaWNrQWN0aXZlID0gc3BlYy5jdXJyZW50U2xpZGUgPD0gaW5kZXggJiYgaW5kZXggPCBzcGVjLmN1cnJlbnRTbGlkZSArIHNwZWMuc2xpZGVzVG9TaG93O1xuICB9XG5cbiAgdmFyIGZvY3VzZWRTbGlkZTtcblxuICBpZiAoc3BlYy50YXJnZXRTbGlkZSA8IDApIHtcbiAgICBmb2N1c2VkU2xpZGUgPSBzcGVjLnRhcmdldFNsaWRlICsgc3BlYy5zbGlkZUNvdW50O1xuICB9IGVsc2UgaWYgKHNwZWMudGFyZ2V0U2xpZGUgPj0gc3BlYy5zbGlkZUNvdW50KSB7XG4gICAgZm9jdXNlZFNsaWRlID0gc3BlYy50YXJnZXRTbGlkZSAtIHNwZWMuc2xpZGVDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBmb2N1c2VkU2xpZGUgPSBzcGVjLnRhcmdldFNsaWRlO1xuICB9XG5cbiAgdmFyIHNsaWNrQ3VycmVudCA9IGluZGV4ID09PSBmb2N1c2VkU2xpZGU7XG4gIHJldHVybiB7XG4gICAgXCJzbGljay1zbGlkZVwiOiB0cnVlLFxuICAgIFwic2xpY2stYWN0aXZlXCI6IHNsaWNrQWN0aXZlLFxuICAgIFwic2xpY2stY2VudGVyXCI6IHNsaWNrQ2VudGVyLFxuICAgIFwic2xpY2stY2xvbmVkXCI6IHNsaWNrQ2xvbmVkLFxuICAgIFwic2xpY2stY3VycmVudFwiOiBzbGlja0N1cnJlbnQgLy8gZHViaW91cyBpbiBjYXNlIG9mIFJUTFxuXG4gIH07XG59O1xuXG52YXIgZ2V0U2xpZGVTdHlsZSA9IGZ1bmN0aW9uIGdldFNsaWRlU3R5bGUoc3BlYykge1xuICB2YXIgc3R5bGUgPSB7fTtcblxuICBpZiAoc3BlYy52YXJpYWJsZVdpZHRoID09PSB1bmRlZmluZWQgfHwgc3BlYy52YXJpYWJsZVdpZHRoID09PSBmYWxzZSkge1xuICAgIHN0eWxlLndpZHRoID0gc3BlYy5zbGlkZVdpZHRoO1xuICB9XG5cbiAgaWYgKHNwZWMuZmFkZSkge1xuICAgIHN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuXG4gICAgaWYgKHNwZWMudmVydGljYWwpIHtcbiAgICAgIHN0eWxlLnRvcCA9IC1zcGVjLmluZGV4ICogcGFyc2VJbnQoc3BlYy5zbGlkZUhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLmxlZnQgPSAtc3BlYy5pbmRleCAqIHBhcnNlSW50KHNwZWMuc2xpZGVXaWR0aCk7XG4gICAgfVxuXG4gICAgc3R5bGUub3BhY2l0eSA9IHNwZWMuY3VycmVudFNsaWRlID09PSBzcGVjLmluZGV4ID8gMSA6IDA7XG5cbiAgICBpZiAoc3BlYy51c2VDU1MpIHtcbiAgICAgIHN0eWxlLnRyYW5zaXRpb24gPSBcIm9wYWNpdHkgXCIgKyBzcGVjLnNwZWVkICsgXCJtcyBcIiArIHNwZWMuY3NzRWFzZSArIFwiLCBcIiArIFwidmlzaWJpbGl0eSBcIiArIHNwZWMuc3BlZWQgKyBcIm1zIFwiICsgc3BlYy5jc3NFYXNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnZhciBnZXRLZXkgPSBmdW5jdGlvbiBnZXRLZXkoY2hpbGQsIGZhbGxiYWNrS2V5KSB7XG4gIHJldHVybiBjaGlsZC5rZXkgKyBcIi1cIiArIGZhbGxiYWNrS2V5O1xufTtcblxudmFyIHJlbmRlclNsaWRlcyA9IGZ1bmN0aW9uIHJlbmRlclNsaWRlcyhzcGVjKSB7XG4gIHZhciBrZXk7XG4gIHZhciBzbGlkZXMgPSBbXTtcbiAgdmFyIHByZUNsb25lU2xpZGVzID0gW107XG4gIHZhciBwb3N0Q2xvbmVTbGlkZXMgPSBbXTtcblxuICB2YXIgY2hpbGRyZW5Db3VudCA9IF9yZWFjdFtcImRlZmF1bHRcIl0uQ2hpbGRyZW4uY291bnQoc3BlYy5jaGlsZHJlbik7XG5cbiAgdmFyIHN0YXJ0SW5kZXggPSAoMCwgX2lubmVyU2xpZGVyVXRpbHMubGF6eVN0YXJ0SW5kZXgpKHNwZWMpO1xuICB2YXIgZW5kSW5kZXggPSAoMCwgX2lubmVyU2xpZGVyVXRpbHMubGF6eUVuZEluZGV4KShzcGVjKTtcblxuICBfcmVhY3RbXCJkZWZhdWx0XCJdLkNoaWxkcmVuLmZvckVhY2goc3BlYy5jaGlsZHJlbiwgZnVuY3Rpb24gKGVsZW0sIGluZGV4KSB7XG4gICAgdmFyIGNoaWxkO1xuICAgIHZhciBjaGlsZE9uQ2xpY2tPcHRpb25zID0ge1xuICAgICAgbWVzc2FnZTogXCJjaGlsZHJlblwiLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgc2xpZGVzVG9TY3JvbGw6IHNwZWMuc2xpZGVzVG9TY3JvbGwsXG4gICAgICBjdXJyZW50U2xpZGU6IHNwZWMuY3VycmVudFNsaWRlXG4gICAgfTsgLy8gaW4gY2FzZSBvZiBsYXp5TG9hZCwgd2hldGhlciBvciBub3Qgd2Ugd2FudCB0byBmZXRjaCB0aGUgc2xpZGVcblxuICAgIGlmICghc3BlYy5sYXp5TG9hZCB8fCBzcGVjLmxhenlMb2FkICYmIHNwZWMubGF6eUxvYWRlZExpc3QuaW5kZXhPZihpbmRleCkgPj0gMCkge1xuICAgICAgY2hpbGQgPSBlbGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZCA9IC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCk7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkU3R5bGUgPSBnZXRTbGlkZVN0eWxlKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBzcGVjKSwge30sIHtcbiAgICAgIGluZGV4OiBpbmRleFxuICAgIH0pKTtcbiAgICB2YXIgc2xpZGVDbGFzcyA9IGNoaWxkLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwiO1xuICAgIHZhciBzbGlkZUNsYXNzZXMgPSBnZXRTbGlkZUNsYXNzZXMoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIHNwZWMpLCB7fSwge1xuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfSkpOyAvLyBwdXNoIGEgY2xvbmVkIGVsZW1lbnQgb2YgdGhlIGRlc2lyZWQgc2xpZGVcblxuICAgIHNsaWRlcy5wdXNoKCAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgIGtleTogXCJvcmlnaW5hbFwiICsgZ2V0S2V5KGNoaWxkLCBpbmRleCksXG4gICAgICBcImRhdGEtaW5kZXhcIjogaW5kZXgsXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHNsaWRlQ2xhc3Nlcywgc2xpZGVDbGFzcyksXG4gICAgICB0YWJJbmRleDogXCItMVwiLFxuICAgICAgXCJhcmlhLWhpZGRlblwiOiAhc2xpZGVDbGFzc2VzW1wic2xpY2stYWN0aXZlXCJdLFxuICAgICAgc3R5bGU6ICgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgb3V0bGluZTogXCJub25lXCJcbiAgICAgIH0sIGNoaWxkLnByb3BzLnN0eWxlIHx8IHt9KSwgY2hpbGRTdHlsZSksXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgY2hpbGQucHJvcHMgJiYgY2hpbGQucHJvcHMub25DbGljayAmJiBjaGlsZC5wcm9wcy5vbkNsaWNrKGUpO1xuXG4gICAgICAgIGlmIChzcGVjLmZvY3VzT25TZWxlY3QpIHtcbiAgICAgICAgICBzcGVjLmZvY3VzT25TZWxlY3QoY2hpbGRPbkNsaWNrT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSk7IC8vIGlmIHNsaWRlIG5lZWRzIHRvIGJlIHByZWNsb25lZCBvciBwb3N0Y2xvbmVkXG5cbiAgICBpZiAoc3BlYy5pbmZpbml0ZSAmJiBzcGVjLmZhZGUgPT09IGZhbHNlKSB7XG4gICAgICB2YXIgcHJlQ2xvbmVObyA9IGNoaWxkcmVuQ291bnQgLSBpbmRleDtcblxuICAgICAgaWYgKHByZUNsb25lTm8gPD0gKDAsIF9pbm5lclNsaWRlclV0aWxzLmdldFByZUNsb25lcykoc3BlYykgJiYgY2hpbGRyZW5Db3VudCAhPT0gc3BlYy5zbGlkZXNUb1Nob3cpIHtcbiAgICAgICAga2V5ID0gLXByZUNsb25lTm87XG5cbiAgICAgICAgaWYgKGtleSA+PSBzdGFydEluZGV4KSB7XG4gICAgICAgICAgY2hpbGQgPSBlbGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgc2xpZGVDbGFzc2VzID0gZ2V0U2xpZGVDbGFzc2VzKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBzcGVjKSwge30sIHtcbiAgICAgICAgICBpbmRleDoga2V5XG4gICAgICAgIH0pKTtcbiAgICAgICAgcHJlQ2xvbmVTbGlkZXMucHVzaCggLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgICAgICAga2V5OiBcInByZWNsb25lZFwiICsgZ2V0S2V5KGNoaWxkLCBrZXkpLFxuICAgICAgICAgIFwiZGF0YS1pbmRleFwiOiBrZXksXG4gICAgICAgICAgdGFiSW5kZXg6IFwiLTFcIixcbiAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHNsaWRlQ2xhc3Nlcywgc2xpZGVDbGFzcyksXG4gICAgICAgICAgXCJhcmlhLWhpZGRlblwiOiAhc2xpZGVDbGFzc2VzW1wic2xpY2stYWN0aXZlXCJdLFxuICAgICAgICAgIHN0eWxlOiAoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgY2hpbGQucHJvcHMuc3R5bGUgfHwge30pLCBjaGlsZFN0eWxlKSxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgICAgIGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLm9uQ2xpY2sgJiYgY2hpbGQucHJvcHMub25DbGljayhlKTtcblxuICAgICAgICAgICAgaWYgKHNwZWMuZm9jdXNPblNlbGVjdCkge1xuICAgICAgICAgICAgICBzcGVjLmZvY3VzT25TZWxlY3QoY2hpbGRPbkNsaWNrT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZHJlbkNvdW50ICE9PSBzcGVjLnNsaWRlc1RvU2hvdykge1xuICAgICAgICBrZXkgPSBjaGlsZHJlbkNvdW50ICsgaW5kZXg7XG5cbiAgICAgICAgaWYgKGtleSA8IGVuZEluZGV4KSB7XG4gICAgICAgICAgY2hpbGQgPSBlbGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgc2xpZGVDbGFzc2VzID0gZ2V0U2xpZGVDbGFzc2VzKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBzcGVjKSwge30sIHtcbiAgICAgICAgICBpbmRleDoga2V5XG4gICAgICAgIH0pKTtcbiAgICAgICAgcG9zdENsb25lU2xpZGVzLnB1c2goIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgICAgIGtleTogXCJwb3N0Y2xvbmVkXCIgKyBnZXRLZXkoY2hpbGQsIGtleSksXG4gICAgICAgICAgXCJkYXRhLWluZGV4XCI6IGtleSxcbiAgICAgICAgICB0YWJJbmRleDogXCItMVwiLFxuICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoc2xpZGVDbGFzc2VzLCBzbGlkZUNsYXNzKSxcbiAgICAgICAgICBcImFyaWEtaGlkZGVuXCI6ICFzbGlkZUNsYXNzZXNbXCJzbGljay1hY3RpdmVcIl0sXG4gICAgICAgICAgc3R5bGU6ICgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBjaGlsZC5wcm9wcy5zdHlsZSB8fCB7fSksIGNoaWxkU3R5bGUpLFxuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgICAgY2hpbGQucHJvcHMgJiYgY2hpbGQucHJvcHMub25DbGljayAmJiBjaGlsZC5wcm9wcy5vbkNsaWNrKGUpO1xuXG4gICAgICAgICAgICBpZiAoc3BlYy5mb2N1c09uU2VsZWN0KSB7XG4gICAgICAgICAgICAgIHNwZWMuZm9jdXNPblNlbGVjdChjaGlsZE9uQ2xpY2tPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChzcGVjLnJ0bCkge1xuICAgIHJldHVybiBwcmVDbG9uZVNsaWRlcy5jb25jYXQoc2xpZGVzLCBwb3N0Q2xvbmVTbGlkZXMpLnJldmVyc2UoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcHJlQ2xvbmVTbGlkZXMuY29uY2F0KHNsaWRlcywgcG9zdENsb25lU2xpZGVzKTtcbiAgfVxufTtcblxudmFyIFRyYWNrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkUHVyZUNvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKFRyYWNrLCBfUmVhY3QkUHVyZUNvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoVHJhY2spO1xuXG4gIGZ1bmN0aW9uIFRyYWNrKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgVHJhY2spO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSwgXCJub2RlXCIsIG51bGwpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLCBcImhhbmRsZVJlZlwiLCBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy5ub2RlID0gcmVmO1xuICAgIH0pO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoVHJhY2ssIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgc2xpZGVzID0gcmVuZGVyU2xpZGVzKHRoaXMucHJvcHMpO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbk1vdXNlRW50ZXIgPSBfdGhpcyRwcm9wcy5vbk1vdXNlRW50ZXIsXG4gICAgICAgICAgb25Nb3VzZU92ZXIgPSBfdGhpcyRwcm9wcy5vbk1vdXNlT3ZlcixcbiAgICAgICAgICBvbk1vdXNlTGVhdmUgPSBfdGhpcyRwcm9wcy5vbk1vdXNlTGVhdmU7XG4gICAgICB2YXIgbW91c2VFdmVudHMgPSB7XG4gICAgICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlT3Zlcjogb25Nb3VzZU92ZXIsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgcmVmOiB0aGlzLmhhbmRsZVJlZixcbiAgICAgICAgY2xhc3NOYW1lOiBcInNsaWNrLXRyYWNrXCIsXG4gICAgICAgIHN0eWxlOiB0aGlzLnByb3BzLnRyYWNrU3R5bGVcbiAgICAgIH0sIG1vdXNlRXZlbnRzKSwgc2xpZGVzKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFRyYWNrO1xufShfcmVhY3RbXCJkZWZhdWx0XCJdLlB1cmVDb21wb25lbnQpO1xuXG5leHBvcnRzLlRyYWNrID0gVHJhY2s7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jbGFtcCA9IGNsYW1wO1xuZXhwb3J0cy5jYW5Vc2VET00gPSBleHBvcnRzLnNsaWRlc09uTGVmdCA9IGV4cG9ydHMuc2xpZGVzT25SaWdodCA9IGV4cG9ydHMuc2libGluZ0RpcmVjdGlvbiA9IGV4cG9ydHMuZ2V0VG90YWxTbGlkZXMgPSBleHBvcnRzLmdldFBvc3RDbG9uZXMgPSBleHBvcnRzLmdldFByZUNsb25lcyA9IGV4cG9ydHMuZ2V0VHJhY2tMZWZ0ID0gZXhwb3J0cy5nZXRUcmFja0FuaW1hdGVDU1MgPSBleHBvcnRzLmdldFRyYWNrQ1NTID0gZXhwb3J0cy5jaGVja1NwZWNLZXlzID0gZXhwb3J0cy5nZXRTbGlkZUNvdW50ID0gZXhwb3J0cy5jaGVja05hdmlnYWJsZSA9IGV4cG9ydHMuZ2V0TmF2aWdhYmxlSW5kZXhlcyA9IGV4cG9ydHMuc3dpcGVFbmQgPSBleHBvcnRzLnN3aXBlTW92ZSA9IGV4cG9ydHMuc3dpcGVTdGFydCA9IGV4cG9ydHMua2V5SGFuZGxlciA9IGV4cG9ydHMuY2hhbmdlU2xpZGUgPSBleHBvcnRzLnNsaWRlSGFuZGxlciA9IGV4cG9ydHMuaW5pdGlhbGl6ZWRTdGF0ZSA9IGV4cG9ydHMuZXh0cmFjdE9iamVjdCA9IGV4cG9ydHMuY2FuR29OZXh0ID0gZXhwb3J0cy5nZXRTd2lwZURpcmVjdGlvbiA9IGV4cG9ydHMuZ2V0SGVpZ2h0ID0gZXhwb3J0cy5nZXRXaWR0aCA9IGV4cG9ydHMubGF6eVNsaWRlc09uUmlnaHQgPSBleHBvcnRzLmxhenlTbGlkZXNPbkxlZnQgPSBleHBvcnRzLmxhenlFbmRJbmRleCA9IGV4cG9ydHMubGF6eVN0YXJ0SW5kZXggPSBleHBvcnRzLmdldFJlcXVpcmVkTGF6eVNsaWRlcyA9IGV4cG9ydHMuZ2V0T25EZW1hbmRMYXp5U2xpZGVzID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG5mdW5jdGlvbiBjbGFtcChudW1iZXIsIGxvd2VyQm91bmQsIHVwcGVyQm91bmQpIHtcbiAgcmV0dXJuIE1hdGgubWF4KGxvd2VyQm91bmQsIE1hdGgubWluKG51bWJlciwgdXBwZXJCb3VuZCkpO1xufVxuXG52YXIgZ2V0T25EZW1hbmRMYXp5U2xpZGVzID0gZnVuY3Rpb24gZ2V0T25EZW1hbmRMYXp5U2xpZGVzKHNwZWMpIHtcbiAgdmFyIG9uRGVtYW5kU2xpZGVzID0gW107XG4gIHZhciBzdGFydEluZGV4ID0gbGF6eVN0YXJ0SW5kZXgoc3BlYyk7XG4gIHZhciBlbmRJbmRleCA9IGxhenlFbmRJbmRleChzcGVjKTtcblxuICBmb3IgKHZhciBzbGlkZUluZGV4ID0gc3RhcnRJbmRleDsgc2xpZGVJbmRleCA8IGVuZEluZGV4OyBzbGlkZUluZGV4KyspIHtcbiAgICBpZiAoc3BlYy5sYXp5TG9hZGVkTGlzdC5pbmRleE9mKHNsaWRlSW5kZXgpIDwgMCkge1xuICAgICAgb25EZW1hbmRTbGlkZXMucHVzaChzbGlkZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb25EZW1hbmRTbGlkZXM7XG59OyAvLyByZXR1cm4gbGlzdCBvZiBzbGlkZXMgdGhhdCBuZWVkIHRvIGJlIHByZXNlbnRcblxuXG5leHBvcnRzLmdldE9uRGVtYW5kTGF6eVNsaWRlcyA9IGdldE9uRGVtYW5kTGF6eVNsaWRlcztcblxudmFyIGdldFJlcXVpcmVkTGF6eVNsaWRlcyA9IGZ1bmN0aW9uIGdldFJlcXVpcmVkTGF6eVNsaWRlcyhzcGVjKSB7XG4gIHZhciByZXF1aXJlZFNsaWRlcyA9IFtdO1xuICB2YXIgc3RhcnRJbmRleCA9IGxhenlTdGFydEluZGV4KHNwZWMpO1xuICB2YXIgZW5kSW5kZXggPSBsYXp5RW5kSW5kZXgoc3BlYyk7XG5cbiAgZm9yICh2YXIgc2xpZGVJbmRleCA9IHN0YXJ0SW5kZXg7IHNsaWRlSW5kZXggPCBlbmRJbmRleDsgc2xpZGVJbmRleCsrKSB7XG4gICAgcmVxdWlyZWRTbGlkZXMucHVzaChzbGlkZUluZGV4KTtcbiAgfVxuXG4gIHJldHVybiByZXF1aXJlZFNsaWRlcztcbn07IC8vIHN0YXJ0SW5kZXggdGhhdCBuZWVkcyB0byBiZSBwcmVzZW50XG5cblxuZXhwb3J0cy5nZXRSZXF1aXJlZExhenlTbGlkZXMgPSBnZXRSZXF1aXJlZExhenlTbGlkZXM7XG5cbnZhciBsYXp5U3RhcnRJbmRleCA9IGZ1bmN0aW9uIGxhenlTdGFydEluZGV4KHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMuY3VycmVudFNsaWRlIC0gbGF6eVNsaWRlc09uTGVmdChzcGVjKTtcbn07XG5cbmV4cG9ydHMubGF6eVN0YXJ0SW5kZXggPSBsYXp5U3RhcnRJbmRleDtcblxudmFyIGxhenlFbmRJbmRleCA9IGZ1bmN0aW9uIGxhenlFbmRJbmRleChzcGVjKSB7XG4gIHJldHVybiBzcGVjLmN1cnJlbnRTbGlkZSArIGxhenlTbGlkZXNPblJpZ2h0KHNwZWMpO1xufTtcblxuZXhwb3J0cy5sYXp5RW5kSW5kZXggPSBsYXp5RW5kSW5kZXg7XG5cbnZhciBsYXp5U2xpZGVzT25MZWZ0ID0gZnVuY3Rpb24gbGF6eVNsaWRlc09uTGVmdChzcGVjKSB7XG4gIHJldHVybiBzcGVjLmNlbnRlck1vZGUgPyBNYXRoLmZsb29yKHNwZWMuc2xpZGVzVG9TaG93IC8gMikgKyAocGFyc2VJbnQoc3BlYy5jZW50ZXJQYWRkaW5nKSA+IDAgPyAxIDogMCkgOiAwO1xufTtcblxuZXhwb3J0cy5sYXp5U2xpZGVzT25MZWZ0ID0gbGF6eVNsaWRlc09uTGVmdDtcblxudmFyIGxhenlTbGlkZXNPblJpZ2h0ID0gZnVuY3Rpb24gbGF6eVNsaWRlc09uUmlnaHQoc3BlYykge1xuICByZXR1cm4gc3BlYy5jZW50ZXJNb2RlID8gTWF0aC5mbG9vcigoc3BlYy5zbGlkZXNUb1Nob3cgLSAxKSAvIDIpICsgMSArIChwYXJzZUludChzcGVjLmNlbnRlclBhZGRpbmcpID4gMCA/IDEgOiAwKSA6IHNwZWMuc2xpZGVzVG9TaG93O1xufTsgLy8gZ2V0IHdpZHRoIG9mIGFuIGVsZW1lbnRcblxuXG5leHBvcnRzLmxhenlTbGlkZXNPblJpZ2h0ID0gbGF6eVNsaWRlc09uUmlnaHQ7XG5cbnZhciBnZXRXaWR0aCA9IGZ1bmN0aW9uIGdldFdpZHRoKGVsZW0pIHtcbiAgcmV0dXJuIGVsZW0gJiYgZWxlbS5vZmZzZXRXaWR0aCB8fCAwO1xufTtcblxuZXhwb3J0cy5nZXRXaWR0aCA9IGdldFdpZHRoO1xuXG52YXIgZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gZ2V0SGVpZ2h0KGVsZW0pIHtcbiAgcmV0dXJuIGVsZW0gJiYgZWxlbS5vZmZzZXRIZWlnaHQgfHwgMDtcbn07XG5cbmV4cG9ydHMuZ2V0SGVpZ2h0ID0gZ2V0SGVpZ2h0O1xuXG52YXIgZ2V0U3dpcGVEaXJlY3Rpb24gPSBmdW5jdGlvbiBnZXRTd2lwZURpcmVjdGlvbih0b3VjaE9iamVjdCkge1xuICB2YXIgdmVydGljYWxTd2lwaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgdmFyIHhEaXN0LCB5RGlzdCwgciwgc3dpcGVBbmdsZTtcbiAgeERpc3QgPSB0b3VjaE9iamVjdC5zdGFydFggLSB0b3VjaE9iamVjdC5jdXJYO1xuICB5RGlzdCA9IHRvdWNoT2JqZWN0LnN0YXJ0WSAtIHRvdWNoT2JqZWN0LmN1clk7XG4gIHIgPSBNYXRoLmF0YW4yKHlEaXN0LCB4RGlzdCk7XG4gIHN3aXBlQW5nbGUgPSBNYXRoLnJvdW5kKHIgKiAxODAgLyBNYXRoLlBJKTtcblxuICBpZiAoc3dpcGVBbmdsZSA8IDApIHtcbiAgICBzd2lwZUFuZ2xlID0gMzYwIC0gTWF0aC5hYnMoc3dpcGVBbmdsZSk7XG4gIH1cblxuICBpZiAoc3dpcGVBbmdsZSA8PSA0NSAmJiBzd2lwZUFuZ2xlID49IDAgfHwgc3dpcGVBbmdsZSA8PSAzNjAgJiYgc3dpcGVBbmdsZSA+PSAzMTUpIHtcbiAgICByZXR1cm4gXCJsZWZ0XCI7XG4gIH1cblxuICBpZiAoc3dpcGVBbmdsZSA+PSAxMzUgJiYgc3dpcGVBbmdsZSA8PSAyMjUpIHtcbiAgICByZXR1cm4gXCJyaWdodFwiO1xuICB9XG5cbiAgaWYgKHZlcnRpY2FsU3dpcGluZyA9PT0gdHJ1ZSkge1xuICAgIGlmIChzd2lwZUFuZ2xlID49IDM1ICYmIHN3aXBlQW5nbGUgPD0gMTM1KSB7XG4gICAgICByZXR1cm4gXCJ1cFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJkb3duXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFwidmVydGljYWxcIjtcbn07IC8vIHdoZXRoZXIgb3Igbm90IHdlIGNhbiBnbyBuZXh0XG5cblxuZXhwb3J0cy5nZXRTd2lwZURpcmVjdGlvbiA9IGdldFN3aXBlRGlyZWN0aW9uO1xuXG52YXIgY2FuR29OZXh0ID0gZnVuY3Rpb24gY2FuR29OZXh0KHNwZWMpIHtcbiAgdmFyIGNhbkdvID0gdHJ1ZTtcblxuICBpZiAoIXNwZWMuaW5maW5pdGUpIHtcbiAgICBpZiAoc3BlYy5jZW50ZXJNb2RlICYmIHNwZWMuY3VycmVudFNsaWRlID49IHNwZWMuc2xpZGVDb3VudCAtIDEpIHtcbiAgICAgIGNhbkdvID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChzcGVjLnNsaWRlQ291bnQgPD0gc3BlYy5zbGlkZXNUb1Nob3cgfHwgc3BlYy5jdXJyZW50U2xpZGUgPj0gc3BlYy5zbGlkZUNvdW50IC0gc3BlYy5zbGlkZXNUb1Nob3cpIHtcbiAgICAgIGNhbkdvID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhbkdvO1xufTsgLy8gZ2l2ZW4gYW4gb2JqZWN0IGFuZCBhIGxpc3Qgb2Yga2V5cywgcmV0dXJuIG5ldyBvYmplY3Qgd2l0aCBnaXZlbiBrZXlzXG5cblxuZXhwb3J0cy5jYW5Hb05leHQgPSBjYW5Hb05leHQ7XG5cbnZhciBleHRyYWN0T2JqZWN0ID0gZnVuY3Rpb24gZXh0cmFjdE9iamVjdChzcGVjLCBrZXlzKSB7XG4gIHZhciBuZXdPYmplY3QgPSB7fTtcbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbmV3T2JqZWN0W2tleV0gPSBzcGVjW2tleV07XG4gIH0pO1xuICByZXR1cm4gbmV3T2JqZWN0O1xufTsgLy8gZ2V0IGluaXRpYWxpemVkIHN0YXRlXG5cblxuZXhwb3J0cy5leHRyYWN0T2JqZWN0ID0gZXh0cmFjdE9iamVjdDtcblxudmFyIGluaXRpYWxpemVkU3RhdGUgPSBmdW5jdGlvbiBpbml0aWFsaXplZFN0YXRlKHNwZWMpIHtcbiAgLy8gc3BlYyBhbHNvIGNvbnRhaW5zIGxpc3RSZWYsIHRyYWNrUmVmXG4gIHZhciBzbGlkZUNvdW50ID0gX3JlYWN0W1wiZGVmYXVsdFwiXS5DaGlsZHJlbi5jb3VudChzcGVjLmNoaWxkcmVuKTtcblxuICB2YXIgbGlzdE5vZGUgPSBzcGVjLmxpc3RSZWY7XG4gIHZhciBsaXN0V2lkdGggPSBNYXRoLmNlaWwoZ2V0V2lkdGgobGlzdE5vZGUpKTtcbiAgdmFyIHRyYWNrTm9kZSA9IHNwZWMudHJhY2tSZWYgJiYgc3BlYy50cmFja1JlZi5ub2RlO1xuICB2YXIgdHJhY2tXaWR0aCA9IE1hdGguY2VpbChnZXRXaWR0aCh0cmFja05vZGUpKTtcbiAgdmFyIHNsaWRlV2lkdGg7XG5cbiAgaWYgKCFzcGVjLnZlcnRpY2FsKSB7XG4gICAgdmFyIGNlbnRlclBhZGRpbmdBZGogPSBzcGVjLmNlbnRlck1vZGUgJiYgcGFyc2VJbnQoc3BlYy5jZW50ZXJQYWRkaW5nKSAqIDI7XG5cbiAgICBpZiAodHlwZW9mIHNwZWMuY2VudGVyUGFkZGluZyA9PT0gXCJzdHJpbmdcIiAmJiBzcGVjLmNlbnRlclBhZGRpbmcuc2xpY2UoLTEpID09PSBcIiVcIikge1xuICAgICAgY2VudGVyUGFkZGluZ0FkaiAqPSBsaXN0V2lkdGggLyAxMDA7XG4gICAgfVxuXG4gICAgc2xpZGVXaWR0aCA9IE1hdGguY2VpbCgobGlzdFdpZHRoIC0gY2VudGVyUGFkZGluZ0FkaikgLyBzcGVjLnNsaWRlc1RvU2hvdyk7XG4gIH0gZWxzZSB7XG4gICAgc2xpZGVXaWR0aCA9IGxpc3RXaWR0aDtcbiAgfVxuXG4gIHZhciBzbGlkZUhlaWdodCA9IGxpc3ROb2RlICYmIGdldEhlaWdodChsaXN0Tm9kZS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1pbmRleD1cIjBcIl0nKSk7XG4gIHZhciBsaXN0SGVpZ2h0ID0gc2xpZGVIZWlnaHQgKiBzcGVjLnNsaWRlc1RvU2hvdztcbiAgdmFyIGN1cnJlbnRTbGlkZSA9IHNwZWMuY3VycmVudFNsaWRlID09PSB1bmRlZmluZWQgPyBzcGVjLmluaXRpYWxTbGlkZSA6IHNwZWMuY3VycmVudFNsaWRlO1xuXG4gIGlmIChzcGVjLnJ0bCAmJiBzcGVjLmN1cnJlbnRTbGlkZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY3VycmVudFNsaWRlID0gc2xpZGVDb3VudCAtIDEgLSBzcGVjLmluaXRpYWxTbGlkZTtcbiAgfVxuXG4gIHZhciBsYXp5TG9hZGVkTGlzdCA9IHNwZWMubGF6eUxvYWRlZExpc3QgfHwgW107XG4gIHZhciBzbGlkZXNUb0xvYWQgPSBnZXRPbkRlbWFuZExhenlTbGlkZXMoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIHNwZWMpLCB7fSwge1xuICAgIGN1cnJlbnRTbGlkZTogY3VycmVudFNsaWRlLFxuICAgIGxhenlMb2FkZWRMaXN0OiBsYXp5TG9hZGVkTGlzdFxuICB9KSk7XG4gIGxhenlMb2FkZWRMaXN0LmNvbmNhdChzbGlkZXNUb0xvYWQpO1xuICB2YXIgc3RhdGUgPSB7XG4gICAgc2xpZGVDb3VudDogc2xpZGVDb3VudCxcbiAgICBzbGlkZVdpZHRoOiBzbGlkZVdpZHRoLFxuICAgIGxpc3RXaWR0aDogbGlzdFdpZHRoLFxuICAgIHRyYWNrV2lkdGg6IHRyYWNrV2lkdGgsXG4gICAgY3VycmVudFNsaWRlOiBjdXJyZW50U2xpZGUsXG4gICAgc2xpZGVIZWlnaHQ6IHNsaWRlSGVpZ2h0LFxuICAgIGxpc3RIZWlnaHQ6IGxpc3RIZWlnaHQsXG4gICAgbGF6eUxvYWRlZExpc3Q6IGxhenlMb2FkZWRMaXN0XG4gIH07XG5cbiAgaWYgKHNwZWMuYXV0b3BsYXlpbmcgPT09IG51bGwgJiYgc3BlYy5hdXRvcGxheSkge1xuICAgIHN0YXRlW1wiYXV0b3BsYXlpbmdcIl0gPSBcInBsYXlpbmdcIjtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydHMuaW5pdGlhbGl6ZWRTdGF0ZSA9IGluaXRpYWxpemVkU3RhdGU7XG5cbnZhciBzbGlkZUhhbmRsZXIgPSBmdW5jdGlvbiBzbGlkZUhhbmRsZXIoc3BlYykge1xuICB2YXIgd2FpdEZvckFuaW1hdGUgPSBzcGVjLndhaXRGb3JBbmltYXRlLFxuICAgICAgYW5pbWF0aW5nID0gc3BlYy5hbmltYXRpbmcsXG4gICAgICBmYWRlID0gc3BlYy5mYWRlLFxuICAgICAgaW5maW5pdGUgPSBzcGVjLmluZmluaXRlLFxuICAgICAgaW5kZXggPSBzcGVjLmluZGV4LFxuICAgICAgc2xpZGVDb3VudCA9IHNwZWMuc2xpZGVDb3VudCxcbiAgICAgIGxhenlMb2FkZWRMaXN0ID0gc3BlYy5sYXp5TG9hZGVkTGlzdCxcbiAgICAgIGxhenlMb2FkID0gc3BlYy5sYXp5TG9hZCxcbiAgICAgIGN1cnJlbnRTbGlkZSA9IHNwZWMuY3VycmVudFNsaWRlLFxuICAgICAgY2VudGVyTW9kZSA9IHNwZWMuY2VudGVyTW9kZSxcbiAgICAgIHNsaWRlc1RvU2Nyb2xsID0gc3BlYy5zbGlkZXNUb1Njcm9sbCxcbiAgICAgIHNsaWRlc1RvU2hvdyA9IHNwZWMuc2xpZGVzVG9TaG93LFxuICAgICAgdXNlQ1NTID0gc3BlYy51c2VDU1M7XG4gIGlmICh3YWl0Rm9yQW5pbWF0ZSAmJiBhbmltYXRpbmcpIHJldHVybiB7fTtcbiAgdmFyIGFuaW1hdGlvblNsaWRlID0gaW5kZXgsXG4gICAgICBmaW5hbFNsaWRlLFxuICAgICAgYW5pbWF0aW9uTGVmdCxcbiAgICAgIGZpbmFsTGVmdDtcbiAgdmFyIHN0YXRlID0ge30sXG4gICAgICBuZXh0U3RhdGUgPSB7fTtcbiAgdmFyIHRhcmdldFNsaWRlID0gaW5maW5pdGUgPyBpbmRleCA6IGNsYW1wKGluZGV4LCAwLCBzbGlkZUNvdW50IC0gMSk7XG5cbiAgaWYgKGZhZGUpIHtcbiAgICBpZiAoIWluZmluaXRlICYmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2xpZGVDb3VudCkpIHJldHVybiB7fTtcblxuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIGFuaW1hdGlvblNsaWRlID0gaW5kZXggKyBzbGlkZUNvdW50O1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPj0gc2xpZGVDb3VudCkge1xuICAgICAgYW5pbWF0aW9uU2xpZGUgPSBpbmRleCAtIHNsaWRlQ291bnQ7XG4gICAgfVxuXG4gICAgaWYgKGxhenlMb2FkICYmIGxhenlMb2FkZWRMaXN0LmluZGV4T2YoYW5pbWF0aW9uU2xpZGUpIDwgMCkge1xuICAgICAgbGF6eUxvYWRlZExpc3QucHVzaChhbmltYXRpb25TbGlkZSk7XG4gICAgfVxuXG4gICAgc3RhdGUgPSB7XG4gICAgICBhbmltYXRpbmc6IHRydWUsXG4gICAgICBjdXJyZW50U2xpZGU6IGFuaW1hdGlvblNsaWRlLFxuICAgICAgbGF6eUxvYWRlZExpc3Q6IGxhenlMb2FkZWRMaXN0XG4gICAgfTtcbiAgICBuZXh0U3RhdGUgPSB7XG4gICAgICBhbmltYXRpbmc6IGZhbHNlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBmaW5hbFNsaWRlID0gYW5pbWF0aW9uU2xpZGU7XG5cbiAgICBpZiAoYW5pbWF0aW9uU2xpZGUgPCAwKSB7XG4gICAgICBmaW5hbFNsaWRlID0gYW5pbWF0aW9uU2xpZGUgKyBzbGlkZUNvdW50O1xuICAgICAgaWYgKCFpbmZpbml0ZSkgZmluYWxTbGlkZSA9IDA7ZWxzZSBpZiAoc2xpZGVDb3VudCAlIHNsaWRlc1RvU2Nyb2xsICE9PSAwKSBmaW5hbFNsaWRlID0gc2xpZGVDb3VudCAtIHNsaWRlQ291bnQgJSBzbGlkZXNUb1Njcm9sbDtcbiAgICB9IGVsc2UgaWYgKCFjYW5Hb05leHQoc3BlYykgJiYgYW5pbWF0aW9uU2xpZGUgPiBjdXJyZW50U2xpZGUpIHtcbiAgICAgIGFuaW1hdGlvblNsaWRlID0gZmluYWxTbGlkZSA9IGN1cnJlbnRTbGlkZTtcbiAgICB9IGVsc2UgaWYgKGNlbnRlck1vZGUgJiYgYW5pbWF0aW9uU2xpZGUgPj0gc2xpZGVDb3VudCkge1xuICAgICAgYW5pbWF0aW9uU2xpZGUgPSBpbmZpbml0ZSA/IHNsaWRlQ291bnQgOiBzbGlkZUNvdW50IC0gMTtcbiAgICAgIGZpbmFsU2xpZGUgPSBpbmZpbml0ZSA/IDAgOiBzbGlkZUNvdW50IC0gMTtcbiAgICB9IGVsc2UgaWYgKGFuaW1hdGlvblNsaWRlID49IHNsaWRlQ291bnQpIHtcbiAgICAgIGZpbmFsU2xpZGUgPSBhbmltYXRpb25TbGlkZSAtIHNsaWRlQ291bnQ7XG4gICAgICBpZiAoIWluZmluaXRlKSBmaW5hbFNsaWRlID0gc2xpZGVDb3VudCAtIHNsaWRlc1RvU2hvdztlbHNlIGlmIChzbGlkZUNvdW50ICUgc2xpZGVzVG9TY3JvbGwgIT09IDApIGZpbmFsU2xpZGUgPSAwO1xuICAgIH1cblxuICAgIGlmICghaW5maW5pdGUgJiYgYW5pbWF0aW9uU2xpZGUgKyBzbGlkZXNUb1Nob3cgPj0gc2xpZGVDb3VudCkge1xuICAgICAgZmluYWxTbGlkZSA9IHNsaWRlQ291bnQgLSBzbGlkZXNUb1Nob3c7XG4gICAgfVxuXG4gICAgYW5pbWF0aW9uTGVmdCA9IGdldFRyYWNrTGVmdCgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgc3BlYyksIHt9LCB7XG4gICAgICBzbGlkZUluZGV4OiBhbmltYXRpb25TbGlkZVxuICAgIH0pKTtcbiAgICBmaW5hbExlZnQgPSBnZXRUcmFja0xlZnQoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIHNwZWMpLCB7fSwge1xuICAgICAgc2xpZGVJbmRleDogZmluYWxTbGlkZVxuICAgIH0pKTtcblxuICAgIGlmICghaW5maW5pdGUpIHtcbiAgICAgIGlmIChhbmltYXRpb25MZWZ0ID09PSBmaW5hbExlZnQpIGFuaW1hdGlvblNsaWRlID0gZmluYWxTbGlkZTtcbiAgICAgIGFuaW1hdGlvbkxlZnQgPSBmaW5hbExlZnQ7XG4gICAgfVxuXG4gICAgbGF6eUxvYWQgJiYgbGF6eUxvYWRlZExpc3QuY29uY2F0KGdldE9uRGVtYW5kTGF6eVNsaWRlcygoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgc3BlYyksIHt9LCB7XG4gICAgICBjdXJyZW50U2xpZGU6IGFuaW1hdGlvblNsaWRlXG4gICAgfSkpKTtcblxuICAgIGlmICghdXNlQ1NTKSB7XG4gICAgICBzdGF0ZSA9IHtcbiAgICAgICAgY3VycmVudFNsaWRlOiBmaW5hbFNsaWRlLFxuICAgICAgICB0cmFja1N0eWxlOiBnZXRUcmFja0NTUygoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgc3BlYyksIHt9LCB7XG4gICAgICAgICAgbGVmdDogZmluYWxMZWZ0XG4gICAgICAgIH0pKSxcbiAgICAgICAgbGF6eUxvYWRlZExpc3Q6IGxhenlMb2FkZWRMaXN0LFxuICAgICAgICB0YXJnZXRTbGlkZTogdGFyZ2V0U2xpZGVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlID0ge1xuICAgICAgICBhbmltYXRpbmc6IHRydWUsXG4gICAgICAgIGN1cnJlbnRTbGlkZTogZmluYWxTbGlkZSxcbiAgICAgICAgdHJhY2tTdHlsZTogZ2V0VHJhY2tBbmltYXRlQ1NTKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBzcGVjKSwge30sIHtcbiAgICAgICAgICBsZWZ0OiBhbmltYXRpb25MZWZ0XG4gICAgICAgIH0pKSxcbiAgICAgICAgbGF6eUxvYWRlZExpc3Q6IGxhenlMb2FkZWRMaXN0LFxuICAgICAgICB0YXJnZXRTbGlkZTogdGFyZ2V0U2xpZGVcbiAgICAgIH07XG4gICAgICBuZXh0U3RhdGUgPSB7XG4gICAgICAgIGFuaW1hdGluZzogZmFsc2UsXG4gICAgICAgIGN1cnJlbnRTbGlkZTogZmluYWxTbGlkZSxcbiAgICAgICAgdHJhY2tTdHlsZTogZ2V0VHJhY2tDU1MoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoKDAsIF9vYmplY3RTcHJlYWQyW1wiZGVmYXVsdFwiXSkoe30sIHNwZWMpLCB7fSwge1xuICAgICAgICAgIGxlZnQ6IGZpbmFsTGVmdFxuICAgICAgICB9KSksXG4gICAgICAgIHN3aXBlTGVmdDogbnVsbCxcbiAgICAgICAgdGFyZ2V0U2xpZGU6IHRhcmdldFNsaWRlXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHN0YXRlLFxuICAgIG5leHRTdGF0ZTogbmV4dFN0YXRlXG4gIH07XG59O1xuXG5leHBvcnRzLnNsaWRlSGFuZGxlciA9IHNsaWRlSGFuZGxlcjtcblxudmFyIGNoYW5nZVNsaWRlID0gZnVuY3Rpb24gY2hhbmdlU2xpZGUoc3BlYywgb3B0aW9ucykge1xuICB2YXIgaW5kZXhPZmZzZXQsIHByZXZpb3VzSW50LCBzbGlkZU9mZnNldCwgdW5ldmVuT2Zmc2V0LCB0YXJnZXRTbGlkZTtcbiAgdmFyIHNsaWRlc1RvU2Nyb2xsID0gc3BlYy5zbGlkZXNUb1Njcm9sbCxcbiAgICAgIHNsaWRlc1RvU2hvdyA9IHNwZWMuc2xpZGVzVG9TaG93LFxuICAgICAgc2xpZGVDb3VudCA9IHNwZWMuc2xpZGVDb3VudCxcbiAgICAgIGN1cnJlbnRTbGlkZSA9IHNwZWMuY3VycmVudFNsaWRlLFxuICAgICAgcHJldmlvdXNUYXJnZXRTbGlkZSA9IHNwZWMudGFyZ2V0U2xpZGUsXG4gICAgICBsYXp5TG9hZCA9IHNwZWMubGF6eUxvYWQsXG4gICAgICBpbmZpbml0ZSA9IHNwZWMuaW5maW5pdGU7XG4gIHVuZXZlbk9mZnNldCA9IHNsaWRlQ291bnQgJSBzbGlkZXNUb1Njcm9sbCAhPT0gMDtcbiAgaW5kZXhPZmZzZXQgPSB1bmV2ZW5PZmZzZXQgPyAwIDogKHNsaWRlQ291bnQgLSBjdXJyZW50U2xpZGUpICUgc2xpZGVzVG9TY3JvbGw7XG5cbiAgaWYgKG9wdGlvbnMubWVzc2FnZSA9PT0gXCJwcmV2aW91c1wiKSB7XG4gICAgc2xpZGVPZmZzZXQgPSBpbmRleE9mZnNldCA9PT0gMCA/IHNsaWRlc1RvU2Nyb2xsIDogc2xpZGVzVG9TaG93IC0gaW5kZXhPZmZzZXQ7XG4gICAgdGFyZ2V0U2xpZGUgPSBjdXJyZW50U2xpZGUgLSBzbGlkZU9mZnNldDtcblxuICAgIGlmIChsYXp5TG9hZCAmJiAhaW5maW5pdGUpIHtcbiAgICAgIHByZXZpb3VzSW50ID0gY3VycmVudFNsaWRlIC0gc2xpZGVPZmZzZXQ7XG4gICAgICB0YXJnZXRTbGlkZSA9IHByZXZpb3VzSW50ID09PSAtMSA/IHNsaWRlQ291bnQgLSAxIDogcHJldmlvdXNJbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFpbmZpbml0ZSkge1xuICAgICAgdGFyZ2V0U2xpZGUgPSBwcmV2aW91c1RhcmdldFNsaWRlIC0gc2xpZGVzVG9TY3JvbGw7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9wdGlvbnMubWVzc2FnZSA9PT0gXCJuZXh0XCIpIHtcbiAgICBzbGlkZU9mZnNldCA9IGluZGV4T2Zmc2V0ID09PSAwID8gc2xpZGVzVG9TY3JvbGwgOiBpbmRleE9mZnNldDtcbiAgICB0YXJnZXRTbGlkZSA9IGN1cnJlbnRTbGlkZSArIHNsaWRlT2Zmc2V0O1xuXG4gICAgaWYgKGxhenlMb2FkICYmICFpbmZpbml0ZSkge1xuICAgICAgdGFyZ2V0U2xpZGUgPSAoY3VycmVudFNsaWRlICsgc2xpZGVzVG9TY3JvbGwpICUgc2xpZGVDb3VudCArIGluZGV4T2Zmc2V0O1xuICAgIH1cblxuICAgIGlmICghaW5maW5pdGUpIHtcbiAgICAgIHRhcmdldFNsaWRlID0gcHJldmlvdXNUYXJnZXRTbGlkZSArIHNsaWRlc1RvU2Nyb2xsO1xuICAgIH1cbiAgfSBlbHNlIGlmIChvcHRpb25zLm1lc3NhZ2UgPT09IFwiZG90c1wiKSB7XG4gICAgLy8gQ2xpY2sgb24gZG90c1xuICAgIHRhcmdldFNsaWRlID0gb3B0aW9ucy5pbmRleCAqIG9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5tZXNzYWdlID09PSBcImNoaWxkcmVuXCIpIHtcbiAgICAvLyBDbGljayBvbiB0aGUgc2xpZGVzXG4gICAgdGFyZ2V0U2xpZGUgPSBvcHRpb25zLmluZGV4O1xuXG4gICAgaWYgKGluZmluaXRlKSB7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gc2libGluZ0RpcmVjdGlvbigoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgc3BlYyksIHt9LCB7XG4gICAgICAgIHRhcmdldFNsaWRlOiB0YXJnZXRTbGlkZVxuICAgICAgfSkpO1xuXG4gICAgICBpZiAodGFyZ2V0U2xpZGUgPiBvcHRpb25zLmN1cnJlbnRTbGlkZSAmJiBkaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgIHRhcmdldFNsaWRlID0gdGFyZ2V0U2xpZGUgLSBzbGlkZUNvdW50O1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXRTbGlkZSA8IG9wdGlvbnMuY3VycmVudFNsaWRlICYmIGRpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgIHRhcmdldFNsaWRlID0gdGFyZ2V0U2xpZGUgKyBzbGlkZUNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChvcHRpb25zLm1lc3NhZ2UgPT09IFwiaW5kZXhcIikge1xuICAgIHRhcmdldFNsaWRlID0gTnVtYmVyKG9wdGlvbnMuaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldFNsaWRlO1xufTtcblxuZXhwb3J0cy5jaGFuZ2VTbGlkZSA9IGNoYW5nZVNsaWRlO1xuXG52YXIga2V5SGFuZGxlciA9IGZ1bmN0aW9uIGtleUhhbmRsZXIoZSwgYWNjZXNzaWJpbGl0eSwgcnRsKSB7XG4gIGlmIChlLnRhcmdldC50YWdOYW1lLm1hdGNoKFwiVEVYVEFSRUF8SU5QVVR8U0VMRUNUXCIpIHx8ICFhY2Nlc3NpYmlsaXR5KSByZXR1cm4gXCJcIjtcbiAgaWYgKGUua2V5Q29kZSA9PT0gMzcpIHJldHVybiBydGwgPyBcIm5leHRcIiA6IFwicHJldmlvdXNcIjtcbiAgaWYgKGUua2V5Q29kZSA9PT0gMzkpIHJldHVybiBydGwgPyBcInByZXZpb3VzXCIgOiBcIm5leHRcIjtcbiAgcmV0dXJuIFwiXCI7XG59O1xuXG5leHBvcnRzLmtleUhhbmRsZXIgPSBrZXlIYW5kbGVyO1xuXG52YXIgc3dpcGVTdGFydCA9IGZ1bmN0aW9uIHN3aXBlU3RhcnQoZSwgc3dpcGUsIGRyYWdnYWJsZSkge1xuICBlLnRhcmdldC50YWdOYW1lID09PSBcIklNR1wiICYmIGUucHJldmVudERlZmF1bHQoKTtcbiAgaWYgKCFzd2lwZSB8fCAhZHJhZ2dhYmxlICYmIGUudHlwZS5pbmRleE9mKFwibW91c2VcIikgIT09IC0xKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIHtcbiAgICBkcmFnZ2luZzogdHJ1ZSxcbiAgICB0b3VjaE9iamVjdDoge1xuICAgICAgc3RhcnRYOiBlLnRvdWNoZXMgPyBlLnRvdWNoZXNbMF0ucGFnZVggOiBlLmNsaWVudFgsXG4gICAgICBzdGFydFk6IGUudG91Y2hlcyA/IGUudG91Y2hlc1swXS5wYWdlWSA6IGUuY2xpZW50WSxcbiAgICAgIGN1clg6IGUudG91Y2hlcyA/IGUudG91Y2hlc1swXS5wYWdlWCA6IGUuY2xpZW50WCxcbiAgICAgIGN1clk6IGUudG91Y2hlcyA/IGUudG91Y2hlc1swXS5wYWdlWSA6IGUuY2xpZW50WVxuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydHMuc3dpcGVTdGFydCA9IHN3aXBlU3RhcnQ7XG5cbnZhciBzd2lwZU1vdmUgPSBmdW5jdGlvbiBzd2lwZU1vdmUoZSwgc3BlYykge1xuICAvLyBzcGVjIGFsc28gY29udGFpbnMsIHRyYWNrUmVmIGFuZCBzbGlkZUluZGV4XG4gIHZhciBzY3JvbGxpbmcgPSBzcGVjLnNjcm9sbGluZyxcbiAgICAgIGFuaW1hdGluZyA9IHNwZWMuYW5pbWF0aW5nLFxuICAgICAgdmVydGljYWwgPSBzcGVjLnZlcnRpY2FsLFxuICAgICAgc3dpcGVUb1NsaWRlID0gc3BlYy5zd2lwZVRvU2xpZGUsXG4gICAgICB2ZXJ0aWNhbFN3aXBpbmcgPSBzcGVjLnZlcnRpY2FsU3dpcGluZyxcbiAgICAgIHJ0bCA9IHNwZWMucnRsLFxuICAgICAgY3VycmVudFNsaWRlID0gc3BlYy5jdXJyZW50U2xpZGUsXG4gICAgICBlZGdlRnJpY3Rpb24gPSBzcGVjLmVkZ2VGcmljdGlvbixcbiAgICAgIGVkZ2VEcmFnZ2VkID0gc3BlYy5lZGdlRHJhZ2dlZCxcbiAgICAgIG9uRWRnZSA9IHNwZWMub25FZGdlLFxuICAgICAgc3dpcGVkID0gc3BlYy5zd2lwZWQsXG4gICAgICBzd2lwaW5nID0gc3BlYy5zd2lwaW5nLFxuICAgICAgc2xpZGVDb3VudCA9IHNwZWMuc2xpZGVDb3VudCxcbiAgICAgIHNsaWRlc1RvU2Nyb2xsID0gc3BlYy5zbGlkZXNUb1Njcm9sbCxcbiAgICAgIGluZmluaXRlID0gc3BlYy5pbmZpbml0ZSxcbiAgICAgIHRvdWNoT2JqZWN0ID0gc3BlYy50b3VjaE9iamVjdCxcbiAgICAgIHN3aXBlRXZlbnQgPSBzcGVjLnN3aXBlRXZlbnQsXG4gICAgICBsaXN0SGVpZ2h0ID0gc3BlYy5saXN0SGVpZ2h0LFxuICAgICAgbGlzdFdpZHRoID0gc3BlYy5saXN0V2lkdGg7XG4gIGlmIChzY3JvbGxpbmcpIHJldHVybjtcbiAgaWYgKGFuaW1hdGluZykgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcbiAgaWYgKHZlcnRpY2FsICYmIHN3aXBlVG9TbGlkZSAmJiB2ZXJ0aWNhbFN3aXBpbmcpIGUucHJldmVudERlZmF1bHQoKTtcbiAgdmFyIHN3aXBlTGVmdCxcbiAgICAgIHN0YXRlID0ge307XG4gIHZhciBjdXJMZWZ0ID0gZ2V0VHJhY2tMZWZ0KHNwZWMpO1xuICB0b3VjaE9iamVjdC5jdXJYID0gZS50b3VjaGVzID8gZS50b3VjaGVzWzBdLnBhZ2VYIDogZS5jbGllbnRYO1xuICB0b3VjaE9iamVjdC5jdXJZID0gZS50b3VjaGVzID8gZS50b3VjaGVzWzBdLnBhZ2VZIDogZS5jbGllbnRZO1xuICB0b3VjaE9iamVjdC5zd2lwZUxlbmd0aCA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KHRvdWNoT2JqZWN0LmN1clggLSB0b3VjaE9iamVjdC5zdGFydFgsIDIpKSk7XG4gIHZhciB2ZXJ0aWNhbFN3aXBlTGVuZ3RoID0gTWF0aC5yb3VuZChNYXRoLnNxcnQoTWF0aC5wb3codG91Y2hPYmplY3QuY3VyWSAtIHRvdWNoT2JqZWN0LnN0YXJ0WSwgMikpKTtcblxuICBpZiAoIXZlcnRpY2FsU3dpcGluZyAmJiAhc3dpcGluZyAmJiB2ZXJ0aWNhbFN3aXBlTGVuZ3RoID4gMTApIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Nyb2xsaW5nOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIGlmICh2ZXJ0aWNhbFN3aXBpbmcpIHRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoID0gdmVydGljYWxTd2lwZUxlbmd0aDtcbiAgdmFyIHBvc2l0aW9uT2Zmc2V0ID0gKCFydGwgPyAxIDogLTEpICogKHRvdWNoT2JqZWN0LmN1clggPiB0b3VjaE9iamVjdC5zdGFydFggPyAxIDogLTEpO1xuICBpZiAodmVydGljYWxTd2lwaW5nKSBwb3NpdGlvbk9mZnNldCA9IHRvdWNoT2JqZWN0LmN1clkgPiB0b3VjaE9iamVjdC5zdGFydFkgPyAxIDogLTE7XG4gIHZhciBkb3RDb3VudCA9IE1hdGguY2VpbChzbGlkZUNvdW50IC8gc2xpZGVzVG9TY3JvbGwpO1xuICB2YXIgc3dpcGVEaXJlY3Rpb24gPSBnZXRTd2lwZURpcmVjdGlvbihzcGVjLnRvdWNoT2JqZWN0LCB2ZXJ0aWNhbFN3aXBpbmcpO1xuICB2YXIgdG91Y2hTd2lwZUxlbmd0aCA9IHRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoO1xuXG4gIGlmICghaW5maW5pdGUpIHtcbiAgICBpZiAoY3VycmVudFNsaWRlID09PSAwICYmIHN3aXBlRGlyZWN0aW9uID09PSBcInJpZ2h0XCIgfHwgY3VycmVudFNsaWRlICsgMSA+PSBkb3RDb3VudCAmJiBzd2lwZURpcmVjdGlvbiA9PT0gXCJsZWZ0XCIgfHwgIWNhbkdvTmV4dChzcGVjKSAmJiBzd2lwZURpcmVjdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgIHRvdWNoU3dpcGVMZW5ndGggPSB0b3VjaE9iamVjdC5zd2lwZUxlbmd0aCAqIGVkZ2VGcmljdGlvbjtcblxuICAgICAgaWYgKGVkZ2VEcmFnZ2VkID09PSBmYWxzZSAmJiBvbkVkZ2UpIHtcbiAgICAgICAgb25FZGdlKHN3aXBlRGlyZWN0aW9uKTtcbiAgICAgICAgc3RhdGVbXCJlZGdlRHJhZ2dlZFwiXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFzd2lwZWQgJiYgc3dpcGVFdmVudCkge1xuICAgIHN3aXBlRXZlbnQoc3dpcGVEaXJlY3Rpb24pO1xuICAgIHN0YXRlW1wic3dpcGVkXCJdID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghdmVydGljYWwpIHtcbiAgICBpZiAoIXJ0bCkge1xuICAgICAgc3dpcGVMZWZ0ID0gY3VyTGVmdCArIHRvdWNoU3dpcGVMZW5ndGggKiBwb3NpdGlvbk9mZnNldDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpcGVMZWZ0ID0gY3VyTGVmdCAtIHRvdWNoU3dpcGVMZW5ndGggKiBwb3NpdGlvbk9mZnNldDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3dpcGVMZWZ0ID0gY3VyTGVmdCArIHRvdWNoU3dpcGVMZW5ndGggKiAobGlzdEhlaWdodCAvIGxpc3RXaWR0aCkgKiBwb3NpdGlvbk9mZnNldDtcbiAgfVxuXG4gIGlmICh2ZXJ0aWNhbFN3aXBpbmcpIHtcbiAgICBzd2lwZUxlZnQgPSBjdXJMZWZ0ICsgdG91Y2hTd2lwZUxlbmd0aCAqIHBvc2l0aW9uT2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUgPSAoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgc3RhdGUpLCB7fSwge1xuICAgIHRvdWNoT2JqZWN0OiB0b3VjaE9iamVjdCxcbiAgICBzd2lwZUxlZnQ6IHN3aXBlTGVmdCxcbiAgICB0cmFja1N0eWxlOiBnZXRUcmFja0NTUygoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgc3BlYyksIHt9LCB7XG4gICAgICBsZWZ0OiBzd2lwZUxlZnRcbiAgICB9KSlcbiAgfSk7XG5cbiAgaWYgKE1hdGguYWJzKHRvdWNoT2JqZWN0LmN1clggLSB0b3VjaE9iamVjdC5zdGFydFgpIDwgTWF0aC5hYnModG91Y2hPYmplY3QuY3VyWSAtIHRvdWNoT2JqZWN0LnN0YXJ0WSkgKiAwLjgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBpZiAodG91Y2hPYmplY3Quc3dpcGVMZW5ndGggPiAxMCkge1xuICAgIHN0YXRlW1wic3dpcGluZ1wiXSA9IHRydWU7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0cy5zd2lwZU1vdmUgPSBzd2lwZU1vdmU7XG5cbnZhciBzd2lwZUVuZCA9IGZ1bmN0aW9uIHN3aXBlRW5kKGUsIHNwZWMpIHtcbiAgdmFyIGRyYWdnaW5nID0gc3BlYy5kcmFnZ2luZyxcbiAgICAgIHN3aXBlID0gc3BlYy5zd2lwZSxcbiAgICAgIHRvdWNoT2JqZWN0ID0gc3BlYy50b3VjaE9iamVjdCxcbiAgICAgIGxpc3RXaWR0aCA9IHNwZWMubGlzdFdpZHRoLFxuICAgICAgdG91Y2hUaHJlc2hvbGQgPSBzcGVjLnRvdWNoVGhyZXNob2xkLFxuICAgICAgdmVydGljYWxTd2lwaW5nID0gc3BlYy52ZXJ0aWNhbFN3aXBpbmcsXG4gICAgICBsaXN0SGVpZ2h0ID0gc3BlYy5saXN0SGVpZ2h0LFxuICAgICAgc3dpcGVUb1NsaWRlID0gc3BlYy5zd2lwZVRvU2xpZGUsXG4gICAgICBzY3JvbGxpbmcgPSBzcGVjLnNjcm9sbGluZyxcbiAgICAgIG9uU3dpcGUgPSBzcGVjLm9uU3dpcGUsXG4gICAgICB0YXJnZXRTbGlkZSA9IHNwZWMudGFyZ2V0U2xpZGUsXG4gICAgICBjdXJyZW50U2xpZGUgPSBzcGVjLmN1cnJlbnRTbGlkZSxcbiAgICAgIGluZmluaXRlID0gc3BlYy5pbmZpbml0ZTtcblxuICBpZiAoIWRyYWdnaW5nKSB7XG4gICAgaWYgKHN3aXBlKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgdmFyIG1pblN3aXBlID0gdmVydGljYWxTd2lwaW5nID8gbGlzdEhlaWdodCAvIHRvdWNoVGhyZXNob2xkIDogbGlzdFdpZHRoIC8gdG91Y2hUaHJlc2hvbGQ7XG4gIHZhciBzd2lwZURpcmVjdGlvbiA9IGdldFN3aXBlRGlyZWN0aW9uKHRvdWNoT2JqZWN0LCB2ZXJ0aWNhbFN3aXBpbmcpOyAvLyByZXNldCB0aGUgc3RhdGUgb2YgdG91Y2ggcmVsYXRlZCBzdGF0ZSB2YXJpYWJsZXMuXG5cbiAgdmFyIHN0YXRlID0ge1xuICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICBlZGdlRHJhZ2dlZDogZmFsc2UsXG4gICAgc2Nyb2xsaW5nOiBmYWxzZSxcbiAgICBzd2lwaW5nOiBmYWxzZSxcbiAgICBzd2lwZWQ6IGZhbHNlLFxuICAgIHN3aXBlTGVmdDogbnVsbCxcbiAgICB0b3VjaE9iamVjdDoge31cbiAgfTtcblxuICBpZiAoc2Nyb2xsaW5nKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgaWYgKCF0b3VjaE9iamVjdC5zd2lwZUxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGlmICh0b3VjaE9iamVjdC5zd2lwZUxlbmd0aCA+IG1pblN3aXBlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKG9uU3dpcGUpIHtcbiAgICAgIG9uU3dpcGUoc3dpcGVEaXJlY3Rpb24pO1xuICAgIH1cblxuICAgIHZhciBzbGlkZUNvdW50LCBuZXdTbGlkZTtcbiAgICB2YXIgYWN0aXZlU2xpZGUgPSBpbmZpbml0ZSA/IGN1cnJlbnRTbGlkZSA6IHRhcmdldFNsaWRlO1xuXG4gICAgc3dpdGNoIChzd2lwZURpcmVjdGlvbikge1xuICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgIGNhc2UgXCJ1cFwiOlxuICAgICAgICBuZXdTbGlkZSA9IGFjdGl2ZVNsaWRlICsgZ2V0U2xpZGVDb3VudChzcGVjKTtcbiAgICAgICAgc2xpZGVDb3VudCA9IHN3aXBlVG9TbGlkZSA/IGNoZWNrTmF2aWdhYmxlKHNwZWMsIG5ld1NsaWRlKSA6IG5ld1NsaWRlO1xuICAgICAgICBzdGF0ZVtcImN1cnJlbnREaXJlY3Rpb25cIl0gPSAwO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICBjYXNlIFwiZG93blwiOlxuICAgICAgICBuZXdTbGlkZSA9IGFjdGl2ZVNsaWRlIC0gZ2V0U2xpZGVDb3VudChzcGVjKTtcbiAgICAgICAgc2xpZGVDb3VudCA9IHN3aXBlVG9TbGlkZSA/IGNoZWNrTmF2aWdhYmxlKHNwZWMsIG5ld1NsaWRlKSA6IG5ld1NsaWRlO1xuICAgICAgICBzdGF0ZVtcImN1cnJlbnREaXJlY3Rpb25cIl0gPSAxO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2xpZGVDb3VudCA9IGFjdGl2ZVNsaWRlO1xuICAgIH1cblxuICAgIHN0YXRlW1widHJpZ2dlclNsaWRlSGFuZGxlclwiXSA9IHNsaWRlQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gQWRqdXN0IHRoZSB0cmFjayBiYWNrIHRvIGl0J3Mgb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIGN1cnJlbnRMZWZ0ID0gZ2V0VHJhY2tMZWZ0KHNwZWMpO1xuICAgIHN0YXRlW1widHJhY2tTdHlsZVwiXSA9IGdldFRyYWNrQW5pbWF0ZUNTUygoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSgoMCwgX29iamVjdFNwcmVhZDJbXCJkZWZhdWx0XCJdKSh7fSwgc3BlYyksIHt9LCB7XG4gICAgICBsZWZ0OiBjdXJyZW50TGVmdFxuICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydHMuc3dpcGVFbmQgPSBzd2lwZUVuZDtcblxudmFyIGdldE5hdmlnYWJsZUluZGV4ZXMgPSBmdW5jdGlvbiBnZXROYXZpZ2FibGVJbmRleGVzKHNwZWMpIHtcbiAgdmFyIG1heCA9IHNwZWMuaW5maW5pdGUgPyBzcGVjLnNsaWRlQ291bnQgKiAyIDogc3BlYy5zbGlkZUNvdW50O1xuICB2YXIgYnJlYWtwb2ludCA9IHNwZWMuaW5maW5pdGUgPyBzcGVjLnNsaWRlc1RvU2hvdyAqIC0xIDogMDtcbiAgdmFyIGNvdW50ZXIgPSBzcGVjLmluZmluaXRlID8gc3BlYy5zbGlkZXNUb1Nob3cgKiAtMSA6IDA7XG4gIHZhciBpbmRleGVzID0gW107XG5cbiAgd2hpbGUgKGJyZWFrcG9pbnQgPCBtYXgpIHtcbiAgICBpbmRleGVzLnB1c2goYnJlYWtwb2ludCk7XG4gICAgYnJlYWtwb2ludCA9IGNvdW50ZXIgKyBzcGVjLnNsaWRlc1RvU2Nyb2xsO1xuICAgIGNvdW50ZXIgKz0gTWF0aC5taW4oc3BlYy5zbGlkZXNUb1Njcm9sbCwgc3BlYy5zbGlkZXNUb1Nob3cpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXM7XG59O1xuXG5leHBvcnRzLmdldE5hdmlnYWJsZUluZGV4ZXMgPSBnZXROYXZpZ2FibGVJbmRleGVzO1xuXG52YXIgY2hlY2tOYXZpZ2FibGUgPSBmdW5jdGlvbiBjaGVja05hdmlnYWJsZShzcGVjLCBpbmRleCkge1xuICB2YXIgbmF2aWdhYmxlcyA9IGdldE5hdmlnYWJsZUluZGV4ZXMoc3BlYyk7XG4gIHZhciBwcmV2TmF2aWdhYmxlID0gMDtcblxuICBpZiAoaW5kZXggPiBuYXZpZ2FibGVzW25hdmlnYWJsZXMubGVuZ3RoIC0gMV0pIHtcbiAgICBpbmRleCA9IG5hdmlnYWJsZXNbbmF2aWdhYmxlcy5sZW5ndGggLSAxXTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBuIGluIG5hdmlnYWJsZXMpIHtcbiAgICAgIGlmIChpbmRleCA8IG5hdmlnYWJsZXNbbl0pIHtcbiAgICAgICAgaW5kZXggPSBwcmV2TmF2aWdhYmxlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcHJldk5hdmlnYWJsZSA9IG5hdmlnYWJsZXNbbl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufTtcblxuZXhwb3J0cy5jaGVja05hdmlnYWJsZSA9IGNoZWNrTmF2aWdhYmxlO1xuXG52YXIgZ2V0U2xpZGVDb3VudCA9IGZ1bmN0aW9uIGdldFNsaWRlQ291bnQoc3BlYykge1xuICB2YXIgY2VudGVyT2Zmc2V0ID0gc3BlYy5jZW50ZXJNb2RlID8gc3BlYy5zbGlkZVdpZHRoICogTWF0aC5mbG9vcihzcGVjLnNsaWRlc1RvU2hvdyAvIDIpIDogMDtcblxuICBpZiAoc3BlYy5zd2lwZVRvU2xpZGUpIHtcbiAgICB2YXIgc3dpcGVkU2xpZGU7XG4gICAgdmFyIHNsaWNrTGlzdCA9IHNwZWMubGlzdFJlZjtcbiAgICB2YXIgc2xpZGVzID0gc2xpY2tMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuc2xpY2stc2xpZGVcIik7XG4gICAgQXJyYXkuZnJvbShzbGlkZXMpLmV2ZXJ5KGZ1bmN0aW9uIChzbGlkZSkge1xuICAgICAgaWYgKCFzcGVjLnZlcnRpY2FsKSB7XG4gICAgICAgIGlmIChzbGlkZS5vZmZzZXRMZWZ0IC0gY2VudGVyT2Zmc2V0ICsgZ2V0V2lkdGgoc2xpZGUpIC8gMiA+IHNwZWMuc3dpcGVMZWZ0ICogLTEpIHtcbiAgICAgICAgICBzd2lwZWRTbGlkZSA9IHNsaWRlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNsaWRlLm9mZnNldFRvcCArIGdldEhlaWdodChzbGlkZSkgLyAyID4gc3BlYy5zd2lwZUxlZnQgKiAtMSkge1xuICAgICAgICAgIHN3aXBlZFNsaWRlID0gc2xpZGU7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgaWYgKCFzd2lwZWRTbGlkZSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IHNwZWMucnRsID09PSB0cnVlID8gc3BlYy5zbGlkZUNvdW50IC0gc3BlYy5jdXJyZW50U2xpZGUgOiBzcGVjLmN1cnJlbnRTbGlkZTtcbiAgICB2YXIgc2xpZGVzVHJhdmVyc2VkID0gTWF0aC5hYnMoc3dpcGVkU2xpZGUuZGF0YXNldC5pbmRleCAtIGN1cnJlbnRJbmRleCkgfHwgMTtcbiAgICByZXR1cm4gc2xpZGVzVHJhdmVyc2VkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzcGVjLnNsaWRlc1RvU2Nyb2xsO1xuICB9XG59O1xuXG5leHBvcnRzLmdldFNsaWRlQ291bnQgPSBnZXRTbGlkZUNvdW50O1xuXG52YXIgY2hlY2tTcGVjS2V5cyA9IGZ1bmN0aW9uIGNoZWNrU3BlY0tleXMoc3BlYywga2V5c0FycmF5KSB7XG4gIHJldHVybiAoLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIGtleXNBcnJheS5yZWR1Y2UoZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAmJiBzcGVjLmhhc093blByb3BlcnR5KGtleSk7XG4gICAgfSwgdHJ1ZSkgPyBudWxsIDogY29uc29sZS5lcnJvcihcIktleXMgTWlzc2luZzpcIiwgc3BlYylcbiAgKTtcbn07XG5cbmV4cG9ydHMuY2hlY2tTcGVjS2V5cyA9IGNoZWNrU3BlY0tleXM7XG5cbnZhciBnZXRUcmFja0NTUyA9IGZ1bmN0aW9uIGdldFRyYWNrQ1NTKHNwZWMpIHtcbiAgY2hlY2tTcGVjS2V5cyhzcGVjLCBbXCJsZWZ0XCIsIFwidmFyaWFibGVXaWR0aFwiLCBcInNsaWRlQ291bnRcIiwgXCJzbGlkZXNUb1Nob3dcIiwgXCJzbGlkZVdpZHRoXCJdKTtcbiAgdmFyIHRyYWNrV2lkdGgsIHRyYWNrSGVpZ2h0O1xuICB2YXIgdHJhY2tDaGlsZHJlbiA9IHNwZWMuc2xpZGVDb3VudCArIDIgKiBzcGVjLnNsaWRlc1RvU2hvdztcblxuICBpZiAoIXNwZWMudmVydGljYWwpIHtcbiAgICB0cmFja1dpZHRoID0gZ2V0VG90YWxTbGlkZXMoc3BlYykgKiBzcGVjLnNsaWRlV2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgdHJhY2tIZWlnaHQgPSB0cmFja0NoaWxkcmVuICogc3BlYy5zbGlkZUhlaWdodDtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IHtcbiAgICBvcGFjaXR5OiAxLFxuICAgIHRyYW5zaXRpb246IFwiXCIsXG4gICAgV2Via2l0VHJhbnNpdGlvbjogXCJcIlxuICB9O1xuXG4gIGlmIChzcGVjLnVzZVRyYW5zZm9ybSkge1xuICAgIHZhciBXZWJraXRUcmFuc2Zvcm0gPSAhc3BlYy52ZXJ0aWNhbCA/IFwidHJhbnNsYXRlM2QoXCIgKyBzcGVjLmxlZnQgKyBcInB4LCAwcHgsIDBweClcIiA6IFwidHJhbnNsYXRlM2QoMHB4LCBcIiArIHNwZWMubGVmdCArIFwicHgsIDBweClcIjtcbiAgICB2YXIgdHJhbnNmb3JtID0gIXNwZWMudmVydGljYWwgPyBcInRyYW5zbGF0ZTNkKFwiICsgc3BlYy5sZWZ0ICsgXCJweCwgMHB4LCAwcHgpXCIgOiBcInRyYW5zbGF0ZTNkKDBweCwgXCIgKyBzcGVjLmxlZnQgKyBcInB4LCAwcHgpXCI7XG4gICAgdmFyIG1zVHJhbnNmb3JtID0gIXNwZWMudmVydGljYWwgPyBcInRyYW5zbGF0ZVgoXCIgKyBzcGVjLmxlZnQgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGVZKFwiICsgc3BlYy5sZWZ0ICsgXCJweClcIjtcbiAgICBzdHlsZSA9ICgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKCgwLCBfb2JqZWN0U3ByZWFkMltcImRlZmF1bHRcIl0pKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICBXZWJraXRUcmFuc2Zvcm06IFdlYmtpdFRyYW5zZm9ybSxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgICAgbXNUcmFuc2Zvcm06IG1zVHJhbnNmb3JtXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHNwZWMudmVydGljYWwpIHtcbiAgICAgIHN0eWxlW1widG9wXCJdID0gc3BlYy5sZWZ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZVtcImxlZnRcIl0gPSBzcGVjLmxlZnQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNwZWMuZmFkZSkgc3R5bGUgPSB7XG4gICAgb3BhY2l0eTogMVxuICB9O1xuICBpZiAodHJhY2tXaWR0aCkgc3R5bGUud2lkdGggPSB0cmFja1dpZHRoO1xuICBpZiAodHJhY2tIZWlnaHQpIHN0eWxlLmhlaWdodCA9IHRyYWNrSGVpZ2h0OyAvLyBGYWxsYmFjayBmb3IgSUU4XG5cbiAgaWYgKHdpbmRvdyAmJiAhd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgJiYgd2luZG93LmF0dGFjaEV2ZW50KSB7XG4gICAgaWYgKCFzcGVjLnZlcnRpY2FsKSB7XG4gICAgICBzdHlsZS5tYXJnaW5MZWZ0ID0gc3BlYy5sZWZ0ICsgXCJweFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS5tYXJnaW5Ub3AgPSBzcGVjLmxlZnQgKyBcInB4XCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuZXhwb3J0cy5nZXRUcmFja0NTUyA9IGdldFRyYWNrQ1NTO1xuXG52YXIgZ2V0VHJhY2tBbmltYXRlQ1NTID0gZnVuY3Rpb24gZ2V0VHJhY2tBbmltYXRlQ1NTKHNwZWMpIHtcbiAgY2hlY2tTcGVjS2V5cyhzcGVjLCBbXCJsZWZ0XCIsIFwidmFyaWFibGVXaWR0aFwiLCBcInNsaWRlQ291bnRcIiwgXCJzbGlkZXNUb1Nob3dcIiwgXCJzbGlkZVdpZHRoXCIsIFwic3BlZWRcIiwgXCJjc3NFYXNlXCJdKTtcbiAgdmFyIHN0eWxlID0gZ2V0VHJhY2tDU1Moc3BlYyk7IC8vIHVzZUNTUyBpcyB0cnVlIGJ5IGRlZmF1bHQgc28gaXQgY2FuIGJlIHVuZGVmaW5lZFxuXG4gIGlmIChzcGVjLnVzZVRyYW5zZm9ybSkge1xuICAgIHN0eWxlLldlYmtpdFRyYW5zaXRpb24gPSBcIi13ZWJraXQtdHJhbnNmb3JtIFwiICsgc3BlYy5zcGVlZCArIFwibXMgXCIgKyBzcGVjLmNzc0Vhc2U7XG4gICAgc3R5bGUudHJhbnNpdGlvbiA9IFwidHJhbnNmb3JtIFwiICsgc3BlYy5zcGVlZCArIFwibXMgXCIgKyBzcGVjLmNzc0Vhc2U7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHNwZWMudmVydGljYWwpIHtcbiAgICAgIHN0eWxlLnRyYW5zaXRpb24gPSBcInRvcCBcIiArIHNwZWMuc3BlZWQgKyBcIm1zIFwiICsgc3BlYy5jc3NFYXNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS50cmFuc2l0aW9uID0gXCJsZWZ0IFwiICsgc3BlYy5zcGVlZCArIFwibXMgXCIgKyBzcGVjLmNzc0Vhc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuZXhwb3J0cy5nZXRUcmFja0FuaW1hdGVDU1MgPSBnZXRUcmFja0FuaW1hdGVDU1M7XG5cbnZhciBnZXRUcmFja0xlZnQgPSBmdW5jdGlvbiBnZXRUcmFja0xlZnQoc3BlYykge1xuICBpZiAoc3BlYy51bnNsaWNrKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjaGVja1NwZWNLZXlzKHNwZWMsIFtcInNsaWRlSW5kZXhcIiwgXCJ0cmFja1JlZlwiLCBcImluZmluaXRlXCIsIFwiY2VudGVyTW9kZVwiLCBcInNsaWRlQ291bnRcIiwgXCJzbGlkZXNUb1Nob3dcIiwgXCJzbGlkZXNUb1Njcm9sbFwiLCBcInNsaWRlV2lkdGhcIiwgXCJsaXN0V2lkdGhcIiwgXCJ2YXJpYWJsZVdpZHRoXCIsIFwic2xpZGVIZWlnaHRcIl0pO1xuICB2YXIgc2xpZGVJbmRleCA9IHNwZWMuc2xpZGVJbmRleCxcbiAgICAgIHRyYWNrUmVmID0gc3BlYy50cmFja1JlZixcbiAgICAgIGluZmluaXRlID0gc3BlYy5pbmZpbml0ZSxcbiAgICAgIGNlbnRlck1vZGUgPSBzcGVjLmNlbnRlck1vZGUsXG4gICAgICBzbGlkZUNvdW50ID0gc3BlYy5zbGlkZUNvdW50LFxuICAgICAgc2xpZGVzVG9TaG93ID0gc3BlYy5zbGlkZXNUb1Nob3csXG4gICAgICBzbGlkZXNUb1Njcm9sbCA9IHNwZWMuc2xpZGVzVG9TY3JvbGwsXG4gICAgICBzbGlkZVdpZHRoID0gc3BlYy5zbGlkZVdpZHRoLFxuICAgICAgbGlzdFdpZHRoID0gc3BlYy5saXN0V2lkdGgsXG4gICAgICB2YXJpYWJsZVdpZHRoID0gc3BlYy52YXJpYWJsZVdpZHRoLFxuICAgICAgc2xpZGVIZWlnaHQgPSBzcGVjLnNsaWRlSGVpZ2h0LFxuICAgICAgZmFkZSA9IHNwZWMuZmFkZSxcbiAgICAgIHZlcnRpY2FsID0gc3BlYy52ZXJ0aWNhbDtcbiAgdmFyIHNsaWRlT2Zmc2V0ID0gMDtcbiAgdmFyIHRhcmdldExlZnQ7XG4gIHZhciB0YXJnZXRTbGlkZTtcbiAgdmFyIHZlcnRpY2FsT2Zmc2V0ID0gMDtcblxuICBpZiAoZmFkZSB8fCBzcGVjLnNsaWRlQ291bnQgPT09IDEpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBzbGlkZXNUb09mZnNldCA9IDA7XG5cbiAgaWYgKGluZmluaXRlKSB7XG4gICAgc2xpZGVzVG9PZmZzZXQgPSAtZ2V0UHJlQ2xvbmVzKHNwZWMpOyAvLyBicmluZyBhY3RpdmUgc2xpZGUgdG8gdGhlIGJlZ2lubmluZyBvZiB2aXN1YWwgYXJlYVxuICAgIC8vIGlmIG5leHQgc2Nyb2xsIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggY2hpbGRyZW4sIGp1c3QgcmVhY2ggdGlsbCB0aGUgZW5kIG9mIG9yaWdpbmFsIHNsaWRlcyBpbnN0ZWFkIG9mIHNoaWZ0aW5nIHNsaWRlc1RvU2Nyb2xsIGNoaWxkcmVuXG5cbiAgICBpZiAoc2xpZGVDb3VudCAlIHNsaWRlc1RvU2Nyb2xsICE9PSAwICYmIHNsaWRlSW5kZXggKyBzbGlkZXNUb1Njcm9sbCA+IHNsaWRlQ291bnQpIHtcbiAgICAgIHNsaWRlc1RvT2Zmc2V0ID0gLShzbGlkZUluZGV4ID4gc2xpZGVDb3VudCA/IHNsaWRlc1RvU2hvdyAtIChzbGlkZUluZGV4IC0gc2xpZGVDb3VudCkgOiBzbGlkZUNvdW50ICUgc2xpZGVzVG9TY3JvbGwpO1xuICAgIH0gLy8gc2hpZnQgY3VycmVudCBzbGlkZSB0byBjZW50ZXIgb2YgdGhlIGZyYW1lXG5cblxuICAgIGlmIChjZW50ZXJNb2RlKSB7XG4gICAgICBzbGlkZXNUb09mZnNldCArPSBwYXJzZUludChzbGlkZXNUb1Nob3cgLyAyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHNsaWRlQ291bnQgJSBzbGlkZXNUb1Njcm9sbCAhPT0gMCAmJiBzbGlkZUluZGV4ICsgc2xpZGVzVG9TY3JvbGwgPiBzbGlkZUNvdW50KSB7XG4gICAgICBzbGlkZXNUb09mZnNldCA9IHNsaWRlc1RvU2hvdyAtIHNsaWRlQ291bnQgJSBzbGlkZXNUb1Njcm9sbDtcbiAgICB9XG5cbiAgICBpZiAoY2VudGVyTW9kZSkge1xuICAgICAgc2xpZGVzVG9PZmZzZXQgPSBwYXJzZUludChzbGlkZXNUb1Nob3cgLyAyKTtcbiAgICB9XG4gIH1cblxuICBzbGlkZU9mZnNldCA9IHNsaWRlc1RvT2Zmc2V0ICogc2xpZGVXaWR0aDtcbiAgdmVydGljYWxPZmZzZXQgPSBzbGlkZXNUb09mZnNldCAqIHNsaWRlSGVpZ2h0O1xuXG4gIGlmICghdmVydGljYWwpIHtcbiAgICB0YXJnZXRMZWZ0ID0gc2xpZGVJbmRleCAqIHNsaWRlV2lkdGggKiAtMSArIHNsaWRlT2Zmc2V0O1xuICB9IGVsc2Uge1xuICAgIHRhcmdldExlZnQgPSBzbGlkZUluZGV4ICogc2xpZGVIZWlnaHQgKiAtMSArIHZlcnRpY2FsT2Zmc2V0O1xuICB9XG5cbiAgaWYgKHZhcmlhYmxlV2lkdGggPT09IHRydWUpIHtcbiAgICB2YXIgdGFyZ2V0U2xpZGVJbmRleDtcbiAgICB2YXIgdHJhY2tFbGVtID0gdHJhY2tSZWYgJiYgdHJhY2tSZWYubm9kZTtcbiAgICB0YXJnZXRTbGlkZUluZGV4ID0gc2xpZGVJbmRleCArIGdldFByZUNsb25lcyhzcGVjKTtcbiAgICB0YXJnZXRTbGlkZSA9IHRyYWNrRWxlbSAmJiB0cmFja0VsZW0uY2hpbGROb2Rlc1t0YXJnZXRTbGlkZUluZGV4XTtcbiAgICB0YXJnZXRMZWZ0ID0gdGFyZ2V0U2xpZGUgPyB0YXJnZXRTbGlkZS5vZmZzZXRMZWZ0ICogLTEgOiAwO1xuXG4gICAgaWYgKGNlbnRlck1vZGUgPT09IHRydWUpIHtcbiAgICAgIHRhcmdldFNsaWRlSW5kZXggPSBpbmZpbml0ZSA/IHNsaWRlSW5kZXggKyBnZXRQcmVDbG9uZXMoc3BlYykgOiBzbGlkZUluZGV4O1xuICAgICAgdGFyZ2V0U2xpZGUgPSB0cmFja0VsZW0gJiYgdHJhY2tFbGVtLmNoaWxkcmVuW3RhcmdldFNsaWRlSW5kZXhdO1xuICAgICAgdGFyZ2V0TGVmdCA9IDA7XG5cbiAgICAgIGZvciAodmFyIHNsaWRlID0gMDsgc2xpZGUgPCB0YXJnZXRTbGlkZUluZGV4OyBzbGlkZSsrKSB7XG4gICAgICAgIHRhcmdldExlZnQgLT0gdHJhY2tFbGVtICYmIHRyYWNrRWxlbS5jaGlsZHJlbltzbGlkZV0gJiYgdHJhY2tFbGVtLmNoaWxkcmVuW3NsaWRlXS5vZmZzZXRXaWR0aDtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0TGVmdCAtPSBwYXJzZUludChzcGVjLmNlbnRlclBhZGRpbmcpO1xuICAgICAgdGFyZ2V0TGVmdCArPSB0YXJnZXRTbGlkZSAmJiAobGlzdFdpZHRoIC0gdGFyZ2V0U2xpZGUub2Zmc2V0V2lkdGgpIC8gMjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0TGVmdDtcbn07XG5cbmV4cG9ydHMuZ2V0VHJhY2tMZWZ0ID0gZ2V0VHJhY2tMZWZ0O1xuXG52YXIgZ2V0UHJlQ2xvbmVzID0gZnVuY3Rpb24gZ2V0UHJlQ2xvbmVzKHNwZWMpIHtcbiAgaWYgKHNwZWMudW5zbGljayB8fCAhc3BlYy5pbmZpbml0ZSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKHNwZWMudmFyaWFibGVXaWR0aCkge1xuICAgIHJldHVybiBzcGVjLnNsaWRlQ291bnQ7XG4gIH1cblxuICByZXR1cm4gc3BlYy5zbGlkZXNUb1Nob3cgKyAoc3BlYy5jZW50ZXJNb2RlID8gMSA6IDApO1xufTtcblxuZXhwb3J0cy5nZXRQcmVDbG9uZXMgPSBnZXRQcmVDbG9uZXM7XG5cbnZhciBnZXRQb3N0Q2xvbmVzID0gZnVuY3Rpb24gZ2V0UG9zdENsb25lcyhzcGVjKSB7XG4gIGlmIChzcGVjLnVuc2xpY2sgfHwgIXNwZWMuaW5maW5pdGUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiBzcGVjLnNsaWRlQ291bnQ7XG59O1xuXG5leHBvcnRzLmdldFBvc3RDbG9uZXMgPSBnZXRQb3N0Q2xvbmVzO1xuXG52YXIgZ2V0VG90YWxTbGlkZXMgPSBmdW5jdGlvbiBnZXRUb3RhbFNsaWRlcyhzcGVjKSB7XG4gIHJldHVybiBzcGVjLnNsaWRlQ291bnQgPT09IDEgPyAxIDogZ2V0UHJlQ2xvbmVzKHNwZWMpICsgc3BlYy5zbGlkZUNvdW50ICsgZ2V0UG9zdENsb25lcyhzcGVjKTtcbn07XG5cbmV4cG9ydHMuZ2V0VG90YWxTbGlkZXMgPSBnZXRUb3RhbFNsaWRlcztcblxudmFyIHNpYmxpbmdEaXJlY3Rpb24gPSBmdW5jdGlvbiBzaWJsaW5nRGlyZWN0aW9uKHNwZWMpIHtcbiAgaWYgKHNwZWMudGFyZ2V0U2xpZGUgPiBzcGVjLmN1cnJlbnRTbGlkZSkge1xuICAgIGlmIChzcGVjLnRhcmdldFNsaWRlID4gc3BlYy5jdXJyZW50U2xpZGUgKyBzbGlkZXNPblJpZ2h0KHNwZWMpKSB7XG4gICAgICByZXR1cm4gXCJsZWZ0XCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwicmlnaHRcIjtcbiAgfSBlbHNlIHtcbiAgICBpZiAoc3BlYy50YXJnZXRTbGlkZSA8IHNwZWMuY3VycmVudFNsaWRlIC0gc2xpZGVzT25MZWZ0KHNwZWMpKSB7XG4gICAgICByZXR1cm4gXCJyaWdodFwiO1xuICAgIH1cblxuICAgIHJldHVybiBcImxlZnRcIjtcbiAgfVxufTtcblxuZXhwb3J0cy5zaWJsaW5nRGlyZWN0aW9uID0gc2libGluZ0RpcmVjdGlvbjtcblxudmFyIHNsaWRlc09uUmlnaHQgPSBmdW5jdGlvbiBzbGlkZXNPblJpZ2h0KF9yZWYpIHtcbiAgdmFyIHNsaWRlc1RvU2hvdyA9IF9yZWYuc2xpZGVzVG9TaG93LFxuICAgICAgY2VudGVyTW9kZSA9IF9yZWYuY2VudGVyTW9kZSxcbiAgICAgIHJ0bCA9IF9yZWYucnRsLFxuICAgICAgY2VudGVyUGFkZGluZyA9IF9yZWYuY2VudGVyUGFkZGluZztcblxuICAvLyByZXR1cm5zIG5vIG9mIHNsaWRlcyBvbiB0aGUgcmlnaHQgb2YgYWN0aXZlIHNsaWRlXG4gIGlmIChjZW50ZXJNb2RlKSB7XG4gICAgdmFyIHJpZ2h0ID0gKHNsaWRlc1RvU2hvdyAtIDEpIC8gMiArIDE7XG4gICAgaWYgKHBhcnNlSW50KGNlbnRlclBhZGRpbmcpID4gMCkgcmlnaHQgKz0gMTtcbiAgICBpZiAocnRsICYmIHNsaWRlc1RvU2hvdyAlIDIgPT09IDApIHJpZ2h0ICs9IDE7XG4gICAgcmV0dXJuIHJpZ2h0O1xuICB9XG5cbiAgaWYgKHJ0bCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHNsaWRlc1RvU2hvdyAtIDE7XG59O1xuXG5leHBvcnRzLnNsaWRlc09uUmlnaHQgPSBzbGlkZXNPblJpZ2h0O1xuXG52YXIgc2xpZGVzT25MZWZ0ID0gZnVuY3Rpb24gc2xpZGVzT25MZWZ0KF9yZWYyKSB7XG4gIHZhciBzbGlkZXNUb1Nob3cgPSBfcmVmMi5zbGlkZXNUb1Nob3csXG4gICAgICBjZW50ZXJNb2RlID0gX3JlZjIuY2VudGVyTW9kZSxcbiAgICAgIHJ0bCA9IF9yZWYyLnJ0bCxcbiAgICAgIGNlbnRlclBhZGRpbmcgPSBfcmVmMi5jZW50ZXJQYWRkaW5nO1xuXG4gIC8vIHJldHVybnMgbm8gb2Ygc2xpZGVzIG9uIHRoZSBsZWZ0IG9mIGFjdGl2ZSBzbGlkZVxuICBpZiAoY2VudGVyTW9kZSkge1xuICAgIHZhciBsZWZ0ID0gKHNsaWRlc1RvU2hvdyAtIDEpIC8gMiArIDE7XG4gICAgaWYgKHBhcnNlSW50KGNlbnRlclBhZGRpbmcpID4gMCkgbGVmdCArPSAxO1xuICAgIGlmICghcnRsICYmIHNsaWRlc1RvU2hvdyAlIDIgPT09IDApIGxlZnQgKz0gMTtcbiAgICByZXR1cm4gbGVmdDtcbiAgfVxuXG4gIGlmIChydGwpIHtcbiAgICByZXR1cm4gc2xpZGVzVG9TaG93IC0gMTtcbiAgfVxuXG4gIHJldHVybiAwO1xufTtcblxuZXhwb3J0cy5zbGlkZXNPbkxlZnQgPSBzbGlkZXNPbkxlZnQ7XG5cbnZhciBjYW5Vc2VET00gPSBmdW5jdGlvbiBjYW5Vc2VET00oKSB7XG4gIHJldHVybiAhISh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG59O1xuXG5leHBvcnRzLmNhblVzZURPTSA9IGNhblVzZURPTTsiLCJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5TGlrZVRvQXJyYXk7IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlczsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRob3V0SG9sZXM7IiwiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkOyIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7IiwidmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vZ2V0UHJvdG90eXBlT2ZcIik7XG5cbnZhciBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSByZXF1aXJlKFwiLi9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3RcIik7XG5cbnZhciBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gcmVxdWlyZShcIi4vcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHtcbiAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkge1xuICAgIHZhciBTdXBlciA9IGdldFByb3RvdHlwZU9mKERlcml2ZWQpLFxuICAgICAgICByZXN1bHQ7XG5cbiAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgdmFyIE5ld1RhcmdldCA9IGdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO1xuICAgICAgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVTdXBlcjsiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHk7IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9leHRlbmRzOyIsInZhciBzdXBlclByb3BCYXNlID0gcmVxdWlyZShcIi4vc3VwZXJQcm9wQmFzZVwiKTtcblxuZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgUmVmbGVjdC5nZXQpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9nZXQgPSBSZWZsZWN0LmdldDtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgICB2YXIgYmFzZSA9IHN1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybjtcbiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7XG5cbiAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICByZXR1cm4gZGVzYy5nZXQuY2FsbChyZWNlaXZlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZXNjLnZhbHVlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciB8fCB0YXJnZXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9nZXQ7IiwiZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldFByb3RvdHlwZU9mOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzOyIsImZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgXCJkZWZhdWx0XCI6IG9ialxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQ7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi4vaGVscGVycy90eXBlb2ZcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHtcbiAgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsO1xuICB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuXG4gIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHtcbiAgICByZXR1cm4gY2FjaGU7XG4gIH07XG5cbiAgcmV0dXJuIGNhY2hlO1xufVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHtcbiAgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJkZWZhdWx0XCI6IG9ialxuICAgIH07XG4gIH1cblxuICB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTtcblxuICBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KG9iaik7XG4gIH1cblxuICB2YXIgbmV3T2JqID0ge307XG4gIHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsO1xuXG4gICAgICBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdPYmpba2V5XSA9IG9ialtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7XG5cbiAgaWYgKGNhY2hlKSB7XG4gICAgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTtcbiAgfVxuXG4gIHJldHVybiBuZXdPYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQ7IiwiZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3Q7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXk7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG4gIHZhciBfZSA9IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVJlc3Q7IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVTcHJlYWQ7IiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4vZGVmaW5lUHJvcGVydHlcIik7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfb2JqZWN0U3ByZWFkMjsiLCJ2YXIgb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSA9IHJlcXVpcmUoXCIuL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIik7XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcbiAgdmFyIGtleSwgaTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXM7IiwiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2U7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi4vaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgPSByZXF1aXJlKFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIik7XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm47IiwiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2Y7IiwidmFyIGFycmF5V2l0aEhvbGVzID0gcmVxdWlyZShcIi4vYXJyYXlXaXRoSG9sZXNcIik7XG5cbnZhciBpdGVyYWJsZVRvQXJyYXlMaW1pdCA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0XCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheVwiKTtcblxudmFyIG5vbkl0ZXJhYmxlUmVzdCA9IHJlcXVpcmUoXCIuL25vbkl0ZXJhYmxlUmVzdFwiKTtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2xpY2VkVG9BcnJheTsiLCJ2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9nZXRQcm90b3R5cGVPZlwiKTtcblxuZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkge1xuICB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkge1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zdXBlclByb3BCYXNlOyIsInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheVwiKTtcblxudmFyIG5vbkl0ZXJhYmxlUmVzdCA9IHJlcXVpcmUoXCIuL25vbkl0ZXJhYmxlUmVzdFwiKTtcblxuZnVuY3Rpb24gX3RvQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3RvQXJyYXk7IiwidmFyIGFycmF5V2l0aG91dEhvbGVzID0gcmVxdWlyZShcIi4vYXJyYXlXaXRob3V0SG9sZXNcIik7XG5cbnZhciBpdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVTcHJlYWQgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVNwcmVhZFwiKTtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IG5vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3RvQ29uc3VtYWJsZUFycmF5OyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuUHJlc2V0Q29sb3JUeXBlcyA9IGV4cG9ydHMuUHJlc2V0U3RhdHVzQ29sb3JUeXBlcyA9IHZvaWQgMDtcblxudmFyIF90eXBlID0gcmVxdWlyZShcIi4vdHlwZVwiKTtcblxudmFyIFByZXNldFN0YXR1c0NvbG9yVHlwZXMgPSAoMCwgX3R5cGUudHVwbGUpKCdzdWNjZXNzJywgJ3Byb2Nlc3NpbmcnLCAnZXJyb3InLCAnZGVmYXVsdCcsICd3YXJuaW5nJyk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvcHJlZmVyLWRlZmF1bHQtZXhwb3J0XG5cbmV4cG9ydHMuUHJlc2V0U3RhdHVzQ29sb3JUeXBlcyA9IFByZXNldFN0YXR1c0NvbG9yVHlwZXM7XG52YXIgUHJlc2V0Q29sb3JUeXBlcyA9ICgwLCBfdHlwZS50dXBsZSkoJ3BpbmsnLCAncmVkJywgJ3llbGxvdycsICdvcmFuZ2UnLCAnY3lhbicsICdncmVlbicsICdibHVlJywgJ3B1cnBsZScsICdnZWVrYmx1ZScsICdtYWdlbnRhJywgJ3ZvbGNhbm8nLCAnZ29sZCcsICdsaW1lJyk7XG5leHBvcnRzLlByZXNldENvbG9yVHlwZXMgPSBQcmVzZXRDb2xvclR5cGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmVzZXRXYXJuZWRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3dhcm5pbmcucmVzZXRXYXJuZWQ7XG4gIH1cbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyYy11dGlsL2xpYi93YXJuaW5nXCIpKTtcblxudmFyIF9kZWZhdWx0ID0gZnVuY3Rpb24gX2RlZmF1bHQodmFsaWQsIGNvbXBvbmVudCwgbWVzc2FnZSkge1xuICAoMCwgX3dhcm5pbmdbXCJkZWZhdWx0XCJdKSh2YWxpZCwgXCJbYW50ZDogXCIuY29uY2F0KGNvbXBvbmVudCwgXCJdIFwiKS5jb25jYXQobWVzc2FnZSkpO1xufTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZWFzZUluT3V0Q3ViaWMgPSBlYXNlSW5PdXRDdWJpYztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9wcmVmZXItZGVmYXVsdC1leHBvcnRcbmZ1bmN0aW9uIGVhc2VJbk91dEN1YmljKHQsIGIsIGMsIGQpIHtcbiAgdmFyIGNjID0gYyAtIGI7XG4gIHQgLz0gZCAvIDI7XG5cbiAgaWYgKHQgPCAxKSB7XG4gICAgcmV0dXJuIGNjIC8gMiAqIHQgKiB0ICogdCArIGI7XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJldHVybi1hc3NpZ25cblxuXG4gIHJldHVybiBjYyAvIDIgKiAoKHQgLT0gMikgKiB0ICogdCArIDIpICsgYjtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZ2V0RGF0YU9yQXJpYVByb3BzO1xuXG5mdW5jdGlvbiBnZXREYXRhT3JBcmlhUHJvcHMocHJvcHMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGtleSkge1xuICAgIGlmICgoa2V5LnN1YnN0cigwLCA1KSA9PT0gJ2RhdGEtJyB8fCBrZXkuc3Vic3RyKDAsIDUpID09PSAnYXJpYS0nIHx8IGtleSA9PT0gJ3JvbGUnKSAmJiBrZXkuc3Vic3RyKDAsIDcpICE9PSAnZGF0YS1fXycpIHtcbiAgICAgIHByZXZba2V5XSA9IHByb3BzW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXY7XG4gIH0sIHt9KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0UmVuZGVyUHJvcFZhbHVlID0gdm9pZCAwO1xuXG52YXIgZ2V0UmVuZGVyUHJvcFZhbHVlID0gZnVuY3Rpb24gZ2V0UmVuZGVyUHJvcFZhbHVlKHByb3BWYWx1ZSkge1xuICBpZiAoIXByb3BWYWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGlzUmVuZGVyRnVuY3Rpb24gPSB0eXBlb2YgcHJvcFZhbHVlID09PSAnZnVuY3Rpb24nO1xuXG4gIGlmIChpc1JlbmRlckZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIHByb3BWYWx1ZSgpO1xuICB9XG5cbiAgcmV0dXJuIHByb3BWYWx1ZTtcbn07XG5cbmV4cG9ydHMuZ2V0UmVuZGVyUHJvcFZhbHVlID0gZ2V0UmVuZGVyUHJvcFZhbHVlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc1dpbmRvdyA9IGlzV2luZG93O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBnZXRTY3JvbGw7XG5cbmZ1bmN0aW9uIGlzV2luZG93KG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiA9PT0gb2JqLndpbmRvdztcbn1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsKHRhcmdldCwgdG9wKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIG1ldGhvZCA9IHRvcCA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICB2YXIgcmVzdWx0ID0gMDtcblxuICBpZiAoaXNXaW5kb3codGFyZ2V0KSkge1xuICAgIHJlc3VsdCA9IHRhcmdldFt0b3AgPyAncGFnZVlPZmZzZXQnIDogJ3BhZ2VYT2Zmc2V0J107XG4gIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICByZXN1bHQgPSB0YXJnZXQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF07XG4gIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgcmVzdWx0ID0gdGFyZ2V0W21ldGhvZF07XG4gIH1cblxuICBpZiAodGFyZ2V0ICYmICFpc1dpbmRvdyh0YXJnZXQpICYmIHR5cGVvZiByZXN1bHQgIT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0ID0gKHRhcmdldC5vd25lckRvY3VtZW50IHx8IHRhcmdldCkuZG9jdW1lbnRFbGVtZW50W21ldGhvZF07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdXNlRm9yY2VVcGRhdGU7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG5mdW5jdGlvbiB1c2VGb3JjZVVwZGF0ZSgpIHtcbiAgdmFyIF9SZWFjdCR1c2VSZWR1Y2VyID0gUmVhY3QudXNlUmVkdWNlcihmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiB4ICsgMTtcbiAgfSwgMCksXG4gICAgICBfUmVhY3QkdXNlUmVkdWNlcjIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVJlZHVjZXIsIDIpLFxuICAgICAgZm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlUmVkdWNlcjJbMV07XG5cbiAgcmV0dXJuIGZvcmNlVXBkYXRlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdXNlUGF0Y2hFbGVtZW50O1xuXG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuZnVuY3Rpb24gdXNlUGF0Y2hFbGVtZW50KCkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoW10pLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgZWxlbWVudHMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0RWxlbWVudHMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIGZ1bmN0aW9uIHBhdGNoRWxlbWVudChlbGVtZW50KSB7XG4gICAgLy8gYXBwZW5kIGEgbmV3IGVsZW1lbnQgdG8gZWxlbWVudHMgKGFuZCBjcmVhdGUgYSBuZXcgcmVmKVxuICAgIHNldEVsZW1lbnRzKGZ1bmN0aW9uIChvcmlnaW5FbGVtZW50cykge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKG9yaWdpbkVsZW1lbnRzKSwgW2VsZW1lbnRdKTtcbiAgICB9KTsgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBuZXcgZWxlbWVudCBvdXQgb2YgZWxlbWVudHMgKGFuZCBjcmVhdGUgYSBuZXcgcmVmKVxuICAgIC8vIGl0IHdvcmtzIGEgbGl0dGxlIGxpa2UgdXNlRWZmZWN0XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc2V0RWxlbWVudHMoZnVuY3Rpb24gKG9yaWdpbkVsZW1lbnRzKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5FbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUgIT09IGVsZW1lbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBbZWxlbWVudHMsIHBhdGNoRWxlbWVudF07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB1c2VTeW5jU3RhdGU7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXNlRm9yY2VVcGRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VzZUZvcmNlVXBkYXRlXCIpKTtcblxuZnVuY3Rpb24gdXNlU3luY1N0YXRlKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgcmVmID0gUmVhY3QudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG4gIHZhciBmb3JjZVVwZGF0ZSA9ICgwLCBfdXNlRm9yY2VVcGRhdGVbXCJkZWZhdWx0XCJdKSgpO1xuICByZXR1cm4gW2Z1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmVmLmN1cnJlbnQ7XG4gIH0sIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgIHJlZi5jdXJyZW50ID0gbmV3VmFsdWU7IC8vIHJlLXJlbmRlclxuXG4gICAgZm9yY2VVcGRhdGUoKTtcbiAgfV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIGlzTnVtZXJpYyA9IGZ1bmN0aW9uIGlzTnVtZXJpYyh2YWx1ZSkge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKSAmJiBpc0Zpbml0ZSh2YWx1ZSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBpc051bWVyaWM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbi8vID09PT09PT09PT09PT09PT09PSBDb2xsYXBzZSBNb3Rpb24gPT09PT09PT09PT09PT09PT09XG52YXIgZ2V0Q29sbGFwc2VkSGVpZ2h0ID0gZnVuY3Rpb24gZ2V0Q29sbGFwc2VkSGVpZ2h0KCkge1xuICByZXR1cm4ge1xuICAgIGhlaWdodDogMCxcbiAgICBvcGFjaXR5OiAwXG4gIH07XG59O1xuXG52YXIgZ2V0UmVhbEhlaWdodCA9IGZ1bmN0aW9uIGdldFJlYWxIZWlnaHQobm9kZSkge1xuICByZXR1cm4ge1xuICAgIGhlaWdodDogbm9kZS5zY3JvbGxIZWlnaHQsXG4gICAgb3BhY2l0eTogMVxuICB9O1xufTtcblxudmFyIGdldEN1cnJlbnRIZWlnaHQgPSBmdW5jdGlvbiBnZXRDdXJyZW50SGVpZ2h0KG5vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IG5vZGUub2Zmc2V0SGVpZ2h0XG4gIH07XG59O1xuXG52YXIgc2tpcE9wYWNpdHlUcmFuc2l0aW9uID0gZnVuY3Rpb24gc2tpcE9wYWNpdHlUcmFuc2l0aW9uKF8sIGV2ZW50KSB7XG4gIHJldHVybiBldmVudC5wcm9wZXJ0eU5hbWUgPT09ICdoZWlnaHQnO1xufTtcblxudmFyIGNvbGxhcHNlTW90aW9uID0ge1xuICBtb3Rpb25OYW1lOiAnYW50LW1vdGlvbi1jb2xsYXBzZScsXG4gIG9uQXBwZWFyU3RhcnQ6IGdldENvbGxhcHNlZEhlaWdodCxcbiAgb25FbnRlclN0YXJ0OiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gIG9uQXBwZWFyQWN0aXZlOiBnZXRSZWFsSGVpZ2h0LFxuICBvbkVudGVyQWN0aXZlOiBnZXRSZWFsSGVpZ2h0LFxuICBvbkxlYXZlU3RhcnQ6IGdldEN1cnJlbnRIZWlnaHQsXG4gIG9uTGVhdmVBY3RpdmU6IGdldENvbGxhcHNlZEhlaWdodCxcbiAgb25BcHBlYXJFbmQ6IHNraXBPcGFjaXR5VHJhbnNpdGlvbixcbiAgb25FbnRlckVuZDogc2tpcE9wYWNpdHlUcmFuc2l0aW9uLFxuICBvbkxlYXZlRW5kOiBza2lwT3BhY2l0eVRyYW5zaXRpb24sXG4gIG1vdGlvbkRlYWRsaW5lOiA1MDBcbn07XG52YXIgX2RlZmF1bHQgPSBjb2xsYXBzZU1vdGlvbjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB3cmFwcGVyUmFmO1xuXG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJhZlwiKSk7XG5cbnZhciBpZCA9IDA7XG52YXIgaWRzID0ge307IC8vIFN1cHBvcnQgY2FsbCByYWYgd2l0aCBkZWxheSBzcGVjaWZpZWQgZnJhbWVcblxuZnVuY3Rpb24gd3JhcHBlclJhZihjYWxsYmFjaykge1xuICB2YXIgZGVsYXlGcmFtZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHZhciBteUlkID0gaWQrKztcbiAgdmFyIHJlc3RGcmFtZXMgPSBkZWxheUZyYW1lcztcblxuICBmdW5jdGlvbiBpbnRlcm5hbENhbGxiYWNrKCkge1xuICAgIHJlc3RGcmFtZXMgLT0gMTtcblxuICAgIGlmIChyZXN0RnJhbWVzIDw9IDApIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgICBkZWxldGUgaWRzW215SWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZHNbbXlJZF0gPSAoMCwgX3JhZltcImRlZmF1bHRcIl0pKGludGVybmFsQ2FsbGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIGlkc1tteUlkXSA9ICgwLCBfcmFmW1wiZGVmYXVsdFwiXSkoaW50ZXJuYWxDYWxsYmFjayk7XG4gIHJldHVybiBteUlkO1xufVxuXG53cmFwcGVyUmFmLmNhbmNlbCA9IGZ1bmN0aW9uIGNhbmNlbChwaWQpIHtcbiAgaWYgKHBpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgX3JhZltcImRlZmF1bHRcIl0uY2FuY2VsKGlkc1twaWRdKTtcblxuICBkZWxldGUgaWRzW3BpZF07XG59O1xuXG53cmFwcGVyUmFmLmlkcyA9IGlkczsgLy8gZXhwb3J0IHRoaXMgZm9yIHRlc3QgdXNhZ2UiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucmVwbGFjZUVsZW1lbnQgPSByZXBsYWNlRWxlbWVudDtcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIGlzVmFsaWRFbGVtZW50ID0gUmVhY3QuaXNWYWxpZEVsZW1lbnQ7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5cbmZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIHJlcGxhY2VtZW50LCBwcm9wcykge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGVsZW1lbnQsIHR5cGVvZiBwcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHByb3BzKCkgOiBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgZWxlbWVudCwgcHJvcHMpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZmlsbFJlZiA9IGZpbGxSZWY7XG5leHBvcnRzLmNvbXBvc2VSZWYgPSBjb21wb3NlUmVmO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbmZ1bmN0aW9uIGZpbGxSZWYocmVmLCBub2RlKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKG5vZGUpO1xuICB9IGVsc2UgaWYgKCgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKHJlZikgPT09ICdvYmplY3QnICYmIHJlZiAmJiAnY3VycmVudCcgaW4gcmVmKSB7XG4gICAgcmVmLmN1cnJlbnQgPSBub2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBvc2VSZWYoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZWZzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHJlZnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZWZzLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgZmlsbFJlZihyZWYsIG5vZGUpO1xuICAgIH0pO1xuICB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXhwb3J0cy5yZXNwb25zaXZlTWFwID0gZXhwb3J0cy5yZXNwb25zaXZlQXJyYXkgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgcmVzcG9uc2l2ZUFycmF5ID0gWyd4eGwnLCAneGwnLCAnbGcnLCAnbWQnLCAnc20nLCAneHMnXTtcbmV4cG9ydHMucmVzcG9uc2l2ZUFycmF5ID0gcmVzcG9uc2l2ZUFycmF5O1xudmFyIHJlc3BvbnNpdmVNYXAgPSB7XG4gIHhzOiAnKG1heC13aWR0aDogNTc1cHgpJyxcbiAgc206ICcobWluLXdpZHRoOiA1NzZweCknLFxuICBtZDogJyhtaW4td2lkdGg6IDc2OHB4KScsXG4gIGxnOiAnKG1pbi13aWR0aDogOTkycHgpJyxcbiAgeGw6ICcobWluLXdpZHRoOiAxMjAwcHgpJyxcbiAgeHhsOiAnKG1pbi13aWR0aDogMTYwMHB4KSdcbn07XG5leHBvcnRzLnJlc3BvbnNpdmVNYXAgPSByZXNwb25zaXZlTWFwO1xudmFyIHN1YnNjcmliZXJzID0gbmV3IE1hcCgpO1xudmFyIHN1YlVpZCA9IC0xO1xudmFyIHNjcmVlbnMgPSB7fTtcbnZhciByZXNwb25zaXZlT2JzZXJ2ZSA9IHtcbiAgbWF0Y2hIYW5kbGVyczoge30sXG4gIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaChwb2ludE1hcCkge1xuICAgIHNjcmVlbnMgPSBwb2ludE1hcDtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICByZXR1cm4gZnVuYyhzY3JlZW5zKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaWJlcnMuc2l6ZSA+PSAxO1xuICB9LFxuICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShmdW5jKSB7XG4gICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgc3ViVWlkICs9IDE7XG4gICAgc3Vic2NyaWJlcnMuc2V0KHN1YlVpZCwgZnVuYyk7XG4gICAgZnVuYyhzY3JlZW5zKTtcbiAgICByZXR1cm4gc3ViVWlkO1xuICB9LFxuICB1bnN1YnNjcmliZTogZnVuY3Rpb24gdW5zdWJzY3JpYmUodG9rZW4pIHtcbiAgICBzdWJzY3JpYmVyc1tcImRlbGV0ZVwiXSh0b2tlbik7XG4gICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB0aGlzLnVucmVnaXN0ZXIoKTtcbiAgfSxcbiAgdW5yZWdpc3RlcjogZnVuY3Rpb24gdW5yZWdpc3RlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgT2JqZWN0LmtleXMocmVzcG9uc2l2ZU1hcCkuZm9yRWFjaChmdW5jdGlvbiAoc2NyZWVuKSB7XG4gICAgICB2YXIgbWF0Y2hNZWRpYVF1ZXJ5ID0gcmVzcG9uc2l2ZU1hcFtzY3JlZW5dO1xuICAgICAgdmFyIGhhbmRsZXIgPSBfdGhpcy5tYXRjaEhhbmRsZXJzW21hdGNoTWVkaWFRdWVyeV07XG4gICAgICBoYW5kbGVyID09PSBudWxsIHx8IGhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhhbmRsZXIubXFsLnJlbW92ZUxpc3RlbmVyKGhhbmRsZXIgPT09IG51bGwgfHwgaGFuZGxlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogaGFuZGxlci5saXN0ZW5lcik7XG4gICAgfSk7XG4gICAgc3Vic2NyaWJlcnMuY2xlYXIoKTtcbiAgfSxcbiAgcmVnaXN0ZXI6IGZ1bmN0aW9uIHJlZ2lzdGVyKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgT2JqZWN0LmtleXMocmVzcG9uc2l2ZU1hcCkuZm9yRWFjaChmdW5jdGlvbiAoc2NyZWVuKSB7XG4gICAgICB2YXIgbWF0Y2hNZWRpYVF1ZXJ5ID0gcmVzcG9uc2l2ZU1hcFtzY3JlZW5dO1xuXG4gICAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiBsaXN0ZW5lcihfcmVmKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gX3JlZi5tYXRjaGVzO1xuXG4gICAgICAgIF90aGlzMi5kaXNwYXRjaCgoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKHt9LCBzY3JlZW5zKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgc2NyZWVuLCBtYXRjaGVzKSkpO1xuICAgICAgfTtcblxuICAgICAgdmFyIG1xbCA9IHdpbmRvdy5tYXRjaE1lZGlhKG1hdGNoTWVkaWFRdWVyeSk7XG4gICAgICBtcWwuYWRkTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgX3RoaXMyLm1hdGNoSGFuZGxlcnNbbWF0Y2hNZWRpYVF1ZXJ5XSA9IHtcbiAgICAgICAgbXFsOiBtcWwsXG4gICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lclxuICAgICAgfTtcbiAgICAgIGxpc3RlbmVyKG1xbCk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSByZXNwb25zaXZlT2JzZXJ2ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBzY3JvbGxUbztcblxudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYWZcIikpO1xuXG52YXIgX2dldFNjcm9sbCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2dldFNjcm9sbFwiKSk7XG5cbnZhciBfZWFzaW5ncyA9IHJlcXVpcmUoXCIuL2Vhc2luZ3NcIik7XG5cbmZ1bmN0aW9uIHNjcm9sbFRvKHkpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgX29wdGlvbnMkZ2V0Q29udGFpbmVyID0gb3B0aW9ucy5nZXRDb250YWluZXIsXG4gICAgICBnZXRDb250YWluZXIgPSBfb3B0aW9ucyRnZXRDb250YWluZXIgPT09IHZvaWQgMCA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9IDogX29wdGlvbnMkZ2V0Q29udGFpbmVyLFxuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrLFxuICAgICAgX29wdGlvbnMkZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb24gPSBfb3B0aW9ucyRkdXJhdGlvbiA9PT0gdm9pZCAwID8gNDUwIDogX29wdGlvbnMkZHVyYXRpb247XG4gIHZhciBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTtcbiAgdmFyIHNjcm9sbFRvcCA9ICgwLCBfZ2V0U2Nyb2xsW1wiZGVmYXVsdFwiXSkoY29udGFpbmVyLCB0cnVlKTtcbiAgdmFyIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgdmFyIGZyYW1lRnVuYyA9IGZ1bmN0aW9uIGZyYW1lRnVuYygpIHtcbiAgICB2YXIgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICB2YXIgdGltZSA9IHRpbWVzdGFtcCAtIHN0YXJ0VGltZTtcbiAgICB2YXIgbmV4dFNjcm9sbFRvcCA9ICgwLCBfZWFzaW5ncy5lYXNlSW5PdXRDdWJpYykodGltZSA+IGR1cmF0aW9uID8gZHVyYXRpb24gOiB0aW1lLCBzY3JvbGxUb3AsIHksIGR1cmF0aW9uKTtcblxuICAgIGlmICgoMCwgX2dldFNjcm9sbC5pc1dpbmRvdykoY29udGFpbmVyKSkge1xuICAgICAgY29udGFpbmVyLnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCwgbmV4dFNjcm9sbFRvcCk7XG4gICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRG9jdW1lbnQgfHwgY29udGFpbmVyLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdIVE1MRG9jdW1lbnQnKSB7XG4gICAgICBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IG5leHRTY3JvbGxUb3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBuZXh0U2Nyb2xsVG9wO1xuICAgIH1cblxuICAgIGlmICh0aW1lIDwgZHVyYXRpb24pIHtcbiAgICAgICgwLCBfcmFmW1wiZGVmYXVsdFwiXSkoZnJhbWVGdW5jKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH07XG5cbiAgKDAsIF9yYWZbXCJkZWZhdWx0XCJdKShmcmFtZUZ1bmMpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc0ZsZXhTdXBwb3J0ZWQgPSBleHBvcnRzLmlzU3R5bGVTdXBwb3J0ID0gdm9pZCAwO1xuXG52YXIgaXNTdHlsZVN1cHBvcnQgPSBmdW5jdGlvbiBpc1N0eWxlU3VwcG9ydChzdHlsZU5hbWUpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgdmFyIHN0eWxlTmFtZUxpc3QgPSBBcnJheS5pc0FycmF5KHN0eWxlTmFtZSkgPyBzdHlsZU5hbWUgOiBbc3R5bGVOYW1lXTtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICByZXR1cm4gc3R5bGVOYW1lTGlzdC5zb21lKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gbmFtZSBpbiBkb2N1bWVudEVsZW1lbnQuc3R5bGU7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnRzLmlzU3R5bGVTdXBwb3J0ID0gaXNTdHlsZVN1cHBvcnQ7XG52YXIgaXNGbGV4U3VwcG9ydGVkID0gaXNTdHlsZVN1cHBvcnQoWydmbGV4JywgJ3dlYmtpdEZsZXgnLCAnRmxleCcsICdtc0ZsZXgnXSk7XG5leHBvcnRzLmlzRmxleFN1cHBvcnRlZCA9IGlzRmxleFN1cHBvcnRlZDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRocm90dGxlQnlBbmltYXRpb25GcmFtZSA9IHRocm90dGxlQnlBbmltYXRpb25GcmFtZTtcbmV4cG9ydHMudGhyb3R0bGVCeUFuaW1hdGlvbkZyYW1lRGVjb3JhdG9yID0gdGhyb3R0bGVCeUFuaW1hdGlvbkZyYW1lRGVjb3JhdG9yO1xuXG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xuXG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJhZlwiKSk7XG5cbmZ1bmN0aW9uIHRocm90dGxlQnlBbmltYXRpb25GcmFtZShmbikge1xuICB2YXIgcmVxdWVzdElkO1xuXG4gIHZhciBsYXRlciA9IGZ1bmN0aW9uIGxhdGVyKGFyZ3MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdElkID0gbnVsbDtcbiAgICAgIGZuLmFwcGx5KHZvaWQgMCwgKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShhcmdzKSk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgdGhyb3R0bGVkID0gZnVuY3Rpb24gdGhyb3R0bGVkKCkge1xuICAgIGlmIChyZXF1ZXN0SWQgPT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3RJZCA9ICgwLCBfcmFmW1wiZGVmYXVsdFwiXSkobGF0ZXIoYXJncykpO1xuICAgIH1cbiAgfTtcblxuICB0aHJvdHRsZWQuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfcmFmW1wiZGVmYXVsdFwiXS5jYW5jZWwocmVxdWVzdElkKTtcbiAgfTtcblxuICByZXR1cm4gdGhyb3R0bGVkO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZUJ5QW5pbWF0aW9uRnJhbWVEZWNvcmF0b3IoKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0aHJvdHRsZSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuICAgIHZhciBmbiA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgdmFyIGRlZmluaW5nUHJvcGVydHkgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIC8vIEluIElFMTEgY2FsbGluZyBPYmplY3QuZGVmaW5lUHJvcGVydHkgaGFzIGEgc2lkZS1lZmZlY3Qgb2YgZXZhbHVhdGluZyB0aGVcbiAgICAgICAgLy8gZ2V0dGVyIGZvciB0aGUgcHJvcGVydHkgd2hpY2ggaXMgYmVpbmcgcmVwbGFjZWQuIFRoaXMgY2F1c2VzIGluZmluaXRlXG4gICAgICAgIC8vIHJlY3Vyc2lvbiBhbmQgYW4gXCJPdXQgb2Ygc3RhY2sgc3BhY2VcIiBlcnJvci5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICBpZiAoZGVmaW5pbmdQcm9wZXJ0eSB8fCB0aGlzID09PSB0YXJnZXQucHJvdG90eXBlIHx8IHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgcmV0dXJuIGZuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJvdW5kRm4gPSB0aHJvdHRsZUJ5QW5pbWF0aW9uRnJhbWUoZm4uYmluZCh0aGlzKSk7XG4gICAgICAgIGRlZmluaW5nUHJvcGVydHkgPSB0cnVlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgICAgdmFsdWU6IGJvdW5kRm4sXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBkZWZpbmluZ1Byb3BlcnR5ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBib3VuZEZuO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG4vKipcbiAqIFdyYXAgb2Ygc3ViIGNvbXBvbmVudCB3aGljaCBuZWVkIHVzZSBhcyBCdXR0b24gY2FwYWNpdHkgKGxpa2UgSWNvbiBjb21wb25lbnQpLlxuICogVGhpcyBoZWxwcyBhY2Nlc3NpYmlsaXR5IHJlYWRlciB0byB0cmVhZCBhcyBhIGludGVyYWN0aXZlIGJ1dHRvbiB0byBvcGVyYXRpb24uXG4gKi9cblxuXG52YXIgaW5saW5lU3R5bGUgPSB7XG4gIGJvcmRlcjogMCxcbiAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgcGFkZGluZzogMCxcbiAgbGluZUhlaWdodDogJ2luaGVyaXQnLFxuICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ1xufTtcblxudmFyIFRyYW5zQnV0dG9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoVHJhbnNCdXR0b24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKFRyYW5zQnV0dG9uKTtcblxuICBmdW5jdGlvbiBUcmFuc0J1dHRvbigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIFRyYW5zQnV0dG9uKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgX3RoaXMub25LZXlEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG5cbiAgICAgIGlmIChrZXlDb2RlID09PSBfS2V5Q29kZVtcImRlZmF1bHRcIl0uRU5URVIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25LZXlVcCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgdmFyIG9uQ2xpY2sgPSBfdGhpcy5wcm9wcy5vbkNsaWNrO1xuXG4gICAgICBpZiAoa2V5Q29kZSA9PT0gX0tleUNvZGVbXCJkZWZhdWx0XCJdLkVOVEVSICYmIG9uQ2xpY2spIHtcbiAgICAgICAgb25DbGljaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zZXRSZWYgPSBmdW5jdGlvbiAoYnRuKSB7XG4gICAgICBfdGhpcy5kaXYgPSBidG47XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoVHJhbnNCdXR0b24sIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIGF1dG9Gb2N1cyA9IHRoaXMucHJvcHMuYXV0b0ZvY3VzO1xuXG4gICAgICBpZiAoYXV0b0ZvY3VzKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9jdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgICAgdGhpcy5kaXYuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmx1clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICAgIHRoaXMuZGl2LmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgc3R5bGUgPSBfYS5zdHlsZSxcbiAgICAgICAgICBub1N0eWxlID0gX2Eubm9TdHlsZSxcbiAgICAgICAgICBkaXNhYmxlZCA9IF9hLmRpc2FibGVkLFxuICAgICAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wic3R5bGVcIiwgXCJub1N0eWxlXCIsIFwiZGlzYWJsZWRcIl0pO1xuXG4gICAgICB2YXIgbWVyZ2VkU3R5bGUgPSB7fTtcblxuICAgICAgaWYgKCFub1N0eWxlKSB7XG4gICAgICAgIG1lcmdlZFN0eWxlID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBpbmxpbmVTdHlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBtZXJnZWRTdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICBtZXJnZWRTdHlsZSA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIG1lcmdlZFN0eWxlKSwgc3R5bGUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICByZWY6IHRoaXMuc2V0UmVmXG4gICAgICB9LCByZXN0UHJvcHMsIHtcbiAgICAgICAgb25LZXlEb3duOiB0aGlzLm9uS2V5RG93bixcbiAgICAgICAgb25LZXlVcDogdGhpcy5vbktleVVwLFxuICAgICAgICBzdHlsZTogbWVyZ2VkU3R5bGVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFRyYW5zQnV0dG9uO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG52YXIgX2RlZmF1bHQgPSBUcmFuc0J1dHRvbjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnR1cGxlTnVtID0gZXhwb3J0cy50dXBsZSA9IHZvaWQgMDtcblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDYxNzYxNjUvd2F5cy10by1nZXQtc3RyaW5nLWxpdGVyYWwtdHlwZS1vZi1hcnJheS12YWx1ZXMtd2l0aG91dC1lbnVtLW92ZXJoZWFkXG52YXIgdHVwbGUgPSBmdW5jdGlvbiB0dXBsZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufTtcblxuZXhwb3J0cy50dXBsZSA9IHR1cGxlO1xuXG52YXIgdHVwbGVOdW0gPSBmdW5jdGlvbiB0dXBsZU51bSgpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG5cbiAgcmV0dXJuIGFyZ3M7XG59O1xuXG5leHBvcnRzLnR1cGxlTnVtID0gdHVwbGVOdW07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBVbnJlYWNoYWJsZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIFVucmVhY2hhYmxlRXhjZXB0aW9uKHZhbHVlKSB7XG4gICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgVW5yZWFjaGFibGVFeGNlcHRpb24pO1xuICByZXR1cm4gbmV3IEVycm9yKFwidW5yZWFjaGFibGUgY2FzZTogXCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KHZhbHVlKSkpO1xufTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBVbnJlYWNoYWJsZUV4Y2VwdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxudmFyIF9FdmVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzcy1hbmltYXRpb24vbGliL0V2ZW50XCIpKTtcblxudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JhZlwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgc3R5bGVGb3JQZXN1ZG87IC8vIFdoZXJlIGVsIGlzIHRoZSBET00gZWxlbWVudCB5b3UnZCBsaWtlIHRvIHRlc3QgZm9yIHZpc2liaWxpdHlcblxuZnVuY3Rpb24gaXNIaWRkZW4oZWxlbWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAhZWxlbWVudCB8fCBlbGVtZW50Lm9mZnNldFBhcmVudCA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOb3RHcmV5KGNvbG9yKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB2YXIgbWF0Y2ggPSAoY29sb3IgfHwgJycpLm1hdGNoKC9yZ2JhP1xcKChcXGQqKSwgKFxcZCopLCAoXFxkKikoLCBbXFxkLl0qKT9cXCkvKTtcblxuICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0gJiYgbWF0Y2hbMl0gJiYgbWF0Y2hbM10pIHtcbiAgICByZXR1cm4gIShtYXRjaFsxXSA9PT0gbWF0Y2hbMl0gJiYgbWF0Y2hbMl0gPT09IG1hdGNoWzNdKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG52YXIgV2F2ZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKFdhdmUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKFdhdmUpO1xuXG4gIGZ1bmN0aW9uIFdhdmUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBXYXZlKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLmFuaW1hdGlvblN0YXJ0ID0gZmFsc2U7XG4gICAgX3RoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICBfdGhpcy5vbkNsaWNrID0gZnVuY3Rpb24gKG5vZGUsIHdhdmVDb2xvcikge1xuICAgICAgaWYgKCFub2RlIHx8IGlzSGlkZGVuKG5vZGUpIHx8IG5vZGUuY2xhc3NOYW1lLmluZGV4T2YoJy1sZWF2ZScpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5zZXJ0RXh0cmFOb2RlID0gX3RoaXMucHJvcHMuaW5zZXJ0RXh0cmFOb2RlO1xuICAgICAgX3RoaXMuZXh0cmFOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemUgPSAoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksXG4gICAgICAgICAgZXh0cmFOb2RlID0gX2Fzc2VydFRoaXNJbml0aWFsaXplLmV4dHJhTm9kZTtcblxuICAgICAgdmFyIGdldFByZWZpeENscyA9IF90aGlzLmNvbnRleHQuZ2V0UHJlZml4Q2xzO1xuICAgICAgZXh0cmFOb2RlLmNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KGdldFByZWZpeENscygnJyksIFwiLWNsaWNrLWFuaW1hdGluZy1ub2RlXCIpO1xuXG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IF90aGlzLmdldEF0dHJpYnV0ZU5hbWUoKTtcblxuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJ3RydWUnKTsgLy8gTm90IHdoaXRlIG9yIHRyYW5zcGFybnQgb3IgZ3JleVxuXG4gICAgICBzdHlsZUZvclBlc3VkbyA9IHN0eWxlRm9yUGVzdWRvIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG5cbiAgICAgIGlmICh3YXZlQ29sb3IgJiYgd2F2ZUNvbG9yICE9PSAnI2ZmZmZmZicgJiYgd2F2ZUNvbG9yICE9PSAncmdiKDI1NSwgMjU1LCAyNTUpJyAmJiBpc05vdEdyZXkod2F2ZUNvbG9yKSAmJiAhL3JnYmFcXCgoPzpcXGQqLCApezN9MFxcKS8udGVzdCh3YXZlQ29sb3IpICYmIC8vIGFueSB0cmFuc3BhcmVudCByZ2JhIGNvbG9yXG4gICAgICB3YXZlQ29sb3IgIT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICAgICAgLy8gQWRkIG5vbmNlIGlmIENTUCBleGlzdFxuICAgICAgICBpZiAoX3RoaXMuY3NwICYmIF90aGlzLmNzcC5ub25jZSkge1xuICAgICAgICAgIHN0eWxlRm9yUGVzdWRvLm5vbmNlID0gX3RoaXMuY3NwLm5vbmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXh0cmFOb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gd2F2ZUNvbG9yO1xuICAgICAgICBzdHlsZUZvclBlc3Vkby5pbm5lckhUTUwgPSBcIlxcbiAgICAgIFtcIi5jb25jYXQoZ2V0UHJlZml4Q2xzKCcnKSwgXCItY2xpY2stYW5pbWF0aW5nLXdpdGhvdXQtZXh0cmEtbm9kZT0ndHJ1ZSddOjphZnRlciwgLlwiKS5jb25jYXQoZ2V0UHJlZml4Q2xzKCcnKSwgXCItY2xpY2stYW5pbWF0aW5nLW5vZGUge1xcbiAgICAgICAgLS1hbnRkLXdhdmUtc2hhZG93LWNvbG9yOiBcIikuY29uY2F0KHdhdmVDb2xvciwgXCI7XFxuICAgICAgfVwiKTtcblxuICAgICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoc3R5bGVGb3JQZXN1ZG8pKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdHlsZUZvclBlc3Vkbyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGluc2VydEV4dHJhTm9kZSkge1xuICAgICAgICBub2RlLmFwcGVuZENoaWxkKGV4dHJhTm9kZSk7XG4gICAgICB9XG5cbiAgICAgIF9FdmVudFtcImRlZmF1bHRcIl0uYWRkU3RhcnRFdmVudExpc3RlbmVyKG5vZGUsIF90aGlzLm9uVHJhbnNpdGlvblN0YXJ0KTtcblxuICAgICAgX0V2ZW50W1wiZGVmYXVsdFwiXS5hZGRFbmRFdmVudExpc3RlbmVyKG5vZGUsIF90aGlzLm9uVHJhbnNpdGlvbkVuZCk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uVHJhbnNpdGlvblN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChfdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9kZSA9ICgwLCBfcmVhY3REb20uZmluZERPTU5vZGUpKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSk7XG5cbiAgICAgIGlmICghZSB8fCBlLnRhcmdldCAhPT0gbm9kZSB8fCBfdGhpcy5hbmltYXRpb25TdGFydCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnJlc2V0RWZmZWN0KG5vZGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vblRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFlIHx8IGUuYW5pbWF0aW9uTmFtZSAhPT0gJ2ZhZGVFZmZlY3QnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMucmVzZXRFZmZlY3QoZS50YXJnZXQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5iaW5kQW5pbWF0aW9uRXZlbnQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKCFub2RlIHx8ICFub2RlLmdldEF0dHJpYnV0ZSB8fCBub2RlLmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBub2RlLmNsYXNzTmFtZS5pbmRleE9mKCdkaXNhYmxlZCcpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgb25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAvLyBGaXggcmFkaW8gYnV0dG9uIGNsaWNrIHR3aWNlXG4gICAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGlzSGlkZGVuKGUudGFyZ2V0KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnJlc2V0RWZmZWN0KG5vZGUpOyAvLyBHZXQgd2F2ZSBjb2xvciBmcm9tIHRhcmdldFxuXG5cbiAgICAgICAgdmFyIHdhdmVDb2xvciA9IGdldENvbXB1dGVkU3R5bGUobm9kZSkuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLXRvcC1jb2xvcicpIHx8IC8vIEZpcmVmb3ggQ29tcGF0aWJsZVxuICAgICAgICBnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci1jb2xvcicpIHx8IGdldENvbXB1dGVkU3R5bGUobm9kZSkuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xuICAgICAgICBfdGhpcy5jbGlja1dhdmVUaW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm9uQ2xpY2sobm9kZSwgd2F2ZUNvbG9yKTtcbiAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgX3JhZltcImRlZmF1bHRcIl0uY2FuY2VsKF90aGlzLmFuaW1hdGlvblN0YXJ0SWQpO1xuXG4gICAgICAgIF90aGlzLmFuaW1hdGlvblN0YXJ0ID0gdHJ1ZTsgLy8gUmVuZGVyIHRvIHRyaWdnZXIgdHJhbnNpdGlvbiBldmVudCBjb3N0IDMgZnJhbWVzLiBMZXQncyBkZWxheSAxMCBmcmFtZXMgdG8gcmVzZXQgdGhpcy5cblxuICAgICAgICBfdGhpcy5hbmltYXRpb25TdGFydElkID0gKDAsIF9yYWZbXCJkZWZhdWx0XCJdKShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMuYW5pbWF0aW9uU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgfTtcblxuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJXYXZlID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBjc3AgPSBfcmVmLmNzcDtcbiAgICAgIHZhciBjaGlsZHJlbiA9IF90aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgX3RoaXMuY3NwID0gY3NwO1xuICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKFdhdmUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIG5vZGUgPSAoMCwgX3JlYWN0RG9tLmZpbmRET01Ob2RlKSh0aGlzKTtcblxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluc3RhbmNlID0gdGhpcy5iaW5kQW5pbWF0aW9uRXZlbnQobm9kZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5jYW5jZWwoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2xpY2tXYXZlVGltZW91dElkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNsaWNrV2F2ZVRpbWVvdXRJZCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QXR0cmlidXRlTmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVOYW1lKCkge1xuICAgICAgdmFyIGdldFByZWZpeENscyA9IHRoaXMuY29udGV4dC5nZXRQcmVmaXhDbHM7XG4gICAgICB2YXIgaW5zZXJ0RXh0cmFOb2RlID0gdGhpcy5wcm9wcy5pbnNlcnRFeHRyYU5vZGU7XG4gICAgICByZXR1cm4gaW5zZXJ0RXh0cmFOb2RlID8gXCJcIi5jb25jYXQoZ2V0UHJlZml4Q2xzKCcnKSwgXCItY2xpY2stYW5pbWF0aW5nXCIpIDogXCJcIi5jb25jYXQoZ2V0UHJlZml4Q2xzKCcnKSwgXCItY2xpY2stYW5pbWF0aW5nLXdpdGhvdXQtZXh0cmEtbm9kZVwiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRFZmZlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXRFZmZlY3Qobm9kZSkge1xuICAgICAgaWYgKCFub2RlIHx8IG5vZGUgPT09IHRoaXMuZXh0cmFOb2RlIHx8ICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGluc2VydEV4dHJhTm9kZSA9IHRoaXMucHJvcHMuaW5zZXJ0RXh0cmFOb2RlO1xuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsICdmYWxzZScpOyAvLyBlZGdlIGhhcyBidWcgb24gYHJlbW92ZUF0dHJpYnV0ZWAgIzE0NDY2XG5cbiAgICAgIGlmIChzdHlsZUZvclBlc3Vkbykge1xuICAgICAgICBzdHlsZUZvclBlc3Vkby5pbm5lckhUTUwgPSAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluc2VydEV4dHJhTm9kZSAmJiB0aGlzLmV4dHJhTm9kZSAmJiBub2RlLmNvbnRhaW5zKHRoaXMuZXh0cmFOb2RlKSkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKHRoaXMuZXh0cmFOb2RlKTtcbiAgICAgIH1cblxuICAgICAgX0V2ZW50W1wiZGVmYXVsdFwiXS5yZW1vdmVTdGFydEV2ZW50TGlzdGVuZXIobm9kZSwgdGhpcy5vblRyYW5zaXRpb25TdGFydCk7XG5cbiAgICAgIF9FdmVudFtcImRlZmF1bHRcIl0ucmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCB0aGlzLm9uVHJhbnNpdGlvbkVuZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCB0aGlzLnJlbmRlcldhdmUpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gV2F2ZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBXYXZlO1xuV2F2ZS5jb250ZXh0VHlwZSA9IF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfcmNSZXNpemVPYnNlcnZlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXJlc2l6ZS1vYnNlcnZlclwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX3Rocm90dGxlQnlBbmltYXRpb25GcmFtZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC90aHJvdHRsZUJ5QW5pbWF0aW9uRnJhbWVcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcblxudmFyIF9fZGVjb3JhdGUgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19kZWNvcmF0ZSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsXG4gICAgICBkO1xuICBpZiAoKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6ICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKFJlZmxlY3QpKSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7ZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIH1cbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRUYXJnZXQoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IG51bGw7XG59XG5cbnZhciBBZmZpeFN0YXR1cztcblxuKGZ1bmN0aW9uIChBZmZpeFN0YXR1cykge1xuICBBZmZpeFN0YXR1c1tBZmZpeFN0YXR1c1tcIk5vbmVcIl0gPSAwXSA9IFwiTm9uZVwiO1xuICBBZmZpeFN0YXR1c1tBZmZpeFN0YXR1c1tcIlByZXBhcmVcIl0gPSAxXSA9IFwiUHJlcGFyZVwiO1xufSkoQWZmaXhTdGF0dXMgfHwgKEFmZml4U3RhdHVzID0ge30pKTtcblxudmFyIEFmZml4ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoQWZmaXgsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKEFmZml4KTtcblxuICBmdW5jdGlvbiBBZmZpeCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIEFmZml4KTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgc3RhdHVzOiBBZmZpeFN0YXR1cy5Ob25lLFxuICAgICAgbGFzdEFmZml4OiBmYWxzZSxcbiAgICAgIHByZXZUYXJnZXQ6IG51bGxcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0T2Zmc2V0VG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9mZnNldEJvdHRvbSA9IF90aGlzLnByb3BzLm9mZnNldEJvdHRvbTtcbiAgICAgIHZhciBvZmZzZXRUb3AgPSBfdGhpcy5wcm9wcy5vZmZzZXRUb3A7XG5cbiAgICAgIGlmIChvZmZzZXRCb3R0b20gPT09IHVuZGVmaW5lZCAmJiBvZmZzZXRUb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvZmZzZXRUb3AgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0VG9wO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRPZmZzZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMub2Zmc2V0Qm90dG9tO1xuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlUGxhY2Vob2xkZXJOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLnBsYWNlaG9sZGVyTm9kZSA9IG5vZGU7XG4gICAgfTtcblxuICAgIF90aGlzLnNhdmVGaXhlZE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMuZml4ZWROb2RlID0gbm9kZTtcbiAgICB9OyAvLyA9PT09PT09PT09PT09PT09PT09IE1lYXN1cmUgPT09PT09PT09PT09PT09PT09PVxuXG5cbiAgICBfdGhpcy5tZWFzdXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgc3RhdHVzID0gX3RoaXMkc3RhdGUuc3RhdHVzLFxuICAgICAgICAgIGxhc3RBZmZpeCA9IF90aGlzJHN0YXRlLmxhc3RBZmZpeDtcbiAgICAgIHZhciBvbkNoYW5nZSA9IF90aGlzLnByb3BzLm9uQ2hhbmdlO1xuXG4gICAgICB2YXIgdGFyZ2V0RnVuYyA9IF90aGlzLmdldFRhcmdldEZ1bmMoKTtcblxuICAgICAgaWYgKHN0YXR1cyAhPT0gQWZmaXhTdGF0dXMuUHJlcGFyZSB8fCAhX3RoaXMuZml4ZWROb2RlIHx8ICFfdGhpcy5wbGFjZWhvbGRlck5vZGUgfHwgIXRhcmdldEZ1bmMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgb2Zmc2V0VG9wID0gX3RoaXMuZ2V0T2Zmc2V0VG9wKCk7XG5cbiAgICAgIHZhciBvZmZzZXRCb3R0b20gPSBfdGhpcy5nZXRPZmZzZXRCb3R0b20oKTtcblxuICAgICAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRGdW5jKCk7XG5cbiAgICAgIGlmICghdGFyZ2V0Tm9kZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAgICAgc3RhdHVzOiBBZmZpeFN0YXR1cy5Ob25lXG4gICAgICB9O1xuICAgICAgdmFyIHRhcmdldFJlY3QgPSAoMCwgX3V0aWxzLmdldFRhcmdldFJlY3QpKHRhcmdldE5vZGUpO1xuICAgICAgdmFyIHBsYWNlaG9sZGVyUmVhY3QgPSAoMCwgX3V0aWxzLmdldFRhcmdldFJlY3QpKF90aGlzLnBsYWNlaG9sZGVyTm9kZSk7XG4gICAgICB2YXIgZml4ZWRUb3AgPSAoMCwgX3V0aWxzLmdldEZpeGVkVG9wKShwbGFjZWhvbGRlclJlYWN0LCB0YXJnZXRSZWN0LCBvZmZzZXRUb3ApO1xuICAgICAgdmFyIGZpeGVkQm90dG9tID0gKDAsIF91dGlscy5nZXRGaXhlZEJvdHRvbSkocGxhY2Vob2xkZXJSZWFjdCwgdGFyZ2V0UmVjdCwgb2Zmc2V0Qm90dG9tKTtcblxuICAgICAgaWYgKGZpeGVkVG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3U3RhdGUuYWZmaXhTdHlsZSA9IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICB0b3A6IGZpeGVkVG9wLFxuICAgICAgICAgIHdpZHRoOiBwbGFjZWhvbGRlclJlYWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogcGxhY2Vob2xkZXJSZWFjdC5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgbmV3U3RhdGUucGxhY2Vob2xkZXJTdHlsZSA9IHtcbiAgICAgICAgICB3aWR0aDogcGxhY2Vob2xkZXJSZWFjdC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHBsYWNlaG9sZGVyUmVhY3QuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGZpeGVkQm90dG9tICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3U3RhdGUuYWZmaXhTdHlsZSA9IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICBib3R0b206IGZpeGVkQm90dG9tLFxuICAgICAgICAgIHdpZHRoOiBwbGFjZWhvbGRlclJlYWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogcGxhY2Vob2xkZXJSZWFjdC5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgbmV3U3RhdGUucGxhY2Vob2xkZXJTdHlsZSA9IHtcbiAgICAgICAgICB3aWR0aDogcGxhY2Vob2xkZXJSZWFjdC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHBsYWNlaG9sZGVyUmVhY3QuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5ld1N0YXRlLmxhc3RBZmZpeCA9ICEhbmV3U3RhdGUuYWZmaXhTdHlsZTtcblxuICAgICAgaWYgKG9uQ2hhbmdlICYmIGxhc3RBZmZpeCAhPT0gbmV3U3RhdGUubGFzdEFmZml4KSB7XG4gICAgICAgIG9uQ2hhbmdlKG5ld1N0YXRlLmxhc3RBZmZpeCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9OyAvLyBAdHMtaWdub3JlIFRTNjEzM1xuXG5cbiAgICBfdGhpcy5wcmVwYXJlTWVhc3VyZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGV2ZW50IHBhcmFtIGlzIHVzZWQgYmVmb3JlLiBLZWVwIGNvbXBhdGlibGUgdHMgZGVmaW5lIGhlcmUuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHN0YXR1czogQWZmaXhTdGF0dXMuUHJlcGFyZSxcbiAgICAgICAgYWZmaXhTdHlsZTogdW5kZWZpbmVkLFxuICAgICAgICBwbGFjZWhvbGRlclN0eWxlOiB1bmRlZmluZWRcbiAgICAgIH0pOyAvLyBUZXN0IGlmIGB1cGRhdGVQb3NpdGlvbmAgY2FsbGVkXG5cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgICAgICAgdmFyIG9uVGVzdFVwZGF0ZVBvc2l0aW9uID0gX3RoaXMucHJvcHMub25UZXN0VXBkYXRlUG9zaXRpb247XG5cbiAgICAgICAgaWYgKG9uVGVzdFVwZGF0ZVBvc2l0aW9uKSB7XG4gICAgICAgICAgb25UZXN0VXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07IC8vID09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT1cblxuXG4gICAgX3RoaXMucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGdldFByZWZpeENscyA9IF90aGlzLmNvbnRleHQuZ2V0UHJlZml4Q2xzO1xuICAgICAgdmFyIF90aGlzJHN0YXRlMiA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGFmZml4U3R5bGUgPSBfdGhpcyRzdGF0ZTIuYWZmaXhTdHlsZSxcbiAgICAgICAgICBwbGFjZWhvbGRlclN0eWxlID0gX3RoaXMkc3RhdGUyLnBsYWNlaG9sZGVyU3R5bGU7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBjbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBnZXRQcmVmaXhDbHMoJ2FmZml4JywgcHJlZml4Q2xzKSwgYWZmaXhTdHlsZSkpO1xuICAgICAgdmFyIHByb3BzID0gKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkoX3RoaXMucHJvcHMsIFsncHJlZml4Q2xzJywgJ29mZnNldFRvcCcsICdvZmZzZXRCb3R0b20nLCAndGFyZ2V0JywgJ29uQ2hhbmdlJ10pOyAvLyBPbWl0IHRoaXMgc2luY2UgYG9uVGVzdFVwZGF0ZVBvc2l0aW9uYCBvbmx5IHdvcmtzIG9uIHRlc3QuXG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICAgIHByb3BzID0gKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkocHJvcHMsIFsnb25UZXN0VXBkYXRlUG9zaXRpb24nXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNSZXNpemVPYnNlcnZlcltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgb25SZXNpemU6IGZ1bmN0aW9uIG9uUmVzaXplKCkge1xuICAgICAgICAgIF90aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcHJvcHMsIHtcbiAgICAgICAgcmVmOiBfdGhpcy5zYXZlUGxhY2Vob2xkZXJOb2RlXG4gICAgICB9KSwgYWZmaXhTdHlsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBwbGFjZWhvbGRlclN0eWxlLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgcmVmOiBfdGhpcy5zYXZlRml4ZWROb2RlLFxuICAgICAgICBzdHlsZTogYWZmaXhTdHlsZVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjUmVzaXplT2JzZXJ2ZXJbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgIG9uUmVzaXplOiBmdW5jdGlvbiBvblJlc2l6ZSgpIHtcbiAgICAgICAgICBfdGhpcy51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9LCBjaGlsZHJlbikpKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoQWZmaXgsIFt7XG4gICAga2V5OiBcImdldFRhcmdldEZ1bmNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGFyZ2V0RnVuYygpIHtcbiAgICAgIHZhciBnZXRUYXJnZXRDb250YWluZXIgPSB0aGlzLmNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyO1xuICAgICAgdmFyIHRhcmdldCA9IHRoaXMucHJvcHMudGFyZ2V0O1xuXG4gICAgICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGdldFRhcmdldENvbnRhaW5lciB8fCBnZXREZWZhdWx0VGFyZ2V0O1xuICAgIH0gLy8gRXZlbnQgaGFuZGxlclxuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHRhcmdldEZ1bmMgPSB0aGlzLmdldFRhcmdldEZ1bmMoKTtcblxuICAgICAgaWYgKHRhcmdldEZ1bmMpIHtcbiAgICAgICAgLy8gW0xlZ2FjeV0gV2FpdCBmb3IgcGFyZW50IGNvbXBvbmVudCByZWYgaGFzIGl0cyB2YWx1ZS5cbiAgICAgICAgLy8gV2Ugc2hvdWxkIHVzZSB0YXJnZXQgYXMgZGlyZWN0bHkgZWxlbWVudCBpbnN0ZWFkIG9mIGZ1bmN0aW9uIHdoaWNoIG1ha2VzIGVsZW1lbnQgY2hlY2sgaGFyZC5cbiAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgKDAsIF91dGlscy5hZGRPYnNlcnZlVGFyZ2V0KSh0YXJnZXRGdW5jKCksIF90aGlzMik7IC8vIE1vY2sgRXZlbnQgb2JqZWN0LlxuXG4gICAgICAgICAgX3RoaXMyLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdmFyIHByZXZUYXJnZXQgPSB0aGlzLnN0YXRlLnByZXZUYXJnZXQ7XG4gICAgICB2YXIgdGFyZ2V0RnVuYyA9IHRoaXMuZ2V0VGFyZ2V0RnVuYygpO1xuICAgICAgdmFyIG5ld1RhcmdldCA9IG51bGw7XG5cbiAgICAgIGlmICh0YXJnZXRGdW5jKSB7XG4gICAgICAgIG5ld1RhcmdldCA9IHRhcmdldEZ1bmMoKSB8fCBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldlRhcmdldCAhPT0gbmV3VGFyZ2V0KSB7XG4gICAgICAgICgwLCBfdXRpbHMucmVtb3ZlT2JzZXJ2ZVRhcmdldCkodGhpcyk7XG5cbiAgICAgICAgaWYgKG5ld1RhcmdldCkge1xuICAgICAgICAgICgwLCBfdXRpbHMuYWRkT2JzZXJ2ZVRhcmdldCkobmV3VGFyZ2V0LCB0aGlzKTsgLy8gTW9jayBFdmVudCBvYmplY3QuXG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRpZC11cGRhdGUtc2V0LXN0YXRlXG5cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBwcmV2VGFyZ2V0OiBuZXdUYXJnZXRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2UHJvcHMub2Zmc2V0VG9wICE9PSB0aGlzLnByb3BzLm9mZnNldFRvcCB8fCBwcmV2UHJvcHMub2Zmc2V0Qm90dG9tICE9PSB0aGlzLnByb3BzLm9mZnNldEJvdHRvbSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWVhc3VyZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgKDAsIF91dGlscy5yZW1vdmVPYnNlcnZlVGFyZ2V0KSh0aGlzKTtcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24uY2FuY2VsKCk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIyNjgzXG5cbiAgICAgIHRoaXMubGF6eVVwZGF0ZVBvc2l0aW9uLmNhbmNlbCgpO1xuICAgIH0gLy8gSGFuZGxlIHJlYWxpZ24gbG9naWNcblxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9uKCkge1xuICAgICAgdGhpcy5wcmVwYXJlTWVhc3VyZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsYXp5VXBkYXRlUG9zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGF6eVVwZGF0ZVBvc2l0aW9uKCkge1xuICAgICAgdmFyIHRhcmdldEZ1bmMgPSB0aGlzLmdldFRhcmdldEZ1bmMoKTtcbiAgICAgIHZhciBhZmZpeFN0eWxlID0gdGhpcy5zdGF0ZS5hZmZpeFN0eWxlOyAvLyBDaGVjayBwb3NpdGlvbiBjaGFuZ2UgYmVmb3JlIG1lYXN1cmUgdG8gbWFrZSBTYWZhcmkgc21vb3RoXG5cbiAgICAgIGlmICh0YXJnZXRGdW5jICYmIGFmZml4U3R5bGUpIHtcbiAgICAgICAgdmFyIG9mZnNldFRvcCA9IHRoaXMuZ2V0T2Zmc2V0VG9wKCk7XG4gICAgICAgIHZhciBvZmZzZXRCb3R0b20gPSB0aGlzLmdldE9mZnNldEJvdHRvbSgpO1xuICAgICAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEZ1bmMoKTtcblxuICAgICAgICBpZiAodGFyZ2V0Tm9kZSAmJiB0aGlzLnBsYWNlaG9sZGVyTm9kZSkge1xuICAgICAgICAgIHZhciB0YXJnZXRSZWN0ID0gKDAsIF91dGlscy5nZXRUYXJnZXRSZWN0KSh0YXJnZXROb2RlKTtcbiAgICAgICAgICB2YXIgcGxhY2Vob2xkZXJSZWFjdCA9ICgwLCBfdXRpbHMuZ2V0VGFyZ2V0UmVjdCkodGhpcy5wbGFjZWhvbGRlck5vZGUpO1xuICAgICAgICAgIHZhciBmaXhlZFRvcCA9ICgwLCBfdXRpbHMuZ2V0Rml4ZWRUb3ApKHBsYWNlaG9sZGVyUmVhY3QsIHRhcmdldFJlY3QsIG9mZnNldFRvcCk7XG4gICAgICAgICAgdmFyIGZpeGVkQm90dG9tID0gKDAsIF91dGlscy5nZXRGaXhlZEJvdHRvbSkocGxhY2Vob2xkZXJSZWFjdCwgdGFyZ2V0UmVjdCwgb2Zmc2V0Qm90dG9tKTtcblxuICAgICAgICAgIGlmIChmaXhlZFRvcCAhPT0gdW5kZWZpbmVkICYmIGFmZml4U3R5bGUudG9wID09PSBmaXhlZFRvcCB8fCBmaXhlZEJvdHRvbSAhPT0gdW5kZWZpbmVkICYmIGFmZml4U3R5bGUuYm90dG9tID09PSBmaXhlZEJvdHRvbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBEaXJlY3RseSBjYWxsIHByZXBhcmUgbWVhc3VyZSBzaW5jZSBpdCdzIGFscmVhZHkgdGhyb3R0bGVkLlxuXG5cbiAgICAgIHRoaXMucHJlcGFyZU1lYXN1cmUoKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEFmZml4O1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5BZmZpeC5jb250ZXh0VHlwZSA9IF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0O1xuXG5fX2RlY29yYXRlKFsoMCwgX3Rocm90dGxlQnlBbmltYXRpb25GcmFtZS50aHJvdHRsZUJ5QW5pbWF0aW9uRnJhbWVEZWNvcmF0b3IpKCldLCBBZmZpeC5wcm90b3R5cGUsIFwidXBkYXRlUG9zaXRpb25cIiwgbnVsbCk7XG5cbl9fZGVjb3JhdGUoWygwLCBfdGhyb3R0bGVCeUFuaW1hdGlvbkZyYW1lLnRocm90dGxlQnlBbmltYXRpb25GcmFtZURlY29yYXRvcikoKV0sIEFmZml4LnByb3RvdHlwZSwgXCJsYXp5VXBkYXRlUG9zaXRpb25cIiwgbnVsbCk7XG5cbnZhciBfZGVmYXVsdCA9IEFmZml4O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldFRhcmdldFJlY3QgPSBnZXRUYXJnZXRSZWN0O1xuZXhwb3J0cy5nZXRGaXhlZFRvcCA9IGdldEZpeGVkVG9wO1xuZXhwb3J0cy5nZXRGaXhlZEJvdHRvbSA9IGdldEZpeGVkQm90dG9tO1xuZXhwb3J0cy5nZXRPYnNlcnZlckVudGl0aWVzID0gZ2V0T2JzZXJ2ZXJFbnRpdGllcztcbmV4cG9ydHMuYWRkT2JzZXJ2ZVRhcmdldCA9IGFkZE9ic2VydmVUYXJnZXQ7XG5leHBvcnRzLnJlbW92ZU9ic2VydmVUYXJnZXQgPSByZW1vdmVPYnNlcnZlVGFyZ2V0O1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiKSk7XG5cbmZ1bmN0aW9uIGdldFRhcmdldFJlY3QodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgIT09IHdpbmRvdyA/IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IHtcbiAgICB0b3A6IDAsXG4gICAgYm90dG9tOiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Rml4ZWRUb3AocGxhY2Vob2xkZXJSZWFjdCwgdGFyZ2V0UmVjdCwgb2Zmc2V0VG9wKSB7XG4gIGlmIChvZmZzZXRUb3AgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRSZWN0LnRvcCA+IHBsYWNlaG9sZGVyUmVhY3QudG9wIC0gb2Zmc2V0VG9wKSB7XG4gICAgcmV0dXJuIG9mZnNldFRvcCArIHRhcmdldFJlY3QudG9wO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0Rml4ZWRCb3R0b20ocGxhY2Vob2xkZXJSZWFjdCwgdGFyZ2V0UmVjdCwgb2Zmc2V0Qm90dG9tKSB7XG4gIGlmIChvZmZzZXRCb3R0b20gIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRSZWN0LmJvdHRvbSA8IHBsYWNlaG9sZGVyUmVhY3QuYm90dG9tICsgb2Zmc2V0Qm90dG9tKSB7XG4gICAgdmFyIHRhcmdldEJvdHRvbU9mZnNldCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRhcmdldFJlY3QuYm90dG9tO1xuICAgIHJldHVybiBvZmZzZXRCb3R0b20gKyB0YXJnZXRCb3R0b21PZmZzZXQ7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gT2JzZXJ2ZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG5cblxudmFyIFRSSUdHRVJfRVZFTlRTID0gWydyZXNpemUnLCAnc2Nyb2xsJywgJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJywgJ3BhZ2VzaG93JywgJ2xvYWQnXTtcbnZhciBvYnNlcnZlckVudGl0aWVzID0gW107XG5cbmZ1bmN0aW9uIGdldE9ic2VydmVyRW50aXRpZXMoKSB7XG4gIC8vIE9ubHkgdXNlZCBpbiB0ZXN0IGVudi4gQ2FuIGJlIHJlbW92ZWQgaWYgcmVmYWN0b3IuXG4gIHJldHVybiBvYnNlcnZlckVudGl0aWVzO1xufVxuXG5mdW5jdGlvbiBhZGRPYnNlcnZlVGFyZ2V0KHRhcmdldCwgYWZmaXgpIHtcbiAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgdmFyIGVudGl0eSA9IG9ic2VydmVyRW50aXRpZXMuZmluZChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBpdGVtLnRhcmdldCA9PT0gdGFyZ2V0O1xuICB9KTtcblxuICBpZiAoZW50aXR5KSB7XG4gICAgZW50aXR5LmFmZml4TGlzdC5wdXNoKGFmZml4KTtcbiAgfSBlbHNlIHtcbiAgICBlbnRpdHkgPSB7XG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIGFmZml4TGlzdDogW2FmZml4XSxcbiAgICAgIGV2ZW50SGFuZGxlcnM6IHt9XG4gICAgfTtcbiAgICBvYnNlcnZlckVudGl0aWVzLnB1c2goZW50aXR5KTsgLy8gQWRkIGxpc3RlbmVyXG5cbiAgICBUUklHR0VSX0VWRU5UUy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgIGVudGl0eS5ldmVudEhhbmRsZXJzW2V2ZW50TmFtZV0gPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXJbXCJkZWZhdWx0XCJdKSh0YXJnZXQsIGV2ZW50TmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBlbnRpdHkuYWZmaXhMaXN0LmZvckVhY2goZnVuY3Rpb24gKHRhcmdldEFmZml4KSB7XG4gICAgICAgICAgdGFyZ2V0QWZmaXgubGF6eVVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlT2JzZXJ2ZVRhcmdldChhZmZpeCkge1xuICB2YXIgb2JzZXJ2ZXJFbnRpdHkgPSBvYnNlcnZlckVudGl0aWVzLmZpbmQoZnVuY3Rpb24gKG9yaU9ic2VydmVyRW50aXR5KSB7XG4gICAgdmFyIGhhc0FmZml4ID0gb3JpT2JzZXJ2ZXJFbnRpdHkuYWZmaXhMaXN0LnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtID09PSBhZmZpeDtcbiAgICB9KTtcblxuICAgIGlmIChoYXNBZmZpeCkge1xuICAgICAgb3JpT2JzZXJ2ZXJFbnRpdHkuYWZmaXhMaXN0ID0gb3JpT2JzZXJ2ZXJFbnRpdHkuYWZmaXhMaXN0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbSAhPT0gYWZmaXg7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzQWZmaXg7XG4gIH0pO1xuXG4gIGlmIChvYnNlcnZlckVudGl0eSAmJiBvYnNlcnZlckVudGl0eS5hZmZpeExpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgb2JzZXJ2ZXJFbnRpdGllcyA9IG9ic2VydmVyRW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbSAhPT0gb2JzZXJ2ZXJFbnRpdHk7XG4gICAgfSk7IC8vIFJlbW92ZSBsaXN0ZW5lclxuXG4gICAgVFJJR0dFUl9FVkVOVFMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9ic2VydmVyRW50aXR5LmV2ZW50SGFuZGxlcnNbZXZlbnROYW1lXTtcblxuICAgICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlci5yZW1vdmUpIHtcbiAgICAgICAgaGFuZGxlci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgXyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi5cIikpO1xuXG52YXIgRXJyb3JCb3VuZGFyeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKEVycm9yQm91bmRhcnksIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKEVycm9yQm91bmRhcnkpO1xuXG4gIGZ1bmN0aW9uIEVycm9yQm91bmRhcnkoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBFcnJvckJvdW5kYXJ5KTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgIGluZm86IHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6ICcnXG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKEVycm9yQm91bmRhcnksIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZENhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBpbmZvKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICBpbmZvOiBpbmZvXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgbWVzc2FnZSA9IF90aGlzJHByb3BzLm1lc3NhZ2UsXG4gICAgICAgICAgZGVzY3JpcHRpb24gPSBfdGhpcyRwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBlcnJvciA9IF90aGlzJHN0YXRlLmVycm9yLFxuICAgICAgICAgIGluZm8gPSBfdGhpcyRzdGF0ZS5pbmZvO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gaW5mbyAmJiBpbmZvLmNvbXBvbmVudFN0YWNrID8gaW5mby5jb21wb25lbnRTdGFjayA6IG51bGw7XG4gICAgICB2YXIgZXJyb3JNZXNzYWdlID0gdHlwZW9mIG1lc3NhZ2UgPT09ICd1bmRlZmluZWQnID8gKGVycm9yIHx8ICcnKS50b1N0cmluZygpIDogbWVzc2FnZTtcbiAgICAgIHZhciBlcnJvckRlc2NyaXB0aW9uID0gdHlwZW9mIGRlc2NyaXB0aW9uID09PSAndW5kZWZpbmVkJyA/IGNvbXBvbmVudFN0YWNrIDogZGVzY3JpcHRpb247XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1tcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInByZVwiLCBudWxsLCBlcnJvckRlc2NyaXB0aW9uKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRXJyb3JCb3VuZGFyeTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBFcnJvckJvdW5kYXJ5OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfQ2xvc2VPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlT3V0bGluZWRcIikpO1xuXG52YXIgX0NoZWNrQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DaGVja0NpcmNsZU91dGxpbmVkXCIpKTtcblxudmFyIF9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZFwiKSk7XG5cbnZhciBfSW5mb0NpcmNsZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvSW5mb0NpcmNsZU91dGxpbmVkXCIpKTtcblxudmFyIF9DbG9zZUNpcmNsZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVPdXRsaW5lZFwiKSk7XG5cbnZhciBfQ2hlY2tDaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DaGVja0NpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfSW5mb0NpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0luZm9DaXJjbGVGaWxsZWRcIikpO1xuXG52YXIgX0Nsb3NlQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIikpO1xuXG52YXIgX3JjTW90aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtbW90aW9uXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX2dldERhdGFPckFyaWFQcm9wcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2dldERhdGFPckFyaWFQcm9wc1wiKSk7XG5cbnZhciBfRXJyb3JCb3VuZGFyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRXJyb3JCb3VuZGFyeVwiKSk7XG5cbnZhciBfcmVhY3ROb2RlID0gcmVxdWlyZShcIi4uL191dGlsL3JlYWN0Tm9kZVwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBpY29uTWFwRmlsbGVkID0ge1xuICBzdWNjZXNzOiBfQ2hlY2tDaXJjbGVGaWxsZWRbXCJkZWZhdWx0XCJdLFxuICBpbmZvOiBfSW5mb0NpcmNsZUZpbGxlZFtcImRlZmF1bHRcIl0sXG4gIGVycm9yOiBfQ2xvc2VDaXJjbGVGaWxsZWRbXCJkZWZhdWx0XCJdLFxuICB3YXJuaW5nOiBfRXhjbGFtYXRpb25DaXJjbGVGaWxsZWRbXCJkZWZhdWx0XCJdXG59O1xudmFyIGljb25NYXBPdXRsaW5lZCA9IHtcbiAgc3VjY2VzczogX0NoZWNrQ2lyY2xlT3V0bGluZWRbXCJkZWZhdWx0XCJdLFxuICBpbmZvOiBfSW5mb0NpcmNsZU91dGxpbmVkW1wiZGVmYXVsdFwiXSxcbiAgZXJyb3I6IF9DbG9zZUNpcmNsZU91dGxpbmVkW1wiZGVmYXVsdFwiXSxcbiAgd2FybmluZzogX0V4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWRbXCJkZWZhdWx0XCJdXG59O1xuXG52YXIgQWxlcnQgPSBmdW5jdGlvbiBBbGVydChfYSkge1xuICB2YXIgX2NsYXNzTmFtZXMyO1xuXG4gIHZhciBkZXNjcmlwdGlvbiA9IF9hLmRlc2NyaXB0aW9uLFxuICAgICAgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgbWVzc2FnZSA9IF9hLm1lc3NhZ2UsXG4gICAgICBiYW5uZXIgPSBfYS5iYW5uZXIsXG4gICAgICBfYSRjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgICBjbGFzc05hbWUgPSBfYSRjbGFzc05hbWUgPT09IHZvaWQgMCA/ICcnIDogX2EkY2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfYS5zdHlsZSxcbiAgICAgIG9uTW91c2VFbnRlciA9IF9hLm9uTW91c2VFbnRlcixcbiAgICAgIG9uTW91c2VMZWF2ZSA9IF9hLm9uTW91c2VMZWF2ZSxcbiAgICAgIG9uQ2xpY2sgPSBfYS5vbkNsaWNrLFxuICAgICAgYWZ0ZXJDbG9zZSA9IF9hLmFmdGVyQ2xvc2UsXG4gICAgICBzaG93SWNvbiA9IF9hLnNob3dJY29uLFxuICAgICAgY2xvc2FibGUgPSBfYS5jbG9zYWJsZSxcbiAgICAgIGNsb3NlVGV4dCA9IF9hLmNsb3NlVGV4dCxcbiAgICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJkZXNjcmlwdGlvblwiLCBcInByZWZpeENsc1wiLCBcIm1lc3NhZ2VcIiwgXCJiYW5uZXJcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcIm9uTW91c2VFbnRlclwiLCBcIm9uTW91c2VMZWF2ZVwiLCBcIm9uQ2xpY2tcIiwgXCJhZnRlckNsb3NlXCIsIFwic2hvd0ljb25cIiwgXCJjbG9zYWJsZVwiLCBcImNsb3NlVGV4dFwiXSk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGNsb3NlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRDbG9zZWQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciByZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdhbGVydCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG5cbiAgdmFyIGhhbmRsZUNsb3NlID0gZnVuY3Rpb24gaGFuZGxlQ2xvc2UoZSkge1xuICAgIHZhciBfYTtcblxuICAgIHNldENsb3NlZCh0cnVlKTtcbiAgICAoX2EgPSBwcm9wcy5vbkNsb3NlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChwcm9wcywgZSk7XG4gIH07XG5cbiAgdmFyIGdldFR5cGUgPSBmdW5jdGlvbiBnZXRUeXBlKCkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcblxuICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gYmFubmVyIOaooeW8j+m7mOiupOS4uuitpuWRilxuXG5cbiAgICByZXR1cm4gYmFubmVyID8gJ3dhcm5pbmcnIDogJ2luZm8nO1xuICB9OyAvLyBjbG9zZWFibGUgd2hlbiBjbG9zZVRleHQgaXMgYXNzaWduZWRcblxuXG4gIHZhciBpc0Nsb3NhYmxlID0gY2xvc2VUZXh0ID8gdHJ1ZSA6IGNsb3NhYmxlO1xuICB2YXIgdHlwZSA9IGdldFR5cGUoKTtcblxuICB2YXIgcmVuZGVySWNvbk5vZGUgPSBmdW5jdGlvbiByZW5kZXJJY29uTm9kZSgpIHtcbiAgICB2YXIgaWNvbiA9IHByb3BzLmljb247IC8vIHVzZSBvdXRsaW5lIGljb24gaW4gYWxlcnQgd2l0aCBkZXNjcmlwdGlvblxuXG4gICAgdmFyIGljb25UeXBlID0gKGRlc2NyaXB0aW9uID8gaWNvbk1hcE91dGxpbmVkIDogaWNvbk1hcEZpbGxlZClbdHlwZV0gfHwgbnVsbDtcblxuICAgIGlmIChpY29uKSB7XG4gICAgICByZXR1cm4gKDAsIF9yZWFjdE5vZGUucmVwbGFjZUVsZW1lbnQpKGljb24sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uXCIpXG4gICAgICB9LCBpY29uKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uXCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBpY29uLnByb3BzLmNsYXNzTmFtZSwgaWNvbi5wcm9wcy5jbGFzc05hbWUpKVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGljb25UeXBlLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvblwiKVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciByZW5kZXJDbG9zZUljb24gPSBmdW5jdGlvbiByZW5kZXJDbG9zZUljb24oKSB7XG4gICAgcmV0dXJuIGlzQ2xvc2FibGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgb25DbGljazogaGFuZGxlQ2xvc2UsXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xvc2UtaWNvblwiKSxcbiAgICAgIHRhYkluZGV4OiAwXG4gICAgfSwgY2xvc2VUZXh0ID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbG9zZS10ZXh0XCIpXG4gICAgfSwgY2xvc2VUZXh0KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbG9zZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCkpIDogbnVsbDtcbiAgfTsgLy8gYmFubmVyIOaooeW8j+m7mOiupOaciSBJY29uXG5cblxuICB2YXIgaXNTaG93SWNvbiA9IGJhbm5lciAmJiBzaG93SWNvbiA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHNob3dJY29uO1xuICB2YXIgYWxlcnRDbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdCh0eXBlKSwgKF9jbGFzc05hbWVzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13aXRoLWRlc2NyaXB0aW9uXCIpLCAhIWRlc2NyaXB0aW9uKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbm8taWNvblwiKSwgIWlzU2hvd0ljb24pLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1iYW5uZXJcIiksICEhYmFubmVyKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xvc2FibGVcIiksIGlzQ2xvc2FibGUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lczIpLCBjbGFzc05hbWUpO1xuICB2YXIgZGF0YU9yQXJpYVByb3BzID0gKDAsIF9nZXREYXRhT3JBcmlhUHJvcHNbXCJkZWZhdWx0XCJdKShwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNNb3Rpb25bXCJkZWZhdWx0XCJdLCB7XG4gICAgdmlzaWJsZTogIWNsb3NlZCxcbiAgICBtb3Rpb25OYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1vdGlvblwiKSxcbiAgICBtb3Rpb25BcHBlYXI6IGZhbHNlLFxuICAgIG1vdGlvbkVudGVyOiBmYWxzZSxcbiAgICBvbkxlYXZlU3RhcnQ6IGZ1bmN0aW9uIG9uTGVhdmVTdGFydChub2RlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXhIZWlnaHQ6IG5vZGUub2Zmc2V0SGVpZ2h0XG4gICAgICB9O1xuICAgIH0sXG4gICAgb25MZWF2ZUVuZDogYWZ0ZXJDbG9zZVxuICB9LCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBtb3Rpb25DbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgICAgbW90aW9uU3R5bGUgPSBfcmVmLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgcmVmOiByZWYsXG4gICAgICBcImRhdGEtc2hvd1wiOiAhY2xvc2VkLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShhbGVydENscywgbW90aW9uQ2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBzdHlsZSksIG1vdGlvblN0eWxlKSxcbiAgICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyLFxuICAgICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgICAgcm9sZTogXCJhbGVydFwiXG4gICAgfSwgZGF0YU9yQXJpYVByb3BzKSwgaXNTaG93SWNvbiA/IHJlbmRlckljb25Ob2RlKCkgOiBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lc3NhZ2VcIilcbiAgICB9LCBtZXNzYWdlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kZXNjcmlwdGlvblwiKVxuICAgIH0sIGRlc2NyaXB0aW9uKSwgcmVuZGVyQ2xvc2VJY29uKCkpO1xuICB9KTtcbn07XG5cbkFsZXJ0LkVycm9yQm91bmRhcnkgPSBfRXJyb3JCb3VuZGFyeVtcImRlZmF1bHRcIl07XG52YXIgX2RlZmF1bHQgPSBBbGVydDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBSZWFjdERPTSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9hZGRFdmVudExpc3RlbmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2FkZEV2ZW50TGlzdGVuZXJcIikpO1xuXG52YXIgX2FmZml4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vYWZmaXhcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9zY3JvbGxUbyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL3Njcm9sbFRvXCIpKTtcblxudmFyIF9nZXRTY3JvbGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC9nZXRTY3JvbGxcIikpO1xuXG52YXIgX2NvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NvbnRleHRcIikpO1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0Q29udGFpbmVyKCkge1xuICByZXR1cm4gd2luZG93O1xufVxuXG5mdW5jdGlvbiBnZXRPZmZzZXRUb3AoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gIGlmICghZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIGlmIChyZWN0LndpZHRoIHx8IHJlY3QuaGVpZ2h0KSB7XG4gICAgaWYgKGNvbnRhaW5lciA9PT0gd2luZG93KSB7XG4gICAgICBjb250YWluZXIgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgcmV0dXJuIHJlY3QudG9wIC0gY29udGFpbmVyLmNsaWVudFRvcDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjdC50b3AgLSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICB9XG5cbiAgcmV0dXJuIHJlY3QudG9wO1xufVxuXG52YXIgc2hhcnBNYXRjaGVyUmVneCA9IC8jKFxcUyspJC87XG5cbnZhciBBbmNob3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShBbmNob3IsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKEFuY2hvcik7XG5cbiAgZnVuY3Rpb24gQW5jaG9yKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgQW5jaG9yKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgYWN0aXZlTGluazogbnVsbFxuICAgIH07XG4gICAgX3RoaXMubGlua3MgPSBbXTsgLy8gQ29udGV4dFxuXG4gICAgX3RoaXMucmVnaXN0ZXJMaW5rID0gZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgIGlmICghX3RoaXMubGlua3MuaW5jbHVkZXMobGluaykpIHtcbiAgICAgICAgX3RoaXMubGlua3MucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMudW5yZWdpc3RlckxpbmsgPSBmdW5jdGlvbiAobGluaykge1xuICAgICAgdmFyIGluZGV4ID0gX3RoaXMubGlua3MuaW5kZXhPZihsaW5rKTtcblxuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBfdGhpcy5saW5rcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5nZXRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZ2V0VGFyZ2V0Q29udGFpbmVyID0gX3RoaXMuY29udGV4dC5nZXRUYXJnZXRDb250YWluZXI7XG4gICAgICB2YXIgZ2V0Q29udGFpbmVyID0gX3RoaXMucHJvcHMuZ2V0Q29udGFpbmVyO1xuICAgICAgdmFyIGdldEZ1bmMgPSBnZXRDb250YWluZXIgfHwgZ2V0VGFyZ2V0Q29udGFpbmVyIHx8IGdldERlZmF1bHRDb250YWluZXI7XG4gICAgICByZXR1cm4gZ2V0RnVuYygpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVTY3JvbGxUbyA9IGZ1bmN0aW9uIChsaW5rKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvZmZzZXRUb3AgPSBfdGhpcyRwcm9wcy5vZmZzZXRUb3AsXG4gICAgICAgICAgdGFyZ2V0T2Zmc2V0ID0gX3RoaXMkcHJvcHMudGFyZ2V0T2Zmc2V0O1xuXG4gICAgICBfdGhpcy5zZXRDdXJyZW50QWN0aXZlTGluayhsaW5rKTtcblxuICAgICAgdmFyIGNvbnRhaW5lciA9IF90aGlzLmdldENvbnRhaW5lcigpO1xuXG4gICAgICB2YXIgc2Nyb2xsVG9wID0gKDAsIF9nZXRTY3JvbGxbXCJkZWZhdWx0XCJdKShjb250YWluZXIsIHRydWUpO1xuICAgICAgdmFyIHNoYXJwTGlua01hdGNoID0gc2hhcnBNYXRjaGVyUmVneC5leGVjKGxpbmspO1xuXG4gICAgICBpZiAoIXNoYXJwTGlua01hdGNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhcmdldEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzaGFycExpbmtNYXRjaFsxXSk7XG5cbiAgICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBlbGVPZmZzZXRUb3AgPSBnZXRPZmZzZXRUb3AodGFyZ2V0RWxlbWVudCwgY29udGFpbmVyKTtcbiAgICAgIHZhciB5ID0gc2Nyb2xsVG9wICsgZWxlT2Zmc2V0VG9wO1xuICAgICAgeSAtPSB0YXJnZXRPZmZzZXQgIT09IHVuZGVmaW5lZCA/IHRhcmdldE9mZnNldCA6IG9mZnNldFRvcCB8fCAwO1xuICAgICAgX3RoaXMuYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICgwLCBfc2Nyb2xsVG9bXCJkZWZhdWx0XCJdKSh5LCB7XG4gICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgICAgICBfdGhpcy5hbmltYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q29udGFpbmVyOiBfdGhpcy5nZXRDb250YWluZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlSW5rTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBfdGhpcy5pbmtOb2RlID0gbm9kZTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2V0Q3VycmVudEFjdGl2ZUxpbmsgPSBmdW5jdGlvbiAobGluaykge1xuICAgICAgdmFyIGFjdGl2ZUxpbmsgPSBfdGhpcy5zdGF0ZS5hY3RpdmVMaW5rO1xuICAgICAgdmFyIG9uQ2hhbmdlID0gX3RoaXMucHJvcHMub25DaGFuZ2U7XG5cbiAgICAgIGlmIChhY3RpdmVMaW5rICE9PSBsaW5rKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBhY3RpdmVMaW5rOiBsaW5rXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgIG9uQ2hhbmdlKGxpbmspO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVNjcm9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5hbmltYXRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb2Zmc2V0VG9wID0gX3RoaXMkcHJvcHMyLm9mZnNldFRvcCxcbiAgICAgICAgICBib3VuZHMgPSBfdGhpcyRwcm9wczIuYm91bmRzLFxuICAgICAgICAgIHRhcmdldE9mZnNldCA9IF90aGlzJHByb3BzMi50YXJnZXRPZmZzZXQ7XG5cbiAgICAgIHZhciBjdXJyZW50QWN0aXZlTGluayA9IF90aGlzLmdldEN1cnJlbnRBbmNob3IodGFyZ2V0T2Zmc2V0ICE9PSB1bmRlZmluZWQgPyB0YXJnZXRPZmZzZXQgOiBvZmZzZXRUb3AgfHwgMCwgYm91bmRzKTtcblxuICAgICAgX3RoaXMuc2V0Q3VycmVudEFjdGl2ZUxpbmsoY3VycmVudEFjdGl2ZUxpbmspO1xuICAgIH07XG5cbiAgICBfdGhpcy51cGRhdGVJbmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplID0gKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLFxuICAgICAgICAgIHByZWZpeENscyA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZS5wcmVmaXhDbHM7XG5cbiAgICAgIHZhciBhbmNob3JOb2RlID0gUmVhY3RET00uZmluZERPTU5vZGUoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpKTtcbiAgICAgIHZhciBsaW5rTm9kZSA9IGFuY2hvck5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpbmstdGl0bGUtYWN0aXZlXCIpKVswXTtcblxuICAgICAgaWYgKGxpbmtOb2RlKSB7XG4gICAgICAgIF90aGlzLmlua05vZGUuc3R5bGUudG9wID0gXCJcIi5jb25jYXQobGlua05vZGUub2Zmc2V0VG9wICsgbGlua05vZGUuY2xpZW50SGVpZ2h0IC8gMiAtIDQuNSwgXCJweFwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJGNvbnRleHQgPSBfdGhpcy5jb250ZXh0LFxuICAgICAgICAgIGdldFByZWZpeENscyA9IF90aGlzJGNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJGNvbnRleHQuZGlyZWN0aW9uO1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IF90aGlzJHByb3BzMy5wcmVmaXhDbHMsXG4gICAgICAgICAgX3RoaXMkcHJvcHMzJGNsYXNzTmFtID0gX3RoaXMkcHJvcHMzLmNsYXNzTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczMkY2xhc3NOYW0gPT09IHZvaWQgMCA/ICcnIDogX3RoaXMkcHJvcHMzJGNsYXNzTmFtLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMzLnN0eWxlLFxuICAgICAgICAgIG9mZnNldFRvcCA9IF90aGlzJHByb3BzMy5vZmZzZXRUb3AsXG4gICAgICAgICAgYWZmaXggPSBfdGhpcyRwcm9wczMuYWZmaXgsXG4gICAgICAgICAgc2hvd0lua0luRml4ZWQgPSBfdGhpcyRwcm9wczMuc2hvd0lua0luRml4ZWQsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczMuY2hpbGRyZW47XG4gICAgICB2YXIgYWN0aXZlTGluayA9IF90aGlzLnN0YXRlLmFjdGl2ZUxpbms7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdhbmNob3InLCBjdXN0b21pemVQcmVmaXhDbHMpOyAvLyBUbyBzdXBwb3J0IG9sZCB2ZXJzaW9uIHJlYWN0LlxuICAgICAgLy8gSGF2ZSB0byBhZGQgcHJlZml4Q2xzIG9uIHRoZSBpbnN0YW5jZS5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTIzOTdcblxuICAgICAgX3RoaXMucHJlZml4Q2xzID0gcHJlZml4Q2xzO1xuICAgICAgdmFyIGlua0NsYXNzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmstYmFsbFwiKSwge1xuICAgICAgICB2aXNpYmxlOiBhY3RpdmVMaW5rXG4gICAgICB9KTtcbiAgICAgIHZhciB3cmFwcGVyQ2xhc3MgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdyYXBwZXJcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTtcbiAgICAgIHZhciBhbmNob3JDbGFzcyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywge1xuICAgICAgICBmaXhlZDogIWFmZml4ICYmICFzaG93SW5rSW5GaXhlZFxuICAgICAgfSk7XG4gICAgICB2YXIgd3JhcHBlclN0eWxlID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgbWF4SGVpZ2h0OiBvZmZzZXRUb3AgPyBcImNhbGMoMTAwdmggLSBcIi5jb25jYXQob2Zmc2V0VG9wLCBcInB4KVwiKSA6ICcxMDB2aCdcbiAgICAgIH0sIHN0eWxlKTtcbiAgICAgIHZhciBhbmNob3JDb250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHdyYXBwZXJDbGFzcyxcbiAgICAgICAgc3R5bGU6IHdyYXBwZXJTdHlsZVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGFuY2hvckNsYXNzXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmtcIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogaW5rQ2xhc3MsXG4gICAgICAgIHJlZjogX3RoaXMuc2F2ZUlua05vZGVcbiAgICAgIH0pKSwgY2hpbGRyZW4pKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29udGV4dFtcImRlZmF1bHRcIl0uUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICByZWdpc3Rlckxpbms6IF90aGlzLnJlZ2lzdGVyTGluayxcbiAgICAgICAgICB1bnJlZ2lzdGVyTGluazogX3RoaXMudW5yZWdpc3RlckxpbmssXG4gICAgICAgICAgYWN0aXZlTGluazogX3RoaXMuc3RhdGUuYWN0aXZlTGluayxcbiAgICAgICAgICBzY3JvbGxUbzogX3RoaXMuaGFuZGxlU2Nyb2xsVG8sXG4gICAgICAgICAgb25DbGljazogX3RoaXMucHJvcHMub25DbGlja1xuICAgICAgICB9XG4gICAgICB9LCAhYWZmaXggPyBhbmNob3JDb250ZW50IDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2FmZml4W1wiZGVmYXVsdFwiXSwge1xuICAgICAgICBvZmZzZXRUb3A6IG9mZnNldFRvcCxcbiAgICAgICAgdGFyZ2V0OiBfdGhpcy5nZXRDb250YWluZXJcbiAgICAgIH0sIGFuY2hvckNvbnRlbnQpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShBbmNob3IsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lcigpO1xuICAgICAgdGhpcy5zY3JvbGxFdmVudCA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lcltcImRlZmF1bHRcIl0pKHRoaXMuc2Nyb2xsQ29udGFpbmVyLCAnc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwpO1xuICAgICAgdGhpcy5oYW5kbGVTY3JvbGwoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbEV2ZW50KSB7XG4gICAgICAgIHZhciBjdXJyZW50Q29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcblxuICAgICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIgIT09IGN1cnJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXI7XG4gICAgICAgICAgdGhpcy5zY3JvbGxFdmVudC5yZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLnNjcm9sbEV2ZW50ID0gKDAsIF9hZGRFdmVudExpc3RlbmVyW1wiZGVmYXVsdFwiXSkodGhpcy5zY3JvbGxDb250YWluZXIsICdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZUluaygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbEV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsRXZlbnQucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEN1cnJlbnRBbmNob3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudEFuY2hvcigpIHtcbiAgICAgIHZhciBvZmZzZXRUb3AgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDA7XG4gICAgICB2YXIgYm91bmRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiA1O1xuICAgICAgdmFyIGdldEN1cnJlbnRBbmNob3IgPSB0aGlzLnByb3BzLmdldEN1cnJlbnRBbmNob3I7XG5cbiAgICAgIGlmICh0eXBlb2YgZ2V0Q3VycmVudEFuY2hvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVudEFuY2hvcigpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGlua1NlY3Rpb25zID0gW107XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICAgIHRoaXMubGlua3MuZm9yRWFjaChmdW5jdGlvbiAobGluaykge1xuICAgICAgICB2YXIgc2hhcnBMaW5rTWF0Y2ggPSBzaGFycE1hdGNoZXJSZWd4LmV4ZWMobGluay50b1N0cmluZygpKTtcblxuICAgICAgICBpZiAoIXNoYXJwTGlua01hdGNoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNoYXJwTGlua01hdGNoWzFdKTtcblxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgdmFyIHRvcCA9IGdldE9mZnNldFRvcCh0YXJnZXQsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgICBpZiAodG9wIDwgb2Zmc2V0VG9wICsgYm91bmRzKSB7XG4gICAgICAgICAgICBsaW5rU2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGxpbms6IGxpbmssXG4gICAgICAgICAgICAgIHRvcDogdG9wXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAobGlua1NlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB2YXIgbWF4U2VjdGlvbiA9IGxpbmtTZWN0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHtcbiAgICAgICAgICByZXR1cm4gY3Vyci50b3AgPiBwcmV2LnRvcCA/IGN1cnIgOiBwcmV2O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1heFNlY3Rpb24ubGluaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQW5jaG9yO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEFuY2hvcjtcbkFuY2hvci5kZWZhdWx0UHJvcHMgPSB7XG4gIGFmZml4OiB0cnVlLFxuICBzaG93SW5rSW5GaXhlZDogZmFsc2Vcbn07XG5BbmNob3IuY29udGV4dFR5cGUgPSBfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX2NvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NvbnRleHRcIikpO1xuXG52YXIgQW5jaG9yTGluayA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKEFuY2hvckxpbmssIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKEFuY2hvckxpbmspO1xuXG4gIGZ1bmN0aW9uIEFuY2hvckxpbmsoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBBbmNob3JMaW5rKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJGNvbnRleHQgPSBfdGhpcy5jb250ZXh0LFxuICAgICAgICAgIHNjcm9sbFRvID0gX3RoaXMkY29udGV4dC5zY3JvbGxUbyxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkY29udGV4dC5vbkNsaWNrO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgaHJlZiA9IF90aGlzJHByb3BzLmhyZWYsXG4gICAgICAgICAgdGl0bGUgPSBfdGhpcyRwcm9wcy50aXRsZTtcblxuICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgb25DbGljayhlLCB7XG4gICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgIGhyZWY6IGhyZWZcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHNjcm9sbFRvKGhyZWYpO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJBbmNob3JMaW5rID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjdXN0b21pemVQcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgIGhyZWYgPSBfdGhpcyRwcm9wczIuaHJlZixcbiAgICAgICAgICB0aXRsZSA9IF90aGlzJHByb3BzMi50aXRsZSxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbixcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICAgIHRhcmdldCA9IF90aGlzJHByb3BzMi50YXJnZXQ7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdhbmNob3InLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgdmFyIGFjdGl2ZSA9IF90aGlzLmNvbnRleHQuYWN0aXZlTGluayA9PT0gaHJlZjtcbiAgICAgIHZhciB3cmFwcGVyQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saW5rXCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpbmstYWN0aXZlXCIpLCBhY3RpdmUpLCBjbGFzc05hbWUpO1xuICAgICAgdmFyIHRpdGxlQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saW5rLXRpdGxlXCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpbmstdGl0bGUtYWN0aXZlXCIpLCBhY3RpdmUpKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzTmFtZVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiB0aXRsZUNsYXNzTmFtZSxcbiAgICAgICAgaHJlZjogaHJlZixcbiAgICAgICAgdGl0bGU6IHR5cGVvZiB0aXRsZSA9PT0gJ3N0cmluZycgPyB0aXRsZSA6ICcnLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgb25DbGljazogX3RoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0sIHRpdGxlKSwgY2hpbGRyZW4pO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKEFuY2hvckxpbmssIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5jb250ZXh0LnJlZ2lzdGVyTGluayh0aGlzLnByb3BzLmhyZWYpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKF9yZWYyKSB7XG4gICAgICB2YXIgcHJldkhyZWYgPSBfcmVmMi5ocmVmO1xuICAgICAgdmFyIGhyZWYgPSB0aGlzLnByb3BzLmhyZWY7XG5cbiAgICAgIGlmIChwcmV2SHJlZiAhPT0gaHJlZikge1xuICAgICAgICB0aGlzLmNvbnRleHQudW5yZWdpc3RlckxpbmsocHJldkhyZWYpO1xuICAgICAgICB0aGlzLmNvbnRleHQucmVnaXN0ZXJMaW5rKGhyZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuY29udGV4dC51bnJlZ2lzdGVyTGluayh0aGlzLnByb3BzLmhyZWYpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJBbmNob3JMaW5rKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEFuY2hvckxpbms7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkFuY2hvckxpbmsuZGVmYXVsdFByb3BzID0ge1xuICBocmVmOiAnIydcbn07XG5BbmNob3JMaW5rLmNvbnRleHRUeXBlID0gX2NvbnRleHRbXCJkZWZhdWx0XCJdO1xudmFyIF9kZWZhdWx0ID0gQW5jaG9yTGluaztcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIEFuY2hvckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbnZhciBfZGVmYXVsdCA9IEFuY2hvckNvbnRleHQ7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX0FuY2hvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQW5jaG9yXCIpKTtcblxudmFyIF9BbmNob3JMaW5rID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9BbmNob3JMaW5rXCIpKTtcblxuX0FuY2hvcltcImRlZmF1bHRcIl0uTGluayA9IF9BbmNob3JMaW5rW1wiZGVmYXVsdFwiXTtcbnZhciBfZGVmYXVsdCA9IF9BbmNob3JbXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdG9BcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0NoaWxkcmVuL3RvQXJyYXlcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfc2VsZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vc2VsZWN0XCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWFjdE5vZGVcIik7XG5cbi8qKlxuICogVE9ETzogNC4wXG4gKiAtIHJlbW92ZSBgZGF0YVNvdXJjZWBcbiAqIC0gYHNpemVgIG5vdCB3b3JrIHdpdGggY3VzdG9taXplSW5wdXRcbiAqIC0gY3VzdG9taXplSW5wdXQgbm90IGZlZWRiYWNrIGBFTlRFUmAga2V5IHNpbmNlIGFjY2Vzc2liaWxpdHkgZW5oYW5jZW1lbnRcbiAqL1xudmFyIE9wdGlvbiA9IF9zZWxlY3RbXCJkZWZhdWx0XCJdLk9wdGlvbjtcbnZhciBJbnRlcm5hbFNlbGVjdCA9IF9zZWxlY3RbXCJkZWZhdWx0XCJdO1xuXG5mdW5jdGlvbiBpc1NlbGVjdE9wdGlvbk9yU2VsZWN0T3B0R3JvdXAoY2hpbGQpIHtcbiAgcmV0dXJuIGNoaWxkICYmIGNoaWxkLnR5cGUgJiYgKGNoaWxkLnR5cGUuaXNTZWxlY3RPcHRpb24gfHwgY2hpbGQudHlwZS5pc1NlbGVjdE9wdEdyb3VwKTtcbn1cblxudmFyIEF1dG9Db21wbGV0ZSA9IGZ1bmN0aW9uIEF1dG9Db21wbGV0ZShwcm9wcywgcmVmKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgZGF0YVNvdXJjZSA9IHByb3BzLmRhdGFTb3VyY2U7XG4gIHZhciBjaGlsZE5vZGVzID0gKDAsIF90b0FycmF5W1wiZGVmYXVsdFwiXSkoY2hpbGRyZW4pO1xuICB2YXIgc2VsZWN0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHNlbGVjdFJlZi5jdXJyZW50O1xuICB9KTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5wdXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgY3VzdG9taXplSW5wdXQ7XG5cbiAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmICgwLCBfcmVhY3ROb2RlLmlzVmFsaWRFbGVtZW50KShjaGlsZE5vZGVzWzBdKSAmJiAhaXNTZWxlY3RPcHRpb25PclNlbGVjdE9wdEdyb3VwKGNoaWxkTm9kZXNbMF0pKSB7XG4gICAgdmFyIF9jaGlsZE5vZGVzID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKGNoaWxkTm9kZXMsIDEpO1xuXG4gICAgY3VzdG9taXplSW5wdXQgPSBfY2hpbGROb2Rlc1swXTtcbiAgfVxuXG4gIHZhciBnZXRJbnB1dEVsZW1lbnQgPSBjdXN0b21pemVJbnB1dCA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY3VzdG9taXplSW5wdXQ7XG4gIH0gOiB1bmRlZmluZWQ7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3B0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG9wdGlvbkNoaWxkcmVuOyAvLyBbTGVnYWN5XSBjb252ZXJ0IGBjaGlsZHJlbmAgb3IgYGRhdGFTb3VyY2VgIGludG8gb3B0aW9uIGNoaWxkcmVuXG5cbiAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoICYmIGlzU2VsZWN0T3B0aW9uT3JTZWxlY3RPcHRHcm91cChjaGlsZE5vZGVzWzBdKSkge1xuICAgIG9wdGlvbkNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9uQ2hpbGRyZW4gPSBkYXRhU291cmNlID8gZGF0YVNvdXJjZS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIGlmICgoMCwgX3JlYWN0Tm9kZS5pc1ZhbGlkRWxlbWVudCkoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoaXRlbSkpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3B0aW9uLCB7XG4gICAgICAgICAgICBrZXk6IGl0ZW0sXG4gICAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICAgIH0sIGl0ZW0pO1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIG9wdGlvblZhbHVlID0gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPcHRpb24sIHtcbiAgICAgICAgICAgICAga2V5OiBvcHRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvblZhbHVlXG4gICAgICAgICAgICB9LCBpdGVtLnRleHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0b0NvbXBsZXRlW2RhdGFTb3VyY2VdIG9ubHkgc3VwcG9ydHMgdHlwZSBgc3RyaW5nW10gfCBPYmplY3RbXWAuJyk7XG4gICAgICB9XG4gICAgfSkgOiBbXTtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghKCdkYXRhU291cmNlJyBpbiBwcm9wcyksICdBdXRvQ29tcGxldGUnLCAnYGRhdGFTb3VyY2VgIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgYG9wdGlvbnNgIGluc3RlYWQuJyk7XG4gICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoIWN1c3RvbWl6ZUlucHV0IHx8ICEoJ3NpemUnIGluIHByb3BzKSwgJ0F1dG9Db21wbGV0ZScsICdZb3UgbmVlZCB0byBjb250cm9sIHN0eWxlIHNlbGYgaW5zdGVhZCBvZiBzZXR0aW5nIGBzaXplYCB3aGVuIHVzaW5nIGN1c3RvbWl6ZSBpbnB1dC4nKTtcbiAgfSwgW10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcbiAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzZWxlY3QnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbFNlbGVjdCwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgIHJlZjogc2VsZWN0UmVmXG4gICAgfSwgKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkocHJvcHMsIFsnZGF0YVNvdXJjZSddKSwge1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXV0by1jb21wbGV0ZVwiKSwgY2xhc3NOYW1lKSxcbiAgICAgIG1vZGU6IF9zZWxlY3RbXCJkZWZhdWx0XCJdLlNFQ1JFVF9DT01CT0JPWF9NT0RFX0RPX05PVF9VU0UsXG4gICAgICBnZXRJbnB1dEVsZW1lbnQ6IGdldElucHV0RWxlbWVudFxuICAgIH0pLCBvcHRpb25DaGlsZHJlbik7XG4gIH0pO1xufTtcblxudmFyIFJlZkF1dG9Db21wbGV0ZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEF1dG9Db21wbGV0ZSk7XG5SZWZBdXRvQ29tcGxldGUuT3B0aW9uID0gT3B0aW9uO1xudmFyIF9kZWZhdWx0ID0gUmVmQXV0b0NvbXBsZXRlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9yY1Jlc2l6ZU9ic2VydmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtcmVzaXplLW9ic2VydmVyXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX3JlZiA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWZcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgSW50ZXJuYWxBdmF0YXIgPSBmdW5jdGlvbiBJbnRlcm5hbEF2YXRhcihwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcywgX2NsYXNzTmFtZXMyO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgxKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHNjYWxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFNjYWxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgICBtb3VudGVkID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICAgIHNldE1vdW50ZWQgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUodHJ1ZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU2ID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgICAgaXNJbWdFeGlzdCA9IF9SZWFjdCR1c2VTdGF0ZTZbMF0sXG4gICAgICBzZXRJc0ltZ0V4aXN0ID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcblxuICB2YXIgYXZhdGFyTm9kZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgYXZhdGFyQ2hpbGRyZW5SZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGF2YXRhck5vZGVNZXJnZVJlZiA9ICgwLCBfcmVmLmNvbXBvc2VSZWYpKHJlZiwgYXZhdGFyTm9kZVJlZik7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG5cbiAgdmFyIHNldFNjYWxlUGFyYW0gPSBmdW5jdGlvbiBzZXRTY2FsZVBhcmFtKCkge1xuICAgIGlmICghYXZhdGFyQ2hpbGRyZW5SZWYuY3VycmVudCB8fCAhYXZhdGFyTm9kZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkcmVuV2lkdGggPSBhdmF0YXJDaGlsZHJlblJlZi5jdXJyZW50Lm9mZnNldFdpZHRoOyAvLyBvZmZzZXRXaWR0aCBhdm9pZCBhZmZlY3RpbmcgYmUgdHJhbnNmb3JtIHNjYWxlXG5cbiAgICB2YXIgbm9kZVdpZHRoID0gYXZhdGFyTm9kZVJlZi5jdXJyZW50Lm9mZnNldFdpZHRoOyAvLyBkZW5vbWluYXRvciBpcyAwIGlzIG5vIG1lYW5pbmdcblxuICAgIGlmIChjaGlsZHJlbldpZHRoICE9PSAwICYmIG5vZGVXaWR0aCAhPT0gMCkge1xuICAgICAgdmFyIF9wcm9wcyRnYXAgPSBwcm9wcy5nYXAsXG4gICAgICAgICAgZ2FwID0gX3Byb3BzJGdhcCA9PT0gdm9pZCAwID8gNCA6IF9wcm9wcyRnYXA7XG5cbiAgICAgIGlmIChnYXAgKiAyIDwgbm9kZVdpZHRoKSB7XG4gICAgICAgIHNldFNjYWxlKG5vZGVXaWR0aCAtIGdhcCAqIDIgPCBjaGlsZHJlbldpZHRoID8gKG5vZGVXaWR0aCAtIGdhcCAqIDIpIC8gY2hpbGRyZW5XaWR0aCA6IDEpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldE1vdW50ZWQodHJ1ZSk7XG4gIH0sIFtdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJc0ltZ0V4aXN0KHRydWUpO1xuICAgIHNldFNjYWxlKDEpO1xuICB9LCBbcHJvcHMuc3JjXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0U2NhbGVQYXJhbSgpO1xuICB9LCBbcHJvcHMuZ2FwXSk7XG5cbiAgdmFyIGhhbmRsZUltZ0xvYWRFcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUltZ0xvYWRFcnJvcigpIHtcbiAgICB2YXIgb25FcnJvciA9IHByb3BzLm9uRXJyb3I7XG4gICAgdmFyIGVycm9yRmxhZyA9IG9uRXJyb3IgPyBvbkVycm9yKCkgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZXJyb3JGbGFnICE9PSBmYWxzZSkge1xuICAgICAgc2V0SXNJbWdFeGlzdChmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBzaGFwZSA9IHByb3BzLnNoYXBlLFxuICAgICAgc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICBzcmMgPSBwcm9wcy5zcmMsXG4gICAgICBzcmNTZXQgPSBwcm9wcy5zcmNTZXQsXG4gICAgICBpY29uID0gcHJvcHMuaWNvbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGFsdCA9IHByb3BzLmFsdCxcbiAgICAgIGRyYWdnYWJsZSA9IHByb3BzLmRyYWdnYWJsZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBvdGhlcnMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInNoYXBlXCIsIFwic2l6ZVwiLCBcInNyY1wiLCBcInNyY1NldFwiLCBcImljb25cIiwgXCJjbGFzc05hbWVcIiwgXCJhbHRcIiwgXCJkcmFnZ2FibGVcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoISh0eXBlb2YgaWNvbiA9PT0gJ3N0cmluZycgJiYgaWNvbi5sZW5ndGggPiAyKSwgJ0F2YXRhcicsIFwiYGljb25gIGlzIHVzaW5nIFJlYWN0Tm9kZSBpbnN0ZWFkIG9mIHN0cmluZyBuYW1pbmcgaW4gdjQuIFBsZWFzZSBjaGVjayBgXCIuY29uY2F0KGljb24sIFwiYCBhdCBodHRwczovL2FudC5kZXNpZ24vY29tcG9uZW50cy9pY29uXCIpKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnYXZhdGFyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHNpemVDbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sZ1wiKSwgc2l6ZSA9PT0gJ2xhcmdlJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21cIiksIHNpemUgPT09ICdzbWFsbCcpLCBfY2xhc3NOYW1lcykpO1xuICB2YXIgY2xhc3NTdHJpbmcgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIHNpemVDbHMsIChfY2xhc3NOYW1lczIgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaGFwZSksIHNoYXBlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1hZ2VcIiksIHNyYyAmJiBpc0ltZ0V4aXN0KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvblwiKSwgaWNvbiksIF9jbGFzc05hbWVzMiksIGNsYXNzTmFtZSk7XG4gIHZhciBzaXplU3R5bGUgPSB0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgd2lkdGg6IHNpemUsXG4gICAgaGVpZ2h0OiBzaXplLFxuICAgIGxpbmVIZWlnaHQ6IFwiXCIuY29uY2F0KHNpemUsIFwicHhcIiksXG4gICAgZm9udFNpemU6IGljb24gPyBzaXplIC8gMiA6IDE4XG4gIH0gOiB7fTtcbiAgdmFyIGNoaWxkcmVuVG9SZW5kZXI7XG5cbiAgaWYgKHNyYyAmJiBpc0ltZ0V4aXN0KSB7XG4gICAgY2hpbGRyZW5Ub1JlbmRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgIHNyYzogc3JjLFxuICAgICAgZHJhZ2dhYmxlOiBkcmFnZ2FibGUsXG4gICAgICBzcmNTZXQ6IHNyY1NldCxcbiAgICAgIG9uRXJyb3I6IGhhbmRsZUltZ0xvYWRFcnJvcixcbiAgICAgIGFsdDogYWx0XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaWNvbikge1xuICAgIGNoaWxkcmVuVG9SZW5kZXIgPSBpY29uO1xuICB9IGVsc2UgaWYgKG1vdW50ZWQgfHwgc2NhbGUgIT09IDEpIHtcbiAgICB2YXIgdHJhbnNmb3JtU3RyaW5nID0gXCJzY2FsZShcIi5jb25jYXQoc2NhbGUsIFwiKSB0cmFuc2xhdGVYKC01MCUpXCIpO1xuICAgIHZhciBjaGlsZHJlblN0eWxlID0ge1xuICAgICAgbXNUcmFuc2Zvcm06IHRyYW5zZm9ybVN0cmluZyxcbiAgICAgIFdlYmtpdFRyYW5zZm9ybTogdHJhbnNmb3JtU3RyaW5nLFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1TdHJpbmdcbiAgICB9O1xuICAgIHZhciBzaXplQ2hpbGRyZW5TdHlsZSA9IHR5cGVvZiBzaXplID09PSAnbnVtYmVyJyA/IHtcbiAgICAgIGxpbmVIZWlnaHQ6IFwiXCIuY29uY2F0KHNpemUsIFwicHhcIilcbiAgICB9IDoge307XG4gICAgY2hpbGRyZW5Ub1JlbmRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1Jlc2l6ZU9ic2VydmVyW1wiZGVmYXVsdFwiXSwge1xuICAgICAgb25SZXNpemU6IHNldFNjYWxlUGFyYW1cbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0cmluZ1wiKSxcbiAgICAgIHJlZjogZnVuY3Rpb24gcmVmKG5vZGUpIHtcbiAgICAgICAgYXZhdGFyQ2hpbGRyZW5SZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICB9LFxuICAgICAgc3R5bGU6ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHNpemVDaGlsZHJlblN0eWxlKSwgY2hpbGRyZW5TdHlsZSlcbiAgICB9LCBjaGlsZHJlbikpO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkcmVuVG9SZW5kZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0cmluZ1wiKSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIG9wYWNpdHk6IDBcbiAgICAgIH0sXG4gICAgICByZWY6IGZ1bmN0aW9uIHJlZihub2RlKSB7XG4gICAgICAgIGF2YXRhckNoaWxkcmVuUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgfVxuICAgIH0sIGNoaWxkcmVuKTtcbiAgfSAvLyBUaGUgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlIGZyb20gYnViYmxpbmcgdXAgdGhlIERPTSB0cmVlLlxuICAvLyBzZWUgaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL2tpbmQtc25vdy05bGlkelxuXG5cbiAgZGVsZXRlIG90aGVycy5vbkVycm9yO1xuICBkZWxldGUgb3RoZXJzLmdhcDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIG90aGVycywge1xuICAgIHN0eWxlOiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBzaXplU3R5bGUpLCBvdGhlcnMuc3R5bGUpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmcsXG4gICAgcmVmOiBhdmF0YXJOb2RlTWVyZ2VSZWZcbiAgfSksIGNoaWxkcmVuVG9SZW5kZXIpO1xufTtcblxudmFyIEF2YXRhciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsQXZhdGFyKTtcbkF2YXRhci5kaXNwbGF5TmFtZSA9ICdBdmF0YXInO1xuQXZhdGFyLmRlZmF1bHRQcm9wcyA9IHtcbiAgc2hhcGU6ICdjaXJjbGUnLFxuICBzaXplOiAnZGVmYXVsdCdcbn07XG52YXIgX2RlZmF1bHQgPSBBdmF0YXI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF90b0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvQ2hpbGRyZW4vdG9BcnJheVwiKSk7XG5cbnZhciBfcmVhY3ROb2RlID0gcmVxdWlyZShcIi4uL191dGlsL3JlYWN0Tm9kZVwiKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfYXZhdGFyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9hdmF0YXJcIikpO1xuXG52YXIgX3BvcG92ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9wb3BvdmVyXCIpKTtcblxudmFyIEdyb3VwID0gZnVuY3Rpb24gR3JvdXAocHJvcHMpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIF9wcm9wcyRjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjbGFzc05hbWUgPSBfcHJvcHMkY2xhc3NOYW1lID09PSB2b2lkIDAgPyAnJyA6IF9wcm9wcyRjbGFzc05hbWUsXG4gICAgICBtYXhDb3VudCA9IHByb3BzLm1heENvdW50LFxuICAgICAgbWF4U3R5bGUgPSBwcm9wcy5tYXhTdHlsZTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnYXZhdGFyLWdyb3VwJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGNscyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBjbGFzc05hbWUpO1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIF9wcm9wcyRtYXhQb3BvdmVyUGxhYyA9IHByb3BzLm1heFBvcG92ZXJQbGFjZW1lbnQsXG4gICAgICBtYXhQb3BvdmVyUGxhY2VtZW50ID0gX3Byb3BzJG1heFBvcG92ZXJQbGFjID09PSB2b2lkIDAgPyAndG9wJyA6IF9wcm9wcyRtYXhQb3BvdmVyUGxhYztcbiAgdmFyIGNoaWxkcmVuV2l0aFByb3BzID0gKDAsIF90b0FycmF5W1wiZGVmYXVsdFwiXSkoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgcmV0dXJuICgwLCBfcmVhY3ROb2RlLmNsb25lRWxlbWVudCkoY2hpbGQsIHtcbiAgICAgIGtleTogXCJhdmF0YXIta2V5LVwiLmNvbmNhdChpbmRleClcbiAgICB9KTtcbiAgfSk7XG4gIHZhciBudW1PZkNoaWxkcmVuID0gY2hpbGRyZW5XaXRoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChtYXhDb3VudCAmJiBtYXhDb3VudCA8IG51bU9mQ2hpbGRyZW4pIHtcbiAgICB2YXIgY2hpbGRyZW5TaG93ID0gY2hpbGRyZW5XaXRoUHJvcHMuc2xpY2UoMCwgbWF4Q291bnQpO1xuICAgIHZhciBjaGlsZHJlbkhpZGRlbiA9IGNoaWxkcmVuV2l0aFByb3BzLnNsaWNlKG1heENvdW50LCBudW1PZkNoaWxkcmVuKTtcbiAgICBjaGlsZHJlblNob3cucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3BvcG92ZXJbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBrZXk6IFwiYXZhdGFyLXBvcG92ZXIta2V5XCIsXG4gICAgICBjb250ZW50OiBjaGlsZHJlbkhpZGRlbixcbiAgICAgIHRyaWdnZXI6IFwiaG92ZXJcIixcbiAgICAgIHBsYWNlbWVudDogbWF4UG9wb3ZlclBsYWNlbWVudCxcbiAgICAgIG92ZXJsYXlDbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcG9wb3ZlclwiKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9hdmF0YXJbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBzdHlsZTogbWF4U3R5bGVcbiAgICB9LCBcIitcIi5jb25jYXQobnVtT2ZDaGlsZHJlbiAtIG1heENvdW50KSkpKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHMsXG4gICAgICBzdHlsZTogcHJvcHMuc3R5bGVcbiAgICB9LCBjaGlsZHJlblNob3cpO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNscyxcbiAgICBzdHlsZTogcHJvcHMuc3R5bGVcbiAgfSwgY2hpbGRyZW4pO1xufTtcblxudmFyIF9kZWZhdWx0ID0gR3JvdXA7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkdyb3VwXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9ncm91cFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfYXZhdGFyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9hdmF0YXJcIikpO1xuXG52YXIgX2dyb3VwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ncm91cFwiKSk7XG5cbnZhciBBdmF0YXIgPSBfYXZhdGFyW1wiZGVmYXVsdFwiXTtcbkF2YXRhci5Hcm91cCA9IF9ncm91cFtcImRlZmF1bHRcIl07XG52YXIgX2RlZmF1bHQgPSBBdmF0YXI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNBbmltYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtYW5pbWF0ZVwiKSk7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9hZGRFdmVudExpc3RlbmVyXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm9taXQuanNcIikpO1xuXG52YXIgX1ZlcnRpY2FsQWxpZ25Ub3BPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1ZlcnRpY2FsQWxpZ25Ub3BPdXRsaW5lZFwiKSk7XG5cbnZhciBfdGhyb3R0bGVCeUFuaW1hdGlvbkZyYW1lID0gcmVxdWlyZShcIi4uL191dGlsL3Rocm90dGxlQnlBbmltYXRpb25GcmFtZVwiKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfZ2V0U2Nyb2xsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZ2V0U2Nyb2xsXCIpKTtcblxudmFyIF9zY3JvbGxUbyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL3Njcm9sbFRvXCIpKTtcblxudmFyIEJhY2tUb3AgPSBmdW5jdGlvbiBCYWNrVG9wKHByb3BzKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICB2aXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciByZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gIHZhciBzY3JvbGxFdmVudCA9IFJlYWN0LnVzZVJlZigpO1xuXG4gIHZhciBnZXREZWZhdWx0VGFyZ2V0ID0gZnVuY3Rpb24gZ2V0RGVmYXVsdFRhcmdldCgpIHtcbiAgICByZXR1cm4gcmVmLmN1cnJlbnQgJiYgcmVmLmN1cnJlbnQub3duZXJEb2N1bWVudCA/IHJlZi5jdXJyZW50Lm93bmVyRG9jdW1lbnQgOiB3aW5kb3c7XG4gIH07XG5cbiAgdmFyIGhhbmRsZVNjcm9sbCA9ICgwLCBfdGhyb3R0bGVCeUFuaW1hdGlvbkZyYW1lLnRocm90dGxlQnlBbmltYXRpb25GcmFtZSkoZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgdmlzaWJpbGl0eUhlaWdodCA9IHByb3BzLnZpc2liaWxpdHlIZWlnaHQ7XG4gICAgdmFyIHNjcm9sbFRvcCA9ICgwLCBfZ2V0U2Nyb2xsW1wiZGVmYXVsdFwiXSkoZS50YXJnZXQsIHRydWUpO1xuICAgIHNldFZpc2libGUoc2Nyb2xsVG9wID4gdmlzaWJpbGl0eUhlaWdodCk7XG4gIH0pO1xuXG4gIHZhciBiaW5kU2Nyb2xsRXZlbnQgPSBmdW5jdGlvbiBiaW5kU2Nyb2xsRXZlbnQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHByb3BzLnRhcmdldDtcbiAgICB2YXIgZ2V0VGFyZ2V0ID0gdGFyZ2V0IHx8IGdldERlZmF1bHRUYXJnZXQ7XG4gICAgdmFyIGNvbnRhaW5lciA9IGdldFRhcmdldCgpO1xuICAgIHNjcm9sbEV2ZW50LmN1cnJlbnQgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXJbXCJkZWZhdWx0XCJdKShjb250YWluZXIsICdzY3JvbGwnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaGFuZGxlU2Nyb2xsKGUpO1xuICAgIH0pO1xuICAgIGhhbmRsZVNjcm9sbCh7XG4gICAgICB0YXJnZXQ6IGNvbnRhaW5lclxuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgYmluZFNjcm9sbEV2ZW50KCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzY3JvbGxFdmVudC5jdXJyZW50KSB7XG4gICAgICAgIHNjcm9sbEV2ZW50LmN1cnJlbnQucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZVNjcm9sbC5jYW5jZWwoKTtcbiAgICB9O1xuICB9LCBbcHJvcHMudGFyZ2V0XSk7XG5cbiAgdmFyIGdldFZpc2libGUgPSBmdW5jdGlvbiBnZXRWaXNpYmxlKCkge1xuICAgIGlmICgndmlzaWJsZScgaW4gcHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm9wcy52aXNpYmxlO1xuICAgIH1cblxuICAgIHJldHVybiB2aXNpYmxlO1xuICB9O1xuXG4gIHZhciBzY3JvbGxUb1RvcCA9IGZ1bmN0aW9uIHNjcm9sbFRvVG9wKGUpIHtcbiAgICB2YXIgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgICAgIHRhcmdldCA9IHByb3BzLnRhcmdldCxcbiAgICAgICAgX3Byb3BzJGR1cmF0aW9uID0gcHJvcHMuZHVyYXRpb24sXG4gICAgICAgIGR1cmF0aW9uID0gX3Byb3BzJGR1cmF0aW9uID09PSB2b2lkIDAgPyA0NTAgOiBfcHJvcHMkZHVyYXRpb247XG4gICAgKDAsIF9zY3JvbGxUb1tcImRlZmF1bHRcIl0pKDAsIHtcbiAgICAgIGdldENvbnRhaW5lcjogdGFyZ2V0IHx8IGdldERlZmF1bHRUYXJnZXQsXG4gICAgICBkdXJhdGlvbjogZHVyYXRpb25cbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2Ygb25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb25DbGljayhlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJlbmRlckNoaWxkcmVuID0gZnVuY3Rpb24gcmVuZGVyQ2hpbGRyZW4oX3JlZikge1xuICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscztcbiAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgZGVmYXVsdEVsZW1lbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1ZlcnRpY2FsQWxpZ25Ub3BPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpKSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY0FuaW1hdGVbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBjb21wb25lbnQ6IFwiXCIsXG4gICAgICB0cmFuc2l0aW9uTmFtZTogXCJmYWRlXCJcbiAgICB9LCBnZXRWaXNpYmxlKCkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCBjaGlsZHJlbiB8fCBkZWZhdWx0RWxlbWVudCkgOiBudWxsKTtcbiAgfTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgX3Byb3BzJGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcyRjbGFzc05hbWUgPT09IHZvaWQgMCA/ICcnIDogX3Byb3BzJGNsYXNzTmFtZTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnYmFjay10b3AnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xhc3NTdHJpbmcgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTsgLy8gZml4IGh0dHBzOi8vZmIubWUvcmVhY3QtdW5rbm93bi1wcm9wXG5cbiAgdmFyIGRpdlByb3BzID0gKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkocHJvcHMsIFsncHJlZml4Q2xzJywgJ2NsYXNzTmFtZScsICdjaGlsZHJlbicsICd2aXNpYmlsaXR5SGVpZ2h0JywgJ3RhcmdldCcsICd2aXNpYmxlJ10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBkaXZQcm9wcywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmcsXG4gICAgb25DbGljazogc2Nyb2xsVG9Ub3AsXG4gICAgcmVmOiByZWZcbiAgfSksIHJlbmRlckNoaWxkcmVuKHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9KSk7XG59O1xuXG5CYWNrVG9wLmRlZmF1bHRQcm9wcyA9IHtcbiAgdmlzaWJpbGl0eUhlaWdodDogNDAwXG59O1xuXG52YXIgX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhCYWNrVG9wKTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG52YXIgUmliYm9uID0gZnVuY3Rpb24gUmliYm9uKF9yZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgICAgY29sb3IgPSBfcmVmLmNvbG9yLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgICAgdGV4dCA9IF9yZWYudGV4dCxcbiAgICAgIF9yZWYkcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ2VuZCcgOiBfcmVmJHBsYWNlbWVudDtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdyaWJib24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY29sb3JJblByZXNldCA9ICgwLCBfdXRpbHMuaXNQcmVzZXRDb2xvcikoY29sb3IpO1xuICB2YXIgcmliYm9uQ2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBsYWNlbWVudC1cIikuY29uY2F0KHBsYWNlbWVudCksIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sb3ItXCIpLmNvbmNhdChjb2xvciksIGNvbG9ySW5QcmVzZXQpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHZhciBjb2xvclN0eWxlID0ge307XG4gIHZhciBjb3JuZXJDb2xvclN0eWxlID0ge307XG5cbiAgaWYgKGNvbG9yICYmICFjb2xvckluUHJlc2V0KSB7XG4gICAgY29sb3JTdHlsZS5iYWNrZ3JvdW5kID0gY29sb3I7XG4gICAgY29ybmVyQ29sb3JTdHlsZS5jb2xvciA9IGNvbG9yO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlclwiKVxuICB9LCBjaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogcmliYm9uQ2xzLFxuICAgIHN0eWxlOiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBjb2xvclN0eWxlKSwgc3R5bGUpXG4gIH0sIHRleHQsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29ybmVyXCIpLFxuICAgIHN0eWxlOiBjb3JuZXJDb2xvclN0eWxlXG4gIH0pKSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBSaWJib247XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9yZWFjdE5vZGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvcmVhY3ROb2RlXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gZ2V0TnVtYmVyQXJyYXkobnVtKSB7XG4gIHJldHVybiBudW0gPyBudW0udG9TdHJpbmcoKS5zcGxpdCgnJykucmV2ZXJzZSgpLm1hcChmdW5jdGlvbiAoaSkge1xuICAgIHZhciBjdXJyZW50ID0gTnVtYmVyKGkpO1xuICAgIHJldHVybiBpc05hTihjdXJyZW50KSA/IGkgOiBjdXJyZW50O1xuICB9KSA6IFtdO1xufVxuXG5mdW5jdGlvbiByZW5kZXJOdW1iZXJMaXN0KHBvc2l0aW9uLCBjbGFzc05hbWUpIHtcbiAgdmFyIGNoaWxkcmVuVG9SZXR1cm4gPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDMwOyBpKyspIHtcbiAgICBjaGlsZHJlblRvUmV0dXJuLnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICBrZXk6IGkudG9TdHJpbmcoKSxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoY2xhc3NOYW1lLCB7XG4gICAgICAgIGN1cnJlbnQ6IHBvc2l0aW9uID09PSBpXG4gICAgICB9KVxuICAgIH0sIGkgJSAxMCkpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuVG9SZXR1cm47XG59XG5cbnZhciBTY3JvbGxOdW1iZXIgPSBmdW5jdGlvbiBTY3JvbGxOdW1iZXIoX2EpIHtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICAgIGN1c3RvbWl6ZUNvdW50ID0gX2EuY291bnQsXG4gICAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9hLnN0eWxlLFxuICAgICAgdGl0bGUgPSBfYS50aXRsZSxcbiAgICAgIF9hJGNvbXBvbmVudCA9IF9hLmNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudCA9IF9hJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ3N1cCcgOiBfYSRjb21wb25lbnQsXG4gICAgICBkaXNwbGF5Q29tcG9uZW50ID0gX2EuZGlzcGxheUNvbXBvbmVudCxcbiAgICAgIF9hJG9uQW5pbWF0ZWQgPSBfYS5vbkFuaW1hdGVkLFxuICAgICAgb25BbmltYXRlZCA9IF9hJG9uQW5pbWF0ZWQgPT09IHZvaWQgMCA/IGZ1bmN0aW9uICgpIHt9IDogX2Ekb25BbmltYXRlZCxcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY291bnRcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcInRpdGxlXCIsIFwiY29tcG9uZW50XCIsIFwiZGlzcGxheUNvbXBvbmVudFwiLCBcIm9uQW5pbWF0ZWRcIl0pO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh0cnVlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGFuaW1hdGVTdGFydGVkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldEFuaW1hdGVTdGFydGVkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGN1c3RvbWl6ZUNvdW50KSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgICBjb3VudCA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRDb3VudCA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShjdXN0b21pemVDb3VudCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU2ID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgICAgcHJldkNvdW50ID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICAgIHNldFByZXZDb3VudCA9IF9SZWFjdCR1c2VTdGF0ZTZbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTcgPSBSZWFjdC51c2VTdGF0ZShjdXN0b21pemVDb3VudCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU4ID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF9SZWFjdCR1c2VTdGF0ZTcsIDIpLFxuICAgICAgbGFzdENvdW50ID0gX1JlYWN0JHVzZVN0YXRlOFswXSxcbiAgICAgIHNldExhc3RDb3VudCA9IF9SZWFjdCR1c2VTdGF0ZThbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2Nyb2xsLW51bWJlcicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG5cbiAgaWYgKHByZXZDb3VudCAhPT0gY3VzdG9taXplQ291bnQpIHtcbiAgICBzZXRBbmltYXRlU3RhcnRlZCh0cnVlKTtcbiAgICBzZXRQcmV2Q291bnQoY3VzdG9taXplQ291bnQpO1xuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRMYXN0Q291bnQoY291bnQpO1xuICAgIHZhciB0aW1lb3V0O1xuXG4gICAgaWYgKGFuaW1hdGVTdGFydGVkKSB7XG4gICAgICAvLyBMZXQgYnJvd3NlciBoYXMgdGltZSB0byByZXNldCB0aGUgc2Nyb2xsZXIgYmVmb3JlIGFjdHVhbGx5XG4gICAgICAvLyBwZXJmb3JtaW5nIHRoZSB0cmFuc2l0aW9uLlxuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRBbmltYXRlU3RhcnRlZChmYWxzZSk7XG4gICAgICAgIHNldENvdW50KGN1c3RvbWl6ZUNvdW50KTtcbiAgICAgICAgb25BbmltYXRlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbYW5pbWF0ZVN0YXJ0ZWQsIGN1c3RvbWl6ZUNvdW50LCBvbkFuaW1hdGVkXSk7XG5cbiAgdmFyIGdldFBvc2l0aW9uQnlOdW0gPSBmdW5jdGlvbiBnZXRQb3NpdGlvbkJ5TnVtKG51bSwgaSkge1xuICAgIHZhciBjdXJyZW50Q291bnQgPSBNYXRoLmFicyhOdW1iZXIoY291bnQpKTtcbiAgICB2YXIgbHN0Q291bnQgPSBNYXRoLmFicyhOdW1iZXIobGFzdENvdW50KSk7XG4gICAgdmFyIGN1cnJlbnREaWdpdCA9IE1hdGguYWJzKGdldE51bWJlckFycmF5KGNvdW50KVtpXSk7XG4gICAgdmFyIGxhc3REaWdpdCA9IE1hdGguYWJzKGdldE51bWJlckFycmF5KGxzdENvdW50KVtpXSk7XG5cbiAgICBpZiAoYW5pbWF0ZVN0YXJ0ZWQpIHtcbiAgICAgIHJldHVybiAxMCArIG51bTtcbiAgICB9IC8vIOWQjOaWueWQkeWImeWcqOWQjOS4gOS+p+WIh+aNouaVsOWtl1xuXG5cbiAgICBpZiAoY3VycmVudENvdW50ID4gbHN0Q291bnQpIHtcbiAgICAgIGlmIChjdXJyZW50RGlnaXQgPj0gbGFzdERpZ2l0KSB7XG4gICAgICAgIHJldHVybiAxMCArIG51bTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDIwICsgbnVtO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50RGlnaXQgPD0gbGFzdERpZ2l0KSB7XG4gICAgICByZXR1cm4gMTAgKyBudW07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICB2YXIgcmVuZGVyQ3VycmVudE51bWJlciA9IGZ1bmN0aW9uIHJlbmRlckN1cnJlbnROdW1iZXIobnVtLCBpKSB7XG4gICAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICB2YXIgcG9zaXRpb24gPSBnZXRQb3NpdGlvbkJ5TnVtKG51bSwgaSk7XG4gICAgICB2YXIgcmVtb3ZlVHJhbnNpdGlvbiA9IGFuaW1hdGVTdGFydGVkIHx8IGdldE51bWJlckFycmF5KGxhc3RDb3VudClbaV0gPT09IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9ubHlcIiksXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgdHJhbnNpdGlvbjogcmVtb3ZlVHJhbnNpdGlvbiA/ICdub25lJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtc1RyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKFwiLmNvbmNhdCgtcG9zaXRpb24gKiAxMDAsIFwiJSlcIiksXG4gICAgICAgICAgV2Via2l0VHJhbnNmb3JtOiBcInRyYW5zbGF0ZVkoXCIuY29uY2F0KC1wb3NpdGlvbiAqIDEwMCwgXCIlKVwiKSxcbiAgICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWShcIi5jb25jYXQoLXBvc2l0aW9uICogMTAwLCBcIiUpXCIpXG4gICAgICAgIH0sXG4gICAgICAgIGtleTogaVxuICAgICAgfSwgcmVuZGVyTnVtYmVyTGlzdChwb3NpdGlvbiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vbmx5LXVuaXRcIikpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGtleTogXCJzeW1ib2xcIixcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zeW1ib2xcIilcbiAgICB9LCBudW0pO1xuICB9O1xuXG4gIHZhciByZW5kZXJOdW1iZXJFbGVtZW50ID0gZnVuY3Rpb24gcmVuZGVyTnVtYmVyRWxlbWVudCgpIHtcbiAgICBpZiAoY291bnQgJiYgTnVtYmVyKGNvdW50KSAlIDEgPT09IDApIHtcbiAgICAgIHJldHVybiBnZXROdW1iZXJBcnJheShjb3VudCkubWFwKGZ1bmN0aW9uIChudW0sIGkpIHtcbiAgICAgICAgcmV0dXJuIHJlbmRlckN1cnJlbnROdW1iZXIobnVtLCBpKTtcbiAgICAgIH0pLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnQ7XG4gIH07XG5cbiAgdmFyIG5ld1Byb3BzID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcmVzdFByb3BzKSwge1xuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgY2xhc3NOYW1lKSxcbiAgICB0aXRsZTogdGl0bGVcbiAgfSk7IC8vIGFsbG93IHNwZWNpZnkgdGhlIGJvcmRlclxuICAvLyBtb2NrIGJvcmRlci1jb2xvciBieSBib3gtc2hhZG93IGZvciBjb21wYXRpYmxlIHdpdGggb2xkIHVzYWdlOlxuICAvLyA8QmFkZ2UgY291bnQ9ezR9IHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJyNmZmYnLCBjb2xvcjogJyM5OTknLCBib3JkZXJDb2xvcjogJyNkOWQ5ZDknIH19IC8+XG5cbiAgaWYgKHN0eWxlICYmIHN0eWxlLmJvcmRlckNvbG9yKSB7XG4gICAgbmV3UHJvcHMuc3R5bGUgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBzdHlsZSksIHtcbiAgICAgIGJveFNoYWRvdzogXCIwIDAgMCAxcHggXCIuY29uY2F0KHN0eWxlLmJvcmRlckNvbG9yLCBcIiBpbnNldFwiKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRpc3BsYXlDb21wb25lbnQpIHtcbiAgICByZXR1cm4gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShkaXNwbGF5Q29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY3VzdG9tLWNvbXBvbmVudFwiKSwgZGlzcGxheUNvbXBvbmVudC5wcm9wcyAmJiBkaXNwbGF5Q29tcG9uZW50LnByb3BzLmNsYXNzTmFtZSlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChjb21wb25lbnQsIG5ld1Byb3BzLCByZW5kZXJOdW1iZXJFbGVtZW50KCkpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gU2Nyb2xsTnVtYmVyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY0FuaW1hdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1hbmltYXRlXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfU2Nyb2xsTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TY3JvbGxOdW1iZXJcIikpO1xuXG52YXIgX1JpYmJvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUmliYm9uXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfcmVhY3ROb2RlID0gcmVxdWlyZShcIi4uL191dGlsL3JlYWN0Tm9kZVwiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIEJhZGdlID0gZnVuY3Rpb24gQmFkZ2UoX2EpIHtcbiAgdmFyIF9jbGFzc05hbWVzMiwgX2NsYXNzTmFtZXMzO1xuXG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICBjdXN0b21pemVTY3JvbGxOdW1iZXJQcmVmaXhDbHMgPSBfYS5zY3JvbGxOdW1iZXJQcmVmaXhDbHMsXG4gICAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgICAgc3RhdHVzID0gX2Euc3RhdHVzLFxuICAgICAgdGV4dCA9IF9hLnRleHQsXG4gICAgICBjb2xvciA9IF9hLmNvbG9yLFxuICAgICAgX2EkY291bnQgPSBfYS5jb3VudCxcbiAgICAgIGNvdW50ID0gX2EkY291bnQgPT09IHZvaWQgMCA/IG51bGwgOiBfYSRjb3VudCxcbiAgICAgIF9hJG92ZXJmbG93Q291bnQgPSBfYS5vdmVyZmxvd0NvdW50LFxuICAgICAgb3ZlcmZsb3dDb3VudCA9IF9hJG92ZXJmbG93Q291bnQgPT09IHZvaWQgMCA/IDk5IDogX2Ekb3ZlcmZsb3dDb3VudCxcbiAgICAgIF9hJGRvdCA9IF9hLmRvdCxcbiAgICAgIGRvdCA9IF9hJGRvdCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSRkb3QsXG4gICAgICBfYSRzaXplID0gX2Euc2l6ZSxcbiAgICAgIHNpemUgPSBfYSRzaXplID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfYSRzaXplLFxuICAgICAgdGl0bGUgPSBfYS50aXRsZSxcbiAgICAgIG9mZnNldCA9IF9hLm9mZnNldCxcbiAgICAgIHN0eWxlID0gX2Euc3R5bGUsXG4gICAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgICBfYSRzaG93WmVybyA9IF9hLnNob3daZXJvLFxuICAgICAgc2hvd1plcm8gPSBfYSRzaG93WmVybyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSRzaG93WmVybyxcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwic2Nyb2xsTnVtYmVyUHJlZml4Q2xzXCIsIFwiY2hpbGRyZW5cIiwgXCJzdGF0dXNcIiwgXCJ0ZXh0XCIsIFwiY29sb3JcIiwgXCJjb3VudFwiLCBcIm92ZXJmbG93Q291bnRcIiwgXCJkb3RcIiwgXCJzaXplXCIsIFwidGl0bGVcIiwgXCJvZmZzZXRcIiwgXCJzdHlsZVwiLCBcImNsYXNzTmFtZVwiLCBcInNob3daZXJvXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdiYWRnZScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG5cbiAgdmFyIGdldE51bWJlcmVkRGlzcGxheUNvdW50ID0gZnVuY3Rpb24gZ2V0TnVtYmVyZWREaXNwbGF5Q291bnQoKSB7XG4gICAgdmFyIGRpc3BsYXlDb3VudCA9IGNvdW50ID4gb3ZlcmZsb3dDb3VudCA/IFwiXCIuY29uY2F0KG92ZXJmbG93Q291bnQsIFwiK1wiKSA6IGNvdW50O1xuICAgIHJldHVybiBkaXNwbGF5Q291bnQ7XG4gIH07XG5cbiAgdmFyIGhhc1N0YXR1cyA9IGZ1bmN0aW9uIGhhc1N0YXR1cygpIHtcbiAgICByZXR1cm4gc3RhdHVzICE9PSBudWxsICYmIHN0YXR1cyAhPT0gdW5kZWZpbmVkIHx8IGNvbG9yICE9PSBudWxsICYmIGNvbG9yICE9PSB1bmRlZmluZWQ7XG4gIH07XG5cbiAgdmFyIGlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcbiAgICB2YXIgbnVtYmVyZWREaXNwbGF5Q291bnQgPSBnZXROdW1iZXJlZERpc3BsYXlDb3VudCgpO1xuICAgIHJldHVybiBudW1iZXJlZERpc3BsYXlDb3VudCA9PT0gJzAnIHx8IG51bWJlcmVkRGlzcGxheUNvdW50ID09PSAwO1xuICB9O1xuXG4gIHZhciBpc0RvdCA9IGZ1bmN0aW9uIGlzRG90KCkge1xuICAgIHJldHVybiBkb3QgJiYgIWlzWmVybygpIHx8IGhhc1N0YXR1cygpO1xuICB9O1xuXG4gIHZhciBnZXREaXNwbGF5Q291bnQgPSBmdW5jdGlvbiBnZXREaXNwbGF5Q291bnQoKSB7XG4gICAgLy8gZG90IG1vZGUgZG9uJ3QgbmVlZCBjb3VudFxuICAgIGlmIChpc0RvdCgpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldE51bWJlcmVkRGlzcGxheUNvdW50KCk7XG4gIH07XG5cbiAgdmFyIGdldFNjcm9sbE51bWJlclRpdGxlID0gZnVuY3Rpb24gZ2V0U2Nyb2xsTnVtYmVyVGl0bGUoKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICByZXR1cm4gdGl0bGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiBjb3VudCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyA/IGNvdW50IDogdW5kZWZpbmVkO1xuICB9O1xuXG4gIHZhciBnZXRTdHlsZVdpdGhPZmZzZXQgPSBmdW5jdGlvbiBnZXRTdHlsZVdpdGhPZmZzZXQoKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICAgIHJldHVybiBvZmZzZXQgPyAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICBsZWZ0OiBwYXJzZUludChvZmZzZXRbMF0sIDEwKSxcbiAgICAgICAgbWFyZ2luVG9wOiBvZmZzZXRbMV1cbiAgICAgIH0sIHN0eWxlKSA6IHN0eWxlO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgPyAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgcmlnaHQ6IC1wYXJzZUludChvZmZzZXRbMF0sIDEwKSxcbiAgICAgIG1hcmdpblRvcDogb2Zmc2V0WzFdXG4gICAgfSwgc3R5bGUpIDogc3R5bGU7XG4gIH07XG5cbiAgdmFyIGlzSGlkZGVuID0gZnVuY3Rpb24gaXNIaWRkZW4oKSB7XG4gICAgdmFyIGRpc3BsYXlDb3VudCA9IGdldERpc3BsYXlDb3VudCgpO1xuICAgIHZhciBpc0VtcHR5ID0gZGlzcGxheUNvdW50ID09PSBudWxsIHx8IGRpc3BsYXlDb3VudCA9PT0gdW5kZWZpbmVkIHx8IGRpc3BsYXlDb3VudCA9PT0gJyc7XG4gICAgcmV0dXJuIChpc0VtcHR5IHx8IGlzWmVybygpICYmICFzaG93WmVybykgJiYgIWlzRG90KCk7XG4gIH07XG5cbiAgdmFyIHJlbmRlclN0YXR1c1RleHQgPSBmdW5jdGlvbiByZW5kZXJTdGF0dXNUZXh0KCkge1xuICAgIHZhciBoaWRkZW4gPSBpc0hpZGRlbigpO1xuICAgIHJldHVybiBoaWRkZW4gfHwgIXRleHQgPyBudWxsIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGF0dXMtdGV4dFwiKVxuICAgIH0sIHRleHQpO1xuICB9O1xuXG4gIHZhciByZW5kZXJEaXNwbGF5Q29tcG9uZW50ID0gZnVuY3Rpb24gcmVuZGVyRGlzcGxheUNvbXBvbmVudCgpIHtcbiAgICB2YXIgY3VzdG9tTm9kZSA9IGNvdW50O1xuXG4gICAgaWYgKCFjdXN0b21Ob2RlIHx8ICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKGN1c3RvbU5vZGUpICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShjdXN0b21Ob2RlLCB7XG4gICAgICBzdHlsZTogKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgZ2V0U3R5bGVXaXRoT2Zmc2V0KCkpLCBjdXN0b21Ob2RlLnByb3BzICYmIGN1c3RvbU5vZGUucHJvcHMuc3R5bGUpXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHJlbmRlckJhZGdlTnVtYmVyID0gZnVuY3Rpb24gcmVuZGVyQmFkZ2VOdW1iZXIoKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgdmFyIHNjcm9sbE51bWJlclByZWZpeENscyA9IGdldFByZWZpeENscygnc2Nyb2xsLW51bWJlcicsIGN1c3RvbWl6ZVNjcm9sbE51bWJlclByZWZpeENscyk7XG4gICAgdmFyIGRpc3BsYXlDb3VudCA9IGdldERpc3BsYXlDb3VudCgpO1xuICAgIHZhciBiRG90ID0gaXNEb3QoKTtcbiAgICB2YXIgaGlkZGVuID0gaXNIaWRkZW4oKTtcbiAgICB2YXIgc2Nyb2xsTnVtYmVyQ2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZG90XCIpLCBiRG90KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb3VudFwiKSwgIWJEb3QpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvdW50LXNtXCIpLCBzaXplID09PSAnc21hbGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tdWx0aXBsZS13b3Jkc1wiKSwgIWJEb3QgJiYgY291bnQgJiYgY291bnQudG9TdHJpbmcgJiYgY291bnQudG9TdHJpbmcoKS5sZW5ndGggPiAxKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGF0dXMtXCIpLmNvbmNhdChzdGF0dXMpLCAhIXN0YXR1cyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3RhdHVzLVwiKS5jb25jYXQoY29sb3IpLCAoMCwgX3V0aWxzLmlzUHJlc2V0Q29sb3IpKGNvbG9yKSksIF9jbGFzc05hbWVzKSk7XG4gICAgdmFyIHN0YXR1c1N0eWxlID0gZ2V0U3R5bGVXaXRoT2Zmc2V0KCk7XG5cbiAgICBpZiAoY29sb3IgJiYgISgwLCBfdXRpbHMuaXNQcmVzZXRDb2xvcikoY29sb3IpKSB7XG4gICAgICBzdGF0dXNTdHlsZSA9IHN0YXR1c1N0eWxlIHx8IHt9O1xuICAgICAgc3RhdHVzU3R5bGUuYmFja2dyb3VuZCA9IGNvbG9yO1xuICAgIH1cblxuICAgIHJldHVybiBoaWRkZW4gPyBudWxsIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1Njcm9sbE51bWJlcltcImRlZmF1bHRcIl0sIHtcbiAgICAgIHByZWZpeENsczogc2Nyb2xsTnVtYmVyUHJlZml4Q2xzLFxuICAgICAgXCJkYXRhLXNob3dcIjogIWhpZGRlbixcbiAgICAgIGNsYXNzTmFtZTogc2Nyb2xsTnVtYmVyQ2xzLFxuICAgICAgY291bnQ6IGRpc3BsYXlDb3VudCxcbiAgICAgIGRpc3BsYXlDb21wb25lbnQ6IHJlbmRlckRpc3BsYXlDb21wb25lbnQoKSAvLyA8QmFkZ2Ugc3RhdHVzPVwic3VjY2Vzc1wiIGNvdW50PXs8SWNvbiB0eXBlPVwieHh4XCIgLz59PjwvQmFkZ2U+XG4gICAgICAsXG4gICAgICB0aXRsZTogZ2V0U2Nyb2xsTnVtYmVyVGl0bGUoKSxcbiAgICAgIHN0eWxlOiBzdGF0dXNTdHlsZSxcbiAgICAgIGtleTogXCJzY3JvbGxOdW1iZXJcIlxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBzdGF0dXNDbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoX2NsYXNzTmFtZXMyID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0YXR1cy1kb3RcIiksIGhhc1N0YXR1cygpKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3RhdHVzLVwiKS5jb25jYXQoc3RhdHVzKSwgISFzdGF0dXMpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGF0dXMtXCIpLmNvbmNhdChjb2xvciksICgwLCBfdXRpbHMuaXNQcmVzZXRDb2xvcikoY29sb3IpKSwgX2NsYXNzTmFtZXMyKSk7XG4gIHZhciBzdGF0dXNTdHlsZSA9IHt9O1xuXG4gIGlmIChjb2xvciAmJiAhKDAsIF91dGlscy5pc1ByZXNldENvbG9yKShjb2xvcikpIHtcbiAgICBzdGF0dXNTdHlsZS5iYWNrZ3JvdW5kID0gY29sb3I7XG4gIH1cblxuICB2YXIgYmFkZ2VDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lczMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3RhdHVzXCIpLCBoYXNTdGF0dXMoKSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vdC1hLXdyYXBwZXJcIiksICFjaGlsZHJlbiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzMyksIGNsYXNzTmFtZSk7IC8vIDxCYWRnZSBzdGF0dXM9XCJzdWNjZXNzXCIgLz5cblxuICBpZiAoIWNoaWxkcmVuICYmIGhhc1N0YXR1cygpKSB7XG4gICAgdmFyIHN0eWxlV2l0aE9mZnNldCA9IGdldFN0eWxlV2l0aE9mZnNldCgpO1xuICAgIHZhciBzdGF0dXNUZXh0Q29sb3IgPSBzdHlsZVdpdGhPZmZzZXQgJiYgc3R5bGVXaXRoT2Zmc2V0LmNvbG9yO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByZXN0UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogYmFkZ2VDbGFzc05hbWUsXG4gICAgICBzdHlsZTogc3R5bGVXaXRoT2Zmc2V0XG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IHN0YXR1c0NscyxcbiAgICAgIHN0eWxlOiBzdGF0dXNTdHlsZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY29sb3I6IHN0YXR1c1RleHRDb2xvclxuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGF0dXMtdGV4dFwiKVxuICAgIH0sIHRleHQpKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByZXN0UHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGJhZGdlQ2xhc3NOYW1lXG4gIH0pLCBjaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjQW5pbWF0ZVtcImRlZmF1bHRcIl0sIHtcbiAgICBjb21wb25lbnQ6IFwiXCIsXG4gICAgc2hvd1Byb3A6IFwiZGF0YS1zaG93XCIsXG4gICAgdHJhbnNpdGlvbk5hbWU6IGNoaWxkcmVuID8gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi16b29tXCIpIDogJycsXG4gICAgdHJhbnNpdGlvbkFwcGVhcjogdHJ1ZVxuICB9LCByZW5kZXJCYWRnZU51bWJlcigpKSwgcmVuZGVyU3RhdHVzVGV4dCgpKTtcbn07XG5cbkJhZGdlLlJpYmJvbiA9IF9SaWJib25bXCJkZWZhdWx0XCJdO1xudmFyIF9kZWZhdWx0ID0gQmFkZ2U7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc1ByZXNldENvbG9yID0gaXNQcmVzZXRDb2xvcjtcblxudmFyIF9jb2xvcnMgPSByZXF1aXJlKFwiLi4vX3V0aWwvY29sb3JzXCIpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L3ByZWZlci1kZWZhdWx0LWV4cG9ydFxuZnVuY3Rpb24gaXNQcmVzZXRDb2xvcihjb2xvcikge1xuICByZXR1cm4gX2NvbG9ycy5QcmVzZXRDb2xvclR5cGVzLmluZGV4T2YoY29sb3IpICE9PSAtMTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxudmFyIF9CcmVhZGNydW1iSXRlbSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQnJlYWRjcnVtYkl0ZW1cIikpO1xuXG52YXIgX0JyZWFkY3J1bWJTZXBhcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0JyZWFkY3J1bWJTZXBhcmF0b3JcIikpO1xuXG52YXIgX21lbnUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9tZW51XCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWFjdE5vZGVcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG5mdW5jdGlvbiBnZXRCcmVhZGNydW1iTmFtZShyb3V0ZSwgcGFyYW1zKSB7XG4gIGlmICghcm91dGUuYnJlYWRjcnVtYk5hbWUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBwYXJhbXNLZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKS5qb2luKCd8Jyk7XG4gIHZhciBuYW1lID0gcm91dGUuYnJlYWRjcnVtYk5hbWUucmVwbGFjZShuZXcgUmVnRXhwKFwiOihcIi5jb25jYXQocGFyYW1zS2V5cywgXCIpXCIpLCAnZycpLCBmdW5jdGlvbiAocmVwbGFjZW1lbnQsIGtleSkge1xuICAgIHJldHVybiBwYXJhbXNba2V5XSB8fCByZXBsYWNlbWVudDtcbiAgfSk7XG4gIHJldHVybiBuYW1lO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0SXRlbVJlbmRlcihyb3V0ZSwgcGFyYW1zLCByb3V0ZXMsIHBhdGhzKSB7XG4gIHZhciBpc0xhc3RJdGVtID0gcm91dGVzLmluZGV4T2Yocm91dGUpID09PSByb3V0ZXMubGVuZ3RoIC0gMTtcbiAgdmFyIG5hbWUgPSBnZXRCcmVhZGNydW1iTmFtZShyb3V0ZSwgcGFyYW1zKTtcbiAgcmV0dXJuIGlzTGFzdEl0ZW0gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgbmFtZSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgIGhyZWY6IFwiIy9cIi5jb25jYXQocGF0aHMuam9pbignLycpKVxuICB9LCBuYW1lKTtcbn1cblxudmFyIGdldFBhdGggPSBmdW5jdGlvbiBnZXRQYXRoKHBhdGgsIHBhcmFtcykge1xuICBwYXRoID0gKHBhdGggfHwgJycpLnJlcGxhY2UoL15cXC8vLCAnJyk7XG4gIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZShcIjpcIi5jb25jYXQoa2V5KSwgcGFyYW1zW2tleV0pO1xuICB9KTtcbiAgcmV0dXJuIHBhdGg7XG59O1xuXG52YXIgYWRkQ2hpbGRQYXRoID0gZnVuY3Rpb24gYWRkQ2hpbGRQYXRoKHBhdGhzKSB7XG4gIHZhciBjaGlsZFBhdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBvcmlnaW5hbFBhdGhzID0gKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShwYXRocyk7XG4gIHZhciBwYXRoID0gZ2V0UGF0aChjaGlsZFBhdGgsIHBhcmFtcyk7XG5cbiAgaWYgKHBhdGgpIHtcbiAgICBvcmlnaW5hbFBhdGhzLnB1c2gocGF0aCk7XG4gIH1cblxuICByZXR1cm4gb3JpZ2luYWxQYXRocztcbn07XG5cbnZhciBCcmVhZGNydW1iID0gZnVuY3Rpb24gQnJlYWRjcnVtYihfYSkge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgX2Ekc2VwYXJhdG9yID0gX2Euc2VwYXJhdG9yLFxuICAgICAgc2VwYXJhdG9yID0gX2Ekc2VwYXJhdG9yID09PSB2b2lkIDAgPyAnLycgOiBfYSRzZXBhcmF0b3IsXG4gICAgICBzdHlsZSA9IF9hLnN0eWxlLFxuICAgICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgICAgcm91dGVzID0gX2Eucm91dGVzLFxuICAgICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICAgIF9hJGl0ZW1SZW5kZXIgPSBfYS5pdGVtUmVuZGVyLFxuICAgICAgaXRlbVJlbmRlciA9IF9hJGl0ZW1SZW5kZXIgPT09IHZvaWQgMCA/IGRlZmF1bHRJdGVtUmVuZGVyIDogX2EkaXRlbVJlbmRlcixcbiAgICAgIF9hJHBhcmFtcyA9IF9hLnBhcmFtcyxcbiAgICAgIHBhcmFtcyA9IF9hJHBhcmFtcyA9PT0gdm9pZCAwID8ge30gOiBfYSRwYXJhbXMsXG4gICAgICByZXN0UHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcInNlcGFyYXRvclwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwicm91dGVzXCIsIFwiY2hpbGRyZW5cIiwgXCJpdGVtUmVuZGVyXCIsIFwicGFyYW1zXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgY3J1bWJzO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdicmVhZGNydW1iJywgY3VzdG9taXplUHJlZml4Q2xzKTtcblxuICBpZiAocm91dGVzICYmIHJvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gZ2VuZXJhdGVkIGJ5IHJvdXRlXG4gICAgdmFyIHBhdGhzID0gW107XG4gICAgY3J1bWJzID0gcm91dGVzLm1hcChmdW5jdGlvbiAocm91dGUpIHtcbiAgICAgIHZhciBwYXRoID0gZ2V0UGF0aChyb3V0ZS5wYXRoLCBwYXJhbXMpO1xuXG4gICAgICBpZiAocGF0aCkge1xuICAgICAgICBwYXRocy5wdXNoKHBhdGgpO1xuICAgICAgfSAvLyBnZW5lcmF0ZWQgb3ZlcmxheSBieSByb3V0ZS5jaGlsZHJlblxuXG5cbiAgICAgIHZhciBvdmVybGF5O1xuXG4gICAgICBpZiAocm91dGUuY2hpbGRyZW4gJiYgcm91dGUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIG92ZXJsYXkgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfbWVudVtcImRlZmF1bHRcIl0sIG51bGwsIHJvdXRlLmNoaWxkcmVuLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX21lbnVbXCJkZWZhdWx0XCJdLkl0ZW0sIHtcbiAgICAgICAgICAgIGtleTogY2hpbGQucGF0aCB8fCBjaGlsZC5icmVhZGNydW1iTmFtZVxuICAgICAgICAgIH0sIGl0ZW1SZW5kZXIoY2hpbGQsIHBhcmFtcywgcm91dGVzLCBhZGRDaGlsZFBhdGgocGF0aHMsIGNoaWxkLnBhdGgsIHBhcmFtcykpKTtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0JyZWFkY3J1bWJJdGVtW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgICAgICBzZXBhcmF0b3I6IHNlcGFyYXRvcixcbiAgICAgICAga2V5OiBwYXRoIHx8IHJvdXRlLmJyZWFkY3J1bWJOYW1lXG4gICAgICB9LCBpdGVtUmVuZGVyKHJvdXRlLCBwYXJhbXMsIHJvdXRlcywgcGF0aHMpKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbikge1xuICAgIGNydW1icyA9ICgwLCBfdG9BcnJheVtcImRlZmF1bHRcIl0pKGNoaWxkcmVuKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9XG5cbiAgICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKGVsZW1lbnQudHlwZSAmJiAoZWxlbWVudC50eXBlLl9fQU5UX0JSRUFEQ1JVTUJfSVRFTSA9PT0gdHJ1ZSB8fCBlbGVtZW50LnR5cGUuX19BTlRfQlJFQURDUlVNQl9TRVBBUkFUT1IgPT09IHRydWUpLCAnQnJlYWRjcnVtYicsIFwiT25seSBhY2NlcHRzIEJyZWFkY3J1bWIuSXRlbSBhbmQgQnJlYWRjcnVtYi5TZXBhcmF0b3IgYXMgaXQncyBjaGlsZHJlblwiKTtcbiAgICAgIHJldHVybiAoMCwgX3JlYWN0Tm9kZS5jbG9uZUVsZW1lbnQpKGVsZW1lbnQsIHtcbiAgICAgICAgc2VwYXJhdG9yOiBzZXBhcmF0b3IsXG4gICAgICAgIGtleTogaW5kZXhcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGJyZWFkY3J1bWJDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgY2xhc3NOYW1lOiBicmVhZGNydW1iQ2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCByZXN0UHJvcHMpLCBjcnVtYnMpO1xufTtcblxuQnJlYWRjcnVtYi5JdGVtID0gX0JyZWFkY3J1bWJJdGVtW1wiZGVmYXVsdFwiXTtcbkJyZWFkY3J1bWIuU2VwYXJhdG9yID0gX0JyZWFkY3J1bWJTZXBhcmF0b3JbXCJkZWZhdWx0XCJdO1xudmFyIF9kZWZhdWx0ID0gQnJlYWRjcnVtYjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0Rvd25PdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Rvd25PdXRsaW5lZFwiKSk7XG5cbnZhciBfZHJvcGRvd24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9kcm9wZG93bi9kcm9wZG93blwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIEJyZWFkY3J1bWJJdGVtID0gZnVuY3Rpb24gQnJlYWRjcnVtYkl0ZW0oX2EpIHtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICAgIF9hJHNlcGFyYXRvciA9IF9hLnNlcGFyYXRvcixcbiAgICAgIHNlcGFyYXRvciA9IF9hJHNlcGFyYXRvciA9PT0gdm9pZCAwID8gJy8nIDogX2Ekc2VwYXJhdG9yLFxuICAgICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICAgIG92ZXJsYXkgPSBfYS5vdmVybGF5LFxuICAgICAgZHJvcGRvd25Qcm9wcyA9IF9hLmRyb3Bkb3duUHJvcHMsXG4gICAgICByZXN0UHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcInNlcGFyYXRvclwiLCBcImNoaWxkcmVuXCIsIFwib3ZlcmxheVwiLCBcImRyb3Bkb3duUHJvcHNcIl0pO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzO1xuXG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2JyZWFkY3J1bWInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAvKipcbiAgICogaWYgb3ZlcmxheSBpcyBoYXZlXG4gICAqIFdyYXAgYSBEcm9wRG93blxuICAgKi9cblxuICB2YXIgcmVuZGVyQnJlYWRjcnVtYk5vZGUgPSBmdW5jdGlvbiByZW5kZXJCcmVhZGNydW1iTm9kZShicmVhZGNydW1iSXRlbSkge1xuICAgIGlmIChvdmVybGF5KSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2Ryb3Bkb3duW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgb3ZlcmxheTogb3ZlcmxheSxcbiAgICAgICAgcGxhY2VtZW50OiBcImJvdHRvbUNlbnRlclwiXG4gICAgICB9LCBkcm9wZG93blByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW92ZXJsYXktbGlua1wiKVxuICAgICAgfSwgYnJlYWRjcnVtYkl0ZW0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Eb3duT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBicmVhZGNydW1iSXRlbTtcbiAgfTtcblxuICB2YXIgbGluaztcblxuICBpZiAoJ2hyZWYnIGluIHJlc3RQcm9wcykge1xuICAgIGxpbmsgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saW5rXCIpXG4gICAgfSwgcmVzdFByb3BzKSwgY2hpbGRyZW4pO1xuICB9IGVsc2Uge1xuICAgIGxpbmsgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saW5rXCIpXG4gICAgfSwgcmVzdFByb3BzKSwgY2hpbGRyZW4pO1xuICB9IC8vIHdyYXAgdG8gZHJvcERvd25cblxuXG4gIGxpbmsgPSByZW5kZXJCcmVhZGNydW1iTm9kZShsaW5rKTtcblxuICBpZiAoY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGxpbmssIHNlcGFyYXRvciAmJiBzZXBhcmF0b3IgIT09ICcnICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VwYXJhdG9yXCIpXG4gICAgfSwgc2VwYXJhdG9yKSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbkJyZWFkY3J1bWJJdGVtLl9fQU5UX0JSRUFEQ1JVTUJfSVRFTSA9IHRydWU7XG52YXIgX2RlZmF1bHQgPSBCcmVhZGNydW1iSXRlbTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBCcmVhZGNydW1iU2VwYXJhdG9yID0gZnVuY3Rpb24gQnJlYWRjcnVtYlNlcGFyYXRvcihfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnYnJlYWRjcnVtYicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VwYXJhdG9yXCIpXG4gIH0sIGNoaWxkcmVuIHx8ICcvJyk7XG59O1xuXG5CcmVhZGNydW1iU2VwYXJhdG9yLl9fQU5UX0JSRUFEQ1JVTUJfU0VQQVJBVE9SID0gdHJ1ZTtcbnZhciBfZGVmYXVsdCA9IEJyZWFkY3J1bWJTZXBhcmF0b3I7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX0JyZWFkY3J1bWIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0JyZWFkY3J1bWJcIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfQnJlYWRjcnVtYltcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gTG9hZGluZ0ljb247XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3JjTW90aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtbW90aW9uXCIpKTtcblxudmFyIF9Mb2FkaW5nT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Mb2FkaW5nT3V0bGluZWRcIikpO1xuXG52YXIgZ2V0Q29sbGFwc2VkV2lkdGggPSBmdW5jdGlvbiBnZXRDb2xsYXBzZWRXaWR0aCgpIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogMCxcbiAgICBvcGFjaXR5OiAwLFxuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApJ1xuICB9O1xufTtcblxudmFyIGdldFJlYWxXaWR0aCA9IGZ1bmN0aW9uIGdldFJlYWxXaWR0aChub2RlKSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IG5vZGUuc2Nyb2xsV2lkdGgsXG4gICAgb3BhY2l0eTogMSxcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIExvYWRpbmdJY29uKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgbG9hZGluZyA9IF9yZWYubG9hZGluZyxcbiAgICAgIGV4aXN0SWNvbiA9IF9yZWYuZXhpc3RJY29uO1xuICB2YXIgdmlzaWJsZSA9ICEhbG9hZGluZztcblxuICBpZiAoZXhpc3RJY29uKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZy1pY29uXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvYWRpbmdPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNNb3Rpb25bXCJkZWZhdWx0XCJdLCB7XG4gICAgdmlzaWJsZTogdmlzaWJsZSAvLyBXZSBkbyBub3QgcmVhbGx5IHVzZSB0aGlzIG1vdGlvbk5hbWVcbiAgICAsXG4gICAgbW90aW9uTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sb2FkaW5nLWljb24tbW90aW9uXCIpLFxuICAgIHJlbW92ZU9uTGVhdmU6IHRydWUsXG4gICAgb25BcHBlYXJTdGFydDogZ2V0Q29sbGFwc2VkV2lkdGgsXG4gICAgb25BcHBlYXJBY3RpdmU6IGdldFJlYWxXaWR0aCxcbiAgICBvbkVudGVyU3RhcnQ6IGdldENvbGxhcHNlZFdpZHRoLFxuICAgIG9uRW50ZXJBY3RpdmU6IGdldFJlYWxXaWR0aCxcbiAgICBvbkxlYXZlU3RhcnQ6IGdldFJlYWxXaWR0aCxcbiAgICBvbkxlYXZlQWN0aXZlOiBnZXRDb2xsYXBzZWRXaWR0aFxuICB9LCBmdW5jdGlvbiAoX3JlZjIsIHJlZikge1xuICAgIHZhciBjbGFzc05hbWUgPSBfcmVmMi5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3JlZjIuc3R5bGU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZy1pY29uXCIpLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgcmVmOiByZWZcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTG9hZGluZ091dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShjbGFzc05hbWUpXG4gICAgfSkpO1xuICB9KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF91bnJlYWNoYWJsZUV4Y2VwdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL3VucmVhY2hhYmxlRXhjZXB0aW9uXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBCdXR0b25Hcm91cCA9IGZ1bmN0aW9uIEJ1dHRvbkdyb3VwKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgdmFyIGdldFByZWZpeENscyA9IF9yZWYuZ2V0UHJlZml4Q2xzLFxuICAgICAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbjtcblxuICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwic2l6ZVwiLCBcImNsYXNzTmFtZVwiXSk7XG5cbiAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdidG4tZ3JvdXAnLCBjdXN0b21pemVQcmVmaXhDbHMpOyAvLyBsYXJnZSA9PiBsZ1xuICAgIC8vIHNtYWxsID0+IHNtXG5cbiAgICB2YXIgc2l6ZUNscyA9ICcnO1xuXG4gICAgc3dpdGNoIChzaXplKSB7XG4gICAgICBjYXNlICdsYXJnZSc6XG4gICAgICAgIHNpemVDbHMgPSAnbGcnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc21hbGwnOlxuICAgICAgICBzaXplQ2xzID0gJ3NtJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ21pZGRsZSc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihuZXcgX3VucmVhY2hhYmxlRXhjZXB0aW9uW1wiZGVmYXVsdFwiXShzaXplKSk7XG4gICAgfVxuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZUNscyksIHNpemVDbHMpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBvdGhlcnMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pKTtcbiAgfSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBCdXR0b25Hcm91cDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jb252ZXJ0TGVnYWN5UHJvcHMgPSBjb252ZXJ0TGVnYWN5UHJvcHM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9idXR0b25Hcm91cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYnV0dG9uLWdyb3VwXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfd2F2ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL3dhdmVcIikpO1xuXG52YXIgX3R5cGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvdHlwZVwiKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfU2l6ZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHRcIikpO1xuXG52YXIgX0xvYWRpbmdJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2FkaW5nSWNvblwiKSk7XG5cbnZhciBfcmVhY3ROb2RlID0gcmVxdWlyZShcIi4uL191dGlsL3JlYWN0Tm9kZVwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9idXR0b24taGFzLXR5cGUgKi9cblxuXG52YXIgcnhUd29DTkNoYXIgPSAvXltcXHU0ZTAwLVxcdTlmYTVdezJ9JC87XG52YXIgaXNUd29DTkNoYXIgPSByeFR3b0NOQ2hhci50ZXN0LmJpbmQocnhUd29DTkNoYXIpO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc1VuYm9yZGVyZWRCdXR0b25UeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0JyB8fCB0eXBlID09PSAnbGluayc7XG59IC8vIEluc2VydCBvbmUgc3BhY2UgYmV0d2VlbiB0d28gY2hpbmVzZSBjaGFyYWN0ZXJzIGF1dG9tYXRpY2FsbHkuXG5cblxuZnVuY3Rpb24gaW5zZXJ0U3BhY2UoY2hpbGQsIG5lZWRJbnNlcnRlZCkge1xuICAvLyBDaGVjayB0aGUgY2hpbGQgaWYgaXMgdW5kZWZpbmVkIG9yIG51bGwuXG4gIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFNQQUNFID0gbmVlZEluc2VydGVkID8gJyAnIDogJyc7IC8vIHN0cmljdE51bGxDaGVja3Mgb29wcy5cblxuICBpZiAodHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgY2hpbGQgIT09ICdudW1iZXInICYmIGlzU3RyaW5nKGNoaWxkLnR5cGUpICYmIGlzVHdvQ05DaGFyKGNoaWxkLnByb3BzLmNoaWxkcmVuKSkge1xuICAgIHJldHVybiAoMCwgX3JlYWN0Tm9kZS5jbG9uZUVsZW1lbnQpKGNoaWxkLCB7XG4gICAgICBjaGlsZHJlbjogY2hpbGQucHJvcHMuY2hpbGRyZW4uc3BsaXQoJycpLmpvaW4oU1BBQ0UpXG4gICAgfSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgIGlmIChpc1R3b0NOQ2hhcihjaGlsZCkpIHtcbiAgICAgIGNoaWxkID0gY2hpbGQuc3BsaXQoJycpLmpvaW4oU1BBQ0UpO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkO1xufVxuXG5mdW5jdGlvbiBzcGFjZUNoaWxkcmVuKGNoaWxkcmVuLCBuZWVkSW5zZXJ0ZWQpIHtcbiAgdmFyIGlzUHJldkNoaWxkUHVyZSA9IGZhbHNlO1xuICB2YXIgY2hpbGRMaXN0ID0gW107XG4gIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHZhciB0eXBlID0gKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoY2hpbGQpO1xuICAgIHZhciBpc0N1cnJlbnRDaGlsZFB1cmUgPSB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJztcblxuICAgIGlmIChpc1ByZXZDaGlsZFB1cmUgJiYgaXNDdXJyZW50Q2hpbGRQdXJlKSB7XG4gICAgICB2YXIgbGFzdEluZGV4ID0gY2hpbGRMaXN0Lmxlbmd0aCAtIDE7XG4gICAgICB2YXIgbGFzdENoaWxkID0gY2hpbGRMaXN0W2xhc3RJbmRleF07XG4gICAgICBjaGlsZExpc3RbbGFzdEluZGV4XSA9IFwiXCIuY29uY2F0KGxhc3RDaGlsZCkuY29uY2F0KGNoaWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRMaXN0LnB1c2goY2hpbGQpO1xuICAgIH1cblxuICAgIGlzUHJldkNoaWxkUHVyZSA9IGlzQ3VycmVudENoaWxkUHVyZTtcbiAgfSk7IC8vIFBhc3MgdG8gUmVhY3QuQ2hpbGRyZW4ubWFwIHRvIGF1dG8gZmlsbCBrZXlcblxuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkTGlzdCwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGluc2VydFNwYWNlKGNoaWxkLCBuZWVkSW5zZXJ0ZWQpO1xuICB9KTtcbn1cblxudmFyIEJ1dHRvblR5cGVzID0gKDAsIF90eXBlLnR1cGxlKSgnZGVmYXVsdCcsICdwcmltYXJ5JywgJ2dob3N0JywgJ2Rhc2hlZCcsICdsaW5rJywgJ3RleHQnKTtcbnZhciBCdXR0b25TaGFwZXMgPSAoMCwgX3R5cGUudHVwbGUpKCdjaXJjbGUnLCAnY2lyY2xlLW91dGxpbmUnLCAncm91bmQnKTtcbnZhciBCdXR0b25IVE1MVHlwZXMgPSAoMCwgX3R5cGUudHVwbGUpKCdzdWJtaXQnLCAnYnV0dG9uJywgJ3Jlc2V0Jyk7XG5cbmZ1bmN0aW9uIGNvbnZlcnRMZWdhY3lQcm9wcyh0eXBlKSB7XG4gIGlmICh0eXBlID09PSAnZGFuZ2VyJykge1xuICAgIHJldHVybiB7XG4gICAgICBkYW5nZXI6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiB0eXBlXG4gIH07XG59XG5cbnZhciBJbnRlcm5hbEJ1dHRvbiA9IGZ1bmN0aW9uIEludGVybmFsQnV0dG9uKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHR5cGUgPSBwcm9wcy50eXBlLFxuICAgICAgZGFuZ2VyID0gcHJvcHMuZGFuZ2VyLFxuICAgICAgc2hhcGUgPSBwcm9wcy5zaGFwZSxcbiAgICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGljb24gPSBwcm9wcy5pY29uLFxuICAgICAgZ2hvc3QgPSBwcm9wcy5naG9zdCxcbiAgICAgIGJsb2NrID0gcHJvcHMuYmxvY2ssXG4gICAgICByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJsb2FkaW5nXCIsIFwicHJlZml4Q2xzXCIsIFwidHlwZVwiLCBcImRhbmdlclwiLCBcInNoYXBlXCIsIFwic2l6ZVwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiaWNvblwiLCBcImdob3N0XCIsIFwiYmxvY2tcIl0pO1xuXG4gIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChfU2l6ZUNvbnRleHRbXCJkZWZhdWx0XCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoISFsb2FkaW5nKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGlubmVyTG9hZGluZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRMb2FkaW5nID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgICBoYXNUd29DTkNoYXIgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0SGFzVHdvQ05DaGFyID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uID0gX1JlYWN0JHVzZUNvbnRleHQuYXV0b0luc2VydFNwYWNlSW5CdXR0b24sXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIGJ1dHRvblJlZiA9IHJlZiB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gIHZhciBkZWxheVRpbWVvdXRSZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICB2YXIgaXNOZWVkSW5zZXJ0ZWQgPSBmdW5jdGlvbiBpc05lZWRJbnNlcnRlZCgpIHtcbiAgICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID09PSAxICYmICFpY29uICYmICFpc1VuYm9yZGVyZWRCdXR0b25UeXBlKHR5cGUpO1xuICB9O1xuXG4gIHZhciBmaXhUd29DTkNoYXIgPSBmdW5jdGlvbiBmaXhUd29DTkNoYXIoKSB7XG4gICAgLy8gRml4IGZvciBIT0MgdXNhZ2UgbGlrZSA8Rm9ybWF0TWVzc2FnZSAvPlxuICAgIGlmICghYnV0dG9uUmVmIHx8ICFidXR0b25SZWYuY3VycmVudCB8fCBhdXRvSW5zZXJ0U3BhY2VJbkJ1dHRvbiA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYnV0dG9uVGV4dCA9IGJ1dHRvblJlZi5jdXJyZW50LnRleHRDb250ZW50O1xuXG4gICAgaWYgKGlzTmVlZEluc2VydGVkKCkgJiYgaXNUd29DTkNoYXIoYnV0dG9uVGV4dCkpIHtcbiAgICAgIGlmICghaGFzVHdvQ05DaGFyKSB7XG4gICAgICAgIHNldEhhc1R3b0NOQ2hhcih0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhhc1R3b0NOQ2hhcikge1xuICAgICAgc2V0SGFzVHdvQ05DaGFyKGZhbHNlKTtcbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PSBVcGRhdGUgTG9hZGluZyA9PT09PT09PT09PT09PT1cblxuXG4gIHZhciBsb2FkaW5nT3JEZWxheTtcblxuICBpZiAoKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkobG9hZGluZykgPT09ICdvYmplY3QnICYmIGxvYWRpbmcuZGVsYXkpIHtcbiAgICBsb2FkaW5nT3JEZWxheSA9IGxvYWRpbmcuZGVsYXkgfHwgdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBsb2FkaW5nT3JEZWxheSA9ICEhbG9hZGluZztcbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGRlbGF5VGltZW91dFJlZi5jdXJyZW50KTtcblxuICAgIGlmICh0eXBlb2YgbG9hZGluZ09yRGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICBkZWxheVRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0TG9hZGluZyhsb2FkaW5nT3JEZWxheSk7XG4gICAgICB9LCBsb2FkaW5nT3JEZWxheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldExvYWRpbmcobG9hZGluZ09yRGVsYXkpO1xuICAgIH1cbiAgfSwgW2xvYWRpbmdPckRlbGF5XSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZml4VHdvQ05DaGFyKCk7XG4gIH0sIFtidXR0b25SZWZdKTtcblxuICB2YXIgaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhlKSB7XG4gICAgdmFyIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrO1xuXG4gICAgaWYgKGlubmVyTG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvbkNsaWNrKSB7XG4gICAgICBvbkNsaWNrKGUpO1xuICAgIH1cbiAgfTtcblxuICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghKHR5cGVvZiBpY29uID09PSAnc3RyaW5nJyAmJiBpY29uLmxlbmd0aCA+IDIpLCAnQnV0dG9uJywgXCJgaWNvbmAgaXMgdXNpbmcgUmVhY3ROb2RlIGluc3RlYWQgb2Ygc3RyaW5nIG5hbWluZyBpbiB2NC4gUGxlYXNlIGNoZWNrIGBcIi5jb25jYXQoaWNvbiwgXCJgIGF0IGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2ljb25cIikpO1xuICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghKGdob3N0ICYmIGlzVW5ib3JkZXJlZEJ1dHRvblR5cGUodHlwZSkpLCAnQnV0dG9uJywgXCJgbGlua2Agb3IgYHRleHRgIGJ1dHRvbiBjYW4ndCBiZSBhIGBnaG9zdGAgYnV0dG9uLlwiKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnYnRuJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGF1dG9JbnNlcnRTcGFjZSA9IGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uICE9PSBmYWxzZTsgLy8gbGFyZ2UgPT4gbGdcbiAgLy8gc21hbGwgPT4gc21cblxuICB2YXIgc2l6ZUNscyA9ICcnO1xuXG4gIHN3aXRjaCAoY3VzdG9taXplU2l6ZSB8fCBzaXplKSB7XG4gICAgY2FzZSAnbGFyZ2UnOlxuICAgICAgc2l6ZUNscyA9ICdsZyc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NtYWxsJzpcbiAgICAgIHNpemVDbHMgPSAnc20nO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgaWNvblR5cGUgPSBpbm5lckxvYWRpbmcgPyAnbG9hZGluZycgOiBpY29uO1xuICB2YXIgY2xhc3NlcyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdCh0eXBlKSwgdHlwZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaGFwZSksIHNoYXBlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemVDbHMpLCBzaXplQ2xzKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uLW9ubHlcIiksICFjaGlsZHJlbiAmJiBjaGlsZHJlbiAhPT0gMCAmJiBpY29uVHlwZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmFja2dyb3VuZC1naG9zdFwiKSwgZ2hvc3QgJiYgIWlzVW5ib3JkZXJlZEJ1dHRvblR5cGUodHlwZSkpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmdcIiksIGlubmVyTG9hZGluZyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHdvLWNoaW5lc2UtY2hhcnNcIiksIGhhc1R3b0NOQ2hhciAmJiBhdXRvSW5zZXJ0U3BhY2UpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJsb2NrXCIpLCBibG9jayksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGFuZ2Vyb3VzXCIpLCAhIWRhbmdlciksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICB2YXIgaWNvbk5vZGUgPSBpY29uICYmICFpbm5lckxvYWRpbmcgPyBpY29uIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvYWRpbmdJY29uW1wiZGVmYXVsdFwiXSwge1xuICAgIGV4aXN0SWNvbjogISFpY29uLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGxvYWRpbmc6ICEhaW5uZXJMb2FkaW5nXG4gIH0pO1xuICB2YXIga2lkcyA9IGNoaWxkcmVuIHx8IGNoaWxkcmVuID09PSAwID8gc3BhY2VDaGlsZHJlbihjaGlsZHJlbiwgaXNOZWVkSW5zZXJ0ZWQoKSAmJiBhdXRvSW5zZXJ0U3BhY2UpIDogbnVsbDtcbiAgdmFyIGxpbmtCdXR0b25SZXN0UHJvcHMgPSAoMCwgX29taXRbXCJkZWZhdWx0XCJdKShyZXN0LCBbJ2h0bWxUeXBlJywgJ2xvYWRpbmcnLCAnbmF2aWdhdGUnXSk7XG5cbiAgaWYgKGxpbmtCdXR0b25SZXN0UHJvcHMuaHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGxpbmtCdXR0b25SZXN0UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgICAgcmVmOiBidXR0b25SZWZcbiAgICB9KSwgaWNvbk5vZGUsIGtpZHMpO1xuICB9IC8vIFJlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYGh0bWxUeXBlYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIEhlcmUgd2UgcGljayBpdCBvdXQgb2YgYHJlc3RgLlxuXG5cbiAgdmFyIF9hID0gcmVzdCxcbiAgICAgIGh0bWxUeXBlID0gX2EuaHRtbFR5cGUsXG4gICAgICBvdGhlclByb3BzID0gX19yZXN0KF9hLCBbXCJodG1sVHlwZVwiXSk7XG5cbiAgdmFyIGJ1dHRvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKG90aGVyUHJvcHMsIFsnbG9hZGluZyddKSwge1xuICAgIHR5cGU6IGh0bWxUeXBlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICByZWY6IGJ1dHRvblJlZlxuICB9KSwgaWNvbk5vZGUsIGtpZHMpO1xuXG4gIGlmIChpc1VuYm9yZGVyZWRCdXR0b25UeXBlKHR5cGUpKSB7XG4gICAgcmV0dXJuIGJ1dHRvbk5vZGU7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3dhdmVbXCJkZWZhdWx0XCJdLCBudWxsLCBidXR0b25Ob2RlKTtcbn07XG5cbnZhciBCdXR0b24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbEJ1dHRvbik7XG5CdXR0b24uZGlzcGxheU5hbWUgPSAnQnV0dG9uJztcbkJ1dHRvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGxvYWRpbmc6IGZhbHNlLFxuICBnaG9zdDogZmFsc2UsXG4gIGJsb2NrOiBmYWxzZSxcbiAgaHRtbFR5cGU6ICdidXR0b24nXG59O1xuQnV0dG9uLkdyb3VwID0gX2J1dHRvbkdyb3VwW1wiZGVmYXVsdFwiXTtcbkJ1dHRvbi5fX0FOVF9CVVRUT04gPSB0cnVlO1xudmFyIF9kZWZhdWx0ID0gQnV0dG9uO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9idXR0b24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2J1dHRvblwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9idXR0b25bXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3NlbGVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3NlbGVjdFwiKSk7XG5cbnZhciBfcmFkaW8gPSByZXF1aXJlKFwiLi4vcmFkaW9cIik7XG5cbnZhciBZZWFyU2VsZWN0T2Zmc2V0ID0gMTA7XG52YXIgWWVhclNlbGVjdFRvdGFsID0gMjA7XG5cbmZ1bmN0aW9uIFllYXJTZWxlY3QocHJvcHMpIHtcbiAgdmFyIGZ1bGxzY3JlZW4gPSBwcm9wcy5mdWxsc2NyZWVuLFxuICAgICAgdmFsaWRSYW5nZSA9IHByb3BzLnZhbGlkUmFuZ2UsXG4gICAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIF9vbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgZGl2UmVmID0gcHJvcHMuZGl2UmVmO1xuICB2YXIgeWVhciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIodmFsdWUpO1xuICB2YXIgc3RhcnQgPSB5ZWFyIC0gWWVhclNlbGVjdE9mZnNldDtcbiAgdmFyIGVuZCA9IHN0YXJ0ICsgWWVhclNlbGVjdFRvdGFsO1xuXG4gIGlmICh2YWxpZFJhbmdlKSB7XG4gICAgc3RhcnQgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKHZhbGlkUmFuZ2VbMF0pO1xuICAgIGVuZCA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIodmFsaWRSYW5nZVsxXSkgKyAxO1xuICB9XG5cbiAgdmFyIHN1ZmZpeCA9IGxvY2FsZSAmJiBsb2NhbGUueWVhciA9PT0gJ+W5tCcgPyAn5bm0JyA6ICcnO1xuICB2YXIgb3B0aW9ucyA9IFtdO1xuXG4gIGZvciAodmFyIGluZGV4ID0gc3RhcnQ7IGluZGV4IDwgZW5kOyBpbmRleCsrKSB7XG4gICAgb3B0aW9ucy5wdXNoKHtcbiAgICAgIGxhYmVsOiBcIlwiLmNvbmNhdChpbmRleCkuY29uY2F0KHN1ZmZpeCksXG4gICAgICB2YWx1ZTogaW5kZXhcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfc2VsZWN0W1wiZGVmYXVsdFwiXSwge1xuICAgIHNpemU6IGZ1bGxzY3JlZW4gPyB1bmRlZmluZWQgOiAnc21hbGwnLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgdmFsdWU6IHllYXIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXllYXItc2VsZWN0XCIpLFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShudW1ZZWFyKSB7XG4gICAgICB2YXIgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldFllYXIodmFsdWUsIG51bVllYXIpO1xuXG4gICAgICBpZiAodmFsaWRSYW5nZSkge1xuICAgICAgICB2YXIgX3ZhbGlkUmFuZ2UgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkodmFsaWRSYW5nZSwgMiksXG4gICAgICAgICAgICBzdGFydERhdGUgPSBfdmFsaWRSYW5nZVswXSxcbiAgICAgICAgICAgIGVuZERhdGUgPSBfdmFsaWRSYW5nZVsxXTtcblxuICAgICAgICB2YXIgbmV3WWVhciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIobmV3RGF0ZSk7XG4gICAgICAgIHZhciBuZXdNb250aCA9IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKG5ld0RhdGUpO1xuXG4gICAgICAgIGlmIChuZXdZZWFyID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGVuZERhdGUpICYmIG5ld01vbnRoID4gZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZW5kRGF0ZSkpIHtcbiAgICAgICAgICBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0TW9udGgobmV3RGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZW5kRGF0ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1llYXIgPT09IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoc3RhcnREYXRlKSAmJiBuZXdNb250aCA8IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKHN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgICBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0TW9udGgobmV3RGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoc3RhcnREYXRlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgIH0sXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGZ1bmN0aW9uIGdldFBvcHVwQ29udGFpbmVyKCkge1xuICAgICAgcmV0dXJuIGRpdlJlZi5jdXJyZW50O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIE1vbnRoU2VsZWN0KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBmdWxsc2NyZWVuID0gcHJvcHMuZnVsbHNjcmVlbixcbiAgICAgIHZhbGlkUmFuZ2UgPSBwcm9wcy52YWxpZFJhbmdlLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICBfb25DaGFuZ2UyID0gcHJvcHMub25DaGFuZ2UsXG4gICAgICBkaXZSZWYgPSBwcm9wcy5kaXZSZWY7XG4gIHZhciBtb250aCA9IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKHZhbHVlKTtcbiAgdmFyIHN0YXJ0ID0gMDtcbiAgdmFyIGVuZCA9IDExO1xuXG4gIGlmICh2YWxpZFJhbmdlKSB7XG4gICAgdmFyIF92YWxpZFJhbmdlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKSh2YWxpZFJhbmdlLCAyKSxcbiAgICAgICAgcmFuZ2VTdGFydCA9IF92YWxpZFJhbmdlMlswXSxcbiAgICAgICAgcmFuZ2VFbmQgPSBfdmFsaWRSYW5nZTJbMV07XG5cbiAgICB2YXIgY3VycmVudFllYXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKHZhbHVlKTtcblxuICAgIGlmIChnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKHJhbmdlRW5kKSA9PT0gY3VycmVudFllYXIpIHtcbiAgICAgIGVuZCA9IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKHJhbmdlRW5kKTtcbiAgICB9XG5cbiAgICBpZiAoZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihyYW5nZVN0YXJ0KSA9PT0gY3VycmVudFllYXIpIHtcbiAgICAgIHN0YXJ0ID0gZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgocmFuZ2VTdGFydCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1vbnRocyA9IGxvY2FsZS5zaG9ydE1vbnRocyB8fCBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0U2hvcnRNb250aHMobG9jYWxlLmxvY2FsZSk7XG4gIHZhciBvcHRpb25zID0gW107XG5cbiAgZm9yICh2YXIgaW5kZXggPSBzdGFydDsgaW5kZXggPD0gZW5kOyBpbmRleCArPSAxKSB7XG4gICAgb3B0aW9ucy5wdXNoKHtcbiAgICAgIGxhYmVsOiBtb250aHNbaW5kZXhdLFxuICAgICAgdmFsdWU6IGluZGV4XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3NlbGVjdFtcImRlZmF1bHRcIl0sIHtcbiAgICBzaXplOiBmdWxsc2NyZWVuID8gdW5kZWZpbmVkIDogJ3NtYWxsJyxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW9udGgtc2VsZWN0XCIpLFxuICAgIHZhbHVlOiBtb250aCxcbiAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShuZXdNb250aCkge1xuICAgICAgX29uQ2hhbmdlMihnZW5lcmF0ZUNvbmZpZy5zZXRNb250aCh2YWx1ZSwgbmV3TW9udGgpKTtcbiAgICB9LFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBmdW5jdGlvbiBnZXRQb3B1cENvbnRhaW5lcigpIHtcbiAgICAgIHJldHVybiBkaXZSZWYuY3VycmVudDtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBNb2RlU3dpdGNoKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICAgIGZ1bGxzY3JlZW4gPSBwcm9wcy5mdWxsc2NyZWVuLFxuICAgICAgb25Nb2RlQ2hhbmdlID0gcHJvcHMub25Nb2RlQ2hhbmdlO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JhZGlvLkdyb3VwLCB7XG4gICAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKF9yZWYpIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9yZWYudGFyZ2V0LnZhbHVlO1xuICAgICAgb25Nb2RlQ2hhbmdlKHZhbHVlKTtcbiAgICB9LFxuICAgIHZhbHVlOiBtb2RlLFxuICAgIHNpemU6IGZ1bGxzY3JlZW4gPyB1bmRlZmluZWQgOiAnc21hbGwnLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tb2RlLXN3aXRjaFwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmFkaW8uQnV0dG9uLCB7XG4gICAgdmFsdWU6IFwibW9udGhcIlxuICB9LCBsb2NhbGUubW9udGgpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmFkaW8uQnV0dG9uLCB7XG4gICAgdmFsdWU6IFwieWVhclwiXG4gIH0sIGxvY2FsZS55ZWFyKSk7XG59XG5cbmZ1bmN0aW9uIENhbGVuZGFySGVhZGVyKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBmdWxsc2NyZWVuID0gcHJvcHMuZnVsbHNjcmVlbixcbiAgICAgIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICAgIG9uTW9kZUNoYW5nZSA9IHByb3BzLm9uTW9kZUNoYW5nZTtcbiAgdmFyIGRpdlJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHNoYXJlZFByb3BzID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcHJvcHMpLCB7XG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgIGZ1bGxzY3JlZW46IGZ1bGxzY3JlZW4sXG4gICAgZGl2UmVmOiBkaXZSZWZcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKSxcbiAgICByZWY6IGRpdlJlZlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChZZWFyU2VsZWN0LCBzaGFyZWRQcm9wcyksIG1vZGUgPT09ICdtb250aCcgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTW9udGhTZWxlY3QsIHNoYXJlZFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTW9kZVN3aXRjaCwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBzaGFyZWRQcm9wcywge1xuICAgIG9uTW9kZUNoYW5nZTogb25Nb2RlQ2hhbmdlXG4gIH0pKSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IENhbGVuZGFySGVhZGVyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3VzZU1lcmdlZFN0YXRlNSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcGFkU3RhcnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJsb2Rhc2gvcGFkU3RhcnRcIikpO1xuXG52YXIgX3JjUGlja2VyID0gcmVxdWlyZShcInJjLXBpY2tlclwiKTtcblxudmFyIF9Mb2NhbGVSZWNlaXZlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS1wcm92aWRlci9Mb2NhbGVSZWNlaXZlclwiKSk7XG5cbnZhciBfZW5fVVMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2xvY2FsZS9lbl9VU1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX0hlYWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSGVhZGVyXCIpKTtcblxuZnVuY3Rpb24gZ2VuZXJhdGVDYWxlbmRhcihnZW5lcmF0ZUNvbmZpZykge1xuICBmdW5jdGlvbiBpc1NhbWVZZWFyKGRhdGUxLCBkYXRlMikge1xuICAgIHJldHVybiBkYXRlMSAmJiBkYXRlMiAmJiBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUxKSA9PT0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkYXRlMik7XG4gIH1cblxuICBmdW5jdGlvbiBpc1NhbWVNb250aChkYXRlMSwgZGF0ZTIpIHtcbiAgICByZXR1cm4gaXNTYW1lWWVhcihkYXRlMSwgZGF0ZTIpICYmIGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKGRhdGUxKSA9PT0gZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZGF0ZTIpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNTYW1lRGF0ZShkYXRlMSwgZGF0ZTIpIHtcbiAgICByZXR1cm4gaXNTYW1lTW9udGgoZGF0ZTEsIGRhdGUyKSAmJiBnZW5lcmF0ZUNvbmZpZy5nZXREYXRlKGRhdGUxKSA9PT0gZ2VuZXJhdGVDb25maWcuZ2V0RGF0ZShkYXRlMik7XG4gIH1cblxuICB2YXIgQ2FsZW5kYXIgPSBmdW5jdGlvbiBDYWxlbmRhcihwcm9wcykge1xuICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgZGF0ZUZ1bGxDZWxsUmVuZGVyID0gcHJvcHMuZGF0ZUZ1bGxDZWxsUmVuZGVyLFxuICAgICAgICBkYXRlQ2VsbFJlbmRlciA9IHByb3BzLmRhdGVDZWxsUmVuZGVyLFxuICAgICAgICBtb250aEZ1bGxDZWxsUmVuZGVyID0gcHJvcHMubW9udGhGdWxsQ2VsbFJlbmRlcixcbiAgICAgICAgbW9udGhDZWxsUmVuZGVyID0gcHJvcHMubW9udGhDZWxsUmVuZGVyLFxuICAgICAgICBoZWFkZXJSZW5kZXIgPSBwcm9wcy5oZWFkZXJSZW5kZXIsXG4gICAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgZGlzYWJsZWREYXRlID0gcHJvcHMuZGlzYWJsZWREYXRlLFxuICAgICAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICAgICAgdmFsaWRSYW5nZSA9IHByb3BzLnZhbGlkUmFuZ2UsXG4gICAgICAgIF9wcm9wcyRmdWxsc2NyZWVuID0gcHJvcHMuZnVsbHNjcmVlbixcbiAgICAgICAgZnVsbHNjcmVlbiA9IF9wcm9wcyRmdWxsc2NyZWVuID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGZ1bGxzY3JlZW4sXG4gICAgICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgICAgIG9uUGFuZWxDaGFuZ2UgPSBwcm9wcy5vblBhbmVsQ2hhbmdlLFxuICAgICAgICBvblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0O1xuXG4gICAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygncGlja2VyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICB2YXIgY2FsZW5kYXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNhbGVuZGFyXCIpO1xuICAgIHZhciB0b2RheSA9IGdlbmVyYXRlQ29uZmlnLmdldE5vdygpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09IFN0YXRlID09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVmFsdWVcblxuICAgIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSAoMCwgX3VzZU1lcmdlZFN0YXRlNVtcImRlZmF1bHRcIl0pKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB2YWx1ZSB8fCBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKTtcbiAgICB9LCB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pLFxuICAgICAgICBfdXNlTWVyZ2VkU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgICAgIG1lcmdlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICAgICAgc2V0TWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdOyAvLyBNb2RlXG5cblxuICAgIHZhciBfdXNlTWVyZ2VkU3RhdGUzID0gKDAsIF91c2VNZXJnZWRTdGF0ZTVbXCJkZWZhdWx0XCJdKSgnbW9udGgnLCB7XG4gICAgICB2YWx1ZTogbW9kZVxuICAgIH0pLFxuICAgICAgICBfdXNlTWVyZ2VkU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgICAgICBtZXJnZWRNb2RlID0gX3VzZU1lcmdlZFN0YXRlNFswXSxcbiAgICAgICAgc2V0TWVyZ2VkTW9kZSA9IF91c2VNZXJnZWRTdGF0ZTRbMV07XG5cbiAgICB2YXIgcGFuZWxNb2RlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVyZ2VkTW9kZSA9PT0gJ3llYXInID8gJ21vbnRoJyA6ICdkYXRlJztcbiAgICB9LCBbbWVyZ2VkTW9kZV0pOyAvLyBEaXNhYmxlZCBEYXRlXG5cbiAgICB2YXIgbWVyZ2VkRGlzYWJsZWREYXRlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgIHZhciBub3RJblJhbmdlID0gdmFsaWRSYW5nZSA/IGdlbmVyYXRlQ29uZmlnLmlzQWZ0ZXIodmFsaWRSYW5nZVswXSwgZGF0ZSkgfHwgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihkYXRlLCB2YWxpZFJhbmdlWzFdKSA6IGZhbHNlO1xuICAgICAgcmV0dXJuIG5vdEluUmFuZ2UgfHwgISEoZGlzYWJsZWREYXRlID09PSBudWxsIHx8IGRpc2FibGVkRGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlzYWJsZWREYXRlKGRhdGUpKTtcbiAgICB9LCBbZGlzYWJsZWREYXRlLCB2YWxpZFJhbmdlXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT0gRXZlbnRzID09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHZhciB0cmlnZ2VyUGFuZWxDaGFuZ2UgPSBmdW5jdGlvbiB0cmlnZ2VyUGFuZWxDaGFuZ2UoZGF0ZSwgbmV3TW9kZSkge1xuICAgICAgaWYgKG9uUGFuZWxDaGFuZ2UpIHtcbiAgICAgICAgb25QYW5lbENoYW5nZShkYXRlLCBuZXdNb2RlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHRyaWdnZXJDaGFuZ2UgPSBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlKGRhdGUpIHtcbiAgICAgIHNldE1lcmdlZFZhbHVlKGRhdGUpO1xuXG4gICAgICBpZiAoIWlzU2FtZURhdGUoZGF0ZSwgbWVyZ2VkVmFsdWUpKSB7XG4gICAgICAgIC8vIFRyaWdnZXIgd2hlbiBtb250aCBwYW5lbCBzd2l0Y2ggbW9udGhcbiAgICAgICAgaWYgKHBhbmVsTW9kZSA9PT0gJ2RhdGUnICYmICFpc1NhbWVNb250aChkYXRlLCBtZXJnZWRWYWx1ZSkgfHwgcGFuZWxNb2RlID09PSAnbW9udGgnICYmICFpc1NhbWVZZWFyKGRhdGUsIG1lcmdlZFZhbHVlKSkge1xuICAgICAgICAgIHRyaWdnZXJQYW5lbENoYW5nZShkYXRlLCBtZXJnZWRNb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgIG9uQ2hhbmdlKGRhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciB0cmlnZ2VyTW9kZUNoYW5nZSA9IGZ1bmN0aW9uIHRyaWdnZXJNb2RlQ2hhbmdlKG5ld01vZGUpIHtcbiAgICAgIHNldE1lcmdlZE1vZGUobmV3TW9kZSk7XG4gICAgICB0cmlnZ2VyUGFuZWxDaGFuZ2UobWVyZ2VkVmFsdWUsIG5ld01vZGUpO1xuICAgIH07XG5cbiAgICB2YXIgb25JbnRlcm5hbFNlbGVjdCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWxlY3QoZGF0ZSkge1xuICAgICAgdHJpZ2dlckNoYW5nZShkYXRlKTtcblxuICAgICAgaWYgKG9uU2VsZWN0KSB7XG4gICAgICAgIG9uU2VsZWN0KGRhdGUpO1xuICAgICAgfVxuICAgIH07IC8vID09PT09PT09PT09PT09PT09PT09PT0gTG9jYWxlID09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gICAgdmFyIGdldERlZmF1bHRMb2NhbGUgPSBmdW5jdGlvbiBnZXREZWZhdWx0TG9jYWxlKCkge1xuICAgICAgdmFyIGxvY2FsZSA9IHByb3BzLmxvY2FsZTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBfZW5fVVNbXCJkZWZhdWx0XCJdKSwgbG9jYWxlKTtcbiAgICAgIHJlc3VsdC5sYW5nID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcmVzdWx0LmxhbmcpLCAobG9jYWxlIHx8IHt9KS5sYW5nKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgICB2YXIgZGF0ZVJlbmRlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICBpZiAoZGF0ZUZ1bGxDZWxsUmVuZGVyKSB7XG4gICAgICAgIHJldHVybiBkYXRlRnVsbENlbGxSZW5kZXIoZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsLWlubmVyXCIpLCBcIlwiLmNvbmNhdChjYWxlbmRhclByZWZpeENscywgXCItZGF0ZVwiKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQoY2FsZW5kYXJQcmVmaXhDbHMsIFwiLWRhdGUtdG9kYXlcIiksIGlzU2FtZURhdGUodG9kYXksIGRhdGUpKSlcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjYWxlbmRhclByZWZpeENscywgXCItZGF0ZS12YWx1ZVwiKVxuICAgICAgfSwgKDAsIF9wYWRTdGFydFtcImRlZmF1bHRcIl0pKFN0cmluZyhnZW5lcmF0ZUNvbmZpZy5nZXREYXRlKGRhdGUpKSwgMiwgJzAnKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjYWxlbmRhclByZWZpeENscywgXCItZGF0ZS1jb250ZW50XCIpXG4gICAgICB9LCBkYXRlQ2VsbFJlbmRlciAmJiBkYXRlQ2VsbFJlbmRlcihkYXRlKSkpO1xuICAgIH0sIFtkYXRlRnVsbENlbGxSZW5kZXIsIGRhdGVDZWxsUmVuZGVyXSk7XG4gICAgdmFyIG1vbnRoUmVuZGVyID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSkge1xuICAgICAgaWYgKG1vbnRoRnVsbENlbGxSZW5kZXIpIHtcbiAgICAgICAgcmV0dXJuIG1vbnRoRnVsbENlbGxSZW5kZXIoZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBtb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHMgfHwgZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFNob3J0TW9udGhzKGxvY2FsZS5sb2NhbGUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNlbGwtaW5uZXJcIiksIFwiXCIuY29uY2F0KGNhbGVuZGFyUHJlZml4Q2xzLCBcIi1kYXRlXCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChjYWxlbmRhclByZWZpeENscywgXCItZGF0ZS10b2RheVwiKSwgaXNTYW1lTW9udGgodG9kYXksIGRhdGUpKSlcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjYWxlbmRhclByZWZpeENscywgXCItZGF0ZS12YWx1ZVwiKVxuICAgICAgfSwgbW9udGhzW2dlbmVyYXRlQ29uZmlnLmdldE1vbnRoKGRhdGUpXSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjYWxlbmRhclByZWZpeENscywgXCItZGF0ZS1jb250ZW50XCIpXG4gICAgICB9LCBtb250aENlbGxSZW5kZXIgJiYgbW9udGhDZWxsUmVuZGVyKGRhdGUpKSk7XG4gICAgfSwgW21vbnRoRnVsbENlbGxSZW5kZXIsIG1vbnRoQ2VsbFJlbmRlcl0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTG9jYWxlUmVjZWl2ZXJbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBjb21wb25lbnROYW1lOiBcIkNhbGVuZGFyXCIsXG4gICAgICBkZWZhdWx0TG9jYWxlOiBnZXREZWZhdWx0TG9jYWxlXG4gICAgfSwgZnVuY3Rpb24gKG1lcmdlZExvY2FsZSkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzMztcblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShjYWxlbmRhclByZWZpeENscywgKF9jbGFzc05hbWVzMyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQoY2FsZW5kYXJQcmVmaXhDbHMsIFwiLWZ1bGxcIiksIGZ1bGxzY3JlZW4pLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQoY2FsZW5kYXJQcmVmaXhDbHMsIFwiLW1pbmlcIiksICFmdWxsc2NyZWVuKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczMsIFwiXCIuY29uY2F0KGNhbGVuZGFyUHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lczMpLCBjbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIGhlYWRlclJlbmRlciA/IGhlYWRlclJlbmRlcih7XG4gICAgICAgIHZhbHVlOiBtZXJnZWRWYWx1ZSxcbiAgICAgICAgdHlwZTogbWVyZ2VkTW9kZSxcbiAgICAgICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxTZWxlY3QsXG4gICAgICAgIG9uVHlwZUNoYW5nZTogdHJpZ2dlck1vZGVDaGFuZ2VcbiAgICAgIH0pIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0hlYWRlcltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgcHJlZml4Q2xzOiBjYWxlbmRhclByZWZpeENscyxcbiAgICAgICAgdmFsdWU6IG1lcmdlZFZhbHVlLFxuICAgICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICAgIG1vZGU6IG1lcmdlZE1vZGUsXG4gICAgICAgIGZ1bGxzY3JlZW46IGZ1bGxzY3JlZW4sXG4gICAgICAgIGxvY2FsZTogbWVyZ2VkTG9jYWxlLmxhbmcsXG4gICAgICAgIHZhbGlkUmFuZ2U6IHZhbGlkUmFuZ2UsXG4gICAgICAgIG9uQ2hhbmdlOiBvbkludGVybmFsU2VsZWN0LFxuICAgICAgICBvbk1vZGVDaGFuZ2U6IHRyaWdnZXJNb2RlQ2hhbmdlXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjUGlja2VyLlBpY2tlclBhbmVsLCB7XG4gICAgICAgIHZhbHVlOiBtZXJnZWRWYWx1ZSxcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGxvY2FsZTogbWVyZ2VkTG9jYWxlLmxhbmcsXG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgICAgZGF0ZVJlbmRlcjogZGF0ZVJlbmRlcixcbiAgICAgICAgbW9udGhDZWxsUmVuZGVyOiBmdW5jdGlvbiBtb250aENlbGxSZW5kZXIoZGF0ZSkge1xuICAgICAgICAgIHJldHVybiBtb250aFJlbmRlcihkYXRlLCBtZXJnZWRMb2NhbGUubGFuZyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2VsZWN0OiBvbkludGVybmFsU2VsZWN0LFxuICAgICAgICBtb2RlOiBwYW5lbE1vZGUsXG4gICAgICAgIHBpY2tlcjogcGFuZWxNb2RlLFxuICAgICAgICBkaXNhYmxlZERhdGU6IG1lcmdlZERpc2FibGVkRGF0ZSxcbiAgICAgICAgaGlkZUhlYWRlcjogdHJ1ZVxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBDYWxlbmRhcjtcbn1cblxudmFyIF9kZWZhdWx0ID0gZ2VuZXJhdGVDYWxlbmRhcjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfbW9tZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtcGlja2VyL2xpYi9nZW5lcmF0ZS9tb21lbnRcIikpO1xuXG52YXIgX2dlbmVyYXRlQ2FsZW5kYXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2dlbmVyYXRlQ2FsZW5kYXJcIikpO1xuXG52YXIgQ2FsZW5kYXIgPSAoMCwgX2dlbmVyYXRlQ2FsZW5kYXJbXCJkZWZhdWx0XCJdKShfbW9tZW50W1wiZGVmYXVsdFwiXSk7XG52YXIgX2RlZmF1bHQgPSBDYWxlbmRhcjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZW5fVVMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9kYXRlLXBpY2tlci9sb2NhbGUvZW5fVVNcIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfZW5fVVNbXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBHcmlkID0gZnVuY3Rpb24gR3JpZChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcblxuICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgX3Byb3BzJGhvdmVyYWJsZSA9IHByb3BzLmhvdmVyYWJsZSxcbiAgICAgICAgaG92ZXJhYmxlID0gX3Byb3BzJGhvdmVyYWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRob3ZlcmFibGUsXG4gICAgICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiaG92ZXJhYmxlXCJdKTtcblxuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NhcmQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBjbGFzc1N0cmluZyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JpZFwiKSwgY2xhc3NOYW1lLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyaWQtaG92ZXJhYmxlXCIpLCBob3ZlcmFibGUpKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBvdGhlcnMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgICB9KSk7XG4gIH0pO1xufTtcblxudmFyIF9kZWZhdWx0ID0gR3JpZDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgTWV0YSA9IGZ1bmN0aW9uIE1ldGEocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHM7XG5cbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGF2YXRhciA9IHByb3BzLmF2YXRhcixcbiAgICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgICAgZGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgb3RoZXJzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJhdmF0YXJcIiwgXCJ0aXRsZVwiLCBcImRlc2NyaXB0aW9uXCJdKTtcblxuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NhcmQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBjbGFzc1N0cmluZyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWV0YVwiKSwgY2xhc3NOYW1lKTtcbiAgICB2YXIgYXZhdGFyRG9tID0gYXZhdGFyID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1ldGEtYXZhdGFyXCIpXG4gICAgfSwgYXZhdGFyKSA6IG51bGw7XG4gICAgdmFyIHRpdGxlRG9tID0gdGl0bGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWV0YS10aXRsZVwiKVxuICAgIH0sIHRpdGxlKSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0aW9uRG9tID0gZGVzY3JpcHRpb24gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWV0YS1kZXNjcmlwdGlvblwiKVxuICAgIH0sIGRlc2NyaXB0aW9uKSA6IG51bGw7XG4gICAgdmFyIE1ldGFEZXRhaWwgPSB0aXRsZURvbSB8fCBkZXNjcmlwdGlvbkRvbSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZXRhLWRldGFpbFwiKVxuICAgIH0sIHRpdGxlRG9tLCBkZXNjcmlwdGlvbkRvbSkgOiBudWxsO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIG90aGVycywge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZ1xuICAgIH0pLCBhdmF0YXJEb20sIE1ldGFEZXRhaWwpO1xuICB9KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IE1ldGE7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm9taXQuanNcIikpO1xuXG52YXIgX0dyaWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0dyaWRcIikpO1xuXG52YXIgX01ldGEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL01ldGFcIikpO1xuXG52YXIgX3RhYnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi90YWJzXCIpKTtcblxudmFyIF9yb3cgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9yb3dcIikpO1xuXG52YXIgX2NvbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX1NpemVDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0XCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbmZ1bmN0aW9uIGdldEFjdGlvbihhY3Rpb25zKSB7XG4gIHZhciBhY3Rpb25MaXN0ID0gYWN0aW9ucy5tYXAoZnVuY3Rpb24gKGFjdGlvbiwgaW5kZXgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB3aWR0aDogXCJcIi5jb25jYXQoMTAwIC8gYWN0aW9ucy5sZW5ndGgsIFwiJVwiKVxuICAgICAgICB9LFxuICAgICAgICBrZXk6IFwiYWN0aW9uLVwiLmNvbmNhdChpbmRleClcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBhY3Rpb24pKVxuICAgICk7XG4gIH0pO1xuICByZXR1cm4gYWN0aW9uTGlzdDtcbn1cblxudmFyIENhcmQgPSBmdW5jdGlvbiBDYXJkKHByb3BzKSB7XG4gIHZhciBfZXh0ZW5kczIsIF9jbGFzc05hbWVzO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChfU2l6ZUNvbnRleHRbXCJkZWZhdWx0XCJdKTtcblxuICB2YXIgb25UYWJDaGFuZ2UgPSBmdW5jdGlvbiBvblRhYkNoYW5nZShrZXkpIHtcbiAgICBpZiAocHJvcHMub25UYWJDaGFuZ2UpIHtcbiAgICAgIHByb3BzLm9uVGFiQ2hhbmdlKGtleSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpc0NvbnRhaW5HcmlkID0gZnVuY3Rpb24gaXNDb250YWluR3JpZCgpIHtcbiAgICB2YXIgY29udGFpbkdyaWQ7XG4gICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUgPT09IF9HcmlkW1wiZGVmYXVsdFwiXSkge1xuICAgICAgICBjb250YWluR3JpZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRhaW5HcmlkO1xuICB9O1xuXG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBleHRyYSA9IHByb3BzLmV4dHJhLFxuICAgICAgX3Byb3BzJGhlYWRTdHlsZSA9IHByb3BzLmhlYWRTdHlsZSxcbiAgICAgIGhlYWRTdHlsZSA9IF9wcm9wcyRoZWFkU3R5bGUgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGhlYWRTdHlsZSxcbiAgICAgIF9wcm9wcyRib2R5U3R5bGUgPSBwcm9wcy5ib2R5U3R5bGUsXG4gICAgICBib2R5U3R5bGUgPSBfcHJvcHMkYm9keVN0eWxlID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRib2R5U3R5bGUsXG4gICAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmcsXG4gICAgICBfcHJvcHMkYm9yZGVyZWQgPSBwcm9wcy5ib3JkZXJlZCxcbiAgICAgIGJvcmRlcmVkID0gX3Byb3BzJGJvcmRlcmVkID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGJvcmRlcmVkLFxuICAgICAgY3VzdG9taXplU2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICB0eXBlID0gcHJvcHMudHlwZSxcbiAgICAgIGNvdmVyID0gcHJvcHMuY292ZXIsXG4gICAgICBhY3Rpb25zID0gcHJvcHMuYWN0aW9ucyxcbiAgICAgIHRhYkxpc3QgPSBwcm9wcy50YWJMaXN0LFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGFjdGl2ZVRhYktleSA9IHByb3BzLmFjdGl2ZVRhYktleSxcbiAgICAgIGRlZmF1bHRBY3RpdmVUYWJLZXkgPSBwcm9wcy5kZWZhdWx0QWN0aXZlVGFiS2V5LFxuICAgICAgdGFiQmFyRXh0cmFDb250ZW50ID0gcHJvcHMudGFiQmFyRXh0cmFDb250ZW50LFxuICAgICAgaG92ZXJhYmxlID0gcHJvcHMuaG92ZXJhYmxlLFxuICAgICAgX3Byb3BzJHRhYlByb3BzID0gcHJvcHMudGFiUHJvcHMsXG4gICAgICB0YWJQcm9wcyA9IF9wcm9wcyR0YWJQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkdGFiUHJvcHMsXG4gICAgICBvdGhlcnMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImV4dHJhXCIsIFwiaGVhZFN0eWxlXCIsIFwiYm9keVN0eWxlXCIsIFwidGl0bGVcIiwgXCJsb2FkaW5nXCIsIFwiYm9yZGVyZWRcIiwgXCJzaXplXCIsIFwidHlwZVwiLCBcImNvdmVyXCIsIFwiYWN0aW9uc1wiLCBcInRhYkxpc3RcIiwgXCJjaGlsZHJlblwiLCBcImFjdGl2ZVRhYktleVwiLCBcImRlZmF1bHRBY3RpdmVUYWJLZXlcIiwgXCJ0YWJCYXJFeHRyYUNvbnRlbnRcIiwgXCJob3ZlcmFibGVcIiwgXCJ0YWJQcm9wc1wiXSk7XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY2FyZCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBsb2FkaW5nQmxvY2tTdHlsZSA9IGJvZHlTdHlsZS5wYWRkaW5nID09PSAwIHx8IGJvZHlTdHlsZS5wYWRkaW5nID09PSAnMHB4JyA/IHtcbiAgICBwYWRkaW5nOiAyNFxuICB9IDogdW5kZWZpbmVkO1xuICB2YXIgYmxvY2sgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmctYmxvY2tcIilcbiAgfSk7XG4gIHZhciBsb2FkaW5nQmxvY2sgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmctY29udGVudFwiKSxcbiAgICBzdHlsZTogbG9hZGluZ0Jsb2NrU3R5bGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3Jvd1tcImRlZmF1bHRcIl0sIHtcbiAgICBndXR0ZXI6IDhcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbFtcImRlZmF1bHRcIl0sIHtcbiAgICBzcGFuOiAyMlxuICB9LCBibG9jaykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcm93W1wiZGVmYXVsdFwiXSwge1xuICAgIGd1dHRlcjogOFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29sW1wiZGVmYXVsdFwiXSwge1xuICAgIHNwYW46IDhcbiAgfSwgYmxvY2spLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29sW1wiZGVmYXVsdFwiXSwge1xuICAgIHNwYW46IDE1XG4gIH0sIGJsb2NrKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yb3dbXCJkZWZhdWx0XCJdLCB7XG4gICAgZ3V0dGVyOiA4XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb2xbXCJkZWZhdWx0XCJdLCB7XG4gICAgc3BhbjogNlxuICB9LCBibG9jayksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb2xbXCJkZWZhdWx0XCJdLCB7XG4gICAgc3BhbjogMThcbiAgfSwgYmxvY2spKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3Jvd1tcImRlZmF1bHRcIl0sIHtcbiAgICBndXR0ZXI6IDhcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbFtcImRlZmF1bHRcIl0sIHtcbiAgICBzcGFuOiAxM1xuICB9LCBibG9jayksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb2xbXCJkZWZhdWx0XCJdLCB7XG4gICAgc3BhbjogOVxuICB9LCBibG9jaykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcm93W1wiZGVmYXVsdFwiXSwge1xuICAgIGd1dHRlcjogOFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29sW1wiZGVmYXVsdFwiXSwge1xuICAgIHNwYW46IDRcbiAgfSwgYmxvY2spLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29sW1wiZGVmYXVsdFwiXSwge1xuICAgIHNwYW46IDNcbiAgfSwgYmxvY2spLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29sW1wiZGVmYXVsdFwiXSwge1xuICAgIHNwYW46IDE2XG4gIH0sIGJsb2NrKSkpO1xuICB2YXIgaGFzQWN0aXZlVGFiS2V5ID0gYWN0aXZlVGFiS2V5ICE9PSB1bmRlZmluZWQ7XG4gIHZhciBleHRyYVByb3BzID0gKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSh7fSwgdGFiUHJvcHMpLCAoX2V4dGVuZHMyID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2V4dGVuZHMyLCBoYXNBY3RpdmVUYWJLZXkgPyAnYWN0aXZlS2V5JyA6ICdkZWZhdWx0QWN0aXZlS2V5JywgaGFzQWN0aXZlVGFiS2V5ID8gYWN0aXZlVGFiS2V5IDogZGVmYXVsdEFjdGl2ZVRhYktleSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2V4dGVuZHMyLCBcInRhYkJhckV4dHJhQ29udGVudFwiLCB0YWJCYXJFeHRyYUNvbnRlbnQpLCBfZXh0ZW5kczIpKTtcbiAgdmFyIGhlYWQ7XG4gIHZhciB0YWJzID0gdGFiTGlzdCAmJiB0YWJMaXN0Lmxlbmd0aCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF90YWJzW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKHtcbiAgICBzaXplOiBcImxhcmdlXCJcbiAgfSwgZXh0cmFQcm9wcywge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkLXRhYnNcIiksXG4gICAgb25DaGFuZ2U6IG9uVGFiQ2hhbmdlXG4gIH0pLCB0YWJMaXN0Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdGFic1tcImRlZmF1bHRcIl0uVGFiUGFuZSwge1xuICAgICAgdGFiOiBpdGVtLnRhYixcbiAgICAgIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkLFxuICAgICAga2V5OiBpdGVtLmtleVxuICAgIH0pO1xuICB9KSkgOiBudWxsO1xuXG4gIGlmICh0aXRsZSB8fCBleHRyYSB8fCB0YWJzKSB7XG4gICAgaGVhZCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkXCIpLFxuICAgICAgc3R5bGU6IGhlYWRTdHlsZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkLXdyYXBwZXJcIilcbiAgICB9LCB0aXRsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZC10aXRsZVwiKVxuICAgIH0sIHRpdGxlKSwgZXh0cmEgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4dHJhXCIpXG4gICAgfSwgZXh0cmEpKSwgdGFicyk7XG4gIH1cblxuICB2YXIgY292ZXJEb20gPSBjb3ZlciA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY292ZXJcIilcbiAgfSwgY292ZXIpIDogbnVsbDtcbiAgdmFyIGJvZHkgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvZHlcIiksXG4gICAgc3R5bGU6IGJvZHlTdHlsZVxuICB9LCBsb2FkaW5nID8gbG9hZGluZ0Jsb2NrIDogY2hpbGRyZW4pO1xuICB2YXIgYWN0aW9uRG9tID0gYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0aCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3Rpb25zXCIpXG4gIH0sIGdldEFjdGlvbihhY3Rpb25zKSkgOiBudWxsO1xuICB2YXIgZGl2UHJvcHMgPSAoMCwgX29taXRbXCJkZWZhdWx0XCJdKShvdGhlcnMsIFsnb25UYWJDaGFuZ2UnXSk7XG4gIHZhciBtZXJnZWRTaXplID0gY3VzdG9taXplU2l6ZSB8fCBzaXplO1xuICB2YXIgY2xhc3NTdHJpbmcgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmdcIiksIGxvYWRpbmcpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvcmRlcmVkXCIpLCBib3JkZXJlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaG92ZXJhYmxlXCIpLCBob3ZlcmFibGUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRhaW4tZ3JpZFwiKSwgaXNDb250YWluR3JpZCgpKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250YWluLXRhYnNcIiksIHRhYkxpc3QgJiYgdGFiTGlzdC5sZW5ndGgpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobWVyZ2VkU2l6ZSksIG1lcmdlZFNpemUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXR5cGUtXCIpLmNvbmNhdCh0eXBlKSwgISF0eXBlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCAoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoe30sIGRpdlByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZ1xuICB9KSwgaGVhZCwgY292ZXJEb20sIGJvZHksIGFjdGlvbkRvbSk7XG59O1xuXG5DYXJkLkdyaWQgPSBfR3JpZFtcImRlZmF1bHRcIl07XG5DYXJkLk1ldGEgPSBfTWV0YVtcImRlZmF1bHRcIl07XG52YXIgX2RlZmF1bHQgPSBDYXJkO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfZGVib3VuY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJsb2Rhc2gvZGVib3VuY2VcIikpO1xuXG52YXIgX3JlYWN0U2xpY2sgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9yZWFjdC1zbGlja1wiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIENhcm91c2VsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoQ2Fyb3VzZWwsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKENhcm91c2VsKTtcblxuICBmdW5jdGlvbiBDYXJvdXNlbChwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgQ2Fyb3VzZWwpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgX3RoaXMuc2F2ZVNsaWNrID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLnNsaWNrID0gbm9kZTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25XaW5kb3dSZXNpemVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI1NTBcbiAgICAgIHZhciBhdXRvcGxheSA9IF90aGlzLnByb3BzLmF1dG9wbGF5O1xuXG4gICAgICBpZiAoYXV0b3BsYXkgJiYgX3RoaXMuc2xpY2sgJiYgX3RoaXMuc2xpY2suaW5uZXJTbGlkZXIgJiYgX3RoaXMuc2xpY2suaW5uZXJTbGlkZXIuYXV0b1BsYXkpIHtcbiAgICAgICAgX3RoaXMuc2xpY2suaW5uZXJTbGlkZXIuYXV0b1BsYXkoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMucmVuZGVyQ2Fyb3VzZWwgPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHMsXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb247XG5cbiAgICAgIHZhciBfYTtcblxuICAgICAgdmFyIHByb3BzID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBfdGhpcy5wcm9wcyk7XG5cbiAgICAgIGlmIChwcm9wcy5lZmZlY3QgPT09ICdmYWRlJykge1xuICAgICAgICBwcm9wcy5mYWRlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY2Fyb3VzZWwnLCBwcm9wcy5wcmVmaXhDbHMpO1xuICAgICAgdmFyIGRvdHNDbGFzcyA9ICdzbGljay1kb3RzJztcblxuICAgICAgdmFyIGRvdFBvc2l0aW9uID0gX3RoaXMuZ2V0RG90UG9zaXRpb24oKTtcblxuICAgICAgcHJvcHMudmVydGljYWwgPSBkb3RQb3NpdGlvbiA9PT0gJ2xlZnQnIHx8IGRvdFBvc2l0aW9uID09PSAncmlnaHQnO1xuICAgICAgdmFyIGVuYWJsZURvdHMgPSAhIXByb3BzLmRvdHM7XG4gICAgICB2YXIgZHNDbGFzcyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKGRvdHNDbGFzcywgXCJcIi5jb25jYXQoZG90c0NsYXNzLCBcIi1cIikuY29uY2F0KGRvdFBvc2l0aW9uIHx8ICdib3R0b20nKSwgdHlwZW9mIHByb3BzLmRvdHMgPT09ICdib29sZWFuJyA/IGZhbHNlIDogKF9hID0gcHJvcHMuZG90cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsYXNzTmFtZSk7XG4gICAgICB2YXIgY2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXZlcnRpY2FsXCIpLCBwcm9wcy52ZXJ0aWNhbCksIF9jbGFzc05hbWVzKSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JlYWN0U2xpY2tbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICByZWY6IF90aGlzLnNhdmVTbGlja1xuICAgICAgfSwgcHJvcHMsIHtcbiAgICAgICAgZG90czogZW5hYmxlRG90cyxcbiAgICAgICAgZG90c0NsYXNzOiBkc0NsYXNzXG4gICAgICB9KSkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbldpbmRvd1Jlc2l6ZWQgPSAoMCwgX2RlYm91bmNlW1wiZGVmYXVsdFwiXSkoX3RoaXMub25XaW5kb3dSZXNpemVkLCA1MDAsIHtcbiAgICAgIGxlYWRpbmc6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShDYXJvdXNlbCwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgYXV0b3BsYXkgPSB0aGlzLnByb3BzLmF1dG9wbGF5O1xuXG4gICAgICBpZiAoYXV0b3BsYXkpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVkKTtcbiAgICAgIH0gLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNzE5MVxuXG5cbiAgICAgIHRoaXMuaW5uZXJTbGlkZXIgPSB0aGlzLnNsaWNrICYmIHRoaXMuc2xpY2suaW5uZXJTbGlkZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICBpZiAoUmVhY3QuQ2hpbGRyZW4uY291bnQodGhpcy5wcm9wcy5jaGlsZHJlbikgIT09IFJlYWN0LkNoaWxkcmVuLmNvdW50KHByZXZQcm9wcy5jaGlsZHJlbikpIHtcbiAgICAgICAgdGhpcy5nb1RvKHRoaXMucHJvcHMuaW5pdGlhbFNsaWRlIHx8IDAsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB2YXIgYXV0b3BsYXkgPSB0aGlzLnByb3BzLmF1dG9wbGF5O1xuXG4gICAgICBpZiAoYXV0b3BsYXkpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVkKTtcbiAgICAgICAgdGhpcy5vbldpbmRvd1Jlc2l6ZWQuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldERvdFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERvdFBvc2l0aW9uKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzJGRvdFBvc2l0aSA9IHRoaXMucHJvcHMuZG90UG9zaXRpb24sXG4gICAgICAgICAgZG90UG9zaXRpb24gPSBfdGhpcyRwcm9wcyRkb3RQb3NpdGkgPT09IHZvaWQgMCA/ICdib3R0b20nIDogX3RoaXMkcHJvcHMkZG90UG9zaXRpO1xuICAgICAgcmV0dXJuIGRvdFBvc2l0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB0aGlzLnNsaWNrLnNsaWNrTmV4dCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcmV2XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZXYoKSB7XG4gICAgICB0aGlzLnNsaWNrLnNsaWNrUHJldigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnb1RvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdvVG8oc2xpZGUpIHtcbiAgICAgIHZhciBkb250QW5pbWF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICB0aGlzLnNsaWNrLnNsaWNrR29UbyhzbGlkZSwgZG9udEFuaW1hdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJDYXJvdXNlbCk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDYXJvdXNlbDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBDYXJvdXNlbDtcbkNhcm91c2VsLmRlZmF1bHRQcm9wcyA9IHtcbiAgZG90czogdHJ1ZSxcbiAgYXJyb3dzOiBmYWxzZSxcbiAgZHJhZ2dhYmxlOiBmYWxzZVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY0Nhc2NhZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtY2FzY2FkZXJcIikpO1xuXG52YXIgX2FycmF5VHJlZUZpbHRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImFycmF5LXRyZWUtZmlsdGVyXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm9taXQuanNcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF9DbG9zZUNpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCIpKTtcblxudmFyIF9Eb3duT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Eb3duT3V0bGluZWRcIikpO1xuXG52YXIgX1JpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9SaWdodE91dGxpbmVkXCIpKTtcblxudmFyIF9SZWRvT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9SZWRvT3V0bGluZWRcIikpO1xuXG52YXIgX0xlZnRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0xlZnRPdXRsaW5lZFwiKSk7XG5cbnZhciBfaW5wdXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9pbnB1dFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX0xvY2FsZVJlY2VpdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyXCIpKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfU2l6ZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHRcIikpO1xuXG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWFjdE5vZGVcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG4vLyBXZSBsaW1pdCB0aGUgZmlsdGVyZWQgaXRlbSBjb3VudCBieSBkZWZhdWx0XG52YXIgZGVmYXVsdExpbWl0ID0gNTA7IC8vIGtlZXAgdmFsdWUgd2hlbiBmaWx0ZXJpbmdcblxudmFyIGtlZXBGaWx0ZXJlZFZhbHVlRmllbGQgPSAnX19LRUVQX0ZJTFRFUkVEX09QVElPTl9WQUxVRSc7XG5cbmZ1bmN0aW9uIGhpZ2hsaWdodEtleXdvcmQoc3RyLCBrZXl3b3JkLCBwcmVmaXhDbHMpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdChrZXl3b3JkKS5tYXAoZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGluZGV4ID09PSAwID8gbm9kZSA6IFsvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lbnUtaXRlbS1rZXl3b3JkXCIpLFxuICAgICAga2V5OiBcInNlcGVyYXRvclwiXG4gICAgfSwga2V5d29yZCksIG5vZGVdO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlck9wdGlvbihpbnB1dFZhbHVlLCBwYXRoLCBuYW1lcykge1xuICByZXR1cm4gcGF0aC5zb21lKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICByZXR1cm4gb3B0aW9uW25hbWVzLmxhYmVsXS5pbmRleE9mKGlucHV0VmFsdWUpID4gLTE7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyRmlsdGVyZWRPcHRpb24oaW5wdXRWYWx1ZSwgcGF0aCwgcHJlZml4Q2xzLCBuYW1lcykge1xuICByZXR1cm4gcGF0aC5tYXAoZnVuY3Rpb24gKG9wdGlvbiwgaW5kZXgpIHtcbiAgICB2YXIgbGFiZWwgPSBvcHRpb25bbmFtZXMubGFiZWxdO1xuICAgIHZhciBub2RlID0gbGFiZWwuaW5kZXhPZihpbnB1dFZhbHVlKSA+IC0xID8gaGlnaGxpZ2h0S2V5d29yZChsYWJlbCwgaW5wdXRWYWx1ZSwgcHJlZml4Q2xzKSA6IGxhYmVsO1xuICAgIHJldHVybiBpbmRleCA9PT0gMCA/IG5vZGUgOiBbJyAvICcsIG5vZGVdO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFNvcnRGaWx0ZXJlZE9wdGlvbihhLCBiLCBpbnB1dFZhbHVlLCBuYW1lcykge1xuICBmdW5jdGlvbiBjYWxsYmFjayhlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW1bbmFtZXMubGFiZWxdLmluZGV4T2YoaW5wdXRWYWx1ZSkgPiAtMTtcbiAgfVxuXG4gIHJldHVybiBhLmZpbmRJbmRleChjYWxsYmFjaykgLSBiLmZpbmRJbmRleChjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldEZpZWxkTmFtZXMoX3JlZikge1xuICB2YXIgZmllbGROYW1lcyA9IF9yZWYuZmllbGROYW1lcztcbiAgcmV0dXJuIGZpZWxkTmFtZXM7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGxlZEZpZWxkTmFtZXMocHJvcHMpIHtcbiAgdmFyIGZpZWxkTmFtZXMgPSBnZXRGaWVsZE5hbWVzKHByb3BzKSB8fCB7fTtcbiAgdmFyIG5hbWVzID0ge1xuICAgIGNoaWxkcmVuOiBmaWVsZE5hbWVzLmNoaWxkcmVuIHx8ICdjaGlsZHJlbicsXG4gICAgbGFiZWw6IGZpZWxkTmFtZXMubGFiZWwgfHwgJ2xhYmVsJyxcbiAgICB2YWx1ZTogZmllbGROYW1lcy52YWx1ZSB8fCAndmFsdWUnXG4gIH07XG4gIHJldHVybiBuYW1lcztcbn1cblxuZnVuY3Rpb24gZmxhdHRlblRyZWUob3B0aW9ucywgcHJvcHMpIHtcbiAgdmFyIGFuY2VzdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBbXTtcbiAgdmFyIG5hbWVzID0gZ2V0RmlsbGVkRmllbGROYW1lcyhwcm9wcyk7XG4gIHZhciBmbGF0dGVuT3B0aW9ucyA9IFtdO1xuICB2YXIgY2hpbGRyZW5OYW1lID0gbmFtZXMuY2hpbGRyZW47XG4gIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgdmFyIHBhdGggPSBhbmNlc3Rvci5jb25jYXQob3B0aW9uKTtcblxuICAgIGlmIChwcm9wcy5jaGFuZ2VPblNlbGVjdCB8fCAhb3B0aW9uW2NoaWxkcmVuTmFtZV0gfHwgIW9wdGlvbltjaGlsZHJlbk5hbWVdLmxlbmd0aCkge1xuICAgICAgZmxhdHRlbk9wdGlvbnMucHVzaChwYXRoKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uW2NoaWxkcmVuTmFtZV0pIHtcbiAgICAgIGZsYXR0ZW5PcHRpb25zID0gZmxhdHRlbk9wdGlvbnMuY29uY2F0KGZsYXR0ZW5UcmVlKG9wdGlvbltjaGlsZHJlbk5hbWVdLCBwcm9wcywgcGF0aCkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmbGF0dGVuT3B0aW9ucztcbn1cblxudmFyIGRlZmF1bHREaXNwbGF5UmVuZGVyID0gZnVuY3Rpb24gZGVmYXVsdERpc3BsYXlSZW5kZXIobGFiZWwpIHtcbiAgcmV0dXJuIGxhYmVsLmpvaW4oJyAvICcpO1xufTtcblxuZnVuY3Rpb24gd2FybmluZ1ZhbHVlTm90RXhpc3QobGlzdCkge1xuICB2YXIgZmllbGROYW1lcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIChsaXN0IHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIHZhbHVlRmllbGROYW1lID0gZmllbGROYW1lcy52YWx1ZSB8fCAndmFsdWUnO1xuICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKHZhbHVlRmllbGROYW1lIGluIGl0ZW0sICdDYXNjYWRlcicsICdOb3QgZm91bmQgYHZhbHVlYCBpbiBgb3B0aW9uc2AuJyk7XG4gICAgd2FybmluZ1ZhbHVlTm90RXhpc3QoaXRlbVtmaWVsZE5hbWVzLmNoaWxkcmVuIHx8ICdjaGlsZHJlbiddLCBmaWVsZE5hbWVzKTtcbiAgfSk7XG59XG5cbnZhciBDYXNjYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKENhc2NhZGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShDYXNjYWRlcik7XG5cbiAgZnVuY3Rpb24gQ2FzY2FkZXIocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIENhc2NhZGVyKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcbiAgICBfdGhpcy5jYWNoZWRPcHRpb25zID0gW107XG5cbiAgICBfdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIHNlbGVjdGVkT3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107XG5cbiAgICAgIGlmICghKCd2YWx1ZScgaW4gX3RoaXMucHJvcHMpKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvbkNoYW5nZSA9IF90aGlzLnByb3BzLm9uQ2hhbmdlO1xuXG4gICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgb25DaGFuZ2UodmFsdWUsIHNlbGVjdGVkT3B0aW9ucyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNhdmVJbnB1dCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBfdGhpcy5pbnB1dCA9IG5vZGU7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZSwgc2VsZWN0ZWRPcHRpb25zKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlucHV0VmFsdWU6ICcnXG4gICAgICB9KTtcblxuICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uc1swXS5fX0lTX0ZJTFRFUkVEX09QVElPTikge1xuICAgICAgICB2YXIgdW53cmFwcGVkVmFsdWUgPSBzZWxlY3RlZE9wdGlvbnNbMF1ba2VlcEZpbHRlcmVkVmFsdWVGaWVsZF0gPT09IHVuZGVmaW5lZCA/IHZhbHVlWzBdIDogc2VsZWN0ZWRPcHRpb25zWzBdW2tlZXBGaWx0ZXJlZFZhbHVlRmllbGRdO1xuICAgICAgICB2YXIgdW53cmFwcGVkU2VsZWN0ZWRPcHRpb25zID0gc2VsZWN0ZWRPcHRpb25zWzBdLnBhdGg7XG5cbiAgICAgICAgX3RoaXMuc2V0VmFsdWUodW53cmFwcGVkVmFsdWUsIHVud3JhcHBlZFNlbGVjdGVkT3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zZXRWYWx1ZSh2YWx1ZSwgc2VsZWN0ZWRPcHRpb25zKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlUG9wdXBWaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gKHBvcHVwVmlzaWJsZSkge1xuICAgICAgaWYgKCEoJ3BvcHVwVmlzaWJsZScgaW4gX3RoaXMucHJvcHMpKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3B1cFZpc2libGU6IHBvcHVwVmlzaWJsZSxcbiAgICAgICAgICAgIGlucHV0Rm9jdXNlZDogcG9wdXBWaXNpYmxlLFxuICAgICAgICAgICAgaW5wdXRWYWx1ZTogcG9wdXBWaXNpYmxlID8gc3RhdGUuaW5wdXRWYWx1ZSA6ICcnXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvblBvcHVwVmlzaWJsZUNoYW5nZSA9IF90aGlzLnByb3BzLm9uUG9wdXBWaXNpYmxlQ2hhbmdlO1xuXG4gICAgICBpZiAob25Qb3B1cFZpc2libGVDaGFuZ2UpIHtcbiAgICAgICAgb25Qb3B1cFZpc2libGVDaGFuZ2UocG9wdXBWaXNpYmxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlSW5wdXRCbHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlSW5wdXRDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICBpbnB1dEZvY3VzZWQgPSBfdGhpcyRzdGF0ZS5pbnB1dEZvY3VzZWQsXG4gICAgICAgICAgcG9wdXBWaXNpYmxlID0gX3RoaXMkc3RhdGUucG9wdXBWaXNpYmxlOyAvLyBQcmV2ZW50IGBUcmlnZ2VyYCBiZWhhdmlvdXIuXG5cbiAgICAgIGlmIChpbnB1dEZvY3VzZWQgfHwgcG9wdXBWaXNpYmxlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUtleURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gU1BBQ0UgPT4gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTY4NzFcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IF9LZXlDb2RlW1wiZGVmYXVsdFwiXS5CQUNLU1BBQ0UgfHwgZS5rZXlDb2RlID09PSBfS2V5Q29kZVtcImRlZmF1bHRcIl0uU1BBQ0UpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlSW5wdXRDaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHBvcHVwVmlzaWJsZSA9IF90aGlzLnN0YXRlLnBvcHVwVmlzaWJsZTtcbiAgICAgIHZhciBpbnB1dFZhbHVlID0gZS50YXJnZXQudmFsdWU7XG5cbiAgICAgIGlmICghcG9wdXBWaXNpYmxlKSB7XG4gICAgICAgIF90aGlzLmhhbmRsZVBvcHVwVmlzaWJsZUNoYW5nZSh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpbnB1dFZhbHVlOiBpbnB1dFZhbHVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuY2xlYXJTZWxlY3Rpb24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGlucHV0VmFsdWUgPSBfdGhpcy5zdGF0ZS5pbnB1dFZhbHVlO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKCFpbnB1dFZhbHVlKSB7XG4gICAgICAgIF90aGlzLmhhbmRsZVBvcHVwVmlzaWJsZUNoYW5nZShmYWxzZSk7XG5cbiAgICAgICAgX3RoaXMuY2xlYXJTZWxlY3Rpb25UaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMuc2V0VmFsdWUoW10pO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlucHV0VmFsdWU6ICcnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJDYXNjYWRlciA9IGZ1bmN0aW9uIChfcmVmMiwgbG9jYWxlKSB7XG4gICAgICB2YXIgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyID0gX3JlZjIuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgZ2V0UHJlZml4Q2xzID0gX3JlZjIuZ2V0UHJlZml4Q2xzLFxuICAgICAgICAgIHJlbmRlckVtcHR5ID0gX3JlZjIucmVuZGVyRW1wdHksXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3JlZjIuZGlyZWN0aW9uO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TaXplQ29udGV4dFtcImRlZmF1bHRcIl0uQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIHZhciBfY2xhc3NOYW1lcywgX2NsYXNzTmFtZXMyLCBfY2xhc3NOYW1lczMsIF9jbGFzc05hbWVzNTtcblxuICAgICAgICB2YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplID0gKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLFxuICAgICAgICAgICAgcHJvcHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUucHJvcHMsXG4gICAgICAgICAgICBzdGF0ZSA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZS5zdGF0ZTtcblxuICAgICAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgICAgY3VzdG9taXplSW5wdXRQcmVmaXhDbHMgPSBwcm9wcy5pbnB1dFByZWZpeENscyxcbiAgICAgICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICBfcHJvcHMkcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gX3Byb3BzJHBsYWNlaG9sZGVyID09PSB2b2lkIDAgPyBsb2NhbGUucGxhY2Vob2xkZXIgfHwgJ1BsZWFzZSBzZWxlY3QnIDogX3Byb3BzJHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgY3VzdG9taXplU2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICAgICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgICAgIGFsbG93Q2xlYXIgPSBwcm9wcy5hbGxvd0NsZWFyLFxuICAgICAgICAgICAgX3Byb3BzJHNob3dTZWFyY2ggPSBwcm9wcy5zaG93U2VhcmNoLFxuICAgICAgICAgICAgc2hvd1NlYXJjaCA9IF9wcm9wcyRzaG93U2VhcmNoID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRzaG93U2VhcmNoLFxuICAgICAgICAgICAgc3VmZml4SWNvbiA9IHByb3BzLnN1ZmZpeEljb24sXG4gICAgICAgICAgICBleHBhbmRJY29uID0gcHJvcHMuZXhwYW5kSWNvbixcbiAgICAgICAgICAgIG5vdEZvdW5kQ29udGVudCA9IHByb3BzLm5vdEZvdW5kQ29udGVudCxcbiAgICAgICAgICAgIHBvcHVwQ2xhc3NOYW1lID0gcHJvcHMucG9wdXBDbGFzc05hbWUsXG4gICAgICAgICAgICBib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgICAgICAgICAgZHJvcGRvd25SZW5kZXIgPSBwcm9wcy5kcm9wZG93blJlbmRlcixcbiAgICAgICAgICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImlucHV0UHJlZml4Q2xzXCIsIFwiY2hpbGRyZW5cIiwgXCJwbGFjZWhvbGRlclwiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiYWxsb3dDbGVhclwiLCBcInNob3dTZWFyY2hcIiwgXCJzdWZmaXhJY29uXCIsIFwiZXhwYW5kSWNvblwiLCBcIm5vdEZvdW5kQ29udGVudFwiLCBcInBvcHVwQ2xhc3NOYW1lXCIsIFwiYm9yZGVyZWRcIiwgXCJkcm9wZG93blJlbmRlclwiXSk7XG5cbiAgICAgICAgdmFyIG1lcmdlZFNpemUgPSBjdXN0b21pemVTaXplIHx8IHNpemU7XG4gICAgICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgaW5wdXRGb2N1c2VkID0gc3RhdGUuaW5wdXRGb2N1c2VkO1xuICAgICAgICB2YXIgaXNSdGxMYXlvdXQgPSBkaXJlY3Rpb24gPT09ICdydGwnO1xuICAgICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdjYXNjYWRlcicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgICAgIHZhciBpbnB1dFByZWZpeENscyA9IGdldFByZWZpeENscygnaW5wdXQnLCBjdXN0b21pemVJbnB1dFByZWZpeENscyk7XG4gICAgICAgIHZhciBzaXplQ2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGlucHV0UHJlZml4Q2xzLCBcIi1sZ1wiKSwgbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGlucHV0UHJlZml4Q2xzLCBcIi1zbVwiKSwgbWVyZ2VkU2l6ZSA9PT0gJ3NtYWxsJyksIF9jbGFzc05hbWVzKSk7XG4gICAgICAgIHZhciBjbGVhckljb24gPSBhbGxvd0NsZWFyICYmICFkaXNhYmxlZCAmJiB2YWx1ZS5sZW5ndGggPiAwIHx8IHN0YXRlLmlucHV0VmFsdWUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2xvc2VDaXJjbGVGaWxsZWRbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpY2tlci1jbGVhclwiKSxcbiAgICAgICAgICBvbkNsaWNrOiBfdGhpcy5jbGVhclNlbGVjdGlvblxuICAgICAgICB9KSA6IG51bGw7XG4gICAgICAgIHZhciBhcnJvd0NscyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKChfY2xhc3NOYW1lczIgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGlja2VyLWFycm93XCIpLCB0cnVlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGlja2VyLWFycm93LWV4cGFuZFwiKSwgc3RhdGUucG9wdXBWaXNpYmxlKSwgX2NsYXNzTmFtZXMyKSk7XG4gICAgICAgIHZhciBwaWNrZXJDbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpY2tlclwiKSwgKF9jbGFzc05hbWVzMyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1waWNrZXItcnRsXCIpLCBpc1J0bExheW91dCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpY2tlci13aXRoLXZhbHVlXCIpLCBzdGF0ZS5pbnB1dFZhbHVlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGlja2VyLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpY2tlci1cIikuY29uY2F0KG1lcmdlZFNpemUpLCAhIW1lcmdlZFNpemUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1waWNrZXItc2hvdy1zZWFyY2hcIiksICEhc2hvd1NlYXJjaCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpY2tlci1mb2N1c2VkXCIpLCBpbnB1dEZvY3VzZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1waWNrZXItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2NsYXNzTmFtZXMzKSwgY2xhc3NOYW1lKTsgLy8gRml4IGJ1ZyBvZiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC81MDA0XG4gICAgICAgIC8vIGFuZCBodHRwczovL2ZiLm1lL3JlYWN0LXVua25vd24tcHJvcFxuXG4gICAgICAgIHZhciBpbnB1dFByb3BzID0gKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkob3RoZXJQcm9wcywgWydvbkNoYW5nZScsICdvcHRpb25zJywgJ3BvcHVwUGxhY2VtZW50JywgJ3RyYW5zaXRpb25OYW1lJywgJ2Rpc3BsYXlSZW5kZXInLCAnb25Qb3B1cFZpc2libGVDaGFuZ2UnLCAnY2hhbmdlT25TZWxlY3QnLCAnZXhwYW5kVHJpZ2dlcicsICdwb3B1cFZpc2libGUnLCAnZ2V0UG9wdXBDb250YWluZXInLCAnbG9hZERhdGEnLCAncG9wdXBDbGFzc05hbWUnLCAnZmlsdGVyT3B0aW9uJywgJ3JlbmRlckZpbHRlcmVkT3B0aW9uJywgJ3NvcnRGaWx0ZXJlZE9wdGlvbicsICdub3RGb3VuZENvbnRlbnQnLCAnZmllbGROYW1lcycsICdib3JkZXJlZCddKTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zO1xuICAgICAgICB2YXIgbmFtZXMgPSBnZXRGaWxsZWRGaWVsZE5hbWVzKF90aGlzLnByb3BzKTtcblxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoc3RhdGUuaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IF90aGlzLmdlbmVyYXRlRmlsdGVyZWRPcHRpb25zKHByZWZpeENscywgcmVuZGVyRW1wdHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX3JlZjM7XG5cbiAgICAgICAgICBvcHRpb25zID0gWyhfcmVmMyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9yZWYzLCBuYW1lcy5sYWJlbCwgbm90Rm91bmRDb250ZW50IHx8IHJlbmRlckVtcHR5KCdDYXNjYWRlcicpKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfcmVmMywgbmFtZXMudmFsdWUsICdBTlRfQ0FTQ0FERVJfTk9UX0ZPVU5EJyksIF9yZWYzKV07XG4gICAgICAgIH0gLy8gRHJvcGRvd24gbWVudSBzaG91bGQga2VlcCBwcmV2aW91cyBzdGF0dXMgdW50aWwgaXQgaXMgZnVsbHkgY2xvc2VkLlxuXG5cbiAgICAgICAgaWYgKCFzdGF0ZS5wb3B1cFZpc2libGUpIHtcbiAgICAgICAgICBvcHRpb25zID0gX3RoaXMuY2FjaGVkT3B0aW9ucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5jYWNoZWRPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkcm9wZG93bk1lbnVDb2x1bW5TdHlsZSA9IHt9O1xuICAgICAgICB2YXIgaXNOb3RGb3VuZCA9IChvcHRpb25zIHx8IFtdKS5sZW5ndGggPT09IDEgJiYgb3B0aW9uc1swXS5pc0VtcHR5Tm9kZTtcblxuICAgICAgICBpZiAoaXNOb3RGb3VuZCkge1xuICAgICAgICAgIGRyb3Bkb3duTWVudUNvbHVtblN0eWxlLmhlaWdodCA9ICdhdXRvJzsgLy8gSGVpZ2h0IG9mIG9uZSByb3cuXG4gICAgICAgIH0gLy8gVGhlIGRlZmF1bHQgdmFsdWUgb2YgYG1hdGNoSW5wdXRXaWR0aGAgaXMgYHRydWVgXG5cblxuICAgICAgICB2YXIgcmVzdWx0TGlzdE1hdGNoSW5wdXRXaWR0aCA9IHNob3dTZWFyY2gubWF0Y2hJbnB1dFdpZHRoICE9PSBmYWxzZTtcblxuICAgICAgICBpZiAocmVzdWx0TGlzdE1hdGNoSW5wdXRXaWR0aCAmJiAoc3RhdGUuaW5wdXRWYWx1ZSB8fCBpc05vdEZvdW5kKSAmJiBfdGhpcy5pbnB1dCkge1xuICAgICAgICAgIGRyb3Bkb3duTWVudUNvbHVtblN0eWxlLndpZHRoID0gX3RoaXMuaW5wdXQuaW5wdXQub2Zmc2V0V2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5wdXRJY29uO1xuXG4gICAgICAgIGlmIChzdWZmaXhJY29uKSB7XG4gICAgICAgICAgaW5wdXRJY29uID0gKDAsIF9yZWFjdE5vZGUucmVwbGFjZUVsZW1lbnQpKHN1ZmZpeEljb24sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGlja2VyLWFycm93XCIpXG4gICAgICAgICAgfSwgc3VmZml4SWNvbiksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfY2xhc3NOYW1lczQ7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzNCA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzNCwgc3VmZml4SWNvbi5wcm9wcy5jbGFzc05hbWUsIHN1ZmZpeEljb24ucHJvcHMuY2xhc3NOYW1lKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGlja2VyLWFycm93XCIpLCB0cnVlKSwgX2NsYXNzTmFtZXM0KSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5wdXRJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Rvd25PdXRsaW5lZFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogYXJyb3dDbHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnB1dCA9IGNoaWxkcmVuIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgIGNsYXNzTmFtZTogcGlja2VyQ2xzXG4gICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpY2tlci1sYWJlbFwiKVxuICAgICAgICB9LCBfdGhpcy5nZXRMYWJlbCgpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2lucHV0W1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBpbnB1dFByb3BzLCB7XG4gICAgICAgICAgdGFiSW5kZXg6IFwiLTFcIixcbiAgICAgICAgICByZWY6IF90aGlzLnNhdmVJbnB1dCxcbiAgICAgICAgICBwcmVmaXhDbHM6IGlucHV0UHJlZml4Q2xzLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdW5kZWZpbmVkIDogcGxhY2Vob2xkZXIsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0IFwiKS5jb25jYXQoc2l6ZUNscyksXG4gICAgICAgICAgdmFsdWU6IHN0YXRlLmlucHV0VmFsdWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgIHJlYWRPbmx5OiAhc2hvd1NlYXJjaCxcbiAgICAgICAgICBhdXRvQ29tcGxldGU6IGlucHV0UHJvcHMuYXV0b0NvbXBsZXRlIHx8ICdvZmYnLFxuICAgICAgICAgIG9uQ2xpY2s6IHNob3dTZWFyY2ggPyBfdGhpcy5oYW5kbGVJbnB1dENsaWNrIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG9uQmx1cjogc2hvd1NlYXJjaCA/IF90aGlzLmhhbmRsZUlucHV0Qmx1ciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBvbktleURvd246IF90aGlzLmhhbmRsZUtleURvd24sXG4gICAgICAgICAgb25DaGFuZ2U6IHNob3dTZWFyY2ggPyBfdGhpcy5oYW5kbGVJbnB1dENoYW5nZSA6IHVuZGVmaW5lZFxuICAgICAgICB9KSksIGNsZWFySWNvbiwgaW5wdXRJY29uKTtcbiAgICAgICAgdmFyIGV4cGFuZEljb25Ob2RlO1xuXG4gICAgICAgIGlmIChleHBhbmRJY29uKSB7XG4gICAgICAgICAgZXhwYW5kSWNvbk5vZGUgPSBleHBhbmRJY29uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV4cGFuZEljb25Ob2RlID0gaXNSdGxMYXlvdXQgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTGVmdE91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUmlnaHRPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvYWRpbmdJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVudS1pdGVtLWxvYWRpbmctaWNvblwiKVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUmVkb091dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICAgIHNwaW46IHRydWVcbiAgICAgICAgfSkpO1xuICAgICAgICB2YXIgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXI7XG4gICAgICAgIHZhciByZXN0ID0gKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkocHJvcHMsIFsnaW5wdXRJY29uJywgJ2V4cGFuZEljb24nLCAnbG9hZGluZ0ljb24nLCAnYm9yZGVyZWQnXSk7XG4gICAgICAgIHZhciByY0Nhc2NhZGVyUG9wdXBDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwb3B1cENsYXNzTmFtZSwgKF9jbGFzc05hbWVzNSA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzNSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZW51LVwiKS5jb25jYXQoZGlyZWN0aW9uKSwgZGlyZWN0aW9uID09PSAncnRsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXM1LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lbnUtZW1wdHlcIiksIG9wdGlvbnMubGVuZ3RoID09PSAxICYmIG9wdGlvbnNbMF0udmFsdWUgPT09ICdBTlRfQ0FTQ0FERVJfTk9UX0ZPVU5EJyksIF9jbGFzc05hbWVzNSkpO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjQ2FzY2FkZXJbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHJlc3QsIHtcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcG9wdXBWaXNpYmxlOiBzdGF0ZS5wb3B1cFZpc2libGUsXG4gICAgICAgICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IF90aGlzLmhhbmRsZVBvcHVwVmlzaWJsZUNoYW5nZSxcbiAgICAgICAgICBvbkNoYW5nZTogX3RoaXMuaGFuZGxlQ2hhbmdlLFxuICAgICAgICAgIGRyb3Bkb3duTWVudUNvbHVtblN0eWxlOiBkcm9wZG93bk1lbnVDb2x1bW5TdHlsZSxcbiAgICAgICAgICBleHBhbmRJY29uOiBleHBhbmRJY29uTm9kZSxcbiAgICAgICAgICBsb2FkaW5nSWNvbjogbG9hZGluZ0ljb24sXG4gICAgICAgICAgcG9wdXBDbGFzc05hbWU6IHJjQ2FzY2FkZXJQb3B1cENsYXNzTmFtZSxcbiAgICAgICAgICBwb3B1cFBsYWNlbWVudDogX3RoaXMuZ2V0UG9wdXBQbGFjZW1lbnQoZGlyZWN0aW9uKSxcbiAgICAgICAgICBkcm9wZG93blJlbmRlcjogZHJvcGRvd25SZW5kZXJcbiAgICAgICAgfSksIGlucHV0KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHZhbHVlOiBwcm9wcy52YWx1ZSB8fCBwcm9wcy5kZWZhdWx0VmFsdWUgfHwgW10sXG4gICAgICBpbnB1dFZhbHVlOiAnJyxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBwb3B1cFZpc2libGU6IHByb3BzLnBvcHVwVmlzaWJsZSxcbiAgICAgIGZsYXR0ZW5PcHRpb25zOiBwcm9wcy5zaG93U2VhcmNoID8gZmxhdHRlblRyZWUocHJvcHMub3B0aW9ucywgcHJvcHMpIDogdW5kZWZpbmVkLFxuICAgICAgcHJldlByb3BzOiBwcm9wc1xuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShDYXNjYWRlciwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICBpZiAodGhpcy5jbGVhclNlbGVjdGlvblRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xlYXJTZWxlY3Rpb25UaW1lb3V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TGFiZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TGFiZWwoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIG9wdGlvbnMgPSBfdGhpcyRwcm9wcy5vcHRpb25zLFxuICAgICAgICAgIF90aGlzJHByb3BzJGRpc3BsYXlSZSA9IF90aGlzJHByb3BzLmRpc3BsYXlSZW5kZXIsXG4gICAgICAgICAgZGlzcGxheVJlbmRlciA9IF90aGlzJHByb3BzJGRpc3BsYXlSZSA9PT0gdm9pZCAwID8gZGVmYXVsdERpc3BsYXlSZW5kZXIgOiBfdGhpcyRwcm9wcyRkaXNwbGF5UmU7XG4gICAgICB2YXIgbmFtZXMgPSBnZXRGaWxsZWRGaWVsZE5hbWVzKHRoaXMucHJvcHMpO1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgIHZhciB1bndyYXBwZWRWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWVbMF0pID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgICAgIHZhciBzZWxlY3RlZE9wdGlvbnMgPSAoMCwgX2FycmF5VHJlZUZpbHRlcltcImRlZmF1bHRcIl0pKG9wdGlvbnMsIGZ1bmN0aW9uIChvLCBsZXZlbCkge1xuICAgICAgICByZXR1cm4gb1tuYW1lcy52YWx1ZV0gPT09IHVud3JhcHBlZFZhbHVlW2xldmVsXTtcbiAgICAgIH0sIHtcbiAgICAgICAgY2hpbGRyZW5LZXlOYW1lOiBuYW1lcy5jaGlsZHJlblxuICAgICAgfSk7XG4gICAgICB2YXIgbGFiZWwgPSBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoID8gc2VsZWN0ZWRPcHRpb25zLm1hcChmdW5jdGlvbiAobykge1xuICAgICAgICByZXR1cm4gb1tuYW1lcy5sYWJlbF07XG4gICAgICB9KSA6IHZhbHVlO1xuICAgICAgcmV0dXJuIGRpc3BsYXlSZW5kZXIobGFiZWwsIHNlbGVjdGVkT3B0aW9ucyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdlbmVyYXRlRmlsdGVyZWRPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdlbmVyYXRlRmlsdGVyZWRPcHRpb25zKHByZWZpeENscywgcmVuZGVyRW1wdHkpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzLFxuICAgICAgICAgIF9yZWY1O1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBzaG93U2VhcmNoID0gX3RoaXMkcHJvcHMyLnNob3dTZWFyY2gsXG4gICAgICAgICAgbm90Rm91bmRDb250ZW50ID0gX3RoaXMkcHJvcHMyLm5vdEZvdW5kQ29udGVudDtcbiAgICAgIHZhciBuYW1lcyA9IGdldEZpbGxlZEZpZWxkTmFtZXModGhpcy5wcm9wcyk7XG4gICAgICB2YXIgX3Nob3dTZWFyY2gkZmlsdGVyID0gc2hvd1NlYXJjaC5maWx0ZXIsXG4gICAgICAgICAgZmlsdGVyID0gX3Nob3dTZWFyY2gkZmlsdGVyID09PSB2b2lkIDAgPyBkZWZhdWx0RmlsdGVyT3B0aW9uIDogX3Nob3dTZWFyY2gkZmlsdGVyLFxuICAgICAgICAgIF9zaG93U2VhcmNoJHJlbmRlciA9IHNob3dTZWFyY2gucmVuZGVyLFxuICAgICAgICAgIHJlbmRlciA9IF9zaG93U2VhcmNoJHJlbmRlciA9PT0gdm9pZCAwID8gZGVmYXVsdFJlbmRlckZpbHRlcmVkT3B0aW9uIDogX3Nob3dTZWFyY2gkcmVuZGVyLFxuICAgICAgICAgIF9zaG93U2VhcmNoJHNvcnQgPSBzaG93U2VhcmNoLnNvcnQsXG4gICAgICAgICAgc29ydCA9IF9zaG93U2VhcmNoJHNvcnQgPT09IHZvaWQgMCA/IGRlZmF1bHRTb3J0RmlsdGVyZWRPcHRpb24gOiBfc2hvd1NlYXJjaCRzb3J0LFxuICAgICAgICAgIF9zaG93U2VhcmNoJGxpbWl0ID0gc2hvd1NlYXJjaC5saW1pdCxcbiAgICAgICAgICBsaW1pdCA9IF9zaG93U2VhcmNoJGxpbWl0ID09PSB2b2lkIDAgPyBkZWZhdWx0TGltaXQgOiBfc2hvd1NlYXJjaCRsaW1pdDtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTIgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgIF90aGlzJHN0YXRlMiRmbGF0dGVuTyA9IF90aGlzJHN0YXRlMi5mbGF0dGVuT3B0aW9ucyxcbiAgICAgICAgICBmbGF0dGVuT3B0aW9ucyA9IF90aGlzJHN0YXRlMiRmbGF0dGVuTyA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRzdGF0ZTIkZmxhdHRlbk8sXG4gICAgICAgICAgaW5wdXRWYWx1ZSA9IF90aGlzJHN0YXRlMi5pbnB1dFZhbHVlOyAvLyBMaW1pdCB0aGUgZmlsdGVyIGlmIG5lZWRlZFxuXG4gICAgICB2YXIgZmlsdGVyZWQ7XG5cbiAgICAgIGlmIChsaW1pdCA+IDApIHtcbiAgICAgICAgZmlsdGVyZWQgPSBbXTtcbiAgICAgICAgdmFyIG1hdGNoQ291bnQgPSAwOyAvLyBQZXJmIG9wdGltaXphdGlvbiB0byBmaWx0ZXIgaXRlbXMgb25seSBiZWxvdyB0aGUgbGltaXRcblxuICAgICAgICBmbGF0dGVuT3B0aW9ucy5zb21lKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0gZmlsdGVyKF90aGlzMi5zdGF0ZS5pbnB1dFZhbHVlLCBwYXRoLCBuYW1lcyk7XG5cbiAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkLnB1c2gocGF0aCk7XG4gICAgICAgICAgICBtYXRjaENvdW50ICs9IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1hdGNoQ291bnQgPj0gbGltaXQ7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkodHlwZW9mIGxpbWl0ICE9PSAnbnVtYmVyJywgJ0Nhc2NhZGVyJywgXCInbGltaXQnIG9mIHNob3dTZWFyY2ggc2hvdWxkIGJlIHBvc2l0aXZlIG51bWJlciBvciBmYWxzZS5cIik7XG4gICAgICAgIGZpbHRlcmVkID0gZmxhdHRlbk9wdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcihfdGhpczIuc3RhdGUuaW5wdXRWYWx1ZSwgcGF0aCwgbmFtZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBzb3J0KGEsIGIsIGlucHV0VmFsdWUsIG5hbWVzKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBGaXggaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI2NTU0XG4gICAgICAgIHZhciBmaWVsZCA9IG5hbWVzLnZhbHVlID09PSBuYW1lcy5sYWJlbCA/IGtlZXBGaWx0ZXJlZFZhbHVlRmllbGQgOiBuYW1lcy52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkLm1hcChmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICAgIHZhciBfcmVmNDtcblxuICAgICAgICAgIHJldHVybiBfcmVmNCA9IHtcbiAgICAgICAgICAgIF9fSVNfRklMVEVSRURfT1BUSU9OOiB0cnVlLFxuICAgICAgICAgICAgcGF0aDogcGF0aFxuICAgICAgICAgIH0sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX3JlZjQsIGZpZWxkLCBwYXRoLm1hcChmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgcmV0dXJuIG9bbmFtZXMudmFsdWVdO1xuICAgICAgICAgIH0pKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfcmVmNCwgbmFtZXMubGFiZWwsIHJlbmRlcihpbnB1dFZhbHVlLCBwYXRoLCBwcmVmaXhDbHMsIG5hbWVzKSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX3JlZjQsIFwiZGlzYWJsZWRcIiwgcGF0aC5zb21lKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICByZXR1cm4gISFvLmRpc2FibGVkO1xuICAgICAgICAgIH0pKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfcmVmNCwgXCJpc0VtcHR5Tm9kZVwiLCB0cnVlKSwgX3JlZjQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gWyhfcmVmNSA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9yZWY1LCBuYW1lcy52YWx1ZSwgJ0FOVF9DQVNDQURFUl9OT1RfRk9VTkQnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfcmVmNSwgbmFtZXMubGFiZWwsIG5vdEZvdW5kQ29udGVudCB8fCByZW5kZXJFbXB0eSgnQ2FzY2FkZXInKSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX3JlZjUsIFwiZGlzYWJsZWRcIiwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX3JlZjUsIFwiaXNFbXB0eU5vZGVcIiwgdHJ1ZSksIF9yZWY1KV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJibHVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UG9wdXBQbGFjZW1lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UG9wdXBQbGFjZW1lbnQoKSB7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnbHRyJztcbiAgICAgIHZhciBwb3B1cFBsYWNlbWVudCA9IHRoaXMucHJvcHMucG9wdXBQbGFjZW1lbnQ7XG5cbiAgICAgIGlmIChwb3B1cFBsYWNlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBwb3B1cFBsYWNlbWVudDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnYm90dG9tUmlnaHQnIDogJ2JvdHRvbUxlZnQnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb25maWdBcmd1bWVudCkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwgbnVsbCwgZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczMucmVuZGVyQ2FzY2FkZXIoY29uZmlnQXJndW1lbnQsIGxvY2FsZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIF9yZWY2KSB7XG4gICAgICB2YXIgcHJldlByb3BzID0gX3JlZjYucHJldlByb3BzO1xuICAgICAgdmFyIG5ld1N0YXRlID0ge1xuICAgICAgICBwcmV2UHJvcHM6IG5leHRQcm9wc1xuICAgICAgfTtcblxuICAgICAgaWYgKCd2YWx1ZScgaW4gbmV4dFByb3BzKSB7XG4gICAgICAgIG5ld1N0YXRlLnZhbHVlID0gbmV4dFByb3BzLnZhbHVlIHx8IFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAoJ3BvcHVwVmlzaWJsZScgaW4gbmV4dFByb3BzKSB7XG4gICAgICAgIG5ld1N0YXRlLnBvcHVwVmlzaWJsZSA9IG5leHRQcm9wcy5wb3B1cFZpc2libGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0UHJvcHMuc2hvd1NlYXJjaCAmJiBwcmV2UHJvcHMub3B0aW9ucyAhPT0gbmV4dFByb3BzLm9wdGlvbnMpIHtcbiAgICAgICAgbmV3U3RhdGUuZmxhdHRlbk9wdGlvbnMgPSBmbGF0dGVuVHJlZShuZXh0UHJvcHMub3B0aW9ucywgbmV4dFByb3BzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgbmV4dFByb3BzLm9wdGlvbnMpIHtcbiAgICAgICAgd2FybmluZ1ZhbHVlTm90RXhpc3QobmV4dFByb3BzLm9wdGlvbnMsIGdldEZpZWxkTmFtZXMobmV4dFByb3BzKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENhc2NhZGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5DYXNjYWRlci5kZWZhdWx0UHJvcHMgPSB7XG4gIHRyYW5zaXRpb25OYW1lOiAnc2xpZGUtdXAnLFxuICBvcHRpb25zOiBbXSxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBhbGxvd0NsZWFyOiB0cnVlLFxuICBib3JkZXJlZDogdHJ1ZVxufTtcbnZhciBfZGVmYXVsdCA9IENhc2NhZGVyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcmNDaGVja2JveCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLWNoZWNrYm94XCIpKTtcblxudmFyIF9Hcm91cCA9IHJlcXVpcmUoXCIuL0dyb3VwXCIpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgQ2hlY2tib3ggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRQdXJlQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoQ2hlY2tib3gsIF9SZWFjdCRQdXJlQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShDaGVja2JveCk7XG5cbiAgZnVuY3Rpb24gQ2hlY2tib3goKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBDaGVja2JveCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIF90aGlzLnNhdmVDaGVja2JveCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBfdGhpcy5yY0NoZWNrYm94ID0gbm9kZTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVuZGVyQ2hlY2tib3ggPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHMsXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb247XG5cbiAgICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemUgPSAoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDJbXCJkZWZhdWx0XCJdKShfdGhpcyksXG4gICAgICAgICAgcHJvcHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUucHJvcHMsXG4gICAgICAgICAgY29udGV4dCA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZS5jb250ZXh0O1xuXG4gICAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIGluZGV0ZXJtaW5hdGUgPSBwcm9wcy5pbmRldGVybWluYXRlLFxuICAgICAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICAgICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZSA9IHByb3BzLm9uTW91c2VMZWF2ZSxcbiAgICAgICAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiaW5kZXRlcm1pbmF0ZVwiLCBcInN0eWxlXCIsIFwib25Nb3VzZUVudGVyXCIsIFwib25Nb3VzZUxlYXZlXCJdKTtcblxuICAgICAgdmFyIGNoZWNrYm94R3JvdXAgPSBjb250ZXh0O1xuICAgICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY2hlY2tib3gnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgdmFyIGNoZWNrYm94UHJvcHMgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHJlc3RQcm9wcyk7XG5cbiAgICAgIGlmIChjaGVja2JveEdyb3VwKSB7XG4gICAgICAgIGNoZWNrYm94UHJvcHMub25DaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHJlc3RQcm9wcy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgcmVzdFByb3BzLm9uQ2hhbmdlLmFwcGx5KHJlc3RQcm9wcywgYXJndW1lbnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGVja2JveEdyb3VwLnRvZ2dsZU9wdGlvbih7XG4gICAgICAgICAgICBsYWJlbDogY2hpbGRyZW4sXG4gICAgICAgICAgICB2YWx1ZTogcHJvcHMudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjaGVja2JveFByb3BzLm5hbWUgPSBjaGVja2JveEdyb3VwLm5hbWU7XG4gICAgICAgIGNoZWNrYm94UHJvcHMuY2hlY2tlZCA9IGNoZWNrYm94R3JvdXAudmFsdWUuaW5kZXhPZihwcm9wcy52YWx1ZSkgIT09IC0xO1xuICAgICAgICBjaGVja2JveFByb3BzLmRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQgfHwgY2hlY2tib3hHcm91cC5kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGNsYXNzU3RyaW5nID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlclwiKSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwcGVyLWNoZWNrZWRcIiksIGNoZWNrYm94UHJvcHMuY2hlY2tlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1kaXNhYmxlZFwiKSwgY2hlY2tib3hQcm9wcy5kaXNhYmxlZCksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgICAgIHZhciBjaGVja2JveENsYXNzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmRldGVybWluYXRlXCIpLCBpbmRldGVybWluYXRlKSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc3gtYTExeS9sYWJlbC1oYXMtYXNzb2NpYXRlZC1jb250cm9sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcbiAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgICAgICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmVcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjQ2hlY2tib3hbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGNoZWNrYm94UHJvcHMsIHtcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBjbGFzc05hbWU6IGNoZWNrYm94Q2xhc3MsXG4gICAgICAgICAgcmVmOiBfdGhpcy5zYXZlQ2hlY2tib3hcbiAgICAgICAgfSkpLCBjaGlsZHJlbiAhPT0gdW5kZWZpbmVkICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZHJlbikpXG4gICAgICApO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKENoZWNrYm94LCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgdmFyIHZhbHVlID0gdGhpcy5wcm9wcy52YWx1ZTtcbiAgICAgIChfYSA9IHRoaXMuY29udGV4dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlZ2lzdGVyVmFsdWUodmFsdWUpO1xuICAgICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoJ2NoZWNrZWQnIGluIHRoaXMucHJvcHMgfHwgdGhpcy5jb250ZXh0IHx8ICEoJ3ZhbHVlJyBpbiB0aGlzLnByb3BzKSwgJ0NoZWNrYm94JywgJ2B2YWx1ZWAgaXMgbm90IGEgdmFsaWQgcHJvcCwgZG8geW91IG1lYW4gYGNoZWNrZWRgPycpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKF9yZWYyKSB7XG4gICAgICB2YXIgcHJldlZhbHVlID0gX3JlZjIudmFsdWU7XG5cbiAgICAgIHZhciBfYSwgX2I7XG5cbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMucHJvcHMudmFsdWU7XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gcHJldlZhbHVlKSB7XG4gICAgICAgIChfYSA9IHRoaXMuY29udGV4dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbmNlbFZhbHVlKHByZXZWYWx1ZSk7XG4gICAgICAgIChfYiA9IHRoaXMuY29udGV4dCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnJlZ2lzdGVyVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgdmFyIHZhbHVlID0gdGhpcy5wcm9wcy52YWx1ZTtcbiAgICAgIChfYSA9IHRoaXMuY29udGV4dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbmNlbFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9jdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICB0aGlzLnJjQ2hlY2tib3guZm9jdXMoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmx1clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdGhpcy5yY0NoZWNrYm94LmJsdXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIHRoaXMucmVuZGVyQ2hlY2tib3gpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ2hlY2tib3g7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpO1xuXG5DaGVja2JveC5fX0FOVF9DSEVDS0JPWCA9IHRydWU7XG5DaGVja2JveC5kZWZhdWx0UHJvcHMgPSB7XG4gIGluZGV0ZXJtaW5hdGU6IGZhbHNlXG59O1xuQ2hlY2tib3guY29udGV4dFR5cGUgPSBfR3JvdXAuR3JvdXBDb250ZXh0O1xudmFyIF9kZWZhdWx0ID0gQ2hlY2tib3g7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXhwb3J0cy5Hcm91cENvbnRleHQgPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9DaGVja2JveCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ2hlY2tib3hcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBHcm91cENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydHMuR3JvdXBDb250ZXh0ID0gR3JvdXBDb250ZXh0O1xuXG52YXIgQ2hlY2tib3hHcm91cCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JFB1cmVDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShDaGVja2JveEdyb3VwLCBfUmVhY3QkUHVyZUNvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoQ2hlY2tib3hHcm91cCk7XG5cbiAgZnVuY3Rpb24gQ2hlY2tib3hHcm91cChwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgQ2hlY2tib3hHcm91cCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfdGhpcy5jYW5jZWxWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIHJlZ2lzdGVyZWRWYWx1ZXMgPSBfcmVmLnJlZ2lzdGVyZWRWYWx1ZXM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVnaXN0ZXJlZFZhbHVlczogcmVnaXN0ZXJlZFZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbCAhPT0gdmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZWdpc3RlclZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIHJlZ2lzdGVyZWRWYWx1ZXMgPSBfcmVmMi5yZWdpc3RlcmVkVmFsdWVzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlZ2lzdGVyZWRWYWx1ZXM6IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKHJlZ2lzdGVyZWRWYWx1ZXMpLCBbdmFsdWVdKVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLnRvZ2dsZU9wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgIHZhciByZWdpc3RlcmVkVmFsdWVzID0gX3RoaXMuc3RhdGUucmVnaXN0ZXJlZFZhbHVlcztcblxuICAgICAgdmFyIG9wdGlvbkluZGV4ID0gX3RoaXMuc3RhdGUudmFsdWUuaW5kZXhPZihvcHRpb24udmFsdWUpO1xuXG4gICAgICB2YXIgdmFsdWUgPSAoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKF90aGlzLnN0YXRlLnZhbHVlKTtcblxuICAgICAgaWYgKG9wdGlvbkluZGV4ID09PSAtMSkge1xuICAgICAgICB2YWx1ZS5wdXNoKG9wdGlvbi52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZS5zcGxpY2Uob3B0aW9uSW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoISgndmFsdWUnIGluIF90aGlzLnByb3BzKSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgb25DaGFuZ2UgPSBfdGhpcy5wcm9wcy5vbkNoYW5nZTtcblxuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gX3RoaXMuZ2V0T3B0aW9ucygpO1xuXG4gICAgICAgIG9uQ2hhbmdlKHZhbHVlLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRWYWx1ZXMuaW5kZXhPZih2YWwpICE9PSAtMTtcbiAgICAgICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHZhciBpbmRleEEgPSBvcHRpb25zLmZpbmRJbmRleChmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0LnZhbHVlID09PSBhO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBpbmRleEIgPSBvcHRpb25zLmZpbmRJbmRleChmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0LnZhbHVlID09PSBiO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBpbmRleEEgLSBpbmRleEI7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMucmVuZGVyR3JvdXAgPSBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmMy5nZXRQcmVmaXhDbHMsXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3JlZjMuZGlyZWN0aW9uO1xuXG4gICAgICB2YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplID0gKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyW1wiZGVmYXVsdFwiXSkoX3RoaXMpLFxuICAgICAgICAgIHByb3BzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplLnByb3BzLFxuICAgICAgICAgIHN0YXRlID0gX2Fzc2VydFRoaXNJbml0aWFsaXplLnN0YXRlO1xuXG4gICAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgICAgIG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zLFxuICAgICAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJvcHRpb25zXCJdKTtcblxuICAgICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY2hlY2tib3gnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgdmFyIGdyb3VwUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ncm91cFwiKTtcbiAgICAgIHZhciBkb21Qcm9wcyA9ICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKHJlc3RQcm9wcywgWydjaGlsZHJlbicsICdkZWZhdWx0VmFsdWUnLCAndmFsdWUnLCAnb25DaGFuZ2UnLCAnZGlzYWJsZWQnXSk7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcblxuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMuZ2V0T3B0aW9ucygpLm1hcChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DaGVja2JveFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgICAga2V5OiBvcHRpb24udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGRpc2FibGVkOiAnZGlzYWJsZWQnIGluIG9wdGlvbiA/IG9wdGlvbi5kaXNhYmxlZCA6IHByb3BzLmRpc2FibGVkLFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IHN0YXRlLnZhbHVlLmluZGV4T2Yob3B0aW9uLnZhbHVlKSAhPT0gLTEsXG4gICAgICAgICAgICBvbkNoYW5nZTogb3B0aW9uLm9uQ2hhbmdlLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChncm91cFByZWZpeENscywgXCItaXRlbVwiKSxcbiAgICAgICAgICAgIHN0eWxlOiBvcHRpb24uc3R5bGVcbiAgICAgICAgICB9LCBvcHRpb24ubGFiZWwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgIHRvZ2dsZU9wdGlvbjogX3RoaXMudG9nZ2xlT3B0aW9uLFxuICAgICAgICB2YWx1ZTogX3RoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgIGRpc2FibGVkOiBfdGhpcy5wcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgbmFtZTogX3RoaXMucHJvcHMubmFtZSxcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTYzNzZcbiAgICAgICAgcmVnaXN0ZXJWYWx1ZTogX3RoaXMucmVnaXN0ZXJWYWx1ZSxcbiAgICAgICAgY2FuY2VsVmFsdWU6IF90aGlzLmNhbmNlbFZhbHVlXG4gICAgICB9O1xuICAgICAgdmFyIGNsYXNzU3RyaW5nID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoZ3JvdXBQcmVmaXhDbHMsICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KGdyb3VwUHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBjbGFzc05hbWUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmcsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgZG9tUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChHcm91cENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IGNvbnRleHRcbiAgICAgIH0sIGNoaWxkcmVuKSk7XG4gICAgfTtcblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgdmFsdWU6IHByb3BzLnZhbHVlIHx8IHByb3BzLmRlZmF1bHRWYWx1ZSB8fCBbXSxcbiAgICAgIHJlZ2lzdGVyZWRWYWx1ZXM6IFtdXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKENoZWNrYm94R3JvdXAsIFt7XG4gICAga2V5OiBcImdldE9wdGlvbnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3B0aW9ucygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5wcm9wcy5vcHRpb25zOyAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzc5NjBcblxuICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsOiBvcHRpb24sXG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb247XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIHRoaXMucmVuZGVyR3JvdXApO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICBpZiAoJ3ZhbHVlJyBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogbmV4dFByb3BzLnZhbHVlIHx8IFtdXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ2hlY2tib3hHcm91cDtcbn0oUmVhY3QuUHVyZUNvbXBvbmVudCk7XG5cbkNoZWNrYm94R3JvdXAuZGVmYXVsdFByb3BzID0ge1xuICBvcHRpb25zOiBbXVxufTtcbnZhciBfZGVmYXVsdCA9IENoZWNrYm94R3JvdXA7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX0NoZWNrYm94ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9DaGVja2JveFwiKSk7XG5cbnZhciBfR3JvdXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0dyb3VwXCIpKTtcblxuX0NoZWNrYm94W1wiZGVmYXVsdFwiXS5Hcm91cCA9IF9Hcm91cFtcImRlZmF1bHRcIl07XG52YXIgX2RlZmF1bHQgPSBfQ2hlY2tib3hbXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2dyaWQgPSByZXF1aXJlKFwiLi4vZ3JpZFwiKTtcblxudmFyIF9kZWZhdWx0ID0gX2dyaWQuQ29sO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNDb2xsYXBzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLWNvbGxhcHNlXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfUmlnaHRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1JpZ2h0T3V0bGluZWRcIikpO1xuXG52YXIgX0NvbGxhcHNlUGFuZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvbGxhcHNlUGFuZWxcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9vcGVuQW5pbWF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9vcGVuQW5pbWF0aW9uXCIpKTtcblxudmFyIF9yZWFjdE5vZGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvcmVhY3ROb2RlXCIpO1xuXG52YXIgQ29sbGFwc2UgPSBmdW5jdGlvbiBDb2xsYXBzZShwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIF9wcm9wcyRjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjbGFzc05hbWUgPSBfcHJvcHMkY2xhc3NOYW1lID09PSB2b2lkIDAgPyAnJyA6IF9wcm9wcyRjbGFzc05hbWUsXG4gICAgICBib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgICAgZ2hvc3QgPSBwcm9wcy5naG9zdDtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY29sbGFwc2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuXG4gIHZhciBnZXRJY29uUG9zaXRpb24gPSBmdW5jdGlvbiBnZXRJY29uUG9zaXRpb24oKSB7XG4gICAgdmFyIGV4cGFuZEljb25Qb3NpdGlvbiA9IHByb3BzLmV4cGFuZEljb25Qb3NpdGlvbjtcblxuICAgIGlmIChleHBhbmRJY29uUG9zaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4cGFuZEljb25Qb3NpdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSAncnRsJyA/ICdyaWdodCcgOiAnbGVmdCc7XG4gIH07XG5cbiAgdmFyIHJlbmRlckV4cGFuZEljb24gPSBmdW5jdGlvbiByZW5kZXJFeHBhbmRJY29uKCkge1xuICAgIHZhciBwYW5lbFByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB2YXIgZXhwYW5kSWNvbiA9IHByb3BzLmV4cGFuZEljb247XG4gICAgdmFyIGljb24gPSBleHBhbmRJY29uID8gZXhwYW5kSWNvbihwYW5lbFByb3BzKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9SaWdodE91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgcm90YXRlOiBwYW5lbFByb3BzLmlzQWN0aXZlID8gOTAgOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICByZXR1cm4gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShpY29uLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKGljb24ucHJvcHMuY2xhc3NOYW1lLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFycm93XCIpKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgaWNvblBvc2l0aW9uID0gZ2V0SWNvblBvc2l0aW9uKCk7XG4gIHZhciBjb2xsYXBzZUNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvcmRlcmxlc3NcIiksICFib3JkZXJlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvbi1wb3NpdGlvbi1cIikuY29uY2F0KGljb25Qb3NpdGlvbiksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ2hvc3RcIiksICEhZ2hvc3QpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHZhciBvcGVuQW5pbWF0aW9uID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgX29wZW5BbmltYXRpb25bXCJkZWZhdWx0XCJdKSwge1xuICAgIGFwcGVhcjogZnVuY3Rpb24gYXBwZWFyKCkge31cbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNDb2xsYXBzZVtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgb3BlbkFuaW1hdGlvbjogb3BlbkFuaW1hdGlvblxuICB9LCBwcm9wcywge1xuICAgIGV4cGFuZEljb246IGZ1bmN0aW9uIGV4cGFuZEljb24ocGFuZWxQcm9wcykge1xuICAgICAgcmV0dXJuIHJlbmRlckV4cGFuZEljb24ocGFuZWxQcm9wcyk7XG4gICAgfSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IGNvbGxhcHNlQ2xhc3NOYW1lXG4gIH0pKTtcbn07XG5cbkNvbGxhcHNlLlBhbmVsID0gX0NvbGxhcHNlUGFuZWxbXCJkZWZhdWx0XCJdO1xuQ29sbGFwc2UuZGVmYXVsdFByb3BzID0ge1xuICBib3JkZXJlZDogdHJ1ZVxufTtcbnZhciBfZGVmYXVsdCA9IENvbGxhcHNlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNDb2xsYXBzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLWNvbGxhcHNlXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgQ29sbGFwc2VQYW5lbCA9IGZ1bmN0aW9uIENvbGxhcHNlUGFuZWwocHJvcHMpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIF9wcm9wcyRjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjbGFzc05hbWUgPSBfcHJvcHMkY2xhc3NOYW1lID09PSB2b2lkIDAgPyAnJyA6IF9wcm9wcyRjbGFzc05hbWUsXG4gICAgICBfcHJvcHMkc2hvd0Fycm93ID0gcHJvcHMuc2hvd0Fycm93LFxuICAgICAgc2hvd0Fycm93ID0gX3Byb3BzJHNob3dBcnJvdyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRzaG93QXJyb3c7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NvbGxhcHNlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGNvbGxhcHNlUGFuZWxDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vLWFycm93XCIpLCAhc2hvd0Fycm93KSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY0NvbGxhcHNlW1wiZGVmYXVsdFwiXS5QYW5lbCwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogY29sbGFwc2VQYW5lbENsYXNzTmFtZVxuICB9KSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBDb2xsYXBzZVBhbmVsO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9Db2xsYXBzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29sbGFwc2VcIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfQ29sbGFwc2VbXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9jc3NBbmltYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3MtYW5pbWF0aW9uXCIpKTtcblxudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYWZcIikpO1xuXG4vKipcbiAqIERlcHJlY2F0ZWQuIFdlIHNob3VsZCByZXBsYWNlIHRoZSBhbmltYXRpb24gd2l0aCBwdXJlIHJlYWN0IG1vdGlvbiBpbnN0ZWFkIG9mIG1vZGlmeSBzdHlsZSBkaXJlY3RseS5cbiAqIElmIHlvdSBhcmUgY3JlYXRpbmcgbmV3IGNvbXBvbmVudCB3aXRoIGFuaW1hdGlvbiwgcGxlYXNlIHVzZSBgLi9tb3Rpb25gLlxuICovXG5mdW5jdGlvbiBhbmltYXRlKG5vZGUsIHNob3csIGRvbmUpIHtcbiAgdmFyIGhlaWdodDtcbiAgdmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZUlkO1xuICByZXR1cm4gKDAsIF9jc3NBbmltYXRpb25bXCJkZWZhdWx0XCJdKShub2RlLCAnYW50LW1vdGlvbi1jb2xsYXBzZS1sZWdhY3knLCB7XG4gICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgaWYgKCFzaG93KSB7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQobm9kZS5vZmZzZXRIZWlnaHQsIFwicHhcIik7XG4gICAgICAgIG5vZGUuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlaWdodCA9IG5vZGUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBub2RlLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuICAgICAgICBub2RlLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICB9XG4gICAgfSxcbiAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gKDAsIF9yYWZbXCJkZWZhdWx0XCJdKShmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQoc2hvdyA/IGhlaWdodCA6IDAsIFwicHhcIik7XG4gICAgICAgIG5vZGUuc3R5bGUub3BhY2l0eSA9IHNob3cgPyAnMScgOiAnMCc7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24gZW5kKCkge1xuICAgICAgaWYgKHJlcXVlc3RBbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICAgIF9yYWZbXCJkZWZhdWx0XCJdLmNhbmNlbChyZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICBub2RlLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH0pO1xufVxuXG52YXIgYW5pbWF0aW9uID0ge1xuICBlbnRlcjogZnVuY3Rpb24gZW50ZXIobm9kZSwgZG9uZSkge1xuICAgIHJldHVybiBhbmltYXRlKG5vZGUsIHRydWUsIGRvbmUpO1xuICB9LFxuICBsZWF2ZTogZnVuY3Rpb24gbGVhdmUobm9kZSwgZG9uZSkge1xuICAgIHJldHVybiBhbmltYXRlKG5vZGUsIGZhbHNlLCBkb25lKTtcbiAgfSxcbiAgYXBwZWFyOiBmdW5jdGlvbiBhcHBlYXIobm9kZSwgZG9uZSkge1xuICAgIHJldHVybiBhbmltYXRlKG5vZGUsIHRydWUsIGRvbmUpO1xuICB9XG59O1xudmFyIF9kZWZhdWx0ID0gYW5pbWF0aW9uO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBDb21tZW50ID0gZnVuY3Rpb24gQ29tbWVudChfYSkge1xuICB2YXIgYWN0aW9ucyA9IF9hLmFjdGlvbnMsXG4gICAgICBhdXRob3IgPSBfYS5hdXRob3IsXG4gICAgICBhdmF0YXIgPSBfYS5hdmF0YXIsXG4gICAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IF9hLmNvbnRlbnQsXG4gICAgICBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICBkYXRldGltZSA9IF9hLmRhdGV0aW1lLFxuICAgICAgb3RoZXJQcm9wcyA9IF9fcmVzdChfYSwgW1wiYWN0aW9uc1wiLCBcImF1dGhvclwiLCBcImF2YXRhclwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcInByZWZpeENsc1wiLCBcImRhdGV0aW1lXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgcmVuZGVyTmVzdGVkID0gZnVuY3Rpb24gcmVuZGVyTmVzdGVkKHByZWZpeENscywgbmVzdGVkQ2hpbGRyZW4pIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5lc3RlZFwiKSlcbiAgICB9LCBuZXN0ZWRDaGlsZHJlbik7XG4gIH07XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY29tbWVudCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBhdmF0YXJEb20gPSBhdmF0YXIgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWF2YXRhclwiKVxuICB9LCB0eXBlb2YgYXZhdGFyID09PSAnc3RyaW5nJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICBzcmM6IGF2YXRhcixcbiAgICBhbHQ6IFwiY29tbWVudC1hdmF0YXJcIlxuICB9KSA6IGF2YXRhcikgOiBudWxsO1xuICB2YXIgYWN0aW9uRG9tID0gYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0aCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3Rpb25zXCIpXG4gIH0sIGFjdGlvbnMubWFwKGZ1bmN0aW9uIChhY3Rpb24sIGluZGV4KSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAga2V5OiBcImFjdGlvbi1cIi5jb25jYXQoaW5kZXgpXG4gICAgfSwgYWN0aW9uKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgIDtcbiAgfSkpIDogbnVsbDtcbiAgdmFyIGF1dGhvckNvbnRlbnQgPSAoYXV0aG9yIHx8IGRhdGV0aW1lKSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnQtYXV0aG9yXCIpXG4gIH0sIGF1dGhvciAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWF1dGhvci1uYW1lXCIpXG4gIH0sIGF1dGhvciksIGRhdGV0aW1lICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnQtYXV0aG9yLXRpbWVcIilcbiAgfSwgZGF0ZXRpbWUpKTtcbiAgdmFyIGNvbnRlbnREb20gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnRcIilcbiAgfSwgYXV0aG9yQ29udGVudCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWRldGFpbFwiKVxuICB9LCBjb250ZW50KSwgYWN0aW9uRG9tKTtcbiAgdmFyIGNscyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBvdGhlclByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBjbHNcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXJcIilcbiAgfSwgYXZhdGFyRG9tLCBjb250ZW50RG9tKSwgY2hpbGRyZW4gPyByZW5kZXJOZXN0ZWQocHJlZml4Q2xzLCBjaGlsZHJlbikgOiBudWxsKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IENvbW1lbnQ7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHBvcnRzLlNpemVDb250ZXh0UHJvdmlkZXIgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBTaXplQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG5cbnZhciBTaXplQ29udGV4dFByb3ZpZGVyID0gZnVuY3Rpb24gU2l6ZUNvbnRleHRQcm92aWRlcihfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBzaXplID0gX3JlZi5zaXplO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2l6ZUNvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChvcmlnaW5TaXplKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpemVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogc2l6ZSB8fCBvcmlnaW5TaXplXG4gICAgfSwgY2hpbGRyZW4pO1xuICB9KTtcbn07XG5cbmV4cG9ydHMuU2l6ZUNvbnRleHRQcm92aWRlciA9IFNpemVDb250ZXh0UHJvdmlkZXI7XG52YXIgX2RlZmF1bHQgPSBTaXplQ29udGV4dDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy53aXRoQ29uZmlnQ29uc3VtZXIgPSB3aXRoQ29uZmlnQ29uc3VtZXI7XG5leHBvcnRzLkNvbmZpZ0NvbnN1bWVyID0gZXhwb3J0cy5Db25maWdDb250ZXh0ID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yZW5kZXJFbXB0eSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcmVuZGVyRW1wdHlcIikpO1xuXG52YXIgQ29uZmlnQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgLy8gV2UgcHJvdmlkZSBhIGRlZmF1bHQgZnVuY3Rpb24gZm9yIENvbnRleHQgd2l0aG91dCBwcm92aWRlclxuICBnZXRQcmVmaXhDbHM6IGZ1bmN0aW9uIGdldFByZWZpeENscyhzdWZmaXhDbHMsIGN1c3RvbWl6ZVByZWZpeENscykge1xuICAgIGlmIChjdXN0b21pemVQcmVmaXhDbHMpIHJldHVybiBjdXN0b21pemVQcmVmaXhDbHM7XG4gICAgcmV0dXJuIHN1ZmZpeENscyA/IFwiYW50LVwiLmNvbmNhdChzdWZmaXhDbHMpIDogJ2FudCc7XG4gIH0sXG4gIHJlbmRlckVtcHR5OiBfcmVuZGVyRW1wdHlbXCJkZWZhdWx0XCJdXG59KTtcbmV4cG9ydHMuQ29uZmlnQ29udGV4dCA9IENvbmZpZ0NvbnRleHQ7XG52YXIgQ29uZmlnQ29uc3VtZXIgPSBDb25maWdDb250ZXh0LkNvbnN1bWVyO1xuZXhwb3J0cy5Db25maWdDb25zdW1lciA9IENvbmZpZ0NvbnN1bWVyO1xuXG5mdW5jdGlvbiB3aXRoQ29uZmlnQ29uc3VtZXIoY29uZmlnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3aXRoQ29uZmlnQ29uc3VtZXJGdW5jKENvbXBvbmVudCkge1xuICAgIC8vIFdyYXAgd2l0aCBDb25maWdDb25zdW1lci4gU2luY2Ugd2UgbmVlZCBjb21wYXRpYmxlIHdpdGggcmVhY3QgMTUsIGJlIGNhcmUgd2hlbiB1c2luZyByZWYgbWV0aG9kc1xuICAgIHZhciBTRkMgPSBmdW5jdGlvbiBTRkMocHJvcHMpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25maWdDb25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGNvbmZpZ1Byb3BzKSB7XG4gICAgICAgIHZhciBiYXNpY1ByZWZpeENscyA9IGNvbmZpZy5wcmVmaXhDbHM7XG4gICAgICAgIHZhciBnZXRQcmVmaXhDbHMgPSBjb25maWdQcm9wcy5nZXRQcmVmaXhDbHM7XG4gICAgICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHM7XG4gICAgICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoYmFzaWNQcmVmaXhDbHMsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgY29uZmlnUHJvcHMsIHByb3BzLCB7XG4gICAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciBjb25zID0gQ29tcG9uZW50LmNvbnN0cnVjdG9yO1xuICAgIHZhciBuYW1lID0gY29ucyAmJiBjb25zLmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICAgIFNGQy5kaXNwbGF5TmFtZSA9IFwid2l0aENvbmZpZ0NvbnN1bWVyKFwiLmNvbmNhdChuYW1lLCBcIilcIik7XG4gICAgcmV0dXJuIFNGQztcbiAgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25maWdDb25zdW1lclwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29udGV4dC5Db25maWdDb25zdW1lcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25maWdDb250ZXh0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb250ZXh0LkNvbmZpZ0NvbnRleHQ7XG4gIH1cbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHBvcnRzLmNvbmZpZ0NvbnN1bWVyUHJvcHMgPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjRmllbGRGb3JtID0gcmVxdWlyZShcInJjLWZpZWxkLWZvcm1cIik7XG5cbnZhciBfbG9jYWxlUHJvdmlkZXIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi4vbG9jYWxlLXByb3ZpZGVyXCIpKTtcblxudmFyIF9Mb2NhbGVSZWNlaXZlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS1wcm92aWRlci9Mb2NhbGVSZWNlaXZlclwiKSk7XG5cbnZhciBfY29udGV4dCA9IHJlcXVpcmUoXCIuL2NvbnRleHRcIik7XG5cbnZhciBfU2l6ZUNvbnRleHQgPSByZXF1aXJlKFwiLi9TaXplQ29udGV4dFwiKTtcblxudmFyIF9tZXNzYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbWVzc2FnZVwiKSk7XG5cbnZhciBfbm90aWZpY2F0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbm90aWZpY2F0aW9uXCIpKTtcblxuLy8gVE9ETzogcmVtb3ZlIHRoaXMgbGludFxuLy8gU0ZDIGhhcyBzcGVjaWZpZWQgYSBkaXNwbGF5TmFtZSwgYnV0IG5vdCB3b3JrZWQuXG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Rpc3BsYXktbmFtZSAqL1xudmFyIGNvbmZpZ0NvbnN1bWVyUHJvcHMgPSBbJ2dldFRhcmdldENvbnRhaW5lcicsICdnZXRQb3B1cENvbnRhaW5lcicsICdyb290UHJlZml4Q2xzJywgJ2dldFByZWZpeENscycsICdyZW5kZXJFbXB0eScsICdjc3AnLCAnYXV0b0luc2VydFNwYWNlSW5CdXR0b24nLCAnbG9jYWxlJywgJ3BhZ2VIZWFkZXInXTtcbmV4cG9ydHMuY29uZmlnQ29uc3VtZXJQcm9wcyA9IGNvbmZpZ0NvbnN1bWVyUHJvcHM7XG5cbnZhciBDb25maWdQcm92aWRlciA9IGZ1bmN0aW9uIENvbmZpZ1Byb3ZpZGVyKHByb3BzKSB7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHByb3BzLmRpcmVjdGlvbikge1xuICAgICAgX21lc3NhZ2VbXCJkZWZhdWx0XCJdLmNvbmZpZyh7XG4gICAgICAgIHJ0bDogcHJvcHMuZGlyZWN0aW9uID09PSAncnRsJ1xuICAgICAgfSk7XG5cbiAgICAgIF9ub3RpZmljYXRpb25bXCJkZWZhdWx0XCJdLmNvbmZpZyh7XG4gICAgICAgIHJ0bDogcHJvcHMuZGlyZWN0aW9uID09PSAncnRsJ1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbcHJvcHMuZGlyZWN0aW9uXSk7XG5cbiAgdmFyIGdldFByZWZpeENsc1dyYXBwZXIgPSBmdW5jdGlvbiBnZXRQcmVmaXhDbHNXcmFwcGVyKGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN1ZmZpeENscywgY3VzdG9taXplUHJlZml4Q2xzKSB7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzO1xuICAgICAgaWYgKGN1c3RvbWl6ZVByZWZpeENscykgcmV0dXJuIGN1c3RvbWl6ZVByZWZpeENscztcbiAgICAgIHZhciBtZXJnZWRQcmVmaXhDbHMgPSBwcmVmaXhDbHMgfHwgY29udGV4dC5nZXRQcmVmaXhDbHMoJycpO1xuICAgICAgcmV0dXJuIHN1ZmZpeENscyA/IFwiXCIuY29uY2F0KG1lcmdlZFByZWZpeENscywgXCItXCIpLmNvbmNhdChzdWZmaXhDbHMpIDogbWVyZ2VkUHJlZml4Q2xzO1xuICAgIH07XG4gIH07XG5cbiAgdmFyIHJlbmRlclByb3ZpZGVyID0gZnVuY3Rpb24gcmVuZGVyUHJvdmlkZXIoY29udGV4dCwgbGVnYWN5TG9jYWxlKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGdldFRhcmdldENvbnRhaW5lciA9IHByb3BzLmdldFRhcmdldENvbnRhaW5lcixcbiAgICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgcmVuZGVyRW1wdHkgPSBwcm9wcy5yZW5kZXJFbXB0eSxcbiAgICAgICAgY3NwID0gcHJvcHMuY3NwLFxuICAgICAgICBhdXRvSW5zZXJ0U3BhY2VJbkJ1dHRvbiA9IHByb3BzLmF1dG9JbnNlcnRTcGFjZUluQnV0dG9uLFxuICAgICAgICBmb3JtID0gcHJvcHMuZm9ybSxcbiAgICAgICAgaW5wdXQgPSBwcm9wcy5pbnB1dCxcbiAgICAgICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgICAgICBwYWdlSGVhZGVyID0gcHJvcHMucGFnZUhlYWRlcixcbiAgICAgICAgY29tcG9uZW50U2l6ZSA9IHByb3BzLmNvbXBvbmVudFNpemUsXG4gICAgICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICAgICAgc3BhY2UgPSBwcm9wcy5zcGFjZSxcbiAgICAgICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9IHByb3BzLmRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDtcbiAgICB2YXIgY29uZmlnID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgY29udGV4dCksIHtcbiAgICAgIGdldFByZWZpeENsczogZ2V0UHJlZml4Q2xzV3JhcHBlcihjb250ZXh0KSxcbiAgICAgIGNzcDogY3NwLFxuICAgICAgYXV0b0luc2VydFNwYWNlSW5CdXR0b246IGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uLFxuICAgICAgbG9jYWxlOiBsb2NhbGUgfHwgbGVnYWN5TG9jYWxlLFxuICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICBzcGFjZTogc3BhY2UsXG4gICAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcbiAgICB9KTtcblxuICAgIGlmIChnZXRUYXJnZXRDb250YWluZXIpIHtcbiAgICAgIGNvbmZpZy5nZXRUYXJnZXRDb250YWluZXIgPSBnZXRUYXJnZXRDb250YWluZXI7XG4gICAgfVxuXG4gICAgaWYgKGdldFBvcHVwQ29udGFpbmVyKSB7XG4gICAgICBjb25maWcuZ2V0UG9wdXBDb250YWluZXIgPSBnZXRQb3B1cENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBpZiAocmVuZGVyRW1wdHkpIHtcbiAgICAgIGNvbmZpZy5yZW5kZXJFbXB0eSA9IHJlbmRlckVtcHR5O1xuICAgIH1cblxuICAgIGlmIChwYWdlSGVhZGVyKSB7XG4gICAgICBjb25maWcucGFnZUhlYWRlciA9IHBhZ2VIZWFkZXI7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25maWcuaW5wdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGROb2RlID0gY2hpbGRyZW47IC8vIEFkZGl0aW9uYWwgRm9ybSBwcm92aWRlclxuXG4gICAgdmFyIHZhbGlkYXRlTWVzc2FnZXMgPSB7fTtcblxuICAgIGlmIChsb2NhbGUgJiYgbG9jYWxlLkZvcm0gJiYgbG9jYWxlLkZvcm0uZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMpIHtcbiAgICAgIHZhbGlkYXRlTWVzc2FnZXMgPSBsb2NhbGUuRm9ybS5kZWZhdWx0VmFsaWRhdGVNZXNzYWdlcztcbiAgICB9XG5cbiAgICBpZiAoZm9ybSAmJiBmb3JtLnZhbGlkYXRlTWVzc2FnZXMpIHtcbiAgICAgIHZhbGlkYXRlTWVzc2FnZXMgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCB2YWxpZGF0ZU1lc3NhZ2VzKSwgZm9ybS52YWxpZGF0ZU1lc3NhZ2VzKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModmFsaWRhdGVNZXNzYWdlcykubGVuZ3RoID4gMCkge1xuICAgICAgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjRmllbGRGb3JtLkZvcm1Qcm92aWRlciwge1xuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2VzOiB2YWxpZGF0ZU1lc3NhZ2VzXG4gICAgICB9LCBjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TaXplQ29udGV4dC5TaXplQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgICBzaXplOiBjb21wb25lbnRTaXplXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbnRleHQuQ29uZmlnQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IGNvbmZpZ1xuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9sb2NhbGVQcm92aWRlcltcImRlZmF1bHRcIl0sIHtcbiAgICAgIGxvY2FsZTogbG9jYWxlIHx8IGxlZ2FjeUxvY2FsZSxcbiAgICAgIF9BTlRfTUFSS19fOiBfbG9jYWxlUHJvdmlkZXIuQU5UX01BUktcbiAgICB9LCBjaGlsZE5vZGUpKSk7XG4gIH07XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Mb2NhbGVSZWNlaXZlcltcImRlZmF1bHRcIl0sIG51bGwsIGZ1bmN0aW9uIChfLCBfXywgbGVnYWN5TG9jYWxlKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb250ZXh0LkNvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlbmRlclByb3ZpZGVyKGNvbnRleHQsIGxlZ2FjeUxvY2FsZSk7XG4gICAgfSk7XG4gIH0pO1xufTtcbi8qKiBAcHJpdmF0ZSBpbnRlcm5hbCB1c2FnZS4gZG8gbm90IHVzZSBpbiB5b3VyIHByb2R1Y3Rpb24gKi9cblxuXG5Db25maWdQcm92aWRlci5Db25maWdDb250ZXh0ID0gX2NvbnRleHQuQ29uZmlnQ29udGV4dDtcbnZhciBfZGVmYXVsdCA9IENvbmZpZ1Byb3ZpZGVyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9lbXB0eSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2VtcHR5XCIpKTtcblxudmFyIF8gPSByZXF1aXJlKFwiLlwiKTtcblxudmFyIHJlbmRlckVtcHR5ID0gZnVuY3Rpb24gcmVuZGVyRW1wdHkoY29tcG9uZW50TmFtZSkge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXy5Db25maWdDb25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHM7XG4gICAgdmFyIHByZWZpeCA9IGdldFByZWZpeENscygnZW1wdHknKTtcblxuICAgIHN3aXRjaCAoY29tcG9uZW50TmFtZSkge1xuICAgICAgY2FzZSAnVGFibGUnOlxuICAgICAgY2FzZSAnTGlzdCc6XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfZW1wdHlbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgICAgaW1hZ2U6IF9lbXB0eVtcImRlZmF1bHRcIl0uUFJFU0VOVEVEX0lNQUdFX1NJTVBMRVxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnU2VsZWN0JzpcbiAgICAgIGNhc2UgJ1RyZWVTZWxlY3QnOlxuICAgICAgY2FzZSAnQ2FzY2FkZXInOlxuICAgICAgY2FzZSAnVHJhbnNmZXInOlxuICAgICAgY2FzZSAnTWVudGlvbnMnOlxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2VtcHR5W1wiZGVmYXVsdFwiXSwge1xuICAgICAgICAgIGltYWdlOiBfZW1wdHlbXCJkZWZhdWx0XCJdLlBSRVNFTlRFRF9JTUFHRV9TSU1QTEUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXgsIFwiLXNtYWxsXCIpXG4gICAgICAgIH0pO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2VtcHR5W1wiZGVmYXVsdFwiXSwgbnVsbCk7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IHJlbmRlckVtcHR5O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFBpY2tlckJ1dHRvbjtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfYnV0dG9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vYnV0dG9uXCIpKTtcblxuZnVuY3Rpb24gUGlja2VyQnV0dG9uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgdHlwZTogXCJwcmltYXJ5XCJcbiAgfSwgcHJvcHMpKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFBpY2tlclRhZztcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdGFnID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vdGFnXCIpKTtcblxuZnVuY3Rpb24gUGlja2VyVGFnKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdGFnW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICBjb2xvcjogXCJibHVlXCJcbiAgfSwgcHJvcHMpKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGdlbmVyYXRlUmFuZ2VQaWNrZXI7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9DYWxlbmRhck91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2FsZW5kYXJPdXRsaW5lZFwiKSk7XG5cbnZhciBfQ2xvY2tDaXJjbGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb2NrQ2lyY2xlT3V0bGluZWRcIikpO1xuXG52YXIgX0Nsb3NlQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIikpO1xuXG52YXIgX1N3YXBSaWdodE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvU3dhcFJpZ2h0T3V0bGluZWRcIikpO1xuXG52YXIgX3JjUGlja2VyID0gcmVxdWlyZShcInJjLXBpY2tlclwiKTtcblxudmFyIF9lbl9VUyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS9lbl9VU1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX1NpemVDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0XCIpKTtcblxudmFyIF9Mb2NhbGVSZWNlaXZlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2xvY2FsZS1wcm92aWRlci9Mb2NhbGVSZWNlaXZlclwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gZ2VuZXJhdGVSYW5nZVBpY2tlcihnZW5lcmF0ZUNvbmZpZykge1xuICB2YXIgUmFuZ2VQaWNrZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKFJhbmdlUGlja2VyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKFJhbmdlUGlja2VyKTtcblxuICAgIGZ1bmN0aW9uIFJhbmdlUGlja2VyKCkge1xuICAgICAgdmFyIF90aGlzO1xuXG4gICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIFJhbmdlUGlja2VyKTtcbiAgICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBfdGhpcy5waWNrZXJSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG5cbiAgICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMucGlja2VyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBfdGhpcy5waWNrZXJSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMucGlja2VyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBfdGhpcy5waWNrZXJSZWYuY3VycmVudC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmdldERlZmF1bHRMb2NhbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBfdGhpcy5wcm9wcy5sb2NhbGU7XG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBfZW5fVVNbXCJkZWZhdWx0XCJdKSwgbG9jYWxlKTtcbiAgICAgICAgcmVzdWx0LmxhbmcgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByZXN1bHQubGFuZyksIChsb2NhbGUgfHwge30pLmxhbmcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgX3RoaXMucmVuZGVyUGlja2VyID0gZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgICB2YXIgX3RoaXMkY29udGV4dCA9IF90aGlzLmNvbnRleHQsXG4gICAgICAgICAgICBnZXRQcmVmaXhDbHMgPSBfdGhpcyRjb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJGNvbnRleHQuZGlyZWN0aW9uLFxuICAgICAgICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBfdGhpcyRjb250ZXh0LmdldFBvcHVwQ29udGFpbmVyO1xuXG4gICAgICAgIHZhciBfYSA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgICAgICAgY3VzdG9tR2V0UG9wdXBDb250YWluZXIgPSBfYS5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIGN1c3RvbWl6ZVNpemUgPSBfYS5zaXplLFxuICAgICAgICAgICAgX2EkYm9yZGVyZWQgPSBfYS5ib3JkZXJlZCxcbiAgICAgICAgICAgIGJvcmRlcmVkID0gX2EkYm9yZGVyZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfYSRib3JkZXJlZCxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gX2EucGxhY2Vob2xkZXIsXG4gICAgICAgICAgICByZXN0UHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcImJvcmRlcmVkXCIsIFwicGxhY2Vob2xkZXJcIl0pO1xuXG4gICAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgZm9ybWF0ID0gX3RoaXMkcHJvcHMuZm9ybWF0LFxuICAgICAgICAgICAgc2hvd1RpbWUgPSBfdGhpcyRwcm9wcy5zaG93VGltZSxcbiAgICAgICAgICAgIHBpY2tlciA9IF90aGlzJHByb3BzLnBpY2tlcjtcbiAgICAgICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygncGlja2VyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICAgICAgdmFyIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzID0ge307XG4gICAgICAgIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzKSwgc2hvd1RpbWUgPyAoMCwgXy5nZXRUaW1lUHJvcHMpKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgICAgICAgcGlja2VyOiBwaWNrZXJcbiAgICAgICAgfSwgc2hvd1RpbWUpKSA6IHt9KSwgcGlja2VyID09PSAndGltZScgPyAoMCwgXy5nZXRUaW1lUHJvcHMpKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgIGZvcm1hdDogZm9ybWF0XG4gICAgICAgIH0sIF90aGlzLnByb3BzKSwge1xuICAgICAgICAgIHBpY2tlcjogcGlja2VyXG4gICAgICAgIH0pKSA6IHt9KTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TaXplQ29udGV4dFtcImRlZmF1bHRcIl0uQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICAgICAgdmFyIG1lcmdlZFNpemUgPSBjdXN0b21pemVTaXplIHx8IHNpemU7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1BpY2tlci5SYW5nZVBpY2tlciwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgICAgIHNlcGFyYXRvcjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwidG9cIixcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlcGFyYXRvclwiKVxuICAgICAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1N3YXBSaWdodE91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCkpLFxuICAgICAgICAgICAgcmVmOiBfdGhpcy5waWNrZXJSZWYsXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogKDAsIF91dGlsLmdldFJhbmdlUGxhY2Vob2xkZXIpKHBpY2tlciwgbG9jYWxlLCBwbGFjZWhvbGRlciksXG4gICAgICAgICAgICBzdWZmaXhJY29uOiBwaWNrZXIgPT09ICd0aW1lJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbG9ja0NpcmNsZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2FsZW5kYXJPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpLFxuICAgICAgICAgICAgY2xlYXJJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2xvc2VDaXJjbGVGaWxsZWRbXCJkZWZhdWx0XCJdLCBudWxsKSxcbiAgICAgICAgICAgIGFsbG93Q2xlYXI6IHRydWUsXG4gICAgICAgICAgICB0cmFuc2l0aW9uTmFtZTogXCJzbGlkZS11cFwiXG4gICAgICAgICAgfSwgcmVzdFByb3BzLCBhZGRpdGlvbmFsT3ZlcnJpZGVQcm9wcywge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KG1lcmdlZFNpemUpLCBtZXJnZWRTaXplKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJsZXNzXCIpLCAhYm9yZGVyZWQpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSksXG4gICAgICAgICAgICBsb2NhbGU6IGxvY2FsZS5sYW5nLFxuICAgICAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogY3VzdG9tR2V0UG9wdXBDb250YWluZXIgfHwgZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICAgICAgICBwcmV2SWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXByZXYtaWNvblwiKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXh0SWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5leHQtaWNvblwiKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdXBlclByZXZJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VwZXItcHJldi1pY29uXCIpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN1cGVyTmV4dEljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdXBlci1uZXh0LWljb25cIilcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcG9uZW50czogXy5Db21wb25lbnRzLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoUmFuZ2VQaWNrZXIsIFt7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICAgIGNvbXBvbmVudE5hbWU6IFwiRGF0ZVBpY2tlclwiLFxuICAgICAgICAgIGRlZmF1bHRMb2NhbGU6IHRoaXMuZ2V0RGVmYXVsdExvY2FsZVxuICAgICAgICB9LCB0aGlzLnJlbmRlclBpY2tlcik7XG4gICAgICB9XG4gICAgfV0pO1xuICAgIHJldHVybiBSYW5nZVBpY2tlcjtcbiAgfShSZWFjdC5Db21wb25lbnQpO1xuXG4gIFJhbmdlUGlja2VyLmNvbnRleHRUeXBlID0gX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQ7XG4gIHJldHVybiBSYW5nZVBpY2tlcjtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGdlbmVyYXRlUGlja2VyO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfQ2FsZW5kYXJPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0NhbGVuZGFyT3V0bGluZWRcIikpO1xuXG52YXIgX0Nsb2NrQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DbG9ja0NpcmNsZU91dGxpbmVkXCIpKTtcblxudmFyIF9DbG9zZUNpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCIpKTtcblxudmFyIF9yY1BpY2tlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXBpY2tlclwiKSk7XG5cbnZhciBfZW5fVVMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9sb2NhbGUvZW5fVVNcIikpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX0xvY2FsZVJlY2VpdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyXCIpKTtcblxudmFyIF9TaXplQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dFwiKSk7XG5cbnZhciBfID0gcmVxdWlyZShcIi5cIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVBpY2tlcihnZW5lcmF0ZUNvbmZpZykge1xuICBmdW5jdGlvbiBnZXRQaWNrZXIocGlja2VyLCBkaXNwbGF5TmFtZSkge1xuICAgIHZhciBQaWNrZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgICAgICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoUGlja2VyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgICAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoUGlja2VyKTtcblxuICAgICAgZnVuY3Rpb24gUGlja2VyKHByb3BzKSB7XG4gICAgICAgIHZhciBfdGhpcztcblxuICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIFBpY2tlcik7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgICAgICBfdGhpcy5waWNrZXJSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG5cbiAgICAgICAgX3RoaXMuZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBfdGhpcy5waWNrZXJSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChfdGhpcy5waWNrZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgX3RoaXMucGlja2VyUmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5nZXREZWZhdWx0TG9jYWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBsb2NhbGUgPSBfdGhpcy5wcm9wcy5sb2NhbGU7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIF9lbl9VU1tcImRlZmF1bHRcIl0pLCBsb2NhbGUpO1xuICAgICAgICAgIHJlc3VsdC5sYW5nID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcmVzdWx0LmxhbmcpLCAobG9jYWxlIHx8IHt9KS5sYW5nKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuXG4gICAgICAgIF90aGlzLnJlbmRlclBpY2tlciA9IGZ1bmN0aW9uIChsb2NhbGUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkY29udGV4dCA9IF90aGlzLmNvbnRleHQsXG4gICAgICAgICAgICAgIGdldFByZWZpeENscyA9IF90aGlzJGNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRjb250ZXh0LmRpcmVjdGlvbixcbiAgICAgICAgICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBfdGhpcyRjb250ZXh0LmdldFBvcHVwQ29udGFpbmVyO1xuXG4gICAgICAgICAgdmFyIF9hID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICAgICAgICAgICAgY3VzdG9taXplR2V0UG9wdXBDb250YWluZXIgPSBfYS5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICAgICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgICAgICAgICAgICBjdXN0b21pemVTaXplID0gX2Euc2l6ZSxcbiAgICAgICAgICAgICAgX2EkYm9yZGVyZWQgPSBfYS5ib3JkZXJlZCxcbiAgICAgICAgICAgICAgYm9yZGVyZWQgPSBfYSRib3JkZXJlZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hJGJvcmRlcmVkLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlciA9IF9hLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICByZXN0UHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcImJvcmRlcmVkXCIsIFwicGxhY2Vob2xkZXJcIl0pO1xuXG4gICAgICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICAgIGZvcm1hdCA9IF90aGlzJHByb3BzLmZvcm1hdCxcbiAgICAgICAgICAgICAgc2hvd1RpbWUgPSBfdGhpcyRwcm9wcy5zaG93VGltZTtcbiAgICAgICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdwaWNrZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgICAgIHZhciBhZGRpdGlvbmFsUHJvcHMgPSB7XG4gICAgICAgICAgICBzaG93VG9kYXk6IHRydWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciBhZGRpdGlvbmFsT3ZlcnJpZGVQcm9wcyA9IHt9O1xuXG4gICAgICAgICAgaWYgKHBpY2tlcikge1xuICAgICAgICAgICAgYWRkaXRpb25hbE92ZXJyaWRlUHJvcHMucGlja2VyID0gcGlja2VyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBtZXJnZWRQaWNrZXIgPSBwaWNrZXIgfHwgX3RoaXMucHJvcHMucGlja2VyO1xuICAgICAgICAgIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzKSwgc2hvd1RpbWUgPyAoMCwgXy5nZXRUaW1lUHJvcHMpKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgICAgIHBpY2tlcjogbWVyZ2VkUGlja2VyXG4gICAgICAgICAgfSwgc2hvd1RpbWUpKSA6IHt9KSwgbWVyZ2VkUGlja2VyID09PSAndGltZScgPyAoMCwgXy5nZXRUaW1lUHJvcHMpKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXRcbiAgICAgICAgICB9LCBfdGhpcy5wcm9wcyksIHtcbiAgICAgICAgICAgIHBpY2tlcjogbWVyZ2VkUGlja2VyXG4gICAgICAgICAgfSkpIDoge30pO1xuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU2l6ZUNvbnRleHRbXCJkZWZhdWx0XCJdLkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICAgICAgICB2YXIgbWVyZ2VkU2l6ZSA9IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZTtcbiAgICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNQaWNrZXJbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgICAgICByZWY6IF90aGlzLnBpY2tlclJlZixcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICgwLCBfdXRpbC5nZXRQbGFjZWhvbGRlcikobWVyZ2VkUGlja2VyLCBsb2NhbGUsIHBsYWNlaG9sZGVyKSxcbiAgICAgICAgICAgICAgc3VmZml4SWNvbjogbWVyZ2VkUGlja2VyID09PSAndGltZScgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2xvY2tDaXJjbGVPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NhbGVuZGFyT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSxcbiAgICAgICAgICAgICAgY2xlYXJJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2xvc2VDaXJjbGVGaWxsZWRbXCJkZWZhdWx0XCJdLCBudWxsKSxcbiAgICAgICAgICAgICAgYWxsb3dDbGVhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbk5hbWU6IFwic2xpZGUtdXBcIlxuICAgICAgICAgICAgfSwgYWRkaXRpb25hbFByb3BzLCByZXN0UHJvcHMsIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzLCB7XG4gICAgICAgICAgICAgIGxvY2FsZTogbG9jYWxlLmxhbmcsXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChtZXJnZWRTaXplKSwgbWVyZ2VkU2l6ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpLFxuICAgICAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGN1c3RvbWl6ZUdldFBvcHVwQ29udGFpbmVyIHx8IGdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgICAgICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICAgICAgICAgIHByZXZJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wcmV2LWljb25cIilcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG5leHRJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uZXh0LWljb25cIilcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHN1cGVyUHJldkljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1cGVyLXByZXYtaWNvblwiKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgc3VwZXJOZXh0SWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VwZXItbmV4dC1pY29uXCIpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBjb21wb25lbnRzOiBfLkNvbXBvbmVudHMsXG4gICAgICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkocGlja2VyICE9PSAncXVhcnRlcicsIGRpc3BsYXlOYW1lLCBcIkRhdGVQaWNrZXIuXCIuY29uY2F0KGRpc3BsYXlOYW1lLCBcIiBpcyBsZWdhY3kgdXNhZ2UuIFBsZWFzZSB1c2UgRGF0ZVBpY2tlcltwaWNrZXI9J1wiKS5jb25jYXQocGlja2VyLCBcIiddIGRpcmVjdGx5LlwiKSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgIH1cblxuICAgICAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShQaWNrZXIsIFt7XG4gICAgICAgIGtleTogXCJyZW5kZXJcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICAgICAgY29tcG9uZW50TmFtZTogXCJEYXRlUGlja2VyXCIsXG4gICAgICAgICAgICBkZWZhdWx0TG9jYWxlOiB0aGlzLmdldERlZmF1bHRMb2NhbGVcbiAgICAgICAgICB9LCB0aGlzLnJlbmRlclBpY2tlcik7XG4gICAgICAgIH1cbiAgICAgIH1dKTtcbiAgICAgIHJldHVybiBQaWNrZXI7XG4gICAgfShSZWFjdC5Db21wb25lbnQpO1xuXG4gICAgUGlja2VyLmNvbnRleHRUeXBlID0gX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQ7XG5cbiAgICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICAgIFBpY2tlci5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBQaWNrZXI7XG4gIH1cblxuICB2YXIgRGF0ZVBpY2tlciA9IGdldFBpY2tlcigpO1xuICB2YXIgV2Vla1BpY2tlciA9IGdldFBpY2tlcignd2VlaycsICdXZWVrUGlja2VyJyk7XG4gIHZhciBNb250aFBpY2tlciA9IGdldFBpY2tlcignbW9udGgnLCAnTW9udGhQaWNrZXInKTtcbiAgdmFyIFllYXJQaWNrZXIgPSBnZXRQaWNrZXIoJ3llYXInLCAnWWVhclBpY2tlcicpO1xuICB2YXIgVGltZVBpY2tlciA9IGdldFBpY2tlcigndGltZScsICdUaW1lUGlja2VyJyk7XG4gIHZhciBRdWFydGVyUGlja2VyID0gZ2V0UGlja2VyKCdxdWFydGVyJywgJ1F1YXJ0ZXJQaWNrZXInKTtcbiAgcmV0dXJuIHtcbiAgICBEYXRlUGlja2VyOiBEYXRlUGlja2VyLFxuICAgIFdlZWtQaWNrZXI6IFdlZWtQaWNrZXIsXG4gICAgTW9udGhQaWNrZXI6IE1vbnRoUGlja2VyLFxuICAgIFllYXJQaWNrZXI6IFllYXJQaWNrZXIsXG4gICAgVGltZVBpY2tlcjogVGltZVBpY2tlcixcbiAgICBRdWFydGVyUGlja2VyOiBRdWFydGVyUGlja2VyXG4gIH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRUaW1lUHJvcHMgPSBnZXRUaW1lUHJvcHM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGV4cG9ydHMuQ29tcG9uZW50cyA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfUGlja2VyQnV0dG9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vUGlja2VyQnV0dG9uXCIpKTtcblxudmFyIF9QaWNrZXJUYWcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9QaWNrZXJUYWdcIikpO1xuXG52YXIgX2dlbmVyYXRlU2luZ2xlUGlja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZ2VuZXJhdGVTaW5nbGVQaWNrZXJcIikpO1xuXG52YXIgX2dlbmVyYXRlUmFuZ2VQaWNrZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2dlbmVyYXRlUmFuZ2VQaWNrZXJcIikpO1xuXG52YXIgQ29tcG9uZW50cyA9IHtcbiAgYnV0dG9uOiBfUGlja2VyQnV0dG9uW1wiZGVmYXVsdFwiXSxcbiAgcmFuZ2VJdGVtOiBfUGlja2VyVGFnW1wiZGVmYXVsdFwiXVxufTtcbmV4cG9ydHMuQ29tcG9uZW50cyA9IENvbXBvbmVudHM7XG5cbmZ1bmN0aW9uIHRvQXJyYXkobGlzdCkge1xuICBpZiAoIWxpc3QpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gQXJyYXkuaXNBcnJheShsaXN0KSA/IGxpc3QgOiBbbGlzdF07XG59XG5cbmZ1bmN0aW9uIGdldFRpbWVQcm9wcyhwcm9wcykge1xuICB2YXIgZm9ybWF0ID0gcHJvcHMuZm9ybWF0LFxuICAgICAgcGlja2VyID0gcHJvcHMucGlja2VyLFxuICAgICAgc2hvd0hvdXIgPSBwcm9wcy5zaG93SG91cixcbiAgICAgIHNob3dNaW51dGUgPSBwcm9wcy5zaG93TWludXRlLFxuICAgICAgc2hvd1NlY29uZCA9IHByb3BzLnNob3dTZWNvbmQsXG4gICAgICB1c2UxMkhvdXJzID0gcHJvcHMudXNlMTJIb3VycztcbiAgdmFyIGZpcnN0Rm9ybWF0ID0gdG9BcnJheShmb3JtYXQpWzBdO1xuICB2YXIgc2hvd1RpbWVPYmogPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHByb3BzKTtcblxuICBpZiAoZmlyc3RGb3JtYXQpIHtcbiAgICBpZiAoIWZpcnN0Rm9ybWF0LmluY2x1ZGVzKCdzJykgJiYgc2hvd1NlY29uZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzaG93VGltZU9iai5zaG93U2Vjb25kID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFmaXJzdEZvcm1hdC5pbmNsdWRlcygnbScpICYmIHNob3dNaW51dGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2hvd1RpbWVPYmouc2hvd01pbnV0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghZmlyc3RGb3JtYXQuaW5jbHVkZXMoJ0gnKSAmJiAhZmlyc3RGb3JtYXQuaW5jbHVkZXMoJ2gnKSAmJiBzaG93SG91ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzaG93VGltZU9iai5zaG93SG91ciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgoZmlyc3RGb3JtYXQuaW5jbHVkZXMoJ2EnKSB8fCBmaXJzdEZvcm1hdC5pbmNsdWRlcygnQScpKSAmJiB1c2UxMkhvdXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNob3dUaW1lT2JqLnVzZTEySG91cnMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwaWNrZXIgPT09ICd0aW1lJykge1xuICAgIHJldHVybiBzaG93VGltZU9iajtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2hvd1RpbWU6IHNob3dUaW1lT2JqXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUGlja2VyKGdlbmVyYXRlQ29uZmlnKSB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBQaWNrZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfZ2VuZXJhdGVTaW5nbGVQaWNrZXIgPSAoMCwgX2dlbmVyYXRlU2luZ2xlUGlja2VyMltcImRlZmF1bHRcIl0pKGdlbmVyYXRlQ29uZmlnKSxcbiAgICAgIERhdGVQaWNrZXIgPSBfZ2VuZXJhdGVTaW5nbGVQaWNrZXIuRGF0ZVBpY2tlcixcbiAgICAgIFdlZWtQaWNrZXIgPSBfZ2VuZXJhdGVTaW5nbGVQaWNrZXIuV2Vla1BpY2tlcixcbiAgICAgIE1vbnRoUGlja2VyID0gX2dlbmVyYXRlU2luZ2xlUGlja2VyLk1vbnRoUGlja2VyLFxuICAgICAgWWVhclBpY2tlciA9IF9nZW5lcmF0ZVNpbmdsZVBpY2tlci5ZZWFyUGlja2VyLFxuICAgICAgVGltZVBpY2tlciA9IF9nZW5lcmF0ZVNpbmdsZVBpY2tlci5UaW1lUGlja2VyLFxuICAgICAgUXVhcnRlclBpY2tlciA9IF9nZW5lcmF0ZVNpbmdsZVBpY2tlci5RdWFydGVyUGlja2VyOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmFuZ2UgUGlja2VyID09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIFJhbmdlUGlja2VyID0gKDAsIF9nZW5lcmF0ZVJhbmdlUGlja2VyW1wiZGVmYXVsdFwiXSkoZ2VuZXJhdGVDb25maWcpO1xuICB2YXIgTWVyZ2VkRGF0ZVBpY2tlciA9IERhdGVQaWNrZXI7XG4gIE1lcmdlZERhdGVQaWNrZXIuV2Vla1BpY2tlciA9IFdlZWtQaWNrZXI7XG4gIE1lcmdlZERhdGVQaWNrZXIuTW9udGhQaWNrZXIgPSBNb250aFBpY2tlcjtcbiAgTWVyZ2VkRGF0ZVBpY2tlci5ZZWFyUGlja2VyID0gWWVhclBpY2tlcjtcbiAgTWVyZ2VkRGF0ZVBpY2tlci5SYW5nZVBpY2tlciA9IFJhbmdlUGlja2VyO1xuICBNZXJnZWREYXRlUGlja2VyLlRpbWVQaWNrZXIgPSBUaW1lUGlja2VyO1xuICBNZXJnZWREYXRlUGlja2VyLlF1YXJ0ZXJQaWNrZXIgPSBRdWFydGVyUGlja2VyO1xuICByZXR1cm4gTWVyZ2VkRGF0ZVBpY2tlcjtcbn1cblxudmFyIF9kZWZhdWx0ID0gZ2VuZXJhdGVQaWNrZXI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX21vbWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXBpY2tlci9saWIvZ2VuZXJhdGUvbW9tZW50XCIpKTtcblxudmFyIF9nZW5lcmF0ZVBpY2tlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZ2VuZXJhdGVQaWNrZXJcIikpO1xuXG52YXIgRGF0ZVBpY2tlciA9ICgwLCBfZ2VuZXJhdGVQaWNrZXJbXCJkZWZhdWx0XCJdKShfbW9tZW50W1wiZGVmYXVsdFwiXSk7XG52YXIgX2RlZmF1bHQgPSBEYXRlUGlja2VyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZW5fVVMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1waWNrZXIvbGliL2xvY2FsZS9lbl9VU1wiKSk7XG5cbnZhciBfZW5fVVMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdGltZS1waWNrZXIvbG9jYWxlL2VuX1VTXCIpKTtcblxuLy8gTWVyZ2UgaW50byBhIGxvY2FsZSBvYmplY3RcbnZhciBsb2NhbGUgPSB7XG4gIGxhbmc6ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgZGF0ZScsXG4gICAgeWVhclBsYWNlaG9sZGVyOiAnU2VsZWN0IHllYXInLFxuICAgIHF1YXJ0ZXJQbGFjZWhvbGRlcjogJ1NlbGVjdCBxdWFydGVyJyxcbiAgICBtb250aFBsYWNlaG9sZGVyOiAnU2VsZWN0IG1vbnRoJyxcbiAgICB3ZWVrUGxhY2Vob2xkZXI6ICdTZWxlY3Qgd2VlaycsXG4gICAgcmFuZ2VQbGFjZWhvbGRlcjogWydTdGFydCBkYXRlJywgJ0VuZCBkYXRlJ10sXG4gICAgcmFuZ2VZZWFyUGxhY2Vob2xkZXI6IFsnU3RhcnQgeWVhcicsICdFbmQgeWVhciddLFxuICAgIHJhbmdlTW9udGhQbGFjZWhvbGRlcjogWydTdGFydCBtb250aCcsICdFbmQgbW9udGgnXSxcbiAgICByYW5nZVdlZWtQbGFjZWhvbGRlcjogWydTdGFydCB3ZWVrJywgJ0VuZCB3ZWVrJ11cbiAgfSwgX2VuX1VTW1wiZGVmYXVsdFwiXSksXG4gIHRpbWVQaWNrZXJMb2NhbGU6ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgX2VuX1VTMltcImRlZmF1bHRcIl0pXG59OyAvLyBBbGwgc2V0dGluZ3MgYXQ6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvbG9jYWxlL2V4YW1wbGUuanNvblxuXG52YXIgX2RlZmF1bHQgPSBsb2NhbGU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRQbGFjZWhvbGRlciA9IGdldFBsYWNlaG9sZGVyO1xuZXhwb3J0cy5nZXRSYW5nZVBsYWNlaG9sZGVyID0gZ2V0UmFuZ2VQbGFjZWhvbGRlcjtcblxuZnVuY3Rpb24gZ2V0UGxhY2Vob2xkZXIocGlja2VyLCBsb2NhbGUsIGN1c3RvbWl6ZVBsYWNlaG9sZGVyKSB7XG4gIGlmIChjdXN0b21pemVQbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbWl6ZVBsYWNlaG9sZGVyO1xuICB9XG5cbiAgaWYgKHBpY2tlciA9PT0gJ3llYXInICYmIGxvY2FsZS5sYW5nLnllYXJQbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBsb2NhbGUubGFuZy55ZWFyUGxhY2Vob2xkZXI7XG4gIH1cblxuICBpZiAocGlja2VyID09PSAncXVhcnRlcicgJiYgbG9jYWxlLmxhbmcucXVhcnRlclBsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5sYW5nLnF1YXJ0ZXJQbGFjZWhvbGRlcjtcbiAgfVxuXG4gIGlmIChwaWNrZXIgPT09ICdtb250aCcgJiYgbG9jYWxlLmxhbmcubW9udGhQbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBsb2NhbGUubGFuZy5tb250aFBsYWNlaG9sZGVyO1xuICB9XG5cbiAgaWYgKHBpY2tlciA9PT0gJ3dlZWsnICYmIGxvY2FsZS5sYW5nLndlZWtQbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBsb2NhbGUubGFuZy53ZWVrUGxhY2Vob2xkZXI7XG4gIH1cblxuICBpZiAocGlja2VyID09PSAndGltZScgJiYgbG9jYWxlLnRpbWVQaWNrZXJMb2NhbGUucGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLnRpbWVQaWNrZXJMb2NhbGUucGxhY2Vob2xkZXI7XG4gIH1cblxuICByZXR1cm4gbG9jYWxlLmxhbmcucGxhY2Vob2xkZXI7XG59XG5cbmZ1bmN0aW9uIGdldFJhbmdlUGxhY2Vob2xkZXIocGlja2VyLCBsb2NhbGUsIGN1c3RvbWl6ZVBsYWNlaG9sZGVyKSB7XG4gIGlmIChjdXN0b21pemVQbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbWl6ZVBsYWNlaG9sZGVyO1xuICB9XG5cbiAgaWYgKHBpY2tlciA9PT0gJ3llYXInICYmIGxvY2FsZS5sYW5nLnllYXJQbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBsb2NhbGUubGFuZy5yYW5nZVllYXJQbGFjZWhvbGRlcjtcbiAgfVxuXG4gIGlmIChwaWNrZXIgPT09ICdtb250aCcgJiYgbG9jYWxlLmxhbmcubW9udGhQbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBsb2NhbGUubGFuZy5yYW5nZU1vbnRoUGxhY2Vob2xkZXI7XG4gIH1cblxuICBpZiAocGlja2VyID09PSAnd2VlaycgJiYgbG9jYWxlLmxhbmcud2Vla1BsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5sYW5nLnJhbmdlV2Vla1BsYWNlaG9sZGVyO1xuICB9XG5cbiAgaWYgKHBpY2tlciA9PT0gJ3RpbWUnICYmIGxvY2FsZS50aW1lUGlja2VyTG9jYWxlLnBsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS50aW1lUGlja2VyTG9jYWxlLnJhbmdlUGxhY2Vob2xkZXI7XG4gIH1cblxuICByZXR1cm4gbG9jYWxlLmxhbmcucmFuZ2VQbGFjZWhvbGRlcjtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbmZ1bmN0aW9uIG5vdEVtcHR5KHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBudWxsO1xufVxuXG52YXIgQ2VsbCA9IGZ1bmN0aW9uIENlbGwoX3JlZikge1xuICB2YXIgaXRlbVByZWZpeENscyA9IF9yZWYuaXRlbVByZWZpeENscyxcbiAgICAgIGNvbXBvbmVudCA9IF9yZWYuY29tcG9uZW50LFxuICAgICAgc3BhbiA9IF9yZWYuc3BhbixcbiAgICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgICAgYm9yZGVyZWQgPSBfcmVmLmJvcmRlcmVkLFxuICAgICAgbGFiZWwgPSBfcmVmLmxhYmVsLFxuICAgICAgY29udGVudCA9IF9yZWYuY29udGVudCxcbiAgICAgIGNvbG9uID0gX3JlZi5jb2xvbjtcbiAgdmFyIENvbXBvbmVudCA9IGNvbXBvbmVudDtcblxuICBpZiAoYm9yZGVyZWQpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1pdGVtLWxhYmVsXCIpLCBub3RFbXB0eShsYWJlbCkpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1pdGVtLWNvbnRlbnRcIiksIG5vdEVtcHR5KGNvbnRlbnQpKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgY29sU3Bhbjogc3BhblxuICAgIH0sIG5vdEVtcHR5KGxhYmVsKSA/IGxhYmVsIDogY29udGVudCk7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1pdGVtXCIpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjb2xTcGFuOiBzcGFuXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLWl0ZW0tY29udGFpbmVyXCIpXG4gIH0sIGxhYmVsICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1pdGVtLWxhYmVsXCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1pdGVtLW5vLWNvbG9uXCIpLCAhY29sb24pKVxuICB9LCBsYWJlbCksIGNvbnRlbnQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLWl0ZW0tY29udGVudFwiKSlcbiAgfSwgY29udGVudCkpKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IENlbGw7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBEZXNjcmlwdGlvbnNJdGVtID0gZnVuY3Rpb24gRGVzY3JpcHRpb25zSXRlbShfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHJldHVybiBjaGlsZHJlbjtcbn07XG5cbnZhciBfZGVmYXVsdCA9IERlc2NyaXB0aW9uc0l0ZW07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0NlbGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NlbGxcIikpO1xuXG5mdW5jdGlvbiByZW5kZXJDZWxscyhpdGVtcywgX3JlZiwgX3JlZjIpIHtcbiAgdmFyIGNvbG9uID0gX3JlZi5jb2xvbixcbiAgICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgYm9yZGVyZWQgPSBfcmVmLmJvcmRlcmVkO1xuICB2YXIgY29tcG9uZW50ID0gX3JlZjIuY29tcG9uZW50LFxuICAgICAgdHlwZSA9IF9yZWYyLnR5cGUsXG4gICAgICBzaG93TGFiZWwgPSBfcmVmMi5zaG93TGFiZWwsXG4gICAgICBzaG93Q29udGVudCA9IF9yZWYyLnNob3dDb250ZW50O1xuICByZXR1cm4gaXRlbXMubWFwKGZ1bmN0aW9uIChfcmVmMywgaW5kZXgpIHtcbiAgICB2YXIgX3JlZjMkcHJvcHMgPSBfcmVmMy5wcm9wcyxcbiAgICAgICAgbGFiZWwgPSBfcmVmMyRwcm9wcy5sYWJlbCxcbiAgICAgICAgY2hpbGRyZW4gPSBfcmVmMyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgX3JlZjMkcHJvcHMkcHJlZml4Q2xzID0gX3JlZjMkcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBpdGVtUHJlZml4Q2xzID0gX3JlZjMkcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyBwcmVmaXhDbHMgOiBfcmVmMyRwcm9wcyRwcmVmaXhDbHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9yZWYzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcmVmMyRwcm9wcy5zdHlsZSxcbiAgICAgICAgX3JlZjMkcHJvcHMkc3BhbiA9IF9yZWYzJHByb3BzLnNwYW4sXG4gICAgICAgIHNwYW4gPSBfcmVmMyRwcm9wcyRzcGFuID09PSB2b2lkIDAgPyAxIDogX3JlZjMkcHJvcHMkc3BhbixcbiAgICAgICAga2V5ID0gX3JlZjMua2V5O1xuXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NlbGxbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgIGtleTogXCJcIi5jb25jYXQodHlwZSwgXCItXCIpLmNvbmNhdChrZXkgfHwgaW5kZXgpLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBzcGFuOiBzcGFuLFxuICAgICAgICBjb2xvbjogY29sb24sXG4gICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LFxuICAgICAgICBpdGVtUHJlZml4Q2xzOiBpdGVtUHJlZml4Q2xzLFxuICAgICAgICBib3JkZXJlZDogYm9yZGVyZWQsXG4gICAgICAgIGxhYmVsOiBzaG93TGFiZWwgPyBsYWJlbCA6IG51bGwsXG4gICAgICAgIGNvbnRlbnQ6IHNob3dDb250ZW50ID8gY2hpbGRyZW4gOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gWy8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DZWxsW1wiZGVmYXVsdFwiXSwge1xuICAgICAga2V5OiBcImxhYmVsLVwiLmNvbmNhdChrZXkgfHwgaW5kZXgpLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBzcGFuOiAxLFxuICAgICAgY29sb246IGNvbG9uLFxuICAgICAgY29tcG9uZW50OiBjb21wb25lbnRbMF0sXG4gICAgICBpdGVtUHJlZml4Q2xzOiBpdGVtUHJlZml4Q2xzLFxuICAgICAgYm9yZGVyZWQ6IGJvcmRlcmVkLFxuICAgICAgbGFiZWw6IGxhYmVsXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DZWxsW1wiZGVmYXVsdFwiXSwge1xuICAgICAga2V5OiBcImNvbnRlbnQtXCIuY29uY2F0KGtleSB8fCBpbmRleCksXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIHNwYW46IHNwYW4gKiAyIC0gMSxcbiAgICAgIGNvbXBvbmVudDogY29tcG9uZW50WzFdLFxuICAgICAgaXRlbVByZWZpeENsczogaXRlbVByZWZpeENscyxcbiAgICAgIGJvcmRlcmVkOiBib3JkZXJlZCxcbiAgICAgIGNvbnRlbnQ6IGNoaWxkcmVuXG4gICAgfSldO1xuICB9KTtcbn1cblxudmFyIFJvdyA9IGZ1bmN0aW9uIFJvdyhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgdmVydGljYWwgPSBwcm9wcy52ZXJ0aWNhbCxcbiAgICAgIHJvdyA9IHByb3BzLnJvdyxcbiAgICAgIGluZGV4ID0gcHJvcHMuaW5kZXgsXG4gICAgICBib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkO1xuXG4gIGlmICh2ZXJ0aWNhbCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7XG4gICAgICBrZXk6IFwibGFiZWwtXCIuY29uY2F0KGluZGV4KSxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3dcIilcbiAgICB9LCByZW5kZXJDZWxscyhyb3csIHByb3BzLCB7XG4gICAgICBjb21wb25lbnQ6ICd0aCcsXG4gICAgICB0eXBlOiAnbGFiZWwnLFxuICAgICAgc2hvd0xhYmVsOiB0cnVlXG4gICAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIHtcbiAgICAgIGtleTogXCJjb250ZW50LVwiLmNvbmNhdChpbmRleCksXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcm93XCIpXG4gICAgfSwgcmVuZGVyQ2VsbHMocm93LCBwcm9wcywge1xuICAgICAgY29tcG9uZW50OiAndGQnLFxuICAgICAgdHlwZTogJ2NvbnRlbnQnLFxuICAgICAgc2hvd0NvbnRlbnQ6IHRydWVcbiAgICB9KSkpO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidHJcIiwge1xuICAgIGtleTogaW5kZXgsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJvd1wiKVxuICB9LCByZW5kZXJDZWxscyhyb3csIHByb3BzLCB7XG4gICAgY29tcG9uZW50OiBib3JkZXJlZCA/IFsndGgnLCAndGQnXSA6ICd0ZCcsXG4gICAgdHlwZTogJ2l0ZW0nLFxuICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICBzaG93Q29udGVudDogdHJ1ZVxuICB9KSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBSb3c7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF90b0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvQ2hpbGRyZW4vdG9BcnJheVwiKSk7XG5cbnZhciBfcmVzcG9uc2l2ZU9ic2VydmUgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi4vX3V0aWwvcmVzcG9uc2l2ZU9ic2VydmVcIikpO1xuXG52YXIgX2Rldldhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC9kZXZXYXJuaW5nXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfUm93ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Sb3dcIikpO1xuXG52YXIgX0l0ZW0gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0l0ZW1cIikpO1xuXG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWFjdE5vZGVcIik7XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWFycmF5LWluZGV4LWtleSAqL1xudmFyIERFRkFVTFRfQ09MVU1OX01BUCA9IHtcbiAgeHhsOiAzLFxuICB4bDogMyxcbiAgbGc6IDMsXG4gIG1kOiAzLFxuICBzbTogMixcbiAgeHM6IDFcbn07XG5cbmZ1bmN0aW9uIGdldENvbHVtbihjb2x1bW4sIHNjcmVlbnMpIHtcbiAgaWYgKHR5cGVvZiBjb2x1bW4gPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGNvbHVtbjtcbiAgfVxuXG4gIGlmICgoMCwgX3R5cGVvZjJbXCJkZWZhdWx0XCJdKShjb2x1bW4pID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3Jlc3BvbnNpdmVPYnNlcnZlLnJlc3BvbnNpdmVBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGJyZWFrcG9pbnQgPSBfcmVzcG9uc2l2ZU9ic2VydmUucmVzcG9uc2l2ZUFycmF5W2ldO1xuXG4gICAgICBpZiAoc2NyZWVuc1ticmVha3BvaW50XSAmJiBjb2x1bW5bYnJlYWtwb2ludF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY29sdW1uW2JyZWFrcG9pbnRdIHx8IERFRkFVTFRfQ09MVU1OX01BUFticmVha3BvaW50XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gMztcbn1cblxuZnVuY3Rpb24gZ2V0RmlsbGVkSXRlbShub2RlLCBzcGFuLCByb3dSZXN0Q29sKSB7XG4gIHZhciBjbG9uZSA9IG5vZGU7XG5cbiAgaWYgKHNwYW4gPT09IHVuZGVmaW5lZCB8fCBzcGFuID4gcm93UmVzdENvbCkge1xuICAgIGNsb25lID0gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShub2RlLCB7XG4gICAgICBzcGFuOiByb3dSZXN0Q29sXG4gICAgfSk7XG4gICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoc3BhbiA9PT0gdW5kZWZpbmVkLCAnRGVzY3JpcHRpb25zJywgJ1N1bSBvZiBjb2x1bW4gYHNwYW5gIGluIGEgbGluZSBub3QgbWF0Y2ggYGNvbHVtbmAgb2YgRGVzY3JpcHRpb25zLicpO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lO1xufVxuXG5mdW5jdGlvbiBnZXRSb3dzKGNoaWxkcmVuLCBjb2x1bW4pIHtcbiAgdmFyIGNoaWxkTm9kZXMgPSAoMCwgX3RvQXJyYXlbXCJkZWZhdWx0XCJdKShjaGlsZHJlbikuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG47XG4gIH0pO1xuICB2YXIgcm93cyA9IFtdO1xuICB2YXIgdG1wUm93ID0gW107XG4gIHZhciByb3dSZXN0Q29sID0gY29sdW1uO1xuICBjaGlsZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIHNwYW4gPSAoX2EgPSBub2RlLnByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3BhbjtcbiAgICB2YXIgbWVyZ2VkU3BhbiA9IHNwYW4gfHwgMTsgLy8gQWRkaXRpb25hbCBoYW5kbGUgbGFzdCBvbmVcblxuICAgIGlmIChpbmRleCA9PT0gY2hpbGROb2Rlcy5sZW5ndGggLSAxKSB7XG4gICAgICB0bXBSb3cucHVzaChnZXRGaWxsZWRJdGVtKG5vZGUsIHNwYW4sIHJvd1Jlc3RDb2wpKTtcbiAgICAgIHJvd3MucHVzaCh0bXBSb3cpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtZXJnZWRTcGFuIDwgcm93UmVzdENvbCkge1xuICAgICAgcm93UmVzdENvbCAtPSBtZXJnZWRTcGFuO1xuICAgICAgdG1wUm93LnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRtcFJvdy5wdXNoKGdldEZpbGxlZEl0ZW0obm9kZSwgbWVyZ2VkU3Bhbiwgcm93UmVzdENvbCkpO1xuICAgICAgcm93cy5wdXNoKHRtcFJvdyk7XG4gICAgICByb3dSZXN0Q29sID0gY29sdW1uO1xuICAgICAgdG1wUm93ID0gW107XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJvd3M7XG59XG5cbmZ1bmN0aW9uIERlc2NyaXB0aW9ucyhfcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcblxuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICB0aXRsZSA9IF9yZWYudGl0bGUsXG4gICAgICBleHRyYSA9IF9yZWYuZXh0cmEsXG4gICAgICBfcmVmJGNvbHVtbiA9IF9yZWYuY29sdW1uLFxuICAgICAgY29sdW1uID0gX3JlZiRjb2x1bW4gPT09IHZvaWQgMCA/IERFRkFVTFRfQ09MVU1OX01BUCA6IF9yZWYkY29sdW1uLFxuICAgICAgX3JlZiRjb2xvbiA9IF9yZWYuY29sb24sXG4gICAgICBjb2xvbiA9IF9yZWYkY29sb24gPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmJGNvbG9uLFxuICAgICAgYm9yZGVyZWQgPSBfcmVmLmJvcmRlcmVkLFxuICAgICAgbGF5b3V0ID0gX3JlZi5sYXlvdXQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICAgIHNpemUgPSBfcmVmLnNpemU7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZGVzY3JpcHRpb25zJywgY3VzdG9taXplUHJlZml4Q2xzKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgc2NyZWVucyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgbWVyZ2VkQ29sdW1uID0gZ2V0Q29sdW1uKGNvbHVtbiwgc2NyZWVucyk7IC8vIFJlc3BvbnNpdmVcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0b2tlbiA9IF9yZXNwb25zaXZlT2JzZXJ2ZVtcImRlZmF1bHRcIl0uc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdTY3JlZW5zKSB7XG4gICAgICBpZiAoKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoY29sdW1uKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRTY3JlZW5zKG5ld1NjcmVlbnMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIF9yZXNwb25zaXZlT2JzZXJ2ZVtcImRlZmF1bHRcIl0udW5zdWJzY3JpYmUodG9rZW4pO1xuICAgIH07XG4gIH0sIFtdKTsgLy8gQ2hpbGRyZW5cblxuICB2YXIgcm93cyA9IGdldFJvd3MoY2hpbGRyZW4sIG1lcmdlZENvbHVtbik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSksIHNpemUgJiYgc2l6ZSAhPT0gJ2RlZmF1bHQnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJlZFwiKSwgISFib3JkZXJlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCAodGl0bGUgfHwgZXh0cmEpICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyXCIpXG4gIH0sIHRpdGxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGl0bGVcIilcbiAgfSwgdGl0bGUpLCBleHRyYSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4dHJhXCIpXG4gIH0sIGV4dHJhKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdmlld1wiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIiwgbnVsbCwgcm93cy5tYXAoZnVuY3Rpb24gKHJvdywgaW5kZXgpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1Jvd1tcImRlZmF1bHRcIl0sIHtcbiAgICAgIGtleTogaW5kZXgsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBjb2xvbjogY29sb24sXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHZlcnRpY2FsOiBsYXlvdXQgPT09ICd2ZXJ0aWNhbCcsXG4gICAgICBib3JkZXJlZDogYm9yZGVyZWQsXG4gICAgICByb3c6IHJvd1xuICAgIH0pO1xuICB9KSkpKSk7XG59XG5cbkRlc2NyaXB0aW9ucy5JdGVtID0gX0l0ZW1bXCJkZWZhdWx0XCJdO1xudmFyIF9kZWZhdWx0ID0gRGVzY3JpcHRpb25zO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBEaXZpZGVyID0gZnVuY3Rpb24gRGl2aWRlcihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscyxcbiAgICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb247XG5cbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBfcHJvcHMkdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgICAgIHR5cGUgPSBfcHJvcHMkdHlwZSA9PT0gdm9pZCAwID8gJ2hvcml6b250YWwnIDogX3Byb3BzJHR5cGUsXG4gICAgICAgIF9wcm9wcyRvcmllbnRhdGlvbiA9IHByb3BzLm9yaWVudGF0aW9uLFxuICAgICAgICBvcmllbnRhdGlvbiA9IF9wcm9wcyRvcmllbnRhdGlvbiA9PT0gdm9pZCAwID8gJ2NlbnRlcicgOiBfcHJvcHMkb3JpZW50YXRpb24sXG4gICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgZGFzaGVkID0gcHJvcHMuZGFzaGVkLFxuICAgICAgICBwbGFpbiA9IHByb3BzLnBsYWluLFxuICAgICAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInR5cGVcIiwgXCJvcmllbnRhdGlvblwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiZGFzaGVkXCIsIFwicGxhaW5cIl0pO1xuXG4gICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZGl2aWRlcicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgdmFyIG9yaWVudGF0aW9uUHJlZml4ID0gb3JpZW50YXRpb24ubGVuZ3RoID4gMCA/IFwiLVwiLmNvbmNhdChvcmllbnRhdGlvbikgOiBvcmllbnRhdGlvbjtcbiAgICB2YXIgaGFzQ2hpbGRyZW4gPSAhIWNoaWxkcmVuO1xuICAgIHZhciBjbGFzc1N0cmluZyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHR5cGUpLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13aXRoLXRleHRcIiksIGhhc0NoaWxkcmVuKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13aXRoLXRleHRcIikuY29uY2F0KG9yaWVudGF0aW9uUHJlZml4KSwgaGFzQ2hpbGRyZW4pLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRhc2hlZFwiKSwgISFkYXNoZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBsYWluXCIpLCAhIXBsYWluKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nXG4gICAgfSwgcmVzdFByb3BzLCB7XG4gICAgICByb2xlOiBcInNlcGFyYXRvclwiXG4gICAgfSksIGNoaWxkcmVuICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXItdGV4dFwiKVxuICAgIH0sIGNoaWxkcmVuKSk7XG4gIH0pO1xufTtcblxudmFyIF9kZWZhdWx0ID0gRGl2aWRlcjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNEcmF3ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1kcmF3ZXJcIikpO1xuXG52YXIgX2dldFNjcm9sbEJhclNpemUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9nZXRTY3JvbGxCYXJTaXplXCIpKTtcblxudmFyIF9DbG9zZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VPdXRsaW5lZFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0XCIpO1xuXG52YXIgX3R5cGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvdHlwZVwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBEcmF3ZXJDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG52YXIgUGxhY2VtZW50VHlwZXMgPSAoMCwgX3R5cGUudHVwbGUpKCd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnKTtcbnZhciBkZWZhdWx0UHVzaFN0YXRlID0ge1xuICBkaXN0YW5jZTogMTgwXG59O1xuXG52YXIgRHJhd2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoRHJhd2VyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShEcmF3ZXIpO1xuXG4gIGZ1bmN0aW9uIERyYXdlcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIERyYXdlcik7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHB1c2g6IGZhbHNlXG4gICAgfTtcblxuICAgIF90aGlzLnB1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMucHVzaCkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHVzaDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMucHVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5wdXNoKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBwdXNoOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25EZXN0cm95VHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpc0Rlc3Ryb3lPbkNsb3NlID0gX3RoaXMuZ2V0RGVzdHJveU9uQ2xvc2UoKTtcblxuICAgICAgaWYgKCFpc0Rlc3Ryb3lPbkNsb3NlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfdGhpcy5wcm9wcy52aXNpYmxlKSB7XG4gICAgICAgIF90aGlzLmRlc3Ryb3lDbG9zZSA9IHRydWU7XG5cbiAgICAgICAgX3RoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0RGVzdHJveU9uQ2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMuZGVzdHJveU9uQ2xvc2UgJiYgIV90aGlzLnByb3BzLnZpc2libGU7XG4gICAgfTtcblxuICAgIF90aGlzLmdldFB1c2hEaXN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwdXNoID0gX3RoaXMucHJvcHMucHVzaDtcbiAgICAgIHZhciBkaXN0YW5jZTtcblxuICAgICAgaWYgKHR5cGVvZiBwdXNoID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgZGlzdGFuY2UgPSBwdXNoID8gZGVmYXVsdFB1c2hTdGF0ZS5kaXN0YW5jZSA6IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXN0YW5jZSA9IHB1c2guZGlzdGFuY2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KFN0cmluZyhkaXN0YW5jZSB8fCAwKSk7XG4gICAgfTsgLy8gZ2V0IGRyYXdlciBwdXNoIHdpZHRoIG9yIGhlaWdodFxuXG5cbiAgICBfdGhpcy5nZXRQdXNoVHJhbnNmb3JtID0gZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgdmFyIGRpc3RhbmNlID0gX3RoaXMuZ2V0UHVzaERpc3RhbmNlKCk7XG5cbiAgICAgIGlmIChwbGFjZW1lbnQgPT09ICdsZWZ0JyB8fCBwbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcbiAgICAgICAgcmV0dXJuIFwidHJhbnNsYXRlWChcIi5jb25jYXQocGxhY2VtZW50ID09PSAnbGVmdCcgPyBkaXN0YW5jZSA6IC1kaXN0YW5jZSwgXCJweClcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgcmV0dXJuIFwidHJhbnNsYXRlWShcIi5jb25jYXQocGxhY2VtZW50ID09PSAndG9wJyA/IGRpc3RhbmNlIDogLWRpc3RhbmNlLCBcInB4KVwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0UmNEcmF3ZXJTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHpJbmRleCA9IF90aGlzJHByb3BzLnpJbmRleCxcbiAgICAgICAgICBwbGFjZW1lbnQgPSBfdGhpcyRwcm9wcy5wbGFjZW1lbnQsXG4gICAgICAgICAgbWFzayA9IF90aGlzJHByb3BzLm1hc2ssXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wcy5zdHlsZTtcbiAgICAgIHZhciBwdXNoID0gX3RoaXMuc3RhdGUucHVzaDsgLy8g5b2T5pegIG1hc2sg5pe277yM5bCGIHdpZHRoIOW6lOeUqOWIsOWkluWxguWuueWZqOS4ilxuICAgICAgLy8g6Kej5YazIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzEyNDAxIOeahOmXrumimFxuXG4gICAgICB2YXIgb2Zmc2V0U3R5bGUgPSBtYXNrID8ge30gOiBfdGhpcy5nZXRPZmZzZXRTdHlsZSgpO1xuICAgICAgcmV0dXJuICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICB6SW5kZXg6IHpJbmRleCxcbiAgICAgICAgdHJhbnNmb3JtOiBwdXNoID8gX3RoaXMuZ2V0UHVzaFRyYW5zZm9ybShwbGFjZW1lbnQpIDogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXRTdHlsZSksIHN0eWxlKTtcbiAgICB9OyAvLyByZW5kZXIgZHJhd2VyIGJvZHkgZG9tXG5cblxuICAgIF90aGlzLnJlbmRlckJvZHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgYm9keVN0eWxlID0gX3RoaXMkcHJvcHMyLmJvZHlTdHlsZSxcbiAgICAgICAgICBkcmF3ZXJTdHlsZSA9IF90aGlzJHByb3BzMi5kcmF3ZXJTdHlsZSxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgIHZpc2libGUgPSBfdGhpcyRwcm9wczIudmlzaWJsZTtcblxuICAgICAgaWYgKF90aGlzLmRlc3Ryb3lDbG9zZSAmJiAhdmlzaWJsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZGVzdHJveUNsb3NlID0gZmFsc2U7XG4gICAgICB2YXIgY29udGFpbmVyU3R5bGUgPSB7fTtcblxuICAgICAgdmFyIGlzRGVzdHJveU9uQ2xvc2UgPSBfdGhpcy5nZXREZXN0cm95T25DbG9zZSgpO1xuXG4gICAgICBpZiAoaXNEZXN0cm95T25DbG9zZSkge1xuICAgICAgICAvLyBJbmNyZWFzZSB0aGUgb3BhY2l0eSB0cmFuc2l0aW9uLCBkZWxldGUgY2hpbGRyZW4gYWZ0ZXIgY2xvc2luZy5cbiAgICAgICAgY29udGFpbmVyU3R5bGUub3BhY2l0eSA9IDA7XG4gICAgICAgIGNvbnRhaW5lclN0eWxlLnRyYW5zaXRpb24gPSAnb3BhY2l0eSAuM3MnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1ib2R5XCIpLFxuICAgICAgICBzdHlsZTogKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgY29udGFpbmVyU3R5bGUpLCBkcmF3ZXJTdHlsZSksXG4gICAgICAgIG9uVHJhbnNpdGlvbkVuZDogX3RoaXMub25EZXN0cm95VHJhbnNpdGlvbkVuZFxuICAgICAgfSwgX3RoaXMucmVuZGVySGVhZGVyKCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvZHlcIiksXG4gICAgICAgIHN0eWxlOiBib2R5U3R5bGVcbiAgICAgIH0sIF90aGlzLnByb3BzLmNoaWxkcmVuKSwgX3RoaXMucmVuZGVyRm9vdGVyKCkpO1xuICAgIH07IC8vIHJlbmRlciBQcm92aWRlciBmb3IgTXVsdGktbGV2ZWwgZHJhd2VyXG5cblxuICAgIF90aGlzLnJlbmRlclByb3ZpZGVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBfdGhpcy5wYXJlbnREcmF3ZXIgPSB2YWx1ZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29udGV4dC5Db25maWdDb25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIGdldFBvcHVwQ29udGFpbmVyID0gX3JlZi5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICAgIGdldFByZWZpeENscyA9IF9yZWYuZ2V0UHJlZml4Q2xzO1xuXG4gICAgICAgIHZhciBfYSA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgICAgICAgcGxhY2VtZW50ID0gX2EucGxhY2VtZW50LFxuICAgICAgICAgICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgICAgICAgICAgbWFzayA9IF9hLm1hc2ssXG4gICAgICAgICAgICBkaXJlY3Rpb24gPSBfYS5kaXJlY3Rpb24sXG4gICAgICAgICAgICB2aXNpYmxlID0gX2EudmlzaWJsZSxcbiAgICAgICAgICAgIHJlc3QgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcInBsYWNlbWVudFwiLCBcImNsYXNzTmFtZVwiLCBcIm1hc2tcIiwgXCJkaXJlY3Rpb25cIiwgXCJ2aXNpYmxlXCJdKTtcblxuICAgICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzZWxlY3QnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgICB2YXIgZHJhd2VyQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgICAgJ25vLW1hc2snOiAhbWFza1xuICAgICAgICB9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIGNsYXNzTmFtZSk7XG4gICAgICAgIHZhciBvZmZzZXRTdHlsZSA9IG1hc2sgPyBfdGhpcy5nZXRPZmZzZXRTdHlsZSgpIDoge307XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEcmF3ZXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgICAgdmFsdWU6ICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNEcmF3ZXJbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgIGhhbmRsZXI6IGZhbHNlXG4gICAgICAgIH0sICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKHJlc3QsIFsnekluZGV4JywgJ3N0eWxlJywgJ2Nsb3NhYmxlJywgJ2Nsb3NlSWNvbicsICdkZXN0cm95T25DbG9zZScsICdkcmF3ZXJTdHlsZScsICdoZWFkZXJTdHlsZScsICdib2R5U3R5bGUnLCAnZm9vdGVyU3R5bGUnLCAnZm9vdGVyJywgJ2xvY2FsZScsICd0aXRsZScsICdwdXNoJywgJ3Zpc2libGUnLCAnZ2V0UG9wdXBDb250YWluZXInLCAncm9vdFByZWZpeENscycsICdnZXRQcmVmaXhDbHMnLCAncmVuZGVyRW1wdHknLCAnY3NwJywgJ3BhZ2VIZWFkZXInLCAnYXV0b0luc2VydFNwYWNlSW5CdXR0b24nLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ2Ryb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCcsICdnZXRUYXJnZXRDb250YWluZXInXSksIHtcbiAgICAgICAgICBnZXRDb250YWluZXI6IC8vIOacieWPr+iDveS4uiBmYWxzZe+8jOaJgOS7peS4jeiDveebtOaOpeWIpOaWrVxuICAgICAgICAgIHJlc3QuZ2V0Q29udGFpbmVyID09PSB1bmRlZmluZWQgJiYgZ2V0UG9wdXBDb250YWluZXIgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0UG9wdXBDb250YWluZXIoZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAgfSA6IHJlc3QuZ2V0Q29udGFpbmVyXG4gICAgICAgIH0sIG9mZnNldFN0eWxlLCB7XG4gICAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgb3BlbjogdmlzaWJsZSxcbiAgICAgICAgICBzaG93TWFzazogbWFzayxcbiAgICAgICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgICAgICBzdHlsZTogX3RoaXMuZ2V0UmNEcmF3ZXJTdHlsZSgpLFxuICAgICAgICAgIGNsYXNzTmFtZTogZHJhd2VyQ2xhc3NOYW1lXG4gICAgICAgIH0pLCBfdGhpcy5yZW5kZXJCb2R5KCkpKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKERyYXdlciwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAvLyBmaXg6IGRlbGV0ZSBkcmF3ZXIgaW4gY2hpbGQgYW5kIHJlLXJlbmRlciwgbm8gcHVzaCBzdGFydGVkLlxuICAgICAgLy8gPERyYXdlcj57c2hvdyAmJiA8RHJhd2VyIC8+fTwvRHJhd2VyPlxuICAgICAgdmFyIHZpc2libGUgPSB0aGlzLnByb3BzLnZpc2libGU7XG5cbiAgICAgIGlmICh2aXNpYmxlICYmIHRoaXMucGFyZW50RHJhd2VyKSB7XG4gICAgICAgIHRoaXMucGFyZW50RHJhd2VyLnB1c2goKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmVQcm9wcykge1xuICAgICAgdmFyIHZpc2libGUgPSB0aGlzLnByb3BzLnZpc2libGU7XG5cbiAgICAgIGlmIChwcmVQcm9wcy52aXNpYmxlICE9PSB2aXNpYmxlICYmIHRoaXMucGFyZW50RHJhd2VyKSB7XG4gICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy5wYXJlbnREcmF3ZXIucHVzaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGFyZW50RHJhd2VyLnB1bGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIC8vIHVubW91bnQgZHJhd2VyIGluIGNoaWxkLCBjbGVhciBwdXNoLlxuICAgICAgaWYgKHRoaXMucGFyZW50RHJhd2VyKSB7XG4gICAgICAgIHRoaXMucGFyZW50RHJhd2VyLnB1bGwoKTtcbiAgICAgICAgdGhpcy5wYXJlbnREcmF3ZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRPZmZzZXRTdHlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPZmZzZXRTdHlsZSgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHBsYWNlbWVudCA9IF90aGlzJHByb3BzMy5wbGFjZW1lbnQsXG4gICAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wczMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMzLmhlaWdodCxcbiAgICAgICAgICB2aXNpYmxlID0gX3RoaXMkcHJvcHMzLnZpc2libGUsXG4gICAgICAgICAgbWFzayA9IF90aGlzJHByb3BzMy5tYXNrOyAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNDI4N1xuXG4gICAgICBpZiAoIXZpc2libGUgJiYgIW1hc2spIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuXG4gICAgICB2YXIgb2Zmc2V0U3R5bGUgPSB7fTtcblxuICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnIHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBvZmZzZXRTdHlsZS53aWR0aCA9IHdpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2Zmc2V0U3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0U3R5bGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckhlYWRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJIZWFkZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB0aXRsZSA9IF90aGlzJHByb3BzNC50aXRsZSxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczQucHJlZml4Q2xzLFxuICAgICAgICAgIGNsb3NhYmxlID0gX3RoaXMkcHJvcHM0LmNsb3NhYmxlLFxuICAgICAgICAgIGhlYWRlclN0eWxlID0gX3RoaXMkcHJvcHM0LmhlYWRlclN0eWxlO1xuXG4gICAgICBpZiAoIXRpdGxlICYmICFjbG9zYWJsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGhlYWRlckNsYXNzTmFtZSA9IHRpdGxlID8gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIikgOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlci1uby10aXRsZVwiKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogaGVhZGVyQ2xhc3NOYW1lLFxuICAgICAgICBzdHlsZTogaGVhZGVyU3R5bGVcbiAgICAgIH0sIHRpdGxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpdGxlXCIpXG4gICAgICB9LCB0aXRsZSksIGNsb3NhYmxlICYmIHRoaXMucmVuZGVyQ2xvc2VJY29uKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJGb290ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyRm9vdGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgZm9vdGVyID0gX3RoaXMkcHJvcHM1LmZvb3RlcixcbiAgICAgICAgICBmb290ZXJTdHlsZSA9IF90aGlzJHByb3BzNS5mb290ZXJTdHlsZSxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczUucHJlZml4Q2xzO1xuXG4gICAgICBpZiAoIWZvb3Rlcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGZvb3RlckNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9vdGVyXCIpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBmb290ZXJDbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBmb290ZXJTdHlsZVxuICAgICAgfSwgZm9vdGVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQ2xvc2VJY29uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckNsb3NlSWNvbigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNsb3NhYmxlID0gX3RoaXMkcHJvcHM2LmNsb3NhYmxlLFxuICAgICAgICAgIF90aGlzJHByb3BzNiRjbG9zZUljbyA9IF90aGlzJHByb3BzNi5jbG9zZUljb24sXG4gICAgICAgICAgY2xvc2VJY29uID0gX3RoaXMkcHJvcHM2JGNsb3NlSWNvID09PSB2b2lkIDAgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2xvc2VPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogX3RoaXMkcHJvcHM2JGNsb3NlSWNvLFxuICAgICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzNi5wcmVmaXhDbHMsXG4gICAgICAgICAgb25DbG9zZSA9IF90aGlzJHByb3BzNi5vbkNsb3NlO1xuICAgICAgcmV0dXJuIGNsb3NhYmxlICYmXG4gICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvYnV0dG9uLWhhcy10eXBlXG4gICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgb25DbGljazogb25DbG9zZSxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiQ2xvc2VcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlXCIpLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICctLXNjcm9sbC1iYXInOiBcIlwiLmNvbmNhdCgoMCwgX2dldFNjcm9sbEJhclNpemVbXCJkZWZhdWx0XCJdKSgpLCBcInB4XCIpXG4gICAgICAgIH1cbiAgICAgIH0sIGNsb3NlSWNvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRHJhd2VyQ29udGV4dC5Db25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJQcm92aWRlcik7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBEcmF3ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkRyYXdlci5kZWZhdWx0UHJvcHMgPSB7XG4gIHdpZHRoOiAyNTYsXG4gIGhlaWdodDogMjU2LFxuICBjbG9zYWJsZTogdHJ1ZSxcbiAgcGxhY2VtZW50OiAncmlnaHQnLFxuICBtYXNrQ2xvc2FibGU6IHRydWUsXG4gIG1hc2s6IHRydWUsXG4gIGxldmVsOiBudWxsLFxuICBrZXlib2FyZDogdHJ1ZSxcbiAgcHVzaDogZGVmYXVsdFB1c2hTdGF0ZVxufTtcblxudmFyIF9kZWZhdWx0ID0gKDAsIF9jb250ZXh0LndpdGhDb25maWdDb25zdW1lcikoe1xuICBwcmVmaXhDbHM6ICdkcmF3ZXInXG59KShEcmF3ZXIpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX0VsbGlwc2lzT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9FbGxpcHNpc091dGxpbmVkXCIpKTtcblxudmFyIF9idXR0b24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9idXR0b25cIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9kcm9wZG93biA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZHJvcGRvd25cIikpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIEJ1dHRvbkdyb3VwID0gX2J1dHRvbltcImRlZmF1bHRcIl0uR3JvdXA7XG5cbnZhciBEcm9wZG93bkJ1dHRvbiA9IGZ1bmN0aW9uIERyb3Bkb3duQnV0dG9uKHByb3BzKSB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHR5cGUgPSBwcm9wcy50eXBlLFxuICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgICAgaHRtbFR5cGUgPSBwcm9wcy5odG1sVHlwZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBvdmVybGF5ID0gcHJvcHMub3ZlcmxheSxcbiAgICAgIHRyaWdnZXIgPSBwcm9wcy50cmlnZ2VyLFxuICAgICAgYWxpZ24gPSBwcm9wcy5hbGlnbixcbiAgICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgb25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlLFxuICAgICAgcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGhyZWYgPSBwcm9wcy5ocmVmLFxuICAgICAgX3Byb3BzJGljb24gPSBwcm9wcy5pY29uLFxuICAgICAgaWNvbiA9IF9wcm9wcyRpY29uID09PSB2b2lkIDAgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRWxsaXBzaXNPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogX3Byb3BzJGljb24sXG4gICAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgICAgYnV0dG9uc1JlbmRlciA9IHByb3BzLmJ1dHRvbnNSZW5kZXIsXG4gICAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInR5cGVcIiwgXCJkaXNhYmxlZFwiLCBcIm9uQ2xpY2tcIiwgXCJodG1sVHlwZVwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwib3ZlcmxheVwiLCBcInRyaWdnZXJcIiwgXCJhbGlnblwiLCBcInZpc2libGVcIiwgXCJvblZpc2libGVDaGFuZ2VcIiwgXCJwbGFjZW1lbnRcIiwgXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcImhyZWZcIiwgXCJpY29uXCIsIFwidGl0bGVcIiwgXCJidXR0b25zUmVuZGVyXCJdKTtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdkcm9wZG93bi1idXR0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgZHJvcGRvd25Qcm9wcyA9IHtcbiAgICBhbGlnbjogYWxpZ24sXG4gICAgb3ZlcmxheTogb3ZlcmxheSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgdHJpZ2dlcjogZGlzYWJsZWQgPyBbXSA6IHRyaWdnZXIsXG4gICAgb25WaXNpYmxlQ2hhbmdlOiBvblZpc2libGVDaGFuZ2UsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lclxuICB9O1xuXG4gIGlmICgndmlzaWJsZScgaW4gcHJvcHMpIHtcbiAgICBkcm9wZG93blByb3BzLnZpc2libGUgPSB2aXNpYmxlO1xuICB9XG5cbiAgaWYgKCdwbGFjZW1lbnQnIGluIHByb3BzKSB7XG4gICAgZHJvcGRvd25Qcm9wcy5wbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgZHJvcGRvd25Qcm9wcy5wbGFjZW1lbnQgPSBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbUxlZnQnIDogJ2JvdHRvbVJpZ2h0JztcbiAgfVxuXG4gIHZhciBsZWZ0QnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2J1dHRvbltcImRlZmF1bHRcIl0sIHtcbiAgICB0eXBlOiB0eXBlLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIGh0bWxUeXBlOiBodG1sVHlwZSxcbiAgICBocmVmOiBocmVmLFxuICAgIHRpdGxlOiB0aXRsZVxuICB9LCBjaGlsZHJlbik7XG4gIHZhciByaWdodEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9idXR0b25bXCJkZWZhdWx0XCJdLCB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBpY29uOiBpY29uXG4gIH0pO1xuXG4gIHZhciBfYnV0dG9uc1JlbmRlciA9IGJ1dHRvbnNSZW5kZXIoW2xlZnRCdXR0b24sIHJpZ2h0QnV0dG9uXSksXG4gICAgICBfYnV0dG9uc1JlbmRlcjIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX2J1dHRvbnNSZW5kZXIsIDIpLFxuICAgICAgbGVmdEJ1dHRvblRvUmVuZGVyID0gX2J1dHRvbnNSZW5kZXIyWzBdLFxuICAgICAgcmlnaHRCdXR0b25Ub1JlbmRlciA9IF9idXR0b25zUmVuZGVyMlsxXTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uR3JvdXAsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcmVzdFByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIGNsYXNzTmFtZSlcbiAgfSksIGxlZnRCdXR0b25Ub1JlbmRlciwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2Ryb3Bkb3duW1wiZGVmYXVsdFwiXSwgZHJvcGRvd25Qcm9wcywgcmlnaHRCdXR0b25Ub1JlbmRlcikpO1xufTtcblxuRHJvcGRvd25CdXR0b24uX19BTlRfQlVUVE9OID0gdHJ1ZTtcbkRyb3Bkb3duQnV0dG9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgdHlwZTogJ2RlZmF1bHQnLFxuICBidXR0b25zUmVuZGVyOiBmdW5jdGlvbiBidXR0b25zUmVuZGVyKGJ1dHRvbnMpIHtcbiAgICByZXR1cm4gYnV0dG9ucztcbiAgfVxufTtcbnZhciBfZGVmYXVsdCA9IERyb3Bkb3duQnV0dG9uO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNEcm9wZG93biA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLWRyb3Bkb3duXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfUmlnaHRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1JpZ2h0T3V0bGluZWRcIikpO1xuXG52YXIgX2Ryb3Bkb3duQnV0dG9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kcm9wZG93bi1idXR0b25cIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfdHlwZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC90eXBlXCIpO1xuXG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWFjdE5vZGVcIik7XG5cbnZhciBQbGFjZW1lbnRzID0gKDAsIF90eXBlLnR1cGxlKSgndG9wTGVmdCcsICd0b3BDZW50ZXInLCAndG9wUmlnaHQnLCAnYm90dG9tTGVmdCcsICdib3R0b21DZW50ZXInLCAnYm90dG9tUmlnaHQnKTtcblxudmFyIERyb3Bkb3duID0gZnVuY3Rpb24gRHJvcGRvd24ocHJvcHMpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgZ2V0VHJhbnNpdGlvbk5hbWUgPSBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uTmFtZSgpIHtcbiAgICB2YXIgX3Byb3BzJHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICAgICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJycgOiBfcHJvcHMkcGxhY2VtZW50LFxuICAgICAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lO1xuXG4gICAgaWYgKHRyYW5zaXRpb25OYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cmFuc2l0aW9uTmFtZTtcbiAgICB9XG5cbiAgICBpZiAocGxhY2VtZW50LmluZGV4T2YoJ3RvcCcpID49IDApIHtcbiAgICAgIHJldHVybiAnc2xpZGUtZG93bic7XG4gICAgfVxuXG4gICAgcmV0dXJuICdzbGlkZS11cCc7XG4gIH07XG5cbiAgdmFyIHJlbmRlck92ZXJsYXkgPSBmdW5jdGlvbiByZW5kZXJPdmVybGF5KHByZWZpeENscykge1xuICAgIC8vIHJjLWRyb3Bkb3duIGFscmVhZHkgY2FuIHByb2Nlc3MgdGhlIGZ1bmN0aW9uIG9mIG92ZXJsYXksIGJ1dCB3ZSBoYXZlIGNoZWNrIGxvZ2ljIGhlcmUuXG4gICAgLy8gU28gd2UgbmVlZCByZW5kZXIgdGhlIGVsZW1lbnQgdG8gY2hlY2sgYW5kIHBhc3MgYmFjayB0byByYy1kcm9wZG93bi5cbiAgICB2YXIgb3ZlcmxheSA9IHByb3BzLm92ZXJsYXk7XG4gICAgdmFyIG92ZXJsYXlOb2RlO1xuXG4gICAgaWYgKHR5cGVvZiBvdmVybGF5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvdmVybGF5Tm9kZSA9IG92ZXJsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3ZlcmxheU5vZGUgPSBvdmVybGF5O1xuICAgIH1cblxuICAgIG92ZXJsYXlOb2RlID0gUmVhY3QuQ2hpbGRyZW4ub25seSh0eXBlb2Ygb3ZlcmxheU5vZGUgPT09ICdzdHJpbmcnID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIG92ZXJsYXlOb2RlKSA6IG92ZXJsYXlOb2RlKTtcbiAgICB2YXIgb3ZlcmxheVByb3BzID0gb3ZlcmxheU5vZGUucHJvcHM7IC8vIFdhcm5pbmcgaWYgdXNlIG90aGVyIG1vZGVcblxuICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKCFvdmVybGF5UHJvcHMubW9kZSB8fCBvdmVybGF5UHJvcHMubW9kZSA9PT0gJ3ZlcnRpY2FsJywgJ0Ryb3Bkb3duJywgXCJtb2RlPVxcXCJcIi5jb25jYXQob3ZlcmxheVByb3BzLm1vZGUsIFwiXFxcIiBpcyBub3Qgc3VwcG9ydGVkIGZvciBEcm9wZG93bidzIE1lbnUuXCIpKTsgLy8gbWVudSBjYW5ub3QgYmUgc2VsZWN0YWJsZSBpbiBkcm9wZG93biBkZWZhdWx0bHlcbiAgICAvLyBtZW51IHNob3VsZCBiZSBmb2N1c2FibGUgaW4gZHJvcGRvd24gZGVmYXVsdGx5XG5cbiAgICB2YXIgX292ZXJsYXlQcm9wcyRzZWxlY3RhID0gb3ZlcmxheVByb3BzLnNlbGVjdGFibGUsXG4gICAgICAgIHNlbGVjdGFibGUgPSBfb3ZlcmxheVByb3BzJHNlbGVjdGEgPT09IHZvaWQgMCA/IGZhbHNlIDogX292ZXJsYXlQcm9wcyRzZWxlY3RhLFxuICAgICAgICBfb3ZlcmxheVByb3BzJGZvY3VzYWIgPSBvdmVybGF5UHJvcHMuZm9jdXNhYmxlLFxuICAgICAgICBmb2N1c2FibGUgPSBfb3ZlcmxheVByb3BzJGZvY3VzYWIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3ZlcmxheVByb3BzJGZvY3VzYWI7XG4gICAgdmFyIGV4cGFuZEljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lbnUtc3VibWVudS1hcnJvd1wiKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9SaWdodE91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lbnUtc3VibWVudS1hcnJvdy1pY29uXCIpXG4gICAgfSkpO1xuICAgIHZhciBmaXhlZE1vZGVPdmVybGF5ID0gdHlwZW9mIG92ZXJsYXlOb2RlLnR5cGUgPT09ICdzdHJpbmcnID8gb3ZlcmxheU5vZGUgOiAoMCwgX3JlYWN0Tm9kZS5jbG9uZUVsZW1lbnQpKG92ZXJsYXlOb2RlLCB7XG4gICAgICBtb2RlOiAndmVydGljYWwnLFxuICAgICAgc2VsZWN0YWJsZTogc2VsZWN0YWJsZSxcbiAgICAgIGZvY3VzYWJsZTogZm9jdXNhYmxlLFxuICAgICAgZXhwYW5kSWNvbjogZXhwYW5kSWNvblxuICAgIH0pO1xuICAgIHJldHVybiBmaXhlZE1vZGVPdmVybGF5O1xuICB9O1xuXG4gIHZhciBnZXRQbGFjZW1lbnQgPSBmdW5jdGlvbiBnZXRQbGFjZW1lbnQoKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudDtcblxuICAgIGlmIChwbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSAncnRsJyA/ICdib3R0b21SaWdodCcgOiAnYm90dG9tTGVmdCc7XG4gIH07XG5cbiAgdmFyIGFycm93ID0gcHJvcHMuYXJyb3csXG4gICAgICBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIG92ZXJsYXlDbGFzc05hbWUgPSBwcm9wcy5vdmVybGF5Q2xhc3NOYW1lO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdkcm9wZG93bicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICB2YXIgZHJvcGRvd25UcmlnZ2VyID0gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShjaGlsZCwge1xuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmlnZ2VyXCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIGNoaWxkLnByb3BzLmNsYXNzTmFtZSksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gIH0pO1xuICB2YXIgb3ZlcmxheUNsYXNzTmFtZUN1c3RvbWl6ZWQgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShvdmVybGF5Q2xhc3NOYW1lLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJykpO1xuICB2YXIgdHJpZ2dlckFjdGlvbnMgPSBkaXNhYmxlZCA/IFtdIDogdHJpZ2dlcjtcbiAgdmFyIGFsaWduUG9pbnQ7XG5cbiAgaWYgKHRyaWdnZXJBY3Rpb25zICYmIHRyaWdnZXJBY3Rpb25zLmluZGV4T2YoJ2NvbnRleHRNZW51JykgIT09IC0xKSB7XG4gICAgYWxpZ25Qb2ludCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjRHJvcGRvd25bXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgIGFycm93OiBhcnJvdyxcbiAgICBhbGlnblBvaW50OiBhbGlnblBvaW50XG4gIH0sIHByb3BzLCB7XG4gICAgb3ZlcmxheUNsYXNzTmFtZTogb3ZlcmxheUNsYXNzTmFtZUN1c3RvbWl6ZWQsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICB0cmFuc2l0aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUoKSxcbiAgICB0cmlnZ2VyOiB0cmlnZ2VyQWN0aW9ucyxcbiAgICBvdmVybGF5OiBmdW5jdGlvbiBvdmVybGF5KCkge1xuICAgICAgcmV0dXJuIHJlbmRlck92ZXJsYXkocHJlZml4Q2xzKTtcbiAgICB9LFxuICAgIHBsYWNlbWVudDogZ2V0UGxhY2VtZW50KClcbiAgfSksIGRyb3Bkb3duVHJpZ2dlcik7XG59O1xuXG5Ecm9wZG93bi5CdXR0b24gPSBfZHJvcGRvd25CdXR0b25bXCJkZWZhdWx0XCJdO1xuRHJvcGRvd24uZGVmYXVsdFByb3BzID0ge1xuICBtb3VzZUVudGVyRGVsYXk6IDAuMTUsXG4gIG1vdXNlTGVhdmVEZWxheTogMC4xXG59O1xudmFyIF9kZWZhdWx0ID0gRHJvcGRvd247XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2Ryb3Bkb3duID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kcm9wZG93blwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9kcm9wZG93bltcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZW1wdHktaW1nLWRlZmF1bHQnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICBjbGFzc05hbWU6IHByZWZpeENscyxcbiAgICB3aWR0aDogXCIxODRcIixcbiAgICBoZWlnaHQ6IFwiMTUyXCIsXG4gICAgdmlld0JveDogXCIwIDAgMTg0IDE1MlwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDI0IDMxLjY3KVwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsbGlwc2VcIiksXG4gICAgY3g6IFwiNjcuNzk3XCIsXG4gICAgY3k6IFwiMTA2Ljg5XCIsXG4gICAgcng6IFwiNjcuNzk3XCIsXG4gICAgcnk6IFwiMTIuNjY4XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhdGgtMVwiKSxcbiAgICBkOiBcIk0xMjIuMDM0IDY5LjY3NEw5OC4xMDkgNDAuMjI5Yy0xLjE0OC0xLjM4Ni0yLjgyNi0yLjIyNS00LjU5My0yLjIyNWgtNTEuNDRjLTEuNzY2IDAtMy40NDQuODM5LTQuNTkyIDIuMjI1TDEzLjU2IDY5LjY3NHYxNS4zODNoMTA4LjQ3NVY2OS42NzR6XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhdGgtMlwiKSxcbiAgICBkOiBcIk0xMDEuNTM3IDg2LjIxNEw4MC42MyA2MS4xMDJjLTEuMDAxLTEuMjA3LTIuNTA3LTEuODY3LTQuMDQ4LTEuODY3SDMxLjcyNGMtMS41NCAwLTMuMDQ3LjY2LTQuMDQ4IDEuODY3TDYuNzY5IDg2LjIxNHYxMy43OTJoOTQuNzY4Vjg2LjIxNHpcIixcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDEzLjU2KVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYXRoLTNcIiksXG4gICAgZDogXCJNMzMuODMgMGg2Ny45MzNhNCA0IDAgMCAxIDQgNHY5My4zNDRhNCA0IDAgMCAxLTQgNEgzMy44M2E0IDQgMCAwIDEtNC00VjRhNCA0IDAgMCAxIDQtNHpcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGF0aC00XCIpLFxuICAgIGQ6IFwiTTQyLjY3OCA5Ljk1M2g1MC4yMzdhMiAyIDAgMCAxIDIgMlYzNi45MWEyIDIgMCAwIDEtMiAySDQyLjY3OGEyIDIgMCAwIDEtMi0yVjExLjk1M2EyIDIgMCAwIDEgMi0yek00Mi45NCA0OS43NjdoNDkuNzEzYTIuMjYyIDIuMjYyIDAgMSAxIDAgNC41MjRINDIuOTRhMi4yNjIgMi4yNjIgMCAwIDEgMC00LjUyNHpNNDIuOTQgNjEuNTNoNDkuNzEzYTIuMjYyIDIuMjYyIDAgMSAxIDAgNC41MjVINDIuOTRhMi4yNjIgMi4yNjIgMCAwIDEgMC00LjUyNXpNMTIxLjgxMyAxMDUuMDMyYy0uNzc1IDMuMDcxLTMuNDk3IDUuMzYtNi43MzUgNS4zNkgyMC41MTVjLTMuMjM4IDAtNS45Ni0yLjI5LTYuNzM0LTUuMzZhNy4zMDkgNy4zMDkgMCAwIDEtLjIyMi0xLjc5VjY5LjY3NWgyNi4zMThjMi45MDcgMCA1LjI1IDIuNDQ4IDUuMjUgNS40MnYuMDRjMCAyLjk3MSAyLjM3IDUuMzcgNS4yNzcgNS4zN2gzNC43ODVjMi45MDcgMCA1LjI3Ny0yLjQyMSA1LjI3Ny01LjM5M1Y3NS4xYzAtMi45NzIgMi4zNDMtNS40MjYgNS4yNS01LjQyNmgyNi4zMTh2MzMuNTY5YzAgLjYxNy0uMDc3IDEuMjE2LS4yMjEgMS43ODl6XCJcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYXRoLTVcIiksXG4gICAgZDogXCJNMTQ5LjEyMSAzMy4yOTJsLTYuODMgMi42NWExIDEgMCAwIDEtMS4zMTctMS4yM2wxLjkzNy02LjIwN2MtMi41ODktMi45NDQtNC4xMDktNi41MzQtNC4xMDktMTAuNDA4QzEzOC44MDIgOC4xMDIgMTQ4LjkyIDAgMTYxLjQwMiAwIDE3My44ODEgMCAxODQgOC4xMDIgMTg0IDE4LjA5N2MwIDkuOTk1LTEwLjExOCAxOC4wOTctMjIuNTk5IDE4LjA5Ny00LjUyOCAwLTguNzQ0LTEuMDY2LTEyLjI4LTIuOTAyelwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1nXCIpLFxuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoMTQ5LjY1IDE1LjM4MylcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGN4OiBcIjIwLjY1NFwiLFxuICAgIGN5OiBcIjMuMTY3XCIsXG4gICAgcng6IFwiMi44NDlcIixcbiAgICByeTogXCIyLjgxNVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUuNjk4IDUuNjNIMEwyLjg5OC43MDR6TTkuMjU5LjcwNGg0Ljk4NVY1LjYzSDkuMjU5elwiXG4gIH0pKSkpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gRW1wdHk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX0xvY2FsZVJlY2VpdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyXCIpKTtcblxudmFyIF9lbXB0eSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW1wdHlcIikpO1xuXG52YXIgX3NpbXBsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc2ltcGxlXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBkZWZhdWx0RW1wdHlJbWcgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfZW1wdHlbXCJkZWZhdWx0XCJdLCBudWxsKTtcbnZhciBzaW1wbGVFbXB0eUltZyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9zaW1wbGVbXCJkZWZhdWx0XCJdLCBudWxsKTtcblxudmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHMsXG4gICAgICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uO1xuXG4gICAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBfcHJvcHMkaW1hZ2UgPSBwcm9wcy5pbWFnZSxcbiAgICAgICAgaW1hZ2UgPSBfcHJvcHMkaW1hZ2UgPT09IHZvaWQgMCA/IGRlZmF1bHRFbXB0eUltZyA6IF9wcm9wcyRpbWFnZSxcbiAgICAgICAgZGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgaW1hZ2VTdHlsZSA9IHByb3BzLmltYWdlU3R5bGUsXG4gICAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wiY2xhc3NOYW1lXCIsIFwicHJlZml4Q2xzXCIsIFwiaW1hZ2VcIiwgXCJkZXNjcmlwdGlvblwiLCBcImNoaWxkcmVuXCIsIFwiaW1hZ2VTdHlsZVwiXSk7XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwge1xuICAgICAgY29tcG9uZW50TmFtZTogXCJFbXB0eVwiXG4gICAgfSwgZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdlbXB0eScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgICB2YXIgZGVzID0gdHlwZW9mIGRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJyA/IGRlc2NyaXB0aW9uIDogbG9jYWxlLmRlc2NyaXB0aW9uO1xuICAgICAgdmFyIGFsdCA9IHR5cGVvZiBkZXMgPT09ICdzdHJpbmcnID8gZGVzIDogJ2VtcHR5JztcbiAgICAgIHZhciBpbWFnZU5vZGUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGltYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpbWFnZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgICAgYWx0OiBhbHQsXG4gICAgICAgICAgc3JjOiBpbWFnZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltYWdlTm9kZSA9IGltYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vcm1hbFwiKSwgaW1hZ2UgPT09IHNpbXBsZUVtcHR5SW1nKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSlcbiAgICAgIH0sIHJlc3RQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWltYWdlXCIpLFxuICAgICAgICBzdHlsZTogaW1hZ2VTdHlsZVxuICAgICAgfSwgaW1hZ2VOb2RlKSwgZGVzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kZXNjcmlwdGlvblwiKVxuICAgICAgfSwgZGVzKSwgY2hpbGRyZW4gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9vdGVyXCIpXG4gICAgICB9LCBjaGlsZHJlbikpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbkVtcHR5LlBSRVNFTlRFRF9JTUFHRV9ERUZBVUxUID0gZGVmYXVsdEVtcHR5SW1nO1xuRW1wdHkuUFJFU0VOVEVEX0lNQUdFX1NJTVBMRSA9IHNpbXBsZUVtcHR5SW1nO1xudmFyIF9kZWZhdWx0ID0gRW1wdHk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgU2ltcGxlID0gZnVuY3Rpb24gU2ltcGxlKCkge1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdlbXB0eS1pbWctc2ltcGxlJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgY2xhc3NOYW1lOiBwcmVmaXhDbHMsXG4gICAgd2lkdGg6IFwiNjRcIixcbiAgICBoZWlnaHQ6IFwiNDFcIixcbiAgICB2aWV3Qm94OiBcIjAgMCA2NCA0MVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDAgMSlcIixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJlbGxpcHNlXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWxsaXBzZVwiKSxcbiAgICBjeDogXCIzMlwiLFxuICAgIGN5OiBcIjMzXCIsXG4gICAgcng6IFwiMzJcIixcbiAgICByeTogXCI3XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdcIiksXG4gICAgZmlsbFJ1bGU6IFwibm9uemVyb1wiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTUgMTIuNzZMNDQuODU0IDEuMjU4QzQ0LjM2Ny40NzQgNDMuNjU2IDAgNDIuOTA3IDBIMjEuMDkzYy0uNzQ5IDAtMS40Ni40NzQtMS45NDcgMS4yNTdMOSAxMi43NjFWMjJoNDZ2LTkuMjR6XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNDEuNjEzIDE1LjkzMWMwLTEuNjA1Ljk5NC0yLjkzIDIuMjI3LTIuOTMxSDU1djE4LjEzN0M1NSAzMy4yNiA1My42OCAzNSA1Mi4wNSAzNWgtNDAuMUMxMC4zMiAzNSA5IDMzLjI1OSA5IDMxLjEzN1YxM2gxMS4xNmMxLjIzMyAwIDIuMjI3IDEuMzIzIDIuMjI3IDIuOTI4di4wMjJjMCAxLjYwNSAxLjAwNSAyLjkwMSAyLjIzNyAyLjkwMWgxNC43NTJjMS4yMzIgMCAyLjIzNy0xLjMwOCAyLjIzNy0yLjkxM3YtLjAwN3pcIixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGF0aFwiKVxuICB9KSkpKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IFNpbXBsZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlzdFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcmNGaWVsZEZvcm0uTGlzdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ1c2VGb3JtXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF91c2VGb3JtM1tcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcmNGaWVsZEZvcm0gPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmMtZmllbGQtZm9ybVwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX2NvbnRleHQgPSByZXF1aXJlKFwiLi9jb250ZXh0XCIpO1xuXG52YXIgX3VzZUZvcm0zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VGb3JtXCIpKTtcblxudmFyIF9TaXplQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHRcIikpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIEludGVybmFsRm9ybSA9IGZ1bmN0aW9uIEludGVybmFsRm9ybShwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcblxuICB2YXIgY29udGV4dFNpemUgPSBSZWFjdC51c2VDb250ZXh0KF9TaXplQ29udGV4dFtcImRlZmF1bHRcIl0pO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gIHZhciBuYW1lID0gcHJvcHMubmFtZTtcblxuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgX3Byb3BzJGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcyRjbGFzc05hbWUgPT09IHZvaWQgMCA/ICcnIDogX3Byb3BzJGNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHNpemUgPSBfcHJvcHMkc2l6ZSA9PT0gdm9pZCAwID8gY29udGV4dFNpemUgOiBfcHJvcHMkc2l6ZSxcbiAgICAgIGZvcm0gPSBwcm9wcy5mb3JtLFxuICAgICAgY29sb24gPSBwcm9wcy5jb2xvbixcbiAgICAgIGxhYmVsQWxpZ24gPSBwcm9wcy5sYWJlbEFsaWduLFxuICAgICAgbGFiZWxDb2wgPSBwcm9wcy5sYWJlbENvbCxcbiAgICAgIHdyYXBwZXJDb2wgPSBwcm9wcy53cmFwcGVyQ29sLFxuICAgICAgaGlkZVJlcXVpcmVkTWFyayA9IHByb3BzLmhpZGVSZXF1aXJlZE1hcmssXG4gICAgICBfcHJvcHMkbGF5b3V0ID0gcHJvcHMubGF5b3V0LFxuICAgICAgbGF5b3V0ID0gX3Byb3BzJGxheW91dCA9PT0gdm9pZCAwID8gJ2hvcml6b250YWwnIDogX3Byb3BzJGxheW91dCxcbiAgICAgIHNjcm9sbFRvRmlyc3RFcnJvciA9IHByb3BzLnNjcm9sbFRvRmlyc3RFcnJvcixcbiAgICAgIHJlcXVpcmVkTWFyayA9IHByb3BzLnJlcXVpcmVkTWFyayxcbiAgICAgIG9uRmluaXNoRmFpbGVkID0gcHJvcHMub25GaW5pc2hGYWlsZWQsXG4gICAgICByZXN0Rm9ybVByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzaXplXCIsIFwiZm9ybVwiLCBcImNvbG9uXCIsIFwibGFiZWxBbGlnblwiLCBcImxhYmVsQ29sXCIsIFwid3JhcHBlckNvbFwiLCBcImhpZGVSZXF1aXJlZE1hcmtcIiwgXCJsYXlvdXRcIiwgXCJzY3JvbGxUb0ZpcnN0RXJyb3JcIiwgXCJyZXF1aXJlZE1hcmtcIiwgXCJvbkZpbmlzaEZhaWxlZFwiXSk7XG5cbiAgdmFyIG1lcmdlZFJlcXVpcmVkTWFyayA9ICgwLCBSZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJlcXVpcmVkTWFyayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZWRNYXJrO1xuICAgIH1cblxuICAgIGlmIChoaWRlUmVxdWlyZWRNYXJrKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sIFtoaWRlUmVxdWlyZWRNYXJrLCByZXF1aXJlZE1hcmtdKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZm9ybScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBmb3JtQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGxheW91dCksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhpZGUtcmVxdWlyZWQtbWFya1wiKSwgbWVyZ2VkUmVxdWlyZWRNYXJrID09PSBmYWxzZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemUpLCBzaXplKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuXG4gIHZhciBfdXNlRm9ybSA9ICgwLCBfdXNlRm9ybTNbXCJkZWZhdWx0XCJdKShmb3JtKSxcbiAgICAgIF91c2VGb3JtMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfdXNlRm9ybSwgMSksXG4gICAgICB3cmFwRm9ybSA9IF91c2VGb3JtMlswXTtcblxuICB2YXIgX19JTlRFUk5BTF9fID0gd3JhcEZvcm0uX19JTlRFUk5BTF9fO1xuICBfX0lOVEVSTkFMX18ubmFtZSA9IG5hbWU7XG4gIHZhciBmb3JtQ29udGV4dFZhbHVlID0gKDAsIFJlYWN0LnVzZU1lbW8pKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGxhYmVsQWxpZ246IGxhYmVsQWxpZ24sXG4gICAgICBsYWJlbENvbDogbGFiZWxDb2wsXG4gICAgICB3cmFwcGVyQ29sOiB3cmFwcGVyQ29sLFxuICAgICAgdmVydGljYWw6IGxheW91dCA9PT0gJ3ZlcnRpY2FsJyxcbiAgICAgIGNvbG9uOiBjb2xvbixcbiAgICAgIHJlcXVpcmVkTWFyazogbWVyZ2VkUmVxdWlyZWRNYXJrLFxuICAgICAgaXRlbVJlZjogX19JTlRFUk5BTF9fLml0ZW1SZWZcbiAgICB9O1xuICB9LCBbbmFtZSwgbGFiZWxBbGlnbiwgbGFiZWxDb2wsIHdyYXBwZXJDb2wsIGxheW91dCwgY29sb24sIG1lcmdlZFJlcXVpcmVkTWFya10pO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB3cmFwRm9ybTtcbiAgfSk7XG5cbiAgdmFyIG9uSW50ZXJuYWxGaW5pc2hGYWlsZWQgPSBmdW5jdGlvbiBvbkludGVybmFsRmluaXNoRmFpbGVkKGVycm9ySW5mbykge1xuICAgIGlmIChvbkZpbmlzaEZhaWxlZCkge1xuICAgICAgb25GaW5pc2hGYWlsZWQoZXJyb3JJbmZvKTtcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG9GaXJzdEVycm9yICYmIGVycm9ySW5mby5lcnJvckZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIHdyYXBGb3JtLnNjcm9sbFRvRmllbGQoZXJyb3JJbmZvLmVycm9yRmllbGRzWzBdLm5hbWUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NpemVDb250ZXh0LlNpemVDb250ZXh0UHJvdmlkZXIsIHtcbiAgICBzaXplOiBzaXplXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb250ZXh0LkZvcm1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGZvcm1Db250ZXh0VmFsdWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjRmllbGRGb3JtW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICBpZDogbmFtZVxuICB9LCByZXN0Rm9ybVByb3BzLCB7XG4gICAgb25GaW5pc2hGYWlsZWQ6IG9uSW50ZXJuYWxGaW5pc2hGYWlsZWQsXG4gICAgZm9ybTogd3JhcEZvcm0sXG4gICAgY2xhc3NOYW1lOiBmb3JtQ2xhc3NOYW1lXG4gIH0pKSkpO1xufTtcblxudmFyIEZvcm0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbEZvcm0pO1xudmFyIF9kZWZhdWx0ID0gRm9ybTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2lzRXF1YWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJsb2Rhc2gvaXNFcXVhbFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3JjRmllbGRGb3JtID0gcmVxdWlyZShcInJjLWZpZWxkLWZvcm1cIik7XG5cbnZhciBfRmllbGRDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtZmllbGQtZm9ybS9saWIvRmllbGRDb250ZXh0XCIpKTtcblxudmFyIF9yZWYyID0gcmVxdWlyZShcInJjLXV0aWwvbGliL3JlZlwiKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfcm93ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vZ3JpZC9yb3dcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF90eXBlID0gcmVxdWlyZShcIi4uL191dGlsL3R5cGVcIik7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX0Zvcm1JdGVtTGFiZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0Zvcm1JdGVtTGFiZWxcIikpO1xuXG52YXIgX0Zvcm1JdGVtSW5wdXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0Zvcm1JdGVtSW5wdXRcIikpO1xuXG52YXIgX2NvbnRleHQgPSByZXF1aXJlKFwiLi9jb250ZXh0XCIpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWFjdE5vZGVcIik7XG5cbnZhciBfdXNlRnJhbWVTdGF0ZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZUZyYW1lU3RhdGVcIikpO1xuXG52YXIgX3VzZUl0ZW1SZWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZUl0ZW1SZWZcIikpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIFZhbGlkYXRlU3RhdHVzZXMgPSAoMCwgX3R5cGUudHVwbGUpKCdzdWNjZXNzJywgJ3dhcm5pbmcnLCAnZXJyb3InLCAndmFsaWRhdGluZycsICcnKTtcbnZhciBNZW1vSW5wdXQgPSAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICByZXR1cm4gY2hpbGRyZW47XG59LCBmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICByZXR1cm4gcHJldi52YWx1ZSA9PT0gbmV4dC52YWx1ZSAmJiBwcmV2LnVwZGF0ZSA9PT0gbmV4dC51cGRhdGU7XG59KTtcblxuZnVuY3Rpb24gaGFzVmFsaWROYW1lKG5hbWUpIHtcbiAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKShmYWxzZSwgJ0Zvcm0uSXRlbScsICdgbnVsbGAgaXMgcGFzc2VkIGFzIGBuYW1lYCBwcm9wZXJ0eScpO1xuICB9XG5cbiAgcmV0dXJuICEobmFtZSA9PT0gdW5kZWZpbmVkIHx8IG5hbWUgPT09IG51bGwpO1xufVxuXG5mdW5jdGlvbiBGb3JtSXRlbShwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWUsXG4gICAgICBmaWVsZEtleSA9IHByb3BzLmZpZWxkS2V5LFxuICAgICAgbm9TdHlsZSA9IHByb3BzLm5vU3R5bGUsXG4gICAgICBkZXBlbmRlbmNpZXMgPSBwcm9wcy5kZXBlbmRlbmNpZXMsXG4gICAgICBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgc2hvdWxkVXBkYXRlID0gcHJvcHMuc2hvdWxkVXBkYXRlLFxuICAgICAgaGFzRmVlZGJhY2sgPSBwcm9wcy5oYXNGZWVkYmFjayxcbiAgICAgIGhlbHAgPSBwcm9wcy5oZWxwLFxuICAgICAgcnVsZXMgPSBwcm9wcy5ydWxlcyxcbiAgICAgIHZhbGlkYXRlU3RhdHVzID0gcHJvcHMudmFsaWRhdGVTdGF0dXMsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgcmVxdWlyZWQgPSBwcm9wcy5yZXF1aXJlZCxcbiAgICAgIGxhYmVsID0gcHJvcHMubGFiZWwsXG4gICAgICBfcHJvcHMkdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgICB0cmlnZ2VyID0gX3Byb3BzJHRyaWdnZXIgPT09IHZvaWQgMCA/ICdvbkNoYW5nZScgOiBfcHJvcHMkdHJpZ2dlcixcbiAgICAgIHZhbGlkYXRlVHJpZ2dlciA9IHByb3BzLnZhbGlkYXRlVHJpZ2dlcixcbiAgICAgIGhpZGRlbiA9IHByb3BzLmhpZGRlbixcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wibmFtZVwiLCBcImZpZWxkS2V5XCIsIFwibm9TdHlsZVwiLCBcImRlcGVuZGVuY2llc1wiLCBcInByZWZpeENsc1wiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwic2hvdWxkVXBkYXRlXCIsIFwiaGFzRmVlZGJhY2tcIiwgXCJoZWxwXCIsIFwicnVsZXNcIiwgXCJ2YWxpZGF0ZVN0YXR1c1wiLCBcImNoaWxkcmVuXCIsIFwicmVxdWlyZWRcIiwgXCJsYWJlbFwiLCBcInRyaWdnZXJcIiwgXCJ2YWxpZGF0ZVRyaWdnZXJcIiwgXCJoaWRkZW5cIl0pO1xuXG4gIHZhciBkZXN0cm95UmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQyID0gUmVhY3QudXNlQ29udGV4dChfY29udGV4dC5Gb3JtQ29udGV4dCksXG4gICAgICBmb3JtTmFtZSA9IF9SZWFjdCR1c2VDb250ZXh0Mi5uYW1lLFxuICAgICAgcmVxdWlyZWRNYXJrID0gX1JlYWN0JHVzZUNvbnRleHQyLnJlcXVpcmVkTWFyaztcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQzID0gUmVhY3QudXNlQ29udGV4dChfY29udGV4dC5Gb3JtSXRlbUNvbnRleHQpLFxuICAgICAgdXBkYXRlSXRlbUVycm9ycyA9IF9SZWFjdCR1c2VDb250ZXh0My51cGRhdGVJdGVtRXJyb3JzO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSghIWhlbHApLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgZG9tRXJyb3JWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIGlubmVyU2V0RG9tRXJyb3JWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgcHJldlZhbGlkYXRlU3RhdHVzUmVmID0gUmVhY3QudXNlUmVmKHZhbGlkYXRlU3RhdHVzKTtcblxuICB2YXIgX3VzZUZyYW1lU3RhdGUgPSAoMCwgX3VzZUZyYW1lU3RhdGUzW1wiZGVmYXVsdFwiXSkoe30pLFxuICAgICAgX3VzZUZyYW1lU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VGcmFtZVN0YXRlLCAyKSxcbiAgICAgIGlubGluZUVycm9ycyA9IF91c2VGcmFtZVN0YXRlMlswXSxcbiAgICAgIHNldElubGluZUVycm9ycyA9IF91c2VGcmFtZVN0YXRlMlsxXTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQ0ID0gUmVhY3QudXNlQ29udGV4dChfRmllbGRDb250ZXh0W1wiZGVmYXVsdFwiXSksXG4gICAgICBjb250ZXh0VmFsaWRhdGVUcmlnZ2VyID0gX1JlYWN0JHVzZUNvbnRleHQ0LnZhbGlkYXRlVHJpZ2dlcjtcblxuICB2YXIgbWVyZ2VkVmFsaWRhdGVUcmlnZ2VyID0gdmFsaWRhdGVUcmlnZ2VyICE9PSB1bmRlZmluZWQgPyB2YWxpZGF0ZVRyaWdnZXIgOiBjb250ZXh0VmFsaWRhdGVUcmlnZ2VyO1xuXG4gIGZ1bmN0aW9uIHNldERvbUVycm9yVmlzaWJsZSh2aXNpYmxlKSB7XG4gICAgaWYgKCFkZXN0cm95UmVmLmN1cnJlbnQpIHtcbiAgICAgIGlubmVyU2V0RG9tRXJyb3JWaXNpYmxlKHZpc2libGUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBoYXNOYW1lID0gaGFzVmFsaWROYW1lKG5hbWUpOyAvLyBDYWNoZSBGaWVsZCBOYW1lUGF0aFxuXG4gIHZhciBuYW1lUmVmID0gUmVhY3QudXNlUmVmKFtdKTsgLy8gU2hvdWxkIGNsZWFuIHVwIGlmIEZpZWxkIHJlbW92ZWRcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXN0cm95UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgdXBkYXRlSXRlbUVycm9ycyhuYW1lUmVmLmN1cnJlbnQuam9pbignX19TUExJVF9fJyksIFtdKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2Zvcm0nLCBjdXN0b21pemVQcmVmaXhDbHMpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRXJyb3JzID09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb2xsZWN0IG5vU3R5bGUgRmllbGQgZXJyb3IgdG8gdGhlIHRvcCBGb3JtSXRlbVxuXG4gIHZhciB1cGRhdGVDaGlsZEl0ZW1FcnJvcnMgPSBub1N0eWxlID8gdXBkYXRlSXRlbUVycm9ycyA6IGZ1bmN0aW9uIChzdWJOYW1lLCBzdWJFcnJvcnMpIHtcbiAgICBzZXRJbmxpbmVFcnJvcnMoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByZXZJbmxpbmVFcnJvcnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgICBpZiAoISgwLCBfaXNFcXVhbFtcImRlZmF1bHRcIl0pKHByZXZJbmxpbmVFcnJvcnNbc3ViTmFtZV0sIHN1YkVycm9ycykpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoe30sIHByZXZJbmxpbmVFcnJvcnMpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBzdWJOYW1lLCBzdWJFcnJvcnMpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZJbmxpbmVFcnJvcnM7XG4gICAgfSk7XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PSBDaGlsZHJlbiBSZWYgPT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGdldEl0ZW1SZWYgPSAoMCwgX3VzZUl0ZW1SZWZbXCJkZWZhdWx0XCJdKSgpO1xuXG4gIGZ1bmN0aW9uIHJlbmRlckxheW91dChiYXNlQ2hpbGRyZW4sIGZpZWxkSWQsIG1ldGEsIGlzUmVxdWlyZWQpIHtcbiAgICB2YXIgX2l0ZW1DbGFzc05hbWU7XG5cbiAgICB2YXIgX2E7XG5cbiAgICBpZiAobm9TdHlsZSAmJiAhaGlkZGVuKSB7XG4gICAgICByZXR1cm4gYmFzZUNoaWxkcmVuO1xuICAgIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEVycm9ycyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyA+Pj4gY29sbGVjdCBzdWIgZXJyb3JzXG5cblxuICAgIHZhciBzdWJFcnJvckxpc3QgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhpbmxpbmVFcnJvcnMpLmZvckVhY2goZnVuY3Rpb24gKHN1Yk5hbWUpIHtcbiAgICAgIHN1YkVycm9yTGlzdCA9IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKHN1YkVycm9yTGlzdCksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkoaW5saW5lRXJyb3JzW3N1Yk5hbWVdIHx8IFtdKSk7XG4gICAgfSk7IC8vID4+PiBtZXJnZWQgZXJyb3JzXG5cbiAgICB2YXIgbWVyZ2VkRXJyb3JzO1xuXG4gICAgaWYgKGhlbHAgIT09IHVuZGVmaW5lZCAmJiBoZWxwICE9PSBudWxsKSB7XG4gICAgICBtZXJnZWRFcnJvcnMgPSAoMCwgX3V0aWwudG9BcnJheSkoaGVscCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZEVycm9ycyA9IG1ldGEgPyBtZXRhLmVycm9ycyA6IFtdO1xuICAgICAgbWVyZ2VkRXJyb3JzID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkobWVyZ2VkRXJyb3JzKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShzdWJFcnJvckxpc3QpKTtcbiAgICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBTdGF0dXMgPT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgIHZhciBtZXJnZWRWYWxpZGF0ZVN0YXR1cyA9ICcnO1xuXG4gICAgaWYgKHZhbGlkYXRlU3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1lcmdlZFZhbGlkYXRlU3RhdHVzID0gdmFsaWRhdGVTdGF0dXM7XG4gICAgfSBlbHNlIGlmIChtZXRhID09PSBudWxsIHx8IG1ldGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1ldGEudmFsaWRhdGluZykge1xuICAgICAgbWVyZ2VkVmFsaWRhdGVTdGF0dXMgPSAndmFsaWRhdGluZyc7XG4gICAgfSBlbHNlIGlmICgoKF9hID0gbWV0YSA9PT0gbnVsbCB8fCBtZXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXRhLmVycm9ycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgfHwgc3ViRXJyb3JMaXN0Lmxlbmd0aCkge1xuICAgICAgbWVyZ2VkVmFsaWRhdGVTdGF0dXMgPSAnZXJyb3InO1xuICAgIH0gZWxzZSBpZiAobWV0YSA9PT0gbnVsbCB8fCBtZXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXRhLnRvdWNoZWQpIHtcbiAgICAgIG1lcmdlZFZhbGlkYXRlU3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgIH1cblxuICAgIGlmIChkb21FcnJvclZpc2libGUgJiYgaGVscCkge1xuICAgICAgcHJldlZhbGlkYXRlU3RhdHVzUmVmLmN1cnJlbnQgPSBtZXJnZWRWYWxpZGF0ZVN0YXR1cztcbiAgICB9XG5cbiAgICB2YXIgaXRlbUNsYXNzTmFtZSA9IChfaXRlbUNsYXNzTmFtZSA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9pdGVtQ2xhc3NOYW1lLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIiksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9pdGVtQ2xhc3NOYW1lLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0td2l0aC1oZWxwXCIpLCBkb21FcnJvclZpc2libGUgfHwgaGVscCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2l0ZW1DbGFzc05hbWUsIFwiXCIuY29uY2F0KGNsYXNzTmFtZSksICEhY2xhc3NOYW1lKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfaXRlbUNsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWhhcy1mZWVkYmFja1wiKSwgbWVyZ2VkVmFsaWRhdGVTdGF0dXMgJiYgaGFzRmVlZGJhY2spLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9pdGVtQ2xhc3NOYW1lLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0taGFzLXN1Y2Nlc3NcIiksIG1lcmdlZFZhbGlkYXRlU3RhdHVzID09PSAnc3VjY2VzcycpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9pdGVtQ2xhc3NOYW1lLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0taGFzLXdhcm5pbmdcIiksIG1lcmdlZFZhbGlkYXRlU3RhdHVzID09PSAnd2FybmluZycpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9pdGVtQ2xhc3NOYW1lLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0taGFzLWVycm9yXCIpLCBtZXJnZWRWYWxpZGF0ZVN0YXR1cyA9PT0gJ2Vycm9yJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2l0ZW1DbGFzc05hbWUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1oYXMtZXJyb3ItbGVhdmVcIiksICFoZWxwICYmIGRvbUVycm9yVmlzaWJsZSAmJiBwcmV2VmFsaWRhdGVTdGF0dXNSZWYuY3VycmVudCA9PT0gJ2Vycm9yJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2l0ZW1DbGFzc05hbWUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1pcy12YWxpZGF0aW5nXCIpLCBtZXJnZWRWYWxpZGF0ZVN0YXR1cyA9PT0gJ3ZhbGlkYXRpbmcnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfaXRlbUNsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWhpZGRlblwiKSwgaGlkZGVuKSwgX2l0ZW1DbGFzc05hbWUpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDaGlsZHJlbiA9PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yb3dbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShpdGVtQ2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIGtleTogXCJyb3dcIlxuICAgIH0sICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKHJlc3RQcm9wcywgWydjb2xvbicsICdleHRyYScsICdnZXRWYWx1ZUZyb21FdmVudCcsICdnZXRWYWx1ZVByb3BzJywgJ2hhc0ZlZWRiYWNrJywgJ2hlbHAnLCAnaHRtbEZvcicsICdpZCcsICdpbml0aWFsVmFsdWUnLCAnaXNMaXN0RmllbGQnLCAnbGFiZWwnLCAnbGFiZWxBbGlnbicsICdsYWJlbENvbCcsICdub3JtYWxpemUnLCAncHJlc2VydmUnLCAncmVxdWlyZWQnLCAndmFsaWRhdGVGaXJzdCcsICd2YWxpZGF0ZVN0YXR1cycsICd2YWx1ZVByb3BOYW1lJywgJ3dyYXBwZXJDb2wnXSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRm9ybUl0ZW1MYWJlbFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBodG1sRm9yOiBmaWVsZElkLFxuICAgICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgICByZXF1aXJlZE1hcms6IHJlcXVpcmVkTWFya1xuICAgIH0sIHByb3BzLCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICAgIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Zvcm1JdGVtSW5wdXRbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoe30sIHByb3BzLCBtZXRhLCB7XG4gICAgICBlcnJvcnM6IG1lcmdlZEVycm9ycyxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgb25Eb21FcnJvclZpc2libGVDaGFuZ2U6IHNldERvbUVycm9yVmlzaWJsZSxcbiAgICAgIHZhbGlkYXRlU3RhdHVzOiBtZXJnZWRWYWxpZGF0ZVN0YXR1c1xuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29udGV4dC5Gb3JtSXRlbUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHVwZGF0ZUl0ZW1FcnJvcnM6IHVwZGF0ZUNoaWxkSXRlbUVycm9yc1xuICAgICAgfVxuICAgIH0sIGJhc2VDaGlsZHJlbikpKTtcbiAgfVxuXG4gIHZhciBpc1JlbmRlclByb3BzID0gdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nOyAvLyBSZWNvcmQgZm9yIHJlYWwgY29tcG9uZW50IHJlbmRlclxuXG4gIHZhciB1cGRhdGVSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gIHVwZGF0ZVJlZi5jdXJyZW50ICs9IDE7XG5cbiAgaWYgKCFoYXNOYW1lICYmICFpc1JlbmRlclByb3BzICYmICFkZXBlbmRlbmNpZXMpIHtcbiAgICByZXR1cm4gcmVuZGVyTGF5b3V0KGNoaWxkcmVuKTtcbiAgfVxuXG4gIHZhciB2YXJpYWJsZXMgPSB7fTtcblxuICBpZiAodHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJykge1xuICAgIHZhcmlhYmxlcy5sYWJlbCA9IGxhYmVsO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY0ZpZWxkRm9ybS5GaWVsZCwgKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKHt9LCBwcm9wcywge1xuICAgIG1lc3NhZ2VWYXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgIHZhbGlkYXRlVHJpZ2dlcjogbWVyZ2VkVmFsaWRhdGVUcmlnZ2VyLFxuICAgIG9uUmVzZXQ6IGZ1bmN0aW9uIG9uUmVzZXQoKSB7XG4gICAgICBzZXREb21FcnJvclZpc2libGUoZmFsc2UpO1xuICAgIH1cbiAgfSksIGZ1bmN0aW9uIChjb250cm9sLCBtZXRhLCBjb250ZXh0KSB7XG4gICAgdmFyIGVycm9ycyA9IG1ldGEuZXJyb3JzO1xuICAgIHZhciBtZXJnZWROYW1lID0gKDAsIF91dGlsLnRvQXJyYXkpKG5hbWUpLmxlbmd0aCAmJiBtZXRhID8gbWV0YS5uYW1lIDogW107XG4gICAgdmFyIGZpZWxkSWQgPSAoMCwgX3V0aWwuZ2V0RmllbGRJZCkobWVyZ2VkTmFtZSwgZm9ybU5hbWUpO1xuXG4gICAgaWYgKG5vU3R5bGUpIHtcbiAgICAgIG5hbWVSZWYuY3VycmVudCA9ICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkobWVyZ2VkTmFtZSk7XG5cbiAgICAgIGlmIChmaWVsZEtleSkge1xuICAgICAgICB2YXIgZmllbGRLZXlzID0gQXJyYXkuaXNBcnJheShmaWVsZEtleSkgPyBmaWVsZEtleSA6IFtmaWVsZEtleV07XG4gICAgICAgIG5hbWVSZWYuY3VycmVudCA9IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKG1lcmdlZE5hbWUuc2xpY2UoMCwgLTEpKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShmaWVsZEtleXMpKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlSXRlbUVycm9ycyhuYW1lUmVmLmN1cnJlbnQuam9pbignX19TUExJVF9fJyksIGVycm9ycyk7XG4gICAgfVxuXG4gICAgdmFyIGlzUmVxdWlyZWQgPSByZXF1aXJlZCAhPT0gdW5kZWZpbmVkID8gcmVxdWlyZWQgOiAhIShydWxlcyAmJiBydWxlcy5zb21lKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICBpZiAocnVsZSAmJiAoMCwgX3R5cGVvZjJbXCJkZWZhdWx0XCJdKShydWxlKSA9PT0gJ29iamVjdCcgJiYgcnVsZS5yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBydWxlRW50aXR5ID0gcnVsZShjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHJ1bGVFbnRpdHkgJiYgcnVsZUVudGl0eS5yZXF1aXJlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gQ2hpbGRyZW4gPT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHZhciBtZXJnZWRDb250cm9sID0gKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKHt9LCBjb250cm9sKTtcbiAgICB2YXIgY2hpbGROb2RlID0gbnVsbDtcbiAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghKHNob3VsZFVwZGF0ZSAmJiBkZXBlbmRlbmNpZXMpLCAnRm9ybS5JdGVtJywgXCJgc2hvdWxkVXBkYXRlYCBhbmQgYGRlcGVuZGVuY2llc2Agc2hvdWxkbid0IGJlIHVzZWQgdG9nZXRoZXIuIFNlZSBodHRwczovL2FudC5kZXNpZ24vY29tcG9uZW50cy9mb3JtLyNkZXBlbmRlbmNpZXMuXCIpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pICYmIGhhc05hbWUpIHtcbiAgICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKGZhbHNlLCAnRm9ybS5JdGVtJywgJ2BjaGlsZHJlbmAgaXMgYXJyYXkgb2YgcmVuZGVyIHByb3BzIGNhbm5vdCBoYXZlIGBuYW1lYC4nKTtcbiAgICAgIGNoaWxkTm9kZSA9IGNoaWxkcmVuO1xuICAgIH0gZWxzZSBpZiAoaXNSZW5kZXJQcm9wcyAmJiAoIShzaG91bGRVcGRhdGUgfHwgZGVwZW5kZW5jaWVzKSB8fCBoYXNOYW1lKSkge1xuICAgICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoISEoc2hvdWxkVXBkYXRlIHx8IGRlcGVuZGVuY2llcyksICdGb3JtLkl0ZW0nLCAnYGNoaWxkcmVuYCBvZiByZW5kZXIgcHJvcHMgb25seSB3b3JrIHdpdGggYHNob3VsZFVwZGF0ZWAgb3IgYGRlcGVuZGVuY2llc2AuJyk7XG4gICAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghaGFzTmFtZSwgJ0Zvcm0uSXRlbScsIFwiRG8gbm90IHVzZSBgbmFtZWAgd2l0aCBgY2hpbGRyZW5gIG9mIHJlbmRlciBwcm9wcyBzaW5jZSBpdCdzIG5vdCBhIGZpZWxkLlwiKTtcbiAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY2llcyAmJiAhaXNSZW5kZXJQcm9wcyAmJiAhaGFzTmFtZSkge1xuICAgICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoZmFsc2UsICdGb3JtLkl0ZW0nLCAnTXVzdCBzZXQgYG5hbWVgIG9yIHVzZSByZW5kZXIgcHJvcHMgd2hlbiBgZGVwZW5kZW5jaWVzYCBpcyBzZXQuJyk7XG4gICAgfSBlbHNlIGlmICgoMCwgX3JlYWN0Tm9kZS5pc1ZhbGlkRWxlbWVudCkoY2hpbGRyZW4pKSB7XG4gICAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKShjaGlsZHJlbi5wcm9wcy5kZWZhdWx0VmFsdWUgPT09IHVuZGVmaW5lZCwgJ0Zvcm0uSXRlbScsICdgZGVmYXVsdFZhbHVlYCB3aWxsIG5vdCB3b3JrIG9uIGNvbnRyb2xsZWQgRmllbGQuIFlvdSBzaG91bGQgdXNlIGBpbml0aWFsVmFsdWVzYCBvZiBGb3JtIGluc3RlYWQuJyk7XG4gICAgICB2YXIgY2hpbGRQcm9wcyA9ICgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoe30sIGNoaWxkcmVuLnByb3BzKSwgbWVyZ2VkQ29udHJvbCk7XG5cbiAgICAgIGlmICghY2hpbGRQcm9wcy5pZCkge1xuICAgICAgICBjaGlsZFByb3BzLmlkID0gZmllbGRJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKCgwLCBfcmVmMi5zdXBwb3J0UmVmKShjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRQcm9wcy5yZWYgPSBnZXRJdGVtUmVmKG1lcmdlZE5hbWUsIGNoaWxkcmVuKTtcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIGtlZXAgdXNlciBvcmlnaW4gZXZlbnQgaGFuZGxlclxuXG5cbiAgICAgIHZhciB0cmlnZ2VycyA9IG5ldyBTZXQoW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkoKDAsIF91dGlsLnRvQXJyYXkpKHRyaWdnZXIpKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKSgoMCwgX3V0aWwudG9BcnJheSkobWVyZ2VkVmFsaWRhdGVUcmlnZ2VyKSkpKTtcbiAgICAgIHRyaWdnZXJzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICBjaGlsZFByb3BzW2V2ZW50TmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIF9hMiwgX2MyO1xuXG4gICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG5cbiAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgKF9hID0gbWVyZ2VkQ29udHJvbFtldmVudE5hbWVdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9hMiA9IF9hKS5jYWxsLmFwcGx5KF9hMiwgW21lcmdlZENvbnRyb2xdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgKF9jID0gKF9iID0gY2hpbGRyZW4ucHJvcHMpW2V2ZW50TmFtZV0pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2MyID0gX2MpLmNhbGwuYXBwbHkoX2MyLCBbX2JdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbW9JbnB1dCwge1xuICAgICAgICB2YWx1ZTogbWVyZ2VkQ29udHJvbFtwcm9wcy52YWx1ZVByb3BOYW1lIHx8ICd2YWx1ZSddLFxuICAgICAgICB1cGRhdGU6IHVwZGF0ZVJlZi5jdXJyZW50XG4gICAgICB9LCAoMCwgX3JlYWN0Tm9kZS5jbG9uZUVsZW1lbnQpKGNoaWxkcmVuLCBjaGlsZFByb3BzKSk7XG4gICAgfSBlbHNlIGlmIChpc1JlbmRlclByb3BzICYmIChzaG91bGRVcGRhdGUgfHwgZGVwZW5kZW5jaWVzKSAmJiAhaGFzTmFtZSkge1xuICAgICAgY2hpbGROb2RlID0gY2hpbGRyZW4oY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKCFtZXJnZWROYW1lLmxlbmd0aCwgJ0Zvcm0uSXRlbScsICdgbmFtZWAgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0ZSBSZWFjdCBlbGVtZW50LiBJZiB5b3UgYXJlIHVzaW5nIEZvcm0uSXRlbSBhcyBsYXlvdXQgZGlzcGxheSwgcGxlYXNlIHJlbW92ZSBgbmFtZWAgaW5zdGVhZC4nKTtcbiAgICAgIGNoaWxkTm9kZSA9IGNoaWxkcmVuO1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJMYXlvdXQoY2hpbGROb2RlLCBmaWVsZElkLCBtZXRhLCBpc1JlcXVpcmVkKTtcbiAgfSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IEZvcm1JdGVtO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9Mb2FkaW5nT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Mb2FkaW5nT3V0bGluZWRcIikpO1xuXG52YXIgX0Nsb3NlQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIikpO1xuXG52YXIgX0NoZWNrQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2hlY2tDaXJjbGVGaWxsZWRcIikpO1xuXG52YXIgX0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvRXhjbGFtYXRpb25DaXJjbGVGaWxsZWRcIikpO1xuXG52YXIgX3VzZU1lbW8gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9ob29rcy91c2VNZW1vXCIpKTtcblxudmFyIF9yY01vdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLW1vdGlvblwiKSk7XG5cbnZhciBfY29sID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vZ3JpZC9jb2xcIikpO1xuXG52YXIgX2NvbnRleHQgPSByZXF1aXJlKFwiLi9jb250ZXh0XCIpO1xuXG52YXIgX3VzZUNhY2hlRXJyb3JzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlQ2FjaGVFcnJvcnNcIikpO1xuXG52YXIgX3VzZUZvcmNlVXBkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvaG9va3MvdXNlRm9yY2VVcGRhdGVcIikpO1xuXG52YXIgaWNvbk1hcCA9IHtcbiAgc3VjY2VzczogX0NoZWNrQ2lyY2xlRmlsbGVkW1wiZGVmYXVsdFwiXSxcbiAgd2FybmluZzogX0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkW1wiZGVmYXVsdFwiXSxcbiAgZXJyb3I6IF9DbG9zZUNpcmNsZUZpbGxlZFtcImRlZmF1bHRcIl0sXG4gIHZhbGlkYXRpbmc6IF9Mb2FkaW5nT3V0bGluZWRbXCJkZWZhdWx0XCJdXG59O1xuXG52YXIgRm9ybUl0ZW1JbnB1dCA9IGZ1bmN0aW9uIEZvcm1JdGVtSW5wdXQoX3JlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICB3cmFwcGVyQ29sID0gX3JlZi53cmFwcGVyQ29sLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgICAgaGVscCA9IF9yZWYuaGVscCxcbiAgICAgIGVycm9ycyA9IF9yZWYuZXJyb3JzLFxuICAgICAgb25Eb21FcnJvclZpc2libGVDaGFuZ2UgPSBfcmVmLm9uRG9tRXJyb3JWaXNpYmxlQ2hhbmdlLFxuICAgICAgaGFzRmVlZGJhY2sgPSBfcmVmLmhhc0ZlZWRiYWNrLFxuICAgICAgdmFsaWRhdGVTdGF0dXMgPSBfcmVmLnZhbGlkYXRlU3RhdHVzLFxuICAgICAgZXh0cmEgPSBfcmVmLmV4dHJhO1xuICB2YXIgZm9yY2VVcGRhdGUgPSAoMCwgX3VzZUZvcmNlVXBkYXRlW1wiZGVmYXVsdFwiXSkoKTtcbiAgdmFyIGJhc2VDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIik7XG4gIHZhciBmb3JtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbnRleHQuRm9ybUNvbnRleHQpO1xuICB2YXIgbWVyZ2VkV3JhcHBlckNvbCA9IHdyYXBwZXJDb2wgfHwgZm9ybUNvbnRleHQud3JhcHBlckNvbCB8fCB7fTtcbiAgdmFyIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KGJhc2VDbGFzc05hbWUsIFwiLWNvbnRyb2xcIiksIG1lcmdlZFdyYXBwZXJDb2wuY2xhc3NOYW1lKTtcblxuICB2YXIgX3VzZUNhY2hlRXJyb3JzID0gKDAsIF91c2VDYWNoZUVycm9yczNbXCJkZWZhdWx0XCJdKShlcnJvcnMsIGZ1bmN0aW9uIChjaGFuZ2VkVmlzaWJsZSkge1xuICAgIGlmIChjaGFuZ2VkVmlzaWJsZSkge1xuICAgICAgLyoqXG4gICAgICAgKiBXZSB0cmlnZ2VyIGluIHN5bmMgdG8gYXZvaWQgZG9tIHNoYWtpbmcgYnV0IHRoaXMgZ2V0IHdhcm5pbmcgaW4gcmVhY3QgMTYuMTMuXG4gICAgICAgKiBTbyB1c2UgUHJvbWlzZSB0byBrZWVwIGluIG1pY3JvIGFzeW5jIHRvIGhhbmRsZSB0aGlzLlxuICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjE2OTgjaXNzdWVjb21tZW50LTU5Mzc0MzQ4NVxuICAgICAgICovXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb25Eb21FcnJvclZpc2libGVDaGFuZ2UodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3JjZVVwZGF0ZSgpO1xuICB9LCAhIWhlbHApLFxuICAgICAgX3VzZUNhY2hlRXJyb3JzMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfdXNlQ2FjaGVFcnJvcnMsIDIpLFxuICAgICAgdmlzaWJsZSA9IF91c2VDYWNoZUVycm9yczJbMF0sXG4gICAgICBjYWNoZUVycm9ycyA9IF91c2VDYWNoZUVycm9yczJbMV07XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgb25Eb21FcnJvclZpc2libGVDaGFuZ2UoZmFsc2UpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIG1lbW9FcnJvcnMgPSAoMCwgX3VzZU1lbW9bXCJkZWZhdWx0XCJdKShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhY2hlRXJyb3JzO1xuICB9LCB2aXNpYmxlLCBmdW5jdGlvbiAoXywgbmV4dFZpc2libGUpIHtcbiAgICByZXR1cm4gbmV4dFZpc2libGU7XG4gIH0pOyAvLyBTaG91bGQgcHJvdmlkZXMgYWRkaXRpb25hbCBpY29uIGlmIGBoYXNGZWVkYmFja2BcblxuICB2YXIgSWNvbk5vZGUgPSB2YWxpZGF0ZVN0YXR1cyAmJiBpY29uTWFwW3ZhbGlkYXRlU3RhdHVzXTtcbiAgdmFyIGljb24gPSBoYXNGZWVkYmFjayAmJiBJY29uTm9kZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1jaGlsZHJlbi1pY29uXCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25Ob2RlLCBudWxsKSkgOiBudWxsOyAvLyBQYXNzIHRvIHN1YiBGb3JtSXRlbSBzaG91bGQgbm90IHdpdGggY29sIGluZm9cblxuICB2YXIgc3ViRm9ybUNvbnRleHQgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGZvcm1Db250ZXh0KTtcbiAgZGVsZXRlIHN1YkZvcm1Db250ZXh0LmxhYmVsQ29sO1xuICBkZWxldGUgc3ViRm9ybUNvbnRleHQud3JhcHBlckNvbDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb250ZXh0LkZvcm1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHN1YkZvcm1Db250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb2xbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIG1lcmdlZFdyYXBwZXJDb2wsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoYmFzZUNsYXNzTmFtZSwgXCItY29udHJvbC1pbnB1dFwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1jb250cm9sLWlucHV0LWNvbnRlbnRcIilcbiAgfSwgY2hpbGRyZW4pLCBpY29uKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjTW90aW9uW1wiZGVmYXVsdFwiXSwge1xuICAgIG1vdGlvbkRlYWRsaW5lOiA1MDAsXG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICBtb3Rpb25OYW1lOiBcInNob3ctaGVscFwiLFxuICAgIG9uTGVhdmVFbmQ6IGZ1bmN0aW9uIG9uTGVhdmVFbmQoKSB7XG4gICAgICBvbkRvbUVycm9yVmlzaWJsZUNoYW5nZShmYWxzZSk7XG4gICAgfSxcbiAgICBtb3Rpb25BcHBlYXI6IHRydWUsXG4gICAgcmVtb3ZlT25MZWF2ZTogdHJ1ZVxuICB9LCBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZjIuY2xhc3NOYW1lO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KGJhc2VDbGFzc05hbWUsIFwiLWV4cGxhaW5cIiksIG1vdGlvbkNsYXNzTmFtZSksXG4gICAgICBrZXk6IFwiaGVscFwiXG4gICAgfSwgbWVtb0Vycm9ycy5tYXAoZnVuY3Rpb24gKGVycm9yLCBpbmRleCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgICAgcm9sZTogXCJhbGVydFwiXG4gICAgICAgIH0sIGVycm9yKVxuICAgICAgKTtcbiAgICB9KSk7XG4gIH0pLCBleHRyYSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1leHRyYVwiKVxuICB9LCBleHRyYSkpKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IEZvcm1JdGVtSW5wdXQ7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2dyaWQvY29sXCIpKTtcblxudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4vY29udGV4dFwiKTtcblxudmFyIF9Mb2NhbGVSZWNlaXZlciA9IHJlcXVpcmUoXCIuLi9sb2NhbGUtcHJvdmlkZXIvTG9jYWxlUmVjZWl2ZXJcIik7XG5cbnZhciBfZGVmYXVsdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9sb2NhbGUvZGVmYXVsdFwiKSk7XG5cbnZhciBGb3JtSXRlbUxhYmVsID0gZnVuY3Rpb24gRm9ybUl0ZW1MYWJlbChfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIGxhYmVsID0gX3JlZi5sYWJlbCxcbiAgICAgIGh0bWxGb3IgPSBfcmVmLmh0bWxGb3IsXG4gICAgICBsYWJlbENvbCA9IF9yZWYubGFiZWxDb2wsXG4gICAgICBsYWJlbEFsaWduID0gX3JlZi5sYWJlbEFsaWduLFxuICAgICAgY29sb24gPSBfcmVmLmNvbG9uLFxuICAgICAgcmVxdWlyZWQgPSBfcmVmLnJlcXVpcmVkLFxuICAgICAgcmVxdWlyZWRNYXJrID0gX3JlZi5yZXF1aXJlZE1hcms7XG5cbiAgdmFyIF91c2VMb2NhbGVSZWNlaXZlciA9ICgwLCBfTG9jYWxlUmVjZWl2ZXIudXNlTG9jYWxlUmVjZWl2ZXIpKCdGb3JtJyksXG4gICAgICBfdXNlTG9jYWxlUmVjZWl2ZXIyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VMb2NhbGVSZWNlaXZlciwgMSksXG4gICAgICBmb3JtTG9jYWxlID0gX3VzZUxvY2FsZVJlY2VpdmVyMlswXTtcblxuICBpZiAoIWxhYmVsKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb250ZXh0LkZvcm1Db250ZXh0LkNvbnN1bWVyLCB7XG4gICAga2V5OiBcImxhYmVsXCJcbiAgfSwgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgdmFyIHZlcnRpY2FsID0gX3JlZjIudmVydGljYWwsXG4gICAgICAgIGNvbnRleHRMYWJlbEFsaWduID0gX3JlZjIubGFiZWxBbGlnbixcbiAgICAgICAgY29udGV4dExhYmVsQ29sID0gX3JlZjIubGFiZWxDb2wsXG4gICAgICAgIGNvbnRleHRDb2xvbiA9IF9yZWYyLmNvbG9uO1xuXG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIG1lcmdlZExhYmVsQ29sID0gbGFiZWxDb2wgfHwgY29udGV4dExhYmVsQ29sIHx8IHt9O1xuICAgIHZhciBtZXJnZWRMYWJlbEFsaWduID0gbGFiZWxBbGlnbiB8fCBjb250ZXh0TGFiZWxBbGlnbjtcbiAgICB2YXIgbGFiZWxDbHNCYXNpYyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1sYWJlbFwiKTtcbiAgICB2YXIgbGFiZWxDb2xDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShsYWJlbENsc0Jhc2ljLCBtZXJnZWRMYWJlbEFsaWduID09PSAnbGVmdCcgJiYgXCJcIi5jb25jYXQobGFiZWxDbHNCYXNpYywgXCItbGVmdFwiKSwgbWVyZ2VkTGFiZWxDb2wuY2xhc3NOYW1lKTtcbiAgICB2YXIgbGFiZWxDaGlsZHJlbiA9IGxhYmVsOyAvLyBLZWVwIGxhYmVsIGlzIG9yaWdpbmFsIHdoZXJlIHRoZXJlIHNob3VsZCBoYXZlIG5vIGNvbG9uXG5cbiAgICB2YXIgY29tcHV0ZWRDb2xvbiA9IGNvbG9uID09PSB0cnVlIHx8IGNvbnRleHRDb2xvbiAhPT0gZmFsc2UgJiYgY29sb24gIT09IGZhbHNlO1xuICAgIHZhciBoYXZlQ29sb24gPSBjb21wdXRlZENvbG9uICYmICF2ZXJ0aWNhbDsgLy8gUmVtb3ZlIGR1cGxpY2F0ZWQgdXNlciBpbnB1dCBjb2xvblxuXG4gICAgaWYgKGhhdmVDb2xvbiAmJiB0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnICYmIGxhYmVsLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIGxhYmVsQ2hpbGRyZW4gPSBsYWJlbC5yZXBsYWNlKC9bOnzvvJpdXFxzKiQvLCAnJyk7XG4gICAgfSAvLyBBZGQgcmVxdWlyZWQgbWFyayBpZiBvcHRpb25hbFxuXG5cbiAgICBpZiAocmVxdWlyZWRNYXJrID09PSAnb3B0aW9uYWwnICYmICFyZXF1aXJlZCkge1xuICAgICAgbGFiZWxDaGlsZHJlbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBsYWJlbENoaWxkcmVuLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1vcHRpb25hbFwiKVxuICAgICAgfSwgKGZvcm1Mb2NhbGUgPT09IG51bGwgfHwgZm9ybUxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybUxvY2FsZS5vcHRpb25hbCkgfHwgKChfYSA9IF9kZWZhdWx0MltcImRlZmF1bHRcIl0uRm9ybSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9wdGlvbmFsKSkpO1xuICAgIH1cblxuICAgIHZhciBsYWJlbENsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tcmVxdWlyZWRcIiksIHJlcXVpcmVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLXJlcXVpcmVkLW1hcmstb3B0aW9uYWxcIiksIHJlcXVpcmVkTWFyayA9PT0gJ29wdGlvbmFsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1uby1jb2xvblwiKSwgIWNvbXB1dGVkQ29sb24pLCBfY2xhc3NOYW1lcykpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29sW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBtZXJnZWRMYWJlbENvbCwge1xuICAgICAgY2xhc3NOYW1lOiBsYWJlbENvbENsYXNzTmFtZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIHtcbiAgICAgIGh0bWxGb3I6IGh0bWxGb3IsXG4gICAgICBjbGFzc05hbWU6IGxhYmVsQ2xhc3NOYW1lLFxuICAgICAgdGl0bGU6IHR5cGVvZiBsYWJlbCA9PT0gJ3N0cmluZycgPyBsYWJlbCA6ICcnXG4gICAgfSwgbGFiZWxDaGlsZHJlbikpO1xuICB9KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IEZvcm1JdGVtTGFiZWw7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY0ZpZWxkRm9ybSA9IHJlcXVpcmUoXCJyYy1maWVsZC1mb3JtXCIpO1xuXG52YXIgX2Rldldhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC9kZXZXYXJuaW5nXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBGb3JtTGlzdCA9IGZ1bmN0aW9uIEZvcm1MaXN0KF9hKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgICAgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCJdKTtcblxuICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghIXByb3BzLm5hbWUsICdGb3JtLkxpc3QnLCAnTWlzcyBgbmFtZWAgcHJvcC4nKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY0ZpZWxkRm9ybS5MaXN0LCBwcm9wcywgZnVuY3Rpb24gKGZpZWxkcywgb3BlcmF0aW9uKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuKGZpZWxkcy5tYXAoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICByZXR1cm4gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgZmllbGQpLCB7XG4gICAgICAgIGZpZWxkS2V5OiBmaWVsZC5rZXlcbiAgICAgIH0pO1xuICAgIH0pLCBvcGVyYXRpb24pO1xuICB9KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IEZvcm1MaXN0O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkZvcm1Qcm92aWRlciA9IGV4cG9ydHMuRm9ybUl0ZW1Db250ZXh0ID0gZXhwb3J0cy5Gb3JtQ29udGV4dCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfcmNGaWVsZEZvcm0gPSByZXF1aXJlKFwicmMtZmllbGQtZm9ybVwiKTtcblxudmFyIEZvcm1Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBsYWJlbEFsaWduOiAncmlnaHQnLFxuICB2ZXJ0aWNhbDogZmFsc2UsXG4gIGl0ZW1SZWY6IGZ1bmN0aW9uIGl0ZW1SZWYoKSB7fVxufSk7XG5leHBvcnRzLkZvcm1Db250ZXh0ID0gRm9ybUNvbnRleHQ7XG52YXIgRm9ybUl0ZW1Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICB1cGRhdGVJdGVtRXJyb3JzOiBmdW5jdGlvbiB1cGRhdGVJdGVtRXJyb3JzKCkge31cbn0pO1xuZXhwb3J0cy5Gb3JtSXRlbUNvbnRleHQgPSBGb3JtSXRlbUNvbnRleHQ7XG5cbnZhciBGb3JtUHJvdmlkZXIgPSBmdW5jdGlvbiBGb3JtUHJvdmlkZXIocHJvcHMpIHtcbiAgdmFyIHByb3ZpZGVyUHJvcHMgPSAoMCwgX29taXRbXCJkZWZhdWx0XCJdKShwcm9wcywgWydwcmVmaXhDbHMnXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNGaWVsZEZvcm0uRm9ybVByb3ZpZGVyLCBwcm92aWRlclByb3BzKTtcbn07XG5cbmV4cG9ydHMuRm9ybVByb3ZpZGVyID0gRm9ybVByb3ZpZGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdXNlQ2FjaGVFcnJvcnM7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXNlRm9yY2VVcGRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9fdXRpbC9ob29rcy91c2VGb3JjZVVwZGF0ZVwiKSk7XG5cbi8qKlxuICogQWx3YXlzIGRlYm91bmNlIGVycm9yIHRvIGF2b2lkIFtlcnJvciAtPiBudWxsIC0+IGVycm9yXSBibGlua1xuICovXG5mdW5jdGlvbiB1c2VDYWNoZUVycm9ycyhlcnJvcnMsIGNoYW5nZVRyaWdnZXIsIGRpcmVjdGx5KSB7XG4gIHZhciBjYWNoZVJlZiA9IFJlYWN0LnVzZVJlZih7XG4gICAgZXJyb3JzOiBlcnJvcnMsXG4gICAgdmlzaWJsZTogISFlcnJvcnMubGVuZ3RoXG4gIH0pO1xuICB2YXIgZm9yY2VVcGRhdGUgPSAoMCwgX3VzZUZvcmNlVXBkYXRlW1wiZGVmYXVsdFwiXSkoKTtcblxuICB2YXIgdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHZhciBwcmV2VmlzaWJsZSA9IGNhY2hlUmVmLmN1cnJlbnQudmlzaWJsZTtcbiAgICB2YXIgbmV3VmlzaWJsZSA9ICEhZXJyb3JzLmxlbmd0aDtcbiAgICB2YXIgcHJldkVycm9ycyA9IGNhY2hlUmVmLmN1cnJlbnQuZXJyb3JzO1xuICAgIGNhY2hlUmVmLmN1cnJlbnQuZXJyb3JzID0gZXJyb3JzO1xuICAgIGNhY2hlUmVmLmN1cnJlbnQudmlzaWJsZSA9IG5ld1Zpc2libGU7XG5cbiAgICBpZiAocHJldlZpc2libGUgIT09IG5ld1Zpc2libGUpIHtcbiAgICAgIGNoYW5nZVRyaWdnZXIobmV3VmlzaWJsZSk7XG4gICAgfSBlbHNlIGlmIChwcmV2RXJyb3JzLmxlbmd0aCAhPT0gZXJyb3JzLmxlbmd0aCB8fCBwcmV2RXJyb3JzLnNvbWUoZnVuY3Rpb24gKHByZXZFcnIsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcHJldkVyciAhPT0gZXJyb3JzW2luZGV4XTtcbiAgICB9KSkge1xuICAgICAgZm9yY2VVcGRhdGUoKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWRpcmVjdGx5KSB7XG4gICAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQodXBkYXRlLCAxMCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtlcnJvcnNdKTtcblxuICBpZiAoZGlyZWN0bHkpIHtcbiAgICB1cGRhdGUoKTtcbiAgfVxuXG4gIHJldHVybiBbY2FjaGVSZWYuY3VycmVudC52aXNpYmxlLCBjYWNoZVJlZi5jdXJyZW50LmVycm9yc107XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB1c2VGb3JtO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNGaWVsZEZvcm0gPSByZXF1aXJlKFwicmMtZmllbGQtZm9ybVwiKTtcblxudmFyIF9zY3JvbGxJbnRvVmlld0lmTmVlZGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwic2Nyb2xsLWludG8tdmlldy1pZi1uZWVkZWRcIikpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxuZnVuY3Rpb24gdG9OYW1lUGF0aFN0cihuYW1lKSB7XG4gIHZhciBuYW1lUGF0aCA9ICgwLCBfdXRpbC50b0FycmF5KShuYW1lKTtcbiAgcmV0dXJuIG5hbWVQYXRoLmpvaW4oJ18nKTtcbn1cblxuZnVuY3Rpb24gdXNlRm9ybShmb3JtKSB7XG4gIHZhciBfdXNlUmNGb3JtID0gKDAsIF9yY0ZpZWxkRm9ybS51c2VGb3JtKSgpLFxuICAgICAgX3VzZVJjRm9ybTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX3VzZVJjRm9ybSwgMSksXG4gICAgICByY0Zvcm0gPSBfdXNlUmNGb3JtMlswXTtcblxuICB2YXIgaXRlbXNSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICB2YXIgd3JhcEZvcm0gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZm9ybSB8fCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByY0Zvcm0pLCB7XG4gICAgICBfX0lOVEVSTkFMX186IHtcbiAgICAgICAgaXRlbVJlZjogZnVuY3Rpb24gaXRlbVJlZihuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICB2YXIgbmFtZVBhdGhTdHIgPSB0b05hbWVQYXRoU3RyKG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICBpdGVtc1JlZi5jdXJyZW50W25hbWVQYXRoU3RyXSA9IG5vZGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWxldGUgaXRlbXNSZWYuY3VycmVudFtuYW1lUGF0aFN0cl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNjcm9sbFRvRmllbGQ6IGZ1bmN0aW9uIHNjcm9sbFRvRmllbGQobmFtZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICAgIHZhciBuYW1lUGF0aCA9ICgwLCBfdXRpbC50b0FycmF5KShuYW1lKTtcbiAgICAgICAgdmFyIGZpZWxkSWQgPSAoMCwgX3V0aWwuZ2V0RmllbGRJZCkobmFtZVBhdGgsIHdyYXBGb3JtLl9fSU5URVJOQUxfXy5uYW1lKTtcbiAgICAgICAgdmFyIG5vZGUgPSBmaWVsZElkID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmllbGRJZCkgOiBudWxsO1xuXG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgKDAsIF9zY3JvbGxJbnRvVmlld0lmTmVlZGVkW1wiZGVmYXVsdFwiXSkobm9kZSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgICAgIHNjcm9sbE1vZGU6ICdpZi1uZWVkZWQnLFxuICAgICAgICAgICAgYmxvY2s6ICduZWFyZXN0J1xuICAgICAgICAgIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldEZpZWxkSW5zdGFuY2U6IGZ1bmN0aW9uIGdldEZpZWxkSW5zdGFuY2UobmFtZSkge1xuICAgICAgICB2YXIgbmFtZVBhdGhTdHIgPSB0b05hbWVQYXRoU3RyKG5hbWUpO1xuICAgICAgICByZXR1cm4gaXRlbXNSZWYuY3VycmVudFtuYW1lUGF0aFN0cl07XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtmb3JtLCByY0Zvcm1dKTtcbiAgcmV0dXJuIFt3cmFwRm9ybV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB1c2VGcmFtZVN0YXRlO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYWZcIikpO1xuXG5mdW5jdGlvbiB1c2VGcmFtZVN0YXRlKGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFZhbHVlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgZnJhbWVSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShudWxsKTtcbiAgdmFyIGJhdGNoUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoW10pO1xuICB2YXIgZGVzdHJveVJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKGZhbHNlKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZGVzdHJveVJlZi5jdXJyZW50ID0gdHJ1ZTtcblxuICAgICAgX3JhZltcImRlZmF1bHRcIl0uY2FuY2VsKGZyYW1lUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICBmdW5jdGlvbiBzZXRGcmFtZVZhbHVlKHVwZGF0ZXIpIHtcbiAgICBpZiAoZGVzdHJveVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZyYW1lUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGJhdGNoUmVmLmN1cnJlbnQgPSBbXTtcbiAgICAgIGZyYW1lUmVmLmN1cnJlbnQgPSAoMCwgX3JhZltcImRlZmF1bHRcIl0pKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnJhbWVSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgIHNldFZhbHVlKGZ1bmN0aW9uIChwcmV2VmFsdWUpIHtcbiAgICAgICAgICB2YXIgY3VycmVudCA9IHByZXZWYWx1ZTtcbiAgICAgICAgICBiYXRjaFJlZi5jdXJyZW50LmZvckVhY2goZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBmdW5jKGN1cnJlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGJhdGNoUmVmLmN1cnJlbnQucHVzaCh1cGRhdGVyKTtcbiAgfVxuXG4gIHJldHVybiBbdmFsdWUsIHNldEZyYW1lVmFsdWVdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdXNlSXRlbVJlZjtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JlZiA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yZWZcIik7XG5cbnZhciBfY29udGV4dCA9IHJlcXVpcmUoXCIuLi9jb250ZXh0XCIpO1xuXG5mdW5jdGlvbiB1c2VJdGVtUmVmKCkge1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb250ZXh0LkZvcm1Db250ZXh0KSxcbiAgICAgIGl0ZW1SZWYgPSBfUmVhY3QkdXNlQ29udGV4dC5pdGVtUmVmO1xuXG4gIHZhciBjYWNoZVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG5cbiAgZnVuY3Rpb24gZ2V0UmVmKG5hbWUsIGNoaWxkcmVuKSB7XG4gICAgdmFyIGNoaWxkcmVuUmVmID0gY2hpbGRyZW4gJiYgKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoY2hpbGRyZW4pID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbi5yZWY7XG4gICAgdmFyIG5hbWVTdHIgPSBuYW1lLmpvaW4oJ18nKTtcblxuICAgIGlmIChjYWNoZVJlZi5jdXJyZW50Lm5hbWUgIT09IG5hbWVTdHIgfHwgY2FjaGVSZWYuY3VycmVudC5vcmlnaW5SZWYgIT09IGNoaWxkcmVuUmVmKSB7XG4gICAgICBjYWNoZVJlZi5jdXJyZW50Lm5hbWUgPSBuYW1lU3RyO1xuICAgICAgY2FjaGVSZWYuY3VycmVudC5vcmlnaW5SZWYgPSBjaGlsZHJlblJlZjtcbiAgICAgIGNhY2hlUmVmLmN1cnJlbnQucmVmID0gKDAsIF9yZWYuY29tcG9zZVJlZikoaXRlbVJlZihuYW1lKSwgY2hpbGRyZW5SZWYpO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZVJlZi5jdXJyZW50LnJlZjtcbiAgfVxuXG4gIHJldHVybiBnZXRSZWY7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfRm9ybSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL0Zvcm1cIikpO1xuXG52YXIgX0Zvcm1JdGVtID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Gb3JtSXRlbVwiKSk7XG5cbnZhciBfRm9ybUxpc3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0Zvcm1MaXN0XCIpKTtcblxudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4vY29udGV4dFwiKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBGb3JtID0gX0Zvcm1bXCJkZWZhdWx0XCJdO1xuRm9ybS5JdGVtID0gX0Zvcm1JdGVtW1wiZGVmYXVsdFwiXTtcbkZvcm0uTGlzdCA9IF9Gb3JtTGlzdFtcImRlZmF1bHRcIl07XG5Gb3JtLnVzZUZvcm0gPSBfRm9ybS51c2VGb3JtO1xuRm9ybS5Qcm92aWRlciA9IF9jb250ZXh0LkZvcm1Qcm92aWRlcjtcblxuRm9ybS5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKGZhbHNlLCAnRm9ybScsICdhbnRkIHY0IHJlbW92ZWQgYEZvcm0uY3JlYXRlYC4gUGxlYXNlIHJlbW92ZSBvciB1c2UgYEBhbnQtZGVzaWduL2NvbXBhdGlibGVgIGluc3RlYWQuJyk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBGb3JtO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7XG5leHBvcnRzLmdldEZpZWxkSWQgPSBnZXRGaWVsZElkO1xuXG5mdW5jdGlvbiB0b0FycmF5KGNhbmRpZGF0ZSkge1xuICBpZiAoY2FuZGlkYXRlID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlID09PSBmYWxzZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShjYW5kaWRhdGUpID8gY2FuZGlkYXRlIDogW2NhbmRpZGF0ZV07XG59XG5cbmZ1bmN0aW9uIGdldEZpZWxkSWQobmFtZVBhdGgsIGZvcm1OYW1lKSB7XG4gIGlmICghbmFtZVBhdGgubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICB2YXIgbWVyZ2VkSWQgPSBuYW1lUGF0aC5qb2luKCdfJyk7XG4gIHJldHVybiBmb3JtTmFtZSA/IFwiXCIuY29uY2F0KGZvcm1OYW1lLCBcIl9cIikuY29uY2F0KG1lcmdlZElkKSA6IG1lcmdlZElkO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbnZhciBSb3dDb250ZXh0ID0gLyojX19QVVJFX18qLygwLCBfcmVhY3QuY3JlYXRlQ29udGV4dCkoe30pO1xudmFyIF9kZWZhdWx0ID0gUm93Q29udGV4dDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX1Jvd0NvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1Jvd0NvbnRleHRcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlRmxleChmbGV4KSB7XG4gIGlmICh0eXBlb2YgZmxleCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoZmxleCwgXCIgXCIpLmNvbmNhdChmbGV4LCBcIiBhdXRvXCIpO1xuICB9XG5cbiAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8ZW18cmVtfCUpJC8udGVzdChmbGV4KSkge1xuICAgIHJldHVybiBcIjAgMCBcIi5jb25jYXQoZmxleCk7XG4gIH1cblxuICByZXR1cm4gZmxleDtcbn1cblxudmFyIENvbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciByZW5kZXJDb2wgPSBmdW5jdGlvbiByZW5kZXJDb2woX3JlZikge1xuICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscyxcbiAgICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb247XG5cbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBzcGFuID0gcHJvcHMuc3BhbixcbiAgICAgICAgb3JkZXIgPSBwcm9wcy5vcmRlcixcbiAgICAgICAgb2Zmc2V0ID0gcHJvcHMub2Zmc2V0LFxuICAgICAgICBwdXNoID0gcHJvcHMucHVzaCxcbiAgICAgICAgcHVsbCA9IHByb3BzLnB1bGwsXG4gICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgZmxleCA9IHByb3BzLmZsZXgsXG4gICAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwic3BhblwiLCBcIm9yZGVyXCIsIFwib2Zmc2V0XCIsIFwicHVzaFwiLCBcInB1bGxcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcImZsZXhcIiwgXCJzdHlsZVwiXSk7XG5cbiAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdjb2wnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBzaXplQ2xhc3NPYmogPSB7fTtcbiAgICBbJ3hzJywgJ3NtJywgJ21kJywgJ2xnJywgJ3hsJywgJ3h4bCddLmZvckVhY2goZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgIHZhciBzaXplUHJvcHMgPSB7fTtcbiAgICAgIHZhciBwcm9wU2l6ZSA9IHByb3BzW3NpemVdO1xuXG4gICAgICBpZiAodHlwZW9mIHByb3BTaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICBzaXplUHJvcHMuc3BhbiA9IHByb3BTaXplO1xuICAgICAgfSBlbHNlIGlmICgoMCwgX3R5cGVvZjJbXCJkZWZhdWx0XCJdKShwcm9wU2l6ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHNpemVQcm9wcyA9IHByb3BTaXplIHx8IHt9O1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgb3RoZXJzW3NpemVdO1xuICAgICAgc2l6ZUNsYXNzT2JqID0gKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSh7fSwgc2l6ZUNsYXNzT2JqKSwgKF9leHRlbmRzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9leHRlbmRzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemUsIFwiLVwiKS5jb25jYXQoc2l6ZVByb3BzLnNwYW4pLCBzaXplUHJvcHMuc3BhbiAhPT0gdW5kZWZpbmVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfZXh0ZW5kczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplLCBcIi1vcmRlci1cIikuY29uY2F0KHNpemVQcm9wcy5vcmRlciksIHNpemVQcm9wcy5vcmRlciB8fCBzaXplUHJvcHMub3JkZXIgPT09IDApLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9leHRlbmRzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemUsIFwiLW9mZnNldC1cIikuY29uY2F0KHNpemVQcm9wcy5vZmZzZXQpLCBzaXplUHJvcHMub2Zmc2V0IHx8IHNpemVQcm9wcy5vZmZzZXQgPT09IDApLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9leHRlbmRzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemUsIFwiLXB1c2gtXCIpLmNvbmNhdChzaXplUHJvcHMucHVzaCksIHNpemVQcm9wcy5wdXNoIHx8IHNpemVQcm9wcy5wdXNoID09PSAwKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfZXh0ZW5kczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplLCBcIi1wdWxsLVwiKS5jb25jYXQoc2l6ZVByb3BzLnB1bGwpLCBzaXplUHJvcHMucHVsbCB8fCBzaXplUHJvcHMucHVsbCA9PT0gMCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9leHRlbmRzMikpO1xuICAgIH0pO1xuICAgIHZhciBjbGFzc2VzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNwYW4pLCBzcGFuICE9PSB1bmRlZmluZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9yZGVyLVwiKS5jb25jYXQob3JkZXIpLCBvcmRlciksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb2Zmc2V0LVwiKS5jb25jYXQob2Zmc2V0KSwgb2Zmc2V0KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wdXNoLVwiKS5jb25jYXQocHVzaCksIHB1c2gpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXB1bGwtXCIpLmNvbmNhdChwdWxsKSwgcHVsbCksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lLCBzaXplQ2xhc3NPYmopO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUm93Q29udGV4dFtcImRlZmF1bHRcIl0uQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIGd1dHRlciA9IF9yZWYyLmd1dHRlcjtcbiAgICAgIHZhciBtZXJnZWRTdHlsZSA9ICgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSh7fSwgc3R5bGUpO1xuXG4gICAgICBpZiAoZ3V0dGVyKSB7XG4gICAgICAgIG1lcmdlZFN0eWxlID0gKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoe30sIGd1dHRlclswXSA+IDAgPyB7XG4gICAgICAgICAgcGFkZGluZ0xlZnQ6IGd1dHRlclswXSAvIDIsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiBndXR0ZXJbMF0gLyAyXG4gICAgICAgIH0gOiB7fSksIGd1dHRlclsxXSA+IDAgPyB7XG4gICAgICAgICAgcGFkZGluZ1RvcDogZ3V0dGVyWzFdIC8gMixcbiAgICAgICAgICBwYWRkaW5nQm90dG9tOiBndXR0ZXJbMV0gLyAyXG4gICAgICAgIH0gOiB7fSksIG1lcmdlZFN0eWxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZsZXgpIHtcbiAgICAgICAgbWVyZ2VkU3R5bGUuZmxleCA9IHBhcnNlRmxleChmbGV4KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsICgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSh7fSwgb3RoZXJzLCB7XG4gICAgICAgIHN0eWxlOiBtZXJnZWRTdHlsZSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgICByZWY6IHJlZlxuICAgICAgfSksIGNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCByZW5kZXJDb2wpO1xufSk7XG5Db2wuZGlzcGxheU5hbWUgPSAnQ29sJztcbnZhciBfZGVmYXVsdCA9IENvbDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX3Jlc3BvbnNpdmVPYnNlcnZlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vX3V0aWwvcmVzcG9uc2l2ZU9ic2VydmVcIikpO1xuXG5mdW5jdGlvbiB1c2VCcmVha3BvaW50KCkge1xuICB2YXIgX3VzZVN0YXRlID0gKDAsIF9yZWFjdC51c2VTdGF0ZSkoe30pLFxuICAgICAgX3VzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfdXNlU3RhdGUsIDIpLFxuICAgICAgc2NyZWVucyA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTY3JlZW5zID0gX3VzZVN0YXRlMlsxXTtcblxuICAoMCwgX3JlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0b2tlbiA9IF9yZXNwb25zaXZlT2JzZXJ2ZVtcImRlZmF1bHRcIl0uc3Vic2NyaWJlKGZ1bmN0aW9uIChzdXBwb3J0U2NyZWVucykge1xuICAgICAgc2V0U2NyZWVucyhzdXBwb3J0U2NyZWVucyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF9yZXNwb25zaXZlT2JzZXJ2ZVtcImRlZmF1bHRcIl0udW5zdWJzY3JpYmUodG9rZW4pO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIHNjcmVlbnM7XG59XG5cbnZhciBfZGVmYXVsdCA9IHVzZUJyZWFrcG9pbnQ7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJvd1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcm93W1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2xcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NvbFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfcm93ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9yb3dcIikpO1xuXG52YXIgX2NvbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY29sXCIpKTtcblxudmFyIF91c2VCcmVha3BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VCcmVha3BvaW50XCIpKTtcblxudmFyIF9kZWZhdWx0ID0ge1xuICB1c2VCcmVha3BvaW50OiBfdXNlQnJlYWtwb2ludFtcImRlZmF1bHRcIl1cbn07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX1Jvd0NvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1Jvd0NvbnRleHRcIikpO1xuXG52YXIgX3R5cGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvdHlwZVwiKTtcblxudmFyIF9yZXNwb25zaXZlT2JzZXJ2ZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuLi9fdXRpbC9yZXNwb25zaXZlT2JzZXJ2ZVwiKSk7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgUm93QWxpZ25zID0gKDAsIF90eXBlLnR1cGxlKSgndG9wJywgJ21pZGRsZScsICdib3R0b20nLCAnc3RyZXRjaCcpO1xudmFyIFJvd0p1c3RpZnkgPSAoMCwgX3R5cGUudHVwbGUpKCdzdGFydCcsICdlbmQnLCAnY2VudGVyJywgJ3NwYWNlLWFyb3VuZCcsICdzcGFjZS1iZXR3ZWVuJyk7XG52YXIgUm93ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICB4czogdHJ1ZSxcbiAgICBzbTogdHJ1ZSxcbiAgICBtZDogdHJ1ZSxcbiAgICBsZzogdHJ1ZSxcbiAgICB4bDogdHJ1ZSxcbiAgICB4eGw6IHRydWVcbiAgfSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBzY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFNjcmVlbnMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBndXR0ZXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgZ3V0dGVyUmVmLmN1cnJlbnQgPSBwcm9wcy5ndXR0ZXI7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRva2VuID0gX3Jlc3BvbnNpdmVPYnNlcnZlW1wiZGVmYXVsdFwiXS5zdWJzY3JpYmUoZnVuY3Rpb24gKHNjcmVlbikge1xuICAgICAgdmFyIGN1cnJlbnRHdXR0ZXIgPSBndXR0ZXJSZWYuY3VycmVudCB8fCAwO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudEd1dHRlcikgJiYgKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoY3VycmVudEd1dHRlcikgPT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoY3VycmVudEd1dHRlcikgJiYgKCgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKGN1cnJlbnRHdXR0ZXJbMF0pID09PSAnb2JqZWN0JyB8fCAoMCwgX3R5cGVvZjJbXCJkZWZhdWx0XCJdKShjdXJyZW50R3V0dGVyWzFdKSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgIHNldFNjcmVlbnMoc2NyZWVuKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBfcmVzcG9uc2l2ZU9ic2VydmVbXCJkZWZhdWx0XCJdLnVuc3Vic2NyaWJlKHRva2VuKTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdmFyIGdldEd1dHRlciA9IGZ1bmN0aW9uIGdldEd1dHRlcigpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFswLCAwXTtcbiAgICB2YXIgX3Byb3BzJGd1dHRlciA9IHByb3BzLmd1dHRlcixcbiAgICAgICAgZ3V0dGVyID0gX3Byb3BzJGd1dHRlciA9PT0gdm9pZCAwID8gMCA6IF9wcm9wcyRndXR0ZXI7XG4gICAgdmFyIG5vcm1hbGl6ZWRHdXR0ZXIgPSBBcnJheS5pc0FycmF5KGd1dHRlcikgPyBndXR0ZXIgOiBbZ3V0dGVyLCAwXTtcbiAgICBub3JtYWxpemVkR3V0dGVyLmZvckVhY2goZnVuY3Rpb24gKGcsIGluZGV4KSB7XG4gICAgICBpZiAoKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoZykgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3Jlc3BvbnNpdmVPYnNlcnZlLnJlc3BvbnNpdmVBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBicmVha3BvaW50ID0gX3Jlc3BvbnNpdmVPYnNlcnZlLnJlc3BvbnNpdmVBcnJheVtpXTtcblxuICAgICAgICAgIGlmIChzY3JlZW5zW2JyZWFrcG9pbnRdICYmIGdbYnJlYWtwb2ludF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBnW2JyZWFrcG9pbnRdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGcgfHwgMDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICB2YXIgcmVuZGVyUm93ID0gZnVuY3Rpb24gcmVuZGVyUm93KF9yZWYpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHMsXG4gICAgICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uO1xuXG4gICAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgICAganVzdGlmeSA9IHByb3BzLmp1c3RpZnksXG4gICAgICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgb3RoZXJzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJqdXN0aWZ5XCIsIFwiYWxpZ25cIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImNoaWxkcmVuXCJdKTtcblxuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3JvdycsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgdmFyIGd1dHRlciA9IGdldEd1dHRlcigpO1xuICAgIHZhciBjbGFzc2VzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGp1c3RpZnkpLCBqdXN0aWZ5KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGFsaWduKSwgYWxpZ24pLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgICB2YXIgcm93U3R5bGUgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgZ3V0dGVyWzBdID4gMCA/IHtcbiAgICAgIG1hcmdpbkxlZnQ6IGd1dHRlclswXSAvIC0yLFxuICAgICAgbWFyZ2luUmlnaHQ6IGd1dHRlclswXSAvIC0yXG4gICAgfSA6IHt9KSwgZ3V0dGVyWzFdID4gMCA/IHtcbiAgICAgIG1hcmdpblRvcDogZ3V0dGVyWzFdIC8gLTIsXG4gICAgICBtYXJnaW5Cb3R0b206IGd1dHRlclsxXSAvIDJcbiAgICB9IDoge30pLCBzdHlsZSk7XG4gICAgdmFyIG90aGVyUHJvcHMgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIG90aGVycyk7XG4gICAgZGVsZXRlIG90aGVyUHJvcHMuZ3V0dGVyO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUm93Q29udGV4dFtcImRlZmF1bHRcIl0uUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIGd1dHRlcjogZ3V0dGVyXG4gICAgICB9XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBvdGhlclByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICBzdHlsZTogcm93U3R5bGUsXG4gICAgICByZWY6IHJlZlxuICAgIH0pLCBjaGlsZHJlbikpO1xuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIHJlbmRlclJvdyk7XG59KTtcblJvdy5kaXNwbGF5TmFtZSA9ICdSb3cnO1xudmFyIF9kZWZhdWx0ID0gUm93O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNJbWFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLWltYWdlXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgSW1hZ2UgPSBmdW5jdGlvbiBJbWFnZShfYSkge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgb3RoZXJQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbWFnZScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNJbWFnZVtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSwgb3RoZXJQcm9wcykpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gSW1hZ2U7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcmNJbnB1dE51bWJlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLWlucHV0LW51bWJlclwiKSk7XG5cbnZhciBfVXBPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1VwT3V0bGluZWRcIikpO1xuXG52YXIgX0Rvd25PdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Rvd25PdXRsaW5lZFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX1NpemVDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0XCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBJbnB1dE51bWJlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciByZW5kZXJJbnB1dE51bWJlciA9IGZ1bmN0aW9uIHJlbmRlcklucHV0TnVtYmVyKF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHMsXG4gICAgICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uO1xuXG4gICAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY3VzdG9taXplU2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgICAgcmVhZE9ubHkgPSBwcm9wcy5yZWFkT25seSxcbiAgICAgICAgb3RoZXJzID0gX19yZXN0KHByb3BzLCBbXCJjbGFzc05hbWVcIiwgXCJzaXplXCIsIFwicHJlZml4Q2xzXCIsIFwicmVhZE9ubHlcIl0pO1xuXG4gICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnaW5wdXQtbnVtYmVyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICB2YXIgdXBJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1VwT3V0bGluZWRbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlci11cC1pbm5lclwiKVxuICAgIH0pO1xuICAgIHZhciBkb3duSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Eb3duT3V0bGluZWRbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlci1kb3duLWlubmVyXCIpXG4gICAgfSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TaXplQ29udGV4dFtcImRlZmF1bHRcIl0uQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgIHZhciBtZXJnZVNpemUgPSBjdXN0b21pemVTaXplIHx8IHNpemU7XG4gICAgICB2YXIgaW5wdXROdW1iZXJDbGFzcyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxnXCIpLCBtZXJnZVNpemUgPT09ICdsYXJnZScpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtXCIpLCBtZXJnZVNpemUgPT09ICdzbWFsbCcpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcmVhZG9ubHlcIiksIHJlYWRPbmx5KSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY0lucHV0TnVtYmVyW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgcmVmOiByZWYsXG4gICAgICAgIGNsYXNzTmFtZTogaW5wdXROdW1iZXJDbGFzcyxcbiAgICAgICAgdXBIYW5kbGVyOiB1cEljb24sXG4gICAgICAgIGRvd25IYW5kbGVyOiBkb3duSWNvbixcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIHJlYWRPbmx5OiByZWFkT25seVxuICAgICAgfSwgb3RoZXJzKSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgcmVuZGVySW5wdXROdW1iZXIpO1xufSk7XG5JbnB1dE51bWJlci5kZWZhdWx0UHJvcHMgPSB7XG4gIHN0ZXA6IDFcbn07XG52YXIgX2RlZmF1bHQgPSBJbnB1dE51bWJlcjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5oYXNQcmVmaXhTdWZmaXggPSBoYXNQcmVmaXhTdWZmaXg7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfQ2xvc2VDaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfdHlwZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC90eXBlXCIpO1xuXG52YXIgX0lucHV0ID0gcmVxdWlyZShcIi4vSW5wdXRcIik7XG5cbnZhciBfcmVhY3ROb2RlID0gcmVxdWlyZShcIi4uL191dGlsL3JlYWN0Tm9kZVwiKTtcblxudmFyIENsZWFyYWJsZUlucHV0VHlwZSA9ICgwLCBfdHlwZS50dXBsZSkoJ3RleHQnLCAnaW5wdXQnKTtcblxuZnVuY3Rpb24gaGFzUHJlZml4U3VmZml4KHByb3BzKSB7XG4gIHJldHVybiAhIShwcm9wcy5wcmVmaXggfHwgcHJvcHMuc3VmZml4IHx8IHByb3BzLmFsbG93Q2xlYXIpO1xufVxuXG52YXIgQ2xlYXJhYmxlTGFiZWxlZElucHV0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoQ2xlYXJhYmxlTGFiZWxlZElucHV0LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShDbGVhcmFibGVMYWJlbGVkSW5wdXQpO1xuXG4gIGZ1bmN0aW9uIENsZWFyYWJsZUxhYmVsZWRJbnB1dCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIENsZWFyYWJsZUxhYmVsZWRJbnB1dCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAvKiogQHByaXZhdGUgRG8gbm90IHVzZSBvdXQgb2YgdGhpcyBjbGFzcy4gV2UgZG8gbm90IHByb21pc2UgdGhpcyBpcyBhbHdheXMga2VlcC4gKi9cblxuICAgIF90aGlzLmNvbnRhaW5lclJlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcblxuICAgIF90aGlzLm9uSW5wdXRNb3VzZVVwID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgaWYgKChfYSA9IF90aGlzLmNvbnRhaW5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGFpbnMoZS50YXJnZXQpKSB7XG4gICAgICAgIHZhciB0cmlnZ2VyRm9jdXMgPSBfdGhpcy5wcm9wcy50cmlnZ2VyRm9jdXM7XG4gICAgICAgIHRyaWdnZXJGb2N1cygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKENsZWFyYWJsZUxhYmVsZWRJbnB1dCwgW3tcbiAgICBrZXk6IFwicmVuZGVyQ2xlYXJJY29uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckNsZWFySWNvbihwcmVmaXhDbHMpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgYWxsb3dDbGVhciA9IF90aGlzJHByb3BzLmFsbG93Q2xlYXIsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy52YWx1ZSxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzLmRpc2FibGVkLFxuICAgICAgICAgIHJlYWRPbmx5ID0gX3RoaXMkcHJvcHMucmVhZE9ubHksXG4gICAgICAgICAgaW5wdXRUeXBlID0gX3RoaXMkcHJvcHMuaW5wdXRUeXBlLFxuICAgICAgICAgIGhhbmRsZVJlc2V0ID0gX3RoaXMkcHJvcHMuaGFuZGxlUmVzZXQ7XG5cbiAgICAgIGlmICghYWxsb3dDbGVhcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIG5lZWRDbGVhciA9ICFkaXNhYmxlZCAmJiAhcmVhZE9ubHkgJiYgdmFsdWU7XG4gICAgICB2YXIgY2xhc3NOYW1lID0gaW5wdXRUeXBlID09PSBDbGVhcmFibGVJbnB1dFR5cGVbMF0gPyBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRleHRhcmVhLWNsZWFyLWljb25cIikgOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsZWFyLWljb25cIik7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlQ2lyY2xlRmlsbGVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICBvbkNsaWNrOiBoYW5kbGVSZXNldCxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChjbGFzc05hbWUsIFwiLWhpZGRlblwiKSwgIW5lZWRDbGVhciksIGNsYXNzTmFtZSksXG4gICAgICAgIHJvbGU6IFwiYnV0dG9uXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJTdWZmaXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyU3VmZml4KHByZWZpeENscykge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgc3VmZml4ID0gX3RoaXMkcHJvcHMyLnN1ZmZpeCxcbiAgICAgICAgICBhbGxvd0NsZWFyID0gX3RoaXMkcHJvcHMyLmFsbG93Q2xlYXI7XG5cbiAgICAgIGlmIChzdWZmaXggfHwgYWxsb3dDbGVhcikge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VmZml4XCIpXG4gICAgICAgIH0sIHRoaXMucmVuZGVyQ2xlYXJJY29uKHByZWZpeENscyksIHN1ZmZpeCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJMYWJlbGVkSWNvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJMYWJlbGVkSWNvbihwcmVmaXhDbHMsIGVsZW1lbnQpIHtcbiAgICAgIHZhciBfY2xhc3NOYW1lczI7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGZvY3VzZWQgPSBfdGhpcyRwcm9wczMuZm9jdXNlZCxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHByb3BzMy52YWx1ZSxcbiAgICAgICAgICBwcmVmaXggPSBfdGhpcyRwcm9wczMucHJlZml4LFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMy5jbGFzc05hbWUsXG4gICAgICAgICAgc2l6ZSA9IF90aGlzJHByb3BzMy5zaXplLFxuICAgICAgICAgIHN1ZmZpeCA9IF90aGlzJHByb3BzMy5zdWZmaXgsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczMuZGlzYWJsZWQsXG4gICAgICAgICAgYWxsb3dDbGVhciA9IF90aGlzJHByb3BzMy5hbGxvd0NsZWFyLFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzMy5kaXJlY3Rpb24sXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczMuc3R5bGUsXG4gICAgICAgICAgcmVhZE9ubHkgPSBfdGhpcyRwcm9wczMucmVhZE9ubHksXG4gICAgICAgICAgYm9yZGVyZWQgPSBfdGhpcyRwcm9wczMuYm9yZGVyZWQ7XG4gICAgICB2YXIgc3VmZml4Tm9kZSA9IHRoaXMucmVuZGVyU3VmZml4KHByZWZpeENscyk7XG5cbiAgICAgIGlmICghaGFzUHJlZml4U3VmZml4KHRoaXMucHJvcHMpKSB7XG4gICAgICAgIHJldHVybiAoMCwgX3JlYWN0Tm9kZS5jbG9uZUVsZW1lbnQpKGVsZW1lbnQsIHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcmVmaXhOb2RlID0gcHJlZml4ID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXByZWZpeFwiKVxuICAgICAgfSwgcHJlZml4KSA6IG51bGw7XG4gICAgICB2YXIgYWZmaXhXcmFwcGVyQ2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyXCIpLCAoX2NsYXNzTmFtZXMyID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItZm9jdXNlZFwiKSwgZm9jdXNlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWZmaXgtd3JhcHBlci1zbVwiKSwgc2l6ZSA9PT0gJ3NtYWxsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItbGdcIiksIHNpemUgPT09ICdsYXJnZScpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyLWlucHV0LXdpdGgtY2xlYXItYnRuXCIpLCBzdWZmaXggJiYgYWxsb3dDbGVhciAmJiB2YWx1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWZmaXgtd3JhcHBlci1yZWFkb25seVwiKSwgcmVhZE9ubHkpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyLWJvcmRlcmxlc3NcIiksICFib3JkZXJlZCksIF9jbGFzc05hbWVzMiksIGNsYXNzTmFtZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgcmVmOiB0aGlzLmNvbnRhaW5lclJlZixcbiAgICAgICAgY2xhc3NOYW1lOiBhZmZpeFdyYXBwZXJDbHMsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgb25Nb3VzZVVwOiB0aGlzLm9uSW5wdXRNb3VzZVVwXG4gICAgICB9LCBwcmVmaXhOb2RlLCAoMCwgX3JlYWN0Tm9kZS5jbG9uZUVsZW1lbnQpKGVsZW1lbnQsIHtcbiAgICAgICAgc3R5bGU6IG51bGwsXG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX0lucHV0LmdldElucHV0Q2xhc3NOYW1lKShwcmVmaXhDbHMsIGJvcmRlcmVkLCBzaXplLCBkaXNhYmxlZClcbiAgICAgIH0pLCBzdWZmaXhOb2RlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVySW5wdXRXaXRoTGFiZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVySW5wdXRXaXRoTGFiZWwocHJlZml4Q2xzLCBsYWJlbGVkRWxlbWVudCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzMywgX2NsYXNzTmFtZXM0O1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBhZGRvbkJlZm9yZSA9IF90aGlzJHByb3BzNC5hZGRvbkJlZm9yZSxcbiAgICAgICAgICBhZGRvbkFmdGVyID0gX3RoaXMkcHJvcHM0LmFkZG9uQWZ0ZXIsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczQuc3R5bGUsXG4gICAgICAgICAgc2l6ZSA9IF90aGlzJHByb3BzNC5zaXplLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzNC5jbGFzc05hbWUsXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3RoaXMkcHJvcHM0LmRpcmVjdGlvbjsgLy8gTm90IHdyYXAgd2hlbiB0aGVyZSBpcyBub3QgYWRkb25zXG5cbiAgICAgIGlmICghYWRkb25CZWZvcmUgJiYgIWFkZG9uQWZ0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGxhYmVsZWRFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB2YXIgd3JhcHBlckNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXBcIik7XG4gICAgICB2YXIgYWRkb25DbGFzc05hbWUgPSBcIlwiLmNvbmNhdCh3cmFwcGVyQ2xhc3NOYW1lLCBcIi1hZGRvblwiKTtcbiAgICAgIHZhciBhZGRvbkJlZm9yZU5vZGUgPSBhZGRvbkJlZm9yZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYWRkb25DbGFzc05hbWVcbiAgICAgIH0sIGFkZG9uQmVmb3JlKSA6IG51bGw7XG4gICAgICB2YXIgYWRkb25BZnRlck5vZGUgPSBhZGRvbkFmdGVyID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBhZGRvbkNsYXNzTmFtZVxuICAgICAgfSwgYWRkb25BZnRlcikgOiBudWxsO1xuICAgICAgdmFyIG1lcmdlZFdyYXBwZXJDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdyYXBwZXJcIiksIChfY2xhc3NOYW1lczMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczMsIHdyYXBwZXJDbGFzc05hbWUsIGFkZG9uQmVmb3JlIHx8IGFkZG9uQWZ0ZXIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQod3JhcHBlckNsYXNzTmFtZSwgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMzKSk7XG4gICAgICB2YXIgbWVyZ2VkR3JvdXBDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyb3VwLXdyYXBwZXJcIiksIChfY2xhc3NOYW1lczQgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXAtd3JhcHBlci1zbVwiKSwgc2l6ZSA9PT0gJ3NtYWxsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXM0LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyb3VwLXdyYXBwZXItbGdcIiksIHNpemUgPT09ICdsYXJnZScpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzNCwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ncm91cC13cmFwcGVyLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzNCksIGNsYXNzTmFtZSk7IC8vIE5lZWQgYW5vdGhlciB3cmFwcGVyIGZvciBjaGFuZ2luZyBkaXNwbGF5OnRhYmxlIHRvIGRpc3BsYXk6aW5saW5lLWJsb2NrXG4gICAgICAvLyBhbmQgcHV0IHN0eWxlIHByb3AgaW4gd3JhcHBlclxuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBtZXJnZWRHcm91cENsYXNzTmFtZSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IG1lcmdlZFdyYXBwZXJDbGFzc05hbWVcbiAgICAgIH0sIGFkZG9uQmVmb3JlTm9kZSwgKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShsYWJlbGVkRWxlbWVudCwge1xuICAgICAgICBzdHlsZTogbnVsbFxuICAgICAgfSksIGFkZG9uQWZ0ZXJOb2RlKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclRleHRBcmVhV2l0aENsZWFySWNvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJUZXh0QXJlYVdpdGhDbGVhckljb24ocHJlZml4Q2xzLCBlbGVtZW50KSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM1O1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHByb3BzNS52YWx1ZSxcbiAgICAgICAgICBhbGxvd0NsZWFyID0gX3RoaXMkcHJvcHM1LmFsbG93Q2xlYXIsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM1LmNsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzNS5zdHlsZSxcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wczUuZGlyZWN0aW9uLFxuICAgICAgICAgIGJvcmRlcmVkID0gX3RoaXMkcHJvcHM1LmJvcmRlcmVkO1xuXG4gICAgICBpZiAoIWFsbG93Q2xlYXIpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfcmVhY3ROb2RlLmNsb25lRWxlbWVudCkoZWxlbWVudCwge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFmZml4V3JhcHBlckNscyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWZmaXgtd3JhcHBlclwiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyLXRleHRhcmVhLXdpdGgtY2xlYXItYnRuXCIpLCAoX2NsYXNzTmFtZXM1ID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXM1LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWZmaXgtd3JhcHBlci1ib3JkZXJsZXNzXCIpLCAhYm9yZGVyZWQpLCBfY2xhc3NOYW1lczUpLCBjbGFzc05hbWUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYWZmaXhXcmFwcGVyQ2xzLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sICgwLCBfcmVhY3ROb2RlLmNsb25lRWxlbWVudCkoZWxlbWVudCwge1xuICAgICAgICBzdHlsZTogbnVsbCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KSwgdGhpcy5yZW5kZXJDbGVhckljb24ocHJlZml4Q2xzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczYucHJlZml4Q2xzLFxuICAgICAgICAgIGlucHV0VHlwZSA9IF90aGlzJHByb3BzNi5pbnB1dFR5cGUsXG4gICAgICAgICAgZWxlbWVudCA9IF90aGlzJHByb3BzNi5lbGVtZW50O1xuXG4gICAgICBpZiAoaW5wdXRUeXBlID09PSBDbGVhcmFibGVJbnB1dFR5cGVbMF0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVGV4dEFyZWFXaXRoQ2xlYXJJY29uKHByZWZpeENscywgZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJlbmRlcklucHV0V2l0aExhYmVsKHByZWZpeENscywgdGhpcy5yZW5kZXJMYWJlbGVkSWNvbihwcmVmaXhDbHMsIGVsZW1lbnQpKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENsZWFyYWJsZUxhYmVsZWRJbnB1dDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIF9kZWZhdWx0ID0gQ2xlYXJhYmxlTGFiZWxlZElucHV0O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgR3JvdXAgPSBmdW5jdGlvbiBHcm91cChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscyxcbiAgICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb247XG4gICAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgICAgX3Byb3BzJGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzJGNsYXNzTmFtZSA9PT0gdm9pZCAwID8gJycgOiBfcHJvcHMkY2xhc3NOYW1lO1xuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0LWdyb3VwJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICB2YXIgY2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sZ1wiKSwgcHJvcHMuc2l6ZSA9PT0gJ2xhcmdlJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21cIiksIHByb3BzLnNpemUgPT09ICdzbWFsbCcpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbXBhY3RcIiksIHByb3BzLmNvbXBhY3QpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xzLFxuICAgICAgc3R5bGU6IHByb3BzLnN0eWxlLFxuICAgICAgb25Nb3VzZUVudGVyOiBwcm9wcy5vbk1vdXNlRW50ZXIsXG4gICAgICBvbk1vdXNlTGVhdmU6IHByb3BzLm9uTW91c2VMZWF2ZSxcbiAgICAgIG9uRm9jdXM6IHByb3BzLm9uRm9jdXMsXG4gICAgICBvbkJsdXI6IHByb3BzLm9uQmx1clxuICAgIH0sIHByb3BzLmNoaWxkcmVuKTtcbiAgfSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBHcm91cDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5maXhDb250cm9sbGVkVmFsdWUgPSBmaXhDb250cm9sbGVkVmFsdWU7XG5leHBvcnRzLnJlc29sdmVPbkNoYW5nZSA9IHJlc29sdmVPbkNoYW5nZTtcbmV4cG9ydHMuZ2V0SW5wdXRDbGFzc05hbWUgPSBnZXRJbnB1dENsYXNzTmFtZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm9taXQuanNcIikpO1xuXG52YXIgX0NsZWFyYWJsZUxhYmVsZWRJbnB1dCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL0NsZWFyYWJsZUxhYmVsZWRJbnB1dFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX1NpemVDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0XCIpKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbmZ1bmN0aW9uIGZpeENvbnRyb2xsZWRWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU9uQ2hhbmdlKHRhcmdldCwgZSwgb25DaGFuZ2UpIHtcbiAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgdmFyIGV2ZW50ID0gZTtcblxuICAgIGlmIChlLnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIC8vIGNsaWNrIGNsZWFyIGljb25cbiAgICAgIGV2ZW50ID0gT2JqZWN0LmNyZWF0ZShlKTtcbiAgICAgIGV2ZW50LnRhcmdldCA9IHRhcmdldDtcbiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0YXJnZXQ7XG4gICAgICB2YXIgb3JpZ2luYWxJbnB1dFZhbHVlID0gdGFyZ2V0LnZhbHVlOyAvLyBjaGFuZ2UgdGFyZ2V0IHJlZiB2YWx1ZSBjYXVzZSBlLnRhcmdldC52YWx1ZSBzaG91bGQgYmUgJycgd2hlbiBjbGVhciBpbnB1dFxuXG4gICAgICB0YXJnZXQudmFsdWUgPSAnJztcbiAgICAgIG9uQ2hhbmdlKGV2ZW50KTsgLy8gcmVzZXQgdGFyZ2V0IHJlZiB2YWx1ZVxuXG4gICAgICB0YXJnZXQudmFsdWUgPSBvcmlnaW5hbElucHV0VmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25DaGFuZ2UoZXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElucHV0Q2xhc3NOYW1lKHByZWZpeENscywgYm9yZGVyZWQsIHNpemUsIGRpc2FibGVkLCBkaXJlY3Rpb24pIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHJldHVybiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtXCIpLCBzaXplID09PSAnc21hbGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sZ1wiKSwgc2l6ZSA9PT0gJ2xhcmdlJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvcmRlcmxlc3NcIiksICFib3JkZXJlZCksIF9jbGFzc05hbWVzKSk7XG59XG5cbnZhciBJbnB1dCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKElucHV0LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShJbnB1dCk7XG5cbiAgZnVuY3Rpb24gSW5wdXQocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIElucHV0KTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcbiAgICBfdGhpcy5kaXJlY3Rpb24gPSAnbHRyJztcblxuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuaW5wdXQuZm9jdXMoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2F2ZUNsZWFyYWJsZUlucHV0ID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICBfdGhpcy5jbGVhcmFibGVJbnB1dCA9IGlucHV0O1xuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlSW5wdXQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgIF90aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgfTtcblxuICAgIF90aGlzLm9uRm9jdXMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uRm9jdXMgPSBfdGhpcy5wcm9wcy5vbkZvY3VzO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzZWQ6IHRydWVcbiAgICAgIH0sIF90aGlzLmNsZWFyUGFzc3dvcmRWYWx1ZUF0dHJpYnV0ZSk7XG5cbiAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgIG9uRm9jdXMoZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uQmx1ciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25CbHVyID0gX3RoaXMucHJvcHMub25CbHVyO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICB9LCBfdGhpcy5jbGVhclBhc3N3b3JkVmFsdWVBdHRyaWJ1dGUpO1xuXG4gICAgICBpZiAob25CbHVyKSB7XG4gICAgICAgIG9uQmx1cihlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlUmVzZXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMuc2V0VmFsdWUoJycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuZm9jdXMoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXNvbHZlT25DaGFuZ2UoX3RoaXMuaW5wdXQsIGUsIF90aGlzLnByb3BzLm9uQ2hhbmdlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVuZGVySW5wdXQgPSBmdW5jdGlvbiAocHJlZml4Q2xzLCBzaXplLCBib3JkZXJlZCkge1xuICAgICAgdmFyIGlucHV0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBhZGRvbkJlZm9yZSA9IF90aGlzJHByb3BzLmFkZG9uQmVmb3JlLFxuICAgICAgICAgIGFkZG9uQWZ0ZXIgPSBfdGhpcyRwcm9wcy5hZGRvbkFmdGVyLFxuICAgICAgICAgIGN1c3RvbWl6ZVNpemUgPSBfdGhpcyRwcm9wcy5zaXplLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMuZGlzYWJsZWQ7IC8vIEZpeCBodHRwczovL2ZiLm1lL3JlYWN0LXVua25vd24tcHJvcFxuXG4gICAgICB2YXIgb3RoZXJQcm9wcyA9ICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKF90aGlzLnByb3BzLCBbJ3ByZWZpeENscycsICdvblByZXNzRW50ZXInLCAnYWRkb25CZWZvcmUnLCAnYWRkb25BZnRlcicsICdwcmVmaXgnLCAnc3VmZml4JywgJ2FsbG93Q2xlYXInLCAvLyBJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCxcbiAgICAgIC8vIHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgYm90aC5cbiAgICAgICdkZWZhdWx0VmFsdWUnLCAnc2l6ZScsICdpbnB1dFR5cGUnLCAnYm9yZGVyZWQnXSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICBhdXRvQ29tcGxldGU6IGlucHV0LmF1dG9Db21wbGV0ZVxuICAgICAgfSwgb3RoZXJQcm9wcywge1xuICAgICAgICBvbkNoYW5nZTogX3RoaXMuaGFuZGxlQ2hhbmdlLFxuICAgICAgICBvbkZvY3VzOiBfdGhpcy5vbkZvY3VzLFxuICAgICAgICBvbkJsdXI6IF90aGlzLm9uQmx1cixcbiAgICAgICAgb25LZXlEb3duOiBfdGhpcy5oYW5kbGVLZXlEb3duLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKGdldElucHV0Q2xhc3NOYW1lKHByZWZpeENscywgYm9yZGVyZWQsIGN1c3RvbWl6ZVNpemUgfHwgc2l6ZSwgZGlzYWJsZWQsIF90aGlzLmRpcmVjdGlvbiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIGNsYXNzTmFtZSwgY2xhc3NOYW1lICYmICFhZGRvbkJlZm9yZSAmJiAhYWRkb25BZnRlcikpLFxuICAgICAgICByZWY6IF90aGlzLnNhdmVJbnB1dFxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5jbGVhclBhc3N3b3JkVmFsdWVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMDU0MVxuICAgICAgX3RoaXMucmVtb3ZlUGFzc3dvcmRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpcy5pbnB1dCAmJiBfdGhpcy5pbnB1dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA9PT0gJ3Bhc3N3b3JkJyAmJiBfdGhpcy5pbnB1dC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpIHtcbiAgICAgICAgICBfdGhpcy5pbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMuc2V0VmFsdWUoZS50YXJnZXQudmFsdWUsIF90aGlzLmNsZWFyUGFzc3dvcmRWYWx1ZUF0dHJpYnV0ZSk7XG5cbiAgICAgIHJlc29sdmVPbkNoYW5nZShfdGhpcy5pbnB1dCwgZSwgX3RoaXMucHJvcHMub25DaGFuZ2UpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvblByZXNzRW50ZXIgPSBfdGhpcyRwcm9wczIub25QcmVzc0VudGVyLFxuICAgICAgICAgIG9uS2V5RG93biA9IF90aGlzJHByb3BzMi5vbktleURvd247XG5cbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzICYmIG9uUHJlc3NFbnRlcikge1xuICAgICAgICBvblByZXNzRW50ZXIoZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbktleURvd24pIHtcbiAgICAgICAgb25LZXlEb3duKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJDb21wb25lbnQgPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGdldFByZWZpeENscyA9IF9yZWYuZ2V0UHJlZml4Q2xzLFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uLFxuICAgICAgICAgIGlucHV0ID0gX3JlZi5pbnB1dDtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkc3RhdGUudmFsdWUsXG4gICAgICAgICAgZm9jdXNlZCA9IF90aGlzJHN0YXRlLmZvY3VzZWQ7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgY3VzdG9taXplUHJlZml4Q2xzID0gX3RoaXMkcHJvcHMzLnByZWZpeENscyxcbiAgICAgICAgICBfdGhpcyRwcm9wczMkYm9yZGVyZWQgPSBfdGhpcyRwcm9wczMuYm9yZGVyZWQsXG4gICAgICAgICAgYm9yZGVyZWQgPSBfdGhpcyRwcm9wczMkYm9yZGVyZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfdGhpcyRwcm9wczMkYm9yZGVyZWQ7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgICBfdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NpemVDb250ZXh0W1wiZGVmYXVsdFwiXS5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbGVhcmFibGVMYWJlbGVkSW5wdXRbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgIHNpemU6IHNpemVcbiAgICAgICAgfSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBpbnB1dFR5cGU6IFwiaW5wdXRcIixcbiAgICAgICAgICB2YWx1ZTogZml4Q29udHJvbGxlZFZhbHVlKHZhbHVlKSxcbiAgICAgICAgICBlbGVtZW50OiBfdGhpcy5yZW5kZXJJbnB1dChwcmVmaXhDbHMsIHNpemUsIGJvcmRlcmVkLCBpbnB1dCksXG4gICAgICAgICAgaGFuZGxlUmVzZXQ6IF90aGlzLmhhbmRsZVJlc2V0LFxuICAgICAgICAgIHJlZjogX3RoaXMuc2F2ZUNsZWFyYWJsZUlucHV0LFxuICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICAgIGZvY3VzZWQ6IGZvY3VzZWQsXG4gICAgICAgICAgdHJpZ2dlckZvY3VzOiBfdGhpcy5mb2N1cyxcbiAgICAgICAgICBib3JkZXJlZDogYm9yZGVyZWRcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciB2YWx1ZSA9IHR5cGVvZiBwcm9wcy52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyBwcm9wcy5kZWZhdWx0VmFsdWUgOiBwcm9wcy52YWx1ZTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLXVudXNlZC1zdGF0ZVxuICAgICAgcHJldlZhbHVlOiBwcm9wcy52YWx1ZVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShJbnB1dCwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLmNsZWFyUGFzc3dvcmRWYWx1ZUF0dHJpYnV0ZSgpO1xuICAgIH0gLy8gU2luY2UgcG9seWZpbGwgYGdldFNuYXBzaG90QmVmb3JlVXBkYXRlYCBuZWVkIHdvcmsgd2l0aCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICAvLyBXZSBrZWVwIGFuIGVtcHR5IGZ1bmN0aW9uIGhlcmUuXG5cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge31cbiAgfSwge1xuICAgIGtleTogXCJnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGlmICgoMCwgX0NsZWFyYWJsZUxhYmVsZWRJbnB1dC5oYXNQcmVmaXhTdWZmaXgpKHByZXZQcm9wcykgIT09ICgwLCBfQ2xlYXJhYmxlTGFiZWxlZElucHV0Lmhhc1ByZWZpeFN1ZmZpeCkodGhpcy5wcm9wcykpIHtcbiAgICAgICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkodGhpcy5pbnB1dCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCwgJ0lucHV0JywgXCJXaGVuIElucHV0IGlzIGZvY3VzZWQsIGR5bmFtaWMgYWRkIG9yIHJlbW92ZSBwcmVmaXggLyBzdWZmaXggd2lsbCBtYWtlIGl0IGxvc2UgZm9jdXMgY2F1c2VkIGJ5IGRvbSBzdHJ1Y3R1cmUgY2hhbmdlLiBSZWFkIG1vcmU6IGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2lucHV0LyNGQVFcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnJlbW92ZVBhc3N3b3JkVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZW1vdmVQYXNzd29yZFRpbWVvdXQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJibHVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlbGVjdCgpIHtcbiAgICAgIHRoaXMuaW5wdXQuc2VsZWN0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZhbHVlKHZhbHVlLCBjYWxsYmFjaykge1xuICAgICAgaWYgKHRoaXMucHJvcHMudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJDb21wb25lbnQpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBfcmVmMikge1xuICAgICAgdmFyIHByZXZWYWx1ZSA9IF9yZWYyLnByZXZWYWx1ZTtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAgICAgcHJldlZhbHVlOiBuZXh0UHJvcHMudmFsdWVcbiAgICAgIH07XG5cbiAgICAgIGlmIChuZXh0UHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCB8fCBwcmV2VmFsdWUgIT09IG5leHRQcm9wcy52YWx1ZSkge1xuICAgICAgICBuZXdTdGF0ZS52YWx1ZSA9IG5leHRQcm9wcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gSW5wdXQ7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbklucHV0LmRlZmF1bHRQcm9wcyA9IHtcbiAgdHlwZTogJ3RleHQnXG59O1xudmFyIF9kZWZhdWx0ID0gSW5wdXQ7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9FeWVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0V5ZU91dGxpbmVkXCIpKTtcblxudmFyIF9FeWVJbnZpc2libGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0V5ZUludmlzaWJsZU91dGxpbmVkXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfSW5wdXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0lucHV0XCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBBY3Rpb25NYXAgPSB7XG4gIGNsaWNrOiAnb25DbGljaycsXG4gIGhvdmVyOiAnb25Nb3VzZU92ZXInXG59O1xudmFyIFBhc3N3b3JkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF91c2VTdGF0ZSA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfdXNlU3RhdGUsIDIpLFxuICAgICAgdmlzaWJsZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRWaXNpYmxlID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgb25WaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlKCkge1xuICAgIHZhciBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkO1xuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0VmlzaWJsZSghdmlzaWJsZSk7XG4gIH07XG5cbiAgdmFyIGdldEljb24gPSBmdW5jdGlvbiBnZXRJY29uKHByZWZpeENscykge1xuICAgIHZhciBfaWNvblByb3BzO1xuXG4gICAgdmFyIGFjdGlvbiA9IHByb3BzLmFjdGlvbixcbiAgICAgICAgX3Byb3BzJGljb25SZW5kZXIgPSBwcm9wcy5pY29uUmVuZGVyLFxuICAgICAgICBpY29uUmVuZGVyID0gX3Byb3BzJGljb25SZW5kZXIgPT09IHZvaWQgMCA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gOiBfcHJvcHMkaWNvblJlbmRlcjtcbiAgICB2YXIgaWNvblRyaWdnZXIgPSBBY3Rpb25NYXBbYWN0aW9uXSB8fCAnJztcbiAgICB2YXIgaWNvbiA9IGljb25SZW5kZXIodmlzaWJsZSk7XG4gICAgdmFyIGljb25Qcm9wcyA9IChfaWNvblByb3BzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2ljb25Qcm9wcywgaWNvblRyaWdnZXIsIG9uVmlzaWJsZUNoYW5nZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2ljb25Qcm9wcywgXCJjbGFzc05hbWVcIiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uXCIpKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfaWNvblByb3BzLCBcImtleVwiLCAncGFzc3dvcmRJY29uJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2ljb25Qcm9wcywgXCJvbk1vdXNlRG93blwiLCBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAvLyBQcmV2ZW50IGZvY3VzZWQgc3RhdGUgbG9zdFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTUxNzNcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfaWNvblByb3BzLCBcIm9uTW91c2VVcFwiLCBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgLy8gUHJldmVudCBjYXJldCBwb3NpdGlvbiBjaGFuZ2VcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIzNTI0XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSksIF9pY29uUHJvcHMpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoaWNvbikgPyBpY29uIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGljb24pLCBpY29uUHJvcHMpO1xuICB9O1xuXG4gIHZhciByZW5kZXJQYXNzd29yZCA9IGZ1bmN0aW9uIHJlbmRlclBhc3N3b3JkKF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHM7XG5cbiAgICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIGN1c3RvbWl6ZUlucHV0UHJlZml4Q2xzID0gcHJvcHMuaW5wdXRQcmVmaXhDbHMsXG4gICAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgICB2aXNpYmlsaXR5VG9nZ2xlID0gcHJvcHMudmlzaWJpbGl0eVRvZ2dsZSxcbiAgICAgICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJjbGFzc05hbWVcIiwgXCJwcmVmaXhDbHNcIiwgXCJpbnB1dFByZWZpeENsc1wiLCBcInNpemVcIiwgXCJ2aXNpYmlsaXR5VG9nZ2xlXCJdKTtcblxuICAgIHZhciBpbnB1dFByZWZpeENscyA9IGdldFByZWZpeENscygnaW5wdXQnLCBjdXN0b21pemVJbnB1dFByZWZpeENscyk7XG4gICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnaW5wdXQtcGFzc3dvcmQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBzdWZmaXhJY29uID0gdmlzaWJpbGl0eVRvZ2dsZSAmJiBnZXRJY29uKHByZWZpeENscyk7XG4gICAgdmFyIGlucHV0Q2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCBjbGFzc05hbWUsICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplKSwgISFzaXplKSk7XG4gICAgdmFyIG9taXR0ZWRQcm9wcyA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKHJlc3RQcm9wcywgWydzdWZmaXgnLCAnaWNvblJlbmRlciddKSksIHtcbiAgICAgIHR5cGU6IHZpc2libGUgPyAndGV4dCcgOiAncGFzc3dvcmQnLFxuICAgICAgY2xhc3NOYW1lOiBpbnB1dENsYXNzTmFtZSxcbiAgICAgIHByZWZpeENsczogaW5wdXRQcmVmaXhDbHMsXG4gICAgICBzdWZmaXg6IHN1ZmZpeEljb25cbiAgICB9KTtcblxuICAgIGlmIChzaXplKSB7XG4gICAgICBvbWl0dGVkUHJvcHMuc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9JbnB1dFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICByZWY6IHJlZlxuICAgIH0sIG9taXR0ZWRQcm9wcykpO1xuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIHJlbmRlclBhc3N3b3JkKTtcbn0pO1xuUGFzc3dvcmQuZGVmYXVsdFByb3BzID0ge1xuICBhY3Rpb246ICdjbGljaycsXG4gIHZpc2liaWxpdHlUb2dnbGU6IHRydWUsXG4gIGljb25SZW5kZXI6IGZ1bmN0aW9uIGljb25SZW5kZXIodmlzaWJsZSkge1xuICAgIHJldHVybiB2aXNpYmxlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0V5ZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRXllSW52aXNpYmxlT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKTtcbiAgfVxufTtcblBhc3N3b3JkLmRpc3BsYXlOYW1lID0gJ1Bhc3N3b3JkJztcbnZhciBfZGVmYXVsdCA9IFBhc3N3b3JkO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3JlZjIgPSByZXF1aXJlKFwicmMtdXRpbC9saWIvcmVmXCIpO1xuXG52YXIgX1NlYXJjaE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvU2VhcmNoT3V0bGluZWRcIikpO1xuXG52YXIgX0xvYWRpbmdPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0xvYWRpbmdPdXRsaW5lZFwiKSk7XG5cbnZhciBfSW5wdXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0lucHV0XCIpKTtcblxudmFyIF9idXR0b24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9idXR0b25cIikpO1xuXG52YXIgX1NpemVDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0XCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfcmVhY3ROb2RlID0gcmVxdWlyZShcIi4uL191dGlsL3JlYWN0Tm9kZVwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBTZWFyY2ggPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgaW5wdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG5cbiAgdmFyIG9uQ2hhbmdlID0gZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgIHZhciBjdXN0b21PbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgICBjdXN0b21PblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoO1xuXG4gICAgaWYgKGUgJiYgZS50YXJnZXQgJiYgZS50eXBlID09PSAnY2xpY2snICYmIGN1c3RvbU9uU2VhcmNoKSB7XG4gICAgICBjdXN0b21PblNlYXJjaChlLnRhcmdldC52YWx1ZSwgZSk7XG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbU9uQ2hhbmdlKSB7XG4gICAgICBjdXN0b21PbkNoYW5nZShlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgIHZhciBfYTtcblxuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSAoKF9hID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlucHV0KSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25TZWFyY2ggPSBmdW5jdGlvbiBvblNlYXJjaChlKSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIGN1c3RvbU9uU2VhcmNoID0gcHJvcHMub25TZWFyY2gsXG4gICAgICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkO1xuXG4gICAgaWYgKGxvYWRpbmcgfHwgZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tT25TZWFyY2gpIHtcbiAgICAgIGN1c3RvbU9uU2VhcmNoKChfYSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnB1dC52YWx1ZSwgZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciByZW5kZXJMb2FkaW5nID0gZnVuY3Rpb24gcmVuZGVyTG9hZGluZyhwcmVmaXhDbHMpIHtcbiAgICB2YXIgZW50ZXJCdXR0b24gPSBwcm9wcy5lbnRlckJ1dHRvbixcbiAgICAgICAgY3VzdG9taXplU2l6ZSA9IHByb3BzLnNpemU7XG5cbiAgICBpZiAoZW50ZXJCdXR0b24pIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU2l6ZUNvbnRleHRbXCJkZWZhdWx0XCJdLkNvbnN1bWVyLCB7XG4gICAgICAgIGtleTogXCJlbnRlckJ1dHRvblwiXG4gICAgICB9LCBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2J1dHRvbltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYnV0dG9uXCIpLFxuICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICAgIHNpemU6IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTG9hZGluZ091dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Mb2FkaW5nT3V0bGluZWRbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvblwiKSxcbiAgICAgIGtleTogXCJsb2FkaW5nSWNvblwiXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHJlbmRlclN1ZmZpeCA9IGZ1bmN0aW9uIHJlbmRlclN1ZmZpeChwcmVmaXhDbHMpIHtcbiAgICB2YXIgc3VmZml4ID0gcHJvcHMuc3VmZml4LFxuICAgICAgICBlbnRlckJ1dHRvbiA9IHByb3BzLmVudGVyQnV0dG9uLFxuICAgICAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZztcblxuICAgIGlmIChsb2FkaW5nICYmICFlbnRlckJ1dHRvbikge1xuICAgICAgcmV0dXJuIFtzdWZmaXgsIHJlbmRlckxvYWRpbmcocHJlZml4Q2xzKV07XG4gICAgfVxuXG4gICAgaWYgKGVudGVyQnV0dG9uKSByZXR1cm4gc3VmZml4O1xuICAgIHZhciBpY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NlYXJjaE91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb25cIiksXG4gICAgICBrZXk6IFwic2VhcmNoSWNvblwiLFxuICAgICAgb25DbGljazogb25TZWFyY2hcbiAgICB9KTtcblxuICAgIGlmIChzdWZmaXgpIHtcbiAgICAgIHJldHVybiBbKDAsIF9yZWFjdE5vZGUucmVwbGFjZUVsZW1lbnQpKHN1ZmZpeCwgbnVsbCwge1xuICAgICAgICBrZXk6ICdzdWZmaXgnXG4gICAgICB9KSwgaWNvbl07XG4gICAgfVxuXG4gICAgcmV0dXJuIGljb247XG4gIH07XG5cbiAgdmFyIHJlbmRlckFkZG9uQWZ0ZXIgPSBmdW5jdGlvbiByZW5kZXJBZGRvbkFmdGVyKHByZWZpeENscywgc2l6ZSkge1xuICAgIHZhciBlbnRlckJ1dHRvbiA9IHByb3BzLmVudGVyQnV0dG9uLFxuICAgICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgICBhZGRvbkFmdGVyID0gcHJvcHMuYWRkb25BZnRlcixcbiAgICAgICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmc7XG4gICAgdmFyIGJ0bkNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYnV0dG9uXCIpO1xuXG4gICAgaWYgKGxvYWRpbmcgJiYgZW50ZXJCdXR0b24pIHtcbiAgICAgIHJldHVybiBbcmVuZGVyTG9hZGluZyhwcmVmaXhDbHMpLCBhZGRvbkFmdGVyXTtcbiAgICB9XG5cbiAgICBpZiAoIWVudGVyQnV0dG9uKSByZXR1cm4gYWRkb25BZnRlcjtcbiAgICB2YXIgYnV0dG9uO1xuICAgIHZhciBlbnRlckJ1dHRvbkFzRWxlbWVudCA9IGVudGVyQnV0dG9uO1xuICAgIHZhciBpc0FudGRCdXR0b24gPSBlbnRlckJ1dHRvbkFzRWxlbWVudC50eXBlICYmIGVudGVyQnV0dG9uQXNFbGVtZW50LnR5cGUuX19BTlRfQlVUVE9OID09PSB0cnVlO1xuXG4gICAgaWYgKGlzQW50ZEJ1dHRvbiB8fCBlbnRlckJ1dHRvbkFzRWxlbWVudC50eXBlID09PSAnYnV0dG9uJykge1xuICAgICAgYnV0dG9uID0gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShlbnRlckJ1dHRvbkFzRWxlbWVudCwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgICAgICBvbkNsaWNrOiBvblNlYXJjaCxcbiAgICAgICAga2V5OiAnZW50ZXJCdXR0b24nXG4gICAgICB9LCBpc0FudGRCdXR0b24gPyB7XG4gICAgICAgIGNsYXNzTmFtZTogYnRuQ2xhc3NOYW1lLFxuICAgICAgICBzaXplOiBzaXplXG4gICAgICB9IDoge30pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2J1dHRvbltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgY2xhc3NOYW1lOiBidG5DbGFzc05hbWUsXG4gICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICBzaXplOiBzaXplLFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIGtleTogXCJlbnRlckJ1dHRvblwiLFxuICAgICAgICBvbk1vdXNlRG93bjogb25Nb3VzZURvd24sXG4gICAgICAgIG9uQ2xpY2s6IG9uU2VhcmNoXG4gICAgICB9LCBlbnRlckJ1dHRvbiA9PT0gdHJ1ZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TZWFyY2hPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogZW50ZXJCdXR0b24pO1xuICAgIH1cblxuICAgIGlmIChhZGRvbkFmdGVyKSB7XG4gICAgICByZXR1cm4gW2J1dHRvbiwgKDAsIF9yZWFjdE5vZGUucmVwbGFjZUVsZW1lbnQpKGFkZG9uQWZ0ZXIsIG51bGwsIHtcbiAgICAgICAga2V5OiAnYWRkb25BZnRlcidcbiAgICAgIH0pXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnV0dG9uO1xuICB9O1xuXG4gIHZhciByZW5kZXJTZWFyY2ggPSBmdW5jdGlvbiByZW5kZXJTZWFyY2goX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscyxcbiAgICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb247XG5cbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBjdXN0b21pemVJbnB1dFByZWZpeENscyA9IHByb3BzLmlucHV0UHJlZml4Q2xzLFxuICAgICAgICBlbnRlckJ1dHRvbiA9IHByb3BzLmVudGVyQnV0dG9uLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImlucHV0UHJlZml4Q2xzXCIsIFwiZW50ZXJCdXR0b25cIiwgXCJjbGFzc05hbWVcIiwgXCJzaXplXCJdKTtcblxuICAgIGRlbGV0ZSByZXN0UHJvcHMub25TZWFyY2g7XG4gICAgZGVsZXRlIHJlc3RQcm9wcy5sb2FkaW5nO1xuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0LXNlYXJjaCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgdmFyIGlucHV0UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dCcsIGN1c3RvbWl6ZUlucHV0UHJlZml4Q2xzKTtcblxuICAgIHZhciBnZXRDbGFzc05hbWUgPSBmdW5jdGlvbiBnZXRDbGFzc05hbWUoc2l6ZSkge1xuICAgICAgdmFyIGlucHV0Q2xhc3NOYW1lO1xuXG4gICAgICBpZiAoZW50ZXJCdXR0b24pIHtcbiAgICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICAgIGlucHV0Q2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVudGVyLWJ1dHRvblwiKSwgISFlbnRlckJ1dHRvbiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplKSwgISFzaXplKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXRDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlucHV0Q2xhc3NOYW1lO1xuICAgIH07XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NpemVDb250ZXh0W1wiZGVmYXVsdFwiXS5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfSW5wdXRbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICByZWY6ICgwLCBfcmVmMi5jb21wb3NlUmVmKShpbnB1dFJlZiwgcmVmKSxcbiAgICAgICAgb25QcmVzc0VudGVyOiBvblNlYXJjaFxuICAgICAgfSwgcmVzdFByb3BzLCB7XG4gICAgICAgIHNpemU6IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZSxcbiAgICAgICAgcHJlZml4Q2xzOiBpbnB1dFByZWZpeENscyxcbiAgICAgICAgYWRkb25BZnRlcjogcmVuZGVyQWRkb25BZnRlcihwcmVmaXhDbHMsIGN1c3RvbWl6ZVNpemUgfHwgc2l6ZSksXG4gICAgICAgIHN1ZmZpeDogcmVuZGVyU3VmZml4KHByZWZpeENscyksXG4gICAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICAgICAgY2xhc3NOYW1lOiBnZXRDbGFzc05hbWUoY3VzdG9taXplU2l6ZSB8fCBzaXplKVxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIHJlbmRlclNlYXJjaCk7XG59KTtcblNlYXJjaC5kZWZhdWx0UHJvcHMgPSB7XG4gIGVudGVyQnV0dG9uOiBmYWxzZVxufTtcblNlYXJjaC5kaXNwbGF5TmFtZSA9ICdTZWFyY2gnO1xudmFyIF9kZWZhdWx0ID0gU2VhcmNoO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNUZXh0YXJlYSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXRleHRhcmVhXCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX0NsZWFyYWJsZUxhYmVsZWRJbnB1dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ2xlYXJhYmxlTGFiZWxlZElucHV0XCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfSW5wdXQgPSByZXF1aXJlKFwiLi9JbnB1dFwiKTtcblxudmFyIFRleHRBcmVhID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoVGV4dEFyZWEsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKFRleHRBcmVhKTtcblxuICBmdW5jdGlvbiBUZXh0QXJlYShwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgVGV4dEFyZWEpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgX3RoaXMuZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5yZXNpemFibGVUZXh0QXJlYS50ZXh0QXJlYS5mb2N1cygpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlVGV4dEFyZWEgPSBmdW5jdGlvbiAodGV4dGFyZWEpIHtcbiAgICAgIF90aGlzLnJlc2l6YWJsZVRleHRBcmVhID0gdGV4dGFyZWEgPT09IG51bGwgfHwgdGV4dGFyZWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRhcmVhLnJlc2l6YWJsZVRleHRBcmVhO1xuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlQ2xlYXJhYmxlSW5wdXQgPSBmdW5jdGlvbiAoY2xlYXJhYmxlSW5wdXQpIHtcbiAgICAgIF90aGlzLmNsZWFyYWJsZUlucHV0ID0gY2xlYXJhYmxlSW5wdXQ7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5zZXRWYWx1ZShlLnRhcmdldC52YWx1ZSk7XG5cbiAgICAgICgwLCBfSW5wdXQucmVzb2x2ZU9uQ2hhbmdlKShfdGhpcy5yZXNpemFibGVUZXh0QXJlYS50ZXh0QXJlYSwgZSwgX3RoaXMucHJvcHMub25DaGFuZ2UpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVSZXNldCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5zZXRWYWx1ZSgnJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5mb2N1cygpO1xuICAgICAgfSk7XG5cbiAgICAgICgwLCBfSW5wdXQucmVzb2x2ZU9uQ2hhbmdlKShfdGhpcy5yZXNpemFibGVUZXh0QXJlYS50ZXh0QXJlYSwgZSwgX3RoaXMucHJvcHMub25DaGFuZ2UpO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJUZXh0QXJlYSA9IGZ1bmN0aW9uIChwcmVmaXhDbHMsIGJvcmRlcmVkKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjVGV4dGFyZWFbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKF90aGlzLnByb3BzLCBbJ2FsbG93Q2xlYXInLCAnYm9yZGVyZWQnXSksIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvcmRlcmxlc3NcIiksICFib3JkZXJlZCksIF90aGlzLnByb3BzLmNsYXNzTmFtZSksXG4gICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICBvbkNoYW5nZTogX3RoaXMuaGFuZGxlQ2hhbmdlLFxuICAgICAgICByZWY6IF90aGlzLnNhdmVUZXh0QXJlYVxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJDb21wb25lbnQgPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGdldFByZWZpeENscyA9IF9yZWYuZ2V0UHJlZml4Q2xzLFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uO1xuICAgICAgdmFyIHZhbHVlID0gX3RoaXMuc3RhdGUudmFsdWU7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjdXN0b21pemVQcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgICAgX3RoaXMkcHJvcHMkYm9yZGVyZWQgPSBfdGhpcyRwcm9wcy5ib3JkZXJlZCxcbiAgICAgICAgICBib3JkZXJlZCA9IF90aGlzJHByb3BzJGJvcmRlcmVkID09PSB2b2lkIDAgPyB0cnVlIDogX3RoaXMkcHJvcHMkYm9yZGVyZWQ7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NsZWFyYWJsZUxhYmVsZWRJbnB1dFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICBpbnB1dFR5cGU6IFwidGV4dFwiLFxuICAgICAgICB2YWx1ZTogKDAsIF9JbnB1dC5maXhDb250cm9sbGVkVmFsdWUpKHZhbHVlKSxcbiAgICAgICAgZWxlbWVudDogX3RoaXMucmVuZGVyVGV4dEFyZWEocHJlZml4Q2xzLCBib3JkZXJlZCksXG4gICAgICAgIGhhbmRsZVJlc2V0OiBfdGhpcy5oYW5kbGVSZXNldCxcbiAgICAgICAgcmVmOiBfdGhpcy5zYXZlQ2xlYXJhYmxlSW5wdXQsXG4gICAgICAgIHRyaWdnZXJGb2N1czogX3RoaXMuZm9jdXMsXG4gICAgICAgIGJvcmRlcmVkOiBib3JkZXJlZFxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICB2YXIgdmFsdWUgPSB0eXBlb2YgcHJvcHMudmFsdWUgPT09ICd1bmRlZmluZWQnID8gcHJvcHMuZGVmYXVsdFZhbHVlIDogcHJvcHMudmFsdWU7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tdW51c2VkLXN0YXRlXG4gICAgICBwcmV2VmFsdWU6IHByb3BzLnZhbHVlXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKFRleHRBcmVhLCBbe1xuICAgIGtleTogXCJzZXRWYWx1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWYWx1ZSh2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmx1clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdGhpcy5yZXNpemFibGVUZXh0QXJlYS50ZXh0QXJlYS5ibHVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCB0aGlzLnJlbmRlckNvbXBvbmVudCk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIF9yZWYyKSB7XG4gICAgICB2YXIgcHJldlZhbHVlID0gX3JlZjIucHJldlZhbHVlO1xuICAgICAgdmFyIG5ld1N0YXRlID0ge1xuICAgICAgICBwcmV2VmFsdWU6IG5leHRQcm9wcy52YWx1ZVxuICAgICAgfTtcblxuICAgICAgaWYgKG5leHRQcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IHByZXZWYWx1ZSAhPT0gbmV4dFByb3BzLnZhbHVlKSB7XG4gICAgICAgIG5ld1N0YXRlLnZhbHVlID0gbmV4dFByb3BzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBUZXh0QXJlYTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIF9kZWZhdWx0ID0gVGV4dEFyZWE7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX0lucHV0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JbnB1dFwiKSk7XG5cbnZhciBfR3JvdXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0dyb3VwXCIpKTtcblxudmFyIF9TZWFyY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1NlYXJjaFwiKSk7XG5cbnZhciBfVGV4dEFyZWEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RleHRBcmVhXCIpKTtcblxudmFyIF9QYXNzd29yZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFzc3dvcmRcIikpO1xuXG5fSW5wdXRbXCJkZWZhdWx0XCJdLkdyb3VwID0gX0dyb3VwW1wiZGVmYXVsdFwiXTtcbl9JbnB1dFtcImRlZmF1bHRcIl0uU2VhcmNoID0gX1NlYXJjaFtcImRlZmF1bHRcIl07XG5fSW5wdXRbXCJkZWZhdWx0XCJdLlRleHRBcmVhID0gX1RleHRBcmVhW1wiZGVmYXVsdFwiXTtcbl9JbnB1dFtcImRlZmF1bHRcIl0uUGFzc3dvcmQgPSBfUGFzc3dvcmRbXCJkZWZhdWx0XCJdO1xudmFyIF9kZWZhdWx0ID0gX0lucHV0W1wiZGVmYXVsdFwiXTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHBvcnRzLlNpZGVyQ29udGV4dCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9CYXJzT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9CYXJzT3V0bGluZWRcIikpO1xuXG52YXIgX1JpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9SaWdodE91dGxpbmVkXCIpKTtcblxudmFyIF9MZWZ0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9MZWZ0T3V0bGluZWRcIikpO1xuXG52YXIgX2xheW91dCA9IHJlcXVpcmUoXCIuL2xheW91dFwiKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfaXNOdW1lcmljID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvaXNOdW1lcmljXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBkaW1lbnNpb25NYXhNYXAgPSB7XG4gIHhzOiAnNDc5Ljk4cHgnLFxuICBzbTogJzU3NS45OHB4JyxcbiAgbWQ6ICc3NjcuOThweCcsXG4gIGxnOiAnOTkxLjk4cHgnLFxuICB4bDogJzExOTkuOThweCcsXG4gIHh4bDogJzE1OTkuOThweCdcbn07XG52YXIgU2lkZXJDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0cy5TaWRlckNvbnRleHQgPSBTaWRlckNvbnRleHQ7XG5cbnZhciBnZW5lcmF0ZUlkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaSA9IDA7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZWZpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgaSArPSAxO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdChpKTtcbiAgfTtcbn0oKTtcblxudmFyIEludGVybmFsU2lkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShJbnRlcm5hbFNpZGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShJbnRlcm5hbFNpZGVyKTtcblxuICBmdW5jdGlvbiBJbnRlcm5hbFNpZGVyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBJbnRlcm5hbFNpZGVyKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF90aGlzLnJlc3BvbnNpdmVIYW5kbGVyID0gZnVuY3Rpb24gKG1xbCkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBiZWxvdzogbXFsLm1hdGNoZXNcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgb25CcmVha3BvaW50ID0gX3RoaXMucHJvcHMub25CcmVha3BvaW50O1xuICAgICAgdmFyIGNvbGxhcHNlZCA9IF90aGlzLnN0YXRlLmNvbGxhcHNlZDtcblxuICAgICAgaWYgKG9uQnJlYWtwb2ludCkge1xuICAgICAgICBvbkJyZWFrcG9pbnQobXFsLm1hdGNoZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sbGFwc2VkICE9PSBtcWwubWF0Y2hlcykge1xuICAgICAgICBfdGhpcy5zZXRDb2xsYXBzZWQobXFsLm1hdGNoZXMsICdyZXNwb25zaXZlJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNldENvbGxhcHNlZCA9IGZ1bmN0aW9uIChjb2xsYXBzZWQsIHR5cGUpIHtcbiAgICAgIGlmICghKCdjb2xsYXBzZWQnIGluIF90aGlzLnByb3BzKSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY29sbGFwc2VkOiBjb2xsYXBzZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvbkNvbGxhcHNlID0gX3RoaXMucHJvcHMub25Db2xsYXBzZTtcblxuICAgICAgaWYgKG9uQ29sbGFwc2UpIHtcbiAgICAgICAgb25Db2xsYXBzZShjb2xsYXBzZWQsIHR5cGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy50b2dnbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY29sbGFwc2VkID0gIV90aGlzLnN0YXRlLmNvbGxhcHNlZDtcblxuICAgICAgX3RoaXMuc2V0Q29sbGFwc2VkKGNvbGxhcHNlZCwgJ2NsaWNrVHJpZ2dlcicpO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJTaWRlciA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcblxuICAgICAgdmFyIF9hID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICAgICAgICB0aGVtZSA9IF9hLnRoZW1lLFxuICAgICAgICAgIGNvbGxhcHNpYmxlID0gX2EuY29sbGFwc2libGUsXG4gICAgICAgICAgcmV2ZXJzZUFycm93ID0gX2EucmV2ZXJzZUFycm93LFxuICAgICAgICAgIHRyaWdnZXIgPSBfYS50cmlnZ2VyLFxuICAgICAgICAgIHN0eWxlID0gX2Euc3R5bGUsXG4gICAgICAgICAgd2lkdGggPSBfYS53aWR0aCxcbiAgICAgICAgICBjb2xsYXBzZWRXaWR0aCA9IF9hLmNvbGxhcHNlZFdpZHRoLFxuICAgICAgICAgIHplcm9XaWR0aFRyaWdnZXJTdHlsZSA9IF9hLnplcm9XaWR0aFRyaWdnZXJTdHlsZSxcbiAgICAgICAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgICAgICAgIG90aGVycyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwidGhlbWVcIiwgXCJjb2xsYXBzaWJsZVwiLCBcInJldmVyc2VBcnJvd1wiLCBcInRyaWdnZXJcIiwgXCJzdHlsZVwiLCBcIndpZHRoXCIsIFwiY29sbGFwc2VkV2lkdGhcIiwgXCJ6ZXJvV2lkdGhUcmlnZ2VyU3R5bGVcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGNvbGxhcHNlZCA9IF90aGlzJHN0YXRlLmNvbGxhcHNlZCxcbiAgICAgICAgICBiZWxvdyA9IF90aGlzJHN0YXRlLmJlbG93O1xuICAgICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnbGF5b3V0LXNpZGVyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICAgIHZhciBkaXZQcm9wcyA9ICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKG90aGVycywgWydjb2xsYXBzZWQnLCAnZGVmYXVsdENvbGxhcHNlZCcsICdvbkNvbGxhcHNlJywgJ2JyZWFrcG9pbnQnLCAnb25CcmVha3BvaW50JywgJ3NpZGVySG9vaycsICd6ZXJvV2lkdGhUcmlnZ2VyU3R5bGUnXSk7XG4gICAgICB2YXIgcmF3V2lkdGggPSBjb2xsYXBzZWQgPyBjb2xsYXBzZWRXaWR0aCA6IHdpZHRoOyAvLyB1c2UgXCJweFwiIGFzIGZhbGxiYWNrIHVuaXQgZm9yIHdpZHRoXG5cbiAgICAgIHZhciBzaWRlcldpZHRoID0gKDAsIF9pc051bWVyaWNbXCJkZWZhdWx0XCJdKShyYXdXaWR0aCkgPyBcIlwiLmNvbmNhdChyYXdXaWR0aCwgXCJweFwiKSA6IFN0cmluZyhyYXdXaWR0aCk7IC8vIHNwZWNpYWwgdHJpZ2dlciB3aGVuIGNvbGxhcHNlZFdpZHRoID09IDBcblxuICAgICAgdmFyIHplcm9XaWR0aFRyaWdnZXIgPSBwYXJzZUZsb2F0KFN0cmluZyhjb2xsYXBzZWRXaWR0aCB8fCAwKSkgPT09IDAgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBvbkNsaWNrOiBfdGhpcy50b2dnbGUsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi16ZXJvLXdpZHRoLXRyaWdnZXJcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItemVyby13aWR0aC10cmlnZ2VyLVwiKS5jb25jYXQocmV2ZXJzZUFycm93ID8gJ3JpZ2h0JyA6ICdsZWZ0JykpLFxuICAgICAgICBzdHlsZTogemVyb1dpZHRoVHJpZ2dlclN0eWxlXG4gICAgICB9LCB0cmlnZ2VyIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9CYXJzT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSkgOiBudWxsO1xuICAgICAgdmFyIGljb25PYmogPSB7XG4gICAgICAgIGV4cGFuZGVkOiByZXZlcnNlQXJyb3cgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUmlnaHRPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xlZnRPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpLFxuICAgICAgICBjb2xsYXBzZWQ6IHJldmVyc2VBcnJvdyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9MZWZ0T3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9SaWdodE91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbClcbiAgICAgIH07XG4gICAgICB2YXIgc3RhdHVzID0gY29sbGFwc2VkID8gJ2NvbGxhcHNlZCcgOiAnZXhwYW5kZWQnO1xuICAgICAgdmFyIGRlZmF1bHRUcmlnZ2VyID0gaWNvbk9ialtzdGF0dXNdO1xuICAgICAgdmFyIHRyaWdnZXJEb20gPSB0cmlnZ2VyICE9PSBudWxsID8gemVyb1dpZHRoVHJpZ2dlciB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmlnZ2VyXCIpLFxuICAgICAgICBvbkNsaWNrOiBfdGhpcy50b2dnbGUsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IHNpZGVyV2lkdGhcbiAgICAgICAgfVxuICAgICAgfSwgdHJpZ2dlciB8fCBkZWZhdWx0VHJpZ2dlcikgOiBudWxsO1xuICAgICAgdmFyIGRpdlN0eWxlID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgc3R5bGUpLCB7XG4gICAgICAgIGZsZXg6IFwiMCAwIFwiLmNvbmNhdChzaWRlcldpZHRoKSxcbiAgICAgICAgbWF4V2lkdGg6IHNpZGVyV2lkdGgsXG4gICAgICAgIG1pbldpZHRoOiBzaWRlcldpZHRoLFxuICAgICAgICB3aWR0aDogc2lkZXJXaWR0aFxuICAgICAgfSk7XG4gICAgICB2YXIgc2lkZXJDbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdCh0aGVtZSksIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbGxhcHNlZFwiKSwgISFjb2xsYXBzZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhcy10cmlnZ2VyXCIpLCBjb2xsYXBzaWJsZSAmJiB0cmlnZ2VyICE9PSBudWxsICYmICF6ZXJvV2lkdGhUcmlnZ2VyKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1iZWxvd1wiKSwgISFiZWxvdyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItemVyby13aWR0aFwiKSwgcGFyc2VGbG9hdChzaWRlcldpZHRoKSA9PT0gMCksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFzaWRlXCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIGNsYXNzTmFtZTogc2lkZXJDbHNcbiAgICAgIH0sIGRpdlByb3BzLCB7XG4gICAgICAgIHN0eWxlOiBkaXZTdHlsZVxuICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoaWxkcmVuXCIpXG4gICAgICB9LCBjaGlsZHJlbiksIGNvbGxhcHNpYmxlIHx8IGJlbG93ICYmIHplcm9XaWR0aFRyaWdnZXIgPyB0cmlnZ2VyRG9tIDogbnVsbCk7XG4gICAgfTtcblxuICAgIF90aGlzLnVuaXF1ZUlkID0gZ2VuZXJhdGVJZCgnYW50LXNpZGVyLScpO1xuICAgIHZhciBtYXRjaE1lZGlhO1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBtYXRjaE1lZGlhID0gd2luZG93Lm1hdGNoTWVkaWE7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoTWVkaWEgJiYgcHJvcHMuYnJlYWtwb2ludCAmJiBwcm9wcy5icmVha3BvaW50IGluIGRpbWVuc2lvbk1heE1hcCkge1xuICAgICAgX3RoaXMubXFsID0gbWF0Y2hNZWRpYShcIihtYXgtd2lkdGg6IFwiLmNvbmNhdChkaW1lbnNpb25NYXhNYXBbcHJvcHMuYnJlYWtwb2ludF0sIFwiKVwiKSk7XG4gICAgfVxuXG4gICAgdmFyIGNvbGxhcHNlZDtcblxuICAgIGlmICgnY29sbGFwc2VkJyBpbiBwcm9wcykge1xuICAgICAgY29sbGFwc2VkID0gcHJvcHMuY29sbGFwc2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2xsYXBzZWQgPSBwcm9wcy5kZWZhdWx0Q29sbGFwc2VkO1xuICAgIH1cblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgY29sbGFwc2VkOiBjb2xsYXBzZWQsXG4gICAgICBiZWxvdzogZmFsc2VcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoSW50ZXJuYWxTaWRlciwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIGlmICh0aGlzLm1xbCkge1xuICAgICAgICB0aGlzLm1xbC5hZGRMaXN0ZW5lcih0aGlzLnJlc3BvbnNpdmVIYW5kbGVyKTtcbiAgICAgICAgdGhpcy5yZXNwb25zaXZlSGFuZGxlcih0aGlzLm1xbCk7XG4gICAgICB9XG5cbiAgICAgIChfYSA9IHRoaXMucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zaWRlckhvb2suYWRkU2lkZXIodGhpcy51bmlxdWVJZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIF9hLCBfYjtcblxuICAgICAgKF9hID0gdGhpcyA9PT0gbnVsbCB8fCB0aGlzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0aGlzLm1xbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlbW92ZUxpc3RlbmVyKHRoaXMucmVzcG9uc2l2ZUhhbmRsZXIpO1xuICAgICAgKF9iID0gdGhpcy5wcm9wcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnNpZGVySG9vay5yZW1vdmVTaWRlcih0aGlzLnVuaXF1ZUlkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBjb2xsYXBzZWQgPSB0aGlzLnN0YXRlLmNvbGxhcHNlZDtcbiAgICAgIHZhciBjb2xsYXBzZWRXaWR0aCA9IHRoaXMucHJvcHMuY29sbGFwc2VkV2lkdGg7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgc2lkZXJDb2xsYXBzZWQ6IGNvbGxhcHNlZCxcbiAgICAgICAgICBjb2xsYXBzZWRXaWR0aDogY29sbGFwc2VkV2lkdGhcbiAgICAgICAgfVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCB0aGlzLnJlbmRlclNpZGVyKSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIGlmICgnY29sbGFwc2VkJyBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2xsYXBzZWQ6IG5leHRQcm9wcy5jb2xsYXBzZWRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbnRlcm5hbFNpZGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5JbnRlcm5hbFNpZGVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgY29sbGFwc2libGU6IGZhbHNlLFxuICBkZWZhdWx0Q29sbGFwc2VkOiBmYWxzZSxcbiAgcmV2ZXJzZUFycm93OiBmYWxzZSxcbiAgd2lkdGg6IDIwMCxcbiAgY29sbGFwc2VkV2lkdGg6IDgwLFxuICBzdHlsZToge30sXG4gIHRoZW1lOiAnZGFyaydcbn07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9wcmVmZXItc3RhdGVsZXNzLWZ1bmN0aW9uXG5cbnZhciBTaWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudDIpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShTaWRlciwgX1JlYWN0JENvbXBvbmVudDIpO1xuXG4gIHZhciBfc3VwZXIyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShTaWRlcik7XG5cbiAgZnVuY3Rpb24gU2lkZXIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBTaWRlcik7XG4gICAgcmV0dXJuIF9zdXBlcjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoU2lkZXIsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9sYXlvdXQuTGF5b3V0Q29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEludGVybmFsU2lkZXIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgY29udGV4dCwgX3RoaXMyLnByb3BzKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFNpZGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFNpZGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2xheW91dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbGF5b3V0XCIpKTtcblxudmFyIF9TaWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU2lkZXJcIikpO1xuXG5fbGF5b3V0W1wiZGVmYXVsdFwiXS5TaWRlciA9IF9TaWRlcltcImRlZmF1bHRcIl07XG52YXIgX2RlZmF1bHQgPSBfbGF5b3V0W1wiZGVmYXVsdFwiXTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHBvcnRzLkxheW91dENvbnRleHQgPSB2b2lkIDA7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgTGF5b3V0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgc2lkZXJIb29rOiB7XG4gICAgYWRkU2lkZXI6IGZ1bmN0aW9uIGFkZFNpZGVyKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW1vdmVTaWRlcjogZnVuY3Rpb24gcmVtb3ZlU2lkZXIoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5MYXlvdXRDb250ZXh0ID0gTGF5b3V0Q29udGV4dDtcblxuZnVuY3Rpb24gZ2VuZXJhdG9yKF9yZWYpIHtcbiAgdmFyIHN1ZmZpeENscyA9IF9yZWYuc3VmZml4Q2xzLFxuICAgICAgdGFnTmFtZSA9IF9yZWYudGFnTmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lID0gX3JlZi5kaXNwbGF5TmFtZTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChCYXNpY0NvbXBvbmVudCkge1xuICAgIHZhciBfYTtcblxuICAgIHJldHVybiBfYSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgICAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShBZGFwdGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgICAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoQWRhcHRlcik7XG5cbiAgICAgIGZ1bmN0aW9uIEFkYXB0ZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcztcblxuICAgICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIEFkYXB0ZXIpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIF90aGlzLnJlbmRlckNvbXBvbmVudCA9IGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmMi5nZXRQcmVmaXhDbHM7XG4gICAgICAgICAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF90aGlzLnByb3BzLnByZWZpeENscztcbiAgICAgICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKHN1ZmZpeENscywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzaWNDb21wb25lbnQsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICAgIHRhZ05hbWU6IHRhZ05hbWVcbiAgICAgICAgICB9LCBfdGhpcy5wcm9wcykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgIH1cblxuICAgICAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShBZGFwdGVyLCBbe1xuICAgICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XSk7XG4gICAgICByZXR1cm4gQWRhcHRlcjtcbiAgICB9KFJlYWN0LkNvbXBvbmVudCksIF9hLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWUsIF9hO1xuICB9O1xufVxuXG52YXIgQmFzaWMgPSBmdW5jdGlvbiBCYXNpYyhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIHRhZ05hbWUgPSBwcm9wcy50YWdOYW1lLFxuICAgICAgb3RoZXJzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInRhZ05hbWVcIl0pO1xuXG4gIHZhciBjbGFzc1N0cmluZyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KHRhZ05hbWUsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZ1xuICB9LCBvdGhlcnMpLCBjaGlsZHJlbik7XG59O1xuXG52YXIgQmFzaWNMYXlvdXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQyKSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoQmFzaWNMYXlvdXQsIF9SZWFjdCRDb21wb25lbnQyKTtcblxuICB2YXIgX3N1cGVyMiA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoQmFzaWNMYXlvdXQpO1xuXG4gIGZ1bmN0aW9uIEJhc2ljTGF5b3V0KCkge1xuICAgIHZhciBfdGhpczI7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIEJhc2ljTGF5b3V0KTtcbiAgICBfdGhpczIgPSBfc3VwZXIyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMyLnN0YXRlID0ge1xuICAgICAgc2lkZXJzOiBbXVxuICAgIH07XG5cbiAgICBfdGhpczIucmVuZGVyQ29tcG9uZW50ID0gZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgIHZhciBkaXJlY3Rpb24gPSBfcmVmMy5kaXJlY3Rpb247XG5cbiAgICAgIHZhciBfYSA9IF90aGlzMi5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgICAgICAgIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sXG4gICAgICAgICAgaGFzU2lkZXIgPSBfYS5oYXNTaWRlcixcbiAgICAgICAgICBUYWcgPSBfYS50YWdOYW1lLFxuICAgICAgICAgIG90aGVycyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJoYXNTaWRlclwiLCBcInRhZ05hbWVcIl0pO1xuXG4gICAgICB2YXIgY2xhc3NTdHJpbmcgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhcy1zaWRlclwiKSwgdHlwZW9mIGhhc1NpZGVyID09PSAnYm9vbGVhbicgPyBoYXNTaWRlciA6IF90aGlzMi5zdGF0ZS5zaWRlcnMubGVuZ3RoID4gMCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheW91dENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBzaWRlckhvb2s6IF90aGlzMi5nZXRTaWRlckhvb2soKVxuICAgICAgICB9XG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWcsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgICAgIH0sIG90aGVycyksIGNoaWxkcmVuKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpczI7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKEJhc2ljTGF5b3V0LCBbe1xuICAgIGtleTogXCJnZXRTaWRlckhvb2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2lkZXJIb29rKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZFNpZGVyOiBmdW5jdGlvbiBhZGRTaWRlcihpZCkge1xuICAgICAgICAgIF90aGlzMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNpZGVyczogW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkoc3RhdGUuc2lkZXJzKSwgW2lkXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZVNpZGVyOiBmdW5jdGlvbiByZW1vdmVTaWRlcihpZCkge1xuICAgICAgICAgIF90aGlzMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNpZGVyczogc3RhdGUuc2lkZXJzLmZpbHRlcihmdW5jdGlvbiAoY3VycmVudElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJZCAhPT0gaWQ7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJDb21wb25lbnQpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQmFzaWNMYXlvdXQ7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBMYXlvdXQgPSBnZW5lcmF0b3Ioe1xuICBzdWZmaXhDbHM6ICdsYXlvdXQnLFxuICB0YWdOYW1lOiAnc2VjdGlvbicsXG4gIGRpc3BsYXlOYW1lOiAnTGF5b3V0J1xufSkoQmFzaWNMYXlvdXQpO1xudmFyIEhlYWRlciA9IGdlbmVyYXRvcih7XG4gIHN1ZmZpeENsczogJ2xheW91dC1oZWFkZXInLFxuICB0YWdOYW1lOiAnaGVhZGVyJyxcbiAgZGlzcGxheU5hbWU6ICdIZWFkZXInXG59KShCYXNpYyk7XG52YXIgRm9vdGVyID0gZ2VuZXJhdG9yKHtcbiAgc3VmZml4Q2xzOiAnbGF5b3V0LWZvb3RlcicsXG4gIHRhZ05hbWU6ICdmb290ZXInLFxuICBkaXNwbGF5TmFtZTogJ0Zvb3Rlcidcbn0pKEJhc2ljKTtcbnZhciBDb250ZW50ID0gZ2VuZXJhdG9yKHtcbiAgc3VmZml4Q2xzOiAnbGF5b3V0LWNvbnRlbnQnLFxuICB0YWdOYW1lOiAnbWFpbicsXG4gIGRpc3BsYXlOYW1lOiAnQ29udGVudCdcbn0pKEJhc2ljKTtcbkxheW91dC5IZWFkZXIgPSBIZWFkZXI7XG5MYXlvdXQuRm9vdGVyID0gRm9vdGVyO1xuTGF5b3V0LkNvbnRlbnQgPSBDb250ZW50O1xudmFyIF9kZWZhdWx0ID0gTGF5b3V0O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGV4cG9ydHMuTWV0YSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaW5kZXhcIik7XG5cbnZhciBfZ3JpZCA9IHJlcXVpcmUoXCIuLi9ncmlkXCIpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9yZWFjdE5vZGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvcmVhY3ROb2RlXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIE1ldGEgPSBmdW5jdGlvbiBNZXRhKF9hKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgICBhdmF0YXIgPSBfYS5hdmF0YXIsXG4gICAgICB0aXRsZSA9IF9hLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb24gPSBfYS5kZXNjcmlwdGlvbixcbiAgICAgIG90aGVycyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiYXZhdGFyXCIsIFwidGl0bGVcIiwgXCJkZXNjcmlwdGlvblwiXSk7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnbGlzdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBjbGFzc1N0cmluZyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1tZXRhXCIpLCBjbGFzc05hbWUpO1xuICB2YXIgY29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1tZXRhLWNvbnRlbnRcIilcbiAgfSwgdGl0bGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoNFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbWV0YS10aXRsZVwiKVxuICB9LCB0aXRsZSksIGRlc2NyaXB0aW9uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1tZXRhLWRlc2NyaXB0aW9uXCIpXG4gIH0sIGRlc2NyaXB0aW9uKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIG90aGVycywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgfSksIGF2YXRhciAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbWV0YS1hdmF0YXJcIilcbiAgfSwgYXZhdGFyKSwgKHRpdGxlIHx8IGRlc2NyaXB0aW9uKSAmJiBjb250ZW50KTtcbn07XG5cbmV4cG9ydHMuTWV0YSA9IE1ldGE7XG5cbnZhciBJdGVtID0gZnVuY3Rpb24gSXRlbShfYSkge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICAgIGFjdGlvbnMgPSBfYS5hY3Rpb25zLFxuICAgICAgZXh0cmEgPSBfYS5leHRyYSxcbiAgICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICAgIGNvbFN0eWxlID0gX2EuY29sU3R5bGUsXG4gICAgICBvdGhlcnMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcImNoaWxkcmVuXCIsIFwiYWN0aW9uc1wiLCBcImV4dHJhXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sU3R5bGVcIl0pO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDIgPSBSZWFjdC51c2VDb250ZXh0KF9pbmRleC5MaXN0Q29udGV4dCksXG4gICAgICBncmlkID0gX1JlYWN0JHVzZUNvbnRleHQyLmdyaWQsXG4gICAgICBpdGVtTGF5b3V0ID0gX1JlYWN0JHVzZUNvbnRleHQyLml0ZW1MYXlvdXQ7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0MyA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQzLmdldFByZWZpeENscztcblxuICB2YXIgaXNJdGVtQ29udGFpbnNUZXh0Tm9kZUFuZE5vdFNpbmd1bGFyID0gZnVuY3Rpb24gaXNJdGVtQ29udGFpbnNUZXh0Tm9kZUFuZE5vdFNpbmd1bGFyKCkge1xuICAgIHZhciByZXN1bHQ7XG4gICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0ICYmIFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA+IDE7XG4gIH07XG5cbiAgdmFyIGlzRmxleE1vZGUgPSBmdW5jdGlvbiBpc0ZsZXhNb2RlKCkge1xuICAgIGlmIChpdGVtTGF5b3V0ID09PSAndmVydGljYWwnKSB7XG4gICAgICByZXR1cm4gISFleHRyYTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzSXRlbUNvbnRhaW5zVGV4dE5vZGVBbmROb3RTaW5ndWxhcigpO1xuICB9O1xuXG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2xpc3QnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgYWN0aW9uc0NvbnRlbnQgPSBhY3Rpb25zICYmIGFjdGlvbnMubGVuZ3RoID4gMCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1hY3Rpb25cIiksXG4gICAga2V5OiBcImFjdGlvbnNcIlxuICB9LCBhY3Rpb25zLm1hcChmdW5jdGlvbiAoYWN0aW9uLCBpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1hcnJheS1pbmRleC1rZXlcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIGtleTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWFjdGlvbi1cIikuY29uY2F0KGkpXG4gICAgICB9LCBhY3Rpb24sIGkgIT09IGFjdGlvbnMubGVuZ3RoIC0gMSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImVtXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tYWN0aW9uLXNwbGl0XCIpXG4gICAgICB9KSlcbiAgICApO1xuICB9KSk7XG4gIHZhciBFbGVtZW50ID0gZ3JpZCA/ICdkaXYnIDogJ2xpJztcbiAgdmFyIGl0ZW1DaGlsZHJlbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnQsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgb3RoZXJzLCB7XG4gICAgLy8gYGxpYCBlbGVtZW50IGBvbkNvcHlgIHByb3AgYXJncyBpcyBub3Qgc2FtZSBhcyBgZGl2YFxuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbm8tZmxleFwiKSwgIWlzRmxleE1vZGUoKSksIGNsYXNzTmFtZSlcbiAgfSksIGl0ZW1MYXlvdXQgPT09ICd2ZXJ0aWNhbCcgJiYgZXh0cmEgPyBbLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLW1haW5cIiksXG4gICAga2V5OiBcImNvbnRlbnRcIlxuICB9LCBjaGlsZHJlbiwgYWN0aW9uc0NvbnRlbnQpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZXh0cmFcIiksXG4gICAga2V5OiBcImV4dHJhXCJcbiAgfSwgZXh0cmEpXSA6IFtjaGlsZHJlbiwgYWN0aW9uc0NvbnRlbnQsICgwLCBfcmVhY3ROb2RlLmNsb25lRWxlbWVudCkoZXh0cmEsIHtcbiAgICBrZXk6ICdleHRyYSdcbiAgfSldKTtcbiAgcmV0dXJuIGdyaWQgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfZ3JpZC5Db2wsIHtcbiAgICBmbGV4OiAxLFxuICAgIHN0eWxlOiBjb2xTdHlsZVxuICB9LCBpdGVtQ2hpbGRyZW4pIDogaXRlbUNoaWxkcmVuO1xufTtcblxuSXRlbS5NZXRhID0gTWV0YTtcbnZhciBfZGVmYXVsdCA9IEl0ZW07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXhwb3J0cy5MaXN0Q29uc3VtZXIgPSBleHBvcnRzLkxpc3RDb250ZXh0ID0gdm9pZCAwO1xuXG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfc3BpbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3NwaW5cIikpO1xuXG52YXIgX3VzZUJyZWFrcG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9ncmlkL2hvb2tzL3VzZUJyZWFrcG9pbnRcIikpO1xuXG52YXIgX3Jlc3BvbnNpdmVPYnNlcnZlID0gcmVxdWlyZShcIi4uL191dGlsL3Jlc3BvbnNpdmVPYnNlcnZlXCIpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9wYWdpbmF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vcGFnaW5hdGlvblwiKSk7XG5cbnZhciBfZ3JpZCA9IHJlcXVpcmUoXCIuLi9ncmlkXCIpO1xuXG52YXIgX0l0ZW0gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0l0ZW1cIikpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIExpc3RDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0cy5MaXN0Q29udGV4dCA9IExpc3RDb250ZXh0O1xudmFyIExpc3RDb25zdW1lciA9IExpc3RDb250ZXh0LkNvbnN1bWVyO1xuZXhwb3J0cy5MaXN0Q29uc3VtZXIgPSBMaXN0Q29uc3VtZXI7XG5cbmZ1bmN0aW9uIExpc3QoX2EpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBfYSRwYWdpbmF0aW9uID0gX2EucGFnaW5hdGlvbixcbiAgICAgIHBhZ2luYXRpb24gPSBfYSRwYWdpbmF0aW9uID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hJHBhZ2luYXRpb24sXG4gICAgICBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICBfYSRib3JkZXJlZCA9IF9hLmJvcmRlcmVkLFxuICAgICAgYm9yZGVyZWQgPSBfYSRib3JkZXJlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSRib3JkZXJlZCxcbiAgICAgIF9hJHNwbGl0ID0gX2Euc3BsaXQsXG4gICAgICBzcGxpdCA9IF9hJHNwbGl0ID09PSB2b2lkIDAgPyB0cnVlIDogX2Ekc3BsaXQsXG4gICAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgICAgaXRlbUxheW91dCA9IF9hLml0ZW1MYXlvdXQsXG4gICAgICBsb2FkTW9yZSA9IF9hLmxvYWRNb3JlLFxuICAgICAgZ3JpZCA9IF9hLmdyaWQsXG4gICAgICBfYSRkYXRhU291cmNlID0gX2EuZGF0YVNvdXJjZSxcbiAgICAgIGRhdGFTb3VyY2UgPSBfYSRkYXRhU291cmNlID09PSB2b2lkIDAgPyBbXSA6IF9hJGRhdGFTb3VyY2UsXG4gICAgICBzaXplID0gX2Euc2l6ZSxcbiAgICAgIGhlYWRlciA9IF9hLmhlYWRlcixcbiAgICAgIGZvb3RlciA9IF9hLmZvb3RlcixcbiAgICAgIF9hJGxvYWRpbmcgPSBfYS5sb2FkaW5nLFxuICAgICAgbG9hZGluZyA9IF9hJGxvYWRpbmcgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EkbG9hZGluZyxcbiAgICAgIHJvd0tleSA9IF9hLnJvd0tleSxcbiAgICAgIHJlbmRlckl0ZW0gPSBfYS5yZW5kZXJJdGVtLFxuICAgICAgbG9jYWxlID0gX2EubG9jYWxlLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wicGFnaW5hdGlvblwiLCBcInByZWZpeENsc1wiLCBcImJvcmRlcmVkXCIsIFwic3BsaXRcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcIml0ZW1MYXlvdXRcIiwgXCJsb2FkTW9yZVwiLCBcImdyaWRcIiwgXCJkYXRhU291cmNlXCIsIFwic2l6ZVwiLCBcImhlYWRlclwiLCBcImZvb3RlclwiLCBcImxvYWRpbmdcIiwgXCJyb3dLZXlcIiwgXCJyZW5kZXJJdGVtXCIsIFwibG9jYWxlXCJdKTtcblxuICB2YXIgcGFnaW5hdGlvbk9iaiA9IHBhZ2luYXRpb24gJiYgKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkocGFnaW5hdGlvbikgPT09ICdvYmplY3QnID8gcGFnaW5hdGlvbiA6IHt9O1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShwYWdpbmF0aW9uT2JqLmRlZmF1bHRDdXJyZW50IHx8IDEpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgcGFnaW5hdGlvbkN1cnJlbnQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0UGFnaW5hdGlvbkN1cnJlbnQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUocGFnaW5hdGlvbk9iai5kZWZhdWx0UGFnZVNpemUgfHwgMTApLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICAgIHBhZ2luYXRpb25TaXplID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICAgIHNldFBhZ2luYXRpb25TaXplID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIHJlbmRlckVtcHR5ID0gX1JlYWN0JHVzZUNvbnRleHQucmVuZGVyRW1wdHksXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIGRlZmF1bHRQYWdpbmF0aW9uUHJvcHMgPSB7XG4gICAgY3VycmVudDogMSxcbiAgICB0b3RhbDogMFxuICB9O1xuICB2YXIga2V5cyA9IHt9O1xuXG4gIHZhciB0cmlnZ2VyUGFnaW5hdGlvbkV2ZW50ID0gZnVuY3Rpb24gdHJpZ2dlclBhZ2luYXRpb25FdmVudChldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHBhZ2UsIHBhZ2VTaXplKSB7XG4gICAgICBzZXRQYWdpbmF0aW9uQ3VycmVudChwYWdlKTtcbiAgICAgIHNldFBhZ2luYXRpb25TaXplKHBhZ2VTaXplKTtcblxuICAgICAgaWYgKHBhZ2luYXRpb24gJiYgcGFnaW5hdGlvbltldmVudE5hbWVdKSB7XG4gICAgICAgIHBhZ2luYXRpb25bZXZlbnROYW1lXShwYWdlLCBwYWdlU2l6ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICB2YXIgb25QYWdpbmF0aW9uQ2hhbmdlID0gdHJpZ2dlclBhZ2luYXRpb25FdmVudCgnb25DaGFuZ2UnKTtcbiAgdmFyIG9uUGFnaW5hdGlvblNob3dTaXplQ2hhbmdlID0gdHJpZ2dlclBhZ2luYXRpb25FdmVudCgnb25TaG93U2l6ZUNoYW5nZScpO1xuXG4gIHZhciByZW5kZXJJbm5lckl0ZW0gPSBmdW5jdGlvbiByZW5kZXJJbm5lckl0ZW0oaXRlbSwgaW5kZXgpIHtcbiAgICBpZiAoIXJlbmRlckl0ZW0pIHJldHVybiBudWxsO1xuICAgIHZhciBrZXk7XG5cbiAgICBpZiAodHlwZW9mIHJvd0tleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAga2V5ID0gcm93S2V5KGl0ZW0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvd0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGtleSA9IGl0ZW1bcm93S2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gaXRlbS5rZXk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIGtleSA9IFwibGlzdC1pdGVtLVwiLmNvbmNhdChpbmRleCk7XG4gICAgfVxuXG4gICAga2V5c1tpbmRleF0gPSBrZXk7XG4gICAgcmV0dXJuIHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpO1xuICB9O1xuXG4gIHZhciBpc1NvbWV0aGluZ0FmdGVyTGFzdEl0ZW0gPSBmdW5jdGlvbiBpc1NvbWV0aGluZ0FmdGVyTGFzdEl0ZW0oKSB7XG4gICAgcmV0dXJuICEhKGxvYWRNb3JlIHx8IHBhZ2luYXRpb24gfHwgZm9vdGVyKTtcbiAgfTtcblxuICB2YXIgcmVuZGVyRW1wdHlGdW5jID0gZnVuY3Rpb24gcmVuZGVyRW1wdHlGdW5jKHByZWZpeENscywgcmVuZGVyRW1wdHlIYW5kbGVyKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lbXB0eS10ZXh0XCIpXG4gICAgfSwgbG9jYWxlICYmIGxvY2FsZS5lbXB0eVRleHQgfHwgcmVuZGVyRW1wdHlIYW5kbGVyKCdMaXN0JykpO1xuICB9O1xuXG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2xpc3QnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgbG9hZGluZ1Byb3AgPSBsb2FkaW5nO1xuXG4gIGlmICh0eXBlb2YgbG9hZGluZ1Byb3AgPT09ICdib29sZWFuJykge1xuICAgIGxvYWRpbmdQcm9wID0ge1xuICAgICAgc3Bpbm5pbmc6IGxvYWRpbmdQcm9wXG4gICAgfTtcbiAgfVxuXG4gIHZhciBpc0xvYWRpbmcgPSBsb2FkaW5nUHJvcCAmJiBsb2FkaW5nUHJvcC5zcGlubmluZzsgLy8gbGFyZ2UgPT4gbGdcbiAgLy8gc21hbGwgPT4gc21cblxuICB2YXIgc2l6ZUNscyA9ICcnO1xuXG4gIHN3aXRjaCAoc2l6ZSkge1xuICAgIGNhc2UgJ2xhcmdlJzpcbiAgICAgIHNpemVDbHMgPSAnbGcnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzbWFsbCc6XG4gICAgICBzaXplQ2xzID0gJ3NtJztcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGNsYXNzU3RyaW5nID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi12ZXJ0aWNhbFwiKSwgaXRlbUxheW91dCA9PT0gJ3ZlcnRpY2FsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplQ2xzKSwgc2l6ZUNscyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3BsaXRcIiksIHNwbGl0KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJlZFwiKSwgYm9yZGVyZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmdcIiksIGlzTG9hZGluZyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JpZFwiKSwgZ3JpZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc29tZXRoaW5nLWFmdGVyLWxhc3QtaXRlbVwiKSwgaXNTb21ldGhpbmdBZnRlckxhc3RJdGVtKCkpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgdmFyIHBhZ2luYXRpb25Qcm9wcyA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBkZWZhdWx0UGFnaW5hdGlvblByb3BzKSwge1xuICAgIHRvdGFsOiBkYXRhU291cmNlLmxlbmd0aCxcbiAgICBjdXJyZW50OiBwYWdpbmF0aW9uQ3VycmVudCxcbiAgICBwYWdlU2l6ZTogcGFnaW5hdGlvblNpemVcbiAgfSksIHBhZ2luYXRpb24gfHwge30pO1xuICB2YXIgbGFyZ2VzdFBhZ2UgPSBNYXRoLmNlaWwocGFnaW5hdGlvblByb3BzLnRvdGFsIC8gcGFnaW5hdGlvblByb3BzLnBhZ2VTaXplKTtcblxuICBpZiAocGFnaW5hdGlvblByb3BzLmN1cnJlbnQgPiBsYXJnZXN0UGFnZSkge1xuICAgIHBhZ2luYXRpb25Qcm9wcy5jdXJyZW50ID0gbGFyZ2VzdFBhZ2U7XG4gIH1cblxuICB2YXIgcGFnaW5hdGlvbkNvbnRlbnQgPSBwYWdpbmF0aW9uID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYWdpbmF0aW9uXCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9wYWdpbmF0aW9uW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBwYWdpbmF0aW9uUHJvcHMsIHtcbiAgICBvbkNoYW5nZTogb25QYWdpbmF0aW9uQ2hhbmdlLFxuICAgIG9uU2hvd1NpemVDaGFuZ2U6IG9uUGFnaW5hdGlvblNob3dTaXplQ2hhbmdlXG4gIH0pKSkgOiBudWxsO1xuICB2YXIgc3BsaXREYXRhU291cmNlID0gKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShkYXRhU291cmNlKTtcblxuICBpZiAocGFnaW5hdGlvbikge1xuICAgIGlmIChkYXRhU291cmNlLmxlbmd0aCA+IChwYWdpbmF0aW9uUHJvcHMuY3VycmVudCAtIDEpICogcGFnaW5hdGlvblByb3BzLnBhZ2VTaXplKSB7XG4gICAgICBzcGxpdERhdGFTb3VyY2UgPSAoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKGRhdGFTb3VyY2UpLnNwbGljZSgocGFnaW5hdGlvblByb3BzLmN1cnJlbnQgLSAxKSAqIHBhZ2luYXRpb25Qcm9wcy5wYWdlU2l6ZSwgcGFnaW5hdGlvblByb3BzLnBhZ2VTaXplKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc2NyZWVucyA9ICgwLCBfdXNlQnJlYWtwb2ludFtcImRlZmF1bHRcIl0pKCk7XG4gIHZhciBjdXJyZW50QnJlYWtwb2ludCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3Jlc3BvbnNpdmVPYnNlcnZlLnJlc3BvbnNpdmVBcnJheS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGJyZWFrcG9pbnQgPSBfcmVzcG9uc2l2ZU9ic2VydmUucmVzcG9uc2l2ZUFycmF5W2ldO1xuXG4gICAgICBpZiAoc2NyZWVuc1ticmVha3BvaW50XSkge1xuICAgICAgICByZXR1cm4gYnJlYWtwb2ludDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LCBbc2NyZWVuc10pO1xuICB2YXIgY29sU3R5bGUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWdyaWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbHVtbkNvdW50ID0gY3VycmVudEJyZWFrcG9pbnQgJiYgZ3JpZFtjdXJyZW50QnJlYWtwb2ludF0gPyBncmlkW2N1cnJlbnRCcmVha3BvaW50XSA6IGdyaWQuY29sdW1uO1xuXG4gICAgaWYgKGNvbHVtbkNvdW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogXCJcIi5jb25jYXQoMTAwIC8gY29sdW1uQ291bnQsIFwiJVwiKSxcbiAgICAgICAgbWF4V2lkdGg6IFwiXCIuY29uY2F0KDEwMCAvIGNvbHVtbkNvdW50LCBcIiVcIilcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZ3JpZCA9PT0gbnVsbCB8fCBncmlkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBncmlkLmNvbHVtbiwgY3VycmVudEJyZWFrcG9pbnRdKTtcbiAgdmFyIGNoaWxkcmVuQ29udGVudCA9IGlzTG9hZGluZyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIG1pbkhlaWdodDogNTNcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChzcGxpdERhdGFTb3VyY2UubGVuZ3RoID4gMCkge1xuICAgIHZhciBpdGVtcyA9IHNwbGl0RGF0YVNvdXJjZS5tYXAoZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVuZGVySW5uZXJJdGVtKGl0ZW0sIGluZGV4KTtcbiAgICB9KTtcbiAgICB2YXIgY2hpbGRyZW5MaXN0ID0gUmVhY3QuQ2hpbGRyZW4ubWFwKGl0ZW1zLCBmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBrZXk6IGtleXNbaW5kZXhdLFxuICAgICAgICBzdHlsZTogY29sU3R5bGVcbiAgICAgIH0sIGNoaWxkKTtcbiAgICB9KTtcbiAgICBjaGlsZHJlbkNvbnRlbnQgPSBncmlkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2dyaWQuUm93LCB7XG4gICAgICBndXR0ZXI6IGdyaWQuZ3V0dGVyXG4gICAgfSwgY2hpbGRyZW5MaXN0KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1zXCIpXG4gICAgfSwgaXRlbXMpO1xuICB9IGVsc2UgaWYgKCFjaGlsZHJlbiAmJiAhaXNMb2FkaW5nKSB7XG4gICAgY2hpbGRyZW5Db250ZW50ID0gcmVuZGVyRW1wdHlGdW5jKHByZWZpeENscywgcmVuZGVyRW1wdHkpO1xuICB9XG5cbiAgdmFyIHBhZ2luYXRpb25Qb3NpdGlvbiA9IHBhZ2luYXRpb25Qcm9wcy5wb3NpdGlvbiB8fCAnYm90dG9tJztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpc3RDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHtcbiAgICAgIGdyaWQ6IGdyaWQsXG4gICAgICBpdGVtTGF5b3V0OiBpdGVtTGF5b3V0XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgfSwgcmVzdCksIChwYWdpbmF0aW9uUG9zaXRpb24gPT09ICd0b3AnIHx8IHBhZ2luYXRpb25Qb3NpdGlvbiA9PT0gJ2JvdGgnKSAmJiBwYWdpbmF0aW9uQ29udGVudCwgaGVhZGVyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyXCIpXG4gIH0sIGhlYWRlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9zcGluW1wiZGVmYXVsdFwiXSwgbG9hZGluZ1Byb3AsIGNoaWxkcmVuQ29udGVudCwgY2hpbGRyZW4pLCBmb290ZXIgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb290ZXJcIilcbiAgfSwgZm9vdGVyKSwgbG9hZE1vcmUgfHwgKHBhZ2luYXRpb25Qb3NpdGlvbiA9PT0gJ2JvdHRvbScgfHwgcGFnaW5hdGlvblBvc2l0aW9uID09PSAnYm90aCcpICYmIHBhZ2luYXRpb25Db250ZW50KSk7XG59XG5cbkxpc3QuSXRlbSA9IF9JdGVtW1wiZGVmYXVsdFwiXTtcbnZhciBfZGVmYXVsdCA9IExpc3Q7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudXNlTG9jYWxlUmVjZWl2ZXIgPSB1c2VMb2NhbGVSZWNlaXZlcjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWZhdWx0XCIpKTtcblxudmFyIF9jb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb250ZXh0XCIpKTtcblxudmFyIExvY2FsZVJlY2VpdmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoTG9jYWxlUmVjZWl2ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKExvY2FsZVJlY2VpdmVyKTtcblxuICBmdW5jdGlvbiBMb2NhbGVSZWNlaXZlcigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIExvY2FsZVJlY2VpdmVyKTtcbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKExvY2FsZVJlY2VpdmVyLCBbe1xuICAgIGtleTogXCJnZXRMb2NhbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TG9jYWxlKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjb21wb25lbnROYW1lID0gX3RoaXMkcHJvcHMuY29tcG9uZW50TmFtZSxcbiAgICAgICAgICBkZWZhdWx0TG9jYWxlID0gX3RoaXMkcHJvcHMuZGVmYXVsdExvY2FsZTtcbiAgICAgIHZhciBsb2NhbGUgPSBkZWZhdWx0TG9jYWxlIHx8IF9kZWZhdWx0W1wiZGVmYXVsdFwiXVtjb21wb25lbnROYW1lIHx8ICdnbG9iYWwnXTtcbiAgICAgIHZhciBhbnRMb2NhbGUgPSB0aGlzLmNvbnRleHQ7XG4gICAgICB2YXIgbG9jYWxlRnJvbUNvbnRleHQgPSBjb21wb25lbnROYW1lICYmIGFudExvY2FsZSA/IGFudExvY2FsZVtjb21wb25lbnROYW1lXSA6IHt9O1xuICAgICAgcmV0dXJuICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHR5cGVvZiBsb2NhbGUgPT09ICdmdW5jdGlvbicgPyBsb2NhbGUoKSA6IGxvY2FsZSksIGxvY2FsZUZyb21Db250ZXh0IHx8IHt9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TG9jYWxlQ29kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMb2NhbGVDb2RlKCkge1xuICAgICAgdmFyIGFudExvY2FsZSA9IHRoaXMuY29udGV4dDtcbiAgICAgIHZhciBsb2NhbGVDb2RlID0gYW50TG9jYWxlICYmIGFudExvY2FsZS5sb2NhbGU7IC8vIEhhZCB1c2UgTG9jYWxlUHJvdmlkZSBidXQgZGlkbid0IHNldCBsb2NhbGVcblxuICAgICAgaWYgKGFudExvY2FsZSAmJiBhbnRMb2NhbGUuZXhpc3QgJiYgIWxvY2FsZUNvZGUpIHtcbiAgICAgICAgcmV0dXJuIF9kZWZhdWx0W1wiZGVmYXVsdFwiXS5sb2NhbGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2NhbGVDb2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW4odGhpcy5nZXRMb2NhbGUoKSwgdGhpcy5nZXRMb2NhbGVDb2RlKCksIHRoaXMuY29udGV4dCk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBMb2NhbGVSZWNlaXZlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBMb2NhbGVSZWNlaXZlcjtcbkxvY2FsZVJlY2VpdmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50TmFtZTogJ2dsb2JhbCdcbn07XG5Mb2NhbGVSZWNlaXZlci5jb250ZXh0VHlwZSA9IF9jb250ZXh0W1wiZGVmYXVsdFwiXTtcblxuZnVuY3Rpb24gdXNlTG9jYWxlUmVjZWl2ZXIoY29tcG9uZW50TmFtZSwgZGVmYXVsdExvY2FsZSkge1xuICB2YXIgYW50TG9jYWxlID0gUmVhY3QudXNlQ29udGV4dChfY29udGV4dFtcImRlZmF1bHRcIl0pO1xuICB2YXIgY29tcG9uZW50TG9jYWxlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxvY2FsZSA9IGRlZmF1bHRMb2NhbGUgfHwgX2RlZmF1bHRbXCJkZWZhdWx0XCJdW2NvbXBvbmVudE5hbWUgfHwgJ2dsb2JhbCddO1xuICAgIHZhciBsb2NhbGVGcm9tQ29udGV4dCA9IGNvbXBvbmVudE5hbWUgJiYgYW50TG9jYWxlID8gYW50TG9jYWxlW2NvbXBvbmVudE5hbWVdIDoge307XG4gICAgcmV0dXJuICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHR5cGVvZiBsb2NhbGUgPT09ICdmdW5jdGlvbicgPyBsb2NhbGUoKSA6IGxvY2FsZSksIGxvY2FsZUZyb21Db250ZXh0IHx8IHt9KTtcbiAgfSwgW2NvbXBvbmVudE5hbWUsIGRlZmF1bHRMb2NhbGUsIGFudExvY2FsZV0pO1xuICByZXR1cm4gW2NvbXBvbmVudExvY2FsZV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxudmFyIExvY2FsZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovKDAsIF9yZWFjdC5jcmVhdGVDb250ZXh0KSh1bmRlZmluZWQpO1xudmFyIF9kZWZhdWx0ID0gTG9jYWxlQ29udGV4dDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmYXVsdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9sb2NhbGUvZGVmYXVsdFwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9kZWZhdWx0MltcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXhwb3J0cy5BTlRfTUFSSyA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX2xvY2FsZSA9IHJlcXVpcmUoXCIuLi9tb2RhbC9sb2NhbGVcIik7XG5cbnZhciBfY29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY29udGV4dFwiKSk7XG5cbnZhciBBTlRfTUFSSyA9ICdpbnRlcm5hbE1hcmsnO1xuZXhwb3J0cy5BTlRfTUFSSyA9IEFOVF9NQVJLO1xuXG52YXIgTG9jYWxlUHJvdmlkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShMb2NhbGVQcm92aWRlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoTG9jYWxlUHJvdmlkZXIpO1xuXG4gIGZ1bmN0aW9uIExvY2FsZVByb3ZpZGVyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBMb2NhbGVQcm92aWRlcik7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgKDAsIF9sb2NhbGUuY2hhbmdlQ29uZmlybUxvY2FsZSkocHJvcHMubG9jYWxlICYmIHByb3BzLmxvY2FsZS5Nb2RhbCk7XG4gICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkocHJvcHMuX0FOVF9NQVJLX18gPT09IEFOVF9NQVJLLCAnTG9jYWxlUHJvdmlkZXInLCAnYExvY2FsZVByb3ZpZGVyYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBsb2NhbGVgIHdpdGggYENvbmZpZ1Byb3ZpZGVyYCBpbnN0ZWFkOiBodHRwOi8vdS5hbnQuZGVzaWduL2xvY2FsZScpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoTG9jYWxlUHJvdmlkZXIsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICB2YXIgbG9jYWxlID0gdGhpcy5wcm9wcy5sb2NhbGU7XG5cbiAgICAgIGlmIChwcmV2UHJvcHMubG9jYWxlICE9PSBsb2NhbGUpIHtcbiAgICAgICAgKDAsIF9sb2NhbGUuY2hhbmdlQ29uZmlybUxvY2FsZSkobG9jYWxlICYmIGxvY2FsZS5Nb2RhbCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgKDAsIF9sb2NhbGUuY2hhbmdlQ29uZmlybUxvY2FsZSkoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgbG9jYWxlID0gX3RoaXMkcHJvcHMubG9jYWxlLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW47XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbnRleHRbXCJkZWZhdWx0XCJdLlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBsb2NhbGUpLCB7XG4gICAgICAgICAgZXhpc3Q6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0sIGNoaWxkcmVuKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIExvY2FsZVByb3ZpZGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IExvY2FsZVByb3ZpZGVyO1xuTG9jYWxlUHJvdmlkZXIuZGVmYXVsdFByb3BzID0ge1xuICBsb2NhbGU6IHt9XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2VuX1VTID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtcGFnaW5hdGlvbi9saWIvbG9jYWxlL2VuX1VTXCIpKTtcblxudmFyIF9lbl9VUzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9kYXRlLXBpY2tlci9sb2NhbGUvZW5fVVNcIikpO1xuXG52YXIgX2VuX1VTMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3RpbWUtcGlja2VyL2xvY2FsZS9lbl9VU1wiKSk7XG5cbnZhciBfZW5fVVM0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY2FsZW5kYXIvbG9jYWxlL2VuX1VTXCIpKTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXG52YXIgdHlwZVRlbXBsYXRlID0gJyR7bGFiZWx9IGlzIG5vdCBhIHZhbGlkICR7dHlwZX0nO1xudmFyIGxvY2FsZVZhbHVlcyA9IHtcbiAgbG9jYWxlOiAnZW4nLFxuICBQYWdpbmF0aW9uOiBfZW5fVVNbXCJkZWZhdWx0XCJdLFxuICBEYXRlUGlja2VyOiBfZW5fVVMyW1wiZGVmYXVsdFwiXSxcbiAgVGltZVBpY2tlcjogX2VuX1VTM1tcImRlZmF1bHRcIl0sXG4gIENhbGVuZGFyOiBfZW5fVVM0W1wiZGVmYXVsdFwiXSxcbiAgZ2xvYmFsOiB7XG4gICAgcGxhY2Vob2xkZXI6ICdQbGVhc2Ugc2VsZWN0J1xuICB9LFxuICBUYWJsZToge1xuICAgIGZpbHRlclRpdGxlOiAnRmlsdGVyIG1lbnUnLFxuICAgIGZpbHRlckNvbmZpcm06ICdPSycsXG4gICAgZmlsdGVyUmVzZXQ6ICdSZXNldCcsXG4gICAgZmlsdGVyRW1wdHlUZXh0OiAnTm8gZmlsdGVycycsXG4gICAgZW1wdHlUZXh0OiAnTm8gZGF0YScsXG4gICAgc2VsZWN0QWxsOiAnU2VsZWN0IGN1cnJlbnQgcGFnZScsXG4gICAgc2VsZWN0SW52ZXJ0OiAnSW52ZXJ0IGN1cnJlbnQgcGFnZScsXG4gICAgc2VsZWN0aW9uQWxsOiAnU2VsZWN0IGFsbCBkYXRhJyxcbiAgICBzb3J0VGl0bGU6ICdTb3J0JyxcbiAgICBleHBhbmQ6ICdFeHBhbmQgcm93JyxcbiAgICBjb2xsYXBzZTogJ0NvbGxhcHNlIHJvdycsXG4gICAgdHJpZ2dlckRlc2M6ICdDbGljayBzb3J0IGJ5IGRlc2NlbmQnLFxuICAgIHRyaWdnZXJBc2M6ICdDbGljayBzb3J0IGJ5IGFzY2VuZCcsXG4gICAgY2FuY2VsU29ydDogJ0NsaWNrIHRvIGNhbmNlbCBzb3J0J1xuICB9LFxuICBNb2RhbDoge1xuICAgIG9rVGV4dDogJ09LJyxcbiAgICBjYW5jZWxUZXh0OiAnQ2FuY2VsJyxcbiAgICBqdXN0T2tUZXh0OiAnT0snXG4gIH0sXG4gIFBvcGNvbmZpcm06IHtcbiAgICBva1RleHQ6ICdPSycsXG4gICAgY2FuY2VsVGV4dDogJ0NhbmNlbCdcbiAgfSxcbiAgVHJhbnNmZXI6IHtcbiAgICB0aXRsZXM6IFsnJywgJyddLFxuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoIGhlcmUnLFxuICAgIGl0ZW1Vbml0OiAnaXRlbScsXG4gICAgaXRlbXNVbml0OiAnaXRlbXMnLFxuICAgIHJlbW92ZTogJ1JlbW92ZScsXG4gICAgc2VsZWN0Q3VycmVudDogJ1NlbGVjdCBjdXJyZW50IHBhZ2UnLFxuICAgIHJlbW92ZUN1cnJlbnQ6ICdSZW1vdmUgY3VycmVudCBwYWdlJyxcbiAgICBzZWxlY3RBbGw6ICdTZWxlY3QgYWxsIGRhdGEnLFxuICAgIHJlbW92ZUFsbDogJ1JlbW92ZSBhbGwgZGF0YScsXG4gICAgc2VsZWN0SW52ZXJ0OiAnSW52ZXJ0IGN1cnJlbnQgcGFnZSdcbiAgfSxcbiAgVXBsb2FkOiB7XG4gICAgdXBsb2FkaW5nOiAnVXBsb2FkaW5nLi4uJyxcbiAgICByZW1vdmVGaWxlOiAnUmVtb3ZlIGZpbGUnLFxuICAgIHVwbG9hZEVycm9yOiAnVXBsb2FkIGVycm9yJyxcbiAgICBwcmV2aWV3RmlsZTogJ1ByZXZpZXcgZmlsZScsXG4gICAgZG93bmxvYWRGaWxlOiAnRG93bmxvYWQgZmlsZSdcbiAgfSxcbiAgRW1wdHk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ05vIERhdGEnXG4gIH0sXG4gIEljb246IHtcbiAgICBpY29uOiAnaWNvbidcbiAgfSxcbiAgVGV4dDoge1xuICAgIGVkaXQ6ICdFZGl0JyxcbiAgICBjb3B5OiAnQ29weScsXG4gICAgY29waWVkOiAnQ29waWVkJyxcbiAgICBleHBhbmQ6ICdFeHBhbmQnXG4gIH0sXG4gIFBhZ2VIZWFkZXI6IHtcbiAgICBiYWNrOiAnQmFjaydcbiAgfSxcbiAgRm9ybToge1xuICAgIG9wdGlvbmFsOiAnKG9wdGlvbmFsKScsXG4gICAgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXM6IHtcbiAgICAgIFwiZGVmYXVsdFwiOiAnRmllbGQgdmFsaWRhdGlvbiBlcnJvciAke2xhYmVsfScsXG4gICAgICByZXF1aXJlZDogJ1BsZWFzZSBlbnRlciAke2xhYmVsfScsXG4gICAgICBcImVudW1cIjogJyR7bGFiZWx9IG11c3QgYmUgb25lIG9mIFske2VudW19XScsXG4gICAgICB3aGl0ZXNwYWNlOiAnJHtsYWJlbH0gY2Fubm90IGJlIGEgYmxhbmsgY2hhcmFjdGVyJyxcbiAgICAgIGRhdGU6IHtcbiAgICAgICAgZm9ybWF0OiAnJHtsYWJlbH0gZGF0ZSBmb3JtYXQgaXMgaW52YWxpZCcsXG4gICAgICAgIHBhcnNlOiAnJHtsYWJlbH0gY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIGRhdGUnLFxuICAgICAgICBpbnZhbGlkOiAnJHtsYWJlbH0gaXMgYW4gaW52YWxpZCBkYXRlJ1xuICAgICAgfSxcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIHN0cmluZzogdHlwZVRlbXBsYXRlLFxuICAgICAgICBtZXRob2Q6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgYXJyYXk6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgb2JqZWN0OiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIG51bWJlcjogdHlwZVRlbXBsYXRlLFxuICAgICAgICBkYXRlOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIFwiYm9vbGVhblwiOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGludGVnZXI6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgXCJmbG9hdFwiOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIHJlZ2V4cDogdHlwZVRlbXBsYXRlLFxuICAgICAgICBlbWFpbDogdHlwZVRlbXBsYXRlLFxuICAgICAgICB1cmw6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgaGV4OiB0eXBlVGVtcGxhdGVcbiAgICAgIH0sXG4gICAgICBzdHJpbmc6IHtcbiAgICAgICAgbGVuOiAnJHtsYWJlbH0gbXVzdCBiZSAke2xlbn0gY2hhcmFjdGVycycsXG4gICAgICAgIG1pbjogJyR7bGFiZWx9IGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzJyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gdXAgdG8gJHttYXh9IGNoYXJhY3RlcnMnLFxuICAgICAgICByYW5nZTogJyR7bGFiZWx9IG11c3QgYmUgYmV0d2VlbiAke21pbn0tJHttYXh9IGNoYXJhY3RlcnMnXG4gICAgICB9LFxuICAgICAgbnVtYmVyOiB7XG4gICAgICAgIGxlbjogJyR7bGFiZWx9IG11c3QgYmUgZXF1YWwgdG8gJHtsZW59JyxcbiAgICAgICAgbWluOiAnJHtsYWJlbH0gbWluaW11bSB2YWx1ZSBpcyAke21pbn0nLFxuICAgICAgICBtYXg6ICcke2xhYmVsfSBtYXhpbXVtIHZhbHVlIGlzICR7bWF4fScsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0nXG4gICAgICB9LFxuICAgICAgYXJyYXk6IHtcbiAgICAgICAgbGVuOiAnTXVzdCBiZSAke2xlbn0gJHtsYWJlbH0nLFxuICAgICAgICBtaW46ICdBdCBsZWFzdCAke21pbn0gJHtsYWJlbH0nLFxuICAgICAgICBtYXg6ICdBdCBtb3N0ICR7bWF4fSAke2xhYmVsfScsXG4gICAgICAgIHJhbmdlOiAnVGhlIGFtb3VudCBvZiAke2xhYmVsfSBtdXN0IGJlIGJldHdlZW4gJHttaW59LSR7bWF4fSdcbiAgICAgIH0sXG4gICAgICBwYXR0ZXJuOiB7XG4gICAgICAgIG1pc21hdGNoOiAnJHtsYWJlbH0gZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gJHtwYXR0ZXJufSdcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSBsb2NhbGVWYWx1ZXM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmF1bHQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWZhdWx0XCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX2RlZmF1bHQyW1wiZGVmYXVsdFwiXTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHBvcnRzLk9wdGlvbiA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9yY01lbnRpb25zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtbWVudGlvbnNcIikpO1xuXG52YXIgX3NwaW4gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9zcGluXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfcmVmMiA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWZcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgT3B0aW9uID0gX3JjTWVudGlvbnNbXCJkZWZhdWx0XCJdLk9wdGlvbjtcbmV4cG9ydHMuT3B0aW9uID0gT3B0aW9uO1xuXG5mdW5jdGlvbiBsb2FkaW5nRmlsdGVyT3B0aW9uKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIEludGVybmFsTWVudGlvbnMgPSBmdW5jdGlvbiBJbnRlcm5hbE1lbnRpb25zKF9hLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgICBkaXNhYmxlZCA9IF9hLmRpc2FibGVkLFxuICAgICAgbG9hZGluZyA9IF9hLmxvYWRpbmcsXG4gICAgICBmaWx0ZXJPcHRpb24gPSBfYS5maWx0ZXJPcHRpb24sXG4gICAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgICAgbm90Rm91bmRDb250ZW50ID0gX2Eubm90Rm91bmRDb250ZW50LFxuICAgICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJkaXNhYmxlZFwiLCBcImxvYWRpbmdcIiwgXCJmaWx0ZXJPcHRpb25cIiwgXCJjaGlsZHJlblwiLCBcIm5vdEZvdW5kQ29udGVudFwiXSk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGZvY3VzZWQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0Rm9jdXNlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIGlubmVyUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBtZXJnZWRSZWYgPSAoMCwgX3JlZjIuY29tcG9zZVJlZikocmVmLCBpbm5lclJlZik7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICByZW5kZXJFbXB0eSA9IF9SZWFjdCR1c2VDb250ZXh0LnJlbmRlckVtcHR5LFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gIHZhciBvbkZvY3VzID0gZnVuY3Rpb24gb25Gb2N1cygpIHtcbiAgICBpZiAocmVzdFByb3BzLm9uRm9jdXMpIHtcbiAgICAgIHJlc3RQcm9wcy5vbkZvY3VzLmFwcGx5KHJlc3RQcm9wcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBzZXRGb2N1c2VkKHRydWUpO1xuICB9O1xuXG4gIHZhciBvbkJsdXIgPSBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgaWYgKHJlc3RQcm9wcy5vbkJsdXIpIHtcbiAgICAgIHJlc3RQcm9wcy5vbkJsdXIuYXBwbHkocmVzdFByb3BzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHNldEZvY3VzZWQoZmFsc2UpO1xuICB9O1xuXG4gIHZhciBnZXROb3RGb3VuZENvbnRlbnQgPSBmdW5jdGlvbiBnZXROb3RGb3VuZENvbnRlbnQoKSB7XG4gICAgaWYgKG5vdEZvdW5kQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbm90Rm91bmRDb250ZW50O1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJFbXB0eSgnU2VsZWN0Jyk7XG4gIH07XG5cbiAgdmFyIGdldE9wdGlvbnMgPSBmdW5jdGlvbiBnZXRPcHRpb25zKCkge1xuICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3B0aW9uLCB7XG4gICAgICAgIHZhbHVlOiBcIkFOVERfU0VBUkNISU5HXCIsXG4gICAgICAgIGRpc2FibGVkOiB0cnVlXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfc3BpbltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgc2l6ZTogXCJzbWFsbFwiXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9O1xuXG4gIHZhciBnZXRGaWx0ZXJPcHRpb24gPSBmdW5jdGlvbiBnZXRGaWx0ZXJPcHRpb24oKSB7XG4gICAgaWYgKGxvYWRpbmcpIHtcbiAgICAgIHJldHVybiBsb2FkaW5nRmlsdGVyT3B0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJPcHRpb247XG4gIH07XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnbWVudGlvbnMnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgbWVyZ2VkQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpLCBmb2N1c2VkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNNZW50aW9uc1tcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgbm90Rm91bmRDb250ZW50OiBnZXROb3RGb3VuZENvbnRlbnQoKSxcbiAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgZmlsdGVyT3B0aW9uOiBnZXRGaWx0ZXJPcHRpb24oKSxcbiAgICBvbkZvY3VzOiBvbkZvY3VzLFxuICAgIG9uQmx1cjogb25CbHVyLFxuICAgIHJlZjogbWVyZ2VkUmVmXG4gIH0pLCBnZXRPcHRpb25zKCkpO1xufTtcblxudmFyIE1lbnRpb25zID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxNZW50aW9ucyk7XG5NZW50aW9ucy5kaXNwbGF5TmFtZSA9ICdNZW50aW9ucyc7XG5NZW50aW9ucy5PcHRpb24gPSBPcHRpb247XG5cbk1lbnRpb25zLmdldE1lbnRpb25zID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgdmFyIF9yZWYgPSBjb25maWcgfHwge30sXG4gICAgICBfcmVmJHByZWZpeCA9IF9yZWYucHJlZml4LFxuICAgICAgcHJlZml4ID0gX3JlZiRwcmVmaXggPT09IHZvaWQgMCA/ICdAJyA6IF9yZWYkcHJlZml4LFxuICAgICAgX3JlZiRzcGxpdCA9IF9yZWYuc3BsaXQsXG4gICAgICBzcGxpdCA9IF9yZWYkc3BsaXQgPT09IHZvaWQgMCA/ICcgJyA6IF9yZWYkc3BsaXQ7XG5cbiAgdmFyIHByZWZpeExpc3QgPSBBcnJheS5pc0FycmF5KHByZWZpeCkgPyBwcmVmaXggOiBbcHJlZml4XTtcbiAgcmV0dXJuIHZhbHVlLnNwbGl0KHNwbGl0KS5tYXAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgIHZhciBoaXRQcmVmaXggPSBudWxsO1xuICAgIHByZWZpeExpc3Quc29tZShmdW5jdGlvbiAocHJlZml4U3RyKSB7XG4gICAgICB2YXIgc3RhcnRTdHIgPSBzdHIuc2xpY2UoMCwgcHJlZml4U3RyLmxlbmd0aCk7XG5cbiAgICAgIGlmIChzdGFydFN0ciA9PT0gcHJlZml4U3RyKSB7XG4gICAgICAgIGhpdFByZWZpeCA9IHByZWZpeFN0cjtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIGlmIChoaXRQcmVmaXggIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZWZpeDogaGl0UHJlZml4LFxuICAgICAgICB2YWx1ZTogc3RyLnNsaWNlKGhpdFByZWZpeC5sZW5ndGgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9KS5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiAhIWVudGl0eSAmJiAhIWVudGl0eS52YWx1ZTtcbiAgfSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBNZW50aW9ucztcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxudmFyIE1lbnVDb250ZXh0ID0gLyojX19QVVJFX18qLygwLCBfcmVhY3QuY3JlYXRlQ29udGV4dCkoe1xuICBpbmxpbmVDb2xsYXBzZWQ6IGZhbHNlXG59KTtcbnZhciBfZGVmYXVsdCA9IE1lbnVDb250ZXh0O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNNZW51ID0gcmVxdWlyZShcInJjLW1lbnVcIik7XG5cbnZhciBfdG9BcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0NoaWxkcmVuL3RvQXJyYXlcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9NZW51Q29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTWVudUNvbnRleHRcIikpO1xuXG52YXIgX3Rvb2x0aXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi90b29sdGlwXCIpKTtcblxudmFyIF9TaWRlciA9IHJlcXVpcmUoXCIuLi9sYXlvdXQvU2lkZXJcIik7XG5cbnZhciBfcmVhY3ROb2RlID0gcmVxdWlyZShcIi4uL191dGlsL3JlYWN0Tm9kZVwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBNZW51SXRlbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKE1lbnVJdGVtLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShNZW51SXRlbSk7XG5cbiAgZnVuY3Rpb24gTWVudUl0ZW0oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBNZW51SXRlbSk7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIF90aGlzLnJlbmRlckl0ZW0gPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIHNpZGVyQ29sbGFwc2VkID0gX3JlZi5zaWRlckNvbGxhcHNlZDtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGxldmVsID0gX3RoaXMkcHJvcHMubGV2ZWwsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgcm9vdFByZWZpeENscyA9IF90aGlzJHByb3BzLnJvb3RQcmVmaXhDbHM7XG5cbiAgICAgIHZhciBfYSA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHRpdGxlID0gX2EudGl0bGUsXG4gICAgICAgICAgaWNvbiA9IF9hLmljb24sXG4gICAgICAgICAgZGFuZ2VyID0gX2EuZGFuZ2VyLFxuICAgICAgICAgIHJlc3QgPSBfX3Jlc3QoX2EsIFtcInRpdGxlXCIsIFwiaWNvblwiLCBcImRhbmdlclwiXSk7XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTWVudUNvbnRleHRbXCJkZWZhdWx0XCJdLkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICAgIHZhciBpbmxpbmVDb2xsYXBzZWQgPSBfcmVmMi5pbmxpbmVDb2xsYXBzZWQsXG4gICAgICAgICAgICBkaXJlY3Rpb24gPSBfcmVmMi5kaXJlY3Rpb247XG4gICAgICAgIHZhciB0b29sdGlwVGl0bGUgPSB0aXRsZTtcblxuICAgICAgICBpZiAodHlwZW9mIHRpdGxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRvb2x0aXBUaXRsZSA9IGxldmVsID09PSAxID8gY2hpbGRyZW4gOiAnJztcbiAgICAgICAgfSBlbHNlIGlmICh0aXRsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0b29sdGlwVGl0bGUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0b29sdGlwUHJvcHMgPSB7XG4gICAgICAgICAgdGl0bGU6IHRvb2x0aXBUaXRsZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghc2lkZXJDb2xsYXBzZWQgJiYgIWlubGluZUNvbGxhcHNlZCkge1xuICAgICAgICAgIHRvb2x0aXBQcm9wcy50aXRsZSA9IG51bGw7IC8vIFJlc2V0IGB2aXNpYmxlYCB0byBmaXggY29udHJvbCBtb2RlIHRvb2x0aXAgZGlzcGxheSBub3QgY29ycmVjdFxuICAgICAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTY3NDJcblxuICAgICAgICAgIHRvb2x0aXBQcm9wcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGRyZW5MZW5ndGggPSAoMCwgX3RvQXJyYXlbXCJkZWZhdWx0XCJdKShjaGlsZHJlbikubGVuZ3RoO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3Rvb2x0aXBbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHRvb2x0aXBQcm9wcywge1xuICAgICAgICAgIHBsYWNlbWVudDogZGlyZWN0aW9uID09PSAncnRsJyA/ICdsZWZ0JyA6ICdyaWdodCcsXG4gICAgICAgICAgb3ZlcmxheUNsYXNzTmFtZTogXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItaW5saW5lLWNvbGxhcHNlZC10b29sdGlwXCIpXG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNNZW51Lkl0ZW0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcmVzdCwge1xuICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLWl0ZW0tZGFuZ2VyXCIpLCBkYW5nZXIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChyb290UHJlZml4Q2xzLCBcIi1pdGVtLW9ubHktY2hpbGRcIiksIChpY29uID8gY2hpbGRyZW5MZW5ndGggKyAxIDogY2hpbGRyZW5MZW5ndGgpID09PSAxKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpLFxuICAgICAgICAgIHRpdGxlOiB0aXRsZVxuICAgICAgICB9KSwgaWNvbiwgX3RoaXMucmVuZGVySXRlbUNoaWxkcmVuKGlubGluZUNvbGxhcHNlZCkpKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKE1lbnVJdGVtLCBbe1xuICAgIGtleTogXCJyZW5kZXJJdGVtQ2hpbGRyZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVySXRlbUNoaWxkcmVuKGlubGluZUNvbGxhcHNlZCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgaWNvbiA9IF90aGlzJHByb3BzMi5pY29uLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMyLmNoaWxkcmVuLFxuICAgICAgICAgIGxldmVsID0gX3RoaXMkcHJvcHMyLmxldmVsLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucm9vdFByZWZpeENsczsgLy8gaW5saW5lLWNvbGxhcHNlZC5tZCBkZW1vIOS+nei1liBzcGFuIOadpemakOiXj+aWh+WtlyzmnIkgaWNvbiDlsZ7mgKfvvIzliJnlhoXpg6jljIXoo7nkuIDkuKogc3BhblxuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL3B1bGwvMjM0NTZcblxuICAgICAgaWYgKCFpY29uIHx8ICgwLCBfcmVhY3ROb2RlLmlzVmFsaWRFbGVtZW50KShjaGlsZHJlbikgJiYgY2hpbGRyZW4udHlwZSA9PT0gJ3NwYW4nKSB7XG4gICAgICAgIGlmIChjaGlsZHJlbiAmJiBpbmxpbmVDb2xsYXBzZWQgJiYgbGV2ZWwgPT09IDEgJiYgdHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLWlubGluZS1jb2xsYXBzZWQtbm9pY29uXCIpXG4gICAgICAgICAgfSwgY2hpbGRyZW4uY2hhckF0KDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZHJlbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NpZGVyLlNpZGVyQ29udGV4dC5Db25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJJdGVtKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE1lbnVJdGVtO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IE1lbnVJdGVtO1xuTWVudUl0ZW0uaXNNZW51SXRlbSA9IHRydWU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjTWVudSA9IHJlcXVpcmUoXCJyYy1tZW51XCIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfTWVudUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL01lbnVDb250ZXh0XCIpKTtcblxudmFyIF9yZWFjdE5vZGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvcmVhY3ROb2RlXCIpO1xuXG52YXIgU3ViTWVudSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKFN1Yk1lbnUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKFN1Yk1lbnUpO1xuXG4gIGZ1bmN0aW9uIFN1Yk1lbnUoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBTdWJNZW51KTtcbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKFN1Yk1lbnUsIFt7XG4gICAga2V5OiBcInJlbmRlclRpdGxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclRpdGxlKGlubGluZUNvbGxhcHNlZCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBpY29uID0gX3RoaXMkcHJvcHMuaWNvbixcbiAgICAgICAgICB0aXRsZSA9IF90aGlzJHByb3BzLnRpdGxlLFxuICAgICAgICAgIGxldmVsID0gX3RoaXMkcHJvcHMubGV2ZWwsXG4gICAgICAgICAgcm9vdFByZWZpeENscyA9IF90aGlzJHByb3BzLnJvb3RQcmVmaXhDbHM7XG5cbiAgICAgIGlmICghaWNvbikge1xuICAgICAgICByZXR1cm4gaW5saW5lQ29sbGFwc2VkICYmIGxldmVsID09PSAxICYmIHRpdGxlICYmIHR5cGVvZiB0aXRsZSA9PT0gJ3N0cmluZycgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChyb290UHJlZml4Q2xzLCBcIi1pbmxpbmUtY29sbGFwc2VkLW5vaWNvblwiKVxuICAgICAgICB9LCB0aXRsZS5jaGFyQXQoMCkpIDogdGl0bGU7XG4gICAgICB9IC8vIGlubGluZS1jb2xsYXBzZWQubWQgZGVtbyDkvp3otZYgc3BhbiDmnaXpmpDol4/mloflrZcs5pyJIGljb24g5bGe5oCn77yM5YiZ5YaF6YOo5YyF6KO55LiA5LiqIHNwYW5cbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9wdWxsLzIzNDU2XG5cblxuICAgICAgdmFyIHRpdGxlSXNTcGFuID0gKDAsIF9yZWFjdE5vZGUuaXNWYWxpZEVsZW1lbnQpKHRpdGxlKSAmJiB0aXRsZS50eXBlID09PSAnc3Bhbic7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGljb24sIHRpdGxlSXNTcGFuID8gdGl0bGUgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgdGl0bGUpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucm9vdFByZWZpeENscyxcbiAgICAgICAgICBwb3B1cENsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5wb3B1cENsYXNzTmFtZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTWVudUNvbnRleHRbXCJkZWZhdWx0XCJdLkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgaW5saW5lQ29sbGFwc2VkID0gX3JlZi5pbmxpbmVDb2xsYXBzZWQsXG4gICAgICAgICAgICBhbnRkTWVudVRoZW1lID0gX3JlZi5hbnRkTWVudVRoZW1lO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjTWVudS5TdWJNZW51LCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKF90aGlzLnByb3BzLCBbJ2ljb24nXSksIHtcbiAgICAgICAgICB0aXRsZTogX3RoaXMucmVuZGVyVGl0bGUoaW5saW5lQ29sbGFwc2VkKSxcbiAgICAgICAgICBwb3B1cENsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocm9vdFByZWZpeENscywgXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItXCIpLmNvbmNhdChhbnRkTWVudVRoZW1lKSwgcG9wdXBDbGFzc05hbWUpXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gU3ViTWVudTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuU3ViTWVudS5jb250ZXh0VHlwZSA9IF9NZW51Q29udGV4dFtcImRlZmF1bHRcIl07IC8vIGZpeCBpc3N1ZTpodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy84NjY2XG5cblN1Yk1lbnUuaXNTdWJNZW51ID0gMTtcbnZhciBfZGVmYXVsdCA9IFN1Yk1lbnU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY01lbnUgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmMtbWVudVwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX1N1Yk1lbnUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N1Yk1lbnVcIikpO1xuXG52YXIgX01lbnVJdGVtID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9NZW51SXRlbVwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX2Rldldhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC9kZXZXYXJuaW5nXCIpKTtcblxudmFyIF9TaWRlciA9IHJlcXVpcmUoXCIuLi9sYXlvdXQvU2lkZXJcIik7XG5cbnZhciBfbW90aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvbW90aW9uXCIpKTtcblxudmFyIF9NZW51Q29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTWVudUNvbnRleHRcIikpO1xuXG52YXIgSW50ZXJuYWxNZW51ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoSW50ZXJuYWxNZW51LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShJbnRlcm5hbE1lbnUpO1xuXG4gIGZ1bmN0aW9uIEludGVybmFsTWVudShwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgSW50ZXJuYWxNZW51KTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF90aGlzLnJlbmRlck1lbnUgPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGdldFBvcHVwQ29udGFpbmVyID0gX3JlZi5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscyxcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbjtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IF90aGlzJHByb3BzLnByZWZpeENscyxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgdGhlbWUgPSBfdGhpcyRwcm9wcy50aGVtZTtcbiAgICAgIHZhciBkZWZhdWx0TW90aW9ucyA9IHtcbiAgICAgICAgaG9yaXpvbnRhbDoge1xuICAgICAgICAgIG1vdGlvbk5hbWU6ICdzbGlkZS11cCdcbiAgICAgICAgfSxcbiAgICAgICAgaW5saW5lOiBfbW90aW9uW1wiZGVmYXVsdFwiXSxcbiAgICAgICAgb3RoZXI6IHtcbiAgICAgICAgICBtb3Rpb25OYW1lOiAnem9vbS1iaWcnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdtZW51JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICAgIHZhciBtZW51Q2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHRoZW1lKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmxpbmUtY29sbGFwc2VkXCIpLCBfdGhpcy5nZXRJbmxpbmVDb2xsYXBzZWQoKSksIGNsYXNzTmFtZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX01lbnVDb250ZXh0W1wiZGVmYXVsdFwiXS5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGlubGluZUNvbGxhcHNlZDogX3RoaXMuZ2V0SW5saW5lQ29sbGFwc2VkKCkgfHwgZmFsc2UsXG4gICAgICAgICAgYW50ZE1lbnVUaGVtZTogdGhlbWUsXG4gICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgICAgfVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjTWVudVtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgICAgfSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBtZW51Q2xhc3NOYW1lLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICAgIGRlZmF1bHRNb3Rpb25zOiBkZWZhdWx0TW90aW9uc1xuICAgICAgfSkpKTtcbiAgICB9O1xuXG4gICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoISgnaW5saW5lQ29sbGFwc2VkJyBpbiBwcm9wcyAmJiBwcm9wcy5tb2RlICE9PSAnaW5saW5lJyksICdNZW51JywgJ2BpbmxpbmVDb2xsYXBzZWRgIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBgbW9kZWAgaXMgaW5saW5lLicpO1xuICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKCEocHJvcHMuc2lkZXJDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCAmJiAnaW5saW5lQ29sbGFwc2VkJyBpbiBwcm9wcyksICdNZW51JywgJ2BpbmxpbmVDb2xsYXBzZWRgIG5vdCBjb250cm9sIE1lbnUgdW5kZXIgU2lkZXIuIFNob3VsZCBzZXQgYGNvbGxhcHNlZGAgb24gU2lkZXIgaW5zdGVhZC4nKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKEludGVybmFsTWVudSwgW3tcbiAgICBrZXk6IFwiZ2V0SW5saW5lQ29sbGFwc2VkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldElubGluZUNvbGxhcHNlZCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGlubGluZUNvbGxhcHNlZCA9IF90aGlzJHByb3BzMi5pbmxpbmVDb2xsYXBzZWQsXG4gICAgICAgICAgc2lkZXJDb2xsYXBzZWQgPSBfdGhpcyRwcm9wczIuc2lkZXJDb2xsYXBzZWQ7XG5cbiAgICAgIGlmIChzaWRlckNvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzaWRlckNvbGxhcHNlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlubGluZUNvbGxhcHNlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIHRoaXMucmVuZGVyTWVudSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbnRlcm5hbE1lbnU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkludGVybmFsTWVudS5kZWZhdWx0UHJvcHMgPSB7XG4gIGNsYXNzTmFtZTogJycsXG4gIHRoZW1lOiAnbGlnaHQnLFxuICBmb2N1c2FibGU6IGZhbHNlXG59OyAvLyBXZSBzaG91bGQga2VlcCB0aGlzIGFzIHJlZi1hYmxlXG5cbnZhciBNZW51ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50Mikge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKE1lbnUsIF9SZWFjdCRDb21wb25lbnQyKTtcblxuICB2YXIgX3N1cGVyMiA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoTWVudSk7XG5cbiAgZnVuY3Rpb24gTWVudSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIE1lbnUpO1xuICAgIHJldHVybiBfc3VwZXIyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKE1lbnUsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TaWRlci5TaWRlckNvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbE1lbnUsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgX3RoaXMyLnByb3BzLCBjb250ZXh0KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE1lbnU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gTWVudTtcbk1lbnUuRGl2aWRlciA9IF9yY01lbnUuRGl2aWRlcjtcbk1lbnUuSXRlbSA9IF9NZW51SXRlbVtcImRlZmF1bHRcIl07XG5NZW51LlN1Yk1lbnUgPSBfU3ViTWVudVtcImRlZmF1bHRcIl07XG5NZW51Lkl0ZW1Hcm91cCA9IF9yY01lbnUuSXRlbUdyb3VwOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gY3JlYXRlVXNlTWVzc2FnZTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3VzZU5vdGlmaWNhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLW5vdGlmaWNhdGlvbi9saWIvdXNlTm90aWZpY2F0aW9uXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uXCIpO1xuXG5mdW5jdGlvbiBjcmVhdGVVc2VNZXNzYWdlKGdldFJjTm90aWZpY2F0aW9uSW5zdGFuY2UsIGdldFJDTm90aWNlUHJvcHMpIHtcbiAgdmFyIHVzZU1lc3NhZ2UgPSBmdW5jdGlvbiB1c2VNZXNzYWdlKCkge1xuICAgIC8vIFdlIGNhbiBvbmx5IGdldCBjb250ZW50IGJ5IHJlbmRlclxuICAgIHZhciBnZXRQcmVmaXhDbHM7IC8vIFdlIGNyZWF0ZSBhIHByb3h5IHRvIGhhbmRsZSBkZWxheSBjcmVhdGVkIGluc3RhbmNlXG5cbiAgICB2YXIgaW5uZXJJbnN0YW5jZSA9IG51bGw7XG4gICAgdmFyIHByb3h5ID0ge1xuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQobm90aWNlUHJvcHMsIGhvbGRlckNhbGxiYWNrKSB7XG4gICAgICAgIGlubmVySW5zdGFuY2UgPT09IG51bGwgfHwgaW5uZXJJbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5uZXJJbnN0YW5jZS5jb21wb25lbnQuYWRkKG5vdGljZVByb3BzLCBob2xkZXJDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBfdXNlUkNOb3RpZmljYXRpb24gPSAoMCwgX3VzZU5vdGlmaWNhdGlvbltcImRlZmF1bHRcIl0pKHByb3h5KSxcbiAgICAgICAgX3VzZVJDTm90aWZpY2F0aW9uMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfdXNlUkNOb3RpZmljYXRpb24sIDIpLFxuICAgICAgICBob29rTm90aWZ5ID0gX3VzZVJDTm90aWZpY2F0aW9uMlswXSxcbiAgICAgICAgaG9sZGVyID0gX3VzZVJDTm90aWZpY2F0aW9uMlsxXTtcblxuICAgIGZ1bmN0aW9uIG5vdGlmeShhcmdzKSB7XG4gICAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gYXJncy5wcmVmaXhDbHM7XG4gICAgICB2YXIgbWVyZ2VkUHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdtZXNzYWdlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICAgIHZhciB0YXJnZXQgPSBhcmdzLmtleSB8fCAoMCwgXy5nZXRLZXlUaGVuSW5jcmVhc2VLZXkpKCk7XG4gICAgICB2YXIgY2xvc2VQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBhcmdzLm9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGFyZ3Mub25DbG9zZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFJjTm90aWZpY2F0aW9uSW5zdGFuY2UoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgYXJncyksIHtcbiAgICAgICAgICBwcmVmaXhDbHM6IG1lcmdlZFByZWZpeENsc1xuICAgICAgICB9KSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICAgICAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgICAgICBpbm5lckluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaG9va05vdGlmeShnZXRSQ05vdGljZVByb3BzKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGFyZ3MpLCB7XG4gICAgICAgICAgICBrZXk6IHRhcmdldCxcbiAgICAgICAgICAgIG9uQ2xvc2U6IGNhbGxiYWNrXG4gICAgICAgICAgfSksIHByZWZpeENscykpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24gcmVzdWx0KCkge1xuICAgICAgICBpZiAoaW5uZXJJbnN0YW5jZSkge1xuICAgICAgICAgIGlubmVySW5zdGFuY2UucmVtb3ZlTm90aWNlKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlc3VsdC50aGVuID0gZnVuY3Rpb24gKGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGNsb3NlUHJvbWlzZS50aGVuKGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgICAgfTtcblxuICAgICAgcmVzdWx0LnByb21pc2UgPSBjbG9zZVByb21pc2U7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gLy8gRmlsbCBmdW5jdGlvbnNcblxuXG4gICAgdmFyIGhvb2tBcGlSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICAgIGhvb2tBcGlSZWYuY3VycmVudC5vcGVuID0gbm90aWZ5O1xuICAgIFsnc3VjY2VzcycsICdpbmZvJywgJ3dhcm5pbmcnLCAnZXJyb3InLCAnbG9hZGluZyddLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIHJldHVybiAoMCwgXy5hdHRhY2hUeXBlQXBpKShob29rQXBpUmVmLmN1cnJlbnQsIHR5cGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBbaG9va0FwaVJlZi5jdXJyZW50LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIHtcbiAgICAgIGtleTogXCJob2xkZXJcIlxuICAgIH0sIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBnZXRQcmVmaXhDbHMgPSBjb250ZXh0LmdldFByZWZpeENscztcbiAgICAgIHJldHVybiBob2xkZXI7XG4gICAgfSldO1xuICB9O1xuXG4gIHJldHVybiB1c2VNZXNzYWdlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0S2V5VGhlbkluY3JlYXNlS2V5ID0gZ2V0S2V5VGhlbkluY3JlYXNlS2V5O1xuZXhwb3J0cy5hdHRhY2hUeXBlQXBpID0gYXR0YWNoVHlwZUFwaTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcmNOb3RpZmljYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1ub3RpZmljYXRpb25cIikpO1xuXG52YXIgX0xvYWRpbmdPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0xvYWRpbmdPdXRsaW5lZFwiKSk7XG5cbnZhciBfRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfQ2xvc2VDaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfQ2hlY2tDaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DaGVja0NpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfSW5mb0NpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0luZm9DaXJjbGVGaWxsZWRcIikpO1xuXG52YXIgX3VzZU1lc3NhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZU1lc3NhZ2VcIikpO1xuXG52YXIgbWVzc2FnZUluc3RhbmNlO1xudmFyIGRlZmF1bHREdXJhdGlvbiA9IDM7XG52YXIgZGVmYXVsdFRvcDtcbnZhciBrZXkgPSAxO1xudmFyIGxvY2FsUHJlZml4Q2xzID0gJ2FudC1tZXNzYWdlJztcbnZhciB0cmFuc2l0aW9uTmFtZSA9ICdtb3ZlLXVwJztcbnZhciBnZXRDb250YWluZXI7XG52YXIgbWF4Q291bnQ7XG52YXIgcnRsID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGdldEtleVRoZW5JbmNyZWFzZUtleSgpIHtcbiAgcmV0dXJuIGtleSsrO1xufVxuXG5mdW5jdGlvbiBzZXRNZXNzYWdlQ29uZmlnKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWZhdWx0VG9wID0gb3B0aW9ucy50b3A7XG4gICAgbWVzc2FnZUluc3RhbmNlID0gbnVsbDsgLy8gZGVsZXRlIG1lc3NhZ2VJbnN0YW5jZSBmb3IgbmV3IGRlZmF1bHRUb3BcbiAgfVxuXG4gIGlmIChvcHRpb25zLmR1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWZhdWx0RHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucHJlZml4Q2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbFByZWZpeENscyA9IG9wdGlvbnMucHJlZml4Q2xzO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZ2V0Q29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBnZXRDb250YWluZXIgPSBvcHRpb25zLmdldENvbnRhaW5lcjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRyYW5zaXRpb25OYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cmFuc2l0aW9uTmFtZSA9IG9wdGlvbnMudHJhbnNpdGlvbk5hbWU7XG4gICAgbWVzc2FnZUluc3RhbmNlID0gbnVsbDsgLy8gZGVsZXRlIG1lc3NhZ2VJbnN0YW5jZSBmb3IgbmV3IHRyYW5zaXRpb25OYW1lXG4gIH1cblxuICBpZiAob3B0aW9ucy5tYXhDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWF4Q291bnQgPSBvcHRpb25zLm1heENvdW50O1xuICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7XG4gIH1cblxuICBpZiAob3B0aW9ucy5ydGwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJ0bCA9IG9wdGlvbnMucnRsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJDTm90aWZpY2F0aW9uSW5zdGFuY2UoYXJncywgY2FsbGJhY2spIHtcbiAgdmFyIHByZWZpeENscyA9IGFyZ3MucHJlZml4Q2xzIHx8IGxvY2FsUHJlZml4Q2xzO1xuXG4gIGlmIChtZXNzYWdlSW5zdGFuY2UpIHtcbiAgICBjYWxsYmFjayh7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGluc3RhbmNlOiBtZXNzYWdlSW5zdGFuY2VcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBfcmNOb3RpZmljYXRpb25bXCJkZWZhdWx0XCJdLm5ld0luc3RhbmNlKHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB0cmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgc3R5bGU6IHtcbiAgICAgIHRvcDogZGVmYXVsdFRvcFxuICAgIH0sXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgbWF4Q291bnQ6IG1heENvdW50XG4gIH0sIGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIGlmIChtZXNzYWdlSW5zdGFuY2UpIHtcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGluc3RhbmNlOiBtZXNzYWdlSW5zdGFuY2VcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1lc3NhZ2VJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIGNhbGxiYWNrKHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgfSk7XG4gIH0pO1xufVxuXG52YXIgdHlwZVRvSWNvbiA9IHtcbiAgaW5mbzogX0luZm9DaXJjbGVGaWxsZWRbXCJkZWZhdWx0XCJdLFxuICBzdWNjZXNzOiBfQ2hlY2tDaXJjbGVGaWxsZWRbXCJkZWZhdWx0XCJdLFxuICBlcnJvcjogX0Nsb3NlQ2lyY2xlRmlsbGVkW1wiZGVmYXVsdFwiXSxcbiAgd2FybmluZzogX0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkW1wiZGVmYXVsdFwiXSxcbiAgbG9hZGluZzogX0xvYWRpbmdPdXRsaW5lZFtcImRlZmF1bHRcIl1cbn07XG5cbmZ1bmN0aW9uIGdldFJDTm90aWNlUHJvcHMoYXJncywgcHJlZml4Q2xzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcblxuICB2YXIgZHVyYXRpb24gPSBhcmdzLmR1cmF0aW9uICE9PSB1bmRlZmluZWQgPyBhcmdzLmR1cmF0aW9uIDogZGVmYXVsdER1cmF0aW9uO1xuICB2YXIgSWNvbkNvbXBvbmVudCA9IHR5cGVUb0ljb25bYXJncy50eXBlXTtcbiAgdmFyIG1lc3NhZ2VDbGFzcyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY3VzdG9tLWNvbnRlbnRcIiksIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYXJncy50eXBlKSwgYXJncy50eXBlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIHJ0bCA9PT0gdHJ1ZSksIF9jbGFzc05hbWVzKSk7XG4gIHJldHVybiB7XG4gICAga2V5OiBhcmdzLmtleSxcbiAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgc3R5bGU6IGFyZ3Muc3R5bGUgfHwge30sXG4gICAgY2xhc3NOYW1lOiBhcmdzLmNsYXNzTmFtZSxcbiAgICBjb250ZW50OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IG1lc3NhZ2VDbGFzc1xuICAgIH0sIGFyZ3MuaWNvbiB8fCBJY29uQ29tcG9uZW50ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25Db21wb25lbnQsIG51bGwpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgYXJncy5jb250ZW50KSksXG4gICAgb25DbG9zZTogYXJncy5vbkNsb3NlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vdGljZShhcmdzKSB7XG4gIHZhciB0YXJnZXQgPSBhcmdzLmtleSB8fCBrZXkrKztcbiAgdmFyIGNsb3NlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZ3Mub25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhcmdzLm9uQ2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSk7XG4gICAgfTtcblxuICAgIGdldFJDTm90aWZpY2F0aW9uSW5zdGFuY2UoYXJncywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgICBpbnN0YW5jZS5ub3RpY2UoZ2V0UkNOb3RpY2VQcm9wcygoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBhcmdzKSwge1xuICAgICAgICBrZXk6IHRhcmdldCxcbiAgICAgICAgb25DbG9zZTogY2FsbGJhY2tcbiAgICAgIH0pLCBwcmVmaXhDbHMpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uIHJlc3VsdCgpIHtcbiAgICBpZiAobWVzc2FnZUluc3RhbmNlKSB7XG4gICAgICBtZXNzYWdlSW5zdGFuY2UucmVtb3ZlTm90aWNlKHRhcmdldCk7XG4gICAgfVxuICB9O1xuXG4gIHJlc3VsdC50aGVuID0gZnVuY3Rpb24gKGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gY2xvc2VQcm9taXNlLnRoZW4oZmlsbGVkLCByZWplY3RlZCk7XG4gIH07XG5cbiAgcmVzdWx0LnByb21pc2UgPSBjbG9zZVByb21pc2U7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzQXJnc1Byb3BzKGNvbnRlbnQpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjb250ZW50KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgJiYgISFjb250ZW50LmNvbnRlbnQ7XG59XG5cbnZhciBhcGkgPSB7XG4gIG9wZW46IG5vdGljZSxcbiAgY29uZmlnOiBzZXRNZXNzYWdlQ29uZmlnLFxuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KG1lc3NhZ2VLZXkpIHtcbiAgICBpZiAobWVzc2FnZUluc3RhbmNlKSB7XG4gICAgICBpZiAobWVzc2FnZUtleSkge1xuICAgICAgICB2YXIgX21lc3NhZ2VJbnN0YW5jZSA9IG1lc3NhZ2VJbnN0YW5jZSxcbiAgICAgICAgICAgIHJlbW92ZU5vdGljZSA9IF9tZXNzYWdlSW5zdGFuY2UucmVtb3ZlTm90aWNlO1xuICAgICAgICByZW1vdmVOb3RpY2UobWVzc2FnZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX21lc3NhZ2VJbnN0YW5jZTIgPSBtZXNzYWdlSW5zdGFuY2UsXG4gICAgICAgICAgICBkZXN0cm95ID0gX21lc3NhZ2VJbnN0YW5jZTIuZGVzdHJveTtcbiAgICAgICAgZGVzdHJveSgpO1xuICAgICAgICBtZXNzYWdlSW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gYXR0YWNoVHlwZUFwaShvcmlnaW5hbEFwaSwgdHlwZSkge1xuICBvcmlnaW5hbEFwaVt0eXBlXSA9IGZ1bmN0aW9uIChjb250ZW50LCBkdXJhdGlvbiwgb25DbG9zZSkge1xuICAgIGlmIChpc0FyZ3NQcm9wcyhjb250ZW50KSkge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsQXBpLm9wZW4oKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgY29udGVudCksIHtcbiAgICAgICAgdHlwZTogdHlwZVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZHVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9uQ2xvc2UgPSBkdXJhdGlvbjtcbiAgICAgIGR1cmF0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBvcmlnaW5hbEFwaS5vcGVuKHtcbiAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgb25DbG9zZTogb25DbG9zZVxuICAgIH0pO1xuICB9O1xufVxuXG5bJ3N1Y2Nlc3MnLCAnaW5mbycsICd3YXJuaW5nJywgJ2Vycm9yJywgJ2xvYWRpbmcnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gIHJldHVybiBhdHRhY2hUeXBlQXBpKGFwaSwgdHlwZSk7XG59KTtcbmFwaS53YXJuID0gYXBpLndhcm5pbmc7XG5hcGkudXNlTWVzc2FnZSA9ICgwLCBfdXNlTWVzc2FnZVtcImRlZmF1bHRcIl0pKGdldFJDTm90aWZpY2F0aW9uSW5zdGFuY2UsIGdldFJDTm90aWNlUHJvcHMpO1xudmFyIF9kZWZhdWx0ID0gYXBpO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2J1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2J1dHRvblwiKSk7XG5cbnZhciBfYnV0dG9uMiA9IHJlcXVpcmUoXCIuLi9idXR0b24vYnV0dG9uXCIpO1xuXG52YXIgQWN0aW9uQnV0dG9uID0gZnVuY3Rpb24gQWN0aW9uQnV0dG9uKHByb3BzKSB7XG4gIHZhciBjbGlja2VkUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdmFyIHJlZiA9IFJlYWN0LnVzZVJlZigpO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBsb2FkaW5nID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldExvYWRpbmcgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRpbWVvdXRJZDtcblxuICAgIGlmIChwcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgIHZhciAkdGhpcyA9IHJlZi5jdXJyZW50O1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAkdGhpcy5mb2N1cygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHZhciBoYW5kbGVQcm9taXNlT25PayA9IGZ1bmN0aW9uIGhhbmRsZVByb21pc2VPbk9rKHJldHVyblZhbHVlT2ZPbk9rKSB7XG4gICAgdmFyIGNsb3NlTW9kYWwgPSBwcm9wcy5jbG9zZU1vZGFsO1xuXG4gICAgaWYgKCFyZXR1cm5WYWx1ZU9mT25PayB8fCAhcmV0dXJuVmFsdWVPZk9uT2sudGhlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgcmV0dXJuVmFsdWVPZk9uT2sudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBJdCdzIHVubmVjZXNzYXJ5IHRvIHNldCBsb2FkaW5nPWZhbHNlLCBmb3IgdGhlIE1vZGFsIHdpbGwgYmUgdW5tb3VudGVkIGFmdGVyIGNsb3NlLlxuICAgICAgLy8gc2V0U3RhdGUoeyBsb2FkaW5nOiBmYWxzZSB9KTtcbiAgICAgIGNsb3NlTW9kYWwuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAvLyBFbWl0IGVycm9yIHdoZW4gY2F0Y2ggcHJvbWlzZSByZWplY3RcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKGUpOyAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzYxODNcblxuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICBjbGlja2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgb25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgdmFyIGFjdGlvbkZuID0gcHJvcHMuYWN0aW9uRm4sXG4gICAgICAgIGNsb3NlTW9kYWwgPSBwcm9wcy5jbG9zZU1vZGFsO1xuXG4gICAgaWYgKGNsaWNrZWRSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsaWNrZWRSZWYuY3VycmVudCA9IHRydWU7XG5cbiAgICBpZiAoIWFjdGlvbkZuKSB7XG4gICAgICBjbG9zZU1vZGFsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJldHVyblZhbHVlT2ZPbk9rO1xuXG4gICAgaWYgKGFjdGlvbkZuLmxlbmd0aCkge1xuICAgICAgcmV0dXJuVmFsdWVPZk9uT2sgPSBhY3Rpb25GbihjbG9zZU1vZGFsKTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjMzNThcblxuICAgICAgY2xpY2tlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlT2ZPbk9rID0gYWN0aW9uRm4oKTtcblxuICAgICAgaWYgKCFyZXR1cm5WYWx1ZU9mT25Paykge1xuICAgICAgICBjbG9zZU1vZGFsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVQcm9taXNlT25PayhyZXR1cm5WYWx1ZU9mT25Payk7XG4gIH07XG5cbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGJ1dHRvblByb3BzID0gcHJvcHMuYnV0dG9uUHJvcHM7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCAoMCwgX2J1dHRvbjIuY29udmVydExlZ2FjeVByb3BzKSh0eXBlKSwge1xuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgbG9hZGluZzogbG9hZGluZyxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9LCBidXR0b25Qcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pLCBjaGlsZHJlbik7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBBY3Rpb25CdXR0b247XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9Nb2RhbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTW9kYWxcIikpO1xuXG52YXIgX0FjdGlvbkJ1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQWN0aW9uQnV0dG9uXCIpKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBDb25maXJtRGlhbG9nID0gZnVuY3Rpb24gQ29uZmlybURpYWxvZyhwcm9wcykge1xuICB2YXIgaWNvbiA9IHByb3BzLmljb24sXG4gICAgICBvbkNhbmNlbCA9IHByb3BzLm9uQ2FuY2VsLFxuICAgICAgb25PayA9IHByb3BzLm9uT2ssXG4gICAgICBjbG9zZSA9IHByb3BzLmNsb3NlLFxuICAgICAgekluZGV4ID0gcHJvcHMuekluZGV4LFxuICAgICAgYWZ0ZXJDbG9zZSA9IHByb3BzLmFmdGVyQ2xvc2UsXG4gICAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgIGtleWJvYXJkID0gcHJvcHMua2V5Ym9hcmQsXG4gICAgICBjZW50ZXJlZCA9IHByb3BzLmNlbnRlcmVkLFxuICAgICAgZ2V0Q29udGFpbmVyID0gcHJvcHMuZ2V0Q29udGFpbmVyLFxuICAgICAgbWFza1N0eWxlID0gcHJvcHMubWFza1N0eWxlLFxuICAgICAgb2tUZXh0ID0gcHJvcHMub2tUZXh0LFxuICAgICAgb2tCdXR0b25Qcm9wcyA9IHByb3BzLm9rQnV0dG9uUHJvcHMsXG4gICAgICBjYW5jZWxUZXh0ID0gcHJvcHMuY2FuY2VsVGV4dCxcbiAgICAgIGNhbmNlbEJ1dHRvblByb3BzID0gcHJvcHMuY2FuY2VsQnV0dG9uUHJvcHMsXG4gICAgICBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICByb290UHJlZml4Q2xzID0gcHJvcHMucm9vdFByZWZpeENscztcbiAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoISh0eXBlb2YgaWNvbiA9PT0gJ3N0cmluZycgJiYgaWNvbi5sZW5ndGggPiAyKSwgJ01vZGFsJywgXCJgaWNvbmAgaXMgdXNpbmcgUmVhY3ROb2RlIGluc3RlYWQgb2Ygc3RyaW5nIG5hbWluZyBpbiB2NC4gUGxlYXNlIGNoZWNrIGBcIi5jb25jYXQoaWNvbiwgXCJgIGF0IGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2ljb25cIikpOyAvLyDmlK/mjIHkvKDlhaV7IGljb246IG51bGwgfeadpemakOiXj2BNb2RhbC5jb25maXJtYOm7mOiupOeahEljb25cblxuICB2YXIgb2tUeXBlID0gcHJvcHMub2tUeXBlIHx8ICdwcmltYXJ5JztcbiAgdmFyIGNvbnRlbnRQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbmZpcm1cIik7IC8vIOm7mOiupOS4uiB0cnVl77yM5L+d5oyB5ZCR5LiL5YW85a65XG5cbiAgdmFyIG9rQ2FuY2VsID0gJ29rQ2FuY2VsJyBpbiBwcm9wcyA/IHByb3BzLm9rQ2FuY2VsIDogdHJ1ZTtcbiAgdmFyIHdpZHRoID0gcHJvcHMud2lkdGggfHwgNDE2O1xuICB2YXIgc3R5bGUgPSBwcm9wcy5zdHlsZSB8fCB7fTtcbiAgdmFyIG1hc2sgPSBwcm9wcy5tYXNrID09PSB1bmRlZmluZWQgPyB0cnVlIDogcHJvcHMubWFzazsgLy8g6buY6K6k5Li6IGZhbHNl77yM5L+d5oyB5pen54mI6buY6K6k6KGM5Li6XG5cbiAgdmFyIG1hc2tDbG9zYWJsZSA9IHByb3BzLm1hc2tDbG9zYWJsZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBwcm9wcy5tYXNrQ2xvc2FibGU7XG4gIHZhciBhdXRvRm9jdXNCdXR0b24gPSBwcm9wcy5hdXRvRm9jdXNCdXR0b24gPT09IG51bGwgPyBmYWxzZSA6IHByb3BzLmF1dG9Gb2N1c0J1dHRvbiB8fCAnb2snO1xuICB2YXIgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSB8fCAnem9vbSc7XG4gIHZhciBtYXNrVHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5tYXNrVHJhbnNpdGlvbk5hbWUgfHwgJ2ZhZGUnO1xuICB2YXIgY2xhc3NTdHJpbmcgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShjb250ZW50UHJlZml4Q2xzLCBcIlwiLmNvbmNhdChjb250ZW50UHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHByb3BzLnR5cGUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChjb250ZW50UHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBwcm9wcy5jbGFzc05hbWUpO1xuICB2YXIgY2FuY2VsQnV0dG9uID0gb2tDYW5jZWwgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0FjdGlvbkJ1dHRvbltcImRlZmF1bHRcIl0sIHtcbiAgICBhY3Rpb25Gbjogb25DYW5jZWwsXG4gICAgY2xvc2VNb2RhbDogY2xvc2UsXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXNCdXR0b24gPT09ICdjYW5jZWwnLFxuICAgIGJ1dHRvblByb3BzOiBjYW5jZWxCdXR0b25Qcm9wcyxcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLWJ0blwiKVxuICB9LCBjYW5jZWxUZXh0KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Nb2RhbFtcImRlZmF1bHRcIl0sIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgIHdyYXBDbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKCgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KGNvbnRlbnRQcmVmaXhDbHMsIFwiLWNlbnRlcmVkXCIpLCAhIXByb3BzLmNlbnRlcmVkKSksXG4gICAgb25DYW5jZWw6IGZ1bmN0aW9uIG9uQ2FuY2VsKCkge1xuICAgICAgcmV0dXJuIGNsb3NlKHtcbiAgICAgICAgdHJpZ2dlckNhbmNlbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIHRyYW5zaXRpb25OYW1lOiB0cmFuc2l0aW9uTmFtZSxcbiAgICBmb290ZXI6IFwiXCIsXG4gICAgbWFza1RyYW5zaXRpb25OYW1lOiBtYXNrVHJhbnNpdGlvbk5hbWUsXG4gICAgbWFzazogbWFzayxcbiAgICBtYXNrQ2xvc2FibGU6IG1hc2tDbG9zYWJsZSxcbiAgICBtYXNrU3R5bGU6IG1hc2tTdHlsZSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIHpJbmRleDogekluZGV4LFxuICAgIGFmdGVyQ2xvc2U6IGFmdGVyQ2xvc2UsXG4gICAga2V5Ym9hcmQ6IGtleWJvYXJkLFxuICAgIGNlbnRlcmVkOiBjZW50ZXJlZCxcbiAgICBnZXRDb250YWluZXI6IGdldENvbnRhaW5lclxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjb250ZW50UHJlZml4Q2xzLCBcIi1ib2R5LXdyYXBwZXJcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY29udGVudFByZWZpeENscywgXCItYm9keVwiKVxuICB9LCBpY29uLCBwcm9wcy50aXRsZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjb250ZW50UHJlZml4Q2xzLCBcIi10aXRsZVwiKVxuICB9LCBwcm9wcy50aXRsZSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGNvbnRlbnRQcmVmaXhDbHMsIFwiLWNvbnRlbnRcIilcbiAgfSwgcHJvcHMuY29udGVudCkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjb250ZW50UHJlZml4Q2xzLCBcIi1idG5zXCIpXG4gIH0sIGNhbmNlbEJ1dHRvbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0FjdGlvbkJ1dHRvbltcImRlZmF1bHRcIl0sIHtcbiAgICB0eXBlOiBva1R5cGUsXG4gICAgYWN0aW9uRm46IG9uT2ssXG4gICAgY2xvc2VNb2RhbDogY2xvc2UsXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXNCdXR0b24gPT09ICdvaycsXG4gICAgYnV0dG9uUHJvcHM6IG9rQnV0dG9uUHJvcHMsXG4gICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChyb290UHJlZml4Q2xzLCBcIi1idG5cIilcbiAgfSwgb2tUZXh0KSkpKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IENvbmZpcm1EaWFsb2c7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXhwb3J0cy5kZXN0cm95Rm5zID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY0RpYWxvZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLWRpYWxvZ1wiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiKSk7XG5cbnZhciBfQ2xvc2VPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlT3V0bGluZWRcIikpO1xuXG52YXIgX3VzZU1vZGFsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91c2VNb2RhbFwiKSk7XG5cbnZhciBfbG9jYWxlID0gcmVxdWlyZShcIi4vbG9jYWxlXCIpO1xuXG52YXIgX2J1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2J1dHRvblwiKSk7XG5cbnZhciBfYnV0dG9uMiA9IHJlcXVpcmUoXCIuLi9idXR0b24vYnV0dG9uXCIpO1xuXG52YXIgX0xvY2FsZVJlY2VpdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgbW91c2VQb3NpdGlvbjtcbnZhciBkZXN0cm95Rm5zID0gW107IC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTU3OTVcblxuZXhwb3J0cy5kZXN0cm95Rm5zID0gZGVzdHJveUZucztcblxudmFyIGdldENsaWNrUG9zaXRpb24gPSBmdW5jdGlvbiBnZXRDbGlja1Bvc2l0aW9uKGUpIHtcbiAgbW91c2VQb3NpdGlvbiA9IHtcbiAgICB4OiBlLnBhZ2VYLFxuICAgIHk6IGUucGFnZVlcbiAgfTsgLy8gMTAwbXMg5YaF5Y+R55Sf6L+H54K55Ye75LqL5Lu277yM5YiZ5LuO54K55Ye75L2N572u5Yqo55S75bGV56S6XG4gIC8vIOWQpuWImeebtOaOpSB6b29tIOWxleekulxuICAvLyDov5nmoLflj6/ku6XlhbzlrrnpnZ7ngrnlh7vmlrnlvI/lsZXlvIBcblxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBtb3VzZVBvc2l0aW9uID0gbnVsbDtcbiAgfSwgMTAwKTtcbn07IC8vIOWPquacieeCueWHu+S6i+S7tuaUr+aMgeS7jum8oOagh+S9jee9ruWKqOeUu+WxleW8gFxuXG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAoMCwgX2FkZEV2ZW50TGlzdGVuZXJbXCJkZWZhdWx0XCJdKShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdjbGljaycsIGdldENsaWNrUG9zaXRpb24pO1xufVxuXG52YXIgTW9kYWwgPSBmdW5jdGlvbiBNb2RhbChwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgaGFuZGxlQ2FuY2VsID0gZnVuY3Rpb24gaGFuZGxlQ2FuY2VsKGUpIHtcbiAgICB2YXIgb25DYW5jZWwgPSBwcm9wcy5vbkNhbmNlbDtcblxuICAgIGlmIChvbkNhbmNlbCkge1xuICAgICAgb25DYW5jZWwoZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVPayA9IGZ1bmN0aW9uIGhhbmRsZU9rKGUpIHtcbiAgICB2YXIgb25PayA9IHByb3BzLm9uT2s7XG5cbiAgICBpZiAob25Paykge1xuICAgICAgb25PayhlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJlbmRlckZvb3RlciA9IGZ1bmN0aW9uIHJlbmRlckZvb3Rlcihsb2NhbGUpIHtcbiAgICB2YXIgb2tUZXh0ID0gcHJvcHMub2tUZXh0LFxuICAgICAgICBva1R5cGUgPSBwcm9wcy5va1R5cGUsXG4gICAgICAgIGNhbmNlbFRleHQgPSBwcm9wcy5jYW5jZWxUZXh0LFxuICAgICAgICBjb25maXJtTG9hZGluZyA9IHByb3BzLmNvbmZpcm1Mb2FkaW5nO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2J1dHRvbltcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBvbkNsaWNrOiBoYW5kbGVDYW5jZWxcbiAgICB9LCBwcm9wcy5jYW5jZWxCdXR0b25Qcm9wcyksIGNhbmNlbFRleHQgfHwgbG9jYWxlLmNhbmNlbFRleHQpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCAoMCwgX2J1dHRvbjIuY29udmVydExlZ2FjeVByb3BzKShva1R5cGUpLCB7XG4gICAgICBsb2FkaW5nOiBjb25maXJtTG9hZGluZyxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZU9rXG4gICAgfSwgcHJvcHMub2tCdXR0b25Qcm9wcyksIG9rVGV4dCB8fCBsb2NhbGUub2tUZXh0KSk7XG4gIH07XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGZvb3RlciA9IHByb3BzLmZvb3RlcixcbiAgICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgd3JhcENsYXNzTmFtZSA9IHByb3BzLndyYXBDbGFzc05hbWUsXG4gICAgICBjZW50ZXJlZCA9IHByb3BzLmNlbnRlcmVkLFxuICAgICAgZ2V0Q29udGFpbmVyID0gcHJvcHMuZ2V0Q29udGFpbmVyLFxuICAgICAgY2xvc2VJY29uID0gcHJvcHMuY2xvc2VJY29uLFxuICAgICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJmb290ZXJcIiwgXCJ2aXNpYmxlXCIsIFwid3JhcENsYXNzTmFtZVwiLCBcImNlbnRlcmVkXCIsIFwiZ2V0Q29udGFpbmVyXCIsIFwiY2xvc2VJY29uXCJdKTtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdtb2RhbCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBkZWZhdWx0Rm9vdGVyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwge1xuICAgIGNvbXBvbmVudE5hbWU6IFwiTW9kYWxcIixcbiAgICBkZWZhdWx0TG9jYWxlOiAoMCwgX2xvY2FsZS5nZXRDb25maXJtTG9jYWxlKSgpXG4gIH0sIHJlbmRlckZvb3Rlcik7XG4gIHZhciBjbG9zZUljb25Ub1JlbmRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlLXhcIilcbiAgfSwgY2xvc2VJY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbG9zZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbG9zZS1pY29uXCIpXG4gIH0pKTtcbiAgdmFyIHdyYXBDbGFzc05hbWVFeHRlbmRlZCA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHdyYXBDbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNlbnRlcmVkXCIpLCAhIWNlbnRlcmVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNEaWFsb2dbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHJlc3RQcm9wcywge1xuICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyID09PSB1bmRlZmluZWQgPyBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgOiBnZXRDb250YWluZXIsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgd3JhcENsYXNzTmFtZTogd3JhcENsYXNzTmFtZUV4dGVuZGVkLFxuICAgIGZvb3RlcjogZm9vdGVyID09PSB1bmRlZmluZWQgPyBkZWZhdWx0Rm9vdGVyIDogZm9vdGVyLFxuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgbW91c2VQb3NpdGlvbjogbW91c2VQb3NpdGlvbixcbiAgICBvbkNsb3NlOiBoYW5kbGVDYW5jZWwsXG4gICAgY2xvc2VJY29uOiBjbG9zZUljb25Ub1JlbmRlclxuICB9KSk7XG59O1xuXG5Nb2RhbC51c2VNb2RhbCA9IF91c2VNb2RhbFtcImRlZmF1bHRcIl07XG5Nb2RhbC5kZWZhdWx0UHJvcHMgPSB7XG4gIHdpZHRoOiA1MjAsXG4gIHRyYW5zaXRpb25OYW1lOiAnem9vbScsXG4gIG1hc2tUcmFuc2l0aW9uTmFtZTogJ2ZhZGUnLFxuICBjb25maXJtTG9hZGluZzogZmFsc2UsXG4gIHZpc2libGU6IGZhbHNlLFxuICBva1R5cGU6ICdwcmltYXJ5J1xufTtcbnZhciBfZGVmYXVsdCA9IE1vZGFsO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGNvbmZpcm07XG5leHBvcnRzLndpdGhXYXJuID0gd2l0aFdhcm47XG5leHBvcnRzLndpdGhJbmZvID0gd2l0aEluZm87XG5leHBvcnRzLndpdGhTdWNjZXNzID0gd2l0aFN1Y2Nlc3M7XG5leHBvcnRzLndpdGhFcnJvciA9IHdpdGhFcnJvcjtcbmV4cG9ydHMud2l0aENvbmZpcm0gPSB3aXRoQ29uZmlybTtcbmV4cG9ydHMuZ2xvYmFsQ29uZmlnID0gZ2xvYmFsQ29uZmlnO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIFJlYWN0RE9NID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0LWRvbVwiKSk7XG5cbnZhciBfSW5mb0NpcmNsZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvSW5mb0NpcmNsZU91dGxpbmVkXCIpKTtcblxudmFyIF9DaGVja0NpcmNsZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2hlY2tDaXJjbGVPdXRsaW5lZFwiKSk7XG5cbnZhciBfQ2xvc2VDaXJjbGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlQ2lyY2xlT3V0bGluZWRcIikpO1xuXG52YXIgX0V4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkXCIpKTtcblxudmFyIF9sb2NhbGUgPSByZXF1aXJlKFwiLi9sb2NhbGVcIik7XG5cbnZhciBfTW9kYWwgPSByZXF1aXJlKFwiLi9Nb2RhbFwiKTtcblxudmFyIF9Db25maXJtRGlhbG9nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db25maXJtRGlhbG9nXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBkZWZhdWx0Um9vdFByZWZpeENscyA9ICdhbnQnO1xuXG5mdW5jdGlvbiBnZXRSb290UHJlZml4Q2xzKCkge1xuICByZXR1cm4gZGVmYXVsdFJvb3RQcmVmaXhDbHM7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm0oY29uZmlnKSB7XG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG5cbiAgdmFyIGN1cnJlbnRDb25maWcgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBjb25maWcpLCB7XG4gICAgY2xvc2U6IGNsb3NlLFxuICAgIHZpc2libGU6IHRydWVcbiAgfSk7XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICB2YXIgdW5tb3VudFJlc3VsdCA9IFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUoZGl2KTtcblxuICAgIGlmICh1bm1vdW50UmVzdWx0ICYmIGRpdi5wYXJlbnROb2RlKSB7XG4gICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaXYpO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgdHJpZ2dlckNhbmNlbCA9IGFyZ3Muc29tZShmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgIHJldHVybiBwYXJhbSAmJiBwYXJhbS50cmlnZ2VyQ2FuY2VsO1xuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5vbkNhbmNlbCAmJiB0cmlnZ2VyQ2FuY2VsKSB7XG4gICAgICBjb25maWcub25DYW5jZWwuYXBwbHkoY29uZmlnLCBhcmdzKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9Nb2RhbC5kZXN0cm95Rm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZm4gPSBfTW9kYWwuZGVzdHJveUZuc1tpXTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuXG4gICAgICBpZiAoZm4gPT09IGNsb3NlKSB7XG4gICAgICAgIF9Nb2RhbC5kZXN0cm95Rm5zLnNwbGljZShpLCAxKTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXIoX2EpIHtcbiAgICB2YXIgb2tUZXh0ID0gX2Eub2tUZXh0LFxuICAgICAgICBjYW5jZWxUZXh0ID0gX2EuY2FuY2VsVGV4dCxcbiAgICAgICAgcHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgICBwcm9wcyA9IF9fcmVzdChfYSwgW1wib2tUZXh0XCIsIFwiY2FuY2VsVGV4dFwiLCBcInByZWZpeENsc1wiXSk7XG4gICAgLyoqXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjM2MjNcbiAgICAgKiBTeW5jIHJlbmRlciBibG9ja3MgUmVhY3QgZXZlbnQuIExldCdzIG1ha2UgdGhpcyBhc3luYy5cbiAgICAgKi9cblxuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcnVudGltZUxvY2FsZSA9ICgwLCBfbG9jYWxlLmdldENvbmZpcm1Mb2NhbGUpKCk7XG4gICAgICBSZWFjdERPTS5yZW5kZXIoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Db25maXJtRGlhbG9nW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBwcm9wcywge1xuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyB8fCBcIlwiLmNvbmNhdChnZXRSb290UHJlZml4Q2xzKCksIFwiLW1vZGFsXCIpLFxuICAgICAgICByb290UHJlZml4Q2xzOiBnZXRSb290UHJlZml4Q2xzKCksXG4gICAgICAgIG9rVGV4dDogb2tUZXh0IHx8IChwcm9wcy5va0NhbmNlbCA/IHJ1bnRpbWVMb2NhbGUub2tUZXh0IDogcnVudGltZUxvY2FsZS5qdXN0T2tUZXh0KSxcbiAgICAgICAgY2FuY2VsVGV4dDogY2FuY2VsVGV4dCB8fCBydW50aW1lTG9jYWxlLmNhbmNlbFRleHRcbiAgICAgIH0pKSwgZGl2KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIGN1cnJlbnRDb25maWcgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBjdXJyZW50Q29uZmlnKSwge1xuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBhZnRlckNsb3NlOiBkZXN0cm95LmJpbmQuYXBwbHkoZGVzdHJveSwgW3RoaXNdLmNvbmNhdChhcmdzKSlcbiAgICB9KTtcbiAgICByZW5kZXIoY3VycmVudENvbmZpZyk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUobmV3Q29uZmlnKSB7XG4gICAgY3VycmVudENvbmZpZyA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGN1cnJlbnRDb25maWcpLCBuZXdDb25maWcpO1xuICAgIHJlbmRlcihjdXJyZW50Q29uZmlnKTtcbiAgfVxuXG4gIHJlbmRlcihjdXJyZW50Q29uZmlnKTtcblxuICBfTW9kYWwuZGVzdHJveUZucy5wdXNoKGNsb3NlKTtcblxuICByZXR1cm4ge1xuICAgIGRlc3Ryb3k6IGNsb3NlLFxuICAgIHVwZGF0ZTogdXBkYXRlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdpdGhXYXJuKHByb3BzKSB7XG4gIHJldHVybiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpLFxuICAgIG9rQ2FuY2VsOiBmYWxzZVxuICB9LCBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHdpdGhJbmZvKHByb3BzKSB7XG4gIHJldHVybiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgIHR5cGU6ICdpbmZvJyxcbiAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfSW5mb0NpcmNsZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCksXG4gICAgb2tDYW5jZWw6IGZhbHNlXG4gIH0sIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gd2l0aFN1Y2Nlc3MocHJvcHMpIHtcbiAgcmV0dXJuICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DaGVja0NpcmNsZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCksXG4gICAgb2tDYW5jZWw6IGZhbHNlXG4gIH0sIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gd2l0aEVycm9yKHByb3BzKSB7XG4gIHJldHVybiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgIHR5cGU6ICdlcnJvcicsXG4gICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlQ2lyY2xlT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSxcbiAgICBva0NhbmNlbDogZmFsc2VcbiAgfSwgcHJvcHMpO1xufVxuXG5mdW5jdGlvbiB3aXRoQ29uZmlybShwcm9wcykge1xuICByZXR1cm4gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICB0eXBlOiAnY29uZmlybScsXG4gICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0V4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSxcbiAgICBva0NhbmNlbDogdHJ1ZVxuICB9LCBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIGdsb2JhbENvbmZpZyhfcmVmKSB7XG4gIHZhciByb290UHJlZml4Q2xzID0gX3JlZi5yb290UHJlZml4Q2xzO1xuXG4gIGlmIChyb290UHJlZml4Q2xzKSB7XG4gICAgZGVmYXVsdFJvb3RQcmVmaXhDbHMgPSByb290UHJlZml4Q2xzO1xuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9Nb2RhbCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL01vZGFsXCIpKTtcblxudmFyIF9jb25maXJtID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vY29uZmlybVwiKSk7XG5cbmZ1bmN0aW9uIG1vZGFsV2Fybihwcm9wcykge1xuICByZXR1cm4gKDAsIF9jb25maXJtW1wiZGVmYXVsdFwiXSkoKDAsIF9jb25maXJtLndpdGhXYXJuKShwcm9wcykpO1xufVxuXG52YXIgTW9kYWwgPSBfTW9kYWxbXCJkZWZhdWx0XCJdO1xuXG5Nb2RhbC5pbmZvID0gZnVuY3Rpb24gaW5mb0ZuKHByb3BzKSB7XG4gIHJldHVybiAoMCwgX2NvbmZpcm1bXCJkZWZhdWx0XCJdKSgoMCwgX2NvbmZpcm0ud2l0aEluZm8pKHByb3BzKSk7XG59O1xuXG5Nb2RhbC5zdWNjZXNzID0gZnVuY3Rpb24gc3VjY2Vzc0ZuKHByb3BzKSB7XG4gIHJldHVybiAoMCwgX2NvbmZpcm1bXCJkZWZhdWx0XCJdKSgoMCwgX2NvbmZpcm0ud2l0aFN1Y2Nlc3MpKHByb3BzKSk7XG59O1xuXG5Nb2RhbC5lcnJvciA9IGZ1bmN0aW9uIGVycm9yRm4ocHJvcHMpIHtcbiAgcmV0dXJuICgwLCBfY29uZmlybVtcImRlZmF1bHRcIl0pKCgwLCBfY29uZmlybS53aXRoRXJyb3IpKHByb3BzKSk7XG59O1xuXG5Nb2RhbC53YXJuaW5nID0gbW9kYWxXYXJuO1xuTW9kYWwud2FybiA9IG1vZGFsV2FybjtcblxuTW9kYWwuY29uZmlybSA9IGZ1bmN0aW9uIGNvbmZpcm1Gbihwcm9wcykge1xuICByZXR1cm4gKDAsIF9jb25maXJtW1wiZGVmYXVsdFwiXSkoKDAsIF9jb25maXJtLndpdGhDb25maXJtKShwcm9wcykpO1xufTtcblxuTW9kYWwuZGVzdHJveUFsbCA9IGZ1bmN0aW9uIGRlc3Ryb3lBbGxGbigpIHtcbiAgd2hpbGUgKF9Nb2RhbC5kZXN0cm95Rm5zLmxlbmd0aCkge1xuICAgIHZhciBjbG9zZSA9IF9Nb2RhbC5kZXN0cm95Rm5zLnBvcCgpO1xuXG4gICAgaWYgKGNsb3NlKSB7XG4gICAgICBjbG9zZSgpO1xuICAgIH1cbiAgfVxufTtcblxuTW9kYWwuY29uZmlnID0gX2NvbmZpcm0uZ2xvYmFsQ29uZmlnO1xudmFyIF9kZWZhdWx0ID0gTW9kYWw7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2hhbmdlQ29uZmlybUxvY2FsZSA9IGNoYW5nZUNvbmZpcm1Mb2NhbGU7XG5leHBvcnRzLmdldENvbmZpcm1Mb2NhbGUgPSBnZXRDb25maXJtTG9jYWxlO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlL2RlZmF1bHRcIikpO1xuXG52YXIgcnVudGltZUxvY2FsZSA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgX2RlZmF1bHRbXCJkZWZhdWx0XCJdLk1vZGFsKTtcblxuZnVuY3Rpb24gY2hhbmdlQ29uZmlybUxvY2FsZShuZXdMb2NhbGUpIHtcbiAgaWYgKG5ld0xvY2FsZSkge1xuICAgIHJ1bnRpbWVMb2NhbGUgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBydW50aW1lTG9jYWxlKSwgbmV3TG9jYWxlKTtcbiAgfSBlbHNlIHtcbiAgICBydW50aW1lTG9jYWxlID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBfZGVmYXVsdFtcImRlZmF1bHRcIl0uTW9kYWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpcm1Mb2NhbGUoKSB7XG4gIHJldHVybiBydW50aW1lTG9jYWxlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfQ29uZmlybURpYWxvZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL0NvbmZpcm1EaWFsb2dcIikpO1xuXG52YXIgX2RlZmF1bHQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vbG9jYWxlL2RlZmF1bHRcIikpO1xuXG52YXIgX0xvY2FsZVJlY2VpdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBIb29rTW9kYWwgPSBmdW5jdGlvbiBIb29rTW9kYWwoX3JlZiwgcmVmKSB7XG4gIHZhciBhZnRlckNsb3NlID0gX3JlZi5hZnRlckNsb3NlLFxuICAgICAgY29uZmlnID0gX3JlZi5jb25maWc7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHRydWUpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgdmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGNvbmZpZyksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgICAgaW5uZXJDb25maWcgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0SW5uZXJDb25maWcgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzO1xuXG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ21vZGFsJyk7XG4gIHZhciByb290UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCk7XG5cbiAgZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgc2V0VmlzaWJsZShmYWxzZSk7XG4gIH1cblxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkZXN0cm95OiBjbG9zZSxcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG5ld0NvbmZpZykge1xuICAgICAgICBzZXRJbm5lckNvbmZpZyhmdW5jdGlvbiAob3JpZ2luQ29uZmlnKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIG9yaWdpbkNvbmZpZyksIG5ld0NvbmZpZyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwge1xuICAgIGNvbXBvbmVudE5hbWU6IFwiTW9kYWxcIixcbiAgICBkZWZhdWx0TG9jYWxlOiBfZGVmYXVsdDJbXCJkZWZhdWx0XCJdLk1vZGFsXG4gIH0sIGZ1bmN0aW9uIChtb2RhbExvY2FsZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ29uZmlybURpYWxvZ1tcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHJvb3RQcmVmaXhDbHM6IHJvb3RQcmVmaXhDbHNcbiAgICB9LCBpbm5lckNvbmZpZywge1xuICAgICAgY2xvc2U6IGNsb3NlLFxuICAgICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICAgIGFmdGVyQ2xvc2U6IGFmdGVyQ2xvc2UsXG4gICAgICBva1RleHQ6IGlubmVyQ29uZmlnLm9rVGV4dCB8fCAoaW5uZXJDb25maWcub2tDYW5jZWwgPyBtb2RhbExvY2FsZS5va1RleHQgOiBtb2RhbExvY2FsZS5qdXN0T2tUZXh0KSxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgY2FuY2VsVGV4dDogaW5uZXJDb25maWcuY2FuY2VsVGV4dCB8fCBtb2RhbExvY2FsZS5jYW5jZWxUZXh0XG4gICAgfSkpO1xuICB9KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEhvb2tNb2RhbCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB1c2VNb2RhbDtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXNlUGF0Y2hFbGVtZW50MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL191dGlsL2hvb2tzL3VzZVBhdGNoRWxlbWVudFwiKSk7XG5cbnZhciBfSG9va01vZGFsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Ib29rTW9kYWxcIikpO1xuXG52YXIgX2NvbmZpcm0gPSByZXF1aXJlKFwiLi4vY29uZmlybVwiKTtcblxudmFyIHV1aWQgPSAwO1xuXG5mdW5jdGlvbiB1c2VNb2RhbCgpIHtcbiAgdmFyIF91c2VQYXRjaEVsZW1lbnQgPSAoMCwgX3VzZVBhdGNoRWxlbWVudDNbXCJkZWZhdWx0XCJdKSgpLFxuICAgICAgX3VzZVBhdGNoRWxlbWVudDIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX3VzZVBhdGNoRWxlbWVudCwgMiksXG4gICAgICBlbGVtZW50cyA9IF91c2VQYXRjaEVsZW1lbnQyWzBdLFxuICAgICAgcGF0Y2hFbGVtZW50ID0gX3VzZVBhdGNoRWxlbWVudDJbMV07XG5cbiAgZnVuY3Rpb24gZ2V0Q29uZmlybUZ1bmMod2l0aEZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaG9va0NvbmZpcm0oY29uZmlnKSB7XG4gICAgICB1dWlkICs9IDE7XG4gICAgICB2YXIgbW9kYWxSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgICB2YXIgY2xvc2VGdW5jO1xuICAgICAgdmFyIG1vZGFsID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0hvb2tNb2RhbFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAga2V5OiBcIm1vZGFsLVwiLmNvbmNhdCh1dWlkKSxcbiAgICAgICAgY29uZmlnOiB3aXRoRnVuYyhjb25maWcpLFxuICAgICAgICByZWY6IG1vZGFsUmVmLFxuICAgICAgICBhZnRlckNsb3NlOiBmdW5jdGlvbiBhZnRlckNsb3NlKCkge1xuICAgICAgICAgIGNsb3NlRnVuYygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNsb3NlRnVuYyA9IHBhdGNoRWxlbWVudChtb2RhbCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICAgIGlmIChtb2RhbFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBtb2RhbFJlZi5jdXJyZW50LmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG5ld0NvbmZpZykge1xuICAgICAgICAgIGlmIChtb2RhbFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBtb2RhbFJlZi5jdXJyZW50LnVwZGF0ZShuZXdDb25maWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIFt7XG4gICAgaW5mbzogZ2V0Q29uZmlybUZ1bmMoX2NvbmZpcm0ud2l0aEluZm8pLFxuICAgIHN1Y2Nlc3M6IGdldENvbmZpcm1GdW5jKF9jb25maXJtLndpdGhTdWNjZXNzKSxcbiAgICBlcnJvcjogZ2V0Q29uZmlybUZ1bmMoX2NvbmZpcm0ud2l0aEVycm9yKSxcbiAgICB3YXJuaW5nOiBnZXRDb25maXJtRnVuYyhfY29uZmlybS53aXRoV2FybiksXG4gICAgY29uZmlybTogZ2V0Q29uZmlybUZ1bmMoX2NvbmZpcm0ud2l0aENvbmZpcm0pXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBlbGVtZW50cyldO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gY3JlYXRlVXNlTm90aWZpY2F0aW9uO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXNlTm90aWZpY2F0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtbm90aWZpY2F0aW9uL2xpYi91c2VOb3RpZmljYXRpb25cIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxuZnVuY3Rpb24gY3JlYXRlVXNlTm90aWZpY2F0aW9uKGdldE5vdGlmaWNhdGlvbkluc3RhbmNlLCBnZXRSQ05vdGljZVByb3BzKSB7XG4gIHZhciB1c2VOb3RpZmljYXRpb24gPSBmdW5jdGlvbiB1c2VOb3RpZmljYXRpb24oKSB7XG4gICAgLy8gV2UgY2FuIG9ubHkgZ2V0IGNvbnRlbnQgYnkgcmVuZGVyXG4gICAgdmFyIGdldFByZWZpeENsczsgLy8gV2UgY3JlYXRlIGEgcHJveHkgdG8gaGFuZGxlIGRlbGF5IGNyZWF0ZWQgaW5zdGFuY2VcblxuICAgIHZhciBpbm5lckluc3RhbmNlID0gbnVsbDtcbiAgICB2YXIgcHJveHkgPSB7XG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChub3RpY2VQcm9wcywgaG9sZGVyQ2FsbGJhY2spIHtcbiAgICAgICAgaW5uZXJJbnN0YW5jZSA9PT0gbnVsbCB8fCBpbm5lckluc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbm5lckluc3RhbmNlLmNvbXBvbmVudC5hZGQobm90aWNlUHJvcHMsIGhvbGRlckNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIF91c2VSQ05vdGlmaWNhdGlvbiA9ICgwLCBfdXNlTm90aWZpY2F0aW9uW1wiZGVmYXVsdFwiXSkocHJveHkpLFxuICAgICAgICBfdXNlUkNOb3RpZmljYXRpb24yID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VSQ05vdGlmaWNhdGlvbiwgMiksXG4gICAgICAgIGhvb2tOb3RpZnkgPSBfdXNlUkNOb3RpZmljYXRpb24yWzBdLFxuICAgICAgICBob2xkZXIgPSBfdXNlUkNOb3RpZmljYXRpb24yWzFdO1xuXG4gICAgZnVuY3Rpb24gbm90aWZ5KGFyZ3MpIHtcbiAgICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBhcmdzLnByZWZpeENscztcbiAgICAgIHZhciBtZXJnZWRQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ25vdGlmaWNhdGlvbicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgICBnZXROb3RpZmljYXRpb25JbnN0YW5jZSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBhcmdzKSwge1xuICAgICAgICBwcmVmaXhDbHM6IG1lcmdlZFByZWZpeENsc1xuICAgICAgfSksIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgICAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgICAgaW5uZXJJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBob29rTm90aWZ5KGdldFJDTm90aWNlUHJvcHMoYXJncywgcHJlZml4Q2xzKSk7XG4gICAgICB9KTtcbiAgICB9IC8vIEZpbGwgZnVuY3Rpb25zXG5cblxuICAgIHZhciBob29rQXBpUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgICBob29rQXBpUmVmLmN1cnJlbnQub3BlbiA9IG5vdGlmeTtcbiAgICBbJ3N1Y2Nlc3MnLCAnaW5mbycsICd3YXJuaW5nJywgJ2Vycm9yJ10uZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgICAgaG9va0FwaVJlZi5jdXJyZW50W3R5cGVdID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tBcGlSZWYuY3VycmVudC5vcGVuKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGFyZ3MpLCB7XG4gICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICB9KSk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiBbaG9va0FwaVJlZi5jdXJyZW50LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIHtcbiAgICAgIGtleTogXCJob2xkZXJcIlxuICAgIH0sIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBnZXRQcmVmaXhDbHMgPSBjb250ZXh0LmdldFByZWZpeENscztcbiAgICAgIHJldHVybiBob2xkZXI7XG4gICAgfSldO1xuICB9O1xuXG4gIHJldHVybiB1c2VOb3RpZmljYXRpb247XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjTm90aWZpY2F0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtbm90aWZpY2F0aW9uXCIpKTtcblxudmFyIF9DbG9zZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VPdXRsaW5lZFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX0NoZWNrQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DaGVja0NpcmNsZU91dGxpbmVkXCIpKTtcblxudmFyIF9DbG9zZUNpcmNsZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVPdXRsaW5lZFwiKSk7XG5cbnZhciBfRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0V4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWRcIikpO1xuXG52YXIgX0luZm9DaXJjbGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0luZm9DaXJjbGVPdXRsaW5lZFwiKSk7XG5cbnZhciBfdXNlTm90aWZpY2F0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VOb3RpZmljYXRpb25cIikpO1xuXG52YXIgbm90aWZpY2F0aW9uSW5zdGFuY2UgPSB7fTtcbnZhciBkZWZhdWx0RHVyYXRpb24gPSA0LjU7XG52YXIgZGVmYXVsdFRvcCA9IDI0O1xudmFyIGRlZmF1bHRCb3R0b20gPSAyNDtcbnZhciBkZWZhdWx0UHJlZml4Q2xzID0gJ2FudC1ub3RpZmljYXRpb24nO1xudmFyIGRlZmF1bHRQbGFjZW1lbnQgPSAndG9wUmlnaHQnO1xudmFyIGRlZmF1bHRHZXRDb250YWluZXI7XG52YXIgZGVmYXVsdENsb3NlSWNvbjtcbnZhciBydGwgPSBmYWxzZTtcblxuZnVuY3Rpb24gc2V0Tm90aWZpY2F0aW9uQ29uZmlnKG9wdGlvbnMpIHtcbiAgdmFyIGR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbixcbiAgICAgIHBsYWNlbWVudCA9IG9wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm90dG9tID0gb3B0aW9ucy5ib3R0b20sXG4gICAgICB0b3AgPSBvcHRpb25zLnRvcCxcbiAgICAgIGdldENvbnRhaW5lciA9IG9wdGlvbnMuZ2V0Q29udGFpbmVyLFxuICAgICAgY2xvc2VJY29uID0gb3B0aW9ucy5jbG9zZUljb24sXG4gICAgICBwcmVmaXhDbHMgPSBvcHRpb25zLnByZWZpeENscztcblxuICBpZiAocHJlZml4Q2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWZhdWx0UHJlZml4Q2xzID0gcHJlZml4Q2xzO1xuICB9XG5cbiAgaWYgKGR1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWZhdWx0RHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgfVxuXG4gIGlmIChwbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGRlZmF1bHRQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5ydGwpIHtcbiAgICBkZWZhdWx0UGxhY2VtZW50ID0gJ3RvcExlZnQnO1xuICB9XG5cbiAgaWYgKGJvdHRvbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdEJvdHRvbSA9IGJvdHRvbTtcbiAgfVxuXG4gIGlmICh0b3AgIT09IHVuZGVmaW5lZCkge1xuICAgIGRlZmF1bHRUb3AgPSB0b3A7XG4gIH1cblxuICBpZiAoZ2V0Q29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWZhdWx0R2V0Q29udGFpbmVyID0gZ2V0Q29udGFpbmVyO1xuICB9XG5cbiAgaWYgKGNsb3NlSWNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdENsb3NlSWNvbiA9IGNsb3NlSWNvbjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnJ0bCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcnRsID0gb3B0aW9ucy5ydGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UGxhY2VtZW50U3R5bGUocGxhY2VtZW50KSB7XG4gIHZhciB0b3AgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGRlZmF1bHRUb3A7XG4gIHZhciBib3R0b20gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGRlZmF1bHRCb3R0b207XG4gIHZhciBzdHlsZTtcblxuICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgIGNhc2UgJ3RvcExlZnQnOlxuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBib3R0b206ICdhdXRvJ1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndG9wUmlnaHQnOlxuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgYm90dG9tOiAnYXV0bydcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JvdHRvbUxlZnQnOlxuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgICBib3R0b206IGJvdHRvbVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHN0eWxlID0ge1xuICAgICAgICByaWdodDogMCxcbiAgICAgICAgdG9wOiAnYXV0bycsXG4gICAgICAgIGJvdHRvbTogYm90dG9tXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gc3R5bGU7XG59XG5cbmZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvbkluc3RhbmNlKGFyZ3MsIGNhbGxiYWNrKSB7XG4gIHZhciBfYXJncyRwbGFjZW1lbnQgPSBhcmdzLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9hcmdzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gZGVmYXVsdFBsYWNlbWVudCA6IF9hcmdzJHBsYWNlbWVudCxcbiAgICAgIHRvcCA9IGFyZ3MudG9wLFxuICAgICAgYm90dG9tID0gYXJncy5ib3R0b20sXG4gICAgICBfYXJncyRnZXRDb250YWluZXIgPSBhcmdzLmdldENvbnRhaW5lcixcbiAgICAgIGdldENvbnRhaW5lciA9IF9hcmdzJGdldENvbnRhaW5lciA9PT0gdm9pZCAwID8gZGVmYXVsdEdldENvbnRhaW5lciA6IF9hcmdzJGdldENvbnRhaW5lcixcbiAgICAgIF9hcmdzJGNsb3NlSWNvbiA9IGFyZ3MuY2xvc2VJY29uLFxuICAgICAgY2xvc2VJY29uID0gX2FyZ3MkY2xvc2VJY29uID09PSB2b2lkIDAgPyBkZWZhdWx0Q2xvc2VJY29uIDogX2FyZ3MkY2xvc2VJY29uO1xuICB2YXIgb3V0ZXJQcmVmaXhDbHMgPSBhcmdzLnByZWZpeENscyB8fCBkZWZhdWx0UHJlZml4Q2xzO1xuICB2YXIgcHJlZml4Q2xzID0gXCJcIi5jb25jYXQob3V0ZXJQcmVmaXhDbHMsIFwiLW5vdGljZVwiKTtcbiAgdmFyIGNhY2hlS2V5ID0gXCJcIi5jb25jYXQob3V0ZXJQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQocGxhY2VtZW50KTtcbiAgdmFyIGNhY2hlSW5zdGFuY2UgPSBub3RpZmljYXRpb25JbnN0YW5jZVtjYWNoZUtleV07XG5cbiAgaWYgKGNhY2hlSW5zdGFuY2UpIHtcbiAgICBQcm9taXNlLnJlc29sdmUoY2FjaGVJbnN0YW5jZSkudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGNsb3NlSWNvblRvUmVuZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KG91dGVyUHJlZml4Q2xzLCBcIi1jbG9zZS14XCIpXG4gIH0sIGNsb3NlSWNvbiB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2xvc2VPdXRsaW5lZFtcImRlZmF1bHRcIl0sIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KG91dGVyUHJlZml4Q2xzLCBcIi1jbG9zZS1pY29uXCIpXG4gIH0pKTtcbiAgdmFyIG5vdGlmaWNhdGlvbkNsYXNzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQob3V0ZXJQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQocGxhY2VtZW50KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQob3V0ZXJQcmVmaXhDbHMsIFwiLXJ0bFwiKSwgcnRsID09PSB0cnVlKSk7XG4gIG5vdGlmaWNhdGlvbkluc3RhbmNlW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgX3JjTm90aWZpY2F0aW9uW1wiZGVmYXVsdFwiXS5uZXdJbnN0YW5jZSh7XG4gICAgICBwcmVmaXhDbHM6IG91dGVyUHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lOiBub3RpZmljYXRpb25DbGFzcyxcbiAgICAgIHN0eWxlOiBnZXRQbGFjZW1lbnRTdHlsZShwbGFjZW1lbnQsIHRvcCwgYm90dG9tKSxcbiAgICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyLFxuICAgICAgY2xvc2VJY29uOiBjbG9zZUljb25Ub1JlbmRlclxuICAgIH0sIGZ1bmN0aW9uIChub3RpZmljYXRpb24pIHtcbiAgICAgIHJlc29sdmUobm90aWZpY2F0aW9uKTtcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGluc3RhbmNlOiBub3RpZmljYXRpb25cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxudmFyIHR5cGVUb0ljb24gPSB7XG4gIHN1Y2Nlc3M6IF9DaGVja0NpcmNsZU91dGxpbmVkW1wiZGVmYXVsdFwiXSxcbiAgaW5mbzogX0luZm9DaXJjbGVPdXRsaW5lZFtcImRlZmF1bHRcIl0sXG4gIGVycm9yOiBfQ2xvc2VDaXJjbGVPdXRsaW5lZFtcImRlZmF1bHRcIl0sXG4gIHdhcm5pbmc6IF9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkW1wiZGVmYXVsdFwiXVxufTtcblxuZnVuY3Rpb24gZ2V0UkNOb3RpY2VQcm9wcyhhcmdzLCBwcmVmaXhDbHMpIHtcbiAgdmFyIGR1cmF0aW9uID0gYXJncy5kdXJhdGlvbiA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdER1cmF0aW9uIDogYXJncy5kdXJhdGlvbjtcbiAgdmFyIGljb25Ob2RlID0gbnVsbDtcblxuICBpZiAoYXJncy5pY29uKSB7XG4gICAgaWNvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb25cIilcbiAgICB9LCBhcmdzLmljb24pO1xuICB9IGVsc2UgaWYgKGFyZ3MudHlwZSkge1xuICAgIGljb25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQodHlwZVRvSWNvblthcmdzLnR5cGVdIHx8IG51bGwsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uIFwiKS5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uLVwiKS5jb25jYXQoYXJncy50eXBlKVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIGF1dG9NYXJnaW5UYWcgPSAhYXJncy5kZXNjcmlwdGlvbiAmJiBpY29uTm9kZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lc3NhZ2Utc2luZ2xlLWxpbmUtYXV0by1tYXJnaW5cIilcbiAgfSkgOiBudWxsO1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogaWNvbk5vZGUgPyBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdpdGgtaWNvblwiKSA6ICcnLFxuICAgICAgcm9sZTogXCJhbGVydFwiXG4gICAgfSwgaWNvbk5vZGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZXNzYWdlXCIpXG4gICAgfSwgYXV0b01hcmdpblRhZywgYXJncy5tZXNzYWdlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRlc2NyaXB0aW9uXCIpXG4gICAgfSwgYXJncy5kZXNjcmlwdGlvbiksIGFyZ3MuYnRuID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1idG5cIilcbiAgICB9LCBhcmdzLmJ0bikgOiBudWxsKSxcbiAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgY2xvc2FibGU6IHRydWUsXG4gICAgb25DbG9zZTogYXJncy5vbkNsb3NlLFxuICAgIG9uQ2xpY2s6IGFyZ3Mub25DbGljayxcbiAgICBrZXk6IGFyZ3Mua2V5LFxuICAgIHN0eWxlOiBhcmdzLnN0eWxlIHx8IHt9LFxuICAgIGNsYXNzTmFtZTogYXJncy5jbGFzc05hbWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm90aWNlKGFyZ3MpIHtcbiAgZ2V0Tm90aWZpY2F0aW9uSW5zdGFuY2UoYXJncywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICBpbnN0YW5jZS5ub3RpY2UoZ2V0UkNOb3RpY2VQcm9wcyhhcmdzLCBwcmVmaXhDbHMpKTtcbiAgfSk7XG59XG5cbnZhciBhcGkgPSB7XG4gIG9wZW46IG5vdGljZSxcbiAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKGtleSkge1xuICAgIE9iamVjdC5rZXlzKG5vdGlmaWNhdGlvbkluc3RhbmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChjYWNoZUtleSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShub3RpZmljYXRpb25JbnN0YW5jZVtjYWNoZUtleV0pLnRoZW4oZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgIGluc3RhbmNlLnJlbW92ZU5vdGljZShrZXkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGNvbmZpZzogc2V0Tm90aWZpY2F0aW9uQ29uZmlnLFxuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIE9iamVjdC5rZXlzKG5vdGlmaWNhdGlvbkluc3RhbmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChjYWNoZUtleSkge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKG5vdGlmaWNhdGlvbkluc3RhbmNlW2NhY2hlS2V5XSkudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgaW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgbm90aWZpY2F0aW9uSW5zdGFuY2VbY2FjaGVLZXldOyAvLyBsZ3RtW2pzL21pc3NpbmctYXdhaXRdXG4gICAgfSk7XG4gIH1cbn07XG5bJ3N1Y2Nlc3MnLCAnaW5mbycsICd3YXJuaW5nJywgJ2Vycm9yJ10uZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICBhcGlbdHlwZV0gPSBmdW5jdGlvbiAoYXJncykge1xuICAgIHJldHVybiBhcGkub3BlbigoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBhcmdzKSwge1xuICAgICAgdHlwZTogdHlwZVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuYXBpLndhcm4gPSBhcGkud2FybmluZztcbmFwaS51c2VOb3RpZmljYXRpb24gPSAoMCwgX3VzZU5vdGlmaWNhdGlvbltcImRlZmF1bHRcIl0pKGdldE5vdGlmaWNhdGlvbkluc3RhbmNlLCBnZXRSQ05vdGljZVByb3BzKTtcbnZhciBfZGVmYXVsdCA9IGFwaTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9BcnJvd0xlZnRPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Fycm93TGVmdE91dGxpbmVkXCIpKTtcblxudmFyIF9BcnJvd1JpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9BcnJvd1JpZ2h0T3V0bGluZWRcIikpO1xuXG52YXIgX3JjUmVzaXplT2JzZXJ2ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1yZXNpemUtb2JzZXJ2ZXJcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9icmVhZGNydW1iID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vYnJlYWRjcnVtYlwiKSk7XG5cbnZhciBfYXZhdGFyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vYXZhdGFyXCIpKTtcblxudmFyIF90cmFuc0J1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL3RyYW5zQnV0dG9uXCIpKTtcblxudmFyIF9Mb2NhbGVSZWNlaXZlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS1wcm92aWRlci9Mb2NhbGVSZWNlaXZlclwiKSk7XG5cbnZhciByZW5kZXJCYWNrID0gZnVuY3Rpb24gcmVuZGVyQmFjayhwcmVmaXhDbHMsIGJhY2tJY29uLCBvbkJhY2spIHtcbiAgaWYgKCFiYWNrSWNvbiB8fCAhb25CYWNrKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwge1xuICAgIGNvbXBvbmVudE5hbWU6IFwiUGFnZUhlYWRlclwiXG4gIH0sIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGJhY2sgPSBfcmVmLmJhY2s7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1iYWNrXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3RyYW5zQnV0dG9uW1wiZGVmYXVsdFwiXSwge1xuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIGlmIChvbkJhY2spIHtcbiAgICAgICAgICBvbkJhY2soZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmFjay1idXR0b25cIiksXG4gICAgICBcImFyaWEtbGFiZWxcIjogYmFja1xuICAgIH0sIGJhY2tJY29uKSk7XG4gIH0pO1xufTtcblxudmFyIHJlbmRlckJyZWFkY3J1bWIgPSBmdW5jdGlvbiByZW5kZXJCcmVhZGNydW1iKGJyZWFkY3J1bWIpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9icmVhZGNydW1iW1wiZGVmYXVsdFwiXSwgYnJlYWRjcnVtYik7XG59O1xuXG52YXIgZ2V0QmFja0ljb24gPSBmdW5jdGlvbiBnZXRCYWNrSWNvbihwcm9wcykge1xuICB2YXIgZGlyZWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnbHRyJztcblxuICBpZiAocHJvcHMuYmFja0ljb24gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBwcm9wcy5iYWNrSWNvbjtcbiAgfVxuXG4gIHJldHVybiBkaXJlY3Rpb24gPT09ICdydGwnID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Fycm93UmlnaHRPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Fycm93TGVmdE91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCk7XG59O1xuXG52YXIgcmVuZGVyVGl0bGUgPSBmdW5jdGlvbiByZW5kZXJUaXRsZShwcmVmaXhDbHMsIHByb3BzKSB7XG4gIHZhciBkaXJlY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdsdHInO1xuICB2YXIgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIGF2YXRhciA9IHByb3BzLmF2YXRhcixcbiAgICAgIHN1YlRpdGxlID0gcHJvcHMuc3ViVGl0bGUsXG4gICAgICB0YWdzID0gcHJvcHMudGFncyxcbiAgICAgIGV4dHJhID0gcHJvcHMuZXh0cmEsXG4gICAgICBvbkJhY2sgPSBwcm9wcy5vbkJhY2s7XG4gIHZhciBoZWFkaW5nUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkaW5nXCIpO1xuXG4gIGlmICh0aXRsZSB8fCBzdWJUaXRsZSB8fCB0YWdzIHx8IGV4dHJhKSB7XG4gICAgdmFyIGJhY2tJY29uID0gZ2V0QmFja0ljb24ocHJvcHMsIGRpcmVjdGlvbik7XG4gICAgdmFyIGJhY2tJY29uRG9tID0gcmVuZGVyQmFjayhwcmVmaXhDbHMsIGJhY2tJY29uLCBvbkJhY2spO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGhlYWRpbmdQcmVmaXhDbHNcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGhlYWRpbmdQcmVmaXhDbHMsIFwiLWxlZnRcIilcbiAgICB9LCBiYWNrSWNvbkRvbSwgYXZhdGFyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9hdmF0YXJbXCJkZWZhdWx0XCJdLCBhdmF0YXIpLCB0aXRsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChoZWFkaW5nUHJlZml4Q2xzLCBcIi10aXRsZVwiKSxcbiAgICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiB1bmRlZmluZWRcbiAgICB9LCB0aXRsZSksIHN1YlRpdGxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGhlYWRpbmdQcmVmaXhDbHMsIFwiLXN1Yi10aXRsZVwiKSxcbiAgICAgIHRpdGxlOiB0eXBlb2Ygc3ViVGl0bGUgPT09ICdzdHJpbmcnID8gc3ViVGl0bGUgOiB1bmRlZmluZWRcbiAgICB9LCBzdWJUaXRsZSksIHRhZ3MgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoaGVhZGluZ1ByZWZpeENscywgXCItdGFnc1wiKVxuICAgIH0sIHRhZ3MpKSwgZXh0cmEgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoaGVhZGluZ1ByZWZpeENscywgXCItZXh0cmFcIilcbiAgICB9LCBleHRyYSkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgcmVuZGVyRm9vdGVyID0gZnVuY3Rpb24gcmVuZGVyRm9vdGVyKHByZWZpeENscywgZm9vdGVyKSB7XG4gIGlmIChmb290ZXIpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvb3RlclwiKVxuICAgIH0sIGZvb3Rlcik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciByZW5kZXJDaGlsZHJlbiA9IGZ1bmN0aW9uIHJlbmRlckNoaWxkcmVuKHByZWZpeENscywgY2hpbGRyZW4pIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKVxuICB9LCBjaGlsZHJlbik7XG59O1xuXG52YXIgUGFnZUhlYWRlciA9IGZ1bmN0aW9uIFBhZ2VIZWFkZXIocHJvcHMpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGNvbXBhY3QgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgdXBkYXRlQ29tcGFjdCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIG9uUmVzaXplID0gZnVuY3Rpb24gb25SZXNpemUoX3JlZjIpIHtcbiAgICB2YXIgd2lkdGggPSBfcmVmMi53aWR0aDtcbiAgICB1cGRhdGVDb21wYWN0KHdpZHRoIDwgNzY4KTtcbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZjMuZ2V0UHJlZml4Q2xzLFxuICAgICAgICBwYWdlSGVhZGVyID0gX3JlZjMucGFnZUhlYWRlcixcbiAgICAgICAgZGlyZWN0aW9uID0gX3JlZjMuZGlyZWN0aW9uO1xuICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICAgIGZvb3RlciA9IHByb3BzLmZvb3RlcixcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgYnJlYWRjcnVtYiA9IHByb3BzLmJyZWFkY3J1bWIsXG4gICAgICAgIGN1c3RvbWl6ZUNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZTtcbiAgICB2YXIgZ2hvc3QgPSB0cnVlOyAvLyBVc2UgYGdob3N0YCBmcm9tIGBwcm9wc2Agb3IgZnJvbSBgQ29uZmlnUHJvdmlkZXJgIGluc3RlYWQuXG5cbiAgICBpZiAoJ2dob3N0JyBpbiBwcm9wcykge1xuICAgICAgZ2hvc3QgPSBwcm9wcy5naG9zdDtcbiAgICB9IGVsc2UgaWYgKHBhZ2VIZWFkZXIgJiYgJ2dob3N0JyBpbiBwYWdlSGVhZGVyKSB7XG4gICAgICBnaG9zdCA9IHBhZ2VIZWFkZXIuZ2hvc3Q7XG4gICAgfVxuXG4gICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygncGFnZS1oZWFkZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBicmVhZGNydW1iRG9tID0gYnJlYWRjcnVtYiAmJiBicmVhZGNydW1iLnJvdXRlcyA/IHJlbmRlckJyZWFkY3J1bWIoYnJlYWRjcnVtYikgOiBudWxsO1xuICAgIHZhciBjbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIGN1c3RvbWl6ZUNsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge1xuICAgICAgJ2hhcy1icmVhZGNydW1iJzogYnJlYWRjcnVtYkRvbSxcbiAgICAgICdoYXMtZm9vdGVyJzogZm9vdGVyXG4gICAgfSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1naG9zdFwiKSwgZ2hvc3QpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29tcGFjdFwiKSwgY29tcGFjdCksIF9jbGFzc05hbWVzKSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1Jlc2l6ZU9ic2VydmVyW1wiZGVmYXVsdFwiXSwge1xuICAgICAgb25SZXNpemU6IG9uUmVzaXplXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCBicmVhZGNydW1iRG9tLCByZW5kZXJUaXRsZShwcmVmaXhDbHMsIHByb3BzLCBkaXJlY3Rpb24pLCBjaGlsZHJlbiAmJiByZW5kZXJDaGlsZHJlbihwcmVmaXhDbHMsIGNoaWxkcmVuKSwgcmVuZGVyRm9vdGVyKHByZWZpeENscywgZm9vdGVyKSkpO1xuICB9KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IFBhZ2VIZWFkZXI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9zZWxlY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9zZWxlY3RcIikpO1xuXG52YXIgTWluaVNlbGVjdCA9IGZ1bmN0aW9uIE1pbmlTZWxlY3QocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9zZWxlY3RbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgIHNpemU6IFwic21hbGxcIlxuICB9LCBwcm9wcykpO1xufTtcblxuTWluaVNlbGVjdC5PcHRpb24gPSBfc2VsZWN0W1wiZGVmYXVsdFwiXS5PcHRpb247XG52YXIgX2RlZmF1bHQgPSBNaW5pU2VsZWN0O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNQYWdpbmF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtcGFnaW5hdGlvblwiKSk7XG5cbnZhciBfZW5fVVMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1wYWdpbmF0aW9uL2xpYi9sb2NhbGUvZW5fVVNcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9MZWZ0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9MZWZ0T3V0bGluZWRcIikpO1xuXG52YXIgX1JpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9SaWdodE91dGxpbmVkXCIpKTtcblxudmFyIF9Eb3VibGVMZWZ0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Eb3VibGVMZWZ0T3V0bGluZWRcIikpO1xuXG52YXIgX0RvdWJsZVJpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Eb3VibGVSaWdodE91dGxpbmVkXCIpKTtcblxudmFyIF9NaW5pU2VsZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9NaW5pU2VsZWN0XCIpKTtcblxudmFyIF9zZWxlY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9zZWxlY3RcIikpO1xuXG52YXIgX0xvY2FsZVJlY2VpdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfdXNlQnJlYWtwb2ludDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9ncmlkL2hvb2tzL3VzZUJyZWFrcG9pbnRcIikpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIFBhZ2luYXRpb24gPSBmdW5jdGlvbiBQYWdpbmF0aW9uKF9hKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICBjdXN0b21pemVTZWxlY3RQcmVmaXhDbHMgPSBfYS5zZWxlY3RQcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgICBzaXplID0gX2Euc2l6ZSxcbiAgICAgIGN1c3RvbUxvY2FsZSA9IF9hLmxvY2FsZSxcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwic2VsZWN0UHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcImxvY2FsZVwiXSk7XG5cbiAgdmFyIF91c2VCcmVha3BvaW50ID0gKDAsIF91c2VCcmVha3BvaW50MltcImRlZmF1bHRcIl0pKCksXG4gICAgICB4cyA9IF91c2VCcmVha3BvaW50LnhzO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3BhZ2luYXRpb24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuXG4gIHZhciBnZXRJY29uc1Byb3BzID0gZnVuY3Rpb24gZ2V0SWNvbnNQcm9wcygpIHtcbiAgICB2YXIgZWxsaXBzaXMgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZWxsaXBzaXNcIilcbiAgICB9LCBcIlxcdTIwMjJcXHUyMDIyXFx1MjAyMlwiKTtcbiAgICB2YXIgcHJldkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1saW5rXCIpLFxuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIHRhYkluZGV4OiAtMVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9MZWZ0T3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSk7XG4gICAgdmFyIG5leHRJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbGlua1wiKSxcbiAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICB0YWJJbmRleDogLTFcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUmlnaHRPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpKTtcbiAgICB2YXIganVtcFByZXZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWxpbmtcIilcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1jb250YWluZXJcIilcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRG91YmxlTGVmdE91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbGluay1pY29uXCIpXG4gICAgfSksIGVsbGlwc2lzKSk7XG4gICAgdmFyIGp1bXBOZXh0SWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1saW5rXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tY29udGFpbmVyXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0RvdWJsZVJpZ2h0T3V0bGluZWRbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1saW5rLWljb25cIilcbiAgICB9KSwgZWxsaXBzaXMpKTsgLy8gY2hhbmdlIGFycm93cyBkaXJlY3Rpb24gaW4gcmlnaHQtdG8tbGVmdCBkaXJlY3Rpb25cblxuICAgIGlmIChkaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICB2YXIgX3JlZiA9IFtuZXh0SWNvbiwgcHJldkljb25dO1xuICAgICAgcHJldkljb24gPSBfcmVmWzBdO1xuICAgICAgbmV4dEljb24gPSBfcmVmWzFdO1xuICAgICAgdmFyIF9yZWYyID0gW2p1bXBOZXh0SWNvbiwganVtcFByZXZJY29uXTtcbiAgICAgIGp1bXBQcmV2SWNvbiA9IF9yZWYyWzBdO1xuICAgICAganVtcE5leHRJY29uID0gX3JlZjJbMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByZXZJY29uOiBwcmV2SWNvbixcbiAgICAgIG5leHRJY29uOiBuZXh0SWNvbixcbiAgICAgIGp1bXBQcmV2SWNvbjoganVtcFByZXZJY29uLFxuICAgICAganVtcE5leHRJY29uOiBqdW1wTmV4dEljb25cbiAgICB9O1xuICB9O1xuXG4gIHZhciByZW5kZXJQYWdpbmF0aW9uID0gZnVuY3Rpb24gcmVuZGVyUGFnaW5hdGlvbihjb250ZXh0TG9jYWxlKSB7XG4gICAgdmFyIGxvY2FsZSA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGNvbnRleHRMb2NhbGUpLCBjdXN0b21Mb2NhbGUpO1xuICAgIHZhciBpc1NtYWxsID0gc2l6ZSA9PT0gJ3NtYWxsJyB8fCAhISh4cyAmJiAhc2l6ZSAmJiByZXN0UHJvcHMucmVzcG9uc2l2ZSk7XG4gICAgdmFyIHNlbGVjdFByZWZpeENscyA9IGdldFByZWZpeENscygnc2VsZWN0JywgY3VzdG9taXplU2VsZWN0UHJlZml4Q2xzKTtcbiAgICB2YXIgZXh0ZW5kZWRDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHtcbiAgICAgIG1pbmk6IGlzU21hbGxcbiAgICB9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1BhZ2luYXRpb25bXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHJlc3RQcm9wcywge1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBzZWxlY3RQcmVmaXhDbHM6IHNlbGVjdFByZWZpeENsc1xuICAgIH0sIGdldEljb25zUHJvcHMoKSwge1xuICAgICAgY2xhc3NOYW1lOiBleHRlbmRlZENsYXNzTmFtZSxcbiAgICAgIHNlbGVjdENvbXBvbmVudENsYXNzOiBpc1NtYWxsID8gX01pbmlTZWxlY3RbXCJkZWZhdWx0XCJdIDogX3NlbGVjdFtcImRlZmF1bHRcIl0sXG4gICAgICBsb2NhbGU6IGxvY2FsZVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwge1xuICAgIGNvbXBvbmVudE5hbWU6IFwiUGFnaW5hdGlvblwiLFxuICAgIGRlZmF1bHRMb2NhbGU6IF9lbl9VU1tcImRlZmF1bHRcIl1cbiAgfSwgcmVuZGVyUGFnaW5hdGlvbik7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBQYWdpbmF0aW9uO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9QYWdpbmF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYWdpbmF0aW9uXCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX1BhZ2luYXRpb25bXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkXCIpKTtcblxudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvS2V5Q29kZVwiKSk7XG5cbnZhciBfdG9vbHRpcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3Rvb2x0aXBcIikpO1xuXG52YXIgX2J1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2J1dHRvblwiKSk7XG5cbnZhciBfYnV0dG9uMiA9IHJlcXVpcmUoXCIuLi9idXR0b24vYnV0dG9uXCIpO1xuXG52YXIgX0xvY2FsZVJlY2VpdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyXCIpKTtcblxudmFyIF9kZWZhdWx0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS9kZWZhdWx0XCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfZ2V0UmVuZGVyUHJvcFZhbHVlID0gcmVxdWlyZShcIi4uL191dGlsL2dldFJlbmRlclByb3BWYWx1ZVwiKTtcblxudmFyIF9yZWFjdE5vZGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvcmVhY3ROb2RlXCIpO1xuXG52YXIgX3RoaXMgPSB2b2lkIDA7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgUG9wY29uZmlybSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShwcm9wcy52aXNpYmxlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0VmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoJ3Zpc2libGUnIGluIHByb3BzKSB7XG4gICAgICBzZXRWaXNpYmxlKHByb3BzLnZpc2libGUpO1xuICAgIH1cbiAgfSwgW3Byb3BzLnZpc2libGVdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoJ2RlZmF1bHRWaXNpYmxlJyBpbiBwcm9wcykge1xuICAgICAgc2V0VmlzaWJsZShwcm9wcy5kZWZhdWx0VmlzaWJsZSk7XG4gICAgfVxuICB9LCBbcHJvcHMuZGVmYXVsdFZpc2libGVdKTtcblxuICB2YXIgc2V0dGluZ1Zpc2libGUgPSBmdW5jdGlvbiBzZXR0aW5nVmlzaWJsZSh2YWx1ZSwgZSkge1xuICAgIGlmICghKCd2aXNpYmxlJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldFZpc2libGUodmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5vblZpc2libGVDaGFuZ2UpIHtcbiAgICAgIHByb3BzLm9uVmlzaWJsZUNoYW5nZSh2YWx1ZSwgZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvbkNvbmZpcm0gPSBmdW5jdGlvbiBvbkNvbmZpcm0oZSkge1xuICAgIHNldHRpbmdWaXNpYmxlKGZhbHNlLCBlKTtcblxuICAgIGlmIChwcm9wcy5vbkNvbmZpcm0pIHtcbiAgICAgIHByb3BzLm9uQ29uZmlybS5jYWxsKF90aGlzLCBlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uQ2FuY2VsID0gZnVuY3Rpb24gb25DYW5jZWwoZSkge1xuICAgIHNldHRpbmdWaXNpYmxlKGZhbHNlLCBlKTtcblxuICAgIGlmIChwcm9wcy5vbkNhbmNlbCkge1xuICAgICAgcHJvcHMub25DYW5jZWwuY2FsbChfdGhpcywgZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBfb25LZXlEb3duID0gZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICBpZiAoZS5rZXlDb2RlID09PSBfS2V5Q29kZVtcImRlZmF1bHRcIl0uRVNDICYmIHZpc2libGUpIHtcbiAgICAgIHNldHRpbmdWaXNpYmxlKGZhbHNlLCBlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uVmlzaWJsZUNoYW5nZSA9IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZSh2YWx1ZSkge1xuICAgIHZhciBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkO1xuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0dGluZ1Zpc2libGUodmFsdWUpO1xuICB9O1xuXG4gIHZhciByZW5kZXJPdmVybGF5ID0gZnVuY3Rpb24gcmVuZGVyT3ZlcmxheShwcmVmaXhDbHMsIHBvcGNvbmZpcm1Mb2NhbGUpIHtcbiAgICB2YXIgb2tCdXR0b25Qcm9wcyA9IHByb3BzLm9rQnV0dG9uUHJvcHMsXG4gICAgICAgIGNhbmNlbEJ1dHRvblByb3BzID0gcHJvcHMuY2FuY2VsQnV0dG9uUHJvcHMsXG4gICAgICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgICAgIGNhbmNlbFRleHQgPSBwcm9wcy5jYW5jZWxUZXh0LFxuICAgICAgICBva1RleHQgPSBwcm9wcy5va1RleHQsXG4gICAgICAgIG9rVHlwZSA9IHByb3BzLm9rVHlwZSxcbiAgICAgICAgaWNvbiA9IHByb3BzLmljb247XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lci1jb250ZW50XCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lc3NhZ2VcIilcbiAgICB9LCBpY29uLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVzc2FnZS10aXRsZVwiKVxuICAgIH0sICgwLCBfZ2V0UmVuZGVyUHJvcFZhbHVlLmdldFJlbmRlclByb3BWYWx1ZSkodGl0bGUpKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1idXR0b25zXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2J1dHRvbltcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBvbkNsaWNrOiBvbkNhbmNlbCxcbiAgICAgIHNpemU6IFwic21hbGxcIlxuICAgIH0sIGNhbmNlbEJ1dHRvblByb3BzKSwgY2FuY2VsVGV4dCB8fCBwb3Bjb25maXJtTG9jYWxlLmNhbmNlbFRleHQpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgIG9uQ2xpY2s6IG9uQ29uZmlybVxuICAgIH0sICgwLCBfYnV0dG9uMi5jb252ZXJ0TGVnYWN5UHJvcHMpKG9rVHlwZSksIHtcbiAgICAgIHNpemU6IFwic21hbGxcIlxuICAgIH0sIG9rQnV0dG9uUHJvcHMpLCBva1RleHQgfHwgcG9wY29uZmlybUxvY2FsZS5va1RleHQpKSk7XG4gIH07XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBvdmVybGF5Q2xhc3NOYW1lID0gcHJvcHMub3ZlcmxheUNsYXNzTmFtZSxcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwicGxhY2VtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJvdmVybGF5Q2xhc3NOYW1lXCJdKTtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdwb3BvdmVyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHByZWZpeENsc0NvbmZpcm0gPSBnZXRQcmVmaXhDbHMoJ3BvcGNvbmZpcm0nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgb3ZlcmxheUNsYXNzTmFtZXMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHNDb25maXJtLCBvdmVybGF5Q2xhc3NOYW1lKTtcbiAgdmFyIG92ZXJsYXkgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTG9jYWxlUmVjZWl2ZXJbXCJkZWZhdWx0XCJdLCB7XG4gICAgY29tcG9uZW50TmFtZTogXCJQb3Bjb25maXJtXCIsXG4gICAgZGVmYXVsdExvY2FsZTogX2RlZmF1bHQyW1wiZGVmYXVsdFwiXS5Qb3Bjb25maXJtXG4gIH0sIGZ1bmN0aW9uIChwb3Bjb25maXJtTG9jYWxlKSB7XG4gICAgcmV0dXJuIHJlbmRlck92ZXJsYXkocHJlZml4Q2xzLCBwb3Bjb25maXJtTG9jYWxlKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdG9vbHRpcFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcmVzdFByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgb25WaXNpYmxlQ2hhbmdlOiBvblZpc2libGVDaGFuZ2UsXG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgIG92ZXJsYXlDbGFzc05hbWU6IG92ZXJsYXlDbGFzc05hbWVzLFxuICAgIHJlZjogcmVmXG4gIH0pLCAoMCwgX3JlYWN0Tm9kZS5jbG9uZUVsZW1lbnQpKGNoaWxkcmVuLCB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgdmFyIF9hLCBfYjtcblxuICAgICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgICAgIChfYiA9IGNoaWxkcmVuID09PSBudWxsIHx8IGNoaWxkcmVuID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2EgPSBjaGlsZHJlbi5wcm9wcykub25LZXlEb3duKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZSk7XG4gICAgICB9XG5cbiAgICAgIF9vbktleURvd24oZSk7XG4gICAgfVxuICB9KSk7XG59KTtcblBvcGNvbmZpcm0uZGVmYXVsdFByb3BzID0ge1xuICB0cmFuc2l0aW9uTmFtZTogJ3pvb20tYmlnJyxcbiAgcGxhY2VtZW50OiAndG9wJyxcbiAgdHJpZ2dlcjogJ2NsaWNrJyxcbiAgb2tUeXBlOiAncHJpbWFyeScsXG4gIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZFtcImRlZmF1bHRcIl0sIG51bGwpLFxuICBkaXNhYmxlZDogZmFsc2Vcbn07XG52YXIgX2RlZmF1bHQgPSBQb3Bjb25maXJtO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdG9vbHRpcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3Rvb2x0aXBcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9nZXRSZW5kZXJQcm9wVmFsdWUgPSByZXF1aXJlKFwiLi4vX3V0aWwvZ2V0UmVuZGVyUHJvcFZhbHVlXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIFBvcG92ZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX2EsIHJlZikge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgdGl0bGUgPSBfYS50aXRsZSxcbiAgICAgIGNvbnRlbnQgPSBfYS5jb250ZW50LFxuICAgICAgb3RoZXJQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwidGl0bGVcIiwgXCJjb250ZW50XCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcblxuICB2YXIgZ2V0T3ZlcmxheSA9IGZ1bmN0aW9uIGdldE92ZXJsYXkocHJlZml4Q2xzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB0aXRsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGl0bGVcIilcbiAgICB9LCAoMCwgX2dldFJlbmRlclByb3BWYWx1ZS5nZXRSZW5kZXJQcm9wVmFsdWUpKHRpdGxlKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lci1jb250ZW50XCIpXG4gICAgfSwgKDAsIF9nZXRSZW5kZXJQcm9wVmFsdWUuZ2V0UmVuZGVyUHJvcFZhbHVlKShjb250ZW50KSkpO1xuICB9O1xuXG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3BvcG92ZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3Rvb2x0aXBbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIG90aGVyUHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICByZWY6IHJlZixcbiAgICBvdmVybGF5OiBnZXRPdmVybGF5KHByZWZpeENscylcbiAgfSkpO1xufSk7XG5Qb3BvdmVyLmRpc3BsYXlOYW1lID0gJ1BvcG92ZXInO1xuUG9wb3Zlci5kZWZhdWx0UHJvcHMgPSB7XG4gIHBsYWNlbWVudDogJ3RvcCcsXG4gIHRyYW5zaXRpb25OYW1lOiAnem9vbS1iaWcnLFxuICB0cmlnZ2VyOiAnaG92ZXInLFxuICBtb3VzZUVudGVyRGVsYXk6IDAuMSxcbiAgbW91c2VMZWF2ZURlbGF5OiAwLjEsXG4gIG92ZXJsYXlTdHlsZToge31cbn07XG52YXIgX2RlZmF1bHQgPSBQb3BvdmVyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY1Byb2dyZXNzID0gcmVxdWlyZShcInJjLXByb2dyZXNzXCIpO1xuXG52YXIgX2NvbG9ycyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jb2xvcnNcIik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5cbmZ1bmN0aW9uIGdldFBlcmNlbnRhZ2UoX3JlZikge1xuICB2YXIgcGVyY2VudCA9IF9yZWYucGVyY2VudCxcbiAgICAgIHN1Y2Nlc3MgPSBfcmVmLnN1Y2Nlc3MsXG4gICAgICBzdWNjZXNzUGVyY2VudCA9IF9yZWYuc3VjY2Vzc1BlcmNlbnQ7XG4gIHZhciBwdGcgPSAoMCwgX3V0aWxzLnZhbGlkUHJvZ3Jlc3MpKHBlcmNlbnQpO1xuICB2YXIgcmVhbFN1Y2Nlc3NQZXJjZW50ID0gKDAsIF91dGlscy5nZXRTdWNjZXNzUGVyY2VudCkoe1xuICAgIHN1Y2Nlc3M6IHN1Y2Nlc3MsXG4gICAgc3VjY2Vzc1BlcmNlbnQ6IHN1Y2Nlc3NQZXJjZW50XG4gIH0pO1xuXG4gIGlmICghcmVhbFN1Y2Nlc3NQZXJjZW50KSB7XG4gICAgcmV0dXJuIHB0ZztcbiAgfVxuXG4gIHJldHVybiBbKDAsIF91dGlscy52YWxpZFByb2dyZXNzKShyZWFsU3VjY2Vzc1BlcmNlbnQpLCAoMCwgX3V0aWxzLnZhbGlkUHJvZ3Jlc3MpKHB0ZyAtICgwLCBfdXRpbHMudmFsaWRQcm9ncmVzcykocmVhbFN1Y2Nlc3NQZXJjZW50KSldO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJva2VDb2xvcihfcmVmMikge1xuICB2YXIgc3VjY2VzcyA9IF9yZWYyLnN1Y2Nlc3MsXG4gICAgICBzdHJva2VDb2xvciA9IF9yZWYyLnN0cm9rZUNvbG9yLFxuICAgICAgc3VjY2Vzc1BlcmNlbnQgPSBfcmVmMi5zdWNjZXNzUGVyY2VudDtcbiAgdmFyIGNvbG9yID0gc3Ryb2tlQ29sb3IgfHwgbnVsbDtcbiAgdmFyIHJlYWxTdWNjZXNzUGVyY2VudCA9ICgwLCBfdXRpbHMuZ2V0U3VjY2Vzc1BlcmNlbnQpKHtcbiAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgIHN1Y2Nlc3NQZXJjZW50OiBzdWNjZXNzUGVyY2VudFxuICB9KTtcblxuICBpZiAoIXJlYWxTdWNjZXNzUGVyY2VudCkge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHJldHVybiBbX2NvbG9ycy5wcmVzZXRQcmltYXJ5Q29sb3JzLmdyZWVuLCBjb2xvcl07XG59XG5cbnZhciBDaXJjbGUgPSBmdW5jdGlvbiBDaXJjbGUocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICBzdHJva2VXaWR0aCA9IHByb3BzLnN0cm9rZVdpZHRoLFxuICAgICAgdHJhaWxDb2xvciA9IHByb3BzLnRyYWlsQ29sb3IsXG4gICAgICBzdHJva2VMaW5lY2FwID0gcHJvcHMuc3Ryb2tlTGluZWNhcCxcbiAgICAgIGdhcFBvc2l0aW9uID0gcHJvcHMuZ2FwUG9zaXRpb24sXG4gICAgICBnYXBEZWdyZWUgPSBwcm9wcy5nYXBEZWdyZWUsXG4gICAgICB0eXBlID0gcHJvcHMudHlwZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gIHZhciBjaXJjbGVTaXplID0gd2lkdGggfHwgMTIwO1xuICB2YXIgY2lyY2xlU3R5bGUgPSB7XG4gICAgd2lkdGg6IGNpcmNsZVNpemUsXG4gICAgaGVpZ2h0OiBjaXJjbGVTaXplLFxuICAgIGZvbnRTaXplOiBjaXJjbGVTaXplICogMC4xNSArIDZcbiAgfTtcbiAgdmFyIGNpcmNsZVdpZHRoID0gc3Ryb2tlV2lkdGggfHwgNjtcbiAgdmFyIGdhcFBvcyA9IGdhcFBvc2l0aW9uIHx8IHR5cGUgPT09ICdkYXNoYm9hcmQnICYmICdib3R0b20nIHx8ICd0b3AnO1xuXG4gIHZhciBnZXRHYXBEZWdyZWUgPSBmdW5jdGlvbiBnZXRHYXBEZWdyZWUoKSB7XG4gICAgLy8gU3VwcG9ydCBnYXBEZWcgPSAwIHdoZW4gdHlwZSA9ICdkYXNoYm9hcmQnXG4gICAgaWYgKGdhcERlZ3JlZSB8fCBnYXBEZWdyZWUgPT09IDApIHtcbiAgICAgIHJldHVybiBnYXBEZWdyZWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdkYXNoYm9hcmQnKSB7XG4gICAgICByZXR1cm4gNzU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTsgLy8gdXNpbmcgY2xhc3NOYW1lIHRvIHN0eWxlIHN0cm9rZSBjb2xvclxuXG5cbiAgdmFyIHN0cm9rZUNvbG9yID0gZ2V0U3Ryb2tlQ29sb3IocHJvcHMpO1xuICB2YXIgaXNHcmFkaWVudCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzdHJva2VDb2xvcikgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuICB2YXIgd3JhcHBlckNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXJcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2lyY2xlLWdyYWRpZW50XCIpLCBpc0dyYWRpZW50KSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiB3cmFwcGVyQ2xhc3NOYW1lLFxuICAgIHN0eWxlOiBjaXJjbGVTdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNQcm9ncmVzcy5DaXJjbGUsIHtcbiAgICBwZXJjZW50OiBnZXRQZXJjZW50YWdlKHByb3BzKSxcbiAgICBzdHJva2VXaWR0aDogY2lyY2xlV2lkdGgsXG4gICAgdHJhaWxXaWR0aDogY2lyY2xlV2lkdGgsXG4gICAgc3Ryb2tlQ29sb3I6IHN0cm9rZUNvbG9yLFxuICAgIHN0cm9rZUxpbmVjYXA6IHN0cm9rZUxpbmVjYXAsXG4gICAgdHJhaWxDb2xvcjogdHJhaWxDb2xvcixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBnYXBEZWdyZWU6IGdldEdhcERlZ3JlZSgpLFxuICAgIGdhcFBvc2l0aW9uOiBnYXBQb3NcbiAgfSksIGNoaWxkcmVuKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IENpcmNsZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHBvcnRzLmhhbmRsZUdyYWRpZW50ID0gZXhwb3J0cy5zb3J0R3JhZGllbnQgPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NvbG9ycyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jb2xvcnNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbi8qKlxuICoge1xuICogICAnMCUnOiAnI2FmYzE2MycsXG4gKiAgICc3NSUnOiAnIzAwOTkwMCcsXG4gKiAgICc1MCUnOiAnZ3JlZW4nLCAgICAgPT09PT4gICAgICcjYWZjMTYzIDAlLCAjNjZGRjAwIDI1JSwgIzAwQ0MwMCA1MCUsICMwMDk5MDAgNzUlLCAjZmZmZmZmIDEwMCUnXG4gKiAgICcyNSUnOiAnIzY2RkYwMCcsXG4gKiAgICcxMDAlJzogJyNmZmZmZmYnXG4gKiB9XG4gKi9cbnZhciBzb3J0R3JhZGllbnQgPSBmdW5jdGlvbiBzb3J0R3JhZGllbnQoZ3JhZGllbnRzKSB7XG4gIHZhciB0ZW1wQXJyID0gW107XG4gIE9iamVjdC5rZXlzKGdyYWRpZW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGZvcm1hdHRlZEtleSA9IHBhcnNlRmxvYXQoa2V5LnJlcGxhY2UoLyUvZywgJycpKTtcblxuICAgIGlmICghaXNOYU4oZm9ybWF0dGVkS2V5KSkge1xuICAgICAgdGVtcEFyci5wdXNoKHtcbiAgICAgICAga2V5OiBmb3JtYXR0ZWRLZXksXG4gICAgICAgIHZhbHVlOiBncmFkaWVudHNba2V5XVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgdGVtcEFyciA9IHRlbXBBcnIuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhLmtleSAtIGIua2V5O1xuICB9KTtcbiAgcmV0dXJuIHRlbXBBcnIubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGtleSA9IF9yZWYua2V5LFxuICAgICAgICB2YWx1ZSA9IF9yZWYudmFsdWU7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KHZhbHVlLCBcIiBcIikuY29uY2F0KGtleSwgXCIlXCIpO1xuICB9KS5qb2luKCcsICcpO1xufTtcbi8qKlxuICoge1xuICogICAnMCUnOiAnI2FmYzE2MycsXG4gKiAgICcyNSUnOiAnIzY2RkYwMCcsXG4gKiAgICc1MCUnOiAnIzAwQ0MwMCcsICAgICA9PT09PiAgbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjYWZjMTYzIDAlLCAjNjZGRjAwIDI1JSxcbiAqICAgJzc1JSc6ICcjMDA5OTAwJywgICAgICAgICAgICAgICMwMENDMDAgNTAlLCAjMDA5OTAwIDc1JSwgI2ZmZmZmZiAxMDAlKVxuICogICAnMTAwJSc6ICcjZmZmZmZmJ1xuICogfVxuICpcbiAqIFRoZW4gdGhpcyBtYW4gY2FtZSB0byByZWFsaXplIHRoZSB0cnV0aDpcbiAqIEJlc2lkZXMgc2l4IHBlbmNlLCB0aGVyZSBpcyB0aGUgbW9vbi5cbiAqIEJlc2lkZXMgYnJlYWQgYW5kIGJ1dHRlciwgdGhlcmUgaXMgdGhlIGJ1Zy5cbiAqIEFuZC4uLlxuICogQmVzaWRlcyB3b21lbiwgdGhlcmUgaXMgdGhlIGNvZGUuXG4gKi9cblxuXG5leHBvcnRzLnNvcnRHcmFkaWVudCA9IHNvcnRHcmFkaWVudDtcblxudmFyIGhhbmRsZUdyYWRpZW50ID0gZnVuY3Rpb24gaGFuZGxlR3JhZGllbnQoc3Ryb2tlQ29sb3IpIHtcbiAgdmFyIF9zdHJva2VDb2xvciRmcm9tID0gc3Ryb2tlQ29sb3IuZnJvbSxcbiAgICAgIGZyb20gPSBfc3Ryb2tlQ29sb3IkZnJvbSA9PT0gdm9pZCAwID8gX2NvbG9ycy5wcmVzZXRQcmltYXJ5Q29sb3JzLmJsdWUgOiBfc3Ryb2tlQ29sb3IkZnJvbSxcbiAgICAgIF9zdHJva2VDb2xvciR0byA9IHN0cm9rZUNvbG9yLnRvLFxuICAgICAgdG8gPSBfc3Ryb2tlQ29sb3IkdG8gPT09IHZvaWQgMCA/IF9jb2xvcnMucHJlc2V0UHJpbWFyeUNvbG9ycy5ibHVlIDogX3N0cm9rZUNvbG9yJHRvLFxuICAgICAgX3N0cm9rZUNvbG9yJGRpcmVjdGlvID0gc3Ryb2tlQ29sb3IuZGlyZWN0aW9uLFxuICAgICAgZGlyZWN0aW9uID0gX3N0cm9rZUNvbG9yJGRpcmVjdGlvID09PSB2b2lkIDAgPyAndG8gcmlnaHQnIDogX3N0cm9rZUNvbG9yJGRpcmVjdGlvLFxuICAgICAgcmVzdCA9IF9fcmVzdChzdHJva2VDb2xvciwgW1wiZnJvbVwiLCBcInRvXCIsIFwiZGlyZWN0aW9uXCJdKTtcblxuICBpZiAoT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoICE9PSAwKSB7XG4gICAgdmFyIHNvcnRlZEdyYWRpZW50cyA9IHNvcnRHcmFkaWVudChyZXN0KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudChcIi5jb25jYXQoZGlyZWN0aW9uLCBcIiwgXCIpLmNvbmNhdChzb3J0ZWRHcmFkaWVudHMsIFwiKVwiKVxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhY2tncm91bmRJbWFnZTogXCJsaW5lYXItZ3JhZGllbnQoXCIuY29uY2F0KGRpcmVjdGlvbiwgXCIsIFwiKS5jb25jYXQoZnJvbSwgXCIsIFwiKS5jb25jYXQodG8sIFwiKVwiKVxuICB9O1xufTtcblxuZXhwb3J0cy5oYW5kbGVHcmFkaWVudCA9IGhhbmRsZUdyYWRpZW50O1xuXG52YXIgTGluZSA9IGZ1bmN0aW9uIExpbmUocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHBlcmNlbnQgPSBwcm9wcy5wZXJjZW50LFxuICAgICAgc3Ryb2tlV2lkdGggPSBwcm9wcy5zdHJva2VXaWR0aCxcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc3Ryb2tlQ29sb3IgPSBwcm9wcy5zdHJva2VDb2xvcixcbiAgICAgIHN0cm9rZUxpbmVjYXAgPSBwcm9wcy5zdHJva2VMaW5lY2FwLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIHRyYWlsQ29sb3IgPSBwcm9wcy50cmFpbENvbG9yLFxuICAgICAgc3VjY2VzcyA9IHByb3BzLnN1Y2Nlc3M7XG4gIHZhciBiYWNrZ3JvdW5kUHJvcHMgPSBzdHJva2VDb2xvciAmJiB0eXBlb2Ygc3Ryb2tlQ29sb3IgIT09ICdzdHJpbmcnID8gaGFuZGxlR3JhZGllbnQoc3Ryb2tlQ29sb3IpIDoge1xuICAgIGJhY2tncm91bmQ6IHN0cm9rZUNvbG9yXG4gIH07XG4gIHZhciB0cmFpbFN0eWxlID0gdHJhaWxDb2xvciA/IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHRyYWlsQ29sb3JcbiAgfSA6IHVuZGVmaW5lZDtcbiAgdmFyIHBlcmNlbnRTdHlsZSA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgd2lkdGg6IFwiXCIuY29uY2F0KCgwLCBfdXRpbHMudmFsaWRQcm9ncmVzcykocGVyY2VudCksIFwiJVwiKSxcbiAgICBoZWlnaHQ6IHN0cm9rZVdpZHRoIHx8IChzaXplID09PSAnc21hbGwnID8gNiA6IDgpLFxuICAgIGJvcmRlclJhZGl1czogc3Ryb2tlTGluZWNhcCA9PT0gJ3NxdWFyZScgPyAwIDogJydcbiAgfSwgYmFja2dyb3VuZFByb3BzKTtcbiAgdmFyIHN1Y2Nlc3NQZXJjZW50ID0gKDAsIF91dGlscy5nZXRTdWNjZXNzUGVyY2VudCkocHJvcHMpO1xuICB2YXIgc3VjY2Vzc1BlcmNlbnRTdHlsZSA9IHtcbiAgICB3aWR0aDogXCJcIi5jb25jYXQoKDAsIF91dGlscy52YWxpZFByb2dyZXNzKShzdWNjZXNzUGVyY2VudCksIFwiJVwiKSxcbiAgICBoZWlnaHQ6IHN0cm9rZVdpZHRoIHx8IChzaXplID09PSAnc21hbGwnID8gNiA6IDgpLFxuICAgIGJvcmRlclJhZGl1czogc3Ryb2tlTGluZWNhcCA9PT0gJ3NxdWFyZScgPyAwIDogJycsXG4gICAgYmFja2dyb3VuZENvbG9yOiBzdWNjZXNzID09PSBudWxsIHx8IHN1Y2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1Y2Nlc3Muc3Ryb2tlQ29sb3JcbiAgfTtcbiAgdmFyIHN1Y2Nlc3NTZWdtZW50ID0gc3VjY2Vzc1BlcmNlbnQgIT09IHVuZGVmaW5lZCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VjY2Vzcy1iZ1wiKSxcbiAgICBzdHlsZTogc3VjY2Vzc1BlcmNlbnRTdHlsZVxuICB9KSA6IG51bGw7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vdXRlclwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlubmVyXCIpLFxuICAgIHN0eWxlOiB0cmFpbFN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmdcIiksXG4gICAgc3R5bGU6IHBlcmNlbnRTdHlsZVxuICB9KSwgc3VjY2Vzc1NlZ21lbnQpKSwgY2hpbGRyZW4pO1xufTtcblxudmFyIF9kZWZhdWx0ID0gTGluZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgU3RlcHMgPSBmdW5jdGlvbiBTdGVwcyhwcm9wcykge1xuICB2YXIgc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICBzdGVwcyA9IHByb3BzLnN0ZXBzLFxuICAgICAgX3Byb3BzJHBlcmNlbnQgPSBwcm9wcy5wZXJjZW50LFxuICAgICAgcGVyY2VudCA9IF9wcm9wcyRwZXJjZW50ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHBlcmNlbnQsXG4gICAgICBfcHJvcHMkc3Ryb2tlV2lkdGggPSBwcm9wcy5zdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVdpZHRoID0gX3Byb3BzJHN0cm9rZVdpZHRoID09PSB2b2lkIDAgPyA4IDogX3Byb3BzJHN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlQ29sb3IgPSBwcm9wcy5zdHJva2VDb2xvcixcbiAgICAgIHRyYWlsQ29sb3IgPSBwcm9wcy50cmFpbENvbG9yLFxuICAgICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGN1cnJlbnQgPSBNYXRoLmZsb29yKHN0ZXBzICogKHBlcmNlbnQgLyAxMDApKTtcbiAgdmFyIHN0ZXBXaWR0aCA9IHNpemUgPT09ICdzbWFsbCcgPyAyIDogMTQ7XG4gIHZhciBzdHlsZWRTdGVwcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcHM7IGkgKz0gMSkge1xuICAgIHN0eWxlZFN0ZXBzLnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGtleTogaSxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGVwcy1pdGVtXCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0ZXBzLWl0ZW0tYWN0aXZlXCIpLCBpIDw9IGN1cnJlbnQgLSAxKSksXG4gICAgICBzdHlsZToge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGkgPD0gY3VycmVudCAtIDEgPyBzdHJva2VDb2xvciA6IHRyYWlsQ29sb3IsXG4gICAgICAgIHdpZHRoOiBzdGVwV2lkdGgsXG4gICAgICAgIGhlaWdodDogc3Ryb2tlV2lkdGhcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGVwcy1vdXRlclwiKVxuICB9LCBzdHlsZWRTdGVwcywgY2hpbGRyZW4pO1xufTtcblxudmFyIF9kZWZhdWx0ID0gU3RlcHM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3Byb2dyZXNzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wcm9ncmVzc1wiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9wcm9ncmVzc1tcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfQ2xvc2VPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlT3V0bGluZWRcIikpO1xuXG52YXIgX0NoZWNrT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DaGVja091dGxpbmVkXCIpKTtcblxudmFyIF9DaGVja0NpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0NoZWNrQ2lyY2xlRmlsbGVkXCIpKTtcblxudmFyIF9DbG9zZUNpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfdHlwZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC90eXBlXCIpO1xuXG52YXIgX2Rldldhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC9kZXZXYXJuaW5nXCIpKTtcblxudmFyIF9MaW5lID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9MaW5lXCIpKTtcblxudmFyIF9DaXJjbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NpcmNsZVwiKSk7XG5cbnZhciBfU3RlcHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0ZXBzXCIpKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIFByb2dyZXNzVHlwZXMgPSAoMCwgX3R5cGUudHVwbGUpKCdsaW5lJywgJ2NpcmNsZScsICdkYXNoYm9hcmQnKTtcbnZhciBQcm9ncmVzc1N0YXR1c2VzID0gKDAsIF90eXBlLnR1cGxlKSgnbm9ybWFsJywgJ2V4Y2VwdGlvbicsICdhY3RpdmUnLCAnc3VjY2VzcycpO1xuXG52YXIgUHJvZ3Jlc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShQcm9ncmVzcywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoUHJvZ3Jlc3MpO1xuXG4gIGZ1bmN0aW9uIFByb2dyZXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgUHJvZ3Jlc3MpO1xuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBfdGhpcy5yZW5kZXJQcm9ncmVzcyA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscyxcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbjtcblxuICAgICAgdmFyIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZSA9ICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMltcImRlZmF1bHRcIl0pKF90aGlzKSxcbiAgICAgICAgICBwcm9wcyA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZS5wcm9wcztcblxuICAgICAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICAgICAgdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgICAgICAgc3RlcHMgPSBwcm9wcy5zdGVwcyxcbiAgICAgICAgICBzaG93SW5mbyA9IHByb3BzLnNob3dJbmZvLFxuICAgICAgICAgIHN0cm9rZUNvbG9yID0gcHJvcHMuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzaXplXCIsIFwidHlwZVwiLCBcInN0ZXBzXCIsIFwic2hvd0luZm9cIiwgXCJzdHJva2VDb2xvclwiXSk7XG5cbiAgICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3Byb2dyZXNzJywgY3VzdG9taXplUHJlZml4Q2xzKTtcblxuICAgICAgdmFyIHByb2dyZXNzU3RhdHVzID0gX3RoaXMuZ2V0UHJvZ3Jlc3NTdGF0dXMoKTtcblxuICAgICAgdmFyIHByb2dyZXNzSW5mbyA9IF90aGlzLnJlbmRlclByb2Nlc3NJbmZvKHByZWZpeENscywgcHJvZ3Jlc3NTdGF0dXMpO1xuXG4gICAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghKCdzdWNjZXNzUGVyY2VudCcgaW4gcHJvcHMpLCAnUHJvZ3Jlc3MnLCAnYHN1Y2Nlc3NQZXJjZW50YCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBzdWNjZXNzLnBlcmNlbnRgIGluc3RlYWQuJyk7XG4gICAgICB2YXIgcHJvZ3Jlc3M7IC8vIFJlbmRlciBwcm9ncmVzcyBzaGFwZVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgIHByb2dyZXNzID0gc3RlcHMgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU3RlcHNbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgICAgc3Ryb2tlQ29sb3I6IHR5cGVvZiBzdHJva2VDb2xvciA9PT0gJ3N0cmluZycgPyBzdHJva2VDb2xvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBzdGVwczogc3RlcHNcbiAgICAgICAgfSksIHByb2dyZXNzSW5mbykgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTGluZVtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICAgICAgICB9KSwgcHJvZ3Jlc3NJbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NpcmNsZScgfHwgdHlwZSA9PT0gJ2Rhc2hib2FyZCcpIHtcbiAgICAgICAgcHJvZ3Jlc3MgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2lyY2xlW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBfdGhpcy5wcm9wcywge1xuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIHByb2dyZXNzU3RhdHVzOiBwcm9ncmVzc1N0YXR1c1xuICAgICAgICB9KSwgcHJvZ3Jlc3NJbmZvKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNsYXNzU3RyaW5nID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHR5cGUgPT09ICdkYXNoYm9hcmQnICYmICdjaXJjbGUnIHx8IHN0ZXBzICYmICdzdGVwcycgfHwgdHlwZSksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0YXR1cy1cIikuY29uY2F0KHByb2dyZXNzU3RhdHVzKSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2hvdy1pbmZvXCIpLCBzaG93SW5mbyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplKSwgc2l6ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkocmVzdFByb3BzLCBbJ3N0YXR1cycsICdmb3JtYXQnLCAndHJhaWxDb2xvcicsICdzdHJva2VXaWR0aCcsICd3aWR0aCcsICdnYXBEZWdyZWUnLCAnZ2FwUG9zaXRpb24nLCAnc3Ryb2tlQ29sb3InLCAnc3Ryb2tlTGluZWNhcCcsICdwZXJjZW50JywgJ3N0ZXBzJywgJ3N1Y2Nlc3MnLCAnc3VjY2Vzc1BlcmNlbnQnXSksIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZ1xuICAgICAgfSksIHByb2dyZXNzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShQcm9ncmVzcywgW3tcbiAgICBrZXk6IFwiZ2V0UGVyY2VudE51bWJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQZXJjZW50TnVtYmVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzJHBlcmNlbnQgPSB0aGlzLnByb3BzLnBlcmNlbnQsXG4gICAgICAgICAgcGVyY2VudCA9IF90aGlzJHByb3BzJHBlcmNlbnQgPT09IHZvaWQgMCA/IDAgOiBfdGhpcyRwcm9wcyRwZXJjZW50O1xuICAgICAgdmFyIHN1Y2Nlc3NQZXJjZW50ID0gKDAsIF91dGlscy5nZXRTdWNjZXNzUGVyY2VudCkodGhpcy5wcm9wcyk7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoc3VjY2Vzc1BlcmNlbnQgIT09IHVuZGVmaW5lZCA/IHN1Y2Nlc3NQZXJjZW50LnRvU3RyaW5nKCkgOiBwZXJjZW50LnRvU3RyaW5nKCksIDEwKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UHJvZ3Jlc3NTdGF0dXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NTdGF0dXMoKSB7XG4gICAgICB2YXIgc3RhdHVzID0gdGhpcy5wcm9wcy5zdGF0dXM7XG5cbiAgICAgIGlmIChQcm9ncmVzc1N0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA8IDAgJiYgdGhpcy5nZXRQZXJjZW50TnVtYmVyKCkgPj0gMTAwKSB7XG4gICAgICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0dXMgfHwgJ25vcm1hbCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclByb2Nlc3NJbmZvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclByb2Nlc3NJbmZvKHByZWZpeENscywgcHJvZ3Jlc3NTdGF0dXMpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgc2hvd0luZm8gPSBfdGhpcyRwcm9wcy5zaG93SW5mbyxcbiAgICAgICAgICBmb3JtYXQgPSBfdGhpcyRwcm9wcy5mb3JtYXQsXG4gICAgICAgICAgdHlwZSA9IF90aGlzJHByb3BzLnR5cGUsXG4gICAgICAgICAgcGVyY2VudCA9IF90aGlzJHByb3BzLnBlcmNlbnQ7XG4gICAgICB2YXIgc3VjY2Vzc1BlcmNlbnQgPSAoMCwgX3V0aWxzLmdldFN1Y2Nlc3NQZXJjZW50KSh0aGlzLnByb3BzKTtcbiAgICAgIGlmICghc2hvd0luZm8pIHJldHVybiBudWxsO1xuICAgICAgdmFyIHRleHQ7XG5cbiAgICAgIHZhciB0ZXh0Rm9ybWF0dGVyID0gZm9ybWF0IHx8IGZ1bmN0aW9uIChwZXJjZW50TnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChwZXJjZW50TnVtYmVyLCBcIiVcIik7XG4gICAgICB9O1xuXG4gICAgICB2YXIgaXNMaW5lVHlwZSA9IHR5cGUgPT09ICdsaW5lJztcblxuICAgICAgaWYgKGZvcm1hdCB8fCBwcm9ncmVzc1N0YXR1cyAhPT0gJ2V4Y2VwdGlvbicgJiYgcHJvZ3Jlc3NTdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgICB0ZXh0ID0gdGV4dEZvcm1hdHRlcigoMCwgX3V0aWxzLnZhbGlkUHJvZ3Jlc3MpKHBlcmNlbnQpLCAoMCwgX3V0aWxzLnZhbGlkUHJvZ3Jlc3MpKHN1Y2Nlc3NQZXJjZW50KSk7XG4gICAgICB9IGVsc2UgaWYgKHByb2dyZXNzU3RhdHVzID09PSAnZXhjZXB0aW9uJykge1xuICAgICAgICB0ZXh0ID0gaXNMaW5lVHlwZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbG9zZUNpcmNsZUZpbGxlZFtcImRlZmF1bHRcIl0sIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvZ3Jlc3NTdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICB0ZXh0ID0gaXNMaW5lVHlwZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DaGVja0NpcmNsZUZpbGxlZFtcImRlZmF1bHRcIl0sIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NoZWNrT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10ZXh0XCIpLFxuICAgICAgICB0aXRsZTogdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dCA6IHVuZGVmaW5lZFxuICAgICAgfSwgdGV4dCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCB0aGlzLnJlbmRlclByb2dyZXNzKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFByb2dyZXNzO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFByb2dyZXNzO1xuUHJvZ3Jlc3MuZGVmYXVsdFByb3BzID0ge1xuICB0eXBlOiAnbGluZScsXG4gIHBlcmNlbnQ6IDAsXG4gIHNob3dJbmZvOiB0cnVlLFxuICAvLyBudWxsIGZvciBkaWZmZXJlbnQgdGhlbWUgZGVmaW5pdGlvblxuICB0cmFpbENvbG9yOiBudWxsLFxuICBzaXplOiAnZGVmYXVsdCcsXG4gIGdhcERlZ3JlZTogdW5kZWZpbmVkLFxuICBzdHJva2VMaW5lY2FwOiAncm91bmQnXG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudmFsaWRQcm9ncmVzcyA9IHZhbGlkUHJvZ3Jlc3M7XG5leHBvcnRzLmdldFN1Y2Nlc3NQZXJjZW50ID0gZ2V0U3VjY2Vzc1BlcmNlbnQ7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG5mdW5jdGlvbiB2YWxpZFByb2dyZXNzKHByb2dyZXNzKSB7XG4gIGlmICghcHJvZ3Jlc3MgfHwgcHJvZ3Jlc3MgPCAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAocHJvZ3Jlc3MgPiAxMDApIHtcbiAgICByZXR1cm4gMTAwO1xuICB9XG5cbiAgcmV0dXJuIHByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiBnZXRTdWNjZXNzUGVyY2VudChfcmVmKSB7XG4gIHZhciBzdWNjZXNzID0gX3JlZi5zdWNjZXNzLFxuICAgICAgc3VjY2Vzc1BlcmNlbnQgPSBfcmVmLnN1Y2Nlc3NQZXJjZW50O1xuICB2YXIgcGVyY2VudCA9IHN1Y2Nlc3NQZXJjZW50O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBwZXJjZW50YCBpbnN0ZWFkICovXG5cbiAgaWYgKHN1Y2Nlc3MgJiYgJ3Byb2dyZXNzJyBpbiBzdWNjZXNzKSB7XG4gICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoZmFsc2UsICdQcm9ncmVzcycsICdgc3VjY2Vzcy5wcm9ncmVzc2AgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgc3VjY2Vzcy5wZXJjZW50YCBpbnN0ZWFkLicpO1xuICAgIHBlcmNlbnQgPSBzdWNjZXNzLnByb2dyZXNzO1xuICB9XG5cbiAgaWYgKHN1Y2Nlc3MgJiYgJ3BlcmNlbnQnIGluIHN1Y2Nlc3MpIHtcbiAgICBwZXJjZW50ID0gc3VjY2Vzcy5wZXJjZW50O1xuICB9XG5cbiAgcmV0dXJuIHBlcmNlbnQ7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGV4cG9ydHMuUmFkaW9Hcm91cENvbnRleHRQcm92aWRlciA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIFJhZGlvR3JvdXBDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG52YXIgUmFkaW9Hcm91cENvbnRleHRQcm92aWRlciA9IFJhZGlvR3JvdXBDb250ZXh0LlByb3ZpZGVyO1xuZXhwb3J0cy5SYWRpb0dyb3VwQ29udGV4dFByb3ZpZGVyID0gUmFkaW9Hcm91cENvbnRleHRQcm92aWRlcjtcbnZhciBfZGVmYXVsdCA9IFJhZGlvR3JvdXBDb250ZXh0O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3VzZU1lcmdlZFN0YXRlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCIpKTtcblxudmFyIF9yYWRpbyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcmFkaW9cIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9TaXplQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dFwiKSk7XG5cbnZhciBfY29udGV4dCA9IHJlcXVpcmUoXCIuL2NvbnRleHRcIik7XG5cbnZhciBSYWRpb0dyb3VwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIHNpemUgPSBSZWFjdC51c2VDb250ZXh0KF9TaXplQ29udGV4dFtcImRlZmF1bHRcIl0pO1xuXG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSAoMCwgX3VzZU1lcmdlZFN0YXRlM1tcImRlZmF1bHRcIl0pKHByb3BzLmRlZmF1bHRWYWx1ZSwge1xuICAgIHZhbHVlOiBwcm9wcy52YWx1ZVxuICB9KSxcbiAgICAgIF91c2VNZXJnZWRTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICAgIHZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICAgIHNldFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcblxuICB2YXIgb25SYWRpb0NoYW5nZSA9IGZ1bmN0aW9uIG9uUmFkaW9DaGFuZ2UoZXYpIHtcbiAgICB2YXIgbGFzdFZhbHVlID0gdmFsdWU7XG4gICAgdmFyIHZhbCA9IGV2LnRhcmdldC52YWx1ZTtcblxuICAgIGlmICghKCd2YWx1ZScgaW4gcHJvcHMpKSB7XG4gICAgICBzZXRWYWx1ZSh2YWwpO1xuICAgIH1cblxuICAgIHZhciBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlO1xuXG4gICAgaWYgKG9uQ2hhbmdlICYmIHZhbCAhPT0gbGFzdFZhbHVlKSB7XG4gICAgICBvbkNoYW5nZShldik7XG4gICAgfVxuICB9O1xuXG4gIHZhciByZW5kZXJHcm91cCA9IGZ1bmN0aW9uIHJlbmRlckdyb3VwKCkge1xuICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIF9wcm9wcyRjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcyRjbGFzc05hbWUgPT09IHZvaWQgMCA/ICcnIDogX3Byb3BzJGNsYXNzTmFtZSxcbiAgICAgICAgb3B0aW9ucyA9IHByb3BzLm9wdGlvbnMsXG4gICAgICAgIG9wdGlvblR5cGUgPSBwcm9wcy5vcHRpb25UeXBlLFxuICAgICAgICBidXR0b25TdHlsZSA9IHByb3BzLmJ1dHRvblN0eWxlLFxuICAgICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBjdXN0b21pemVTaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgaWQgPSBwcm9wcy5pZCxcbiAgICAgICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlTGVhdmUgPSBwcm9wcy5vbk1vdXNlTGVhdmU7XG4gICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygncmFkaW8nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBncm91cFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXBcIik7XG4gICAgdmFyIGNoaWxkcmVuVG9SZW5kZXIgPSBjaGlsZHJlbjsgLy8g5aaC5p6c5a2Y5ZyoIG9wdGlvbnMsIOS8mOWFiOS9v+eUqFxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgb3B0aW9uc1ByZWZpeENscyA9IG9wdGlvblR5cGUgPT09ICdidXR0b24nID8gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1idXR0b25cIikgOiBwcmVmaXhDbHM7XG4gICAgICBjaGlsZHJlblRvUmVuZGVyID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyDmraTlpITnsbvlnovoh6rliqjmjqjlr7zkuLogc3RyaW5nXG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yYWRpb1tcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICAgIGtleTogb3B0aW9uLFxuICAgICAgICAgICAgcHJlZml4Q2xzOiBvcHRpb25zUHJlZml4Q2xzLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbixcbiAgICAgICAgICAgIGNoZWNrZWQ6IHZhbHVlID09PSBvcHRpb25cbiAgICAgICAgICB9LCBvcHRpb24pO1xuICAgICAgICB9IC8vIOatpOWkhOexu+Wei+iHquWKqOaOqOWvvOS4uiB7IGxhYmVsOiBzdHJpbmcgdmFsdWU6IHN0cmluZyB9XG5cblxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JhZGlvW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICAgIGtleTogXCJyYWRpby1ncm91cC12YWx1ZS1vcHRpb25zLVwiLmNvbmNhdChvcHRpb24udmFsdWUpLFxuICAgICAgICAgIHByZWZpeENsczogb3B0aW9uc1ByZWZpeENscyxcbiAgICAgICAgICBkaXNhYmxlZDogb3B0aW9uLmRpc2FibGVkIHx8IGRpc2FibGVkLFxuICAgICAgICAgIHZhbHVlOiBvcHRpb24udmFsdWUsXG4gICAgICAgICAgY2hlY2tlZDogdmFsdWUgPT09IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICBzdHlsZTogb3B0aW9uLnN0eWxlXG4gICAgICAgIH0sIG9wdGlvbi5sYWJlbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgbWVyZ2VkU2l6ZSA9IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZTtcbiAgICB2YXIgY2xhc3NTdHJpbmcgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShncm91cFByZWZpeENscywgXCJcIi5jb25jYXQoZ3JvdXBQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYnV0dG9uU3R5bGUpLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoZ3JvdXBQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobWVyZ2VkU2l6ZSksIG1lcmdlZFNpemUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChncm91cFByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgICBvbk1vdXNlTGVhdmU6IG9uTW91c2VMZWF2ZSxcbiAgICAgIGlkOiBpZCxcbiAgICAgIHJlZjogcmVmXG4gICAgfSwgY2hpbGRyZW5Ub1JlbmRlcik7XG4gIH07XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb250ZXh0LlJhZGlvR3JvdXBDb250ZXh0UHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgb25DaGFuZ2U6IG9uUmFkaW9DaGFuZ2UsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBkaXNhYmxlZDogcHJvcHMuZGlzYWJsZWQsXG4gICAgICBuYW1lOiBwcm9wcy5uYW1lXG4gICAgfVxuICB9LCByZW5kZXJHcm91cCgpKTtcbn0pO1xuUmFkaW9Hcm91cC5kZWZhdWx0UHJvcHMgPSB7XG4gIGJ1dHRvblN0eWxlOiAnb3V0bGluZSdcbn07XG5cbnZhciBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKFJhZGlvR3JvdXApO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkdyb3VwXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9ncm91cFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQnV0dG9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9yYWRpb0J1dHRvbltcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfcmFkaW8gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JhZGlvXCIpKTtcblxudmFyIF9ncm91cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZ3JvdXBcIikpO1xuXG52YXIgX3JhZGlvQnV0dG9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9yYWRpb0J1dHRvblwiKSk7XG5cbnZhciBSYWRpbyA9IF9yYWRpb1tcImRlZmF1bHRcIl07XG5SYWRpby5CdXR0b24gPSBfcmFkaW9CdXR0b25bXCJkZWZhdWx0XCJdO1xuUmFkaW8uR3JvdXAgPSBfZ3JvdXBbXCJkZWZhdWx0XCJdO1xudmFyIF9kZWZhdWx0ID0gUmFkaW87XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY0NoZWNrYm94ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtY2hlY2tib3hcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfY29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY29udGV4dFwiKSk7XG5cbnZhciBfcmVmID0gcmVxdWlyZShcIi4uL191dGlsL3JlZlwiKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgSW50ZXJuYWxSYWRpbyA9IGZ1bmN0aW9uIEludGVybmFsUmFkaW8ocHJvcHMsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb250ZXh0W1wiZGVmYXVsdFwiXSk7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIGlubmVyUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBtZXJnZWRSZWYgPSAoMCwgX3JlZi5jb21wb3NlUmVmKShyZWYsIGlubmVyUmVmKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghKCdvcHRpb25UeXBlJyBpbiBwcm9wcyksICdSYWRpbycsICdgb3B0aW9uVHlwZWAgaXMgb25seSBzdXBwb3J0IGluIFJhZGlvLkdyb3VwLicpO1xuICB9LCBbXSk7XG5cbiAgdmFyIG9uQ2hhbmdlID0gZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgIGlmIChwcm9wcy5vbkNoYW5nZSkge1xuICAgICAgcHJvcHMub25DaGFuZ2UoZSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgPT09IG51bGwgfHwgY29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29udGV4dC5vbkNoYW5nZSkge1xuICAgICAgY29udGV4dC5vbkNoYW5nZShlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInN0eWxlXCJdKTtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdyYWRpbycsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciByYWRpb1Byb3BzID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByZXN0UHJvcHMpO1xuXG4gIGlmIChjb250ZXh0KSB7XG4gICAgcmFkaW9Qcm9wcy5uYW1lID0gY29udGV4dC5uYW1lO1xuICAgIHJhZGlvUHJvcHMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgICByYWRpb1Byb3BzLmNoZWNrZWQgPSBwcm9wcy52YWx1ZSA9PT0gY29udGV4dC52YWx1ZTtcbiAgICByYWRpb1Byb3BzLmRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQgfHwgY29udGV4dC5kaXNhYmxlZDtcbiAgfVxuXG4gIHZhciB3cmFwcGVyQ2xhc3NTdHJpbmcgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwcGVyXCIpLCB0cnVlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwcGVyLWNoZWNrZWRcIiksIHJhZGlvUHJvcHMuY2hlY2tlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1kaXNhYmxlZFwiKSwgcmFkaW9Qcm9wcy5kaXNhYmxlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHJldHVybiAoXG4gICAgLyojX19QVVJFX18qL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc3gtYTExeS9sYWJlbC1oYXMtYXNzb2NpYXRlZC1jb250cm9sXG4gICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzU3RyaW5nLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgb25Nb3VzZUVudGVyOiBwcm9wcy5vbk1vdXNlRW50ZXIsXG4gICAgICBvbk1vdXNlTGVhdmU6IHByb3BzLm9uTW91c2VMZWF2ZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY0NoZWNrYm94W1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByYWRpb1Byb3BzLCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHJlZjogbWVyZ2VkUmVmXG4gICAgfSkpLCBjaGlsZHJlbiAhPT0gdW5kZWZpbmVkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGNoaWxkcmVuKSA6IG51bGwpXG4gICk7XG59O1xuXG52YXIgUmFkaW8gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFJhZGlvKTtcblJhZGlvLmRpc3BsYXlOYW1lID0gJ1JhZGlvJztcblJhZGlvLmRlZmF1bHRQcm9wcyA9IHtcbiAgdHlwZTogJ3JhZGlvJ1xufTtcbnZhciBfZGVmYXVsdCA9IFJhZGlvO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmFkaW8gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JhZGlvXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfY29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY29udGV4dFwiKSk7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgUmFkaW9CdXR0b24gPSBmdW5jdGlvbiBSYWRpb0J1dHRvbihwcm9wcywgcmVmKSB7XG4gIHZhciByYWRpb0dyb3VwQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbnRleHRbXCJkZWZhdWx0XCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcblxuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgcmFkaW9Qcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCJdKTtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdyYWRpby1idXR0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuXG4gIGlmIChyYWRpb0dyb3VwQ29udGV4dCkge1xuICAgIHJhZGlvUHJvcHMuY2hlY2tlZCA9IHByb3BzLnZhbHVlID09PSByYWRpb0dyb3VwQ29udGV4dC52YWx1ZTtcbiAgICByYWRpb1Byb3BzLmRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQgfHwgcmFkaW9Hcm91cENvbnRleHQuZGlzYWJsZWQ7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JhZGlvW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9LCByYWRpb1Byb3BzLCB7XG4gICAgdHlwZTogXCJyYWRpb1wiLFxuICAgIHJlZjogcmVmXG4gIH0pKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFJhZGlvQnV0dG9uKTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNSYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtcmF0ZVwiKSk7XG5cbnZhciBfU3RhckZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1N0YXJGaWxsZWRcIikpO1xuXG52YXIgX3Rvb2x0aXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi90b29sdGlwXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgUmF0ZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChfYSwgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICB0b29sdGlwcyA9IF9hLnRvb2x0aXBzLFxuICAgICAgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcInRvb2x0aXBzXCJdKTtcblxuICB2YXIgY2hhcmFjdGVyUmVuZGVyID0gZnVuY3Rpb24gY2hhcmFjdGVyUmVuZGVyKG5vZGUsIF9yZWYpIHtcbiAgICB2YXIgaW5kZXggPSBfcmVmLmluZGV4O1xuICAgIGlmICghdG9vbHRpcHMpIHJldHVybiBub2RlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdG9vbHRpcFtcImRlZmF1bHRcIl0sIHtcbiAgICAgIHRpdGxlOiB0b29sdGlwc1tpbmRleF1cbiAgICB9LCBub2RlKTtcbiAgfTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgcmF0ZVByZWZpeENscyA9IGdldFByZWZpeENscygncmF0ZScsIHByZWZpeENscyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNSYXRlW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICByZWY6IHJlZixcbiAgICBjaGFyYWN0ZXJSZW5kZXI6IGNoYXJhY3RlclJlbmRlclxuICB9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcmF0ZVByZWZpeENscyxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICB9KSk7XG59KTtcblJhdGUuZGlzcGxheU5hbWUgPSAnUmF0ZSc7XG5SYXRlLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2hhcmFjdGVyOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU3RhckZpbGxlZFtcImRlZmF1bHRcIl0sIG51bGwpXG59O1xudmFyIF9kZWZhdWx0ID0gUmF0ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHBvcnRzLkV4Y2VwdGlvbk1hcCA9IGV4cG9ydHMuSWNvbk1hcCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfQ2hlY2tDaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DaGVja0NpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfQ2xvc2VDaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZFwiKSk7XG5cbnZhciBfV2FybmluZ0ZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1dhcm5pbmdGaWxsZWRcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfbm9Gb3VuZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbm9Gb3VuZFwiKSk7XG5cbnZhciBfc2VydmVyRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3NlcnZlckVycm9yXCIpKTtcblxudmFyIF91bmF1dGhvcml6ZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VuYXV0aG9yaXplZFwiKSk7XG5cbnZhciBJY29uTWFwID0ge1xuICBzdWNjZXNzOiBfQ2hlY2tDaXJjbGVGaWxsZWRbXCJkZWZhdWx0XCJdLFxuICBlcnJvcjogX0Nsb3NlQ2lyY2xlRmlsbGVkW1wiZGVmYXVsdFwiXSxcbiAgaW5mbzogX0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkW1wiZGVmYXVsdFwiXSxcbiAgd2FybmluZzogX1dhcm5pbmdGaWxsZWRbXCJkZWZhdWx0XCJdXG59O1xuZXhwb3J0cy5JY29uTWFwID0gSWNvbk1hcDtcbnZhciBFeGNlcHRpb25NYXAgPSB7XG4gICc0MDQnOiBfbm9Gb3VuZFtcImRlZmF1bHRcIl0sXG4gICc1MDAnOiBfc2VydmVyRXJyb3JbXCJkZWZhdWx0XCJdLFxuICAnNDAzJzogX3VuYXV0aG9yaXplZFtcImRlZmF1bHRcIl1cbn07IC8vIEV4Y2VwdGlvbkltYWdlTWFwIGtleXNcblxuZXhwb3J0cy5FeGNlcHRpb25NYXAgPSBFeGNlcHRpb25NYXA7XG52YXIgRXhjZXB0aW9uU3RhdHVzID0gT2JqZWN0LmtleXMoRXhjZXB0aW9uTWFwKTtcbi8qKlxuICogcmVuZGVyIGljb25cbiAqIGlmIEV4Y2VwdGlvblN0YXR1cyBpbmNsdWRlcyAscmVuZGVyIHN2ZyBpbWFnZVxuICogZWxzZSByZW5kZXIgaWNvbk5vZGVcbiAqIEBwYXJhbSBwcmVmaXhDbHNcbiAqIEBwYXJhbSB7c3RhdHVzLCBpY29ufVxuICovXG5cbnZhciByZW5kZXJJY29uID0gZnVuY3Rpb24gcmVuZGVySWNvbihwcmVmaXhDbHMsIF9yZWYpIHtcbiAgdmFyIHN0YXR1cyA9IF9yZWYuc3RhdHVzLFxuICAgICAgaWNvbiA9IF9yZWYuaWNvbjtcbiAgdmFyIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvblwiKSk7XG4gICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKCEodHlwZW9mIGljb24gPT09ICdzdHJpbmcnICYmIGljb24ubGVuZ3RoID4gMiksICdSZXN1bHQnLCBcImBpY29uYCBpcyB1c2luZyBSZWFjdE5vZGUgaW5zdGVhZCBvZiBzdHJpbmcgbmFtaW5nIGluIHY0LiBQbGVhc2UgY2hlY2sgYFwiLmNvbmNhdChpY29uLCBcImAgYXQgaHR0cHM6Ly9hbnQuZGVzaWduL2NvbXBvbmVudHMvaWNvblwiKSk7XG5cbiAgaWYgKEV4Y2VwdGlvblN0YXR1cy5pbmNsdWRlcyhcIlwiLmNvbmNhdChzdGF0dXMpKSkge1xuICAgIHZhciBTVkdDb21wb25lbnQgPSBFeGNlcHRpb25NYXBbc3RhdHVzXTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjbGFzc05hbWUsIFwiIFwiKS5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWFnZVwiKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNWR0NvbXBvbmVudCwgbnVsbCkpO1xuICB9XG5cbiAgdmFyIGljb25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbk1hcFtzdGF0dXNdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCBpY29uIHx8IGljb25Ob2RlKTtcbn07XG5cbnZhciByZW5kZXJFeHRyYSA9IGZ1bmN0aW9uIHJlbmRlckV4dHJhKHByZWZpeENscywgX3JlZjIpIHtcbiAgdmFyIGV4dHJhID0gX3JlZjIuZXh0cmE7XG4gIHJldHVybiBleHRyYSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4dHJhXCIpXG4gIH0sIGV4dHJhKTtcbn07XG5cbnZhciBSZXN1bHQgPSBmdW5jdGlvbiBSZXN1bHQocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgdmFyIGdldFByZWZpeENscyA9IF9yZWYzLmdldFByZWZpeENscyxcbiAgICAgICAgZGlyZWN0aW9uID0gX3JlZjMuZGlyZWN0aW9uO1xuICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIGN1c3RvbWl6ZUNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3ViVGl0bGUgPSBwcm9wcy5zdWJUaXRsZSxcbiAgICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgc3RhdHVzID0gcHJvcHMuc3RhdHVzO1xuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3Jlc3VsdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgdmFyIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHN0YXR1cyksIGN1c3RvbWl6ZUNsYXNzTmFtZSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCByZW5kZXJJY29uKHByZWZpeENscywgcHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGl0bGVcIilcbiAgICB9LCB0aXRsZSksIHN1YlRpdGxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdWJ0aXRsZVwiKVxuICAgIH0sIHN1YlRpdGxlKSwgcmVuZGVyRXh0cmEocHJlZml4Q2xzLCBwcm9wcyksIGNoaWxkcmVuICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpXG4gICAgfSwgY2hpbGRyZW4pKTtcbiAgfSk7XG59O1xuXG5SZXN1bHQuZGVmYXVsdFByb3BzID0ge1xuICBzdGF0dXM6ICdpbmZvJ1xufTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG5cblJlc3VsdC5QUkVTRU5URURfSU1BR0VfNDAzID0gRXhjZXB0aW9uTWFwWzQwM107IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuXG5SZXN1bHQuUFJFU0VOVEVEX0lNQUdFXzQwNCA9IEV4Y2VwdGlvbk1hcFs0MDRdOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcblxuUmVzdWx0LlBSRVNFTlRFRF9JTUFHRV81MDAgPSBFeGNlcHRpb25NYXBbNTAwXTtcbnZhciBfZGVmYXVsdCA9IFJlc3VsdDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIE5vRm91bmQgPSBmdW5jdGlvbiBOb0ZvdW5kKCkge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiBcIjI1MlwiLFxuICAgIGhlaWdodDogXCIyOTRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0wIC4zODdoMjUxLjc3MnYyNTEuNzcySDB6XCJcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoMCAuMDEyKVwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibWFza1wiLCB7XG4gICAgZmlsbDogXCIjZmZmXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMCAxMjcuMzJ2LTIuMDk1QzAgNTYuMjc5IDU1Ljg5Mi4zODcgMTI0LjgzOC4zODdoMi4wOTZjNjguOTQ2IDAgMTI0LjgzOCA1NS44OTIgMTI0LjgzOCAxMjQuODM4djIuMDk2YzAgNjguOTQ2LTU1Ljg5MiAxMjQuODM4LTEyNC44MzggMTI0LjgzOGgtMi4wOTZDNTUuODkyIDI1Mi4xNiAwIDE5Ni4yNjcgMCAxMjcuMzIxXCIsXG4gICAgZmlsbDogXCIjRTRFQkY3XCIsXG4gICAgbWFzazogXCJ1cmwoI2IpXCJcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTM5Ljc1NSAxMzAuODRhOC4yNzYgOC4yNzYgMCAxIDEtMTYuNDY4LTEuNjYgOC4yNzYgOC4yNzYgMCAwIDEgMTYuNDY4IDEuNjZcIixcbiAgICBmaWxsOiBcIiNGRkZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zNi45NzUgMTM0LjI5N2wxMC40ODIgNS45NDNNNDguMzczIDE0Ni41MDhsLTEyLjY0OCAxMC43ODhcIixcbiAgICBzdHJva2U6IFwiI0ZGRlwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjJcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zOS44NzUgMTU5LjM1MmE1LjY2NyA1LjY2NyAwIDEgMS0xMS4yNzctMS4xMzYgNS42NjcgNS42NjcgMCAwIDEgMTEuMjc3IDEuMTM2TTU3LjU4OCAxNDMuMjQ3YTUuNzA4IDUuNzA4IDAgMSAxLTExLjM1OC0xLjE0NSA1LjcwOCA1LjcwOCAwIDAgMSAxMS4zNTggMS4xNDVNOTkuMDE4IDI2Ljg3NWwyOS44Mi0uMDE0YTQuNTg3IDQuNTg3IDAgMSAwLS4wMDMtOS4xNzVsLTI5LjgyLjAxM2E0LjU4NyA0LjU4NyAwIDEgMCAuMDAzIDkuMTc2TTExMC40MjQgNDUuMjExbDI5LjgyLS4wMTNhNC41ODggNC41ODggMCAwIDAtLjAwNC05LjE3NWwtMjkuODIuMDEzYTQuNTg3IDQuNTg3IDAgMSAwIC4wMDQgOS4xNzVcIixcbiAgICBmaWxsOiBcIiNGRkZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMTIuNzk4IDI2Ljg2MXYtLjAwMmwxNS43ODQtLjAwNmE0LjU4OCA0LjU4OCAwIDEgMCAuMDAzIDkuMTc1bC0xNS43ODMuMDA3di0uMDAyYTQuNTg2IDQuNTg2IDAgMCAwLS4wMDQtOS4xNzJNMTg0LjUyMyAxMzUuNjY4Yy0uNTUzIDUuNDg1LTUuNDQ3IDkuNDgzLTEwLjkzMSA4LjkzLTUuNDg1LS41NTMtOS40ODMtNS40NDgtOC45My0xMC45MzIuNTUyLTUuNDg1IDUuNDQ3LTkuNDgzIDEwLjkzMi04LjkzIDUuNDg1LjU1MyA5LjQ4MyA1LjQ0NyA4LjkzIDEwLjkzMlwiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE3OS4yNiAxNDEuNzVsMTIuNjQgNy4xNjdNMTkzLjAwNiAxNTYuNDc3bC0xNS4yNTUgMTMuMDExXCIsXG4gICAgc3Ryb2tlOiBcIiNGRkZcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTg0LjY2OCAxNzAuMDU3YTYuODM1IDYuODM1IDAgMSAxLTEzLjYtMS4zNzIgNi44MzUgNi44MzUgMCAwIDEgMTMuNiAxLjM3Mk0yMDMuMzQgMTUzLjMyNWE2Ljg4NSA2Ljg4NSAwIDEgMS0xMy43LTEuMzgyIDYuODg1IDYuODg1IDAgMCAxIDEzLjcgMS4zODJcIixcbiAgICBmaWxsOiBcIiNGRkZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNTEuOTMxIDE5Mi4zMjRhMi4yMjIgMi4yMjIgMCAxIDEtNC40NDQgMCAyLjIyMiAyLjIyMiAwIDAgMSA0LjQ0NCAwek0yMjUuMjcgMTE2LjA1NmEyLjIyMiAyLjIyMiAwIDEgMS00LjQ0NSAwIDIuMjIyIDIuMjIyIDAgMCAxIDQuNDQ0IDB6TTIxNi4zOCAxNTEuMDhhMi4yMjMgMi4yMjMgMCAxIDEtNC40NDYtLjAwMSAyLjIyMyAyLjIyMyAwIDAgMSA0LjQ0NiAwek0xNzYuOTE3IDEwNy42MzZhMi4yMjMgMi4yMjMgMCAxIDEtNC40NDUgMCAyLjIyMyAyLjIyMyAwIDAgMSA0LjQ0NSAwek0xOTUuMjkxIDkyLjE2NWEyLjIyMyAyLjIyMyAwIDEgMS00LjQ0NSAwIDIuMjIzIDIuMjIzIDAgMCAxIDQuNDQ1IDB6TTIwMi4wNTggMTgwLjcxMWEyLjIyMyAyLjIyMyAwIDEgMS00LjQ0NiAwIDIuMjIzIDIuMjIzIDAgMCAxIDQuNDQ2IDB6XCIsXG4gICAgc3Ryb2tlOiBcIiNGRkZcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgc3Ryb2tlOiBcIiNGRkZcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCIsXG4gICAgZDogXCJNMjE0LjQwNCAxNTMuMzAybC0xLjkxMiAyMC4xODQtMTAuOTI4IDUuOTlNMTczLjY2MSAxNzQuNzkybC02LjM1NiA5LjgxNGgtMTEuMzZsLTQuNTA4IDYuNDg0TTE3NC45NDEgMTI1LjE2OHYtMTUuODA0TTIyMC44MjQgMTE3LjI1bC0xMi44NCA3LjkwMS0xNS4zMS03LjkwMlY5NC4zOVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE2Ni41ODggNjUuOTM2aC0zLjk1MWE0Ljc1NiA0Ljc1NiAwIDAgMS00Ljc0My00Ljc0MiA0Ljc1NiA0Ljc1NiAwIDAgMSA0Ljc0My00Ljc0M2gzLjk1MWE0Ljc1NiA0Ljc1NiAwIDAgMSA0Ljc0MyA0Ljc0MyA0Ljc1NiA0Ljc1NiAwIDAgMS00Ljc0MyA0Ljc0MlwiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE3NC44MjMgMzAuMDNjMC0xNi4yODEgMTMuMTk4LTI5LjQ4IDI5LjQ4LTI5LjQ4IDE2LjI4IDAgMjkuNDggMTMuMTk5IDI5LjQ4IDI5LjQ4IDAgMTYuMjgtMTMuMiAyOS40OC0yOS40OCAyOS40OC0xNi4yODIgMC0yOS40OC0xMy4yLTI5LjQ4LTI5LjQ4XCIsXG4gICAgZmlsbDogXCIjMTg5MEZGXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjA1Ljk1MiAzOC4zODdjLjUuNS43ODUgMS4xNDIuNzg1IDEuOTI4cy0uMjg2IDEuNDY1LS43ODUgMS45NjRjLS41NzIuNS0xLjIxNC43NS0yIC43NS0uNzg1IDAtMS40MjktLjI4NS0xLjkyOS0uNzg1LS41NzItLjUtLjgyLTEuMTQzLS44Mi0xLjkyOXMuMjQ4LTEuNDI4LjgyLTEuOTI4Yy41LS41IDEuMTQ0LS43NSAxLjkzLS43NS43ODUgMCAxLjQ2Mi4yNSAxLjk5OS43NW00LjI4NS0xOS40NjNjMS40MjggMS4yNDkgMi4xNDMgMi45NjMgMi4xNDMgNS4xNDIgMCAxLjcxMi0uNDI3IDMuMTMtMS4yMTkgNC4yNS0uMDY3LjA5Ni0uMTM3LjE4LS4yMTguMjY1LS40MTYuNDI5LTEuNDEgMS4zNDYtMi45NTYgMi42OTlhNS4wNyA1LjA3IDAgMCAwLTEuNDI4IDEuNzUgNS4yMDcgNS4yMDcgMCAwIDAtLjUzNiAyLjM1N3YuNWgtNC4xMDd2LS41YzAtMS4zNTcuMjE1LTIuNTM2LjcxNC0zLjUuNDY0LS45NjQgMS44NTctMi40NjQgNC4xNzgtNC41MzZsLjQzLS41Yy42NDMtLjc4NS45NjQtMS42NDMuOTY0LTIuNTM1IDAtMS4xOC0uMzU4LTIuMTA4LTEtMi43ODUtLjY3OC0uNjgtMS42NDMtMS4wMDEtMi44NTgtMS4wMDEtMS41MzYgMC0yLjY0Mi40NjQtMy4zNTcgMS40My0uMzcuNS0uNjIxIDEuMTM1LS43NiAxLjkwNGExLjk5OSAxLjk5OSAwIDAgMS0xLjk3MSAxLjYzaC0uMDA0Yy0xLjI3NyAwLTIuMjU3LTEuMTgzLTEuOTgtMi40My4zMzctMS41MTggMS4wMi0yLjc4IDIuMDczLTMuNzg0IDEuNTM2LTEuNSAzLjYwNy0yLjI1IDYuMjUtMi4yNSAyLjMyIDAgNC4yMTQuNjA3IDUuNjQyIDEuODk0XCIsXG4gICAgZmlsbDogXCIjRkZGXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTIuMDQgNzYuMTMxczIxLjgxIDUuMzYgMjcuMzA3IDE1Ljk0NWM1LjU3NSAxMC43NC02LjM1MiA5LjI2LTE1LjczIDQuOTM1LTEwLjg2LTUuMDA4LTI0LjctMTEuODIyLTExLjU3Ny0yMC44OFwiLFxuICAgIGZpbGw6IFwiI0ZGQjU5NFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTkwLjQ4MyA2Ny41MDRsLS40NDkgMi44OTNjLS43NTMuNDktNC43NDgtMi42NjMtNC43NDgtMi42NjNsLTEuNjQ1Ljc0OC0xLjM0Ni01LjY4NHM2LjgxNS00LjU4OSA4LjkxNy01LjAxOGMyLjQ1Mi0uNTAxIDkuODg0Ljk0IDEwLjcgMi4yNzggMCAwIDEuMzIuNDg2LTIuMjI3LjY5LTMuNTQ4LjIwMy01LjA0My40NDctNi43OSAzLjEzMi0xLjc0NyAyLjY4Ni0yLjQxMiAzLjYyNC0yLjQxMiAzLjYyNFwiLFxuICAgIGZpbGw6IFwiI0ZGQzZBMFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEyOC4wNTUgMTExLjM2N2MtMi42MjctNy43MjQtNi4xNS0xMy4xOC04LjkxNy0xNS40NzgtMy41LTIuOTA2LTkuMzQtMi4yMjUtMTEuMzY2LTQuMTg3LTEuMjctMS4yMzEtMy4yMTUtMS4xOTctMy4yMTUtMS4xOTdzLTE0Ljk4LTMuMTU4LTE2LjgyOC0zLjQ3OWMtMi4zNy0uNDEtMi4xMjQtLjcxNC02LjA1NC0xLjQwNS0xLjU3LTEuOTA3LTIuOTE3LTEuMTIyLTIuOTE3LTEuMTIybC03LjExLTEuMzgzYy0uODUzLTEuNDcyLTIuNDIzLTEuMDIzLTIuNDIzLTEuMDIzbC0yLjQ2OC0uODk3Yy0xLjY0NSA5Ljk3Ni03Ljc0IDEzLjc5Ni03Ljc0IDEzLjc5NiAxLjc5NSAxLjEyMiAxNS43MDMgOC4zIDE1LjcwMyA4LjNsNS4xMDcgMzcuMTFzLTMuMzIxIDUuNjk0IDEuMzQ2IDkuMTA5YzAgMCAxOS44ODMtMy43NDMgMzQuOTIxLS4zMjkgMCAwIDMuMDQ3LTIuNTQ2Ljk3Mi04LjgwNi41MjMtMy4wMSAxLjM5NC04LjI2MyAxLjczNi0xMS42MjIuMzg1Ljc3MiAyLjAxOSAxLjkxOCAzLjE0IDMuNDc3IDAgMCA5LjQwNy03LjM2NSAxMS4wNTItMTQuMDEyLS44MzItLjcyMy0xLjU5OC0xLjU4NS0yLjI2Ny0yLjQ1My0uNTY3LS43MzYtLjM1OC0yLjA1Ni0uNzY1LTIuNzE3LS42NjktMS4wODQtMS44MDQtMS4zNzgtMS45MDctMS42ODJcIixcbiAgICBmaWxsOiBcIiNGRkZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDEuMDkgMjg5Ljk5OHM0LjI5NSAyLjA0MSA3LjM1NCAxLjAyMWMyLjgyMS0uOTQgNC41My42NjggNy4wOCAxLjE3OCAyLjU1LjUxIDYuODc0IDEuMSAxMS42ODYtMS4yNi0uMTAzLTUuNTEtNi44ODktMy45OC0xMS45Ni02LjcxMy0yLjU2My0xLjM4LTMuNzg0LTQuNzIyLTMuNTk4LTguNzk5aC05LjQwMnMtMS4zOTIgMTAuNTItMS4xNiAxNC41NzNcIixcbiAgICBmaWxsOiBcIiNDQkQxRDFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDEuMDY3IDI4OS44MjZzMi40MjggMS4yNzEgNi43NTkuNjUzYzMuMDU4LS40MzcgMy43MTIuNDgxIDcuNDIzIDEuMDMxIDMuNzEyLjU1IDEwLjcyNC0uMDY5IDExLjgyMy0uODk0LjQxMyAxLjEtLjM0MyAyLjA2My0uMzQzIDIuMDYzcy0xLjUxMi42MDMtNC44MTIuODI0Yy0yLjAzLjEzNi01LjguMjkxLTcuNjA3LS41MDMtMS43ODctMS4zNzUtNS4yNDctMS45MDMtNS43MjgtLjI0MS0zLjkxOC45NS03LjM1NS0uMjg2LTcuMzU1LS4yODZsLS4xNi0yLjY0N3pcIixcbiAgICBmaWxsOiBcIiMyQjA4NDlcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDguMzQxIDI3Ni4wNDRoMy4wOTRzLS4xMDMgNi43MDIgNC41MzYgOC41NThjLTQuNjQuNjE4LTguNTU4LTIuMzAzLTcuNjMtOC41NThcIixcbiAgICBmaWxsOiBcIiNBNEFBQkFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01Ny41NDIgMjcyLjQwMXMtMi4xMDcgNy40MTYtNC40ODUgMTIuMzA2Yy0xLjc5OCAzLjY5NS00LjIyNSA3LjQ5MiA1LjQ2NSA3LjQ5MiA2LjY0OCAwIDguOTUzLS40OCA3LjQyMy02LjU5OS0xLjUzLTYuMTIuMjY2LTEzLjE5OS4yNjYtMTMuMTk5aC04LjY2OXpcIixcbiAgICBmaWxsOiBcIiNDQkQxRDFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01MS40NzYgMjg5Ljc5M3MyLjA5NyAxLjE2OSA2LjYzMyAxLjE2OWM2LjA4MyAwIDguMjQ5LTEuNjUgOC4yNDktMS42NXMuNjAyIDEuMTE0LS42MTkgMi4xNjVjLS45OTMuODU1LTMuNTk3IDEuNTkxLTcuMzkgMS41NDYtNC4xNDUtLjA0OC01LjgzMi0uNTY2LTYuNzM2LTEuMTY4LS44MjUtLjU1LS42ODctMS41OC0uMTM3LTIuMDYyXCIsXG4gICAgZmlsbDogXCIjMkIwODQ5XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTguNDE5IDI3NC4zMDRzLjAzMyAxLjUxOS0uMzE0IDIuOTNjLS4zNDkgMS40Mi0xLjA3OCAzLjEwNC0xLjEzIDQuMTM5LS4wNTggMS4xNTEgNC41MzcgMS41OCA1LjE1NS4wMzQuNjItMS41NDcgMS4yOTQtNi40MjcgMS45MTMtNy4yNTIuNjE5LS44MjUtNC45MDMtMi4xMTktNS42MjQuMTVcIixcbiAgICBmaWxsOiBcIiNBNEFBQkFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05OS42NiAyNzguNTE0bDEzLjM3OC4wOTJzMS4yOTgtNTQuNTIgMS44NTMtNjQuNDAzYy41NTQtOS44ODIgMy43NzYtNDMuMzY0IDEuMDAyLTYzLjEyOGwtMTIuNTQ3LS42NDQtMjIuODQ5Ljc4cy0uNDM0IDMuOTY2LTEuMTk1IDkuOTc2Yy0uMDYzLjQ5Ni0uNjgyLjg0My0uNzQ5IDEuMzY1LS4wNzUuNTg1LjQyMyAxLjM1NC4zMiAxLjk2Ni0yLjM2NCAxNC4wOC02LjM3NyAzMy4xMDQtOC43NDQgNDYuNjc3LS4xMTYuNjY2LTEuMjM0IDEuMDA5LTEuNDU4IDIuNjkxLS4wNC4zMDIuMjExIDEuNTI1LjExMiAxLjc5NS02Ljg3MyAxOC43NDQtMTAuOTQ5IDQ3Ljg0Mi0xNC4yNzcgNjEuODg1bDE0LjYwNy0uMDE0czIuMTk3LTguNTcgNC4wMy0xNi45N2MyLjgxMS0xMi44ODYgMjMuMTExLTg1LjAxIDIzLjExMS04NS4wMWwzLjAxNi0uNTIxIDEuMDQzIDQ2LjM1cy0uMjI0IDEuMjM0LjMzNyAyLjAyYy41Ni43ODUtLjU2IDEuMTIzLS4zOTIgMi4yNDRsLjM5MiAxLjc5NHMtLjQ0OSA3LjE3OC0uODk4IDExLjg5Yy0uNDQ4IDQuNzEtLjA5MiAzOS4xNjUtLjA5MiAzOS4xNjVcIixcbiAgICBmaWxsOiBcIiM3QkIyRjlcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03Ni4wODUgMjIxLjYyNmMxLjE1My4wOTQgNC4wMzgtMi4wMTkgNi45NTUtNC45MzVNMTA2LjM2IDIyNS4xNDJzMi43NzQtMS4xMSA2LjEwMy0zLjg4M1wiLFxuICAgIHN0cm9rZTogXCIjNjQ4QkQ4XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wNTFcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDcuMjc1IDIyMi4xczIuNzczLTEuMTEgNi4xMDItMy44ODRcIixcbiAgICBzdHJva2U6IFwiIzY0OEJEOFwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTc0Ljc0IDIyNC43NjdzMi42MjItLjU5MSA2LjUwNS0zLjM2NU04Ni4wMyAxNTEuNjM0Yy0uMjcgMy4xMDYuMyA4LjUyNS00LjMzNiA5LjEyM00xMDMuNjI1IDE0OS44OHMuMTEgMTQuMDEyLTEuMjkzIDE1LjA2NWMtMi4yMTkgMS42NjQtMi45OSAxLjk0NC0yLjk5IDEuOTQ0TTk5Ljc5IDE1MC40MzhzLjAzNSAxMi44OC0xLjE5NiAyNC4zNzdNOTMuNjczIDE3NS45MTFzNy4yMTItMS42NjQgOS40MzEtMS42NjRNNzQuMzEgMjA1Ljg2MWEyMTIuMDEzIDIxMi4wMTMgMCAwIDEtLjk3OSA0LjU2cy0xLjQ1OCAxLjgzMi0xLjAwOSAzLjc3NmMuNDQ5IDEuOTQ0LS45NDcgMi4wNDUtNC45ODUgMTUuMzU1LTEuNjk2IDUuNTktNC40OSAxOC41OTEtNi4zNDggMjcuNTk3bC0uMjMxIDEuMTJNNzUuNjg5IDE5Ny44MDdhMzIwLjkzNCAzMjAuOTM0IDAgMCAxLS44ODIgNC43NTRNODIuNTkxIDE1Mi4yMzNMODEuMzk1IDE2Mi43cy0xLjA5Ny4xNS0uNSAyLjI0NGMuMTEzIDEuMzQ2LTIuNjc0IDE1Ljc3NS01LjE4IDMwLjQzTTU2LjEyIDI3NC40MThoMTMuMzFcIixcbiAgICBzdHJva2U6IFwiIzY0OEJEOFwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMDUxXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTE2LjI0MSAxNDguMjJzLTE3LjA0Ny0zLjEwNC0zNS44OTMuMmMuMTU4IDIuNTE0LS4wMDMgNC4xNS0uMDAzIDQuMTVzMTQuNjg3LTIuODE4IDM1LjY3LS4zMTJjLjI1Mi0yLjM1NS4yMjYtNC4wMzguMjI2LTQuMDM4XCIsXG4gICAgZmlsbDogXCIjMTkyMDY0XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA2LjMyMiAxNTEuMTY1bC4wMDMtNC45MTFhLjgxLjgxIDAgMCAwLS43NzgtLjgxNWMtMi40NC0uMDkxLTUuMDY2LS4xMDgtNy44MzYtLjAxNGEuODE4LjgxOCAwIDAgMC0uNzg5LjgxNWwtLjAwMyA0LjkwNmEuODEuODEgMCAwIDAgLjgzMS44MTNjMi4zODUtLjA2IDQuOTczLS4wNjQgNy43My4wMTdhLjgxNS44MTUgMCAwIDAgLjg0Mi0uODFcIixcbiAgICBmaWxsOiBcIiNGRkZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDUuMjA3IDE1MC4yMzNsLjAwMi0zLjA3NmEuNjQyLjY0MiAwIDAgMC0uNjE5LS42NDYgOTQuMzIxIDk0LjMyMSAwIDAgMC01Ljg2Ni0uMDEuNjUuNjUgMCAwIDAtLjYzLjY0N3YzLjA3MmEuNjQuNjQgMCAwIDAgLjY1NC42NDQgMTIxLjEyIDEyMS4xMiAwIDAgMSA1Ljc5NC4wMTFjLjM2Mi4wMS42NjUtLjI4LjY2NS0uNjQyXCIsXG4gICAgZmlsbDogXCIjMTkyMDY0XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAwLjI2MyAyNzUuNDE1aDEyLjMzOE0xMDEuNDM2IDI3MC41M2MuMDA2IDMuMzg3LjA0MiA1Ljc5LjExMSA2LjUwNk0xMDEuNDUxIDI2NC41NDhhOTE1Ljc1IDkxNS43NSAwIDAgMC0uMDE1IDQuMzM3TTEwMC45ODYgMTc0Ljk2NWwuODk4IDQ0LjY0MnMuNjczIDEuNTctLjIyNSAyLjY5MmMtLjg5NyAxLjEyMiAyLjQ2OC42NzMuODk4IDIuMjQzLTEuNTcgMS41Ny44OTcgMS4xMjIgMCAzLjM2NS0uNTk2IDEuNDg5LS45OTQgMjEuMS0xLjA5NiAzNS4xNDZcIixcbiAgICBzdHJva2U6IFwiIzY0OEJEOFwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMDUxXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNDYuODc2IDgzLjQyN3MtLjUxNiA2LjA0NSA3LjIyMyA1LjU1MmMxMS4yLS43MTIgOS4yMTgtOS4zNDUgMzEuNTQtMjEuNjU1LS43ODYtMi43MDgtMi40NDctNC43NDQtMi40NDctNC43NDRzLTExLjA2OCAzLjExLTIyLjU4NCA4LjA0NmMtNi43NjYgMi45LTEzLjM5NSA2LjM1Mi0xMy43MzIgMTIuODAxTTEwNC40NiA5MS4wNTdsLjk0MS01LjM3Mi04Ljg4NC0xMS40My01LjAzNyA1LjM3Mi0xLjc0IDcuODM0YS4zMjEuMzIxIDAgMCAwIC4xMDguMzJjLjk2NS44IDYuNSA1LjAxMyAxNC4zNDcgMy41NDRhLjMzMi4zMzIgMCAwIDAgLjI2NC0uMjY4XCIsXG4gICAgZmlsbDogXCIjRkZDNkEwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTMuOTQyIDc5LjM4N3MtNC41MzMtMi44NTMtMi40MzItNi44NTVjMS42MjMtMy4wOSA0LjUxMyAxLjEzMyA0LjUxMyAxLjEzM3MuNTItMy42NDIgMy4xMjEtMy42NDJjLjUyLTEuMDQgMS41NjEtNC4xNjIgMS41NjEtNC4xNjJzMTEuNDQ1IDIuNjAxIDEzLjUyNiAzLjEyMWMwIDUuMjAzLTIuMzA0IDE5LjQyNC03Ljg0IDE5Ljg2MS04Ljg5Mi43MDMtMTIuNDQ5LTkuNDU2LTEyLjQ0OS05LjQ1NlwiLFxuICAgIGZpbGw6IFwiI0ZGQzZBMFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExMy44NzQgNzMuNDQ2YzIuNjAxLTIuMDgxIDMuNDctOS43MjIgMy40Ny05LjcyMnMtMi40NzktLjQ5LTYuNjQtMi4wNWMtNC42ODMtMi4wODEtMTIuNzk4LTQuNzQ3LTE3LjQ4Ljk3Ni05LjY2OCAzLjIyMy0yLjA1IDE5LjgyMy0yLjA1IDE5LjgyM2wyLjcxMy0zLjAyMXMtMy45MzUtMy4yODctMi4wOC02LjI0M2MyLjE3LTMuNDYyIDMuOTIgMS4wNzMgMy45MiAxLjA3M3MuNjM3LTIuMzg3IDMuNTgxLTMuMzQyYy4zNTUtLjcxIDEuMDM2LTIuNjc0IDEuNDMyLTMuODVhMS4wNzMgMS4wNzMgMCAwIDEgMS4yNjMtLjcwNGMyLjQuNTU4IDguNjc3IDIuMDE5IDExLjM1NiAyLjY2Mi41MjIuMTI1Ljg3MS42MTUuODIgMS4xNWwtLjMwNSAzLjI0OHpcIixcbiAgICBmaWxsOiBcIiM1MjAwMzhcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDQuOTc3IDc2LjA2NGMtLjEwMy42MS0uNTgyIDEuMDM4LTEuMDcuOTU2LS40ODktLjA4My0uODAxLS42NDQtLjY5OC0xLjI1NC4xMDMtLjYxLjU4Mi0xLjAzOCAxLjA3LS45NTYuNDg4LjA4Mi44LjY0NC42OTggMS4yNTRNMTEyLjEzMiA3Ny42OTRjLS4xMDMuNjEtLjU4MiAxLjAzOC0xLjA3Ljk1Ni0uNDg4LS4wODMtLjgtLjY0NC0uNjk4LTEuMjU0LjEwMy0uNjEuNTgyLTEuMDM4IDEuMDctLjk1Ni40ODguMDgyLjguNjQzLjY5OCAxLjI1NFwiLFxuICAgIGZpbGw6IFwiIzU1Mjk1MFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIHN0cm9rZTogXCIjREI4MzZFXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4xMThcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIixcbiAgICBkOiBcIk0xMTAuMTMgNzQuODRsLS44OTYgMS42MS0uMjk4IDQuMzU3aC0yLjIyOFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExMC44NDYgNzQuNDgxczEuNzktLjcxNiAyLjUwNi41MzdcIixcbiAgICBzdHJva2U6IFwiIzVDMjU1MlwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMTE4XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTIuMzg2IDc0LjI4MnMuNDc3LTEuMTE0IDEuMTEzLS43MTZjLjYzNy4zOTggMS4yNzQgMS40MzMuNTU4IDEuOTktLjcxNy41NTYuMTU5IDEuNjcuMTU5IDEuNjdcIixcbiAgICBzdHJva2U6IFwiI0RCODM2RVwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMTE4XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAzLjI4NyA3Mi45M3MxLjgzIDEuMTEzIDQuMTM3Ljk1NFwiLFxuICAgIHN0cm9rZTogXCIjNUMyNTUyXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4xMThcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDMuNjg1IDgxLjc2MnMyLjIyNyAxLjE5MyA0LjM3NiAxLjE5M00xMDQuNjQgODQuMzA4cy45NTQuMzk4IDEuNTExLjMxOE05NC42OTMgODEuMjA1czIuMzA4IDcuNCAxMC40MjQgNy42MzlcIixcbiAgICBzdHJva2U6IFwiI0RCODM2RVwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMTE4XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNODEuNDUgODkuMzg0cy40NSA1LjY0Ny00LjkzNSAxMi43ODdNNjkgODIuNjU0cy0uNzI2IDkuMjgyLTguMjA0IDE0LjIwNlwiLFxuICAgIHN0cm9rZTogXCIjRTRFQkY3XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4xMDFcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMjkuNDA1IDEyMi44NjVzLTUuMjcyIDcuNDAzLTkuNDIyIDEwLjc2OFwiLFxuICAgIHN0cm9rZTogXCIjRTRFQkY3XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wNTFcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMTkuMzA2IDEwNy4zMjlzLjQ1MiA0LjM2Ni0yLjEyNyAzMi4wNjJcIixcbiAgICBzdHJva2U6IFwiI0U0RUJGN1wiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMTAxXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTUwLjAyOCAxNTEuMjMyaC00OS44MzdhMS4wMSAxLjAxIDAgMCAxLTEuMDEtMS4wMXYtMzEuNjg4YzAtLjU1Ny40NTItMS4wMSAxLjAxLTEuMDFoNDkuODM3Yy41NTggMCAxLjAxLjQ1MyAxLjAxIDEuMDF2MzEuNjg4YTEuMDEgMS4wMSAwIDAgMS0xLjAxIDEuMDFcIixcbiAgICBmaWxsOiBcIiNGMkQ3QURcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNTAuMjkgMTUxLjIzMmgtMTkuODYzdi0zMy43MDdoMjAuNzg0djMyLjc4NmEuOTIuOTIgMCAwIDEtLjkyLjkyXCIsXG4gICAgZmlsbDogXCIjRjREMTlEXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTIzLjU1NCAxMjcuODk2SDkyLjkxN2EuNTE4LjUxOCAwIDAgMS0uNDI1LS44MTZsNi4zOC05LjExM2MuMTkzLS4yNzcuNTEtLjQ0Mi44NS0uNDQyaDMxLjA5MmwtNy4yNiAxMC4zNzF6XCIsXG4gICAgZmlsbDogXCIjRjJEN0FEXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCIjQ0M5QjZFXCIsXG4gICAgZDogXCJNMTIzLjY4OSAxMjguNDQ3SDk5LjI1di0uNTE5aDI0LjE2OWw3LjE4My0xMC4yNi40MjQuMjk4elwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE1OC4yOTggMTI3Ljg5NmgtMTguNjY5YTIuMDczIDIuMDczIDAgMCAxLTEuNjU5LS44M2wtNy4xNTYtOS41NDFoMTkuOTY1Yy40OSAwIC45NS4yMyAxLjI0NC42MjJsNi42OSA4LjkyYS41MTkuNTE5IDAgMCAxLS40MTUuODNcIixcbiAgICBmaWxsOiBcIiNGNEQxOURcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsOiBcIiNDQzlCNkVcIixcbiAgICBkOiBcIk0xNTcuODQ3IDEyOC40NzloLTE5LjM4NGwtNy44NTctMTAuNDc1LjQxNS0uMzEgNy43IDEwLjI2NmgxOS4xMjZ6TTEzMC41NTQgMTUwLjY4NWwtLjAzMi04LjE3Ny41MTktLjAwMi4wMzIgOC4xNzd6XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCIjQ0M5QjZFXCIsXG4gICAgZDogXCJNMTMwLjUxMSAxMzkuNzgzbC0uMDgtMjEuNDE0LjUxOS0uMDAyLjA4IDIxLjQxNHpNMTExLjg3NiAxNDAuOTMybC0uNDk4LS4xNDMgMS40NzktNS4xNjcuNDk4LjE0M3pNMTA4LjQzNyAxNDEuMDZsLTIuNjc5LTIuOTM1IDIuNjY1LTMuNDM0LjQxLjMxOC0yLjM5NyAzLjA4OSAyLjM4NCAyLjYxMnpNMTE2LjYwNyAxNDEuMDZsLS4zODMtLjM1IDIuMzgzLTIuNjEyLTIuMzk3LTMuMDg5LjQxLS4zMTggMi42NjUgMy40MzR6XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTU0LjMxNiAxMzEuODkybC0zLjExNC0xLjk2LjAzOCAzLjUxNC0xLjA0My4wOTJjLTEuNjgyLjExNS0zLjYzNC4yMy00Ljc4OS4yMy0xLjkwMiAwLTIuNjkzIDIuMjU4IDIuMjMgMi42NDhsLTIuNjQ1LS41OTZzLTIuMTY4IDEuMzE3LjUwNCAyLjNjMCAwLTEuNTggMS4yMTcuNTYxIDIuNTgtLjU4NCAzLjUwNCA1LjI0NyA0LjA1OCA3LjEyMiAzLjU5IDEuODc2LS40NyA0LjIzMy0yLjM1OSA0LjQ4Ny01LjE2LjI4LTMuMDg1LS44OS01LjQzMi0zLjM1LTcuMjM4XCIsXG4gICAgZmlsbDogXCIjRkZDNkEwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTUzLjY4NiAxMzMuNTc3cy02LjUyMi40Ny04LjM2LjM3MmMtMS44MzYtLjA5OC0xLjkwNCAyLjE5IDIuMzU5IDIuMjY0IDMuNzM5LjE1IDUuNDUxLS4wNDQgNS40NTEtLjA0NFwiLFxuICAgIHN0cm9rZTogXCIjREI4MzZFXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wNTFcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDUuMTYgMTM1Ljg3N2MtMS44NSAxLjM0Ni41NjEgMi4zNTUuNTYxIDIuMzU1czMuNDc4Ljg5OCA2LjczLjYxN1wiLFxuICAgIHN0cm9rZTogXCIjREI4MzZFXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wNTFcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNTEuODkgMTQxLjcxcy02LjI4LjExMS02LjczLTIuMTMyYy0uMjIzLTEuMzQ2LjQ1LTEuNDAyLjQ1LTEuNDAyTTE0Ni4xMTQgMTQwLjg2OHMtMS4xMDMgMy4xNiA1LjQ0IDMuNTMzTTE1MS4yMDIgMTI5LjkzMnYzLjQ3N001Mi44MzggODkuMjg2YzMuNTMzLS4zMzcgOC40MjMtMS4yNDggMTMuNTgyLTcuNzU0XCIsXG4gICAgc3Ryb2tlOiBcIiNEQjgzNkVcIixcbiAgICBzdHJva2VXaWR0aDogXCIxLjA1MVwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE2OC41NjcgMjQ4LjMxOGE2LjY0NyA2LjY0NyAwIDAgMS02LjY0Ny02LjY0N3YtNjYuNDY2YTYuNjQ3IDYuNjQ3IDAgMSAxIDEzLjI5NCAwdjY2LjQ2NmE2LjY0NyA2LjY0NyAwIDAgMS02LjY0NyA2LjY0N1wiLFxuICAgIGZpbGw6IFwiIzVCQTAyRVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE3Ni41NDMgMjQ3LjY1M2E2LjY0NyA2LjY0NyAwIDAgMS02LjY0Ni02LjY0N3YtMzMuMjMyYTYuNjQ3IDYuNjQ3IDAgMSAxIDEzLjI5MyAwdjMzLjIzMmE2LjY0NyA2LjY0NyAwIDAgMS02LjY0NyA2LjY0N1wiLFxuICAgIGZpbGw6IFwiIzkyQzExMFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE4Ni40NDMgMjkzLjYxM0gxNTguOTJhMy4xODcgMy4xODcgMCAwIDEtMy4xODctMy4xODd2LTQ2LjEzNGEzLjE4NyAzLjE4NyAwIDAgMSAzLjE4Ny0zLjE4N2gyNy41MjRhMy4xODcgMy4xODcgMCAwIDEgMy4xODcgMy4xODd2NDYuMTM0YTMuMTg3IDMuMTg3IDAgMCAxLTMuMTg3IDMuMTg3XCIsXG4gICAgZmlsbDogXCIjRjJEN0FEXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNODguOTc5IDg5LjQ4czcuNzc2IDUuMzg0IDE2LjYgMi44NDJcIixcbiAgICBzdHJva2U6IFwiI0U0RUJGN1wiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMTAxXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSkpKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IE5vRm91bmQ7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBTZXJ2ZXJFcnJvciA9IGZ1bmN0aW9uIFNlcnZlckVycm9yKCkge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiBcIjI1NFwiLFxuICAgIGhlaWdodDogXCIyOTRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0wIC4zMzVoMjUzLjQ5djI1My40OUgwelwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTAgMjkzLjY2NWgyNTMuNDlWLjQwMUgwelwiXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDAgLjA2NylcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcIm1hc2tcIiwge1xuICAgIGZpbGw6IFwiI2ZmZlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTAgMTI4LjEzNHYtMi4xMUMwIDU2LjYwOCA1Ni4yNzMuMzM0IDEyNS42OS4zMzRoMi4xMWM2OS40MTYgMCAxMjUuNjkgNTYuMjc0IDEyNS42OSAxMjUuNjl2Mi4xMWMwIDY5LjQxNy01Ni4yNzQgMTI1LjY5LTEyNS42OSAxMjUuNjloLTIuMTFDNTYuMjczIDI1My44MjQgMCAxOTcuNTUxIDAgMTI4LjEzNFwiLFxuICAgIGZpbGw6IFwiI0U0RUJGN1wiLFxuICAgIG1hc2s6IFwidXJsKCNiKVwiXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zOS45ODkgMTMyLjEwOGE4LjMzMiA4LjMzMiAwIDEgMS0xNi41ODEtMS42NzEgOC4zMzIgOC4zMzIgMCAwIDEgMTYuNTggMS42NzFcIixcbiAgICBmaWxsOiBcIiNGRkZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zNy4xOSAxMzUuNTlsMTAuNTUzIDUuOTgzTTQ4LjY2NSAxNDcuODg0bC0xMi43MzQgMTAuODYxXCIsXG4gICAgc3Ryb2tlOiBcIiNGRkZcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNDAuMTEgMTYwLjgxNmE1LjcwNiA1LjcwNiAwIDEgMS0xMS4zNTQtMS4xNDUgNS43MDYgNS43MDYgMCAwIDEgMTEuMzU0IDEuMTQ1TTU3Ljk0MyAxNDQuNmE1Ljc0NyA1Ljc0NyAwIDEgMS0xMS40MzYtMS4xNTIgNS43NDcgNS43NDcgMCAwIDEgMTEuNDM2IDEuMTUzTTk5LjY1NiAyNy40MzRsMzAuMDI0LS4wMTNhNC42MTkgNC42MTkgMCAxIDAtLjAwNC05LjIzOGwtMzAuMDI0LjAxM2E0LjYyIDQuNjIgMCAwIDAgLjAwNCA5LjIzOE0xMTEuMTQgNDUuODk2bDMwLjAyMy0uMDEzYTQuNjIgNC42MiAwIDEgMC0uMDA0LTkuMjM4bC0zMC4wMjQuMDEzYTQuNjE5IDQuNjE5IDAgMSAwIC4wMDQgOS4yMzhcIixcbiAgICBmaWxsOiBcIiNGRkZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMTMuNTMgMjcuNDIxdi0uMDAybDE1Ljg5LS4wMDdhNC42MTkgNC42MTkgMCAxIDAgLjAwNSA5LjIzOGwtMTUuODkyLjAwN3YtLjAwMmE0LjYxOCA0LjYxOCAwIDAgMC0uMDA0LTkuMjM0TTE1MC4xNjcgNzAuMDkxaC0zLjk3OWE0Ljc4OSA0Ljc4OSAwIDAgMS00Ljc3NC00Ljc3NSA0Ljc4OCA0Ljc4OCAwIDAgMSA0Ljc3NC00Ljc3NGgzLjk3OWE0Ljc4OSA0Ljc4OSAwIDAgMSA0Ljc3NSA0Ljc3NCA0Ljc4OSA0Ljc4OSAwIDAgMS00Ljc3NSA0Ljc3NVwiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE3MS42ODcgMzAuMjM0YzAtMTYuMzkyIDEzLjI4OS0yOS42OCAyOS42ODEtMjkuNjggMTYuMzkyIDAgMjkuNjggMTMuMjg4IDI5LjY4IDI5LjY4IDAgMTYuMzkzLTEzLjI4OCAyOS42ODEtMjkuNjggMjkuNjgxcy0yOS42OC0xMy4yODgtMjkuNjgtMjkuNjhcIixcbiAgICBmaWxsOiBcIiNGRjYwM0JcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yMDMuNTU3IDE5LjQzNWwtLjY3NiAxNS4wMzVhMS41MTQgMS41MTQgMCAwIDEtMy4wMjYgMGwtLjY3NS0xNS4wMzVhMi4xOSAyLjE5IDAgMSAxIDQuMzc3IDBtLS4yNjQgMTkuMzc4Yy41MTMuNDc3Ljc3IDEuMS43NyAxLjg3cy0uMjU3IDEuMzkzLS43NyAxLjkwN2MtLjU1LjQ3Ni0xLjIxLjczMy0xLjk0My43MzNhMi41NDUgMi41NDUgMCAwIDEtMS44Ny0uNzdjLS41NS0uNTE0LS44MDYtMS4xMzYtLjgwNi0xLjg3IDAtLjc3LjI1Ni0xLjM5My44MDYtMS44Ny41MTMtLjUxMyAxLjEzNy0uNzMzIDEuODctLjczMy43NyAwIDEuNDMuMjIgMS45NDMuNzMzXCIsXG4gICAgZmlsbDogXCIjRkZGXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTE5LjMgMTMzLjI3NWM0LjQyNi0uNTk4IDMuNjEyLTEuMjA0IDQuMDc5LTQuNzc4LjY3NS01LjE4LTMuMTA4LTE2LjkzNS04LjI2Mi0yNS4xMTgtMS4wODgtMTAuNzItMTIuNTk4LTExLjI0LTEyLjU5OC0xMS4yNHM0LjMxMiA0Ljg5NSA0LjE5NiAxNi4xOTljMS4zOTggNS4yNDMuODA0IDE0LjQ1LjgwNCAxNC40NXM1LjI1NSAxMS4zNjkgMTEuNzggMTAuNDg3XCIsXG4gICAgZmlsbDogXCIjRkZCNTk0XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAwLjk0NCA5MS42MXMxLjQ2My0uNTgzIDMuMjExLjU4MmM4LjA4IDEuMzk4IDEwLjM2OCA2LjcwNiAxMS4zIDExLjM2OCAxLjg2NCAxLjI4MiAxLjg2NCAyLjMzIDEuODY0IDMuNDk2LjM2NS43NzcgMS41MTUgMy4wMyAxLjUxNSAzLjAzcy03LjIyNSAxLjc0OC0xMC45NTQgNi43NThjLTEuMzk5LTYuNDEtNi45MzYtMjUuMjM1LTYuOTM2LTI1LjIzNVwiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTk0LjAwOCA5MC41bDEuMDE5LTUuODE1LTkuMjMtMTEuODc0LTUuMjMzIDUuNTgxLTIuNTkzIDkuODYzczguMzkgNS4xMjggMTYuMDM3IDIuMjQ2XCIsXG4gICAgZmlsbDogXCIjRkZCNTk0XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNODIuOTMxIDc4LjIxNnMtNC41NTctMi44NjgtMi40NDUtNi44OTJjMS42MzItMy4xMDcgNC41MzcgMS4xMzkgNC41MzcgMS4xMzlzLjUyNC0zLjY2MiAzLjEzOS0zLjY2MmMuNTIzLTEuMDQ2IDEuNTY5LTQuMTg0IDEuNTY5LTQuMTg0czExLjUwNyAyLjYxNSAxMy42IDMuMTM4Yy0uMDAxIDUuMjMtMi4zMTcgMTkuNTI5LTcuODg0IDE5Ljk2OS04Ljk0LjcwNi0xMi41MTYtOS41MDgtMTIuNTE2LTkuNTA4XCIsXG4gICAgZmlsbDogXCIjRkZDNkEwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAyLjk3MSA3Mi4yNDNjMi42MTYtMi4wOTMgMy40ODktOS43NzUgMy40ODktOS43NzVzLTIuNDkyLS40OTItNi42NzYtMi4wNjJjLTQuNzA4LTIuMDkyLTEyLjg2Ny00Ljc3MS0xNy41NzUuOTgyLTkuNTQgNC40MS0yLjA2MiAxOS45My0yLjA2MiAxOS45M2wyLjcyOS0zLjAzN3MtMy45NTYtMy4zMDQtMi4wOTItNi4yNzdjMi4xODMtMy40OCAzLjk0MyAxLjA4IDMuOTQzIDEuMDhzLjY0LTIuNCAzLjYtMy4zNmMuMzU2LS43MTQgMS4wNC0yLjY5IDEuNDQtMy44NzJhMS4wOCAxLjA4IDAgMCAxIDEuMjctLjcwN2MyLjQxLjU2IDguNzIzIDIuMDMgMTEuNDE3IDIuNjc2LjUyNC4xMjYuODc2LjYxOS44MjUgMS4xNTZsLS4zMDggMy4yNjZ6XCIsXG4gICAgZmlsbDogXCIjNTIwMDM4XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAxLjIyIDc2LjUxNGMtLjEwNC42MTMtLjU4NSAxLjA0NC0xLjA3Ni45Ni0uNDktLjA4Mi0uODA1LS42NDYtLjcwMi0xLjI2LjEwNC0uNjEzLjU4NS0xLjA0NCAxLjA3Ni0uOTYxLjQ5MS4wODMuODA1LjY0Ny43MDIgMS4yNk05NC4yNiA3NS4wNzRjLS4xMDQuNjEzLS41ODUgMS4wNDQtMS4wNzYuOTYtLjQ5LS4wODItLjgwNS0uNjQ2LS43MDItMS4yNi4xMDQtLjYxMy41ODUtMS4wNDQgMS4wNzYtLjk2LjQ5MS4wODIuODA1LjY0Ni43MDIgMS4yNlwiLFxuICAgIGZpbGw6IFwiIzU1Mjk1MFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIHN0cm9rZTogXCIjREI4MzZFXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wNjNcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIixcbiAgICBkOiBcIk05OS4yMDYgNzMuNjQ0bC0uOSAxLjYyLS4zIDQuMzhoLTIuMjRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05OS45MjYgNzMuMjg0czEuOC0uNzIgMi41Mi41NFwiLFxuICAgIHN0cm9rZTogXCIjNUMyNTUyXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4xMTdcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04MS4zNjcgNzMuMDg0cy40OC0xLjEyIDEuMTItLjcyYy42NC40IDEuMjggMS40NC41NiAycy4xNiAxLjY4LjE2IDEuNjhcIixcbiAgICBzdHJva2U6IFwiI0RCODM2RVwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMTE3XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTIuMzI2IDcxLjcyNHMxLjg0IDEuMTIgNC4xNi45NlwiLFxuICAgIHN0cm9rZTogXCIjNUMyNTUyXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4xMTdcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05Mi43MjYgODAuNjA0czIuMjQgMS4yIDQuNCAxLjJNOTMuNjg2IDgzLjE2NHMuOTYuNCAxLjUyLjMyTTgzLjY4NyA4MC4wNDRzMS43ODYgNi41NDcgOS4yNjIgNy45NTRcIixcbiAgICBzdHJva2U6IFwiI0RCODM2RVwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMDYzXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTUuNTQ4IDkxLjY2M3MtMS4wNjggMi44MjEtOC4yOTggMi4xMDVjLTcuMjMtLjcxNy0xMC4yOS01LjA0NC0xMC4yOS01LjA0NFwiLFxuICAgIHN0cm9rZTogXCIjRTRFQkY3XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4xMzZcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03OC4xMjYgODcuNDc4czYuNTI2IDQuOTcyIDE2LjQ3IDIuNDg2YzAgMCA5LjU3NyAxLjAyIDExLjUzNiA1LjMyMiA1LjM2IDExLjc3LjU0MyAzNi44MzUgMCAzOS45NjIgMy40OTYgNC4wNTUtLjQ2NiA4LjQ4My0uNDY2IDguNDgzLTE1LjYyNC0zLjU0OC0zNS44MS0uNi0zNS44MS0uNi00Ljg0OS0zLjU0Ni0xLjIyMy05LjA0NC0xLjIyMy05LjA0NEw2Mi4zOCAxMTAuMzJjLTIuNDg1LTE1LjIyNy44MzMtMTkuODAzIDMuNTQ5LTIwLjc0MyAzLjAzLTEuMDQ5IDguMDQtMS4yODIgOC4wNC0xLjI4Mi40OTYtLjA1OCAxLjA4LS4wNzYgMS4zNy0uMjMzIDIuMzYtMS4yODIgMi43ODctLjU4MyAyLjc4Ny0uNTgzXCIsXG4gICAgZmlsbDogXCIjRkZGXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjUuODI4IDg5Ljgxcy02Ljg3NS40NjUtNy41OSA4LjE1NmMtLjQ2NiA4Ljg1NyAzLjAzIDEwLjk1NCAzLjAzIDEwLjk1NHM2LjA3NSAyMi4xMDIgMTYuNzk2IDIyLjk1N2M4LjM5LTIuMTc2IDQuNzU4LTYuNzAyIDQuNjYxLTExLjQyLS4yMzMtMTEuMzA0LTcuMTA4LTE2Ljg5Ny03LjEwOC0xNi44OTdzLTQuMjEyLTEzLjc1LTkuNzg5LTEzLjc1XCIsXG4gICAgZmlsbDogXCIjRkZDNkEwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzEuNzE2IDEyNC4yMjVzLjg1NSAxMS4yNjQgOS44MjggNi40ODZjNC43NjUtMi41MzYgNy41ODEtMTMuODI4IDkuNzg5LTIyLjU2OCAxLjQ1Ni01Ljc2OCAyLjU4LTEyLjE5NyAyLjU4LTEyLjE5N2wtNC45NzMtMS43MDlzLTIuNDA4IDUuNTE2LTcuNzY5IDEyLjI3NWMtNC4zMzUgNS40NjctOS4xNDQgMTEuMTEtOS40NTUgMTcuNzEzXCIsXG4gICAgZmlsbDogXCIjRkZDNkEwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA4LjQ2MyAxMDUuMTkxczEuNzQ3IDIuNzI0LTIuMzMxIDMwLjUzNWMyLjM3NiAyLjIxNiAxLjA1MyA2LjAxMi0uMjMzIDcuNTFcIixcbiAgICBzdHJva2U6IFwiI0U0RUJGN1wiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMDg1XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTIzLjI2MiAxMzEuNTI3cy0uNDI3IDIuNzMyLTExLjc3IDEuOTgxYy0xNS4xODctMS4wMDYtMjUuMzI2LTMuMjUtMjUuMzI2LTMuMjVsLjkzMy01LjhzLjcyMy4yMTUgOS43MS0uMDY4YzExLjg4Ny0uMzczIDE4LjcxNC02LjA3IDI0Ljk2NC0xLjAyMiA0LjAzOSAzLjI2MyAxLjQ4OSA4LjE2IDEuNDg5IDguMTZcIixcbiAgICBmaWxsOiBcIiNGRkM2QTBcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03MC4yNCA5MC45NzRzLTUuNTkzLTQuNzM5LTExLjA1NCAyLjY4Yy0zLjMxOCA3LjIyMy41MTcgMTUuMjg0IDIuNjY0IDE5LjU3OC0uMzEgMy43MjkgMi4zMyA0LjMxMSAyLjMzIDQuMzExcy4xMDguODk1IDEuNTE2IDIuNjhjNC4wNzgtNy4wMyA2LjcyLTkuMTY2IDEzLjcxMS0xMi41NDYtLjMyOC0uNjU2LTEuODc3LTMuMjY1LTEuODI1LTMuNzY3LjE3NS0xLjY5LTEuMjgyLTIuNjIzLTEuMjgyLTIuNjIzcy0uMjg2LS4xNTYtMS4xNjUtMi43MzhjLS43ODgtMi4zMTMtMi4wMzYtNS4xNzctNC44OTUtNy41NzVcIixcbiAgICBmaWxsOiBcIiNGRkZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05MC4yMzIgMjg4LjAyN3M0Ljg1NSAyLjMwOCA4LjMxMyAxLjE1NWMzLjE4OC0xLjA2MyA1LjEyLjc1NSA4LjAwMiAxLjMzMSAyLjg4MS41NzcgNy43NjkgMS4yNDMgMTMuMjA3LTEuNDI0LS4xMTctNi4yMjgtNy43ODYtNC40OTktMTMuNTE4LTcuNTg4LTIuODk1LTEuNTYtNC4yNzYtNS4zMzYtNC4wNjYtOS45NDRIOTEuNTQ0cy0xLjU3MyAxMS44OS0xLjMxMiAxNi40N1wiLFxuICAgIGZpbGw6IFwiI0NCRDFEMVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTkwLjIwNyAyODcuODMzczIuNzQ1IDEuNDM3IDcuNjM5LjczOGMzLjQ1Ni0uNDk0IDMuMjIzLjY2IDcuNDE4IDEuMjgyIDQuMTk1LjYyMSAxMy4wOTItLjE5NCAxNC4zMzQtMS4xMjYuNDY2IDEuMjQyLS4zODggMi4zMy0uMzg4IDIuMzNzLTEuNzA5LjY4Mi01LjQzOC45MzJjLTIuMjk1LjE1NC04LjA5OC4yNzYtMTAuMTQtLjYyMS0yLjAyLTEuNTU0LTQuODk0LTEuNTE1LTYuMDYtLjIzNC00LjQyNyAxLjA3NS03LjE4NC0uMzEtNy4xODQtLjMxbC0uMTgxLTIuOTkxelwiLFxuICAgIGZpbGw6IFwiIzJCMDg0OVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTk4LjQyOSAyNzIuMjU3aDMuNDk2cy0uMTE3IDcuNTc0IDUuMTI3IDkuNjcxYy01LjI0NC43LTkuNjcyLTIuNjAyLTguNjIzLTkuNjcxXCIsXG4gICAgZmlsbDogXCIjQTRBQUJBXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNDQuNDI1IDI3Mi4wNDZzLTIuMjA4IDcuNzc0LTQuNzAyIDEyLjg5OWMtMS44ODQgMy44NzQtNC40MjggNy44NTQgNS43MjkgNy44NTQgNi45NyAwIDkuMzg1LS41MDMgNy43ODItNi45MTctMS42MDQtNi40MTUuMjc5LTEzLjgzNi4yNzktMTMuODM2aC05LjA4OHpcIixcbiAgICBmaWxsOiBcIiNDQkQxRDFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zOC4wNjYgMjkwLjI3N3MyLjE5OCAxLjIyNSA2Ljk1NCAxLjIyNWM2LjM3NiAwIDguNjQ2LTEuNzMgOC42NDYtMS43M3MuNjMgMS4xNjgtLjY0OSAyLjI3Yy0xLjA0Ljg5Ny0zLjc3IDEuNjY4LTcuNzQ1IDEuNjIxLTQuMzQ3LS4wNS02LjExNS0uNTkzLTcuMDYyLTEuMjI0LS44NjQtLjU3Ny0uNzItMS42NTctLjE0NC0yLjE2MlwiLFxuICAgIGZpbGw6IFwiIzJCMDg0OVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQ1LjM0NCAyNzQuMDQxcy4wMzUgMS41OTItLjMyOSAzLjA3Yy0uMzY1IDEuNDktMS4xMyAzLjI1NS0xLjE4NCA0LjM0LS4wNjEgMS4yMDYgNC43NTUgMS42NTcgNS40MDMuMDM2LjY1LTEuNjIyIDEuMzU3LTYuNzM3IDIuMDA2LTcuNjAyLjY0OC0uODY1LTUuMTQtMi4yMjItNS44OTYuMTU2XCIsXG4gICAgZmlsbDogXCIjQTRBQUJBXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNODkuNDc2IDI3Ny41N2wxMy44OTkuMDk1czEuMzQ5LTU2LjY0MyAxLjkyNS02Ni45MDljLjU3Ni0xMC4yNjcgMy45MjMtNDUuMDUyIDEuMDQyLTY1LjU4NWwtMTMuMDM3LS42NjktMjMuNzM3Ljgxcy0uNDUyIDQuMTItMS4yNDMgMTAuMzY1Yy0uMDY1LjUxNS0uNzA4Ljg3NC0uNzc3IDEuNDE3LS4wNzguNjA4LjQzOSAxLjQwNy4zMzIgMi4wNDQtMi40NTUgMTQuNjI3LTUuNzk3IDMyLjczNi04LjI1NiA0Ni44MzctLjEyMS42OTMtMS4yODIgMS4wNDgtMS41MTUgMi43OTYtLjA0Mi4zMTQuMjIgMS41ODQuMTE2IDEuODY1LTcuMTQgMTkuNDczLTEyLjIwMiA1Mi42MDEtMTUuNjYgNjcuMTlsMTUuMTc2LS4wMTVzMi4yODItMTAuMTQ1IDQuMTg1LTE4Ljg3MWMyLjkyMi0xMy4zODkgMjQuMDEyLTg4LjMyIDI0LjAxMi04OC4zMmwzLjEzMy0uOTU0LS4xNTggNDguNTY4cy0uMjMzIDEuMjgyLjM1IDIuMDk4Yy41ODMuODE1LS41ODEgMS4xNjctLjQwOCAyLjMzMWwuNDA4IDEuODY0cy0uNDY2IDcuNDU4LS45MzIgMTIuMzUyYy0uNDY3IDQuODk1IDEuMTQ1IDQwLjY5IDEuMTQ1IDQwLjY5XCIsXG4gICAgZmlsbDogXCIjN0JCMkY5XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjQuNTcgMjE4Ljg4MWMxLjE5Ny4wOTkgNC4xOTUtMi4wOTcgNy4yMjUtNS4xMjdNOTYuMDI0IDIyMi41MzRzMi44ODEtMS4xNTIgNi4zNC00LjAzNFwiLFxuICAgIHN0cm9rZTogXCIjNjQ4QkQ4XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wODVcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05Ni45NzMgMjE5LjM3M3MyLjg4Mi0xLjE1MyA2LjM0LTQuMDM0XCIsXG4gICAgc3Ryb2tlOiBcIiM2NDhCRDhcIixcbiAgICBzdHJva2VXaWR0aDogXCIxLjAzMlwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTYzLjE3MiAyMjIuMTQ0czIuNzI0LS42MTQgNi43NTktMy40OTZNNzQuOTAzIDE0Ni4xNjZjLS4yODEgMy4yMjYuMzEgOC44NTYtNC41MDYgOS40NzhNOTMuMTgyIDE0NC4zNDRzLjExNSAxNC41NTctMS4zNDQgMTUuNjVjLTIuMzA1IDEuNzMtMy4xMDcgMi4wMi0zLjEwNyAyLjAyTTg5LjE5NyAxNDQuOTIzcy4yNjkgMTMuMTQ0LTEuMDEgMjUuMDg4TTgzLjUyNSAxNzAuNzFzNi44MS0xLjA1MSA5LjExNi0xLjA1MU00Ni4wMjYgMjcwLjA0NWwtLjg5MiA0LjUzOE00Ni45MzcgMjYzLjI4OWwtLjgxNSA0LjE1N002Mi43MjUgMjAyLjUwM2MtLjMzIDEuNjE4LS4xMDIgMS45MDQtLjQ0OSAzLjQzOCAwIDAtMi43NTYgMS45MDMtMi4yOSAzLjkyMy40NjYgMi4wMi0uMzEgMy40MjQtNC41MDUgMTcuMjUyLTEuNzYyIDUuODA3LTQuMjMzIDE4LjkyMi02LjE2NSAyOC4yNzgtLjAzLjE0NC0uNTIxIDIuNjQ2LTEuMTQgNS44TTY0LjE1OCAxOTQuMTM2Yy0uMjk1IDEuNjU4LS42IDMuMzEtLjkxNyA0LjkzOE03MS4zMyAxNDYuNzg3bC0xLjI0NCAxMC44NzdzLTEuMTQuMTU1LS41MTkgMi4zM2MuMTE3IDEuMzk5LTIuNzc4IDE2LjM5LTUuMzgyIDMxLjYxNU00NC4yNDIgMjczLjcyN0g1OC4wN1wiLFxuICAgIHN0cm9rZTogXCIjNjQ4QkQ4XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wODVcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDYuMTggMTQyLjExN2MtMy4wMjgtLjQ4OS0xOC44MjUtMi43NDQtMzYuMjE5LjJhLjYyNS42MjUgMCAwIDAtLjUxOC42NDRjLjA2MyAxLjMwNy4wNDQgMi4zNDMuMDE1IDIuOTk1YS42MTcuNjE3IDAgMCAwIC43MTYuNjM2YzMuMzAzLS41MzQgMTcuMDM3LTIuNDEyIDM1LjY2NC0uMjY2LjM0Ny4wNC42Ni0uMjE0LjY5Mi0uNTYuMTI0LTEuMzQ3LjE2LTIuNDI1LjE3LTMuMDI5YS42MTYuNjE2IDAgMCAwLS41Mi0uNjJcIixcbiAgICBmaWxsOiBcIiMxOTIwNjRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05Ni4zOTggMTQ1LjI2NGwuMDAzLTUuMTAyYS44NDMuODQzIDAgMCAwLS44MDktLjg0NyAxMTQuMTA0IDExNC4xMDQgMCAwIDAtOC4xNDEtLjAxNC44NS44NSAwIDAgMC0uODIuODQ3bC0uMDAzIDUuMDk3YzAgLjQ3Ni4zODguODU3Ljg2NC44NDUgMi40NzgtLjA2NCA1LjE2Ni0uMDY3IDguMDMuMDE3YS44NDguODQ4IDAgMCAwIC44NzYtLjg0M1wiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTk1LjIzOSAxNDQuMjk2bC4wMDItMy4xOTVhLjY2Ny42NjcgMCAwIDAtLjY0My0uNjcyYy0xLjktLjA2MS0zLjk0MS0uMDczLTYuMDk0LS4wMWEuNjc1LjY3NSAwIDAgMC0uNjU0LjY3MmwtLjAwMiAzLjE5MmMwIC4zNzYuMzA1LjY3Ny42OC42NjkgMS44NTktLjA0MiAzLjg3NC0uMDQzIDYuMDIuMDEyLjM3Ni4wMS42OS0uMjkxLjY5MS0uNjY4XCIsXG4gICAgZmlsbDogXCIjMTkyMDY0XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTAuMTAyIDI3My41MjJoMTIuODE5TTkxLjIxNiAyNjkuNzYxYy4wMDYgMy41MTktLjA3MiA1LjU1IDAgNi4yOTJNOTAuOTIzIDI2My40NzRjLS4wMDkgMS41OTktLjAxNiAyLjU1OC0uMDE2IDQuNTA1TTkwLjQ0IDE3MC40MDRsLjkzMiA0Ni4zOHMuNyAxLjYzMS0uMjMzIDIuNzk2Yy0uOTMyIDEuMTY2IDIuNTY0LjcuOTMyIDIuMzMtMS42MyAxLjYzMy45MzMgMS4xNjYgMCAzLjQ5Ny0uNjE4IDEuNTQ2LTEuMDMxIDIxLjkyMS0xLjEzOCAzNi41MTNcIixcbiAgICBzdHJva2U6IFwiIzY0OEJEOFwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMDg1XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzMuNzM2IDk4LjY2NWwyLjIxNCA0LjMxMnMyLjA5OC44MTYgMS44NjUgMi42OGwuODE2IDIuMjE0TTY0LjI5NyAxMTYuNjExYy4yMzMtLjkzMiAyLjE3Ni03LjE0NyAxMi41ODUtMTAuNDg4TTc3LjU5OCA5MC4wNDJzNy42OTEgNi4xMzcgMTYuNTQ3IDIuNzJcIixcbiAgICBzdHJva2U6IFwiI0U0RUJGN1wiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMDg1XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTEuOTc0IDg2Ljk1NHM1LjQ3Ni0uODE2IDcuNTc0LTQuNTQ1YzEuMjk3LS4zNDUuNzIgMi4yMTItLjMzIDMuNjcxLS43Ljk3MS0xLjAxIDEuNTU0LTEuMDEgMS41NTRzLjE5NC4zMS4xNTUuODE2Yy0uMDUzLjY5Ny0uMTc1LjY1My0uMjcyIDEuMDQ4LS4wODEuMzM1LjEwOC42NTcgMCAxLjA0OS0uMDQ2LjE3LS4xOTguNS0uMzgyLjg3OC0uMTIuMjQ5LS4wNzIuNjg3LS4yLjk0OC0uMjMxLjQ2OS0xLjU2MiAxLjg3LTIuNjIyIDIuODU1LTMuODI2IDMuNTU0LTUuMDE4IDEuNjQ0LTYuMDAxLS40MDgtLjg5NC0xLjg2NS0uNjYxLTUuMTI3LS44NzQtNi44NzUtLjM1LTIuOTE0LTIuNjIyLTMuMDMtMS45MjMtNC40MjkuMzQzLS42ODUgMi44Ny42OSAzLjI2MyAxLjc0OC43NTcgMi4wNCAyLjk1MiAxLjgwNyAyLjYyMiAxLjY5XCIsXG4gICAgZmlsbDogXCIjRkZDNkEwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTkuOCA4Mi40MjljLS40NjUuMDc3LS4zNS4yNzItLjk3IDEuMjQzLS42MjIuOTcxLTQuODE3IDIuOTMyLTYuMzkgMy4yMjQtMi41ODkuNDgtMi4yNzgtMS41Ni00LjI1NC0yLjg1NS0xLjY5LTEuMTA3LTMuNTYyLS42MzgtMS4zOTggMS4zOTguOTkuOTMyLjkzMiAxLjEwNyAxLjM5OCAzLjIwNS4zMzUgMS41MDYtLjY0IDMuNjcuNyA1LjU5M1wiLFxuICAgIHN0cm9rZTogXCIjREI4MzZFXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiLjc3NFwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTc5LjU0MyAxMDguNjczYy0yLjEgMi45MjYtNC4yNjYgNi4xNzUtNS41NTcgOC43NjJcIixcbiAgICBzdHJva2U6IFwiI0U1OTc4OFwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIi43NzRcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04Ny43MiAxMjQuNzY4cy0yLjA5OC0xLjk0Mi01LjEyNy0yLjcxOWMtMy4wMy0uNzc3LTMuNTc0LS4xNTUtNS41MTYuMDc4LTEuOTQyLjIzMy0zLjg4NS0uOTMyLTMuNjUyLjcuMjMzIDEuNjMgNS4wNSAxLjAxIDUuMjA2IDIuMDk3LjE1NSAxLjA4Ny02LjM3IDIuNzk2LTguMzEzIDIuMTc1LS43NzcuNzc3LjQ2NiAxLjg2NCAyLjAyIDIuMTc1LjIzMyAxLjU1NCAyLjI1MyAxLjU1NCAyLjI1MyAxLjU1NHMuNjk5IDEuMDEgMi42NDEgMS4wODhjMi40ODYgMS4zMiA4LjkzNC0uNyAxMC45NTQtMS41NTQgMi4wMi0uODU1LS40NjYtNS41OTQtLjQ2Ni01LjU5NFwiLFxuICAgIGZpbGw6IFwiI0ZGQzZBMFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTczLjQyNSAxMjIuODI2cy42NiAxLjEyNyAzLjE2NyAxLjQxOGMyLjMxNS4yNyAyLjU2My41ODMgMi41NjMuNTgzcy0yLjU0NSAyLjg5NC05LjA3IDIuMjcyTTcyLjQxNiAxMjkuMjc0czMuODI2LjA5NyA0LjkzMy0uNzE4TTc0Ljk4IDEzMC43NXMxLjk2MS4xMzYgMy4zNi0uNTA1TTc3LjIzMiAxMzEuOTE2czEuNzQ4LjAxOSAyLjkxNC0uNTA1TTczLjMyOCAxMjIuMzIxcy0uNTk1LTEuMDMyIDEuMjYyLS40MjdjMS42NzEuNTQ0IDIuODMzLjA1NSA1LjEyOC4xNTUgMS4zODkuMDYxIDMuMDY3LS4yOTcgMy45ODIuMTUgMS42MDYuNzg0IDMuNjMyIDIuMTgxIDMuNjMyIDIuMTgxczEwLjUyNiAxLjIwNCAxOS4wMzMtMS4xMjdNNzguODY0IDEwOC4xMDRzLTguMzkgMi43NTgtMTMuMTY4IDEyLjEyXCIsXG4gICAgc3Ryb2tlOiBcIiNFNTk3ODhcIixcbiAgICBzdHJva2VXaWR0aDogXCIuNzc0XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA5LjI3OCAxMTIuNTMzczMuMzgtMy42MTMgNy41NzUtNC42NjJcIixcbiAgICBzdHJva2U6IFwiI0U0RUJGN1wiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMDg1XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA3LjM3NSAxMjMuMDA2czkuNjk3LTIuNzQ1IDExLjQ0NS0uODhcIixcbiAgICBzdHJva2U6IFwiI0U1OTc4OFwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIi43NzRcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xOTQuNjA1IDgzLjY1NmwzLjk3MS0zLjg4Nk0xODcuMTY2IDkwLjkzM2wzLjczNi0zLjY1NU0xOTEuNzUyIDg0LjIwN2wtNC40NjItNC41Nk0xOTguNDUzIDkxLjA1N2wtNC4xMzMtNC4yMjVNMTI5LjI1NiAxNjMuMDc0bDMuNzE4LTMuNzE4TTEyMi4yOTEgMTcwLjAzOWwzLjQ5OC0zLjQ5OE0xMjYuNTYxIDE2My42MjZsLTQuMjctNC4yN00xMzIuOTc1IDE3MC4wMzlsLTMuOTU1LTMuOTU1XCIsXG4gICAgc3Ryb2tlOiBcIiNCRkNERERcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTkwLjE1NiAyMTEuNzc5aC0xLjYwNGE0LjAyMyA0LjAyMyAwIDAgMS00LjAxMS00LjAxMVYxNzUuNjhhNC4wMjMgNC4wMjMgMCAwIDEgNC4wMS00LjAxaDEuNjA1YTQuMDIzIDQuMDIzIDAgMCAxIDQuMDExIDQuMDF2MzIuMDg4YTQuMDIzIDQuMDIzIDAgMCAxLTQuMDEgNC4wMVwiLFxuICAgIGZpbGw6IFwiI0EzQjRDNlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTIzNy44MjQgMjEyLjk3N2E0LjgxMyA0LjgxMyAwIDAgMS00LjgxMyA0LjgxM2gtODYuNjM2YTQuODEzIDQuODEzIDAgMCAxIDAtOS42MjZoODYuNjM2YTQuODEzIDQuODEzIDAgMCAxIDQuODEzIDQuODEzXCIsXG4gICAgZmlsbDogXCIjQTNCNEM2XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibWFza1wiLCB7XG4gICAgZmlsbDogXCIjZmZmXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCIjQTNCNEM2XCIsXG4gICAgbWFzazogXCJ1cmwoI2QpXCIsXG4gICAgZDogXCJNMTU0LjA5OCAxOTAuMDk2aDcwLjUxM3YtODQuNjE3aC03MC41MTN6XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjI0LjkyOCAxOTAuMDk2SDE1My43OGEzLjIxOSAzLjIxOSAwIDAgMS0zLjIwOC0zLjIwOVYxNjcuOTJhMy4yMTkgMy4yMTkgMCAwIDEgMy4yMDgtMy4yMWg3MS4xNDhhMy4yMTkgMy4yMTkgMCAwIDEgMy4yMDkgMy4yMXYxOC45NjdhMy4yMTkgMy4yMTkgMCAwIDEtMy4yMSAzLjIwOU0yMjQuOTI4IDEzMC44MzJIMTUzLjc4YTMuMjE4IDMuMjE4IDAgMCAxLTMuMjA4LTMuMjA4di0xOC45NjhhMy4yMTkgMy4yMTkgMCAwIDEgMy4yMDgtMy4yMDloNzEuMTQ4YTMuMjE5IDMuMjE5IDAgMCAxIDMuMjA5IDMuMjF2MTguOTY3YTMuMjE4IDMuMjE4IDAgMCAxLTMuMjEgMy4yMDhcIixcbiAgICBmaWxsOiBcIiNCRkNERERcIixcbiAgICBtYXNrOiBcInVybCgjZClcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNTkuNTYzIDEyMC41NDZhMi40MDcgMi40MDcgMCAxIDEgMC00LjgxMyAyLjQwNyAyLjQwNyAwIDAgMSAwIDQuODEzTTE2Ni45OCAxMjAuNTQ2YTIuNDA3IDIuNDA3IDAgMSAxIDAtNC44MTMgMi40MDcgMi40MDcgMCAwIDEgMCA0LjgxM00xNzQuMzk3IDEyMC41NDZhMi40MDcgMi40MDcgMCAxIDEgMC00LjgxMyAyLjQwNyAyLjQwNyAwIDAgMSAwIDQuODEzTTIyMi41MzkgMTIwLjU0NmgtMjIuNDYxYS44MDIuODAyIDAgMCAxLS44MDItLjgwMnYtMy4yMDhjMC0uNDQzLjM1OS0uODAzLjgwMi0uODAzaDIyLjQ2Yy40NDQgMCAuODAzLjM2LjgwMy44MDN2My4yMDhjMCAuNDQzLS4zNi44MDItLjgwMi44MDJcIixcbiAgICBmaWxsOiBcIiNGRkZcIixcbiAgICBtYXNrOiBcInVybCgjZClcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yMjQuOTI4IDE2MC40NjRIMTUzLjc4YTMuMjE4IDMuMjE4IDAgMCAxLTMuMjA4LTMuMjA5di0xOC45NjdhMy4yMTkgMy4yMTkgMCAwIDEgMy4yMDgtMy4yMDloNzEuMTQ4YTMuMjE5IDMuMjE5IDAgMCAxIDMuMjA5IDMuMjA5djE4Ljk2N2EzLjIxOCAzLjIxOCAwIDAgMS0zLjIxIDMuMjA5XCIsXG4gICAgZmlsbDogXCIjQkZDREREXCIsXG4gICAgbWFzazogXCJ1cmwoI2QpXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTczLjQ1NSAxMzAuODMyaDQ5LjMwMU0xNjQuOTg0IDEzMC44MzJoNi4wODlNMTU1Ljk1MiAxMzAuODMyaDYuNzVNMTczLjgzNyAxNjAuNjEzaDQ5LjNNMTY1LjM2NSAxNjAuNjEzaDYuMDg5TTE1NS41NyAxNjAuNjEzaDYuNzUxXCIsXG4gICAgc3Ryb2tlOiBcIiM3QzkwQTVcIixcbiAgICBzdHJva2VXaWR0aDogXCIxLjEyNFwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiLFxuICAgIG1hc2s6IFwidXJsKCNkKVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE1OS41NjMgMTUxLjAzOGEyLjQwNyAyLjQwNyAwIDEgMSAwLTQuODE0IDIuNDA3IDIuNDA3IDAgMCAxIDAgNC44MTRNMTY2Ljk4IDE1MS4wMzhhMi40MDcgMi40MDcgMCAxIDEgMC00LjgxNCAyLjQwNyAyLjQwNyAwIDAgMSAwIDQuODE0TTE3NC4zOTcgMTUxLjAzOGEyLjQwNyAyLjQwNyAwIDEgMSAuMDAxLTQuODE0IDIuNDA3IDIuNDA3IDAgMCAxIDAgNC44MTRNMjIyLjUzOSAxNTEuMDM4aC0yMi40NjFhLjgwMi44MDIgMCAwIDEtLjgwMi0uODAydi0zLjIwOWMwLS40NDMuMzU5LS44MDIuODAyLS44MDJoMjIuNDZjLjQ0NCAwIC44MDMuMzYuODAzLjgwMnYzLjIwOWMwIC40NDMtLjM2LjgwMi0uODAyLjgwMk0xNTkuNTYzIDE3OS45ODdhMi40MDcgMi40MDcgMCAxIDEgMC00LjgxMyAyLjQwNyAyLjQwNyAwIDAgMSAwIDQuODEzTTE2Ni45OCAxNzkuOTg3YTIuNDA3IDIuNDA3IDAgMSAxIDAtNC44MTMgMi40MDcgMi40MDcgMCAwIDEgMCA0LjgxM00xNzQuMzk3IDE3OS45ODdhMi40MDcgMi40MDcgMCAxIDEgMC00LjgxMyAyLjQwNyAyLjQwNyAwIDAgMSAwIDQuODEzTTIyMi41MzkgMTc5Ljk4N2gtMjIuNDYxYS44MDIuODAyIDAgMCAxLS44MDItLjgwMnYtMy4yMDljMC0uNDQzLjM1OS0uODAyLjgwMi0uODAyaDIyLjQ2Yy40NDQgMCAuODAzLjM2LjgwMy44MDJ2My4yMDljMCAuNDQzLS4zNi44MDItLjgwMi44MDJcIixcbiAgICBmaWxsOiBcIiNGRkZcIixcbiAgICBtYXNrOiBcInVybCgjZClcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yMDMuMDQgMjIxLjEwOGgtMjcuMzcyYTIuNDEzIDIuNDEzIDAgMCAxLTIuNDA2LTIuNDA3di0xMS40NDhhMi40MTQgMi40MTQgMCAwIDEgMi40MDYtMi40MDdoMjcuMzcyYTIuNDE0IDIuNDE0IDAgMCAxIDIuNDA3IDIuNDA3VjIxOC43YTIuNDEzIDIuNDEzIDAgMCAxLTIuNDA3IDIuNDA3XCIsXG4gICAgZmlsbDogXCIjQkZDREREXCIsXG4gICAgbWFzazogXCJ1cmwoI2QpXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTc3LjI1OSAyMDcuMjE3djExLjUyTTIwMS4wNSAyMDcuMjE3djExLjUyXCIsXG4gICAgc3Ryb2tlOiBcIiNBM0I0QzZcIixcbiAgICBzdHJva2VXaWR0aDogXCIxLjEyNFwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiLFxuICAgIG1hc2s6IFwidXJsKCNkKVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE2Mi44NzMgMjY3Ljg5NGE5LjQyMiA5LjQyMiAwIDAgMS05LjQyMi05LjQyMnYtMTQuODJhOS40MjMgOS40MjMgMCAwIDEgMTguODQ1IDB2MTQuODJhOS40MjMgOS40MjMgMCAwIDEtOS40MjMgOS40MjJcIixcbiAgICBmaWxsOiBcIiM1QkEwMkVcIixcbiAgICBtYXNrOiBcInVybCgjZClcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNzEuMjIgMjY3LjgzYTkuNDIyIDkuNDIyIDAgMCAxLTkuNDIyLTkuNDIzdi0zLjQzOGE5LjQyMyA5LjQyMyAwIDAgMSAxOC44NDUgMHYzLjQzOGE5LjQyMyA5LjQyMyAwIDAgMS05LjQyMiA5LjQyM1wiLFxuICAgIGZpbGw6IFwiIzkyQzExMFwiLFxuICAgIG1hc2s6IFwidXJsKCNkKVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE4MS4zMSAyOTMuNjY2aC0yNy43MTJhMy4yMDkgMy4yMDkgMCAwIDEtMy4yMDktMy4yMVYyNjkuNzlhMy4yMDkgMy4yMDkgMCAwIDEgMy4yMDktMy4yMWgyNy43MTFhMy4yMDkgMy4yMDkgMCAwIDEgMy4yMDkgMy4yMXYyMC42NjhhMy4yMDkgMy4yMDkgMCAwIDEtMy4yMDkgMy4yMDlcIixcbiAgICBmaWxsOiBcIiNGMkQ3QURcIixcbiAgICBtYXNrOiBcInVybCgjZClcIlxuICB9KSkpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gU2VydmVyRXJyb3I7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBVbmF1dGhvcml6ZWQgPSBmdW5jdGlvbiBVbmF1dGhvcml6ZWQoKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiMjUxXCIsXG4gICAgaGVpZ2h0OiBcIjI5NFwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMCAxMjkuMDIzdi0yLjA4NEMwIDU4LjM2NCA1NS41OTEgMi43NzQgMTI0LjE2NSAyLjc3NGgyLjA4NWM2OC41NzQgMCAxMjQuMTY1IDU1LjU5IDEyNC4xNjUgMTI0LjE2NXYyLjA4NGMwIDY4LjU3NS01NS41OSAxMjQuMTY2LTEyNC4xNjUgMTI0LjE2NmgtMi4wODVDNTUuNTkxIDI1My4xODkgMCAxOTcuNTk4IDAgMTI5LjAyM1wiLFxuICAgIGZpbGw6IFwiI0U0RUJGN1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQxLjQxNyAxMzIuOTJhOC4yMzEgOC4yMzEgMCAxIDEtMTYuMzgtMS42NSA4LjIzMSA4LjIzMSAwIDAgMSAxNi4zOCAxLjY1XCIsXG4gICAgZmlsbDogXCIjRkZGXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzguNjUyIDEzNi4zNmwxMC40MjUgNS45MU00OS45ODkgMTQ4LjUwNWwtMTIuNTggMTAuNzNcIixcbiAgICBzdHJva2U6IFwiI0ZGRlwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjJcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00MS41MzYgMTYxLjI4YTUuNjM2IDUuNjM2IDAgMSAxLTExLjIxNi0xLjEzIDUuNjM2IDUuNjM2IDAgMCAxIDExLjIxNiAxLjEzTTU5LjE1NCAxNDUuMjYxYTUuNjc3IDUuNjc3IDAgMSAxLTExLjI5Ny0xLjEzOCA1LjY3NyA1LjY3NyAwIDAgMSAxMS4yOTcgMS4xMzhNMTAwLjM2IDI5LjUxNmwyOS42Ni0uMDEzYTQuNTYyIDQuNTYyIDAgMSAwLS4wMDQtOS4xMjZsLTI5LjY2LjAxM2E0LjU2MyA0LjU2MyAwIDAgMCAuMDA1IDkuMTI2TTExMS43MDUgNDcuNzU0bDI5LjY1OS0uMDEzYTQuNTYzIDQuNTYzIDAgMSAwLS4wMDQtOS4xMjZsLTI5LjY2LjAxM2E0LjU2MyA0LjU2MyAwIDEgMCAuMDA1IDkuMTI2XCIsXG4gICAgZmlsbDogXCIjRkZGXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTE0LjA2NiAyOS41MDNWMjkuNWwxNS42OTgtLjAwN2E0LjU2MyA0LjU2MyAwIDEgMCAuMDA0IDkuMTI2bC0xNS42OTguMDA3di0uMDAyYTQuNTYyIDQuNTYyIDAgMCAwLS4wMDQtOS4xMjJNMTg1LjQwNSAxMzcuNzIzYy0uNTUgNS40NTUtNS40MTggOS40MzItMTAuODczIDguODgyLTUuNDU2LS41NS05LjQzMi01LjQxOC04Ljg4Mi0xMC44NzMuNTUtNS40NTUgNS40MTgtOS40MzIgMTAuODczLTguODgyIDUuNDU1LjU1IDkuNDMyIDUuNDE4IDguODgyIDEwLjg3M1wiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE4MC4xNyAxNDMuNzcybDEyLjU3MiA3LjEyOU0xOTMuODQxIDE1OC40MkwxNzguNjcgMTcxLjM2XCIsXG4gICAgc3Ryb2tlOiBcIiNGRkZcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTg1LjU1IDE3MS45MjZhNi43OTggNi43OTggMCAxIDEtMTMuNTI4LTEuMzYzIDYuNzk4IDYuNzk4IDAgMCAxIDEzLjUyNyAxLjM2M00yMDQuMTIgMTU1LjI4NWE2Ljg0OCA2Ljg0OCAwIDEgMS0xMy42MjctMS4zNzUgNi44NDggNi44NDggMCAwIDEgMTMuNjI2IDEuMzc1XCIsXG4gICAgZmlsbDogXCIjRkZGXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTUyLjk4OCAxOTQuMDc0YTIuMjEgMi4yMSAwIDEgMS00LjQyIDAgMi4yMSAyLjIxIDAgMCAxIDQuNDIgMHpNMjI1LjkzMSAxMTguMjE3YTIuMjEgMi4yMSAwIDEgMS00LjQyMSAwIDIuMjEgMi4yMSAwIDAgMSA0LjQyMSAwek0yMTcuMDkgMTUzLjA1MWEyLjIxIDIuMjEgMCAxIDEtNC40MjEgMCAyLjIxIDIuMjEgMCAwIDEgNC40MiAwek0xNzcuODQgMTA5Ljg0MmEyLjIxIDIuMjEgMCAxIDEtNC40MjIgMCAyLjIxIDIuMjEgMCAwIDEgNC40MjEgMHpNMTk2LjExNCA5NC40NTRhMi4yMSAyLjIxIDAgMSAxLTQuNDIxIDAgMi4yMSAyLjIxIDAgMCAxIDQuNDIxIDB6TTIwMi44NDQgMTgyLjUyM2EyLjIxIDIuMjEgMCAxIDEtNC40MiAwIDIuMjEgMi4yMSAwIDAgMSA0LjQyIDB6XCIsXG4gICAgc3Ryb2tlOiBcIiNGRkZcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgc3Ryb2tlOiBcIiNGRkZcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCIsXG4gICAgZDogXCJNMjE1LjEyNSAxNTUuMjYybC0xLjkwMiAyMC4wNzUtMTAuODcgNS45NThNMTc0LjYwMSAxNzYuNjM2bC02LjMyMiA5Ljc2MUgxNTYuOThsLTQuNDg0IDYuNDQ5TTE3NS44NzQgMTI3LjI4VjExMS41Nk0yMjEuNTEgMTE5LjQwNGwtMTIuNzcgNy44NTktMTUuMjI4LTcuODZWOTYuNjY4XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTgwLjY4IDI5LjMyQzE4MC42OCAxMy4xMjggMTkzLjgwNiAwIDIxMCAwYzE2LjE5MyAwIDI5LjMyIDEzLjEyNyAyOS4zMiAyOS4zMiAwIDE2LjE5NC0xMy4xMjcgMjkuMzIyLTI5LjMyIDI5LjMyMi0xNi4xOTMgMC0yOS4zMi0xMy4xMjgtMjkuMzItMjkuMzIxXCIsXG4gICAgZmlsbDogXCIjQTI2RUY0XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjIxLjQ1IDQxLjcwNmwtMjEuNTYzLS4xMjVhMS43NDQgMS43NDQgMCAwIDEtMS43MzQtMS43NTRsLjA3MS0xMi4yM2ExLjc0NCAxLjc0NCAwIDAgMSAxLjc1NC0xLjczNGwyMS41NjIuMTI1Yy45NjQuMDA2IDEuNzQuNzkxIDEuNzM1IDEuNzU1bC0uMDcxIDEyLjIyOWExLjc0NCAxLjc0NCAwIDAgMS0xLjc1NCAxLjczNFwiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTIxNS4xMDYgMjkuMTkyYy0uMDE1IDIuNTc3LTIuMDQ5IDQuNjU0LTQuNTQzIDQuNjQtMi40OTQtLjAxNC00LjUwNC0yLjExNS00LjQ4OS00LjY5M2wuMDQtNi45MjVjLjAxNi0yLjU3NyAyLjA1LTQuNjU0IDQuNTQzLTQuNjQgMi40OTQuMDE1IDQuNTA0IDIuMTE2IDQuNDkgNC42OTNsLS4wNCA2LjkyNXptLTQuNTMtMTQuMDc0YTYuODc3IDYuODc3IDAgMCAwLTYuOTE2IDYuODM3bC0uMDQzIDcuMzY4YTYuODc3IDYuODc3IDAgMCAwIDEzLjc1NC4wOGwuMDQyLTcuMzY4YTYuODc4IDYuODc4IDAgMCAwLTYuODM3LTYuOTE3ek0xNjcuNTY2IDY4LjM2N2gtMy45M2E0LjczIDQuNzMgMCAwIDEtNC43MTctNC43MTcgNC43MyA0LjczIDAgMCAxIDQuNzE3LTQuNzE3aDMuOTNhNC43MyA0LjczIDAgMCAxIDQuNzE3IDQuNzE3IDQuNzMgNC43MyAwIDAgMS00LjcxNyA0LjcxN1wiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE2OC4yMTQgMjQ4LjgzOGE2LjYxMSA2LjYxMSAwIDAgMS02LjYxLTYuNjExdi02Ni4xMDhhNi42MTEgNi42MTEgMCAwIDEgMTMuMjIxIDB2NjYuMTA4YTYuNjExIDYuNjExIDAgMCAxLTYuNjEgNi42MVwiLFxuICAgIGZpbGw6IFwiIzVCQTAyRVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE3Ni4xNDcgMjQ4LjE3NmE2LjYxMSA2LjYxMSAwIDAgMS02LjYxLTYuNjF2LTMzLjA1NGE2LjYxMSA2LjYxMSAwIDEgMSAxMy4yMjEgMHYzMy4wNTNhNi42MTEgNi42MTEgMCAwIDEtNi42MSA2LjYxMVwiLFxuICAgIGZpbGw6IFwiIzkyQzExMFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE4NS45OTQgMjkzLjg5aC0yNy4zNzZhMy4xNyAzLjE3IDAgMCAxLTMuMTctMy4xN3YtNDUuODg3YTMuMTcgMy4xNyAwIDAgMSAzLjE3LTMuMTdoMjcuMzc2YTMuMTcgMy4xNyAwIDAgMSAzLjE3IDMuMTd2NDUuODg2YTMuMTcgMy4xNyAwIDAgMS0zLjE3IDMuMTdcIixcbiAgICBmaWxsOiBcIiNGMkQ3QURcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04MS45NzIgMTQ3LjY3M3M2LjM3Ny0uOTI3IDE3LjU2Ni0xLjI4YzExLjcyOS0uMzcxIDE3LjU3IDEuMDg2IDE3LjU3IDEuMDg2czMuNjk3LTMuODU1Ljk2OC04LjQyNGMxLjI3OC0xMi4wNzcgNS45ODItMzIuODI3LjMzNS00OC4yNzMtMS4xMTYtMS4zMzktMy43NDMtMS41MTItNy41MzYtLjYyLTEuMzM3LjMxNS03LjE0Ny0uMTQ5LTcuOTgzLS4xbC0xNS4zMTEtLjM0N3MtMy40ODctLjE3LTguMDM1LS41MDhjLTEuNTEyLS4xMTMtNC4yMjctMS42ODMtNS40NTgtLjMzOC0uNDA2LjQ0My0yLjQyNSA1LjY2OS0xLjk3IDE2LjA3N2w4LjYzNSAzNS42NDJzLTMuMTQxIDMuNjEgMS4yMTkgNy4wODVcIixcbiAgICBmaWxsOiBcIiNGRkZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03NS43NjggNzMuMzI1bC0uOS02LjM5NyAxMS45ODItNi41MnM3LjMwMi0uMTE4IDguMDM4IDEuMjA1Yy43MzcgMS4zMjQtNS42MTYuOTkzLTUuNjE2Ljk5M3MtMS44MzYgMS4zODgtMi42MTUgMi41Yy0xLjY1NCAyLjM2My0uOTg2IDYuNDcxLTguMzE4IDUuOTg2LTEuNzA4LjI4NC0yLjU3IDIuMjMzLTIuNTcgMi4yMzNcIixcbiAgICBmaWxsOiBcIiNGRkM2QTBcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01Mi40NCA3Ny42NzJzMTQuMjE3IDkuNDA2IDI0Ljk3MyAxNC40NDRjMS4wNjEuNDk3LTIuMDk0IDE2LjE4My0xMS44OTIgMTEuODExLTcuNDM2LTMuMzE4LTIwLjE2Mi04LjQ0LTIxLjQ4Mi0xNC40OTYtLjcxLTMuMjU4IDIuNTQzLTcuNjQzIDguNDAxLTExLjc2TTE0MS44NjIgODAuMTEzcy02LjY5MyAyLjk5OS0xMy44NDQgNi44NzZjLTMuODk0IDIuMTEtMTAuMTM3IDQuNzA0LTEyLjMzIDcuOTg4LTYuMjI0IDkuMzE0IDMuNTM2IDExLjIyIDEyLjk0NyA3LjUwMyA2LjcxLTIuNjUxIDI4Ljk5OS0xMi4xMjcgMTMuMjI3LTIyLjM2N1wiLFxuICAgIGZpbGw6IFwiI0ZGQjU5NFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTc2LjE2NiA2Ni4zNmwzLjA2IDMuODgxcy0yLjc4MyAyLjY3LTYuMzEgNS43NDdjLTcuMTAzIDYuMTk1LTEyLjgwMyAxNC4yOTYtMTUuOTk1IDE2LjQ0LTMuOTY2IDIuNjYyLTkuNzU0IDMuMzE0LTEyLjE3Ny0uMTE4LTMuNTUzLTUuMDMyLjQ2NC0xNC42MjggMzEuNDIyLTI1Ljk1XCIsXG4gICAgZmlsbDogXCIjRkZDNkEwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjQuNjc0IDg1LjExNnMtMi4zNCA4LjQxMy04LjkxMiAxNC40NDdjLjY1Mi41NDggMTguNTg2IDEwLjUxIDIyLjE0NCAxMC4wNTYgNS4yMzgtLjY2OSA2LjQxNy0xOC45NjggMS4xNDUtMjAuNTMxLS43MDItLjIwOC01LjkwMS0xLjI4Ni04Ljg1My0yLjE2Ny0uODctLjI2LTEuNjExLTEuNzEtMy41NDUtLjkzNmwtMS45OC0uODY5ek0xMjguMzYyIDg1LjgyNnM1LjMxOCAxLjk1NiA3LjMyNSAxMy43MzRjLS41NDYuMjc0LTE3LjU1IDEyLjM1LTIxLjgyOSA3LjgwNS02LjUzNC02Ljk0LS43NjYtMTcuMzkzIDQuMjc1LTE4LjYxIDQuNjQ2LTEuMTIxIDUuMDMtMS4zNyAxMC4yMy0yLjkyOVwiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTc4LjE4IDk0LjY1NnMuOTExIDcuNDEtNC45MTQgMTMuMDc4XCIsXG4gICAgc3Ryb2tlOiBcIiNFNEVCRjdcIixcbiAgICBzdHJva2VXaWR0aDogXCIxLjA1MVwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTg3LjM5NyA5NC42OHMzLjEyNCAyLjU3MiAxMC4yNjMgMi41NzJjNy4xNCAwIDkuMDc0LTMuNDM3IDkuMDc0LTMuNDM3XCIsXG4gICAgc3Ryb2tlOiBcIiNFNEVCRjdcIixcbiAgICBzdHJva2VXaWR0aDogXCIuOTMyXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTE3LjE4NCA2OC42MzlsLTYuNzgxLTYuMTc3cy01LjM1NS00LjMxNC05LjIyMy0uODkzYy0zLjg2NyAzLjQyMiA0LjQ2MyAyLjA4MyA1LjY1MyA0LjE2NSAxLjE5IDIuMDgyLjg0OCAxLjE0My0yLjA4My40NDYtNS42MDMtMS4zMzEtMi4wODIuODkzIDIuOTc1IDUuMzU1IDIuMDkxIDEuODQ1IDYuOTkyLjk1NSA2Ljk5Mi45NTVsMi40NjctMy44NTF6XCIsXG4gICAgZmlsbDogXCIjRkZDNkEwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA1LjI4MiA5MS4zMTVsLS4yOTctMTAuOTM3LTE1LjkxOC0uMDI3LS41MyAxMC40NWMtLjAyNi40MDMuMTcuNzg4LjUxNS45OTkgMi4wNDkgMS4yNTEgOS4zODcgNS4wOTMgMTUuNzk5LjQyNC4yODctLjIxLjQ0My0uNTU0LjQzMS0uOTFcIixcbiAgICBmaWxsOiBcIiNGRkI1OTRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDcuNTczIDc0LjI0Yy44MTctMS4xNDcuOTgyLTkuMTE4IDEuMDE1LTExLjkyOGExLjA0NiAxLjA0NiAwIDAgMC0uOTY1LTEuMDU1bC00LjYyLS4zNjVjLTcuNzEtMS4wNDQtMTcuMDcxLjYyNC0xOC4yNTMgNi4zNDYtNS40ODIgNS44MTMtLjQyMSAxMy4yNDQtLjQyMSAxMy4yNDRzMS45NjMgMy41NjYgNC4zMDUgNi43OTFjLjc1NiAxLjA0MS4zOTgtMy43MzEgMy4wNC01LjkyOSA1LjUyNC00LjU5NCAxNS44OTktNy4xMDMgMTUuODk5LTcuMTAzXCIsXG4gICAgZmlsbDogXCIjNUMyNTUyXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNODguNDI2IDgzLjIwNnMyLjY4NSA2LjIwMiAxMS42MDIgNi41MjJjNy44Mi4yOCA4Ljk3My03LjAwOCA3LjQzNC0xNy41MDVsLS45MDktNS40ODNjLTYuMTE4LTIuODk3LTE1LjQ3OC41NC0xNS40NzguNTRzLS41NzYgMi4wNDQtLjE5IDUuNTA0Yy0yLjI3NiAyLjA2Ni0xLjgyNCA1LjYxOC0xLjgyNCA1LjYxOHMtLjkwNS0xLjkyMi0xLjk4LTIuMzIxYy0uODYtLjMyLTEuODk3LjA4OS0yLjMyMiAxLjk4LTEuMDQgNC42MzIgMy42NjcgNS4xNDUgMy42NjcgNS4xNDVcIixcbiAgICBmaWxsOiBcIiNGRkM2QTBcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBzdHJva2U6IFwiI0RCODM2RVwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMTQ1XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCIsXG4gICAgZDogXCJNMTAwLjg0MyA3Ny4wOTlsMS43MDEtLjkyOC0xLjAxNS00LjMyNC42NzQtMS40MDZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDUuNTQ2IDc0LjA5MmMtLjAyMi43MTMtLjQ1MiAxLjI3OS0uOTYgMS4yNjMtLjUxLS4wMTYtLjkwNC0uNjA3LS44ODItMS4zMi4wMjEtLjcxMy40NTItMS4yNzguOTYtMS4yNjMuNTEuMDE2LjkwNC42MDcuODgyIDEuMzJNOTcuNTkyIDc0LjM0OWMtLjAyMi43MTMtLjQ1MiAxLjI3OC0uOTYxIDEuMjYzLS41MDktLjAxNi0uOTA0LS42MDctLjg4Mi0xLjMyLjAyMi0uNzEzLjQ1Mi0xLjI3OS45NjEtMS4yNjMuNTEuMDE2LjkwNC42MDYuODgyIDEuMzJcIixcbiAgICBmaWxsOiBcIiM1NTI5NTBcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05MS4xMzIgODYuNzg2czUuMjY5IDQuOTU3IDEyLjY3OSAyLjMyN1wiLFxuICAgIHN0cm9rZTogXCIjREI4MzZFXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4xNDVcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05OS43NzYgODEuOTAzcy0zLjU5Mi4yMzItMS40NC0yLjc5YzEuNTktMS40OTYgNC44OTctLjQ2IDQuODk3LS40NnMxLjE1NiAzLjkwNi0zLjQ1NyAzLjI1XCIsXG4gICAgZmlsbDogXCIjREI4MzZFXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAyLjg4IDcwLjZzMi40ODMuODQgMy40MDIuNzE1TTkzLjg4MyA3MS45NzVzMi40OTItMS4xNDQgNC43NzgtMS4wNzNcIixcbiAgICBzdHJva2U6IFwiIzVDMjU1MlwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuNTI2XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNODYuMzIgNzcuMzc0cy45NjEuODc5IDEuNDU4IDIuMTA2Yy0uMzc3LjQ4LTEuMDMzIDEuMTUyLS4yMzYgMS44MDlNOTkuMzM3IDgzLjcxOXMxLjkxMS4xNTEgMi41MDktLjI1NFwiLFxuICAgIHN0cm9rZTogXCIjREI4MzZFXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4xNDVcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04Ny43ODIgMTE1LjgyMWwxNS43My0zLjAxMk0xMDAuMTY1IDExNS44MjFsMTAuMDQtMi4wMDhcIixcbiAgICBzdHJva2U6IFwiI0U0RUJGN1wiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMDUxXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjYuNTA4IDg2Ljc2M3MtMS41OTggOC44My02LjY5NyAxNC4wNzhcIixcbiAgICBzdHJva2U6IFwiI0U0RUJGN1wiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMTE0XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTI4LjMxIDg3LjkzNHMzLjAxMyA0LjEyMSA0LjA2IDExLjc4NVwiLFxuICAgIHN0cm9rZTogXCIjRTRFQkY3XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wNTFcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02NC4wOSA4NC44MTZzLTYuMDMgOS45MTItMTMuNjA3IDkuOTAzXCIsXG4gICAgc3Ryb2tlOiBcIiNEQjgzNkVcIixcbiAgICBzdHJva2VXaWR0aDogXCIuNzk1XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTEyLjM2NiA2NS45MDlsLS4xNDIgNS4zMnM1Ljk5MyA0LjQ3MiAxMS45NDUgOS4yMDJjNC40ODIgMy41NjIgOC44ODggNy40NTUgMTAuOTg1IDguNjYyIDQuODA0IDIuNzY2IDguOSAzLjM1NSAxMS4wNzYgMS44MDggNC4wNzEtMi44OTQgNC4zNzMtOS44NzgtOC4xMzYtMTUuMjYzLTQuMjcxLTEuODM4LTE2LjE0NC02LjM2LTI1LjcyOC05LjczXCIsXG4gICAgZmlsbDogXCIjRkZDNkEwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTMwLjUzMiA4NS40ODhzNC41ODggNS43NTcgMTEuNjE5IDYuMjE0XCIsXG4gICAgc3Ryb2tlOiBcIiNEQjgzNkVcIixcbiAgICBzdHJva2VXaWR0aDogXCIuNzVcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMjEuNzA4IDEwNS43M3MtLjM5MyA4LjU2NC0xLjM0IDEzLjYxMlwiLFxuICAgIHN0cm9rZTogXCIjRTRFQkY3XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wNTFcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMTUuNzg0IDE2MS41MTJzLTMuNTctMS40ODgtMi42NzgtNy4xNFwiLFxuICAgIHN0cm9rZTogXCIjNjQ4QkQ4XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wNTFcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDEuNTIgMjkwLjI0NnM0LjMyNiAyLjA1NyA3LjQwOCAxLjAzYzIuODQyLS45NDggNC41NjQuNjczIDcuMTMyIDEuMTg2IDIuNTcuNTE0IDYuOTI1IDEuMTA4IDExLjc3Mi0xLjI2OS0uMTA0LTUuNTUxLTYuOTM5LTQuMDEtMTIuMDQ4LTYuNzYzLTIuNTgyLTEuMzktMy44MTItNC43NTctMy42MjUtOC44NjNoLTkuNDcxcy0xLjQwMiAxMC41OTYtMS4xNjkgMTQuNjhcIixcbiAgICBmaWxsOiBcIiNDQkQxRDFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDEuNDk2IDI5MC4wNzNzMi40NDcgMS4yODEgNi44MDkuNjU4YzMuMDgxLS40NCAzLjc0LjQ4NSA3LjQ3OSAxLjAzOSAzLjczOS41NTQgMTAuODAyLS4wNyAxMS45MS0uOS40MTUgMS4xMDgtLjM0NyAyLjA3Ny0uMzQ3IDIuMDc3cy0xLjUyMy42MDgtNC44NDcuODMxYy0yLjA0NS4xMzctNS44NDMuMjkzLTcuNjYzLS41MDctMS44LTEuMzg1LTUuMjg2LTEuOTE3LTUuNzctLjI0My0zLjk0Ny45NTgtNy40MS0uMjg4LTcuNDEtLjI4OGwtLjE2LTIuNjY3elwiLFxuICAgIGZpbGw6IFwiIzJCMDg0OVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwOC44MjQgMjc2LjE5aDMuMTE2cy0uMTAzIDYuNzUxIDQuNTcgOC42MmMtNC42NzMuNjI0LTguNjItMi4zMi03LjY4Ni04LjYyXCIsXG4gICAgZmlsbDogXCIjQTRBQUJBXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTcuNjUgMjcyLjUycy0yLjEyMiA3LjQ3LTQuNTE4IDEyLjM5NmMtMS44MTEgMy43MjQtNC4yNTUgNy41NDggNS41MDUgNy41NDggNi42OTggMCA5LjAyLS40ODMgNy40NzktNi42NDgtMS41NDEtNi4xNjQuMjY4LTEzLjI5Ni4yNjgtMTMuMjk2SDU3LjY1elwiLFxuICAgIGZpbGw6IFwiI0NCRDFEMVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUxLjU0IDI5MC4wNHMyLjExMSAxLjE3OCA2LjY4MiAxLjE3OGM2LjEyOCAwIDguMzEtMS42NjIgOC4zMS0xLjY2MnMuNjA1IDEuMTIyLS42MjQgMi4xOGMtMSAuODYyLTMuNjI0IDEuNjAzLTcuNDQ0IDEuNTU5LTQuMTc3LS4wNDktNS44NzYtLjU3LTYuNzg2LTEuMTc3LS44MzEtLjU1NC0uNjkyLTEuNTkzLS4xMzgtMi4wNzhcIixcbiAgICBmaWxsOiBcIiMyQjA4NDlcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01OC41MzMgMjc0LjQzOHMuMDM0IDEuNTI5LS4zMTUgMi45NWMtLjM1MiAxLjQzMS0xLjA4NyAzLjEyNy0xLjEzOSA0LjE3LS4wNTggMS4xNiA0LjU3IDEuNTkyIDUuMTk0LjAzNS42MjMtMS41NTkgMS4zMDMtNi40NzUgMS45MjctNy4zMDYuNjIyLS44MzEtNC45NC0yLjEzNS01LjY2Ny4xNVwiLFxuICAgIGZpbGw6IFwiI0E0QUFCQVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwMC44ODUgMjc3LjAxNWwxMy4zMDYuMDkyczEuMjkxLTU0LjIyOCAxLjg0My02NC4wNTZjLjU1Mi05LjgyOCAzLjc1Ni00My4xMy45OTctNjIuNzg4bC0xMi40OC0uNjQtMjIuNzI1Ljc3NnMtLjQzMyAzLjk0NC0xLjE5IDkuOTIxYy0uMDYyLjQ5My0uNjc3LjgzOC0uNzQ0IDEuMzU4LS4wNzUuNTgyLjQyIDEuMzQ3LjMxOCAxLjk1Ni0yLjM1IDE0LjAwMy02LjM0MyAzMi45MjYtOC42OTcgNDYuNDI1LS4xMTYuNjYzLTEuMjI3IDEuMDA0LTEuNDUgMi42NzctLjA0LjMuMjEgMS41MTYuMTEyIDEuNzg1LTYuODM2IDE4LjY0My0xMC44OSA0Ny41ODQtMTQuMiA2MS41NTFsMTQuNTI4LS4wMTRzMi4xODUtOC41MjQgNC4wMDgtMTYuODc4YzIuNzk2LTEyLjgxNyAyMi45ODctODQuNTUzIDIyLjk4Ny04NC41NTNsMy0uNTE3IDEuMDM3IDQ2LjFzLS4yMjMgMS4yMjguMzM0IDIuMDA4Yy41NTguNzgyLS41NTYgMS4xMTctLjM5IDIuMjMzbC4zOSAxLjc4NHMtLjQ0NiA3LjE0LS44OTIgMTEuODI2Yy0uNDQ2IDQuNjg1LS4wOTIgMzguOTU0LS4wOTIgMzguOTU0XCIsXG4gICAgZmlsbDogXCIjN0JCMkY5XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzcuNDM4IDIyMC40MzRjMS4xNDYuMDk0IDQuMDE2LTIuMDA4IDYuOTE2LTQuOTFNMTA3LjU1IDIyMy45MzFzMi43NTgtMS4xMDMgNi4wNjktMy44NjJcIixcbiAgICBzdHJva2U6IFwiIzY0OEJEOFwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuMDUxXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA4LjQ1OSAyMjAuOTA1czIuNzU5LTEuMTA0IDYuMDctMy44NjNcIixcbiAgICBzdHJva2U6IFwiIzY0OEJEOFwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTc2LjA5OSAyMjMuNTU3czIuNjA4LS41ODcgNi40Ny0zLjM0Nk04Ny4zMyAxNTAuODJjLS4yNyAzLjA4OC4yOTcgOC40NzgtNC4zMTUgOS4wNzNNMTA0LjgyOSAxNDkuMDc1cy4xMSAxMy45MzYtMS4yODYgMTQuOTgzYy0yLjIwNyAxLjY1NS0yLjk3NSAxLjkzNC0yLjk3NSAxLjkzNE0xMDEuMDE0IDE0OS42M3MuMDM1IDEyLjgxLTEuMTkgMjQuMjQ1TTk0LjkzIDE3NC45NjVzNy4xNzQtMS42NTUgOS4zOC0xLjY1NU03NS42NzEgMjA0Ljc1NGMtLjMxNiAxLjU1LS42NCAzLjA2Ny0uOTczIDQuNTM1IDAgMC0xLjQ1IDEuODIyLTEuMDAzIDMuNzU2LjQ0NiAxLjkzNC0uOTQzIDIuMDM0LTQuOTYgMTUuMjczLTEuNjg2IDUuNTU5LTQuNDY0IDE4LjQ5LTYuMzEzIDI3LjQ0Ny0uMDc4LjM4LTQuMDE4IDE4LjA2LTQuMDkzIDE4LjQyM003Ny4wNDMgMTk2Ljc0M2EzMTMuMjY5IDMxMy4yNjkgMCAwIDEtLjg3NyA0LjcyOU04My45MDggMTUxLjQxNGwtMS4xOSAxMC40MTNzLTEuMDkxLjE0OC0uNDk2IDIuMjNjLjExMSAxLjM0LTIuNjYgMTUuNjkyLTUuMTUzIDMwLjI2N001Ny41OCAyNzIuOTRoMTMuMjM4XCIsXG4gICAgc3Ryb2tlOiBcIiM2NDhCRDhcIixcbiAgICBzdHJva2VXaWR0aDogXCIxLjA1MVwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExNy4zNzcgMTQ3LjQyM3MtMTYuOTU1LTMuMDg3LTM1LjcuMTk5Yy4xNTcgMi41MDEtLjAwMiA0LjEyOC0uMDAyIDQuMTI4czE0LjYwNy0yLjgwMiAzNS40NzYtLjMxYy4yNTEtMi4zNDIuMjI2LTQuMDE3LjIyNi00LjAxN1wiLFxuICAgIGZpbGw6IFwiIzE5MjA2NFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwNy41MTEgMTUwLjM1M2wuMDA0LTQuODg1YS44MDcuODA3IDAgMCAwLS43NzQtLjgxYy0yLjQyOC0uMDkyLTUuMDQtLjEwOC03Ljc5NS0uMDE0YS44MTQuODE0IDAgMCAwLS43ODQuODFsLS4wMDMgNC44OGMwIC40NTYuMzcxLjgyLjgyNy44MDhhMTQwLjc2IDE0MC43NiAwIDAgMSA3LjY4OC4wMTcuODEuODEgMCAwIDAgLjgzNy0uODA2XCIsXG4gICAgZmlsbDogXCIjRkZGXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA2LjQwMiAxNDkuNDI2bC4wMDItMy4wNmEuNjQuNjQgMCAwIDAtLjYxNi0uNjQzIDk0LjEzNSA5NC4xMzUgMCAwIDAtNS44MzQtLjAwOS42NDcuNjQ3IDAgMCAwLS42MjYuNjQzbC0uMDAxIDMuMDU2YzAgLjM2LjI5MS42NDguNjUxLjY0IDEuNzgtLjA0IDMuNzA4LS4wNDEgNS43NjIuMDEyLjM2LjAwOS42NjItLjI3OS42NjItLjY0XCIsXG4gICAgZmlsbDogXCIjMTkyMDY0XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAxLjQ4NSAyNzMuOTMzaDEyLjI3Mk0xMDIuNjUyIDI2OS4wNzVjLjAwNiAzLjM2OC4wNCA1Ljc1OS4xMSA2LjQ3TTEwMi42NjcgMjYzLjEyNWMtLjAwOSAxLjUzLS4wMTUgMi45OC0uMDE2IDQuMzEzTTEwMi4yMDQgMTc0LjAyNGwuODkzIDQ0LjQwMnMuNjY5IDEuNTYxLS4yMjQgMi42NzdjLS44OTIgMS4xMTYgMi40NTUuNjcuODkzIDIuMjMxLTEuNTYyIDEuNTYyLjg5MyAxLjExNiAwIDMuMzQ3LS41OTIgMS40OC0uOTg4IDIwLjk4Ny0xLjA5IDM0Ljk1NlwiLFxuICAgIHN0cm9rZTogXCIjNjQ4QkQ4XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS4wNTFcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIlxuICB9KSkpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gVW5hdXRob3JpemVkO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2dyaWQgPSByZXF1aXJlKFwiLi4vZ3JpZFwiKTtcblxudmFyIF9kZWZhdWx0ID0gX2dyaWQuUm93O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm9taXQuanNcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9yY1NlbGVjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyYy1zZWxlY3RcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9pY29uVXRpbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXRpbHMvaWNvblV0aWxcIikpO1xuXG52YXIgX1NpemVDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0XCIpKTtcblxuLy8gVE9ETzogNC4wIC0gY29kZW1vZCBzaG91bGQgaGVscCB0byBjaGFuZ2UgYGZpbHRlck9wdGlvbmAgdG8gc3VwcG9ydCBub2RlIHByb3BzLlxuLy8gV2Ugc3RpbGwgdXNlIGNsYXNzIGhlcmUgc2luY2UgYGZvcndhcmRSZWZgIG5vdCBzdXBwb3J0IGdlbmVyaWMgaW4gdHlwZXNjcmlwdFxudmFyIFNlbGVjdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKFNlbGVjdCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoU2VsZWN0KTtcblxuICBmdW5jdGlvbiBTZWxlY3QoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBTZWxlY3QpO1xuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMuc2VsZWN0UmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuXG4gICAgX3RoaXMuZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuc2VsZWN0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgX3RoaXMuc2VsZWN0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuYmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5zZWxlY3RSZWYuY3VycmVudCkge1xuICAgICAgICBfdGhpcy5zZWxlY3RSZWYuY3VycmVudC5ibHVyKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmdldE1vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbW9kZSA9IF90aGlzLnByb3BzLm1vZGU7XG5cbiAgICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlID09PSBTZWxlY3QuU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRSkge1xuICAgICAgICByZXR1cm4gJ2NvbWJvYm94JztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1vZGU7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlclNlbGVjdCA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyID0gX3JlZi5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscyxcbiAgICAgICAgICByZW5kZXJFbXB0eSA9IF9yZWYucmVuZGVyRW1wdHksXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb24sXG4gICAgICAgICAgdmlydHVhbCA9IF9yZWYudmlydHVhbCxcbiAgICAgICAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBfcmVmLmRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IF90aGlzJHByb3BzLnByZWZpeENscyxcbiAgICAgICAgICBub3RGb3VuZENvbnRlbnQgPSBfdGhpcyRwcm9wcy5ub3RGb3VuZENvbnRlbnQsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgIGN1c3RvbWl6ZVNpemUgPSBfdGhpcyRwcm9wcy5zaXplLFxuICAgICAgICAgIF90aGlzJHByb3BzJGxpc3RIZWlnaCA9IF90aGlzJHByb3BzLmxpc3RIZWlnaHQsXG4gICAgICAgICAgbGlzdEhlaWdodCA9IF90aGlzJHByb3BzJGxpc3RIZWlnaCA9PT0gdm9pZCAwID8gMjU2IDogX3RoaXMkcHJvcHMkbGlzdEhlaWdoLFxuICAgICAgICAgIF90aGlzJHByb3BzJGxpc3RJdGVtSCA9IF90aGlzJHByb3BzLmxpc3RJdGVtSGVpZ2h0LFxuICAgICAgICAgIGxpc3RJdGVtSGVpZ2h0ID0gX3RoaXMkcHJvcHMkbGlzdEl0ZW1IID09PSB2b2lkIDAgPyAyNCA6IF90aGlzJHByb3BzJGxpc3RJdGVtSCxcbiAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lciA9IF90aGlzJHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgICAgIGRyb3Bkb3duQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgICAgICAgYm9yZGVyZWQgPSBfdGhpcyRwcm9wcy5ib3JkZXJlZDtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NlbGVjdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG5cbiAgICAgIHZhciBtb2RlID0gX3RoaXMuZ2V0TW9kZSgpO1xuXG4gICAgICB2YXIgaXNNdWx0aXBsZSA9IG1vZGUgPT09ICdtdWx0aXBsZScgfHwgbW9kZSA9PT0gJ3RhZ3MnOyAvLyA9PT09PT09PT09PT09PT09PT09PT0gRW1wdHkgPT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIHZhciBtZXJnZWROb3RGb3VuZDtcblxuICAgICAgaWYgKG5vdEZvdW5kQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1lcmdlZE5vdEZvdW5kID0gbm90Rm91bmRDb250ZW50O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICAgIG1lcmdlZE5vdEZvdW5kID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lcmdlZE5vdEZvdW5kID0gcmVuZGVyRW1wdHkoJ1NlbGVjdCcpO1xuICAgICAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT0gSWNvbnMgPT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgICAgdmFyIF9nZXRJY29ucyA9ICgwLCBfaWNvblV0aWxbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBfdGhpcy5wcm9wcyksIHtcbiAgICAgICAgbXVsdGlwbGU6IGlzTXVsdGlwbGUsXG4gICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gICAgICB9KSksXG4gICAgICAgICAgc3VmZml4SWNvbiA9IF9nZXRJY29ucy5zdWZmaXhJY29uLFxuICAgICAgICAgIGl0ZW1JY29uID0gX2dldEljb25zLml0ZW1JY29uLFxuICAgICAgICAgIHJlbW92ZUljb24gPSBfZ2V0SWNvbnMucmVtb3ZlSWNvbixcbiAgICAgICAgICBjbGVhckljb24gPSBfZ2V0SWNvbnMuY2xlYXJJY29uO1xuXG4gICAgICB2YXIgc2VsZWN0UHJvcHMgPSAoMCwgX29taXRbXCJkZWZhdWx0XCJdKShfdGhpcy5wcm9wcywgWydwcmVmaXhDbHMnLCAnc3VmZml4SWNvbicsICdpdGVtSWNvbicsICdyZW1vdmVJY29uJywgJ2NsZWFySWNvbicsICdzaXplJywgJ2JvcmRlcmVkJ10pO1xuICAgICAgdmFyIHJjU2VsZWN0UnRsRHJvcERvd25DbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShkcm9wZG93bkNsYXNzTmFtZSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kcm9wZG93bi1cIikuY29uY2F0KGRpcmVjdGlvbiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU2l6ZUNvbnRleHRbXCJkZWZhdWx0XCJdLkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICB2YXIgX2NsYXNzTmFtZXMyO1xuXG4gICAgICAgIHZhciBtZXJnZWRTaXplID0gY3VzdG9taXplU2l6ZSB8fCBzaXplO1xuICAgICAgICB2YXIgbWVyZ2VkQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sZ1wiKSwgbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtXCIpLCBtZXJnZWRTaXplID09PSAnc21hbGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2NsYXNzTmFtZXMyKSwgY2xhc3NOYW1lKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1NlbGVjdFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgICAgcmVmOiBfdGhpcy5zZWxlY3RSZWYsXG4gICAgICAgICAgdmlydHVhbDogdmlydHVhbCxcbiAgICAgICAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGg6IGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aFxuICAgICAgICB9LCBzZWxlY3RQcm9wcywge1xuICAgICAgICAgIGxpc3RIZWlnaHQ6IGxpc3RIZWlnaHQsXG4gICAgICAgICAgbGlzdEl0ZW1IZWlnaHQ6IGxpc3RJdGVtSGVpZ2h0LFxuICAgICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICAgICAgaW5wdXRJY29uOiBzdWZmaXhJY29uLFxuICAgICAgICAgIG1lbnVJdGVtU2VsZWN0ZWRJY29uOiBpdGVtSWNvbixcbiAgICAgICAgICByZW1vdmVJY29uOiByZW1vdmVJY29uLFxuICAgICAgICAgIGNsZWFySWNvbjogY2xlYXJJY29uLFxuICAgICAgICAgIG5vdEZvdW5kQ29udGVudDogbWVyZ2VkTm90Rm91bmQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWUsXG4gICAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICBkcm9wZG93bkNsYXNzTmFtZTogcmNTZWxlY3RSdGxEcm9wRG93bkNsYXNzTmFtZVxuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShTZWxlY3QsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCB0aGlzLnJlbmRlclNlbGVjdCk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTZWxlY3Q7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblNlbGVjdC5PcHRpb24gPSBfcmNTZWxlY3QuT3B0aW9uO1xuU2VsZWN0Lk9wdEdyb3VwID0gX3JjU2VsZWN0Lk9wdEdyb3VwO1xuU2VsZWN0LlNFQ1JFVF9DT01CT0JPWF9NT0RFX0RPX05PVF9VU0UgPSAnU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRSc7XG5TZWxlY3QuZGVmYXVsdFByb3BzID0ge1xuICB0cmFuc2l0aW9uTmFtZTogJ3NsaWRlLXVwJyxcbiAgY2hvaWNlVHJhbnNpdGlvbk5hbWU6ICcnLFxuICBib3JkZXJlZDogdHJ1ZVxufTtcbnZhciBfZGVmYXVsdCA9IFNlbGVjdDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBnZXRJY29ucztcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Eb3duT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Eb3duT3V0bGluZWRcIikpO1xuXG52YXIgX0xvYWRpbmdPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0xvYWRpbmdPdXRsaW5lZFwiKSk7XG5cbnZhciBfQ2hlY2tPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0NoZWNrT3V0bGluZWRcIikpO1xuXG52YXIgX0Nsb3NlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DbG9zZU91dGxpbmVkXCIpKTtcblxudmFyIF9DbG9zZUNpcmNsZUZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCIpKTtcblxudmFyIF9TZWFyY2hPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1NlYXJjaE91dGxpbmVkXCIpKTtcblxuZnVuY3Rpb24gZ2V0SWNvbnMoX3JlZikge1xuICB2YXIgc3VmZml4SWNvbiA9IF9yZWYuc3VmZml4SWNvbixcbiAgICAgIGNsZWFySWNvbiA9IF9yZWYuY2xlYXJJY29uLFxuICAgICAgbWVudUl0ZW1TZWxlY3RlZEljb24gPSBfcmVmLm1lbnVJdGVtU2VsZWN0ZWRJY29uLFxuICAgICAgcmVtb3ZlSWNvbiA9IF9yZWYucmVtb3ZlSWNvbixcbiAgICAgIGxvYWRpbmcgPSBfcmVmLmxvYWRpbmcsXG4gICAgICBtdWx0aXBsZSA9IF9yZWYubXVsdGlwbGUsXG4gICAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscztcbiAgLy8gQ2xlYXIgSWNvblxuICB2YXIgbWVyZ2VkQ2xlYXJJY29uID0gY2xlYXJJY29uO1xuXG4gIGlmICghY2xlYXJJY29uKSB7XG4gICAgbWVyZ2VkQ2xlYXJJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlQ2lyY2xlRmlsbGVkW1wiZGVmYXVsdFwiXSwgbnVsbCk7XG4gIH0gLy8gQXJyb3cgaXRlbSBpY29uXG5cblxuICB2YXIgbWVyZ2VkU3VmZml4SWNvbiA9IG51bGw7XG5cbiAgaWYgKHN1ZmZpeEljb24gIT09IHVuZGVmaW5lZCkge1xuICAgIG1lcmdlZFN1ZmZpeEljb24gPSBzdWZmaXhJY29uO1xuICB9IGVsc2UgaWYgKGxvYWRpbmcpIHtcbiAgICBtZXJnZWRTdWZmaXhJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvYWRpbmdPdXRsaW5lZFtcImRlZmF1bHRcIl0sIHtcbiAgICAgIHNwaW46IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaWNvbkNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VmZml4XCIpO1xuXG4gICAgbWVyZ2VkU3VmZml4SWNvbiA9IGZ1bmN0aW9uIG1lcmdlZFN1ZmZpeEljb24oX3JlZjIpIHtcbiAgICAgIHZhciBvcGVuID0gX3JlZjIub3BlbixcbiAgICAgICAgICBzaG93U2VhcmNoID0gX3JlZjIuc2hvd1NlYXJjaDtcblxuICAgICAgaWYgKG9wZW4gJiYgc2hvd1NlYXJjaCkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NlYXJjaE91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICAgIGNsYXNzTmFtZTogaWNvbkNsc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Eb3duT3V0bGluZWRbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgIGNsYXNzTmFtZTogaWNvbkNsc1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSAvLyBDaGVja2VkIGl0ZW0gaWNvblxuXG5cbiAgdmFyIG1lcmdlZEl0ZW1JY29uID0gbnVsbDtcblxuICBpZiAobWVudUl0ZW1TZWxlY3RlZEljb24gIT09IHVuZGVmaW5lZCkge1xuICAgIG1lcmdlZEl0ZW1JY29uID0gbWVudUl0ZW1TZWxlY3RlZEljb247XG4gIH0gZWxzZSBpZiAobXVsdGlwbGUpIHtcbiAgICBtZXJnZWRJdGVtSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DaGVja091dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkSXRlbUljb24gPSBudWxsO1xuICB9XG5cbiAgdmFyIG1lcmdlZFJlbW92ZUljb24gPSBudWxsO1xuXG4gIGlmIChyZW1vdmVJY29uICE9PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWRSZW1vdmVJY29uID0gcmVtb3ZlSWNvbjtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWRSZW1vdmVJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xlYXJJY29uOiBtZXJnZWRDbGVhckljb24sXG4gICAgc3VmZml4SWNvbjogbWVyZ2VkU3VmZml4SWNvbixcbiAgICBpdGVtSWNvbjogbWVyZ2VkSXRlbUljb24sXG4gICAgcmVtb3ZlSWNvbjogbWVyZ2VkUmVtb3ZlSWNvblxuICB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9FbGVtZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9FbGVtZW50XCIpKTtcblxudmFyIFNrZWxldG9uQXZhdGFyID0gZnVuY3Rpb24gU2tlbGV0b25BdmF0YXIocHJvcHMpIHtcbiAgdmFyIHJlbmRlclNrZWxldG9uQXZhdGFyID0gZnVuY3Rpb24gcmVuZGVyU2tlbGV0b25BdmF0YXIoX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZTtcbiAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdza2VsZXRvbicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgdmFyIG90aGVyUHJvcHMgPSAoMCwgX29taXRbXCJkZWZhdWx0XCJdKShwcm9wcywgWydwcmVmaXhDbHMnXSk7XG4gICAgdmFyIGNscyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lbGVtZW50XCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSwgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHNcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRWxlbWVudFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXZhdGFyXCIpXG4gICAgfSwgb3RoZXJQcm9wcykpKTtcbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCByZW5kZXJTa2VsZXRvbkF2YXRhcik7XG59O1xuXG5Ta2VsZXRvbkF2YXRhci5kZWZhdWx0UHJvcHMgPSB7XG4gIHNpemU6ICdkZWZhdWx0JyxcbiAgc2hhcGU6ICdjaXJjbGUnXG59O1xudmFyIF9kZWZhdWx0ID0gU2tlbGV0b25BdmF0YXI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX0VsZW1lbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0VsZW1lbnRcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIFNrZWxldG9uQnV0dG9uID0gZnVuY3Rpb24gU2tlbGV0b25CdXR0b24ocHJvcHMpIHtcbiAgdmFyIHJlbmRlclNrZWxldG9uQnV0dG9uID0gZnVuY3Rpb24gcmVuZGVyU2tlbGV0b25CdXR0b24oX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZTtcbiAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdza2VsZXRvbicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgdmFyIG90aGVyUHJvcHMgPSAoMCwgX29taXRbXCJkZWZhdWx0XCJdKShwcm9wcywgWydwcmVmaXhDbHMnXSk7XG4gICAgdmFyIGNscyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lbGVtZW50XCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSwgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHNcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRWxlbWVudFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYnV0dG9uXCIpXG4gICAgfSwgb3RoZXJQcm9wcykpKTtcbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCByZW5kZXJTa2VsZXRvbkJ1dHRvbik7XG59O1xuXG5Ta2VsZXRvbkJ1dHRvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIHNpemU6ICdkZWZhdWx0J1xufTtcbnZhciBfZGVmYXVsdCA9IFNrZWxldG9uQnV0dG9uO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgRWxlbWVudCA9IGZ1bmN0aW9uIEVsZW1lbnQocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzLCBfY2xhc3NOYW1lczI7XG5cbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHNoYXBlID0gcHJvcHMuc2hhcGU7XG4gIHZhciBzaXplQ2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGdcIiksIHNpemUgPT09ICdsYXJnZScpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtXCIpLCBzaXplID09PSAnc21hbGwnKSwgX2NsYXNzTmFtZXMpKTtcbiAgdmFyIHNoYXBlQ2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaXJjbGVcIiksIHNoYXBlID09PSAnY2lyY2xlJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNxdWFyZVwiKSwgc2hhcGUgPT09ICdzcXVhcmUnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcm91bmRcIiksIHNoYXBlID09PSAncm91bmQnKSwgX2NsYXNzTmFtZXMyKSk7XG4gIHZhciBzaXplU3R5bGUgPSB0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgd2lkdGg6IHNpemUsXG4gICAgaGVpZ2h0OiBzaXplLFxuICAgIGxpbmVIZWlnaHQ6IFwiXCIuY29uY2F0KHNpemUsIFwicHhcIilcbiAgfSA6IHt9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgc2l6ZUNscywgc2hhcGVDbHMsIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHNpemVTdHlsZSksIHN0eWxlKVxuICB9KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IEVsZW1lbnQ7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBwYXRoID0gJ00zNjUuNzE0Mjg2IDMyOS4xNDI4NTdxMCA0NS43MTQyODYtMzIuMDM2NTcxIDc3LjY3NzcxNHQtNzcuNjc3NzE0IDMyLjAzNjU3MS03Ny42Nzc3MTQtMzIuMDM2NTcxLTMyLjAzNjU3MS03Ny42Nzc3MTQgMzIuMDM2NTcxLTc3LjY3NzcxNCA3Ny42Nzc3MTQtMzIuMDM2NTcxIDc3LjY3NzcxNCAzMi4wMzY1NzEgMzIuMDM2NTcxIDc3LjY3NzcxNHpNOTUwLjg1NzE0MyA1NDguNTcxNDI5bDAgMjU2LTgwNC41NzE0MjkgMCAwLTEwOS43MTQyODYgMTgyLjg1NzE0My0xODIuODU3MTQzIDkxLjQyODU3MSA5MS40Mjg1NzEgMjkyLjU3MTQyOS0yOTIuNTcxNDI5ek0xMDA1LjcxNDI4NiAxNDYuMjg1NzE0bC05MTQuMjg1NzE0IDBxLTcuNDYwNTcxIDAtMTIuODczMTQzIDUuNDEyNTcxdC01LjQxMjU3MSAxMi44NzMxNDNsMCA2OTQuODU3MTQzcTAgNy40NjA1NzEgNS40MTI1NzEgMTIuODczMTQzdDEyLjg3MzE0MyA1LjQxMjU3MWw5MTQuMjg1NzE0IDBxNy40NjA1NzEgMCAxMi44NzMxNDMtNS40MTI1NzF0NS40MTI1NzEtMTIuODczMTQzbDAtNjk0Ljg1NzE0M3EwLTcuNDYwNTcxLTUuNDEyNTcxLTEyLjg3MzE0M3QtMTIuODczMTQzLTUuNDEyNTcxek0xMDk3LjE0Mjg1NyAxNjQuNTcxNDI5bDAgNjk0Ljg1NzE0M3EwIDM3Ljc0MTcxNC0yNi44NDM0MjkgNjQuNTg1MTQzdC02NC41ODUxNDMgMjYuODQzNDI5bC05MTQuMjg1NzE0IDBxLTM3Ljc0MTcxNCAwLTY0LjU4NTE0My0yNi44NDM0Mjl0LTI2Ljg0MzQyOS02NC41ODUxNDNsMC02OTQuODU3MTQzcTAtMzcuNzQxNzE0IDI2Ljg0MzQyOS02NC41ODUxNDN0NjQuNTg1MTQzLTI2Ljg0MzQyOWw5MTQuMjg1NzE0IDBxMzcuNzQxNzE0IDAgNjQuNTg1MTQzIDI2Ljg0MzQyOXQyNi44NDM0MjkgNjQuNTg1MTQzeic7XG5cbnZhciBTa2VsZXRvbkltYWdlID0gZnVuY3Rpb24gU2tlbGV0b25JbWFnZShwcm9wcykge1xuICB2YXIgcmVuZGVyU2tlbGV0b25JbWFnZSA9IGZ1bmN0aW9uIHJlbmRlclNrZWxldG9uSW1hZ2UoX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGU7XG4gICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2tlbGV0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBjbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWxlbWVudFwiKSwgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHNcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1hZ2VcIiksIGNsYXNzTmFtZSksXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICB2aWV3Qm94OiBcIjAgMCAxMDk4IDEwMjRcIixcbiAgICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1hZ2Utc3ZnXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgIGQ6IHBhdGgsXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1hZ2UtcGF0aFwiKVxuICAgIH0pKSkpO1xuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIHJlbmRlclNrZWxldG9uSW1hZ2UpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gU2tlbGV0b25JbWFnZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfRWxlbWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRWxlbWVudFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgU2tlbGV0b25JbnB1dCA9IGZ1bmN0aW9uIFNrZWxldG9uSW5wdXQocHJvcHMpIHtcbiAgdmFyIHJlbmRlclNrZWxldG9uSW5wdXQgPSBmdW5jdGlvbiByZW5kZXJTa2VsZXRvbklucHV0KF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHM7XG4gICAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBhY3RpdmUgPSBwcm9wcy5hY3RpdmU7XG4gICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2tlbGV0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBvdGhlclByb3BzID0gKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkocHJvcHMsIFsncHJlZml4Q2xzJ10pO1xuICAgIHZhciBjbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWxlbWVudFwiKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSksIGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xzXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0VsZW1lbnRbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpXG4gICAgfSwgb3RoZXJQcm9wcykpKTtcbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCByZW5kZXJTa2VsZXRvbklucHV0KTtcbn07XG5cblNrZWxldG9uSW5wdXQuZGVmYXVsdFByb3BzID0ge1xuICBzaXplOiAnZGVmYXVsdCdcbn07XG52YXIgX2RlZmF1bHQgPSBTa2VsZXRvbklucHV0O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBQYXJhZ3JhcGggPSBmdW5jdGlvbiBQYXJhZ3JhcGgocHJvcHMpIHtcbiAgdmFyIGdldFdpZHRoID0gZnVuY3Rpb24gZ2V0V2lkdGgoaW5kZXgpIHtcbiAgICB2YXIgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICAgICAgX3Byb3BzJHJvd3MgPSBwcm9wcy5yb3dzLFxuICAgICAgICByb3dzID0gX3Byb3BzJHJvd3MgPT09IHZvaWQgMCA/IDIgOiBfcHJvcHMkcm93cztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHdpZHRoKSkge1xuICAgICAgcmV0dXJuIHdpZHRoW2luZGV4XTtcbiAgICB9IC8vIGxhc3QgcGFyYWdyYXBoXG5cblxuICAgIGlmIChyb3dzIC0gMSA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgcm93cyA9IHByb3BzLnJvd3M7XG4gIHZhciByb3dMaXN0ID0gKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShBcnJheShyb3dzKSkubWFwKGZ1bmN0aW9uIChfLCBpbmRleCkge1xuICAgIHJldHVybiAoXG4gICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICBrZXk6IGluZGV4LFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHdpZHRoOiBnZXRXaWR0aChpbmRleClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCByb3dMaXN0KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IFBhcmFncmFwaDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX1RpdGxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UaXRsZVwiKSk7XG5cbnZhciBfUGFyYWdyYXBoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJhZ3JhcGhcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9FbGVtZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9FbGVtZW50XCIpKTtcblxudmFyIF9BdmF0YXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0F2YXRhclwiKSk7XG5cbnZhciBfQnV0dG9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9CdXR0b25cIikpO1xuXG52YXIgX0lucHV0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JbnB1dFwiKSk7XG5cbnZhciBfSW1hZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0ltYWdlXCIpKTtcblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50UHJvcHMocHJvcCkge1xuICBpZiAocHJvcCAmJiAoMCwgX3R5cGVvZjJbXCJkZWZhdWx0XCJdKShwcm9wKSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gcHJvcDtcbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gZ2V0QXZhdGFyQmFzaWNQcm9wcyhoYXNUaXRsZSwgaGFzUGFyYWdyYXBoKSB7XG4gIGlmIChoYXNUaXRsZSAmJiAhaGFzUGFyYWdyYXBoKSB7XG4gICAgLy8gU3F1YXJlIGF2YXRhclxuICAgIHJldHVybiB7XG4gICAgICBzaXplOiAnbGFyZ2UnLFxuICAgICAgc2hhcGU6ICdzcXVhcmUnXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2l6ZTogJ2xhcmdlJyxcbiAgICBzaGFwZTogJ2NpcmNsZSdcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0VGl0bGVCYXNpY1Byb3BzKGhhc0F2YXRhciwgaGFzUGFyYWdyYXBoKSB7XG4gIGlmICghaGFzQXZhdGFyICYmIGhhc1BhcmFncmFwaCkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogJzM4JSdcbiAgICB9O1xuICB9XG5cbiAgaWYgKGhhc0F2YXRhciAmJiBoYXNQYXJhZ3JhcGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6ICc1MCUnXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyYWdyYXBoQmFzaWNQcm9wcyhoYXNBdmF0YXIsIGhhc1RpdGxlKSB7XG4gIHZhciBiYXNpY1Byb3BzID0ge307IC8vIFdpZHRoXG5cbiAgaWYgKCFoYXNBdmF0YXIgfHwgIWhhc1RpdGxlKSB7XG4gICAgYmFzaWNQcm9wcy53aWR0aCA9ICc2MSUnO1xuICB9IC8vIFJvd3NcblxuXG4gIGlmICghaGFzQXZhdGFyICYmIGhhc1RpdGxlKSB7XG4gICAgYmFzaWNQcm9wcy5yb3dzID0gMztcbiAgfSBlbHNlIHtcbiAgICBiYXNpY1Byb3BzLnJvd3MgPSAyO1xuICB9XG5cbiAgcmV0dXJuIGJhc2ljUHJvcHM7XG59XG5cbnZhciBTa2VsZXRvbiA9IGZ1bmN0aW9uIFNrZWxldG9uKHByb3BzKSB7XG4gIHZhciByZW5kZXJTa2VsZXRvbiA9IGZ1bmN0aW9uIHJlbmRlclNrZWxldG9uKF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHMsXG4gICAgICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uO1xuICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGF2YXRhciA9IHByb3BzLmF2YXRhcixcbiAgICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgICAgcGFyYWdyYXBoID0gcHJvcHMucGFyYWdyYXBoLFxuICAgICAgICBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgICAgIHJvdW5kID0gcHJvcHMucm91bmQ7XG4gICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2tlbGV0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuXG4gICAgaWYgKGxvYWRpbmcgfHwgISgnbG9hZGluZycgaW4gcHJvcHMpKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgIHZhciBoYXNBdmF0YXIgPSAhIWF2YXRhcjtcbiAgICAgIHZhciBoYXNUaXRsZSA9ICEhdGl0bGU7XG4gICAgICB2YXIgaGFzUGFyYWdyYXBoID0gISFwYXJhZ3JhcGg7IC8vIEF2YXRhclxuXG4gICAgICB2YXIgYXZhdGFyTm9kZTtcblxuICAgICAgaWYgKGhhc0F2YXRhcikge1xuICAgICAgICB2YXIgYXZhdGFyUHJvcHMgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXZhdGFyXCIpXG4gICAgICAgIH0sIGdldEF2YXRhckJhc2ljUHJvcHMoaGFzVGl0bGUsIGhhc1BhcmFncmFwaCkpLCBnZXRDb21wb25lbnRQcm9wcyhhdmF0YXIpKTsgLy8gV2UgZGlyZWN0IHVzZSBTa2VsZXRvbkVsZW1lbnQgYXMgYXZhdGFyIGluIHNrZWxldG9uIGludGVybmFsLlxuXG4gICAgICAgIGF2YXRhck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRWxlbWVudFtcImRlZmF1bHRcIl0sIGF2YXRhclByb3BzKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50Tm9kZTtcblxuICAgICAgaWYgKGhhc1RpdGxlIHx8IGhhc1BhcmFncmFwaCkge1xuICAgICAgICAvLyBUaXRsZVxuICAgICAgICB2YXIgJHRpdGxlO1xuXG4gICAgICAgIGlmIChoYXNUaXRsZSkge1xuICAgICAgICAgIHZhciB0aXRsZVByb3BzID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGl0bGVcIilcbiAgICAgICAgICB9LCBnZXRUaXRsZUJhc2ljUHJvcHMoaGFzQXZhdGFyLCBoYXNQYXJhZ3JhcGgpKSwgZ2V0Q29tcG9uZW50UHJvcHModGl0bGUpKTtcbiAgICAgICAgICAkdGl0bGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfVGl0bGVbXCJkZWZhdWx0XCJdLCB0aXRsZVByb3BzKTtcbiAgICAgICAgfSAvLyBQYXJhZ3JhcGhcblxuXG4gICAgICAgIHZhciBwYXJhZ3JhcGhOb2RlO1xuXG4gICAgICAgIGlmIChoYXNQYXJhZ3JhcGgpIHtcbiAgICAgICAgICB2YXIgcGFyYWdyYXBoUHJvcHMgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYXJhZ3JhcGhcIilcbiAgICAgICAgICB9LCBnZXRQYXJhZ3JhcGhCYXNpY1Byb3BzKGhhc0F2YXRhciwgaGFzVGl0bGUpKSwgZ2V0Q29tcG9uZW50UHJvcHMocGFyYWdyYXBoKSk7XG4gICAgICAgICAgcGFyYWdyYXBoTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9QYXJhZ3JhcGhbXCJkZWZhdWx0XCJdLCBwYXJhZ3JhcGhQcm9wcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKVxuICAgICAgICB9LCAkdGl0bGUsIHBhcmFncmFwaE5vZGUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13aXRoLWF2YXRhclwiKSwgaGFzQXZhdGFyKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3VuZFwiKSwgcm91bmQpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsc1xuICAgICAgfSwgYXZhdGFyTm9kZSwgY29udGVudE5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCByZW5kZXJTa2VsZXRvbik7XG59O1xuXG5Ta2VsZXRvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGF2YXRhcjogZmFsc2UsXG4gIHRpdGxlOiB0cnVlLFxuICBwYXJhZ3JhcGg6IHRydWVcbn07XG5Ta2VsZXRvbi5CdXR0b24gPSBfQnV0dG9uW1wiZGVmYXVsdFwiXTtcblNrZWxldG9uLkF2YXRhciA9IF9BdmF0YXJbXCJkZWZhdWx0XCJdO1xuU2tlbGV0b24uSW5wdXQgPSBfSW5wdXRbXCJkZWZhdWx0XCJdO1xuU2tlbGV0b24uSW1hZ2UgPSBfSW1hZ2VbXCJkZWZhdWx0XCJdO1xudmFyIF9kZWZhdWx0ID0gU2tlbGV0b247XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2hlYWRpbmctaGFzLWNvbnRlbnQgKi9cbnZhciBUaXRsZSA9IGZ1bmN0aW9uIFRpdGxlKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBzdHlsZSA9IF9yZWYuc3R5bGU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgIHdpZHRoOiB3aWR0aFxuICAgIH0sIHN0eWxlKVxuICB9KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IFRpdGxlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9Ta2VsZXRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU2tlbGV0b25cIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfU2tlbGV0b25bXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdG9vbHRpcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3Rvb2x0aXBcIikpO1xuXG5mdW5jdGlvbiB1c2VDb21iaW5lZFJlZnMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZWZzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHJlZnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgdGFyZ2V0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIGlmICghcmVmKSByZXR1cm47XG5cbiAgICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlZih0YXJnZXRSZWYuY3VycmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWYuY3VycmVudCA9IHRhcmdldFJlZi5jdXJyZW50O1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbcmVmc10pO1xuICByZXR1cm4gdGFyZ2V0UmVmO1xufVxuXG52YXIgU2xpZGVyVG9vbHRpcCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciB2aXNpYmxlID0gcHJvcHMudmlzaWJsZTtcbiAgdmFyIGlubmVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgdG9vbHRpcFJlZiA9IHVzZUNvbWJpbmVkUmVmcyhyZWYsIGlubmVyUmVmKTtcbiAgdmFyIHJhZlJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcblxuICBmdW5jdGlvbiBjYW5jZWxLZWVwQWxpZ24oKSB7XG4gICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICByYWZSZWYuY3VycmVudCA9IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBrZWVwQWxpZ24oKSB7XG4gICAgcmFmUmVmLmN1cnJlbnQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRvb2x0aXBSZWYuY3VycmVudC5mb3JjZVBvcHVwQWxpZ24oKTtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIGtlZXBBbGlnbigpO1xuICAgIH0pO1xuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmlzaWJsZSkge1xuICAgICAga2VlcEFsaWduKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbmNlbEtlZXBBbGlnbigpO1xuICAgIH1cblxuICAgIHJldHVybiBjYW5jZWxLZWVwQWxpZ247XG4gIH0sIFt2aXNpYmxlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdG9vbHRpcFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgcmVmOiB0b29sdGlwUmVmXG4gIH0sIHByb3BzKSk7XG59KTtcbnZhciBfZGVmYXVsdCA9IFNsaWRlclRvb2x0aXA7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNTbGlkZXIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmMtc2xpZGVyXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfU2xpZGVyVG9vbHRpcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU2xpZGVyVG9vbHRpcFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIFNsaWRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcjtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgdmlzaWJsZXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0VmlzaWJsZXMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciB0b2dnbGVUb29sdGlwVmlzaWJsZSA9IGZ1bmN0aW9uIHRvZ2dsZVRvb2x0aXBWaXNpYmxlKGluZGV4LCB2aXNpYmxlKSB7XG4gICAgc2V0VmlzaWJsZXMoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgIHJldHVybiAoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKHt9LCBwcmV2KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgaW5kZXgsIHZpc2libGUpKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgZ2V0VG9vbHRpcFBsYWNlbWVudCA9IGZ1bmN0aW9uIGdldFRvb2x0aXBQbGFjZW1lbnQodG9vbHRpcFBsYWNlbWVudCwgdmVydGljYWwpIHtcbiAgICBpZiAodG9vbHRpcFBsYWNlbWVudCkge1xuICAgICAgcmV0dXJuIHRvb2x0aXBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJ0aWNhbCkge1xuICAgICAgcmV0dXJuICd0b3AnO1xuICAgIH1cblxuICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgfTtcblxuICB2YXIgaGFuZGxlV2l0aFRvb2x0aXAgPSBmdW5jdGlvbiBoYW5kbGVXaXRoVG9vbHRpcChfYSkge1xuICAgIHZhciB0b29sdGlwUHJlZml4Q2xzID0gX2EudG9vbHRpcFByZWZpeENscyxcbiAgICAgICAgcHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgICAgICBfYiA9IF9hLmluZm8sXG4gICAgICAgIHZhbHVlID0gX2IudmFsdWUsXG4gICAgICAgIGRyYWdnaW5nID0gX2IuZHJhZ2dpbmcsXG4gICAgICAgIGluZGV4ID0gX2IuaW5kZXgsXG4gICAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYiwgW1widmFsdWVcIiwgXCJkcmFnZ2luZ1wiLCBcImluZGV4XCJdKTtcblxuICAgIHZhciB0aXBGb3JtYXR0ZXIgPSBwcm9wcy50aXBGb3JtYXR0ZXIsXG4gICAgICAgIHRvb2x0aXBWaXNpYmxlID0gcHJvcHMudG9vbHRpcFZpc2libGUsXG4gICAgICAgIHRvb2x0aXBQbGFjZW1lbnQgPSBwcm9wcy50b29sdGlwUGxhY2VtZW50LFxuICAgICAgICBnZXRUb29sdGlwUG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRUb29sdGlwUG9wdXBDb250YWluZXIsXG4gICAgICAgIHZlcnRpY2FsID0gcHJvcHMudmVydGljYWw7XG4gICAgdmFyIGlzVGlwRm9ybWF0dGVyID0gdGlwRm9ybWF0dGVyID8gdmlzaWJsZXNbaW5kZXhdIHx8IGRyYWdnaW5nIDogZmFsc2U7XG4gICAgdmFyIHZpc2libGUgPSB0b29sdGlwVmlzaWJsZSB8fCB0b29sdGlwVmlzaWJsZSA9PT0gdW5kZWZpbmVkICYmIGlzVGlwRm9ybWF0dGVyO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU2xpZGVyVG9vbHRpcFtcImRlZmF1bHRcIl0sIHtcbiAgICAgIHByZWZpeENsczogdG9vbHRpcFByZWZpeENscyxcbiAgICAgIHRpdGxlOiB0aXBGb3JtYXR0ZXIgPyB0aXBGb3JtYXR0ZXIodmFsdWUpIDogJycsXG4gICAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgICAgcGxhY2VtZW50OiBnZXRUb29sdGlwUGxhY2VtZW50KHRvb2x0aXBQbGFjZW1lbnQsIHZlcnRpY2FsKSxcbiAgICAgIHRyYW5zaXRpb25OYW1lOiBcInpvb20tZG93blwiLFxuICAgICAga2V5OiBpbmRleCxcbiAgICAgIG92ZXJsYXlDbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdG9vbHRpcFwiKSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRUb29sdGlwUG9wdXBDb250YWluZXIgfHwgZ2V0UG9wdXBDb250YWluZXIgfHwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keTtcbiAgICAgIH1cbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNTbGlkZXIuSGFuZGxlLCAoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoe30sIHJlc3RQcm9wcywge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgIHJldHVybiB0b2dnbGVUb29sdGlwVmlzaWJsZShpbmRleCwgdHJ1ZSk7XG4gICAgICB9LFxuICAgICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICAgIHJldHVybiB0b2dnbGVUb29sdGlwVmlzaWJsZShpbmRleCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0pKSk7XG4gIH07XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMgPSBwcm9wcy50b29sdGlwUHJlZml4Q2xzLFxuICAgICAgcmFuZ2UgPSBwcm9wcy5yYW5nZSxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwidG9vbHRpcFByZWZpeENsc1wiLCBcInJhbmdlXCIsIFwiY2xhc3NOYW1lXCJdKTtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzbGlkZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgdG9vbHRpcFByZWZpeENscyA9IGdldFByZWZpeENscygndG9vbHRpcCcsIGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoY2xhc3NOYW1lLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJykpOyAvLyBtYWtlIHJldmVyc2UgZGVmYXVsdCBvbiBydGwgZGlyZWN0aW9uXG5cbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcgJiYgIXJlc3RQcm9wcy52ZXJ0aWNhbCkge1xuICAgIHJlc3RQcm9wcy5yZXZlcnNlID0gIXJlc3RQcm9wcy5yZXZlcnNlO1xuICB9XG5cbiAgaWYgKHJhbmdlKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1NsaWRlci5SYW5nZSwgKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKHt9LCByZXN0UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xzLFxuICAgICAgcmVmOiByZWYsXG4gICAgICBoYW5kbGU6IGZ1bmN0aW9uIGhhbmRsZShpbmZvKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVXaXRoVG9vbHRpcCh7XG4gICAgICAgICAgdG9vbHRpcFByZWZpeENsczogdG9vbHRpcFByZWZpeENscyxcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBpbmZvOiBpbmZvXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1NsaWRlcltcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSh7fSwgcmVzdFByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBjbHMsXG4gICAgcmVmOiByZWYsXG4gICAgaGFuZGxlOiBmdW5jdGlvbiBoYW5kbGUoaW5mbykge1xuICAgICAgcmV0dXJuIGhhbmRsZVdpdGhUb29sdGlwKHtcbiAgICAgICAgdG9vbHRpcFByZWZpeENsczogdG9vbHRpcFByZWZpeENscyxcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGluZm86IGluZm9cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSkpO1xufSk7XG5TbGlkZXIuZGlzcGxheU5hbWUgPSAnU2xpZGVyJztcblNsaWRlci5kZWZhdWx0UHJvcHMgPSB7XG4gIHRpcEZvcm1hdHRlcjogZnVuY3Rpb24gdGlwRm9ybWF0dGVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZS50b1N0cmluZygpIDogJyc7XG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSBTbGlkZXI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gSXRlbTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF8gPSByZXF1aXJlKFwiLlwiKTtcblxudmFyIHNwYWNlU2l6ZSA9IHtcbiAgc21hbGw6IDgsXG4gIG1pZGRsZTogMTYsXG4gIGxhcmdlOiAyNFxufTtcblxuZnVuY3Rpb24gSXRlbShfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uLFxuICAgICAgaW5kZXggPSBfcmVmLmluZGV4LFxuICAgICAgc2l6ZSA9IF9yZWYuc2l6ZSxcbiAgICAgIG1hcmdpbkRpcmVjdGlvbiA9IF9yZWYubWFyZ2luRGlyZWN0aW9uLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgbGF0ZXN0SW5kZXggPSBSZWFjdC51c2VDb250ZXh0KF8uTGFzdEluZGV4Q29udGV4dCk7XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsIHx8IGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgc3R5bGU6IGluZGV4ID49IGxhdGVzdEluZGV4ID8ge30gOiAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBkaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcgPyAnbWFyZ2luQm90dG9tJyA6IG1hcmdpbkRpcmVjdGlvbiwgdHlwZW9mIHNpemUgPT09ICdzdHJpbmcnID8gc3BhY2VTaXplW3NpemVdIDogc2l6ZSlcbiAgfSwgY2hpbGRyZW4pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXhwb3J0cy5MYXN0SW5kZXhDb250ZXh0ID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfdG9BcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0NoaWxkcmVuL3RvQXJyYXlcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9JdGVtID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JdGVtXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBMYXN0SW5kZXhDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoMCk7XG5leHBvcnRzLkxhc3RJbmRleENvbnRleHQgPSBMYXN0SW5kZXhDb250ZXh0O1xuXG52YXIgU3BhY2UgPSBmdW5jdGlvbiBTcGFjZShwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICBzcGFjZSA9IF9SZWFjdCR1c2VDb250ZXh0LnNwYWNlLFxuICAgICAgZGlyZWN0aW9uQ29uZmlnID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gIHZhciBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICBzaXplID0gX3Byb3BzJHNpemUgPT09IHZvaWQgMCA/IChzcGFjZSA9PT0gbnVsbCB8fCBzcGFjZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3BhY2Uuc2l6ZSkgfHwgJ3NtYWxsJyA6IF9wcm9wcyRzaXplLFxuICAgICAgYWxpZ24gPSBwcm9wcy5hbGlnbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBfcHJvcHMkZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgICAgZGlyZWN0aW9uID0gX3Byb3BzJGRpcmVjdGlvbiA9PT0gdm9pZCAwID8gJ2hvcml6b250YWwnIDogX3Byb3BzJGRpcmVjdGlvbixcbiAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInNpemVcIiwgXCJhbGlnblwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiZGlyZWN0aW9uXCIsIFwicHJlZml4Q2xzXCJdKTtcblxuICB2YXIgY2hpbGROb2RlcyA9ICgwLCBfdG9BcnJheVtcImRlZmF1bHRcIl0pKGNoaWxkcmVuLCB7XG4gICAga2VlcEVtcHR5OiB0cnVlXG4gIH0pO1xuXG4gIGlmIChjaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1lcmdlZEFsaWduID0gYWxpZ24gPT09IHVuZGVmaW5lZCAmJiBkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICdjZW50ZXInIDogYWxpZ247XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NwYWNlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGNuID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoZGlyZWN0aW9uKSwgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb25Db25maWcgPT09ICdydGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hbGlnbi1cIikuY29uY2F0KG1lcmdlZEFsaWduKSwgbWVyZ2VkQWxpZ24pLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHZhciBpdGVtQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICB2YXIgbWFyZ2luRGlyZWN0aW9uID0gZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyA/ICdtYXJnaW5MZWZ0JyA6ICdtYXJnaW5SaWdodCc7IC8vIENhbGN1bGF0ZSBsYXRlc3Qgb25lXG5cbiAgdmFyIGxhdGVzdEluZGV4ID0gMDtcbiAgdmFyIG5vZGVzID0gY2hpbGROb2Rlcy5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpKSB7XG4gICAgaWYgKGNoaWxkICE9PSBudWxsICYmIGNoaWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxhdGVzdEluZGV4ID0gaTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG5cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfSXRlbVtcImRlZmF1bHRcIl0sIHtcbiAgICAgIGNsYXNzTmFtZTogaXRlbUNsYXNzTmFtZSxcbiAgICAgIGtleTogXCJcIi5jb25jYXQoaXRlbUNsYXNzTmFtZSwgXCItXCIpLmNvbmNhdChpKSxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgc2l6ZTogc2l6ZSxcbiAgICAgIGluZGV4OiBpLFxuICAgICAgbWFyZ2luRGlyZWN0aW9uOiBtYXJnaW5EaXJlY3Rpb25cbiAgICB9LCBjaGlsZCk7XG4gICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgY2xhc3NOYW1lOiBjblxuICB9LCBvdGhlclByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGFzdEluZGV4Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBsYXRlc3RJbmRleFxuICB9LCBub2RlcykpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gU3BhY2U7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm9taXQuanNcIikpO1xuXG52YXIgX2RlYm91bmNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwibG9kYXNoL2RlYm91bmNlXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfdHlwZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC90eXBlXCIpO1xuXG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWFjdE5vZGVcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgU3BpblNpemVzID0gKDAsIF90eXBlLnR1cGxlKSgnc21hbGwnLCAnZGVmYXVsdCcsICdsYXJnZScpOyAvLyBSZW5kZXIgaW5kaWNhdG9yXG5cbnZhciBkZWZhdWx0SW5kaWNhdG9yID0gbnVsbDtcblxuZnVuY3Rpb24gcmVuZGVySW5kaWNhdG9yKHByZWZpeENscywgcHJvcHMpIHtcbiAgdmFyIGluZGljYXRvciA9IHByb3BzLmluZGljYXRvcjtcbiAgdmFyIGRvdENsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZG90XCIpOyAvLyBzaG91bGQgbm90IGJlIHJlbmRlciBkZWZhdWx0IGluZGljYXRvciB3aGVuIGluZGljYXRvciB2YWx1ZSBpcyBudWxsXG5cbiAgaWYgKGluZGljYXRvciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCgwLCBfcmVhY3ROb2RlLmlzVmFsaWRFbGVtZW50KShpbmRpY2F0b3IpKSB7XG4gICAgcmV0dXJuICgwLCBfcmVhY3ROb2RlLmNsb25lRWxlbWVudCkoaW5kaWNhdG9yLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKGluZGljYXRvci5wcm9wcy5jbGFzc05hbWUsIGRvdENsYXNzTmFtZSlcbiAgICB9KTtcbiAgfVxuXG4gIGlmICgoMCwgX3JlYWN0Tm9kZS5pc1ZhbGlkRWxlbWVudCkoZGVmYXVsdEluZGljYXRvcikpIHtcbiAgICByZXR1cm4gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShkZWZhdWx0SW5kaWNhdG9yLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKGRlZmF1bHRJbmRpY2F0b3IucHJvcHMuY2xhc3NOYW1lLCBkb3RDbGFzc05hbWUpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKGRvdENsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kb3Qtc3BpblwiKSlcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZG90LWl0ZW1cIilcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRvdC1pdGVtXCIpXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kb3QtaXRlbVwiKVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZG90LWl0ZW1cIilcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxheShzcGlubmluZywgZGVsYXkpIHtcbiAgcmV0dXJuICEhc3Bpbm5pbmcgJiYgISFkZWxheSAmJiAhaXNOYU4oTnVtYmVyKGRlbGF5KSk7XG59XG5cbnZhciBTcGluID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoU3BpbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoU3Bpbik7XG5cbiAgZnVuY3Rpb24gU3Bpbihwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgU3Bpbik7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfdGhpcy5kZWJvdW5jaWZ5VXBkYXRlU3Bpbm5pbmcgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgIHZhciBfcmVmID0gcHJvcHMgfHwgX3RoaXMucHJvcHMsXG4gICAgICAgICAgZGVsYXkgPSBfcmVmLmRlbGF5O1xuXG4gICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgX3RoaXMuY2FuY2VsRXhpc3RpbmdTcGluKCk7XG5cbiAgICAgICAgX3RoaXMudXBkYXRlU3Bpbm5pbmcgPSAoMCwgX2RlYm91bmNlW1wiZGVmYXVsdFwiXSkoX3RoaXMub3JpZ2luYWxVcGRhdGVTcGlubmluZywgZGVsYXkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy51cGRhdGVTcGlubmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzcGlubmluZyA9IF90aGlzLnByb3BzLnNwaW5uaW5nO1xuICAgICAgdmFyIGN1cnJlbnRTcGlubmluZyA9IF90aGlzLnN0YXRlLnNwaW5uaW5nO1xuXG4gICAgICBpZiAoY3VycmVudFNwaW5uaW5nICE9PSBzcGlubmluZykge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc3Bpbm5pbmc6IHNwaW5uaW5nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJTcGluID0gZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmMi5nZXRQcmVmaXhDbHMsXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3JlZjIuZGlyZWN0aW9uO1xuXG4gICAgICB2YXIgX2EgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgICAgICAgIHNpemUgPSBfYS5zaXplLFxuICAgICAgICAgIHRpcCA9IF9hLnRpcCxcbiAgICAgICAgICB3cmFwcGVyQ2xhc3NOYW1lID0gX2Eud3JhcHBlckNsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZSA9IF9hLnN0eWxlLFxuICAgICAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcInRpcFwiLCBcIndyYXBwZXJDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgICAgIHZhciBzcGlubmluZyA9IF90aGlzLnN0YXRlLnNwaW5uaW5nO1xuICAgICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc3BpbicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgICB2YXIgc3BpbkNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21cIiksIHNpemUgPT09ICdzbWFsbCcpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxnXCIpLCBzaXplID09PSAnbGFyZ2UnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zcGlubmluZ1wiKSwgc3Bpbm5pbmcpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctdGV4dFwiKSwgISF0aXApLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTsgLy8gZml4IGh0dHBzOi8vZmIubWUvcmVhY3QtdW5rbm93bi1wcm9wXG5cbiAgICAgIHZhciBkaXZQcm9wcyA9ICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKHJlc3RQcm9wcywgWydzcGlubmluZycsICdkZWxheScsICdpbmRpY2F0b3InXSk7XG4gICAgICB2YXIgc3BpbkVsZW1lbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGRpdlByb3BzLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgY2xhc3NOYW1lOiBzcGluQ2xhc3NOYW1lXG4gICAgICB9KSwgcmVuZGVySW5kaWNhdG9yKHByZWZpeENscywgX3RoaXMucHJvcHMpLCB0aXAgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10ZXh0XCIpXG4gICAgICB9LCB0aXApIDogbnVsbCk7XG5cbiAgICAgIGlmIChfdGhpcy5pc05lc3RlZFBhdHRlcm4oKSkge1xuICAgICAgICB2YXIgY29udGFpbmVyQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250YWluZXJcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmx1clwiKSwgc3Bpbm5pbmcpKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgZGl2UHJvcHMsIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmVzdGVkLWxvYWRpbmdcIiksIHdyYXBwZXJDbGFzc05hbWUpXG4gICAgICAgIH0pLCBzcGlubmluZyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAga2V5OiBcImxvYWRpbmdcIlxuICAgICAgICB9LCBzcGluRWxlbWVudCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNvbnRhaW5lckNsYXNzTmFtZSxcbiAgICAgICAgICBrZXk6IFwiY29udGFpbmVyXCJcbiAgICAgICAgfSwgX3RoaXMucHJvcHMuY2hpbGRyZW4pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNwaW5FbGVtZW50O1xuICAgIH07XG5cbiAgICB2YXIgc3Bpbm5pbmcgPSBwcm9wcy5zcGlubmluZyxcbiAgICAgICAgZGVsYXkgPSBwcm9wcy5kZWxheTtcbiAgICB2YXIgc2hvdWxkQmVEZWxheWVkID0gc2hvdWxkRGVsYXkoc3Bpbm5pbmcsIGRlbGF5KTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHNwaW5uaW5nOiBzcGlubmluZyAmJiAhc2hvdWxkQmVEZWxheWVkXG4gICAgfTtcbiAgICBfdGhpcy5vcmlnaW5hbFVwZGF0ZVNwaW5uaW5nID0gX3RoaXMudXBkYXRlU3Bpbm5pbmc7XG5cbiAgICBfdGhpcy5kZWJvdW5jaWZ5VXBkYXRlU3Bpbm5pbmcocHJvcHMpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShTcGluLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMudXBkYXRlU3Bpbm5pbmcoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuZGVib3VuY2lmeVVwZGF0ZVNwaW5uaW5nKCk7XG4gICAgICB0aGlzLnVwZGF0ZVNwaW5uaW5nKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5jYW5jZWxFeGlzdGluZ1NwaW4oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuY2VsRXhpc3RpbmdTcGluXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbEV4aXN0aW5nU3BpbigpIHtcbiAgICAgIHZhciB1cGRhdGVTcGlubmluZyA9IHRoaXMudXBkYXRlU3Bpbm5pbmc7XG5cbiAgICAgIGlmICh1cGRhdGVTcGlubmluZyAmJiB1cGRhdGVTcGlubmluZy5jYW5jZWwpIHtcbiAgICAgICAgdXBkYXRlU3Bpbm5pbmcuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzTmVzdGVkUGF0dGVyblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc05lc3RlZFBhdHRlcm4oKSB7XG4gICAgICByZXR1cm4gISEodGhpcy5wcm9wcyAmJiB0aGlzLnByb3BzLmNoaWxkcmVuKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIHRoaXMucmVuZGVyU3Bpbik7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwic2V0RGVmYXVsdEluZGljYXRvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREZWZhdWx0SW5kaWNhdG9yKGluZGljYXRvcikge1xuICAgICAgZGVmYXVsdEluZGljYXRvciA9IGluZGljYXRvcjtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFNwaW47XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblNwaW4uZGVmYXVsdFByb3BzID0ge1xuICBzcGlubmluZzogdHJ1ZSxcbiAgc2l6ZTogJ2RlZmF1bHQnLFxuICB3cmFwcGVyQ2xhc3NOYW1lOiAnJ1xufTtcbnZhciBfZGVmYXVsdCA9IFNwaW47XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9TdGF0aXN0aWMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0YXRpc3RpY1wiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcblxudmFyIF9yZWFjdE5vZGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvcmVhY3ROb2RlXCIpO1xuXG52YXIgUkVGUkVTSF9JTlRFUlZBTCA9IDEwMDAgLyAzMDtcblxuZnVuY3Rpb24gZ2V0VGltZSh2YWx1ZSkge1xuICByZXR1cm4gbmV3IERhdGUodmFsdWUpLmdldFRpbWUoKTtcbn1cblxudmFyIENvdW50ZG93biA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKENvdW50ZG93biwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoQ291bnRkb3duKTtcblxuICBmdW5jdGlvbiBDb3VudGRvd24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBDb3VudGRvd24pO1xuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBfdGhpcy5zeW5jVGltZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBfdGhpcy5wcm9wcy52YWx1ZTtcbiAgICAgIHZhciB0aW1lc3RhbXAgPSBnZXRUaW1lKHZhbHVlKTtcblxuICAgICAgaWYgKHRpbWVzdGFtcCA+PSBEYXRlLm5vdygpKSB7XG4gICAgICAgIF90aGlzLnN0YXJ0VGltZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnN0b3BUaW1lcigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zdGFydFRpbWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmNvdW50ZG93bklkKSByZXR1cm47XG4gICAgICBfdGhpcy5jb3VudGRvd25JZCA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgICB9LCBSRUZSRVNIX0lOVEVSVkFMKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RvcFRpbWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb25GaW5pc2ggPSBfdGhpcyRwcm9wcy5vbkZpbmlzaCxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHByb3BzLnZhbHVlO1xuXG4gICAgICBpZiAoX3RoaXMuY291bnRkb3duSWQpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChfdGhpcy5jb3VudGRvd25JZCk7XG4gICAgICAgIF90aGlzLmNvdW50ZG93bklkID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgdGltZXN0YW1wID0gZ2V0VGltZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKG9uRmluaXNoICYmIHRpbWVzdGFtcCA8IERhdGUubm93KCkpIHtcbiAgICAgICAgICBvbkZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmZvcm1hdENvdW50ZG93biA9IGZ1bmN0aW9uICh2YWx1ZSwgY29uZmlnKSB7XG4gICAgICB2YXIgZm9ybWF0ID0gX3RoaXMucHJvcHMuZm9ybWF0O1xuICAgICAgcmV0dXJuICgwLCBfdXRpbHMuZm9ybWF0Q291bnRkb3duKSh2YWx1ZSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgY29uZmlnKSwge1xuICAgICAgICBmb3JtYXQ6IGZvcm1hdFxuICAgICAgfSkpO1xuICAgIH07IC8vIENvdW50ZG93biBkbyBub3QgbmVlZCBkaXNwbGF5IHRoZSB0aW1lc3RhbXBcblxuXG4gICAgX3RoaXMudmFsdWVSZW5kZXIgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuICgwLCBfcmVhY3ROb2RlLmNsb25lRWxlbWVudCkobm9kZSwge1xuICAgICAgICB0aXRsZTogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShDb3VudGRvd24sIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zeW5jVGltZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuc3luY1RpbWVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU3RhdGlzdGljW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgdmFsdWVSZW5kZXI6IHRoaXMudmFsdWVSZW5kZXJcbiAgICAgIH0sIHRoaXMucHJvcHMsIHtcbiAgICAgICAgZm9ybWF0dGVyOiB0aGlzLmZvcm1hdENvdW50ZG93blxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ291bnRkb3duO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Db3VudGRvd24uZGVmYXVsdFByb3BzID0ge1xuICBmb3JtYXQ6ICdISDptbTpzcydcbn07XG52YXIgX2RlZmF1bHQgPSBDb3VudGRvd247XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3BhZEVuZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImxvZGFzaC9wYWRFbmRcIikpO1xuXG52YXIgU3RhdGlzdGljTnVtYmVyID0gZnVuY3Rpb24gU3RhdGlzdGljTnVtYmVyKHByb3BzKSB7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgZm9ybWF0dGVyID0gcHJvcHMuZm9ybWF0dGVyLFxuICAgICAgcHJlY2lzaW9uID0gcHJvcHMucHJlY2lzaW9uLFxuICAgICAgZGVjaW1hbFNlcGFyYXRvciA9IHByb3BzLmRlY2ltYWxTZXBhcmF0b3IsXG4gICAgICBfcHJvcHMkZ3JvdXBTZXBhcmF0b3IgPSBwcm9wcy5ncm91cFNlcGFyYXRvcixcbiAgICAgIGdyb3VwU2VwYXJhdG9yID0gX3Byb3BzJGdyb3VwU2VwYXJhdG9yID09PSB2b2lkIDAgPyAnJyA6IF9wcm9wcyRncm91cFNlcGFyYXRvcixcbiAgICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscztcbiAgdmFyIHZhbHVlTm9kZTtcblxuICBpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEN1c3RvbWl6ZSBmb3JtYXR0ZXJcbiAgICB2YWx1ZU5vZGUgPSBmb3JtYXR0ZXIodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIC8vIEludGVybmFsIGZvcm1hdHRlclxuICAgIHZhciB2YWwgPSBTdHJpbmcodmFsdWUpO1xuICAgIHZhciBjZWxscyA9IHZhbC5tYXRjaCgvXigtPykoXFxkKikoXFwuKFxcZCspKT8kLyk7IC8vIFByb2Nlc3MgaWYgaWxsZWdhbCBudW1iZXJcblxuICAgIGlmICghY2VsbHMgfHwgdmFsID09PSAnLScpIHtcbiAgICAgIHZhbHVlTm9kZSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5lZ2F0aXZlID0gY2VsbHNbMV07XG5cbiAgICAgIHZhciBfaW50ID0gY2VsbHNbMl0gfHwgJzAnO1xuXG4gICAgICB2YXIgZGVjaW1hbCA9IGNlbGxzWzRdIHx8ICcnO1xuICAgICAgX2ludCA9IF9pbnQucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgZ3JvdXBTZXBhcmF0b3IpO1xuXG4gICAgICBpZiAodHlwZW9mIHByZWNpc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgZGVjaW1hbCA9ICgwLCBfcGFkRW5kW1wiZGVmYXVsdFwiXSkoZGVjaW1hbCwgcHJlY2lzaW9uLCAnMCcpLnNsaWNlKDAsIHByZWNpc2lvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWNpbWFsKSB7XG4gICAgICAgIGRlY2ltYWwgPSBcIlwiLmNvbmNhdChkZWNpbWFsU2VwYXJhdG9yKS5jb25jYXQoZGVjaW1hbCk7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlTm9kZSA9IFsvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBrZXk6IFwiaW50XCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LXZhbHVlLWludFwiKVxuICAgICAgfSwgbmVnYXRpdmUsIF9pbnQpLCBkZWNpbWFsICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGtleTogXCJkZWNpbWFsXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LXZhbHVlLWRlY2ltYWxcIilcbiAgICAgIH0sIGRlY2ltYWwpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudC12YWx1ZVwiKVxuICB9LCB2YWx1ZU5vZGUpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gU3RhdGlzdGljTnVtYmVyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbnRleHQgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHRcIik7XG5cbnZhciBfTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9OdW1iZXJcIikpO1xuXG52YXIgU3RhdGlzdGljID0gZnVuY3Rpb24gU3RhdGlzdGljKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgdmFsdWVTdHlsZSA9IHByb3BzLnZhbHVlU3R5bGUsXG4gICAgICBfcHJvcHMkdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIHZhbHVlID0gX3Byb3BzJHZhbHVlID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHZhbHVlLFxuICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIHZhbHVlUmVuZGVyID0gcHJvcHMudmFsdWVSZW5kZXIsXG4gICAgICBwcmVmaXggPSBwcm9wcy5wcmVmaXgsXG4gICAgICBzdWZmaXggPSBwcm9wcy5zdWZmaXgsXG4gICAgICBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgICBvbk1vdXNlRW50ZXIgPSBwcm9wcy5vbk1vdXNlRW50ZXIsXG4gICAgICBvbk1vdXNlTGVhdmUgPSBwcm9wcy5vbk1vdXNlTGVhdmU7XG4gIHZhciB2YWx1ZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTnVtYmVyW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB2YWx1ZVxuICB9KSk7XG4gIHZhciBjbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNscyxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmVcbiAgfSwgdGl0bGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aXRsZVwiKVxuICB9LCB0aXRsZSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZTogdmFsdWVTdHlsZSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKVxuICB9LCBwcmVmaXggJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudC1wcmVmaXhcIilcbiAgfSwgcHJlZml4KSwgdmFsdWVSZW5kZXIgPyB2YWx1ZVJlbmRlcih2YWx1ZU5vZGUpIDogdmFsdWVOb2RlLCBzdWZmaXggJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudC1zdWZmaXhcIilcbiAgfSwgc3VmZml4KSkpO1xufTtcblxuU3RhdGlzdGljLmRlZmF1bHRQcm9wcyA9IHtcbiAgZGVjaW1hbFNlcGFyYXRvcjogJy4nLFxuICBncm91cFNlcGFyYXRvcjogJywnXG59O1xudmFyIFdyYXBwZXJTdGF0aXN0aWMgPSAoMCwgX2NvbnRleHQud2l0aENvbmZpZ0NvbnN1bWVyKSh7XG4gIHByZWZpeENsczogJ3N0YXRpc3RpYydcbn0pKFN0YXRpc3RpYyk7XG52YXIgX2RlZmF1bHQgPSBXcmFwcGVyU3RhdGlzdGljO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9TdGF0aXN0aWMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0YXRpc3RpY1wiKSk7XG5cbnZhciBfQ291bnRkb3duID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3VudGRvd25cIikpO1xuXG5fU3RhdGlzdGljW1wiZGVmYXVsdFwiXS5Db3VudGRvd24gPSBfQ291bnRkb3duW1wiZGVmYXVsdFwiXTtcbnZhciBfZGVmYXVsdCA9IF9TdGF0aXN0aWNbXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmZvcm1hdFRpbWVTdHIgPSBmb3JtYXRUaW1lU3RyO1xuZXhwb3J0cy5mb3JtYXRDb3VudGRvd24gPSBmb3JtYXRDb3VudGRvd247XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX3BhZFN0YXJ0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwibG9kYXNoL3BhZFN0YXJ0XCIpKTtcblxuLy8gQ291bnRkb3duXG52YXIgdGltZVVuaXRzID0gW1snWScsIDEwMDAgKiA2MCAqIDYwICogMjQgKiAzNjVdLCBbJ00nLCAxMDAwICogNjAgKiA2MCAqIDI0ICogMzBdLCBbJ0QnLCAxMDAwICogNjAgKiA2MCAqIDI0XSwgWydIJywgMTAwMCAqIDYwICogNjBdLCBbJ20nLCAxMDAwICogNjBdLCBbJ3MnLCAxMDAwXSwgWydTJywgMV1dO1xuXG5mdW5jdGlvbiBmb3JtYXRUaW1lU3RyKGR1cmF0aW9uLCBmb3JtYXQpIHtcbiAgdmFyIGxlZnREdXJhdGlvbiA9IGR1cmF0aW9uO1xuICB2YXIgZXNjYXBlUmVnZXggPSAvXFxbW15cXF1dKl0vZztcbiAgdmFyIGtlZXBMaXN0ID0gKGZvcm1hdC5tYXRjaChlc2NhcGVSZWdleCkgfHwgW10pLm1hcChmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5zbGljZSgxLCAtMSk7XG4gIH0pO1xuICB2YXIgdGVtcGxhdGVUZXh0ID0gZm9ybWF0LnJlcGxhY2UoZXNjYXBlUmVnZXgsICdbXScpO1xuICB2YXIgcmVwbGFjZWRUZXh0ID0gdGltZVVuaXRzLnJlZHVjZShmdW5jdGlvbiAoY3VycmVudCwgX3JlZikge1xuICAgIHZhciBfcmVmMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfcmVmLCAyKSxcbiAgICAgICAgbmFtZSA9IF9yZWYyWzBdLFxuICAgICAgICB1bml0ID0gX3JlZjJbMV07XG5cbiAgICBpZiAoY3VycmVudC5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgdmFyIHZhbHVlID0gTWF0aC5mbG9vcihsZWZ0RHVyYXRpb24gLyB1bml0KTtcbiAgICAgIGxlZnREdXJhdGlvbiAtPSB2YWx1ZSAqIHVuaXQ7XG4gICAgICByZXR1cm4gY3VycmVudC5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcIi5jb25jYXQobmFtZSwgXCIrXCIpLCAnZycpLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgdmFyIGxlbiA9IG1hdGNoLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuICgwLCBfcGFkU3RhcnRbXCJkZWZhdWx0XCJdKSh2YWx1ZS50b1N0cmluZygpLCBsZW4sICcwJyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfSwgdGVtcGxhdGVUZXh0KTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgcmV0dXJuIHJlcGxhY2VkVGV4dC5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hdGNoID0ga2VlcExpc3RbaW5kZXhdO1xuICAgIGluZGV4ICs9IDE7XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0Q291bnRkb3duKHZhbHVlLCBjb25maWcpIHtcbiAgdmFyIF9jb25maWckZm9ybWF0ID0gY29uZmlnLmZvcm1hdCxcbiAgICAgIGZvcm1hdCA9IF9jb25maWckZm9ybWF0ID09PSB2b2lkIDAgPyAnJyA6IF9jb25maWckZm9ybWF0O1xuICB2YXIgdGFyZ2V0ID0gbmV3IERhdGUodmFsdWUpLmdldFRpbWUoKTtcbiAgdmFyIGN1cnJlbnQgPSBEYXRlLm5vdygpO1xuICB2YXIgZGlmZiA9IE1hdGgubWF4KHRhcmdldCAtIGN1cnJlbnQsIDApO1xuICByZXR1cm4gZm9ybWF0VGltZVN0cihkaWZmLCBmb3JtYXQpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfcmNTdGVwcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXN0ZXBzXCIpKTtcblxudmFyIF9DaGVja091dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2hlY2tPdXRsaW5lZFwiKSk7XG5cbnZhciBfQ2xvc2VPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlT3V0bGluZWRcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfcHJvZ3Jlc3MgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9wcm9ncmVzc1wiKSk7XG5cbnZhciBTdGVwcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKFN0ZXBzLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShTdGVwcyk7XG5cbiAgZnVuY3Rpb24gU3RlcHMoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBTdGVwcyk7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIF90aGlzLnJlbmRlclN0ZXBzID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscyxcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbjtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3N0ZXBzJywgX3RoaXMucHJvcHMucHJlZml4Q2xzKTtcbiAgICAgIHZhciBpY29uUHJlZml4ID0gZ2V0UHJlZml4Q2xzKCcnLCBfdGhpcy5wcm9wcy5pY29uUHJlZml4KTtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHBlcmNlbnQgPSBfdGhpcyRwcm9wcy5wZXJjZW50LFxuICAgICAgICAgIHNpemUgPSBfdGhpcyRwcm9wcy5zaXplO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKCgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX3RoaXMucHJvcHMuY2xhc3NOYW1lKTtcbiAgICAgIHZhciBpY29ucyA9IHtcbiAgICAgICAgZmluaXNoOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2hlY2tPdXRsaW5lZFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZmluaXNoLWljb25cIilcbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2xvc2VPdXRsaW5lZFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZXJyb3ItaWNvblwiKVxuICAgICAgICB9KVxuICAgICAgfTtcblxuICAgICAgdmFyIHN0ZXBJY29uUmVuZGVyID0gZnVuY3Rpb24gc3RlcEljb25SZW5kZXIoX3JlZjIpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfcmVmMi5ub2RlLFxuICAgICAgICAgICAgc3RhdHVzID0gX3JlZjIuc3RhdHVzO1xuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdwcm9jZXNzJyAmJiBwZXJjZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBjdXJyZW50bHkgaXQncyBoYXJkLWNvZGVkLCBzaW5jZSB3ZSBjYW4ndCBlYXNpbHkgcmVhZCB0aGUgYWN0dWFsbHkgd2lkdGggb2YgaWNvblxuICAgICAgICAgIHZhciBwcm9ncmVzc1dpZHRoID0gc2l6ZSA9PT0gJ3NtYWxsJyA/IDMyIDogNDA7XG4gICAgICAgICAgdmFyIGljb25XaXRoUHJvZ3Jlc3MgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJvZ3Jlc3MtaWNvblwiKVxuICAgICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9wcm9ncmVzc1tcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwiY2lyY2xlXCIsXG4gICAgICAgICAgICBwZXJjZW50OiBwZXJjZW50LFxuICAgICAgICAgICAgd2lkdGg6IHByb2dyZXNzV2lkdGgsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogNCxcbiAgICAgICAgICAgIGZvcm1hdDogZnVuY3Rpb24gZm9ybWF0KCkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSwgbm9kZSk7XG4gICAgICAgICAgcmV0dXJuIGljb25XaXRoUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNTdGVwc1tcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIGljb25zOiBpY29uc1xuICAgICAgfSwgKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkoX3RoaXMucHJvcHMsIFsncHJvZ3Jlc3MnXSksIHtcbiAgICAgICAgc3RlcEljb246IHN0ZXBJY29uUmVuZGVyLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgaWNvblByZWZpeDogaWNvblByZWZpeCxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShTdGVwcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIHRoaXMucmVuZGVyU3RlcHMpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gU3RlcHM7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU3RlcHM7XG5TdGVwcy5TdGVwID0gX3JjU3RlcHNbXCJkZWZhdWx0XCJdLlN0ZXA7XG5TdGVwcy5kZWZhdWx0UHJvcHMgPSB7XG4gIGN1cnJlbnQ6IDBcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjU3dpdGNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtc3dpdGNoXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfTG9hZGluZ091dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvTG9hZGluZ091dGxpbmVkXCIpKTtcblxudmFyIF93YXZlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvd2F2ZVwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX1NpemVDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0XCIpKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgU3dpdGNoID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9hLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgICBjdXN0b21pemVTaXplID0gX2Euc2l6ZSxcbiAgICAgIGxvYWRpbmcgPSBfYS5sb2FkaW5nLFxuICAgICAgX2EkY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgICAgY2xhc3NOYW1lID0gX2EkY2xhc3NOYW1lID09PSB2b2lkIDAgPyAnJyA6IF9hJGNsYXNzTmFtZSxcbiAgICAgIGRpc2FibGVkID0gX2EuZGlzYWJsZWQsXG4gICAgICBwcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwic2l6ZVwiLCBcImxvYWRpbmdcIiwgXCJjbGFzc05hbWVcIiwgXCJkaXNhYmxlZFwiXSk7XG5cbiAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoJ2NoZWNrZWQnIGluIHByb3BzIHx8ICEoJ3ZhbHVlJyBpbiBwcm9wcyksICdTd2l0Y2gnLCAnYHZhbHVlYCBpcyBub3QgYSB2YWxpZCBwcm9wLCBkbyB5b3UgbWVhbiBgY2hlY2tlZGA/Jyk7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIHNpemUgPSBSZWFjdC51c2VDb250ZXh0KF9TaXplQ29udGV4dFtcImRlZmF1bHRcIl0pO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzd2l0Y2gnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgbG9hZGluZ0ljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZVwiKVxuICB9LCBsb2FkaW5nICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Mb2FkaW5nT3V0bGluZWRbXCJkZWZhdWx0XCJdLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmctaWNvblwiKVxuICB9KSk7XG4gIHZhciBjbGFzc2VzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21hbGxcIiksIChjdXN0b21pemVTaXplIHx8IHNpemUpID09PSAnc21hbGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sb2FkaW5nXCIpLCBsb2FkaW5nKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfd2F2ZVtcImRlZmF1bHRcIl0sIHtcbiAgICBpbnNlcnRFeHRyYU5vZGU6IHRydWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjU3dpdGNoW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQgfHwgbG9hZGluZyxcbiAgICByZWY6IHJlZixcbiAgICBsb2FkaW5nSWNvbjogbG9hZGluZ0ljb25cbiAgfSkpKTtcbn0pO1xuU3dpdGNoLl9fQU5UX1NXSVRDSCA9IHRydWU7XG5Td2l0Y2guZGlzcGxheU5hbWUgPSAnU3dpdGNoJztcbnZhciBfZGVmYXVsdCA9IFN3aXRjaDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgc3ludGFjdGljIHN1Z2FyIGZvciBgY29sdW1uc2AgcHJvcC5cbiAqIFNvIEhPQyB3aWxsIG5vdCB3b3JrIG9uIHRoaXMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gQ29sdW1uKF8pIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBfZGVmYXVsdCA9IENvbHVtbjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgc3ludGFjdGljIHN1Z2FyIGZvciBgY29sdW1uc2AgcHJvcC5cbiAqIFNvIEhPQyB3aWxsIG5vdCB3b3JrIG9uIHRoaXMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gQ29sdW1uR3JvdXAoXykge1xuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIF9kZWZhdWx0ID0gQ29sdW1uR3JvdXA7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxuZnVuY3Rpb24gcmVuZGVyRXhwYW5kSWNvbihsb2NhbGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGV4cGFuZEljb24oX3JlZikge1xuICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgICAgb25FeHBhbmQgPSBfcmVmLm9uRXhwYW5kLFxuICAgICAgICByZWNvcmQgPSBfcmVmLnJlY29yZCxcbiAgICAgICAgZXhwYW5kZWQgPSBfcmVmLmV4cGFuZGVkLFxuICAgICAgICBleHBhbmRhYmxlID0gX3JlZi5leHBhbmRhYmxlO1xuICAgIHZhciBpY29uUHJlZml4ID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctZXhwYW5kLWljb25cIik7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgb25FeHBhbmQocmVjb3JkLCBlKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKGljb25QcmVmaXgsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpY29uUHJlZml4LCBcIi1zcGFjZWRcIiksICFleHBhbmRhYmxlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoaWNvblByZWZpeCwgXCItZXhwYW5kZWRcIiksIGV4cGFuZGFibGUgJiYgZXhwYW5kZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpY29uUHJlZml4LCBcIi1jb2xsYXBzZWRcIiksIGV4cGFuZGFibGUgJiYgIWV4cGFuZGVkKSwgX2NsYXNzTmFtZXMpKSxcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiBleHBhbmRlZCA/IGxvY2FsZS5jb2xsYXBzZSA6IGxvY2FsZS5leHBhbmRcbiAgICB9KTtcbiAgfTtcbn1cblxudmFyIF9kZWZhdWx0ID0gcmVuZGVyRXhwYW5kSWNvbjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfcmNUYWJsZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyYy10YWJsZVwiKSk7XG5cbnZhciBfVGFibGUgPSByZXF1aXJlKFwicmMtdGFibGUvbGliL1RhYmxlXCIpO1xuXG52YXIgX3VzZUNvbHVtbnMgPSByZXF1aXJlKFwicmMtdGFibGUvbGliL2hvb2tzL3VzZUNvbHVtbnNcIik7XG5cbnZhciBfc3BpbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3NwaW5cIikpO1xuXG52YXIgX3BhZ2luYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9wYWdpbmF0aW9uXCIpKTtcblxudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0XCIpO1xuXG52YXIgX3VzZVBhZ2luYXRpb24zID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vaG9va3MvdXNlUGFnaW5hdGlvblwiKSk7XG5cbnZhciBfdXNlTGF6eUtWTWFwMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlTGF6eUtWTWFwXCIpKTtcblxudmFyIF91c2VTZWxlY3Rpb24zID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vaG9va3MvdXNlU2VsZWN0aW9uXCIpKTtcblxudmFyIF91c2VTb3J0ZXIzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vaG9va3MvdXNlU29ydGVyXCIpKTtcblxudmFyIF91c2VGaWx0ZXIzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vaG9va3MvdXNlRmlsdGVyXCIpKTtcblxudmFyIF91c2VUaXRsZUNvbHVtbnMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VUaXRsZUNvbHVtbnNcIikpO1xuXG52YXIgX0V4cGFuZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0V4cGFuZEljb25cIikpO1xuXG52YXIgX3Njcm9sbFRvID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvc2Nyb2xsVG9cIikpO1xuXG52YXIgX2VuX1VTID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlL2VuX1VTXCIpKTtcblxudmFyIF9TaXplQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dFwiKSk7XG5cbnZhciBfQ29sdW1uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db2x1bW5cIikpO1xuXG52YXIgX0NvbHVtbkdyb3VwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db2x1bW5Hcm91cFwiKSk7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX3VzZUJyZWFrcG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9ncmlkL2hvb2tzL3VzZUJyZWFrcG9pbnRcIikpO1xuXG52YXIgRU1QVFlfTElTVCA9IFtdO1xuXG5mdW5jdGlvbiBUYWJsZShwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXMzO1xuXG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgY3VzdG9taXplU2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICBib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgICAgY3VzdG9taXplRHJvcGRvd25QcmVmaXhDbHMgPSBwcm9wcy5kcm9wZG93blByZWZpeENscyxcbiAgICAgIGRhdGFTb3VyY2UgPSBwcm9wcy5kYXRhU291cmNlLFxuICAgICAgcGFnaW5hdGlvbiA9IHByb3BzLnBhZ2luYXRpb24sXG4gICAgICByb3dTZWxlY3Rpb24gPSBwcm9wcy5yb3dTZWxlY3Rpb24sXG4gICAgICByb3dLZXkgPSBwcm9wcy5yb3dLZXksXG4gICAgICByb3dDbGFzc05hbWUgPSBwcm9wcy5yb3dDbGFzc05hbWUsXG4gICAgICBjb2x1bW5zID0gcHJvcHMuY29sdW1ucyxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBsZWdhY3lDaGlsZHJlbkNvbHVtbk5hbWUgPSBwcm9wcy5jaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgICAgZXhwYW5kSWNvbiA9IHByb3BzLmV4cGFuZEljb24sXG4gICAgICBleHBhbmRhYmxlID0gcHJvcHMuZXhwYW5kYWJsZSxcbiAgICAgIGV4cGFuZGVkUm93UmVuZGVyID0gcHJvcHMuZXhwYW5kZWRSb3dSZW5kZXIsXG4gICAgICBleHBhbmRJY29uQ29sdW1uSW5kZXggPSBwcm9wcy5leHBhbmRJY29uQ29sdW1uSW5kZXgsXG4gICAgICBpbmRlbnRTaXplID0gcHJvcHMuaW5kZW50U2l6ZSxcbiAgICAgIHNjcm9sbCA9IHByb3BzLnNjcm9sbCxcbiAgICAgIHNvcnREaXJlY3Rpb25zID0gcHJvcHMuc29ydERpcmVjdGlvbnMsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICBfcHJvcHMkc2hvd1NvcnRlclRvb2wgPSBwcm9wcy5zaG93U29ydGVyVG9vbHRpcCxcbiAgICAgIHNob3dTb3J0ZXJUb29sdGlwID0gX3Byb3BzJHNob3dTb3J0ZXJUb29sID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHNob3dTb3J0ZXJUb29sO1xuICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghKHR5cGVvZiByb3dLZXkgPT09ICdmdW5jdGlvbicgJiYgcm93S2V5Lmxlbmd0aCA+IDEpLCAnVGFibGUnLCAnYGluZGV4YCBwYXJhbWV0ZXIgb2YgYHJvd0tleWAgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgaXQgd2lsbCB3b3JrIGFzIGV4cGVjdGVkLicpO1xuICB2YXIgc2NyZWVucyA9ICgwLCBfdXNlQnJlYWtwb2ludFtcImRlZmF1bHRcIl0pKCk7XG4gIHZhciBtZXJnZWRDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hdGNoZWQgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHNjcmVlbnMpLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgcmV0dXJuIHNjcmVlbnNbbV07XG4gICAgfSkpO1xuICAgIHJldHVybiAoY29sdW1ucyB8fCAoMCwgX3VzZUNvbHVtbnMuY29udmVydENoaWxkcmVuVG9Db2x1bW5zKShjaGlsZHJlbikpLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuICFjLnJlc3BvbnNpdmUgfHwgYy5yZXNwb25zaXZlLnNvbWUoZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZWQuaGFzKHIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sIFtjaGlsZHJlbiwgY29sdW1ucywgc2NyZWVuc10pO1xuICB2YXIgdGFibGVQcm9wcyA9ICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKHByb3BzLCBbJ2NsYXNzTmFtZScsICdzdHlsZScsICdjb2x1bW5zJ10pO1xuICB2YXIgc2l6ZSA9IFJlYWN0LnVzZUNvbnRleHQoX1NpemVDb250ZXh0W1wiZGVmYXVsdFwiXSk7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29udGV4dC5Db25maWdDb250ZXh0KSxcbiAgICAgIF9SZWFjdCR1c2VDb250ZXh0JGxvYyA9IF9SZWFjdCR1c2VDb250ZXh0LmxvY2FsZSxcbiAgICAgIGNvbnRleHRMb2NhbGUgPSBfUmVhY3QkdXNlQ29udGV4dCRsb2MgPT09IHZvaWQgMCA/IF9lbl9VU1tcImRlZmF1bHRcIl0gOiBfUmVhY3QkdXNlQ29udGV4dCRsb2MsXG4gICAgICByZW5kZXJFbXB0eSA9IF9SZWFjdCR1c2VDb250ZXh0LnJlbmRlckVtcHR5LFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gIHZhciBtZXJnZWRTaXplID0gY3VzdG9taXplU2l6ZSB8fCBzaXplO1xuICB2YXIgdGFibGVMb2NhbGUgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBjb250ZXh0TG9jYWxlLlRhYmxlKSwgbG9jYWxlKTtcbiAgdmFyIHJhd0RhdGEgPSBkYXRhU291cmNlIHx8IEVNUFRZX0xJU1Q7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0MiA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbnRleHQuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dDIuZ2V0UHJlZml4Q2xzO1xuXG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3RhYmxlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGRyb3Bkb3duUHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdkcm9wZG93bicsIGN1c3RvbWl6ZURyb3Bkb3duUHJlZml4Q2xzKTtcbiAgdmFyIG1lcmdlZEV4cGFuZGFibGUgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgIGNoaWxkcmVuQ29sdW1uTmFtZTogbGVnYWN5Q2hpbGRyZW5Db2x1bW5OYW1lLFxuICAgIGV4cGFuZEljb25Db2x1bW5JbmRleDogZXhwYW5kSWNvbkNvbHVtbkluZGV4XG4gIH0sIGV4cGFuZGFibGUpO1xuICB2YXIgX21lcmdlZEV4cGFuZGFibGUkY2hpID0gbWVyZ2VkRXhwYW5kYWJsZS5jaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgICBjaGlsZHJlbkNvbHVtbk5hbWUgPSBfbWVyZ2VkRXhwYW5kYWJsZSRjaGkgPT09IHZvaWQgMCA/ICdjaGlsZHJlbicgOiBfbWVyZ2VkRXhwYW5kYWJsZSRjaGk7XG4gIHZhciBleHBhbmRUeXBlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJhd0RhdGEuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICByZXR1cm4gKF9hID0gaXRlbSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW2NoaWxkcmVuQ29sdW1uTmFtZV07XG4gICAgfSkpIHtcbiAgICAgIHJldHVybiAnbmVzdCc7XG4gICAgfVxuXG4gICAgaWYgKGV4cGFuZGVkUm93UmVuZGVyIHx8IGV4cGFuZGFibGUgJiYgZXhwYW5kYWJsZS5leHBhbmRlZFJvd1JlbmRlcikge1xuICAgICAgcmV0dXJuICdyb3cnO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9LCBbcmF3RGF0YV0pO1xuICB2YXIgaW50ZXJuYWxSZWZzID0ge1xuICAgIGJvZHk6IFJlYWN0LnVzZVJlZigpXG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUm93S2V5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgZ2V0Um93S2V5ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiByb3dLZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiByb3dLZXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgcmV0dXJuIChfYSA9IHJlY29yZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW3Jvd0tleV07XG4gICAgfTtcbiAgfSwgW3Jvd0tleV0pO1xuXG4gIHZhciBfdXNlTGF6eUtWTWFwID0gKDAsIF91c2VMYXp5S1ZNYXAzW1wiZGVmYXVsdFwiXSkocmF3RGF0YSwgY2hpbGRyZW5Db2x1bW5OYW1lLCBnZXRSb3dLZXkpLFxuICAgICAgX3VzZUxhenlLVk1hcDIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX3VzZUxhenlLVk1hcCwgMSksXG4gICAgICBnZXRSZWNvcmRCeUtleSA9IF91c2VMYXp5S1ZNYXAyWzBdOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIGNoYW5nZUV2ZW50SW5mbyA9IHt9O1xuXG4gIHZhciB0cmlnZ2VyT25DaGFuZ2UgPSBmdW5jdGlvbiB0cmlnZ2VyT25DaGFuZ2UoaW5mbywgYWN0aW9uKSB7XG4gICAgdmFyIHJlc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICB2YXIgY2hhbmdlSW5mbyA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGNoYW5nZUV2ZW50SW5mbyksIGluZm8pO1xuXG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICBjaGFuZ2VFdmVudEluZm8ucmVzZXRQYWdpbmF0aW9uKCk7IC8vIFJlc2V0IGV2ZW50IHBhcmFtXG5cbiAgICAgIGlmIChjaGFuZ2VJbmZvLnBhZ2luYXRpb24uY3VycmVudCkge1xuICAgICAgICBjaGFuZ2VJbmZvLnBhZ2luYXRpb24uY3VycmVudCA9IDE7XG4gICAgICB9IC8vIFRyaWdnZXIgcGFnaW5hdGlvbiBldmVudHNcblxuXG4gICAgICBpZiAocGFnaW5hdGlvbiAmJiBwYWdpbmF0aW9uLm9uQ2hhbmdlKSB7XG4gICAgICAgIHBhZ2luYXRpb24ub25DaGFuZ2UoMSwgY2hhbmdlSW5mby5wYWdpbmF0aW9uLnBhZ2VTaXplKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsICYmIHNjcm9sbC5zY3JvbGxUb0ZpcnN0Um93T25DaGFuZ2UgIT09IGZhbHNlICYmIGludGVybmFsUmVmcy5ib2R5LmN1cnJlbnQpIHtcbiAgICAgICgwLCBfc2Nyb2xsVG9bXCJkZWZhdWx0XCJdKSgwLCB7XG4gICAgICAgIGdldENvbnRhaW5lcjogZnVuY3Rpb24gZ2V0Q29udGFpbmVyKCkge1xuICAgICAgICAgIHJldHVybiBpbnRlcm5hbFJlZnMuYm9keS5jdXJyZW50O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKGNoYW5nZUluZm8ucGFnaW5hdGlvbiwgY2hhbmdlSW5mby5maWx0ZXJzLCBjaGFuZ2VJbmZvLnNvcnRlciwge1xuICAgICAgICBjdXJyZW50RGF0YVNvdXJjZTogKDAsIF91c2VGaWx0ZXIzLmdldEZpbHRlckRhdGEpKCgwLCBfdXNlU29ydGVyMy5nZXRTb3J0RGF0YSkocmF3RGF0YSwgY2hhbmdlSW5mby5zb3J0ZXJTdGF0ZXMsIGNoaWxkcmVuQ29sdW1uTmFtZSksIGNoYW5nZUluZm8uZmlsdGVyU3RhdGVzKSxcbiAgICAgICAgYWN0aW9uOiBhY3Rpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIENvbnRyb2xsZWQgc3RhdGUgaW4gYGNvbHVtbnNgIGlzIG5vdCBhIGdvb2QgaWRlYSB0aGF0IG1ha2VzIHRvbyBtYW55IGNvZGUgKDEwMDArIGxpbmU/KVxuICAgKiB0byByZWFkIHN0YXRlIG91dCBhbmQgdGhlbiBwdXQgaXQgYmFjayB0byB0aXRsZSByZW5kZXIuXG4gICAqIE1vdmUgdGhlc2UgY29kZSBpbnRvIGBob29rc2AgYnV0IHN0aWxsIHRvbyBjb21wbGV4LlxuICAgKiBXZSBzaG91bGQgcHJvdmlkZXMgVGFibGUgcHJvcHMgbGlrZSBgc29ydGVyYCAmIGBmaWx0ZXJgIHRvIGhhbmRsZSBjb250cm9sIGluIG5leHQgYmlnIHZlcnNpb24uXG4gICAqL1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNvcnRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIG9uU29ydGVyQ2hhbmdlID0gZnVuY3Rpb24gb25Tb3J0ZXJDaGFuZ2Uoc29ydGVyLCBzb3J0ZXJTdGF0ZXMpIHtcbiAgICB0cmlnZ2VyT25DaGFuZ2Uoe1xuICAgICAgc29ydGVyOiBzb3J0ZXIsXG4gICAgICBzb3J0ZXJTdGF0ZXM6IHNvcnRlclN0YXRlc1xuICAgIH0sICdzb3J0JywgZmFsc2UpO1xuICB9O1xuXG4gIHZhciBfdXNlU29ydGVyID0gKDAsIF91c2VTb3J0ZXIzW1wiZGVmYXVsdFwiXSkoe1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG1lcmdlZENvbHVtbnM6IG1lcmdlZENvbHVtbnMsXG4gICAgb25Tb3J0ZXJDaGFuZ2U6IG9uU29ydGVyQ2hhbmdlLFxuICAgIHNvcnREaXJlY3Rpb25zOiBzb3J0RGlyZWN0aW9ucyB8fCBbJ2FzY2VuZCcsICdkZXNjZW5kJ10sXG4gICAgdGFibGVMb2NhbGU6IHRhYmxlTG9jYWxlLFxuICAgIHNob3dTb3J0ZXJUb29sdGlwOiBzaG93U29ydGVyVG9vbHRpcFxuICB9KSxcbiAgICAgIF91c2VTb3J0ZXIyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VTb3J0ZXIsIDQpLFxuICAgICAgdHJhbnNmb3JtU29ydGVyQ29sdW1ucyA9IF91c2VTb3J0ZXIyWzBdLFxuICAgICAgc29ydFN0YXRlcyA9IF91c2VTb3J0ZXIyWzFdLFxuICAgICAgc29ydGVyVGl0bGVQcm9wcyA9IF91c2VTb3J0ZXIyWzJdLFxuICAgICAgZ2V0U29ydGVycyA9IF91c2VTb3J0ZXIyWzNdO1xuXG4gIHZhciBzb3J0ZWREYXRhID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICgwLCBfdXNlU29ydGVyMy5nZXRTb3J0RGF0YSkocmF3RGF0YSwgc29ydFN0YXRlcywgY2hpbGRyZW5Db2x1bW5OYW1lKTtcbiAgfSwgW3Jhd0RhdGEsIHNvcnRTdGF0ZXNdKTtcbiAgY2hhbmdlRXZlbnRJbmZvLnNvcnRlciA9IGdldFNvcnRlcnMoKTtcbiAgY2hhbmdlRXZlbnRJbmZvLnNvcnRlclN0YXRlcyA9IHNvcnRTdGF0ZXM7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmlsdGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgb25GaWx0ZXJDaGFuZ2UgPSBmdW5jdGlvbiBvbkZpbHRlckNoYW5nZShmaWx0ZXJzLCBmaWx0ZXJTdGF0ZXMpIHtcbiAgICB0cmlnZ2VyT25DaGFuZ2Uoe1xuICAgICAgZmlsdGVyczogZmlsdGVycyxcbiAgICAgIGZpbHRlclN0YXRlczogZmlsdGVyU3RhdGVzXG4gICAgfSwgJ2ZpbHRlcicsIHRydWUpO1xuICB9O1xuXG4gIHZhciBfdXNlRmlsdGVyID0gKDAsIF91c2VGaWx0ZXIzW1wiZGVmYXVsdFwiXSkoe1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGxvY2FsZTogdGFibGVMb2NhbGUsXG4gICAgZHJvcGRvd25QcmVmaXhDbHM6IGRyb3Bkb3duUHJlZml4Q2xzLFxuICAgIG1lcmdlZENvbHVtbnM6IG1lcmdlZENvbHVtbnMsXG4gICAgb25GaWx0ZXJDaGFuZ2U6IG9uRmlsdGVyQ2hhbmdlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICB9KSxcbiAgICAgIF91c2VGaWx0ZXIyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VGaWx0ZXIsIDMpLFxuICAgICAgdHJhbnNmb3JtRmlsdGVyQ29sdW1ucyA9IF91c2VGaWx0ZXIyWzBdLFxuICAgICAgZmlsdGVyU3RhdGVzID0gX3VzZUZpbHRlcjJbMV0sXG4gICAgICBnZXRGaWx0ZXJzID0gX3VzZUZpbHRlcjJbMl07XG5cbiAgdmFyIG1lcmdlZERhdGEgPSAoMCwgX3VzZUZpbHRlcjMuZ2V0RmlsdGVyRGF0YSkoc29ydGVkRGF0YSwgZmlsdGVyU3RhdGVzKTtcbiAgY2hhbmdlRXZlbnRJbmZvLmZpbHRlcnMgPSBnZXRGaWx0ZXJzKCk7XG4gIGNoYW5nZUV2ZW50SW5mby5maWx0ZXJTdGF0ZXMgPSBmaWx0ZXJTdGF0ZXM7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29sdW1uID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgY29sdW1uVGl0bGVQcm9wcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHNvcnRlclRpdGxlUHJvcHMpO1xuICB9LCBbc29ydGVyVGl0bGVQcm9wc10pO1xuXG4gIHZhciBfdXNlVGl0bGVDb2x1bW5zID0gKDAsIF91c2VUaXRsZUNvbHVtbnMzW1wiZGVmYXVsdFwiXSkoY29sdW1uVGl0bGVQcm9wcyksXG4gICAgICBfdXNlVGl0bGVDb2x1bW5zMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfdXNlVGl0bGVDb2x1bW5zLCAxKSxcbiAgICAgIHRyYW5zZm9ybVRpdGxlQ29sdW1ucyA9IF91c2VUaXRsZUNvbHVtbnMyWzBdOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBQYWdpbmF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgb25QYWdpbmF0aW9uQ2hhbmdlID0gZnVuY3Rpb24gb25QYWdpbmF0aW9uQ2hhbmdlKGN1cnJlbnQsIHBhZ2VTaXplKSB7XG4gICAgdHJpZ2dlck9uQ2hhbmdlKHtcbiAgICAgIHBhZ2luYXRpb246ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGNoYW5nZUV2ZW50SW5mby5wYWdpbmF0aW9uKSwge1xuICAgICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgICBwYWdlU2l6ZTogcGFnZVNpemVcbiAgICAgIH0pXG4gICAgfSwgJ3BhZ2luYXRlJyk7XG4gIH07XG5cbiAgdmFyIF91c2VQYWdpbmF0aW9uID0gKDAsIF91c2VQYWdpbmF0aW9uM1tcImRlZmF1bHRcIl0pKG1lcmdlZERhdGEubGVuZ3RoLCBwYWdpbmF0aW9uLCBvblBhZ2luYXRpb25DaGFuZ2UpLFxuICAgICAgX3VzZVBhZ2luYXRpb24yID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VQYWdpbmF0aW9uLCAyKSxcbiAgICAgIG1lcmdlZFBhZ2luYXRpb24gPSBfdXNlUGFnaW5hdGlvbjJbMF0sXG4gICAgICByZXNldFBhZ2luYXRpb24gPSBfdXNlUGFnaW5hdGlvbjJbMV07XG5cbiAgY2hhbmdlRXZlbnRJbmZvLnBhZ2luYXRpb24gPSBwYWdpbmF0aW9uID09PSBmYWxzZSA/IHt9IDogKDAsIF91c2VQYWdpbmF0aW9uMy5nZXRQYWdpbmF0aW9uUGFyYW0pKHBhZ2luYXRpb24sIG1lcmdlZFBhZ2luYXRpb24pO1xuICBjaGFuZ2VFdmVudEluZm8ucmVzZXRQYWdpbmF0aW9uID0gcmVzZXRQYWdpbmF0aW9uOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEYXRhID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIHBhZ2VEYXRhID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHBhZ2luYXRpb24gPT09IGZhbHNlIHx8ICFtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplKSB7XG4gICAgICByZXR1cm4gbWVyZ2VkRGF0YTtcbiAgICB9XG5cbiAgICB2YXIgX21lcmdlZFBhZ2luYXRpb24kY3VyID0gbWVyZ2VkUGFnaW5hdGlvbi5jdXJyZW50LFxuICAgICAgICBjdXJyZW50ID0gX21lcmdlZFBhZ2luYXRpb24kY3VyID09PSB2b2lkIDAgPyAxIDogX21lcmdlZFBhZ2luYXRpb24kY3VyLFxuICAgICAgICB0b3RhbCA9IG1lcmdlZFBhZ2luYXRpb24udG90YWwsXG4gICAgICAgIF9tZXJnZWRQYWdpbmF0aW9uJHBhZyA9IG1lcmdlZFBhZ2luYXRpb24ucGFnZVNpemUsXG4gICAgICAgIHBhZ2VTaXplID0gX21lcmdlZFBhZ2luYXRpb24kcGFnID09PSB2b2lkIDAgPyBfdXNlUGFnaW5hdGlvbjMuREVGQVVMVF9QQUdFX1NJWkUgOiBfbWVyZ2VkUGFnaW5hdGlvbiRwYWc7IC8vIER5bmFtaWMgdGFibGUgZGF0YVxuXG4gICAgaWYgKG1lcmdlZERhdGEubGVuZ3RoIDwgdG90YWwpIHtcbiAgICAgIGlmIChtZXJnZWREYXRhLmxlbmd0aCA+IHBhZ2VTaXplKSB7XG4gICAgICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKGZhbHNlLCAnVGFibGUnLCAnYGRhdGFTb3VyY2VgIGxlbmd0aCBpcyBsZXNzIHRoYW4gYHBhZ2luYXRpb24udG90YWxgIGJ1dCBsYXJnZSB0aGFuIGBwYWdpbmF0aW9uLnBhZ2VTaXplYC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGNvbmZpZyBjb3JyZWN0IGRhdGEgd2l0aCBhc3luYyBtb2RlLicpO1xuICAgICAgICByZXR1cm4gbWVyZ2VkRGF0YS5zbGljZSgoY3VycmVudCAtIDEpICogcGFnZVNpemUsIGN1cnJlbnQgKiBwYWdlU2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXJnZWREYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWREYXRhLnNsaWNlKChjdXJyZW50IC0gMSkgKiBwYWdlU2l6ZSwgY3VycmVudCAqIHBhZ2VTaXplKTtcbiAgfSwgWyEhcGFnaW5hdGlvbiwgbWVyZ2VkRGF0YSwgbWVyZ2VkUGFnaW5hdGlvbiAmJiBtZXJnZWRQYWdpbmF0aW9uLmN1cnJlbnQsIG1lcmdlZFBhZ2luYXRpb24gJiYgbWVyZ2VkUGFnaW5hdGlvbi5wYWdlU2l6ZSwgbWVyZ2VkUGFnaW5hdGlvbiAmJiBtZXJnZWRQYWdpbmF0aW9uLnRvdGFsXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgX3VzZVNlbGVjdGlvbiA9ICgwLCBfdXNlU2VsZWN0aW9uM1tcImRlZmF1bHRcIl0pKHJvd1NlbGVjdGlvbiwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGRhdGE6IG1lcmdlZERhdGEsXG4gICAgcGFnZURhdGE6IHBhZ2VEYXRhLFxuICAgIGdldFJvd0tleTogZ2V0Um93S2V5LFxuICAgIGdldFJlY29yZEJ5S2V5OiBnZXRSZWNvcmRCeUtleSxcbiAgICBleHBhbmRUeXBlOiBleHBhbmRUeXBlLFxuICAgIGNoaWxkcmVuQ29sdW1uTmFtZTogY2hpbGRyZW5Db2x1bW5OYW1lLFxuICAgIGxvY2FsZTogdGFibGVMb2NhbGUsXG4gICAgZXhwYW5kSWNvbkNvbHVtbkluZGV4OiBtZXJnZWRFeHBhbmRhYmxlLmV4cGFuZEljb25Db2x1bW5JbmRleCxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJcbiAgfSksXG4gICAgICBfdXNlU2VsZWN0aW9uMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfdXNlU2VsZWN0aW9uLCAyKSxcbiAgICAgIHRyYW5zZm9ybVNlbGVjdGlvbkNvbHVtbnMgPSBfdXNlU2VsZWN0aW9uMlswXSxcbiAgICAgIHNlbGVjdGVkS2V5U2V0ID0gX3VzZVNlbGVjdGlvbjJbMV07XG5cbiAgdmFyIGludGVybmFsUm93Q2xhc3NOYW1lID0gZnVuY3Rpb24gaW50ZXJuYWxSb3dDbGFzc05hbWUocmVjb3JkLCBpbmRleCwgaW5kZW50KSB7XG4gICAgdmFyIG1lcmdlZFJvd0NsYXNzTmFtZTtcblxuICAgIGlmICh0eXBlb2Ygcm93Q2xhc3NOYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtZXJnZWRSb3dDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShyb3dDbGFzc05hbWUocmVjb3JkLCBpbmRleCwgaW5kZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZFJvd0NsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHJvd0NsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKCgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcm93LXNlbGVjdGVkXCIpLCBzZWxlY3RlZEtleVNldC5oYXMoZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpKSksIG1lcmdlZFJvd0NsYXNzTmFtZSk7XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cGFuZGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUGFzcyBvcmlnaW4gcmVuZGVyIHN0YXR1cyBpbnRvIGByYy10YWJsZWAsIHRoaXMgY2FuIGJlIHJlbW92ZWQgd2hlbiByZWZhY3RvciB3aXRoIGByYy10YWJsZWBcblxuXG4gIG1lcmdlZEV4cGFuZGFibGUuX19QQVJFTlRfUkVOREVSX0lDT05fXyA9IG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbjsgLy8gQ3VzdG9taXplIGV4cGFuZGFibGUgaWNvblxuXG4gIG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbiA9IG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbiB8fCBleHBhbmRJY29uIHx8ICgwLCBfRXhwYW5kSWNvbltcImRlZmF1bHRcIl0pKHRhYmxlTG9jYWxlKTsgLy8gQWRqdXN0IGV4cGFuZCBpY29uIGluZGV4LCBubyBvdmVyd3JpdGUgZXhwYW5kSWNvbkNvbHVtbkluZGV4IGlmIHNldC5cblxuICBpZiAoZXhwYW5kVHlwZSA9PT0gJ25lc3QnICYmIG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbkNvbHVtbkluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWRFeHBhbmRhYmxlLmV4cGFuZEljb25Db2x1bW5JbmRleCA9IHJvd1NlbGVjdGlvbiA/IDEgOiAwO1xuICB9IGVsc2UgaWYgKG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbkNvbHVtbkluZGV4ID4gMCAmJiByb3dTZWxlY3Rpb24pIHtcbiAgICBtZXJnZWRFeHBhbmRhYmxlLmV4cGFuZEljb25Db2x1bW5JbmRleCAtPSAxO1xuICB9IC8vIEluZGVudCBzaXplXG5cblxuICBpZiAodHlwZW9mIG1lcmdlZEV4cGFuZGFibGUuaW5kZW50U2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICBtZXJnZWRFeHBhbmRhYmxlLmluZGVudFNpemUgPSB0eXBlb2YgaW5kZW50U2l6ZSA9PT0gJ251bWJlcicgPyBpbmRlbnRTaXplIDogMTU7XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIHRyYW5zZm9ybUNvbHVtbnMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaW5uZXJDb2x1bW5zKSB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVRpdGxlQ29sdW1ucyh0cmFuc2Zvcm1TZWxlY3Rpb25Db2x1bW5zKHRyYW5zZm9ybUZpbHRlckNvbHVtbnModHJhbnNmb3JtU29ydGVyQ29sdW1ucyhpbm5lckNvbHVtbnMpKSkpO1xuICB9LCBbdHJhbnNmb3JtU29ydGVyQ29sdW1ucywgdHJhbnNmb3JtRmlsdGVyQ29sdW1ucywgdHJhbnNmb3JtU2VsZWN0aW9uQ29sdW1uc10pO1xuICB2YXIgdG9wUGFnaW5hdGlvbk5vZGU7XG4gIHZhciBib3R0b21QYWdpbmF0aW9uTm9kZTtcblxuICBpZiAocGFnaW5hdGlvbiAhPT0gZmFsc2UgJiYgKG1lcmdlZFBhZ2luYXRpb24gPT09IG51bGwgfHwgbWVyZ2VkUGFnaW5hdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVyZ2VkUGFnaW5hdGlvbi50b3RhbCkpIHtcbiAgICB2YXIgcGFnaW5hdGlvblNpemU7XG5cbiAgICBpZiAobWVyZ2VkUGFnaW5hdGlvbi5zaXplKSB7XG4gICAgICBwYWdpbmF0aW9uU2l6ZSA9IG1lcmdlZFBhZ2luYXRpb24uc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFnaW5hdGlvblNpemUgPSBtZXJnZWRTaXplID09PSAnc21hbGwnIHx8IG1lcmdlZFNpemUgPT09ICdtaWRkbGUnID8gJ3NtYWxsJyA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgcmVuZGVyUGFnaW5hdGlvbiA9IGZ1bmN0aW9uIHJlbmRlclBhZ2luYXRpb24ocG9zaXRpb24pIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcGFnaW5hdGlvbltcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYWdpbmF0aW9uIFwiKS5jb25jYXQocHJlZml4Q2xzLCBcIi1wYWdpbmF0aW9uLVwiKS5jb25jYXQocG9zaXRpb24pXG4gICAgICB9LCBtZXJnZWRQYWdpbmF0aW9uLCB7XG4gICAgICAgIHNpemU6IHBhZ2luYXRpb25TaXplXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIHZhciBkZWZhdWx0UG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2xlZnQnIDogJ3JpZ2h0JztcblxuICAgIGlmIChtZXJnZWRQYWdpbmF0aW9uLnBvc2l0aW9uICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobWVyZ2VkUGFnaW5hdGlvbi5wb3NpdGlvbikpIHtcbiAgICAgIHZhciB0b3BQb3MgPSBtZXJnZWRQYWdpbmF0aW9uLnBvc2l0aW9uLmZpbmQoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHAuaW5kZXhPZigndG9wJykgIT09IC0xO1xuICAgICAgfSk7XG4gICAgICB2YXIgYm90dG9tUG9zID0gbWVyZ2VkUGFnaW5hdGlvbi5wb3NpdGlvbi5maW5kKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwLmluZGV4T2YoJ2JvdHRvbScpICE9PSAtMTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRvcFBvcyAmJiAhYm90dG9tUG9zKSB7XG4gICAgICAgIGJvdHRvbVBhZ2luYXRpb25Ob2RlID0gcmVuZGVyUGFnaW5hdGlvbihkZWZhdWx0UG9zaXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRvcFBvcykge1xuICAgICAgICAgIHRvcFBhZ2luYXRpb25Ob2RlID0gcmVuZGVyUGFnaW5hdGlvbih0b3BQb3MudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCd0b3AnLCAnJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJvdHRvbVBvcykge1xuICAgICAgICAgIGJvdHRvbVBhZ2luYXRpb25Ob2RlID0gcmVuZGVyUGFnaW5hdGlvbihib3R0b21Qb3MudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdib3R0b20nLCAnJykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdHRvbVBhZ2luYXRpb25Ob2RlID0gcmVuZGVyUGFnaW5hdGlvbihkZWZhdWx0UG9zaXRpb24pO1xuICAgIH1cbiAgfSAvLyA+Pj4+Pj4+Pj4gU3Bpbm5pbmdcblxuXG4gIHZhciBzcGluUHJvcHM7XG5cbiAgaWYgKHR5cGVvZiBsb2FkaW5nID09PSAnYm9vbGVhbicpIHtcbiAgICBzcGluUHJvcHMgPSB7XG4gICAgICBzcGlubmluZzogbG9hZGluZ1xuICAgIH07XG4gIH0gZWxzZSBpZiAoKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkobG9hZGluZykgPT09ICdvYmplY3QnKSB7XG4gICAgc3BpblByb3BzID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgIHNwaW5uaW5nOiB0cnVlXG4gICAgfSwgbG9hZGluZyk7XG4gIH1cblxuICB2YXIgd3JhcHBlckNsYXNzTmFtZXMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdyYXBwZXJcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzTmFtZXMsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9zcGluW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICBzcGlubmluZzogZmFsc2VcbiAgfSwgc3BpblByb3BzKSwgdG9wUGFnaW5hdGlvbk5vZGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1RhYmxlW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCB0YWJsZVByb3BzLCB7XG4gICAgY29sdW1uczogbWVyZ2VkQ29sdW1ucyxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBleHBhbmRhYmxlOiBtZXJnZWRFeHBhbmRhYmxlLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzMyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1taWRkbGVcIiksIG1lcmdlZFNpemUgPT09ICdtaWRkbGUnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21hbGxcIiksIG1lcmdlZFNpemUgPT09ICdzbWFsbCcpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJlZFwiKSwgYm9yZGVyZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lbXB0eVwiKSwgcmF3RGF0YS5sZW5ndGggPT09IDApLCBfY2xhc3NOYW1lczMpKSxcbiAgICBkYXRhOiBwYWdlRGF0YSxcbiAgICByb3dLZXk6IGdldFJvd0tleSxcbiAgICByb3dDbGFzc05hbWU6IGludGVybmFsUm93Q2xhc3NOYW1lLFxuICAgIGVtcHR5VGV4dDogbG9jYWxlICYmIGxvY2FsZS5lbXB0eVRleHQgfHwgcmVuZGVyRW1wdHkoJ1RhYmxlJykgLy8gSW50ZXJuYWxcbiAgICAsXG4gICAgaW50ZXJuYWxIb29rczogX1RhYmxlLklOVEVSTkFMX0hPT0tTLFxuICAgIGludGVybmFsUmVmczogaW50ZXJuYWxSZWZzLFxuICAgIHRyYW5zZm9ybUNvbHVtbnM6IHRyYW5zZm9ybUNvbHVtbnNcbiAgfSkpLCBib3R0b21QYWdpbmF0aW9uTm9kZSkpO1xufVxuXG5UYWJsZS5kZWZhdWx0UHJvcHMgPSB7XG4gIHJvd0tleTogJ2tleSdcbn07XG5UYWJsZS5TRUxFQ1RJT05fQUxMID0gX3VzZVNlbGVjdGlvbjMuU0VMRUNUSU9OX0FMTDtcblRhYmxlLlNFTEVDVElPTl9JTlZFUlQgPSBfdXNlU2VsZWN0aW9uMy5TRUxFQ1RJT05fSU5WRVJUO1xuVGFibGUuQ29sdW1uID0gX0NvbHVtbltcImRlZmF1bHRcIl07XG5UYWJsZS5Db2x1bW5Hcm91cCA9IF9Db2x1bW5Hcm91cFtcImRlZmF1bHRcIl07XG5UYWJsZS5TdW1tYXJ5ID0gX3JjVGFibGUuU3VtbWFyeTtcbnZhciBfZGVmYXVsdCA9IFRhYmxlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2lzRXF1YWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJsb2Rhc2gvaXNFcXVhbFwiKSk7XG5cbnZhciBfRmlsdGVyRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvRmlsdGVyRmlsbGVkXCIpKTtcblxudmFyIF9idXR0b24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9idXR0b25cIikpO1xuXG52YXIgX21lbnUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9tZW51XCIpKTtcblxudmFyIF9jaGVja2JveCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NoZWNrYm94XCIpKTtcblxudmFyIF9yYWRpbyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL3JhZGlvXCIpKTtcblxudmFyIF9kcm9wZG93biA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2Ryb3Bkb3duXCIpKTtcblxudmFyIF9lbXB0eSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2VtcHR5XCIpKTtcblxudmFyIF9GaWx0ZXJXcmFwcGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9GaWx0ZXJXcmFwcGVyXCIpKTtcblxudmFyIF91c2VTeW5jU3RhdGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vX3V0aWwvaG9va3MvdXNlU3luY1N0YXRlXCIpKTtcblxudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0XCIpO1xuXG52YXIgU3ViTWVudSA9IF9tZW51W1wiZGVmYXVsdFwiXS5TdWJNZW51LFxuICAgIE1lbnVJdGVtID0gX21lbnVbXCJkZWZhdWx0XCJdLkl0ZW07XG5cbmZ1bmN0aW9uIGhhc1N1Yk1lbnUoZmlsdGVycykge1xuICByZXR1cm4gZmlsdGVycy5zb21lKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW5kZXJGaWx0ZXJJdGVtcyhfcmVmMikge1xuICB2YXIgZmlsdGVycyA9IF9yZWYyLmZpbHRlcnMsXG4gICAgICBwcmVmaXhDbHMgPSBfcmVmMi5wcmVmaXhDbHMsXG4gICAgICBmaWx0ZXJlZEtleXMgPSBfcmVmMi5maWx0ZXJlZEtleXMsXG4gICAgICBmaWx0ZXJNdWx0aXBsZSA9IF9yZWYyLmZpbHRlck11bHRpcGxlLFxuICAgICAgbG9jYWxlID0gX3JlZjIubG9jYWxlO1xuXG4gIGlmIChmaWx0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIHdyYXBwZWQgd2l0aCA8ZGl2IC8+IHRvIGF2b2lkIHJlYWN0IHdhcm5pbmdcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNTk3OVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBtYXJnaW46ICcxNnB4IDAnXG4gICAgICB9XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2VtcHR5W1wiZGVmYXVsdFwiXSwge1xuICAgICAgaW1hZ2U6IF9lbXB0eVtcImRlZmF1bHRcIl0uUFJFU0VOVEVEX0lNQUdFX1NJTVBMRSxcbiAgICAgIGRlc2NyaXB0aW9uOiBsb2NhbGUuZmlsdGVyRW1wdHlUZXh0LFxuICAgICAgaW1hZ2VTdHlsZToge1xuICAgICAgICBoZWlnaHQ6IDI0XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIGZpbHRlcnMubWFwKGZ1bmN0aW9uIChmaWx0ZXIsIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IFN0cmluZyhmaWx0ZXIudmFsdWUpO1xuXG4gICAgaWYgKGZpbHRlci5jaGlsZHJlbikge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN1Yk1lbnUsIHtcbiAgICAgICAga2V5OiBrZXkgfHwgaW5kZXgsXG4gICAgICAgIHRpdGxlOiBmaWx0ZXIudGV4dCxcbiAgICAgICAgcG9wdXBDbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJvcGRvd24tc3VibWVudVwiKVxuICAgICAgfSwgcmVuZGVyRmlsdGVySXRlbXMoe1xuICAgICAgICBmaWx0ZXJzOiBmaWx0ZXIuY2hpbGRyZW4sXG4gICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICBmaWx0ZXJlZEtleXM6IGZpbHRlcmVkS2V5cyxcbiAgICAgICAgZmlsdGVyTXVsdGlwbGU6IGZpbHRlck11bHRpcGxlLFxuICAgICAgICBsb2NhbGU6IGxvY2FsZVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHZhciBDb21wb25lbnQgPSBmaWx0ZXJNdWx0aXBsZSA/IF9jaGVja2JveFtcImRlZmF1bHRcIl0gOiBfcmFkaW9bXCJkZWZhdWx0XCJdO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51SXRlbSwge1xuICAgICAga2V5OiBmaWx0ZXIudmFsdWUgIT09IHVuZGVmaW5lZCA/IGtleSA6IGluZGV4XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgICBjaGVja2VkOiBmaWx0ZXJlZEtleXMuaW5jbHVkZXMoa2V5KVxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgZmlsdGVyLnRleHQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIEZpbHRlckRyb3Bkb3duKHByb3BzKSB7XG4gIHZhciBfYTtcblxuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY29sdW1uID0gcHJvcHMuY29sdW1uLFxuICAgICAgZHJvcGRvd25QcmVmaXhDbHMgPSBwcm9wcy5kcm9wZG93blByZWZpeENscyxcbiAgICAgIGNvbHVtbktleSA9IHByb3BzLmNvbHVtbktleSxcbiAgICAgIGZpbHRlck11bHRpcGxlID0gcHJvcHMuZmlsdGVyTXVsdGlwbGUsXG4gICAgICBmaWx0ZXJTdGF0ZSA9IHByb3BzLmZpbHRlclN0YXRlLFxuICAgICAgdHJpZ2dlckZpbHRlciA9IHByb3BzLnRyaWdnZXJGaWx0ZXIsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcjtcbiAgdmFyIGZpbHRlckRyb3Bkb3duVmlzaWJsZSA9IGNvbHVtbi5maWx0ZXJEcm9wZG93blZpc2libGUsXG4gICAgICBvbkZpbHRlckRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9IGNvbHVtbi5vbkZpbHRlckRyb3Bkb3duVmlzaWJsZUNoYW5nZTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgdmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgZmlsdGVyZWQgPSAhIShmaWx0ZXJTdGF0ZSAmJiAoKChfYSA9IGZpbHRlclN0YXRlLmZpbHRlcmVkS2V5cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgfHwgZmlsdGVyU3RhdGUuZm9yY2VGaWx0ZXJlZCkpO1xuXG4gIHZhciB0cmlnZ2VyVmlzaWJsZSA9IGZ1bmN0aW9uIHRyaWdnZXJWaXNpYmxlKG5ld1Zpc2libGUpIHtcbiAgICBzZXRWaXNpYmxlKG5ld1Zpc2libGUpO1xuXG4gICAgaWYgKG9uRmlsdGVyRHJvcGRvd25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICBvbkZpbHRlckRyb3Bkb3duVmlzaWJsZUNoYW5nZShuZXdWaXNpYmxlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG1lcmdlZFZpc2libGUgPSB0eXBlb2YgZmlsdGVyRHJvcGRvd25WaXNpYmxlID09PSAnYm9vbGVhbicgPyBmaWx0ZXJEcm9wZG93blZpc2libGUgOiB2aXNpYmxlOyAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0IEtleXMgPT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIHByb3BGaWx0ZXJlZEtleXMgPSBmaWx0ZXJTdGF0ZSAmJiBmaWx0ZXJTdGF0ZS5maWx0ZXJlZEtleXM7XG5cbiAgdmFyIF91c2VTeW5jU3RhdGUgPSAoMCwgX3VzZVN5bmNTdGF0ZTNbXCJkZWZhdWx0XCJdKShwcm9wRmlsdGVyZWRLZXlzIHx8IFtdKSxcbiAgICAgIF91c2VTeW5jU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VTeW5jU3RhdGUsIDIpLFxuICAgICAgZ2V0RmlsdGVyZWRLZXlzU3luYyA9IF91c2VTeW5jU3RhdGUyWzBdLFxuICAgICAgc2V0RmlsdGVyZWRLZXlzU3luYyA9IF91c2VTeW5jU3RhdGUyWzFdO1xuXG4gIHZhciBvblNlbGVjdEtleXMgPSBmdW5jdGlvbiBvblNlbGVjdEtleXMoX3JlZjMpIHtcbiAgICB2YXIgc2VsZWN0ZWRLZXlzID0gX3JlZjMuc2VsZWN0ZWRLZXlzO1xuICAgIHNldEZpbHRlcmVkS2V5c1N5bmMoc2VsZWN0ZWRLZXlzKTtcbiAgfTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIG9uU2VsZWN0S2V5cyh7XG4gICAgICBzZWxlY3RlZEtleXM6IHByb3BGaWx0ZXJlZEtleXMgfHwgW11cbiAgICB9KTtcbiAgfSwgW3Byb3BGaWx0ZXJlZEtleXNdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PSBPcGVuIEtleXMgPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoW10pLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICAgIG9wZW5LZXlzID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICAgIHNldE9wZW5LZXlzID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcblxuICB2YXIgb3BlblJlZiA9IFJlYWN0LnVzZVJlZigpO1xuXG4gIHZhciBvbk9wZW5DaGFuZ2UgPSBmdW5jdGlvbiBvbk9wZW5DaGFuZ2Uoa2V5cykge1xuICAgIG9wZW5SZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldE9wZW5LZXlzKGtleXMpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBvbk1lbnVDbGljayA9IGZ1bmN0aW9uIG9uTWVudUNsaWNrKCkge1xuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQob3BlblJlZi5jdXJyZW50KTtcbiAgfTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KG9wZW5SZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBTdWJtaXQgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGludGVybmFsVHJpZ2dlckZpbHRlciA9IGZ1bmN0aW9uIGludGVybmFsVHJpZ2dlckZpbHRlcihrZXlzKSB7XG4gICAgdHJpZ2dlclZpc2libGUoZmFsc2UpO1xuICAgIHZhciBtZXJnZWRLZXlzID0ga2V5cyAmJiBrZXlzLmxlbmd0aCA/IGtleXMgOiBudWxsO1xuXG4gICAgaWYgKG1lcmdlZEtleXMgPT09IG51bGwgJiYgKCFmaWx0ZXJTdGF0ZSB8fCAhZmlsdGVyU3RhdGUuZmlsdGVyZWRLZXlzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCgwLCBfaXNFcXVhbFtcImRlZmF1bHRcIl0pKG1lcmdlZEtleXMsIGZpbHRlclN0YXRlID09PSBudWxsIHx8IGZpbHRlclN0YXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWx0ZXJTdGF0ZS5maWx0ZXJlZEtleXMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cmlnZ2VyRmlsdGVyKHtcbiAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAga2V5OiBjb2x1bW5LZXksXG4gICAgICBmaWx0ZXJlZEtleXM6IG1lcmdlZEtleXNcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgb25Db25maXJtID0gZnVuY3Rpb24gb25Db25maXJtKCkge1xuICAgIGludGVybmFsVHJpZ2dlckZpbHRlcihnZXRGaWx0ZXJlZEtleXNTeW5jKCkpO1xuICB9O1xuXG4gIHZhciBvblJlc2V0ID0gZnVuY3Rpb24gb25SZXNldCgpIHtcbiAgICBzZXRGaWx0ZXJlZEtleXNTeW5jKFtdKTtcbiAgICBpbnRlcm5hbFRyaWdnZXJGaWx0ZXIoW10pO1xuICB9O1xuXG4gIHZhciBvblZpc2libGVDaGFuZ2UgPSBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2UobmV3VmlzaWJsZSkge1xuICAgIGlmIChuZXdWaXNpYmxlICYmIHByb3BGaWx0ZXJlZEtleXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU3luYyBmaWx0ZXJlZEtleXMgb24gYXBwZWFyIGluIGNvbnRyb2xsZWQgbW9kZSAocHJvcEZpbHRlcmVkS2V5cyAhPT0gdW5kZWZpZW5kKVxuICAgICAgc2V0RmlsdGVyZWRLZXlzU3luYyhwcm9wRmlsdGVyZWRLZXlzIHx8IFtdKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyVmlzaWJsZShuZXdWaXNpYmxlKTsgLy8gRGVmYXVsdCB3aWxsIGZpbHRlciB3aGVuIGNsb3NlZFxuXG4gICAgaWYgKCFuZXdWaXNpYmxlICYmICFjb2x1bW4uZmlsdGVyRHJvcGRvd24pIHtcbiAgICAgIG9uQ29uZmlybSgpO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIGRyb3Bkb3duTWVudUNsYXNzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXhDbHMsIFwiLW1lbnUtd2l0aG91dC1zdWJtZW51XCIpLCAhaGFzU3ViTWVudShjb2x1bW4uZmlsdGVycyB8fCBbXSkpKTtcbiAgdmFyIGRyb3Bkb3duQ29udGVudDtcblxuICBpZiAodHlwZW9mIGNvbHVtbi5maWx0ZXJEcm9wZG93biA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRyb3Bkb3duQ29udGVudCA9IGNvbHVtbi5maWx0ZXJEcm9wZG93bih7XG4gICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KGRyb3Bkb3duUHJlZml4Q2xzLCBcIi1jdXN0b21cIiksXG4gICAgICBzZXRTZWxlY3RlZEtleXM6IGZ1bmN0aW9uIHNldFNlbGVjdGVkS2V5cyhzZWxlY3RlZEtleXMpIHtcbiAgICAgICAgcmV0dXJuIG9uU2VsZWN0S2V5cyh7XG4gICAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXNcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgc2VsZWN0ZWRLZXlzOiBnZXRGaWx0ZXJlZEtleXNTeW5jKCksXG4gICAgICBjb25maXJtOiBvbkNvbmZpcm0sXG4gICAgICBjbGVhckZpbHRlcnM6IG9uUmVzZXQsXG4gICAgICBmaWx0ZXJzOiBjb2x1bW4uZmlsdGVycyxcbiAgICAgIHZpc2libGU6IG1lcmdlZFZpc2libGVcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChjb2x1bW4uZmlsdGVyRHJvcGRvd24pIHtcbiAgICBkcm9wZG93bkNvbnRlbnQgPSBjb2x1bW4uZmlsdGVyRHJvcGRvd247XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNlbGVjdGVkS2V5cyA9IGdldEZpbHRlcmVkS2V5c1N5bmMoKSB8fCBbXTtcbiAgICBkcm9wZG93bkNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX21lbnVbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBtdWx0aXBsZTogZmlsdGVyTXVsdGlwbGUsXG4gICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KGRyb3Bkb3duUHJlZml4Q2xzLCBcIi1tZW51XCIpLFxuICAgICAgY2xhc3NOYW1lOiBkcm9wZG93bk1lbnVDbGFzcyxcbiAgICAgIG9uQ2xpY2s6IG9uTWVudUNsaWNrLFxuICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0S2V5cyxcbiAgICAgIG9uRGVzZWxlY3Q6IG9uU2VsZWN0S2V5cyxcbiAgICAgIHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgb3BlbktleXM6IG9wZW5LZXlzLFxuICAgICAgb25PcGVuQ2hhbmdlOiBvbk9wZW5DaGFuZ2VcbiAgICB9LCByZW5kZXJGaWx0ZXJJdGVtcyh7XG4gICAgICBmaWx0ZXJzOiBjb2x1bW4uZmlsdGVycyB8fCBbXSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgZmlsdGVyZWRLZXlzOiBnZXRGaWx0ZXJlZEtleXNTeW5jKCksXG4gICAgICBmaWx0ZXJNdWx0aXBsZTogZmlsdGVyTXVsdGlwbGUsXG4gICAgICBsb2NhbGU6IGxvY2FsZVxuICAgIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyb3Bkb3duLWJ0bnNcIilcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uW1wiZGVmYXVsdFwiXSwge1xuICAgICAgdHlwZTogXCJsaW5rXCIsXG4gICAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgICBkaXNhYmxlZDogc2VsZWN0ZWRLZXlzLmxlbmd0aCA9PT0gMCxcbiAgICAgIG9uQ2xpY2s6IG9uUmVzZXRcbiAgICB9LCBsb2NhbGUuZmlsdGVyUmVzZXQpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uW1wiZGVmYXVsdFwiXSwge1xuICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgICBvbkNsaWNrOiBvbkNvbmZpcm1cbiAgICB9LCBsb2NhbGUuZmlsdGVyQ29uZmlybSkpKTtcbiAgfVxuXG4gIHZhciBtZW51ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZpbHRlcldyYXBwZXJbXCJkZWZhdWx0XCJdLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyb3Bkb3duXCIpXG4gIH0sIGRyb3Bkb3duQ29udGVudCk7XG4gIHZhciBmaWx0ZXJJY29uO1xuXG4gIGlmICh0eXBlb2YgY29sdW1uLmZpbHRlckljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBmaWx0ZXJJY29uID0gY29sdW1uLmZpbHRlckljb24oZmlsdGVyZWQpO1xuICB9IGVsc2UgaWYgKGNvbHVtbi5maWx0ZXJJY29uKSB7XG4gICAgZmlsdGVySWNvbiA9IGNvbHVtbi5maWx0ZXJJY29uO1xuICB9IGVsc2Uge1xuICAgIGZpbHRlckljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRmlsdGVyRmlsbGVkW1wiZGVmYXVsdFwiXSwgbnVsbCk7XG4gIH1cblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb250ZXh0LkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbHVtblwiKSlcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sdW1uLXRpdGxlXCIpXG4gIH0sIGNoaWxkcmVuKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJpZ2dlci1jb250YWluZXJcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJpZ2dlci1jb250YWluZXItb3BlblwiKSwgbWVyZ2VkVmlzaWJsZSkpLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9kcm9wZG93bltcImRlZmF1bHRcIl0sIHtcbiAgICBvdmVybGF5OiBtZW51LFxuICAgIHRyaWdnZXI6IFsnY2xpY2snXSxcbiAgICB2aXNpYmxlOiBtZXJnZWRWaXNpYmxlLFxuICAgIG9uVmlzaWJsZUNoYW5nZTogb25WaXNpYmxlQ2hhbmdlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lcixcbiAgICBwbGFjZW1lbnQ6IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnYm90dG9tTGVmdCcgOiAnYm90dG9tUmlnaHQnXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgcm9sZTogXCJidXR0b25cIixcbiAgICB0YWJJbmRleDogLTEsXG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyaWdnZXJcIiksIHtcbiAgICAgIGFjdGl2ZTogZmlsdGVyZWRcbiAgICB9KVxuICB9LCBmaWx0ZXJJY29uKSkpKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gRmlsdGVyRHJvcGRvd247XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBGaWx0ZXJEcm9wZG93bk1lbnVXcmFwcGVyID0gZnVuY3Rpb24gRmlsdGVyRHJvcGRvd25NZW51V3JhcHBlcihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9LCBwcm9wcy5jaGlsZHJlbik7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBGaWx0ZXJEcm9wZG93bk1lbnVXcmFwcGVyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldEZpbHRlckRhdGEgPSBnZXRGaWx0ZXJEYXRhO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlsID0gcmVxdWlyZShcIi4uLy4uL3V0aWxcIik7XG5cbnZhciBfRmlsdGVyRHJvcGRvd24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0ZpbHRlckRyb3Bkb3duXCIpKTtcblxuZnVuY3Rpb24gY29sbGVjdEZpbHRlclN0YXRlcyhjb2x1bW5zLCBpbml0LCBwb3MpIHtcbiAgdmFyIGZpbHRlclN0YXRlcyA9IFtdO1xuICAoY29sdW1ucyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uLCBpbmRleCkge1xuICAgIHZhciBjb2x1bW5Qb3MgPSAoMCwgX3V0aWwuZ2V0Q29sdW1uUG9zKShpbmRleCwgcG9zKTtcblxuICAgIGlmICgnY2hpbGRyZW4nIGluIGNvbHVtbikge1xuICAgICAgZmlsdGVyU3RhdGVzID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkoZmlsdGVyU3RhdGVzKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShjb2xsZWN0RmlsdGVyU3RhdGVzKGNvbHVtbi5jaGlsZHJlbiwgaW5pdCwgY29sdW1uUG9zKSkpO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLmZpbHRlcnMgfHwgJ2ZpbHRlckRyb3Bkb3duJyBpbiBjb2x1bW4gfHwgJ29uRmlsdGVyJyBpbiBjb2x1bW4pIHtcbiAgICAgIGlmICgnZmlsdGVyZWRWYWx1ZScgaW4gY29sdW1uKSB7XG4gICAgICAgIC8vIENvbnRyb2xsZWRcbiAgICAgICAgZmlsdGVyU3RhdGVzLnB1c2goe1xuICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgIGtleTogKDAsIF91dGlsLmdldENvbHVtbktleSkoY29sdW1uLCBjb2x1bW5Qb3MpLFxuICAgICAgICAgIGZpbHRlcmVkS2V5czogY29sdW1uLmZpbHRlcmVkVmFsdWUsXG4gICAgICAgICAgZm9yY2VGaWx0ZXJlZDogY29sdW1uLmZpbHRlcmVkXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVW5jb250cm9sbGVkXG4gICAgICAgIGZpbHRlclN0YXRlcy5wdXNoKHtcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICBrZXk6ICgwLCBfdXRpbC5nZXRDb2x1bW5LZXkpKGNvbHVtbiwgY29sdW1uUG9zKSxcbiAgICAgICAgICBmaWx0ZXJlZEtleXM6IGluaXQgJiYgY29sdW1uLmRlZmF1bHRGaWx0ZXJlZFZhbHVlID8gY29sdW1uLmRlZmF1bHRGaWx0ZXJlZFZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGZvcmNlRmlsdGVyZWQ6IGNvbHVtbi5maWx0ZXJlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZmlsdGVyU3RhdGVzO1xufVxuXG5mdW5jdGlvbiBpbmplY3RGaWx0ZXIocHJlZml4Q2xzLCBkcm9wZG93blByZWZpeENscywgY29sdW1ucywgZmlsdGVyU3RhdGVzLCB0cmlnZ2VyRmlsdGVyLCBnZXRQb3B1cENvbnRhaW5lciwgbG9jYWxlLCBwb3MpIHtcbiAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4sIGluZGV4KSB7XG4gICAgdmFyIGNvbHVtblBvcyA9ICgwLCBfdXRpbC5nZXRDb2x1bW5Qb3MpKGluZGV4LCBwb3MpO1xuICAgIHZhciBfY29sdW1uJGZpbHRlck11bHRpcGwgPSBjb2x1bW4uZmlsdGVyTXVsdGlwbGUsXG4gICAgICAgIGZpbHRlck11bHRpcGxlID0gX2NvbHVtbiRmaWx0ZXJNdWx0aXBsID09PSB2b2lkIDAgPyB0cnVlIDogX2NvbHVtbiRmaWx0ZXJNdWx0aXBsO1xuXG4gICAgaWYgKGNvbHVtbi5maWx0ZXJzIHx8ICdmaWx0ZXJEcm9wZG93bicgaW4gY29sdW1uKSB7XG4gICAgICB2YXIgY29sdW1uS2V5ID0gKDAsIF91dGlsLmdldENvbHVtbktleSkoY29sdW1uLCBjb2x1bW5Qb3MpO1xuICAgICAgdmFyIGZpbHRlclN0YXRlID0gZmlsdGVyU3RhdGVzLmZpbmQoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5O1xuICAgICAgICByZXR1cm4gY29sdW1uS2V5ID09PSBrZXk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBjb2x1bW4pLCB7XG4gICAgICAgIHRpdGxlOiBmdW5jdGlvbiB0aXRsZShyZW5kZXJQcm9wcykge1xuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRmlsdGVyRHJvcGRvd25bXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZmlsdGVyXCIpLFxuICAgICAgICAgICAgZHJvcGRvd25QcmVmaXhDbHM6IGRyb3Bkb3duUHJlZml4Q2xzLFxuICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICBjb2x1bW5LZXk6IGNvbHVtbktleSxcbiAgICAgICAgICAgIGZpbHRlclN0YXRlOiBmaWx0ZXJTdGF0ZSxcbiAgICAgICAgICAgIGZpbHRlck11bHRpcGxlOiBmaWx0ZXJNdWx0aXBsZSxcbiAgICAgICAgICAgIHRyaWdnZXJGaWx0ZXI6IHRyaWdnZXJGaWx0ZXIsXG4gICAgICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgICAgICAgIH0sICgwLCBfdXRpbC5yZW5kZXJDb2x1bW5UaXRsZSkoY29sdW1uLnRpdGxlLCByZW5kZXJQcm9wcykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoJ2NoaWxkcmVuJyBpbiBjb2x1bW4pIHtcbiAgICAgIHJldHVybiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBjb2x1bW4pLCB7XG4gICAgICAgIGNoaWxkcmVuOiBpbmplY3RGaWx0ZXIocHJlZml4Q2xzLCBkcm9wZG93blByZWZpeENscywgY29sdW1uLmNoaWxkcmVuLCBmaWx0ZXJTdGF0ZXMsIHRyaWdnZXJGaWx0ZXIsIGdldFBvcHVwQ29udGFpbmVyLCBsb2NhbGUsIGNvbHVtblBvcylcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW47XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUZpbHRlckluZm8oZmlsdGVyU3RhdGVzKSB7XG4gIHZhciBjdXJyZW50RmlsdGVycyA9IHt9O1xuICBmaWx0ZXJTdGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIga2V5ID0gX3JlZjIua2V5LFxuICAgICAgICBmaWx0ZXJlZEtleXMgPSBfcmVmMi5maWx0ZXJlZEtleXM7XG4gICAgY3VycmVudEZpbHRlcnNba2V5XSA9IGZpbHRlcmVkS2V5cyB8fCBudWxsO1xuICB9KTtcbiAgcmV0dXJuIGN1cnJlbnRGaWx0ZXJzO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuS2V5cyhmaWx0ZXJzKSB7XG4gIHZhciBrZXlzID0gW107XG4gIChmaWx0ZXJzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgIHZhciB2YWx1ZSA9IF9yZWYzLnZhbHVlLFxuICAgICAgICBjaGlsZHJlbiA9IF9yZWYzLmNoaWxkcmVuO1xuICAgIGtleXMucHVzaCh2YWx1ZSk7XG5cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGtleXMgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShrZXlzKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShmbGF0dGVuS2V5cyhjaGlsZHJlbikpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gZ2V0RmlsdGVyRGF0YShkYXRhLCBmaWx0ZXJTdGF0ZXMpIHtcbiAgcmV0dXJuIGZpbHRlclN0YXRlcy5yZWR1Y2UoZnVuY3Rpb24gKGN1cnJlbnREYXRhLCBmaWx0ZXJTdGF0ZSkge1xuICAgIHZhciBfZmlsdGVyU3RhdGUkY29sdW1uID0gZmlsdGVyU3RhdGUuY29sdW1uLFxuICAgICAgICBvbkZpbHRlciA9IF9maWx0ZXJTdGF0ZSRjb2x1bW4ub25GaWx0ZXIsXG4gICAgICAgIGZpbHRlcnMgPSBfZmlsdGVyU3RhdGUkY29sdW1uLmZpbHRlcnMsXG4gICAgICAgIGZpbHRlcmVkS2V5cyA9IGZpbHRlclN0YXRlLmZpbHRlcmVkS2V5cztcblxuICAgIGlmIChvbkZpbHRlciAmJiBmaWx0ZXJlZEtleXMgJiYgZmlsdGVyZWRLZXlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnREYXRhLmZpbHRlcihmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZEtleXMuc29tZShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgdmFyIGtleXMgPSBmbGF0dGVuS2V5cyhmaWx0ZXJzKTtcbiAgICAgICAgICB2YXIga2V5SW5kZXggPSBrZXlzLmZpbmRJbmRleChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhrKSA9PT0gU3RyaW5nKGtleSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIHJlYWxLZXkgPSBrZXlJbmRleCAhPT0gLTEgPyBrZXlzW2tleUluZGV4XSA6IGtleTtcbiAgICAgICAgICByZXR1cm4gb25GaWx0ZXIocmVhbEtleSwgcmVjb3JkKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudERhdGE7XG4gIH0sIGRhdGEpO1xufVxuXG5mdW5jdGlvbiB1c2VGaWx0ZXIoX3JlZjQpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWY0LnByZWZpeENscyxcbiAgICAgIGRyb3Bkb3duUHJlZml4Q2xzID0gX3JlZjQuZHJvcGRvd25QcmVmaXhDbHMsXG4gICAgICBtZXJnZWRDb2x1bW5zID0gX3JlZjQubWVyZ2VkQ29sdW1ucyxcbiAgICAgIG9uRmlsdGVyQ2hhbmdlID0gX3JlZjQub25GaWx0ZXJDaGFuZ2UsXG4gICAgICBnZXRQb3B1cENvbnRhaW5lciA9IF9yZWY0LmdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgdGFibGVMb2NhbGUgPSBfcmVmNC5sb2NhbGU7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGNvbGxlY3RGaWx0ZXJTdGF0ZXMobWVyZ2VkQ29sdW1ucywgdHJ1ZSkpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgZmlsdGVyU3RhdGVzID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldEZpbHRlclN0YXRlcyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIG1lcmdlZEZpbHRlclN0YXRlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb2xsZWN0ZWRTdGF0ZXMgPSBjb2xsZWN0RmlsdGVyU3RhdGVzKG1lcmdlZENvbHVtbnMsIGZhbHNlKTsgLy8gUmV0dXJuIGlmIG5vdCBjb250cm9sbGVkXG5cbiAgICBpZiAoY29sbGVjdGVkU3RhdGVzLmV2ZXJ5KGZ1bmN0aW9uIChfcmVmNSkge1xuICAgICAgdmFyIGZpbHRlcmVkS2V5cyA9IF9yZWY1LmZpbHRlcmVkS2V5cztcbiAgICAgIHJldHVybiBmaWx0ZXJlZEtleXMgPT09IHVuZGVmaW5lZDtcbiAgICB9KSkge1xuICAgICAgcmV0dXJuIGZpbHRlclN0YXRlcztcbiAgICB9XG5cbiAgICByZXR1cm4gY29sbGVjdGVkU3RhdGVzO1xuICB9LCBbbWVyZ2VkQ29sdW1ucywgZmlsdGVyU3RhdGVzXSk7XG4gIHZhciBnZXRGaWx0ZXJzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZW5lcmF0ZUZpbHRlckluZm8obWVyZ2VkRmlsdGVyU3RhdGVzKTtcbiAgfSwgW21lcmdlZEZpbHRlclN0YXRlc10pO1xuXG4gIHZhciB0cmlnZ2VyRmlsdGVyID0gZnVuY3Rpb24gdHJpZ2dlckZpbHRlcihmaWx0ZXJTdGF0ZSkge1xuICAgIHZhciBuZXdGaWx0ZXJTdGF0ZXMgPSBtZXJnZWRGaWx0ZXJTdGF0ZXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIGtleSA9IF9yZWY2LmtleTtcbiAgICAgIHJldHVybiBrZXkgIT09IGZpbHRlclN0YXRlLmtleTtcbiAgICB9KTtcbiAgICBuZXdGaWx0ZXJTdGF0ZXMucHVzaChmaWx0ZXJTdGF0ZSk7XG4gICAgc2V0RmlsdGVyU3RhdGVzKG5ld0ZpbHRlclN0YXRlcyk7XG4gICAgb25GaWx0ZXJDaGFuZ2UoZ2VuZXJhdGVGaWx0ZXJJbmZvKG5ld0ZpbHRlclN0YXRlcyksIG5ld0ZpbHRlclN0YXRlcyk7XG4gIH07XG5cbiAgdmFyIHRyYW5zZm9ybUNvbHVtbnMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1Db2x1bW5zKGlubmVyQ29sdW1ucykge1xuICAgIHJldHVybiBpbmplY3RGaWx0ZXIocHJlZml4Q2xzLCBkcm9wZG93blByZWZpeENscywgaW5uZXJDb2x1bW5zLCBtZXJnZWRGaWx0ZXJTdGF0ZXMsIHRyaWdnZXJGaWx0ZXIsIGdldFBvcHVwQ29udGFpbmVyLCB0YWJsZUxvY2FsZSk7XG4gIH07XG5cbiAgcmV0dXJuIFt0cmFuc2Zvcm1Db2x1bW5zLCBtZXJnZWRGaWx0ZXJTdGF0ZXMsIGdldEZpbHRlcnNdO1xufVxuXG52YXIgX2RlZmF1bHQgPSB1c2VGaWx0ZXI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdXNlTGF6eUtWTWFwO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIHVzZUxhenlLVk1hcChkYXRhLCBjaGlsZHJlbkNvbHVtbk5hbWUsIGdldFJvd0tleSkge1xuICB2YXIgbWFwQ2FjaGVSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuXG4gIGZ1bmN0aW9uIGdldFJlY29yZEJ5S2V5KGtleSkge1xuICAgIGlmICghbWFwQ2FjaGVSZWYuY3VycmVudCB8fCBtYXBDYWNoZVJlZi5jdXJyZW50LmRhdGEgIT09IGRhdGEgfHwgbWFwQ2FjaGVSZWYuY3VycmVudC5jaGlsZHJlbkNvbHVtbk5hbWUgIT09IGNoaWxkcmVuQ29sdW1uTmFtZSB8fCBtYXBDYWNoZVJlZi5jdXJyZW50LmdldFJvd0tleSAhPT0gZ2V0Um93S2V5KSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1pbm5lci1kZWNsYXJhdGlvbnMgKi9cbiAgICAgIHZhciBkaWcgPSBmdW5jdGlvbiBkaWcocmVjb3Jkcykge1xuICAgICAgICByZWNvcmRzLmZvckVhY2goZnVuY3Rpb24gKHJlY29yZCwgaW5kZXgpIHtcbiAgICAgICAgICB2YXIgcm93S2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgICAgIGt2TWFwLnNldChyb3dLZXksIHJlY29yZCk7XG5cbiAgICAgICAgICBpZiAocmVjb3JkICYmICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKHJlY29yZCkgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuQ29sdW1uTmFtZSBpbiByZWNvcmQpIHtcbiAgICAgICAgICAgIGRpZyhyZWNvcmRbY2hpbGRyZW5Db2x1bW5OYW1lXSB8fCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG5cblxuICAgICAgdmFyIGt2TWFwID0gbmV3IE1hcCgpO1xuICAgICAgZGlnKGRhdGEpO1xuICAgICAgbWFwQ2FjaGVSZWYuY3VycmVudCA9IHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgY2hpbGRyZW5Db2x1bW5OYW1lOiBjaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgICAgIGt2TWFwOiBrdk1hcCxcbiAgICAgICAgZ2V0Um93S2V5OiBnZXRSb3dLZXlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcENhY2hlUmVmLmN1cnJlbnQua3ZNYXAuZ2V0KGtleSk7XG4gIH1cblxuICByZXR1cm4gW2dldFJlY29yZEJ5S2V5XTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldFBhZ2luYXRpb25QYXJhbSA9IGdldFBhZ2luYXRpb25QYXJhbTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdXNlUGFnaW5hdGlvbjtcbmV4cG9ydHMuREVGQVVMVF9QQUdFX1NJWkUgPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIERFRkFVTFRfUEFHRV9TSVpFID0gMTA7XG5leHBvcnRzLkRFRkFVTFRfUEFHRV9TSVpFID0gREVGQVVMVF9QQUdFX1NJWkU7XG5cbmZ1bmN0aW9uIGdldFBhZ2luYXRpb25QYXJhbShwYWdpbmF0aW9uLCBtZXJnZWRQYWdpbmF0aW9uKSB7XG4gIHZhciBwYXJhbSA9IHtcbiAgICBjdXJyZW50OiBtZXJnZWRQYWdpbmF0aW9uLmN1cnJlbnQsXG4gICAgcGFnZVNpemU6IG1lcmdlZFBhZ2luYXRpb24ucGFnZVNpemVcbiAgfTtcbiAgdmFyIHBhZ2luYXRpb25PYmogPSBwYWdpbmF0aW9uICYmICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKHBhZ2luYXRpb24pID09PSAnb2JqZWN0JyA/IHBhZ2luYXRpb24gOiB7fTtcbiAgT2JqZWN0LmtleXMocGFnaW5hdGlvbk9iaikuZm9yRWFjaChmdW5jdGlvbiAocGFnZVByb3ApIHtcbiAgICB2YXIgdmFsdWUgPSBtZXJnZWRQYWdpbmF0aW9uW3BhZ2VQcm9wXTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBhcmFtW3BhZ2VQcm9wXSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwYXJhbTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kc09iamVjdCgpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBsaXN0ID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGxpc3RbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgIGlmIChvYmopIHtcbiAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcblxuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gdXNlUGFnaW5hdGlvbih0b3RhbCwgcGFnaW5hdGlvbiwgb25DaGFuZ2UpIHtcbiAgdmFyIF9hID0gcGFnaW5hdGlvbiAmJiAoMCwgX3R5cGVvZjJbXCJkZWZhdWx0XCJdKShwYWdpbmF0aW9uKSA9PT0gJ29iamVjdCcgPyBwYWdpbmF0aW9uIDoge30sXG4gICAgICBfYSR0b3RhbCA9IF9hLnRvdGFsLFxuICAgICAgcGFnaW5hdGlvblRvdGFsID0gX2EkdG90YWwgPT09IHZvaWQgMCA/IDAgOiBfYSR0b3RhbCxcbiAgICAgIHBhZ2luYXRpb25PYmogPSBfX3Jlc3QoX2EsIFtcInRvdGFsXCJdKTtcblxuICB2YXIgX3VzZVN0YXRlID0gKDAsIF9yZWFjdC51c2VTdGF0ZSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50OiAnZGVmYXVsdEN1cnJlbnQnIGluIHBhZ2luYXRpb25PYmogPyBwYWdpbmF0aW9uT2JqLmRlZmF1bHRDdXJyZW50IDogMSxcbiAgICAgIHBhZ2VTaXplOiAnZGVmYXVsdFBhZ2VTaXplJyBpbiBwYWdpbmF0aW9uT2JqID8gcGFnaW5hdGlvbk9iai5kZWZhdWx0UGFnZVNpemUgOiBERUZBVUxUX1BBR0VfU0laRVxuICAgIH07XG4gIH0pLFxuICAgICAgX3VzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfdXNlU3RhdGUsIDIpLFxuICAgICAgaW5uZXJQYWdpbmF0aW9uID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNldElubmVyUGFnaW5hdGlvbiA9IF91c2VTdGF0ZTJbMV07IC8vID09PT09PT09PT09PSBCYXNpYyBQYWdpbmF0aW9uIENvbmZpZyA9PT09PT09PT09PT1cblxuXG4gIHZhciBtZXJnZWRQYWdpbmF0aW9uID0gZXh0ZW5kc09iamVjdChpbm5lclBhZ2luYXRpb24sIHBhZ2luYXRpb25PYmosIHtcbiAgICB0b3RhbDogcGFnaW5hdGlvblRvdGFsID4gMCA/IHBhZ2luYXRpb25Ub3RhbCA6IHRvdGFsXG4gIH0pO1xuXG4gIGlmICghcGFnaW5hdGlvblRvdGFsKSB7XG4gICAgLy8gUmVzZXQgYGN1cnJlbnRgIGlmIGRhdGEgbGVuZ3RoIGNoYW5nZWQuIE9ubHkgcmVzZXQgd2hlbiBwYWdpbmF0aW9uT2JqIGRvIG5vdCBoYXZlIHRvdGFsXG4gICAgdmFyIG1heFBhZ2UgPSBNYXRoLmNlaWwodG90YWwgLyBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplKTtcblxuICAgIGlmIChtYXhQYWdlIDwgbWVyZ2VkUGFnaW5hdGlvbi5jdXJyZW50KSB7XG4gICAgICBtZXJnZWRQYWdpbmF0aW9uLmN1cnJlbnQgPSAxO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZWZyZXNoUGFnaW5hdGlvbiA9IGZ1bmN0aW9uIHJlZnJlc2hQYWdpbmF0aW9uKCkge1xuICAgIHZhciBjdXJyZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxO1xuICAgIHZhciBwYWdlU2l6ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHNldElubmVyUGFnaW5hdGlvbigoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBtZXJnZWRQYWdpbmF0aW9uKSwge1xuICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZSB8fCBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplXG4gICAgfSkpO1xuICB9O1xuXG4gIHZhciBvbkludGVybmFsQ2hhbmdlID0gZnVuY3Rpb24gb25JbnRlcm5hbENoYW5nZShjdXJyZW50LCBwYWdlU2l6ZSkge1xuICAgIHZhciBwYWdpbmF0aW9uUGFnZVNpemUgPSBtZXJnZWRQYWdpbmF0aW9uID09PSBudWxsIHx8IG1lcmdlZFBhZ2luYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lcmdlZFBhZ2luYXRpb24ucGFnZVNpemU7XG5cbiAgICBpZiAocGFnZVNpemUgJiYgcGFnZVNpemUgIT09IHBhZ2luYXRpb25QYWdlU2l6ZSkge1xuICAgICAgY3VycmVudCA9IDE7XG4gICAgICBpZiAocGFnaW5hdGlvbiAmJiBwYWdpbmF0aW9uLm9uU2hvd1NpemVDaGFuZ2UpIHBhZ2luYXRpb24ub25TaG93U2l6ZUNoYW5nZShjdXJyZW50LCBwYWdlU2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhZ2luYXRpb24gJiYgcGFnaW5hdGlvbi5vbkNoYW5nZSkgcGFnaW5hdGlvbi5vbkNoYW5nZShjdXJyZW50LCBwYWdlU2l6ZSk7XG4gICAgcmVmcmVzaFBhZ2luYXRpb24oY3VycmVudCwgcGFnZVNpemUpO1xuICAgIG9uQ2hhbmdlKGN1cnJlbnQsIHBhZ2VTaXplIHx8IHBhZ2luYXRpb25QYWdlU2l6ZSk7XG4gIH07XG5cbiAgaWYgKHBhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFt7fSwgZnVuY3Rpb24gKCkge31dO1xuICB9XG5cbiAgcmV0dXJuIFsoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBtZXJnZWRQYWdpbmF0aW9uKSwge1xuICAgIG9uQ2hhbmdlOiBvbkludGVybmFsQ2hhbmdlXG4gIH0pLCByZWZyZXNoUGFnaW5hdGlvbl07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB1c2VTZWxlY3Rpb247XG5leHBvcnRzLlNFTEVDVElPTl9JTlZFUlQgPSBleHBvcnRzLlNFTEVDVElPTl9BTEwgPSB2b2lkIDA7XG5cbnZhciBfdG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQXJyYXlcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Eb3duT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Eb3duT3V0bGluZWRcIikpO1xuXG52YXIgX3RyZWVVdGlsID0gcmVxdWlyZShcInJjLXRyZWUvbGliL3V0aWxzL3RyZWVVdGlsXCIpO1xuXG52YXIgX2NvbmR1Y3RVdGlsID0gcmVxdWlyZShcInJjLXRyZWUvbGliL3V0aWxzL2NvbmR1Y3RVdGlsXCIpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwicmMtdHJlZS9saWIvdXRpbFwiKTtcblxudmFyIF9yY1RhYmxlID0gcmVxdWlyZShcInJjLXRhYmxlXCIpO1xuXG52YXIgX3VzZU1lcmdlZFN0YXRlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCIpKTtcblxudmFyIF9jaGVja2JveCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2NoZWNrYm94XCIpKTtcblxudmFyIF9kcm9wZG93biA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2Ryb3Bkb3duXCIpKTtcblxudmFyIF9tZW51ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vbWVudVwiKSk7XG5cbnZhciBfcmFkaW8gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9yYWRpb1wiKSk7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG4vLyBUT0RPOiB3YXJuaW5nIGlmIHVzZSBhamF4ISEhXG52YXIgU0VMRUNUSU9OX0FMTCA9ICdTRUxFQ1RfQUxMJztcbmV4cG9ydHMuU0VMRUNUSU9OX0FMTCA9IFNFTEVDVElPTl9BTEw7XG52YXIgU0VMRUNUSU9OX0lOVkVSVCA9ICdTRUxFQ1RfSU5WRVJUJztcbmV4cG9ydHMuU0VMRUNUSU9OX0lOVkVSVCA9IFNFTEVDVElPTl9JTlZFUlQ7XG5cbmZ1bmN0aW9uIGdldEZpeGVkVHlwZShjb2x1bW4pIHtcbiAgcmV0dXJuIGNvbHVtbiAmJiBjb2x1bW4uZml4ZWQ7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5EYXRhKGRhdGEsIGNoaWxkcmVuQ29sdW1uTmFtZSkge1xuICB2YXIgbGlzdCA9IFtdO1xuICAoZGF0YSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgbGlzdC5wdXNoKHJlY29yZCk7XG5cbiAgICBpZiAocmVjb3JkICYmICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKHJlY29yZCkgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuQ29sdW1uTmFtZSBpbiByZWNvcmQpIHtcbiAgICAgIGxpc3QgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShsaXN0KSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShmbGF0dGVuRGF0YShyZWNvcmRbY2hpbGRyZW5Db2x1bW5OYW1lXSwgY2hpbGRyZW5Db2x1bW5OYW1lKSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaXN0O1xufVxuXG5mdW5jdGlvbiB1c2VTZWxlY3Rpb24ocm93U2VsZWN0aW9uLCBjb25maWcpIHtcbiAgdmFyIF9yZWYgPSByb3dTZWxlY3Rpb24gfHwge30sXG4gICAgICBwcmVzZXJ2ZVNlbGVjdGVkUm93S2V5cyA9IF9yZWYucHJlc2VydmVTZWxlY3RlZFJvd0tleXMsXG4gICAgICBzZWxlY3RlZFJvd0tleXMgPSBfcmVmLnNlbGVjdGVkUm93S2V5cyxcbiAgICAgIGdldENoZWNrYm94UHJvcHMgPSBfcmVmLmdldENoZWNrYm94UHJvcHMsXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZSA9IF9yZWYub25DaGFuZ2UsXG4gICAgICBvblNlbGVjdCA9IF9yZWYub25TZWxlY3QsXG4gICAgICBvblNlbGVjdEFsbCA9IF9yZWYub25TZWxlY3RBbGwsXG4gICAgICBvblNlbGVjdEludmVydCA9IF9yZWYub25TZWxlY3RJbnZlcnQsXG4gICAgICBvblNlbGVjdE11bHRpcGxlID0gX3JlZi5vblNlbGVjdE11bHRpcGxlLFxuICAgICAgc2VsZWN0aW9uQ29sV2lkdGggPSBfcmVmLmNvbHVtbldpZHRoLFxuICAgICAgc2VsZWN0aW9uVHlwZSA9IF9yZWYudHlwZSxcbiAgICAgIHNlbGVjdGlvbnMgPSBfcmVmLnNlbGVjdGlvbnMsXG4gICAgICBmaXhlZCA9IF9yZWYuZml4ZWQsXG4gICAgICBjdXN0b21pemVSZW5kZXJDZWxsID0gX3JlZi5yZW5kZXJDZWxsLFxuICAgICAgaGlkZVNlbGVjdEFsbCA9IF9yZWYuaGlkZVNlbGVjdEFsbCxcbiAgICAgIF9yZWYkY2hlY2tTdHJpY3RseSA9IF9yZWYuY2hlY2tTdHJpY3RseSxcbiAgICAgIGNoZWNrU3RyaWN0bHkgPSBfcmVmJGNoZWNrU3RyaWN0bHkgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmJGNoZWNrU3RyaWN0bHk7XG5cbiAgdmFyIHByZWZpeENscyA9IGNvbmZpZy5wcmVmaXhDbHMsXG4gICAgICBkYXRhID0gY29uZmlnLmRhdGEsXG4gICAgICBwYWdlRGF0YSA9IGNvbmZpZy5wYWdlRGF0YSxcbiAgICAgIGdldFJlY29yZEJ5S2V5ID0gY29uZmlnLmdldFJlY29yZEJ5S2V5LFxuICAgICAgZ2V0Um93S2V5ID0gY29uZmlnLmdldFJvd0tleSxcbiAgICAgIGV4cGFuZFR5cGUgPSBjb25maWcuZXhwYW5kVHlwZSxcbiAgICAgIGNoaWxkcmVuQ29sdW1uTmFtZSA9IGNvbmZpZy5jaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgICB0YWJsZUxvY2FsZSA9IGNvbmZpZy5sb2NhbGUsXG4gICAgICBleHBhbmRJY29uQ29sdW1uSW5kZXggPSBjb25maWcuZXhwYW5kSWNvbkNvbHVtbkluZGV4LFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBjb25maWcuZ2V0UG9wdXBDb250YWluZXI7IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBDYWNoZXMgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIHByZXNlcnZlUmVjb3Jkc1JlZiA9IFJlYWN0LnVzZVJlZihuZXcgTWFwKCkpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEtleXMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSAoMCwgX3VzZU1lcmdlZFN0YXRlM1tcImRlZmF1bHRcIl0pKHNlbGVjdGVkUm93S2V5cyB8fCBbXSwge1xuICAgIHZhbHVlOiBzZWxlY3RlZFJvd0tleXNcbiAgfSksXG4gICAgICBfdXNlTWVyZ2VkU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgICBtZXJnZWRTZWxlY3RlZEtleXMgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgICAgc2V0TWVyZ2VkU2VsZWN0ZWRLZXlzID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcblxuICB2YXIgX3VzZU1lbW8gPSAoMCwgUmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjaGVja1N0cmljdGx5ID8ge1xuICAgICAga2V5RW50aXRpZXM6IG51bGxcbiAgICB9IDogKDAsIF90cmVlVXRpbC5jb252ZXJ0RGF0YVRvRW50aXRpZXMpKGRhdGEsIHVuZGVmaW5lZCwgZ2V0Um93S2V5KTtcbiAgfSwgW2RhdGEsIGdldFJvd0tleSwgY2hlY2tTdHJpY3RseV0pLFxuICAgICAga2V5RW50aXRpZXMgPSBfdXNlTWVtby5rZXlFbnRpdGllczsgLy8gR2V0IGZsYXR0ZW4gZGF0YVxuXG5cbiAgdmFyIGZsYXR0ZWREYXRhID0gKDAsIFJlYWN0LnVzZU1lbW8pKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmxhdHRlbkRhdGEocGFnZURhdGEsIGNoaWxkcmVuQ29sdW1uTmFtZSk7XG4gIH0sIFtwYWdlRGF0YSwgY2hpbGRyZW5Db2x1bW5OYW1lXSk7IC8vIEdldCBhbGwgY2hlY2tib3ggcHJvcHNcblxuICB2YXIgY2hlY2tib3hQcm9wc01hcCA9ICgwLCBSZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICBmbGF0dGVkRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyZWNvcmQsIGluZGV4KSB7XG4gICAgICB2YXIga2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgdmFyIGNoZWNrYm94UHJvcHMgPSAoZ2V0Q2hlY2tib3hQcm9wcyA/IGdldENoZWNrYm94UHJvcHMocmVjb3JkKSA6IG51bGwpIHx8IHt9O1xuICAgICAgbWFwLnNldChrZXksIGNoZWNrYm94UHJvcHMpO1xuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAoJ2NoZWNrZWQnIGluIGNoZWNrYm94UHJvcHMgfHwgJ2RlZmF1bHRDaGVja2VkJyBpbiBjaGVja2JveFByb3BzKSkge1xuICAgICAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKShmYWxzZSwgJ1RhYmxlJywgJ0RvIG5vdCBzZXQgYGNoZWNrZWRgIG9yIGBkZWZhdWx0Q2hlY2tlZGAgaW4gYGdldENoZWNrYm94UHJvcHNgLiBQbGVhc2UgdXNlIGBzZWxlY3RlZFJvd0tleXNgIGluc3RlYWQuJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfSwgW2ZsYXR0ZWREYXRhLCBnZXRSb3dLZXksIGdldENoZWNrYm94UHJvcHNdKTtcbiAgdmFyIGlzQ2hlY2tib3hEaXNhYmxlZCA9ICgwLCBSZWFjdC51c2VDYWxsYmFjaykoZnVuY3Rpb24gKHIpIHtcbiAgICB2YXIgX2E7XG5cbiAgICByZXR1cm4gISEoKF9hID0gY2hlY2tib3hQcm9wc01hcC5nZXQoZ2V0Um93S2V5KHIpKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRpc2FibGVkKTtcbiAgfSwgW2NoZWNrYm94UHJvcHNNYXAsIGdldFJvd0tleV0pO1xuXG4gIHZhciBfdXNlTWVtbzIgPSAoMCwgUmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgIGlmIChjaGVja1N0cmljdGx5KSB7XG4gICAgICByZXR1cm4gW21lcmdlZFNlbGVjdGVkS2V5cywgW11dO1xuICAgIH1cblxuICAgIHZhciBfY29uZHVjdENoZWNrID0gKDAsIF9jb25kdWN0VXRpbC5jb25kdWN0Q2hlY2spKG1lcmdlZFNlbGVjdGVkS2V5cywgdHJ1ZSwga2V5RW50aXRpZXMsIGlzQ2hlY2tib3hEaXNhYmxlZCksXG4gICAgICAgIGNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5jaGVja2VkS2V5cyxcbiAgICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5oYWxmQ2hlY2tlZEtleXM7XG5cbiAgICByZXR1cm4gW2NoZWNrZWRLZXlzLCBoYWxmQ2hlY2tlZEtleXNdO1xuICB9LCBbbWVyZ2VkU2VsZWN0ZWRLZXlzLCBjaGVja1N0cmljdGx5LCBrZXlFbnRpdGllcywgaXNDaGVja2JveERpc2FibGVkXSksXG4gICAgICBfdXNlTWVtbzMgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX3VzZU1lbW8yLCAyKSxcbiAgICAgIGRlcml2ZWRTZWxlY3RlZEtleXMgPSBfdXNlTWVtbzNbMF0sXG4gICAgICBkZXJpdmVkSGFsZlNlbGVjdGVkS2V5cyA9IF91c2VNZW1vM1sxXTtcblxuICB2YXIgZGVyaXZlZFNlbGVjdGVkS2V5U2V0ID0gKDAsIFJlYWN0LnVzZU1lbW8pKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIga2V5cyA9IHNlbGVjdGlvblR5cGUgPT09ICdyYWRpbycgPyBkZXJpdmVkU2VsZWN0ZWRLZXlzLnNsaWNlKDAsIDEpIDogZGVyaXZlZFNlbGVjdGVkS2V5cztcbiAgICByZXR1cm4gbmV3IFNldChrZXlzKTtcbiAgfSwgW2Rlcml2ZWRTZWxlY3RlZEtleXMsIHNlbGVjdGlvblR5cGVdKTtcbiAgdmFyIGRlcml2ZWRIYWxmU2VsZWN0ZWRLZXlTZXQgPSAoMCwgUmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzZWxlY3Rpb25UeXBlID09PSAncmFkaW8nID8gbmV3IFNldCgpIDogbmV3IFNldChkZXJpdmVkSGFsZlNlbGVjdGVkS2V5cyk7XG4gIH0sIFtkZXJpdmVkSGFsZlNlbGVjdGVkS2V5cywgc2VsZWN0aW9uVHlwZV0pOyAvLyBTYXZlIGxhc3Qgc2VsZWN0ZWQga2V5IHRvIGVuYWJsZSByYW5nZSBzZWxlY3Rpb25cblxuICB2YXIgX3VzZVN0YXRlID0gKDAsIFJlYWN0LnVzZVN0YXRlKShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGxhc3RTZWxlY3RlZEtleSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRMYXN0U2VsZWN0ZWRLZXkgPSBfdXNlU3RhdGUyWzFdOyAvLyBSZXNldCBpZiByb3dTZWxlY3Rpb24gcmVzZXRcblxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFyb3dTZWxlY3Rpb24pIHtcbiAgICAgIHNldE1lcmdlZFNlbGVjdGVkS2V5cyhbXSk7XG4gICAgfVxuICB9LCBbISFyb3dTZWxlY3Rpb25dKTtcbiAgdmFyIHNldFNlbGVjdGVkS2V5cyA9ICgwLCBSZWFjdC51c2VDYWxsYmFjaykoZnVuY3Rpb24gKGtleXMpIHtcbiAgICB2YXIgYXZhaWxhYmxlS2V5cztcbiAgICB2YXIgcmVjb3JkcztcblxuICAgIGlmIChwcmVzZXJ2ZVNlbGVjdGVkUm93S2V5cykge1xuICAgICAgLy8gS2VlcCBrZXkgaWYgbWFyayBhcyBwcmVzZXJ2ZVNlbGVjdGVkUm93S2V5c1xuICAgICAgdmFyIG5ld0NhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgYXZhaWxhYmxlS2V5cyA9IGtleXM7XG4gICAgICByZWNvcmRzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgcmVjb3JkID0gZ2V0UmVjb3JkQnlLZXkoa2V5KTtcblxuICAgICAgICBpZiAoIXJlY29yZCAmJiBwcmVzZXJ2ZVJlY29yZHNSZWYuY3VycmVudC5oYXMoa2V5KSkge1xuICAgICAgICAgIHJlY29yZCA9IHByZXNlcnZlUmVjb3Jkc1JlZi5jdXJyZW50LmdldChrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3Q2FjaGUuc2V0KGtleSwgcmVjb3JkKTtcbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgIH0pOyAvLyBSZWZyZXNoIHRvIG5ldyBjYWNoZVxuXG4gICAgICBwcmVzZXJ2ZVJlY29yZHNSZWYuY3VycmVudCA9IG5ld0NhY2hlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaWx0ZXIga2V5IHdoaWNoIG5vdCBleGlzdCBpbiB0aGUgYGRhdGFTb3VyY2VgXG4gICAgICBhdmFpbGFibGVLZXlzID0gW107XG4gICAgICByZWNvcmRzID0gW107XG4gICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgcmVjb3JkID0gZ2V0UmVjb3JkQnlLZXkoa2V5KTtcblxuICAgICAgICBpZiAocmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhdmFpbGFibGVLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0TWVyZ2VkU2VsZWN0ZWRLZXlzKGF2YWlsYWJsZUtleXMpO1xuXG4gICAgaWYgKG9uU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICBvblNlbGVjdGlvbkNoYW5nZShhdmFpbGFibGVLZXlzLCByZWNvcmRzKTtcbiAgICB9XG4gIH0sIFtzZXRNZXJnZWRTZWxlY3RlZEtleXMsIGdldFJlY29yZEJ5S2V5LCBvblNlbGVjdGlvbkNoYW5nZSwgcHJlc2VydmVTZWxlY3RlZFJvd0tleXNdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJpZ2dlciBzaW5nbGUgYG9uU2VsZWN0YCBldmVudFxuXG4gIHZhciB0cmlnZ2VyU2luZ2xlU2VsZWN0aW9uID0gKDAsIFJlYWN0LnVzZUNhbGxiYWNrKShmdW5jdGlvbiAoa2V5LCBzZWxlY3RlZCwga2V5cywgZXZlbnQpIHtcbiAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgIHZhciByb3dzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0dXJuIGdldFJlY29yZEJ5S2V5KGspO1xuICAgICAgfSk7XG4gICAgICBvblNlbGVjdChnZXRSZWNvcmRCeUtleShrZXkpLCBzZWxlY3RlZCwgcm93cywgZXZlbnQpO1xuICAgIH1cblxuICAgIHNldFNlbGVjdGVkS2V5cyhrZXlzKTtcbiAgfSwgW29uU2VsZWN0LCBnZXRSZWNvcmRCeUtleSwgc2V0U2VsZWN0ZWRLZXlzXSk7XG4gIHZhciBtZXJnZWRTZWxlY3Rpb25zID0gKDAsIFJlYWN0LnVzZU1lbW8pKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNlbGVjdGlvbnMgfHwgaGlkZVNlbGVjdEFsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHNlbGVjdGlvbkxpc3QgPSBzZWxlY3Rpb25zID09PSB0cnVlID8gW1NFTEVDVElPTl9BTEwsIFNFTEVDVElPTl9JTlZFUlRdIDogc2VsZWN0aW9ucztcbiAgICByZXR1cm4gc2VsZWN0aW9uTGlzdC5tYXAoZnVuY3Rpb24gKHNlbGVjdGlvbikge1xuICAgICAgaWYgKHNlbGVjdGlvbiA9PT0gU0VMRUNUSU9OX0FMTCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleTogJ2FsbCcsXG4gICAgICAgICAgdGV4dDogdGFibGVMb2NhbGUuc2VsZWN0aW9uQWxsLFxuICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdCgpIHtcbiAgICAgICAgICAgIHNldFNlbGVjdGVkS2V5cyhkYXRhLm1hcChmdW5jdGlvbiAocmVjb3JkLCBpbmRleCkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGlvbiA9PT0gU0VMRUNUSU9OX0lOVkVSVCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleTogJ2ludmVydCcsXG4gICAgICAgICAgdGV4dDogdGFibGVMb2NhbGUuc2VsZWN0SW52ZXJ0LFxuICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdCgpIHtcbiAgICAgICAgICAgIHZhciBrZXlTZXQgPSBuZXcgU2V0KGRlcml2ZWRTZWxlY3RlZEtleVNldCk7XG4gICAgICAgICAgICBwYWdlRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyZWNvcmQsIGluZGV4KSB7XG4gICAgICAgICAgICAgIHZhciBrZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCk7XG5cbiAgICAgICAgICAgICAgaWYgKGtleVNldC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGtleVNldFtcImRlbGV0ZVwiXShrZXkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGtleVNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEFycmF5LmZyb20oa2V5U2V0KTtcbiAgICAgICAgICAgIHNldFNlbGVjdGVkS2V5cyhrZXlzKTtcblxuICAgICAgICAgICAgaWYgKG9uU2VsZWN0SW52ZXJ0KSB7XG4gICAgICAgICAgICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKGZhbHNlLCAnVGFibGUnLCAnYG9uU2VsZWN0SW52ZXJ0YCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlLiBQbGVhc2UgdXNlIGBvbkNoYW5nZWAgaW5zdGVhZC4nKTtcbiAgICAgICAgICAgICAgb25TZWxlY3RJbnZlcnQoa2V5cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZWN0aW9uO1xuICAgIH0pO1xuICB9LCBbc2VsZWN0aW9ucywgZGVyaXZlZFNlbGVjdGVkS2V5U2V0LCBwYWdlRGF0YSwgZ2V0Um93S2V5LCBvblNlbGVjdEludmVydCwgc2V0U2VsZWN0ZWRLZXlzXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09IENvbHVtbnMgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIHRyYW5zZm9ybUNvbHVtbnMgPSAoMCwgUmVhY3QudXNlQ2FsbGJhY2spKGZ1bmN0aW9uIChjb2x1bW5zKSB7XG4gICAgaWYgKCFyb3dTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0gLy8gU3VwcG9ydCBzZWxlY3Rpb25cblxuXG4gICAgdmFyIGtleVNldCA9IG5ldyBTZXQoZGVyaXZlZFNlbGVjdGVkS2V5U2V0KTsgLy8gUmVjb3JkIGtleSBvbmx5IG5lZWQgY2hlY2sgd2l0aCBlbmFibGVkXG5cbiAgICB2YXIgcmVjb3JkS2V5cyA9IGZsYXR0ZWREYXRhLm1hcChnZXRSb3dLZXkpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gIWNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSkuZGlzYWJsZWQ7XG4gICAgfSk7XG4gICAgdmFyIGNoZWNrZWRDdXJyZW50QWxsID0gcmVjb3JkS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4ga2V5U2V0LmhhcyhrZXkpO1xuICAgIH0pO1xuICAgIHZhciBjaGVja2VkQ3VycmVudFNvbWUgPSByZWNvcmRLZXlzLnNvbWUoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIGtleVNldC5oYXMoa2V5KTtcbiAgICB9KTtcblxuICAgIHZhciBvblNlbGVjdEFsbENoYW5nZSA9IGZ1bmN0aW9uIG9uU2VsZWN0QWxsQ2hhbmdlKCkge1xuICAgICAgdmFyIGNoYW5nZUtleXMgPSBbXTtcblxuICAgICAgaWYgKGNoZWNrZWRDdXJyZW50QWxsKSB7XG4gICAgICAgIHJlY29yZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAga2V5U2V0W1wiZGVsZXRlXCJdKGtleSk7XG4gICAgICAgICAgY2hhbmdlS2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjb3JkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBpZiAoIWtleVNldC5oYXMoa2V5KSkge1xuICAgICAgICAgICAga2V5U2V0LmFkZChrZXkpO1xuICAgICAgICAgICAgY2hhbmdlS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleXMgPSBBcnJheS5mcm9tKGtleVNldCk7XG4gICAgICBzZXRTZWxlY3RlZEtleXMoa2V5cyk7XG5cbiAgICAgIGlmIChvblNlbGVjdEFsbCkge1xuICAgICAgICBvblNlbGVjdEFsbCghY2hlY2tlZEN1cnJlbnRBbGwsIGtleXMubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFJlY29yZEJ5S2V5KGspO1xuICAgICAgICB9KSwgY2hhbmdlS2V5cy5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICByZXR1cm4gZ2V0UmVjb3JkQnlLZXkoayk7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFRpdGxlIENlbGxcblxuXG4gICAgdmFyIHRpdGxlO1xuXG4gICAgaWYgKHNlbGVjdGlvblR5cGUgIT09ICdyYWRpbycpIHtcbiAgICAgIHZhciBjdXN0b21pemVTZWxlY3Rpb25zO1xuXG4gICAgICBpZiAobWVyZ2VkU2VsZWN0aW9ucykge1xuICAgICAgICB2YXIgbWVudSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9tZW51W1wiZGVmYXVsdFwiXSwge1xuICAgICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgICAgICB9LCBtZXJnZWRTZWxlY3Rpb25zLm1hcChmdW5jdGlvbiAoc2VsZWN0aW9uLCBpbmRleCkge1xuICAgICAgICAgIHZhciBrZXkgPSBzZWxlY3Rpb24ua2V5LFxuICAgICAgICAgICAgICB0ZXh0ID0gc2VsZWN0aW9uLnRleHQsXG4gICAgICAgICAgICAgIG9uU2VsZWN0aW9uQ2xpY2sgPSBzZWxlY3Rpb24ub25TZWxlY3Q7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9tZW51W1wiZGVmYXVsdFwiXS5JdGVtLCB7XG4gICAgICAgICAgICBrZXk6IGtleSB8fCBpbmRleCxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICAgIGlmIChvblNlbGVjdGlvbkNsaWNrKSB7XG4gICAgICAgICAgICAgICAgb25TZWxlY3Rpb25DbGljayhyZWNvcmRLZXlzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRleHQpO1xuICAgICAgICB9KSk7XG4gICAgICAgIGN1c3RvbWl6ZVNlbGVjdGlvbnMgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1leHRyYVwiKVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfZHJvcGRvd25bXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgICAgb3ZlcmxheTogbWVudSxcbiAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Eb3duT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSkpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFsbERpc2FibGVkID0gZmxhdHRlZERhdGEuZXZlcnkoZnVuY3Rpb24gKHJlY29yZCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGtleSA9IGdldFJvd0tleShyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgdmFyIGNoZWNrYm94UHJvcHMgPSBjaGVja2JveFByb3BzTWFwLmdldChrZXkpIHx8IHt9O1xuICAgICAgICByZXR1cm4gY2hlY2tib3hQcm9wcy5kaXNhYmxlZDtcbiAgICAgIH0pO1xuICAgICAgdGl0bGUgPSAhaGlkZVNlbGVjdEFsbCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb25cIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jaGVja2JveFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgY2hlY2tlZDogIWFsbERpc2FibGVkICYmICEhZmxhdHRlZERhdGEubGVuZ3RoICYmIGNoZWNrZWRDdXJyZW50QWxsLFxuICAgICAgICBpbmRldGVybWluYXRlOiAhY2hlY2tlZEN1cnJlbnRBbGwgJiYgY2hlY2tlZEN1cnJlbnRTb21lLFxuICAgICAgICBvbkNoYW5nZTogb25TZWxlY3RBbGxDaGFuZ2UsXG4gICAgICAgIGRpc2FibGVkOiBmbGF0dGVkRGF0YS5sZW5ndGggPT09IDAgfHwgYWxsRGlzYWJsZWRcbiAgICAgIH0pLCBjdXN0b21pemVTZWxlY3Rpb25zKTtcbiAgICB9IC8vIEJvZHkgQ2VsbFxuXG5cbiAgICB2YXIgcmVuZGVyQ2VsbDtcblxuICAgIGlmIChzZWxlY3Rpb25UeXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZW5kZXJDZWxsID0gZnVuY3Rpb24gcmVuZGVyQ2VsbChfLCByZWNvcmQsIGluZGV4KSB7XG4gICAgICAgIHZhciBrZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCk7XG4gICAgICAgIHZhciBjaGVja2VkID0ga2V5U2V0LmhhcyhrZXkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yYWRpb1tcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgY2hlY2tib3hQcm9wc01hcC5nZXQoa2V5KSwge1xuICAgICAgICAgICAgY2hlY2tlZDogY2hlY2tlZCxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKCFrZXlTZXQuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyU2luZ2xlU2VsZWN0aW9uKGtleSwgdHJ1ZSwgW2tleV0sIGV2ZW50Lm5hdGl2ZUV2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBjaGVja2VkOiBjaGVja2VkXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZW5kZXJDZWxsID0gZnVuY3Rpb24gcmVuZGVyQ2VsbChfLCByZWNvcmQsIGluZGV4KSB7XG4gICAgICAgIHZhciBfYTtcblxuICAgICAgICB2YXIga2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGtleVNldC5oYXMoa2V5KTtcbiAgICAgICAgdmFyIGluZGV0ZXJtaW5hdGUgPSBkZXJpdmVkSGFsZlNlbGVjdGVkS2V5U2V0LmhhcyhrZXkpO1xuICAgICAgICB2YXIgY2hlY2tib3hQcm9wcyA9IGNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSk7XG4gICAgICAgIHZhciBtZXJnZWRJbmRldGVybWluYXRlO1xuXG4gICAgICAgIGlmIChleHBhbmRUeXBlID09PSAnbmVzdCcpIHtcbiAgICAgICAgICBtZXJnZWRJbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcbiAgICAgICAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKSghKHR5cGVvZiAoY2hlY2tib3hQcm9wcyA9PT0gbnVsbCB8fCBjaGVja2JveFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveFByb3BzLmluZGV0ZXJtaW5hdGUpID09PSAnYm9vbGVhbicpLCAnVGFibGUnLCAnc2V0IGBpbmRldGVybWluYXRlYCB1c2luZyBgcm93U2VsZWN0aW9uLmdldENoZWNrYm94UHJvcHNgIGlzIG5vdCBhbGxvd2VkIHdpdGggdHJlZSBzdHJ1Y3R1cmVkIGRhdGFTb3VyY2UuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVyZ2VkSW5kZXRlcm1pbmF0ZSA9IChfYSA9IGNoZWNrYm94UHJvcHMgPT09IG51bGwgfHwgY2hlY2tib3hQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hQcm9wcy5pbmRldGVybWluYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBpbmRldGVybWluYXRlO1xuICAgICAgICB9IC8vIFJlY29yZCBjaGVja2VkXG5cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jaGVja2JveFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgY2hlY2tib3hQcm9wcywge1xuICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogbWVyZ2VkSW5kZXRlcm1pbmF0ZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IGNoZWNrZWQsXG4gICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKF9yZWYyKSB7XG4gICAgICAgICAgICAgIHZhciBuYXRpdmVFdmVudCA9IF9yZWYyLm5hdGl2ZUV2ZW50O1xuICAgICAgICAgICAgICB2YXIgc2hpZnRLZXkgPSBuYXRpdmVFdmVudC5zaGlmdEtleTtcbiAgICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgdmFyIGVuZEluZGV4ID0gLTE7IC8vIEdldCByYW5nZSBvZiB0aGlzXG5cbiAgICAgICAgICAgICAgaWYgKHNoaWZ0S2V5ICYmIGNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRLZXlzID0gbmV3IFNldChbbGFzdFNlbGVjdGVkS2V5LCBrZXldKTtcbiAgICAgICAgICAgICAgICByZWNvcmRLZXlzLnNvbWUoZnVuY3Rpb24gKHJlY29yZEtleSwgcmVjb3JkSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwb2ludEtleXMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHJlY29yZEluZGV4O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gcmVjb3JkSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ICE9PSAtMSAmJiBzdGFydEluZGV4ICE9PSBlbmRJbmRleCAmJiBjaGVja1N0cmljdGx5KSB7XG4gICAgICAgICAgICAgICAgLy8gQmF0Y2ggdXBkYXRlIHNlbGVjdGlvbnNcbiAgICAgICAgICAgICAgICB2YXIgcmFuZ2VLZXlzID0gcmVjb3JkS2V5cy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIHZhciBjaGFuZ2VkS2V5cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgIHJhbmdlS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNvcmRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleVNldC5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRLZXlzLnB1c2gocmVjb3JkS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRbXCJkZWxldGVcIl0ocmVjb3JkS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJhbmdlS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNvcmRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXlTZXQuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkS2V5cy5wdXNoKHJlY29yZEtleSk7XG4gICAgICAgICAgICAgICAgICAgICAga2V5U2V0LmFkZChyZWNvcmRLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IEFycmF5LmZyb20oa2V5U2V0KTtcbiAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEtleXMoa2V5cyk7XG5cbiAgICAgICAgICAgICAgICBpZiAob25TZWxlY3RNdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgb25TZWxlY3RNdWx0aXBsZSghY2hlY2tlZCwga2V5cy5tYXAoZnVuY3Rpb24gKHJlY29yZEtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVjb3JkQnlLZXkocmVjb3JkS2V5KTtcbiAgICAgICAgICAgICAgICAgIH0pLCBjaGFuZ2VkS2V5cy5tYXAoZnVuY3Rpb24gKHJlY29yZEtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVjb3JkQnlLZXkocmVjb3JkS2V5KTtcbiAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlIHJlY29yZCBzZWxlY3RlZFxuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5DaGVja2VkS2V5cyA9IGRlcml2ZWRTZWxlY3RlZEtleXM7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tTdHJpY3RseSkge1xuICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrZWRLZXlzID0gY2hlY2tlZCA/ICgwLCBfdXRpbC5hcnJEZWwpKG9yaWdpbkNoZWNrZWRLZXlzLCBrZXkpIDogKDAsIF91dGlsLmFyckFkZCkob3JpZ2luQ2hlY2tlZEtleXMsIGtleSk7XG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyU2luZ2xlU2VsZWN0aW9uKGtleSwgIWNoZWNrZWQsIGNoZWNrZWRLZXlzLCBuYXRpdmVFdmVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBmaWxsIGZpcnN0XG4gICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIF9jb25kdWN0VXRpbC5jb25kdWN0Q2hlY2spKFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKG9yaWdpbkNoZWNrZWRLZXlzKSwgW2tleV0pLCB0cnVlLCBrZXlFbnRpdGllcywgaXNDaGVja2JveERpc2FibGVkKTtcbiAgICAgICAgICAgICAgICAgIHZhciBfY2hlY2tlZEtleXMgPSByZXN1bHQuY2hlY2tlZEtleXMsXG4gICAgICAgICAgICAgICAgICAgICAgaGFsZkNoZWNrZWRLZXlzID0gcmVzdWx0LmhhbGZDaGVja2VkS2V5cztcbiAgICAgICAgICAgICAgICAgIHZhciBuZXh0Q2hlY2tlZEtleXMgPSBfY2hlY2tlZEtleXM7IC8vIElmIHJlbW92ZSwgd2UgZG8gaXQgYWdhaW4gdG8gY29ycmVjdGlvblxuXG4gICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEtleVNldCA9IG5ldyBTZXQoX2NoZWNrZWRLZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgdGVtcEtleVNldFtcImRlbGV0ZVwiXShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBuZXh0Q2hlY2tlZEtleXMgPSAoMCwgX2NvbmR1Y3RVdGlsLmNvbmR1Y3RDaGVjaykoQXJyYXkuZnJvbSh0ZW1wS2V5U2V0KSwge1xuICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgIGhhbGZDaGVja2VkS2V5czogaGFsZkNoZWNrZWRLZXlzXG4gICAgICAgICAgICAgICAgICAgIH0sIGtleUVudGl0aWVzLCBpc0NoZWNrYm94RGlzYWJsZWQpLmNoZWNrZWRLZXlzO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyU2luZ2xlU2VsZWN0aW9uKGtleSwgIWNoZWNrZWQsIG5leHRDaGVja2VkS2V5cywgbmF0aXZlRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNldExhc3RTZWxlY3RlZEtleShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBjaGVja2VkOiBjaGVja2VkXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciByZW5kZXJTZWxlY3Rpb25DZWxsID0gZnVuY3Rpb24gcmVuZGVyU2VsZWN0aW9uQ2VsbChfLCByZWNvcmQsIGluZGV4KSB7XG4gICAgICB2YXIgX3JlbmRlckNlbGwgPSByZW5kZXJDZWxsKF8sIHJlY29yZCwgaW5kZXgpLFxuICAgICAgICAgIG5vZGUgPSBfcmVuZGVyQ2VsbC5ub2RlLFxuICAgICAgICAgIGNoZWNrZWQgPSBfcmVuZGVyQ2VsbC5jaGVja2VkO1xuXG4gICAgICBpZiAoY3VzdG9taXplUmVuZGVyQ2VsbCkge1xuICAgICAgICByZXR1cm4gY3VzdG9taXplUmVuZGVyQ2VsbChjaGVja2VkLCByZWNvcmQsIGluZGV4LCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfTsgLy8gQ29sdW1uc1xuXG5cbiAgICB2YXIgc2VsZWN0aW9uQ29sdW1uID0gKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICB3aWR0aDogc2VsZWN0aW9uQ29sV2lkdGgsXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLWNvbHVtblwiKSxcbiAgICAgIHRpdGxlOiByb3dTZWxlY3Rpb24uY29sdW1uVGl0bGUgfHwgdGl0bGUsXG4gICAgICByZW5kZXI6IHJlbmRlclNlbGVjdGlvbkNlbGxcbiAgICB9LCBfcmNUYWJsZS5JTlRFUk5BTF9DT0xfREVGSU5FLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLWNvbFwiKVxuICAgIH0pO1xuXG4gICAgaWYgKGV4cGFuZFR5cGUgPT09ICdyb3cnICYmIGNvbHVtbnMubGVuZ3RoICYmICFleHBhbmRJY29uQ29sdW1uSW5kZXgpIHtcbiAgICAgIHZhciBfY29sdW1ucyA9ICgwLCBfdG9BcnJheTJbXCJkZWZhdWx0XCJdKShjb2x1bW5zKSxcbiAgICAgICAgICBleHBhbmRDb2x1bW4gPSBfY29sdW1uc1swXSxcbiAgICAgICAgICByZXN0Q29sdW1ucyA9IF9jb2x1bW5zLnNsaWNlKDEpO1xuXG4gICAgICB2YXIgc2VsZWN0aW9uRml4ZWQgPSBmaXhlZCB8fCBnZXRGaXhlZFR5cGUocmVzdENvbHVtbnNbMF0pO1xuXG4gICAgICBpZiAoc2VsZWN0aW9uRml4ZWQpIHtcbiAgICAgICAgZXhwYW5kQ29sdW1uLmZpeGVkID0gc2VsZWN0aW9uRml4ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbZXhwYW5kQ29sdW1uLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBzZWxlY3Rpb25Db2x1bW4pLCB7XG4gICAgICAgIGZpeGVkOiBzZWxlY3Rpb25GaXhlZFxuICAgICAgfSldLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKHJlc3RDb2x1bW5zKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFsoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBzZWxlY3Rpb25Db2x1bW4pLCB7XG4gICAgICBmaXhlZDogZml4ZWQgfHwgZ2V0Rml4ZWRUeXBlKGNvbHVtbnNbMF0pXG4gICAgfSldLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKGNvbHVtbnMpKTtcbiAgfSwgW2dldFJvd0tleSwgZmxhdHRlZERhdGEsIHJvd1NlbGVjdGlvbiwgZGVyaXZlZFNlbGVjdGVkS2V5cywgZGVyaXZlZFNlbGVjdGVkS2V5U2V0LCBkZXJpdmVkSGFsZlNlbGVjdGVkS2V5U2V0LCBzZWxlY3Rpb25Db2xXaWR0aCwgbWVyZ2VkU2VsZWN0aW9ucywgZXhwYW5kVHlwZSwgbGFzdFNlbGVjdGVkS2V5LCBjaGVja2JveFByb3BzTWFwLCBvblNlbGVjdE11bHRpcGxlLCB0cmlnZ2VyU2luZ2xlU2VsZWN0aW9uLCBpc0NoZWNrYm94RGlzYWJsZWRdKTtcbiAgcmV0dXJuIFt0cmFuc2Zvcm1Db2x1bW5zLCBkZXJpdmVkU2VsZWN0ZWRLZXlTZXRdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0U29ydERhdGEgPSBnZXRTb3J0RGF0YTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdXNlRmlsdGVyU29ydGVyO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfQ2FyZXREb3duT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DYXJldERvd25PdXRsaW5lZFwiKSk7XG5cbnZhciBfQ2FyZXRVcE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2FyZXRVcE91dGxpbmVkXCIpKTtcblxudmFyIF90b29sdGlwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdG9vbHRpcFwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuXG52YXIgQVNDRU5EID0gJ2FzY2VuZCc7XG52YXIgREVTQ0VORCA9ICdkZXNjZW5kJztcblxuZnVuY3Rpb24gZ2V0TXVsdGlwbGVQcmlvcml0eShjb2x1bW4pIHtcbiAgaWYgKCgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKGNvbHVtbi5zb3J0ZXIpID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY29sdW1uLnNvcnRlci5tdWx0aXBsZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gY29sdW1uLnNvcnRlci5tdWx0aXBsZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0U29ydEZ1bmN0aW9uKHNvcnRlcikge1xuICBpZiAodHlwZW9mIHNvcnRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzb3J0ZXI7XG4gIH1cblxuICBpZiAoc29ydGVyICYmICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKHNvcnRlcikgPT09ICdvYmplY3QnICYmIHNvcnRlci5jb21wYXJlKSB7XG4gICAgcmV0dXJuIHNvcnRlci5jb21wYXJlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBuZXh0U29ydERpcmVjdGlvbihzb3J0RGlyZWN0aW9ucywgY3VycmVudCkge1xuICBpZiAoIWN1cnJlbnQpIHtcbiAgICByZXR1cm4gc29ydERpcmVjdGlvbnNbMF07XG4gIH1cblxuICByZXR1cm4gc29ydERpcmVjdGlvbnNbc29ydERpcmVjdGlvbnMuaW5kZXhPZihjdXJyZW50KSArIDFdO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U29ydFN0YXRlcyhjb2x1bW5zLCBpbml0LCBwb3MpIHtcbiAgdmFyIHNvcnRTdGF0ZXMgPSBbXTtcblxuICBmdW5jdGlvbiBwdXNoU3RhdGUoY29sdW1uLCBjb2x1bW5Qb3MpIHtcbiAgICBzb3J0U3RhdGVzLnB1c2goe1xuICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICBrZXk6ICgwLCBfdXRpbC5nZXRDb2x1bW5LZXkpKGNvbHVtbiwgY29sdW1uUG9zKSxcbiAgICAgIG11bHRpcGxlUHJpb3JpdHk6IGdldE11bHRpcGxlUHJpb3JpdHkoY29sdW1uKSxcbiAgICAgIHNvcnRPcmRlcjogY29sdW1uLnNvcnRPcmRlclxuICAgIH0pO1xuICB9XG5cbiAgKGNvbHVtbnMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbiwgaW5kZXgpIHtcbiAgICB2YXIgY29sdW1uUG9zID0gKDAsIF91dGlsLmdldENvbHVtblBvcykoaW5kZXgsIHBvcyk7XG5cbiAgICBpZiAoY29sdW1uLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoJ3NvcnRPcmRlcicgaW4gY29sdW1uKSB7XG4gICAgICAgIC8vIENvbnRyb2xsZWRcbiAgICAgICAgcHVzaFN0YXRlKGNvbHVtbiwgY29sdW1uUG9zKTtcbiAgICAgIH1cblxuICAgICAgc29ydFN0YXRlcyA9IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKHNvcnRTdGF0ZXMpLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKGNvbGxlY3RTb3J0U3RhdGVzKGNvbHVtbi5jaGlsZHJlbiwgaW5pdCwgY29sdW1uUG9zKSkpO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLnNvcnRlcikge1xuICAgICAgaWYgKCdzb3J0T3JkZXInIGluIGNvbHVtbikge1xuICAgICAgICAvLyBDb250cm9sbGVkXG4gICAgICAgIHB1c2hTdGF0ZShjb2x1bW4sIGNvbHVtblBvcyk7XG4gICAgICB9IGVsc2UgaWYgKGluaXQgJiYgY29sdW1uLmRlZmF1bHRTb3J0T3JkZXIpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBzb3J0ZXJcbiAgICAgICAgc29ydFN0YXRlcy5wdXNoKHtcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICBrZXk6ICgwLCBfdXRpbC5nZXRDb2x1bW5LZXkpKGNvbHVtbiwgY29sdW1uUG9zKSxcbiAgICAgICAgICBtdWx0aXBsZVByaW9yaXR5OiBnZXRNdWx0aXBsZVByaW9yaXR5KGNvbHVtbiksXG4gICAgICAgICAgc29ydE9yZGVyOiBjb2x1bW4uZGVmYXVsdFNvcnRPcmRlclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc29ydFN0YXRlcztcbn1cblxuZnVuY3Rpb24gaW5qZWN0U29ydGVyKHByZWZpeENscywgY29sdW1ucywgc29ydGVyU2F0ZXMsIHRyaWdnZXJTb3J0ZXIsIGRlZmF1bHRTb3J0RGlyZWN0aW9ucywgdGFibGVMb2NhbGUsIHRhYmxlU2hvd1NvcnRlclRvb2x0aXAsIHBvcykge1xuICByZXR1cm4gKGNvbHVtbnMgfHwgW10pLm1hcChmdW5jdGlvbiAoY29sdW1uLCBpbmRleCkge1xuICAgIHZhciBjb2x1bW5Qb3MgPSAoMCwgX3V0aWwuZ2V0Q29sdW1uUG9zKShpbmRleCwgcG9zKTtcbiAgICB2YXIgbmV3Q29sdW1uID0gY29sdW1uO1xuXG4gICAgaWYgKG5ld0NvbHVtbi5zb3J0ZXIpIHtcbiAgICAgIHZhciBzb3J0RGlyZWN0aW9ucyA9IG5ld0NvbHVtbi5zb3J0RGlyZWN0aW9ucyB8fCBkZWZhdWx0U29ydERpcmVjdGlvbnM7XG4gICAgICB2YXIgc2hvd1NvcnRlclRvb2x0aXAgPSBuZXdDb2x1bW4uc2hvd1NvcnRlclRvb2x0aXAgPT09IHVuZGVmaW5lZCA/IHRhYmxlU2hvd1NvcnRlclRvb2x0aXAgOiBuZXdDb2x1bW4uc2hvd1NvcnRlclRvb2x0aXA7XG4gICAgICB2YXIgY29sdW1uS2V5ID0gKDAsIF91dGlsLmdldENvbHVtbktleSkobmV3Q29sdW1uLCBjb2x1bW5Qb3MpO1xuICAgICAgdmFyIHNvcnRlclN0YXRlID0gc29ydGVyU2F0ZXMuZmluZChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIga2V5ID0gX3JlZi5rZXk7XG4gICAgICAgIHJldHVybiBrZXkgPT09IGNvbHVtbktleTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHNvcnRlck9yZGVyID0gc29ydGVyU3RhdGUgPyBzb3J0ZXJTdGF0ZS5zb3J0T3JkZXIgOiBudWxsO1xuICAgICAgdmFyIG5leHRTb3J0T3JkZXIgPSBuZXh0U29ydERpcmVjdGlvbihzb3J0RGlyZWN0aW9ucywgc29ydGVyT3JkZXIpO1xuICAgICAgdmFyIHVwTm9kZSA9IHNvcnREaXJlY3Rpb25zLmluY2x1ZGVzKEFTQ0VORCkgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NhcmV0VXBPdXRsaW5lZFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbHVtbi1zb3J0ZXItdXBcIiksIHtcbiAgICAgICAgICBhY3RpdmU6IHNvcnRlck9yZGVyID09PSBBU0NFTkRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRvd25Ob2RlID0gc29ydERpcmVjdGlvbnMuaW5jbHVkZXMoREVTQ0VORCkgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NhcmV0RG93bk91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sdW1uLXNvcnRlci1kb3duXCIpLCB7XG4gICAgICAgICAgYWN0aXZlOiBzb3J0ZXJPcmRlciA9PT0gREVTQ0VORFxuICAgICAgICB9KVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBfcmVmMiA9IHRhYmxlTG9jYWxlIHx8IHt9LFxuICAgICAgICAgIGNhbmNlbFNvcnQgPSBfcmVmMi5jYW5jZWxTb3J0LFxuICAgICAgICAgIHRyaWdnZXJBc2MgPSBfcmVmMi50cmlnZ2VyQXNjLFxuICAgICAgICAgIHRyaWdnZXJEZXNjID0gX3JlZjIudHJpZ2dlckRlc2M7XG5cbiAgICAgIHZhciBzb3J0VGlwID0gY2FuY2VsU29ydDtcblxuICAgICAgaWYgKG5leHRTb3J0T3JkZXIgPT09IERFU0NFTkQpIHtcbiAgICAgICAgc29ydFRpcCA9IHRyaWdnZXJEZXNjO1xuICAgICAgfSBlbHNlIGlmIChuZXh0U29ydE9yZGVyID09PSBBU0NFTkQpIHtcbiAgICAgICAgc29ydFRpcCA9IHRyaWdnZXJBc2M7XG4gICAgICB9XG5cbiAgICAgIG5ld0NvbHVtbiA9ICgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoe30sIG5ld0NvbHVtbiksIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShuZXdDb2x1bW4uY2xhc3NOYW1lLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbHVtbi1zb3J0XCIpLCBzb3J0ZXJPcmRlcikpLFxuICAgICAgICB0aXRsZTogZnVuY3Rpb24gdGl0bGUocmVuZGVyUHJvcHMpIHtcbiAgICAgICAgICB2YXIgcmVuZGVyU29ydFRpdGxlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbHVtbi1zb3J0ZXJzXCIpXG4gICAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsICgwLCBfdXRpbC5yZW5kZXJDb2x1bW5UaXRsZSkoY29sdW1uLnRpdGxlLCByZW5kZXJQcm9wcykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbHVtbi1zb3J0ZXJcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sdW1uLXNvcnRlci1mdWxsXCIpLCB1cE5vZGUgJiYgZG93bk5vZGUpKVxuICAgICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sdW1uLXNvcnRlci1pbm5lclwiKVxuICAgICAgICAgIH0sIHVwTm9kZSwgZG93bk5vZGUpKSk7XG4gICAgICAgICAgcmV0dXJuIHNob3dTb3J0ZXJUb29sdGlwID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3Rvb2x0aXBbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgICAgICB0aXRsZTogc29ydFRpcFxuICAgICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW4tc29ydGVycy13aXRoLXRvb2x0aXBcIilcbiAgICAgICAgICB9LCByZW5kZXJTb3J0VGl0bGUpKSA6IHJlbmRlclNvcnRUaXRsZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25IZWFkZXJDZWxsOiBmdW5jdGlvbiBvbkhlYWRlckNlbGwoY29sKSB7XG4gICAgICAgICAgdmFyIGNlbGwgPSBjb2x1bW4ub25IZWFkZXJDZWxsICYmIGNvbHVtbi5vbkhlYWRlckNlbGwoY29sKSB8fCB7fTtcbiAgICAgICAgICB2YXIgb3JpZ2luT25DbGljayA9IGNlbGwub25DbGljaztcblxuICAgICAgICAgIGNlbGwub25DbGljayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdHJpZ2dlclNvcnRlcih7XG4gICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgICBrZXk6IGNvbHVtbktleSxcbiAgICAgICAgICAgICAgc29ydE9yZGVyOiBuZXh0U29ydE9yZGVyLFxuICAgICAgICAgICAgICBtdWx0aXBsZVByaW9yaXR5OiBnZXRNdWx0aXBsZVByaW9yaXR5KGNvbHVtbilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3JpZ2luT25DbGljaykge1xuICAgICAgICAgICAgICBvcmlnaW5PbkNsaWNrKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY2VsbC5jbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShjZWxsLmNsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW4taGFzLXNvcnRlcnNcIikpO1xuICAgICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoJ2NoaWxkcmVuJyBpbiBuZXdDb2x1bW4pIHtcbiAgICAgIG5ld0NvbHVtbiA9ICgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoe30sIG5ld0NvbHVtbiksIHtcbiAgICAgICAgY2hpbGRyZW46IGluamVjdFNvcnRlcihwcmVmaXhDbHMsIG5ld0NvbHVtbi5jaGlsZHJlbiwgc29ydGVyU2F0ZXMsIHRyaWdnZXJTb3J0ZXIsIGRlZmF1bHRTb3J0RGlyZWN0aW9ucywgdGFibGVMb2NhbGUsIHRhYmxlU2hvd1NvcnRlclRvb2x0aXAsIGNvbHVtblBvcylcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzdGF0ZVRvSW5mbyhzb3J0ZXJTdGF0ZXMpIHtcbiAgdmFyIGNvbHVtbiA9IHNvcnRlclN0YXRlcy5jb2x1bW4sXG4gICAgICBzb3J0T3JkZXIgPSBzb3J0ZXJTdGF0ZXMuc29ydE9yZGVyO1xuICByZXR1cm4ge1xuICAgIGNvbHVtbjogY29sdW1uLFxuICAgIG9yZGVyOiBzb3J0T3JkZXIsXG4gICAgZmllbGQ6IGNvbHVtbi5kYXRhSW5kZXgsXG4gICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlU29ydGVySW5mbyhzb3J0ZXJTdGF0ZXMpIHtcbiAgdmFyIGxpc3QgPSBzb3J0ZXJTdGF0ZXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMykge1xuICAgIHZhciBzb3J0T3JkZXIgPSBfcmVmMy5zb3J0T3JkZXI7XG4gICAgcmV0dXJuIHNvcnRPcmRlcjtcbiAgfSkubWFwKHN0YXRlVG9JbmZvKTsgLy8gPT09PT09PT09PT0gTGVnYWN5IGNvbXBhdGlibGUgc3VwcG9ydCA9PT09PT09PT09PVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL3B1bGwvMTkyMjZcblxuICBpZiAobGlzdC5sZW5ndGggPT09IDAgJiYgc29ydGVyU3RhdGVzLmxlbmd0aCkge1xuICAgIHJldHVybiAoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKHt9LCBzdGF0ZVRvSW5mbyhzb3J0ZXJTdGF0ZXNbc29ydGVyU3RhdGVzLmxlbmd0aCAtIDFdKSksIHtcbiAgICAgIGNvbHVtbjogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPD0gMSkge1xuICAgIHJldHVybiBsaXN0WzBdIHx8IHt9O1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59XG5cbmZ1bmN0aW9uIGdldFNvcnREYXRhKGRhdGEsIHNvcnRTdGF0ZXMsIGNoaWxkcmVuQ29sdW1uTmFtZSkge1xuICB2YXIgaW5uZXJTb3J0ZXJTdGF0ZXMgPSBzb3J0U3RhdGVzLnNsaWNlKCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLm11bHRpcGxlUHJpb3JpdHkgLSBhLm11bHRpcGxlUHJpb3JpdHk7XG4gIH0pO1xuICB2YXIgY2xvbmVEYXRhID0gZGF0YS5zbGljZSgpO1xuICB2YXIgcnVubmluZ1NvcnRlcnMgPSBpbm5lclNvcnRlclN0YXRlcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWY0KSB7XG4gICAgdmFyIHNvcnRlciA9IF9yZWY0LmNvbHVtbi5zb3J0ZXIsXG4gICAgICAgIHNvcnRPcmRlciA9IF9yZWY0LnNvcnRPcmRlcjtcbiAgICByZXR1cm4gZ2V0U29ydEZ1bmN0aW9uKHNvcnRlcikgJiYgc29ydE9yZGVyO1xuICB9KTsgLy8gU2tpcCBpZiBubyBzb3J0ZXIgbmVlZGVkXG5cbiAgaWYgKCFydW5uaW5nU29ydGVycy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY2xvbmVEYXRhO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lRGF0YS5zb3J0KGZ1bmN0aW9uIChyZWNvcmQxLCByZWNvcmQyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBydW5uaW5nU29ydGVycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIHNvcnRlclN0YXRlID0gcnVubmluZ1NvcnRlcnNbaV07XG4gICAgICB2YXIgc29ydGVyID0gc29ydGVyU3RhdGUuY29sdW1uLnNvcnRlcixcbiAgICAgICAgICBzb3J0T3JkZXIgPSBzb3J0ZXJTdGF0ZS5zb3J0T3JkZXI7XG4gICAgICB2YXIgY29tcGFyZUZuID0gZ2V0U29ydEZ1bmN0aW9uKHNvcnRlcik7XG5cbiAgICAgIGlmIChjb21wYXJlRm4gJiYgc29ydE9yZGVyKSB7XG4gICAgICAgIHZhciBjb21wYXJlUmVzdWx0ID0gY29tcGFyZUZuKHJlY29yZDEsIHJlY29yZDIsIHNvcnRPcmRlcik7XG5cbiAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gc29ydE9yZGVyID09PSBBU0NFTkQgPyBjb21wYXJlUmVzdWx0IDogLWNvbXBhcmVSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkubWFwKGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICB2YXIgc3ViUmVjb3JkcyA9IHJlY29yZFtjaGlsZHJlbkNvbHVtbk5hbWVdO1xuXG4gICAgaWYgKHN1YlJlY29yZHMpIHtcbiAgICAgIHJldHVybiAoMCwgX2V4dGVuZHMzW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKHt9LCByZWNvcmQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBjaGlsZHJlbkNvbHVtbk5hbWUsIGdldFNvcnREYXRhKHN1YlJlY29yZHMsIHNvcnRTdGF0ZXMsIGNoaWxkcmVuQ29sdW1uTmFtZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlRmlsdGVyU29ydGVyKF9yZWY1KSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmNS5wcmVmaXhDbHMsXG4gICAgICBtZXJnZWRDb2x1bW5zID0gX3JlZjUubWVyZ2VkQ29sdW1ucyxcbiAgICAgIG9uU29ydGVyQ2hhbmdlID0gX3JlZjUub25Tb3J0ZXJDaGFuZ2UsXG4gICAgICBzb3J0RGlyZWN0aW9ucyA9IF9yZWY1LnNvcnREaXJlY3Rpb25zLFxuICAgICAgdGFibGVMb2NhbGUgPSBfcmVmNS50YWJsZUxvY2FsZSxcbiAgICAgIHNob3dTb3J0ZXJUb29sdGlwID0gX3JlZjUuc2hvd1NvcnRlclRvb2x0aXA7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGNvbGxlY3RTb3J0U3RhdGVzKG1lcmdlZENvbHVtbnMsIHRydWUpKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHNvcnRTdGF0ZXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0U29ydFN0YXRlcyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIG1lcmdlZFNvcnRlclN0YXRlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWxpZGF0ZSA9IHRydWU7XG4gICAgdmFyIGNvbGxlY3RlZFN0YXRlcyA9IGNvbGxlY3RTb3J0U3RhdGVzKG1lcmdlZENvbHVtbnMsIGZhbHNlKTsgLy8gUmV0dXJuIGlmIG5vdCBjb250cm9sbGVkXG5cbiAgICBpZiAoIWNvbGxlY3RlZFN0YXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBzb3J0U3RhdGVzO1xuICAgIH1cblxuICAgIHZhciB2YWxpZGF0ZVN0YXRlcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gcGF0Y2hTdGF0ZXMoc3RhdGUpIHtcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZVN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRlU3RhdGVzLnB1c2goKDAsIF9leHRlbmRzM1tcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczNbXCJkZWZhdWx0XCJdKSh7fSwgc3RhdGUpLCB7XG4gICAgICAgICAgc29ydE9yZGVyOiBudWxsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbXVsdGlwbGVNb2RlID0gbnVsbDtcbiAgICBjb2xsZWN0ZWRTdGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmIChtdWx0aXBsZU1vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcGF0Y2hTdGF0ZXMoc3RhdGUpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5zb3J0T3JkZXIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUubXVsdGlwbGVQcmlvcml0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG11bHRpcGxlTW9kZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG11bHRpcGxlTW9kZSAmJiBzdGF0ZS5tdWx0aXBsZVByaW9yaXR5ICE9PSBmYWxzZSkge1xuICAgICAgICBwYXRjaFN0YXRlcyhzdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0ZSA9IGZhbHNlO1xuICAgICAgICBwYXRjaFN0YXRlcyhzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbGlkYXRlU3RhdGVzO1xuICB9LCBbbWVyZ2VkQ29sdW1ucywgc29ydFN0YXRlc10pOyAvLyBHZXQgcmVuZGVyIGNvbHVtbnMgdGl0bGUgcmVxdWlyZWQgcHJvcHNcblxuICB2YXIgY29sdW1uVGl0bGVTb3J0ZXJQcm9wcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzb3J0Q29sdW1ucyA9IG1lcmdlZFNvcnRlclN0YXRlcy5tYXAoZnVuY3Rpb24gKF9yZWY2KSB7XG4gICAgICB2YXIgY29sdW1uID0gX3JlZjYuY29sdW1uLFxuICAgICAgICAgIHNvcnRPcmRlciA9IF9yZWY2LnNvcnRPcmRlcjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICBvcmRlcjogc29ydE9yZGVyXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzb3J0Q29sdW1uczogc29ydENvbHVtbnMsXG4gICAgICAvLyBMZWdhY3lcbiAgICAgIHNvcnRDb2x1bW46IHNvcnRDb2x1bW5zWzBdICYmIHNvcnRDb2x1bW5zWzBdLmNvbHVtbixcbiAgICAgIHNvcnRPcmRlcjogc29ydENvbHVtbnNbMF0gJiYgc29ydENvbHVtbnNbMF0ub3JkZXJcbiAgICB9O1xuICB9LCBbbWVyZ2VkU29ydGVyU3RhdGVzXSk7XG5cbiAgZnVuY3Rpb24gdHJpZ2dlclNvcnRlcihzb3J0U3RhdGUpIHtcbiAgICB2YXIgbmV3U29ydGVyU3RhdGVzO1xuXG4gICAgaWYgKHNvcnRTdGF0ZS5tdWx0aXBsZVByaW9yaXR5ID09PSBmYWxzZSB8fCAhbWVyZ2VkU29ydGVyU3RhdGVzLmxlbmd0aCB8fCBtZXJnZWRTb3J0ZXJTdGF0ZXNbMF0ubXVsdGlwbGVQcmlvcml0eSA9PT0gZmFsc2UpIHtcbiAgICAgIG5ld1NvcnRlclN0YXRlcyA9IFtzb3J0U3RhdGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTb3J0ZXJTdGF0ZXMgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShtZXJnZWRTb3J0ZXJTdGF0ZXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmNykge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjcua2V5O1xuICAgICAgICByZXR1cm4ga2V5ICE9PSBzb3J0U3RhdGUua2V5O1xuICAgICAgfSkpLCBbc29ydFN0YXRlXSk7XG4gICAgfVxuXG4gICAgc2V0U29ydFN0YXRlcyhuZXdTb3J0ZXJTdGF0ZXMpO1xuICAgIG9uU29ydGVyQ2hhbmdlKGdlbmVyYXRlU29ydGVySW5mbyhuZXdTb3J0ZXJTdGF0ZXMpLCBuZXdTb3J0ZXJTdGF0ZXMpO1xuICB9XG5cbiAgdmFyIHRyYW5zZm9ybUNvbHVtbnMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1Db2x1bW5zKGlubmVyQ29sdW1ucykge1xuICAgIHJldHVybiBpbmplY3RTb3J0ZXIocHJlZml4Q2xzLCBpbm5lckNvbHVtbnMsIG1lcmdlZFNvcnRlclN0YXRlcywgdHJpZ2dlclNvcnRlciwgc29ydERpcmVjdGlvbnMsIHRhYmxlTG9jYWxlLCBzaG93U29ydGVyVG9vbHRpcCk7XG4gIH07XG5cbiAgdmFyIGdldFNvcnRlcnMgPSBmdW5jdGlvbiBnZXRTb3J0ZXJzKCkge1xuICAgIHJldHVybiBnZW5lcmF0ZVNvcnRlckluZm8obWVyZ2VkU29ydGVyU3RhdGVzKTtcbiAgfTtcblxuICByZXR1cm4gW3RyYW5zZm9ybUNvbHVtbnMsIG1lcmdlZFNvcnRlclN0YXRlcywgY29sdW1uVGl0bGVTb3J0ZXJQcm9wcywgZ2V0U29ydGVyc107XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB1c2VUaXRsZUNvbHVtbnM7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxuZnVuY3Rpb24gZmlsbFRpdGxlKGNvbHVtbnMsIGNvbHVtblRpdGxlUHJvcHMpIHtcbiAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICB2YXIgY2xvbmVDb2x1bW4gPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGNvbHVtbik7XG4gICAgY2xvbmVDb2x1bW4udGl0bGUgPSAoMCwgX3V0aWwucmVuZGVyQ29sdW1uVGl0bGUpKGNvbHVtbi50aXRsZSwgY29sdW1uVGl0bGVQcm9wcyk7XG5cbiAgICBpZiAoJ2NoaWxkcmVuJyBpbiBjbG9uZUNvbHVtbikge1xuICAgICAgY2xvbmVDb2x1bW4uY2hpbGRyZW4gPSBmaWxsVGl0bGUoY2xvbmVDb2x1bW4uY2hpbGRyZW4sIGNvbHVtblRpdGxlUHJvcHMpO1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZUNvbHVtbjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZVRpdGxlQ29sdW1ucyhjb2x1bW5UaXRsZVByb3BzKSB7XG4gIHZhciBmaWxsZWRDb2x1bW5zID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbHVtbnMpIHtcbiAgICByZXR1cm4gZmlsbFRpdGxlKGNvbHVtbnMsIGNvbHVtblRpdGxlUHJvcHMpO1xuICB9LCBbY29sdW1uVGl0bGVQcm9wc10pO1xuICByZXR1cm4gW2ZpbGxlZENvbHVtbnNdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX1RhYmxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UYWJsZVwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9UYWJsZVtcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRDb2x1bW5LZXkgPSBnZXRDb2x1bW5LZXk7XG5leHBvcnRzLmdldENvbHVtblBvcyA9IGdldENvbHVtblBvcztcbmV4cG9ydHMucmVuZGVyQ29sdW1uVGl0bGUgPSByZW5kZXJDb2x1bW5UaXRsZTtcblxuZnVuY3Rpb24gZ2V0Q29sdW1uS2V5KGNvbHVtbiwgZGVmYXVsdEtleSkge1xuICBpZiAoJ2tleScgaW4gY29sdW1uICYmIGNvbHVtbi5rZXkgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4ua2V5ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5rZXk7XG4gIH1cblxuICBpZiAoY29sdW1uLmRhdGFJbmRleCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbHVtbi5kYXRhSW5kZXgpID8gY29sdW1uLmRhdGFJbmRleC5qb2luKCcuJykgOiBjb2x1bW4uZGF0YUluZGV4O1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRLZXk7XG59XG5cbmZ1bmN0aW9uIGdldENvbHVtblBvcyhpbmRleCwgcG9zKSB7XG4gIHJldHVybiBwb3MgPyBcIlwiLmNvbmNhdChwb3MsIFwiLVwiKS5jb25jYXQoaW5kZXgpIDogXCJcIi5jb25jYXQoaW5kZXgpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDb2x1bW5UaXRsZSh0aXRsZSwgcHJvcHMpIHtcbiAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aXRsZShwcm9wcyk7XG4gIH1cblxuICByZXR1cm4gdGl0bGU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjVGFicyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyYy10YWJzXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfRWxsaXBzaXNPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0VsbGlwc2lzT3V0bGluZWRcIikpO1xuXG52YXIgX1BsdXNPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1BsdXNPdXRsaW5lZFwiKSk7XG5cbnZhciBfQ2xvc2VPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlT3V0bGluZWRcIikpO1xuXG52YXIgX2Rldldhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC9kZXZXYXJuaW5nXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG5mdW5jdGlvbiBUYWJzKF9hKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcblxuICB2YXIgdHlwZSA9IF9hLnR5cGUsXG4gICAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgICBzaXplID0gX2Euc2l6ZSxcbiAgICAgIF9vbkVkaXQgPSBfYS5vbkVkaXQsXG4gICAgICBoaWRlQWRkID0gX2EuaGlkZUFkZCxcbiAgICAgIGNlbnRlcmVkID0gX2EuY2VudGVyZWQsXG4gICAgICBhZGRJY29uID0gX2EuYWRkSWNvbixcbiAgICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJ0eXBlXCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcIm9uRWRpdFwiLCBcImhpZGVBZGRcIiwgXCJjZW50ZXJlZFwiLCBcImFkZEljb25cIl0pO1xuXG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHM7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndGFicycsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBlZGl0YWJsZTtcblxuICBpZiAodHlwZSA9PT0gJ2VkaXRhYmxlLWNhcmQnKSB7XG4gICAgZWRpdGFibGUgPSB7XG4gICAgICBvbkVkaXQ6IGZ1bmN0aW9uIG9uRWRpdChlZGl0VHlwZSwgX3JlZikge1xuICAgICAgICB2YXIga2V5ID0gX3JlZi5rZXksXG4gICAgICAgICAgICBldmVudCA9IF9yZWYuZXZlbnQ7XG4gICAgICAgIF9vbkVkaXQgPT09IG51bGwgfHwgX29uRWRpdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29uRWRpdChlZGl0VHlwZSA9PT0gJ2FkZCcgPyBldmVudCA6IGtleSwgZWRpdFR5cGUpO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbG9zZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCksXG4gICAgICBhZGRJY29uOiBhZGRJY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9QbHVzT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSxcbiAgICAgIHNob3dBZGQ6IGhpZGVBZGQgIT09IHRydWVcbiAgICB9O1xuICB9XG5cbiAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoISgnb25QcmV2Q2xpY2snIGluIHByb3BzKSAmJiAhKCdvbk5leHRDbGljaycgaW4gcHJvcHMpLCAnVGFicycsICdgb25QcmV2Q2xpY2tgIGFuZCBgb25OZXh0Q2xpY2tgIGhhcyBiZWVuIHJlbW92ZWQuIFBsZWFzZSB1c2UgYG9uVGFiU2Nyb2xsYCBpbnN0ZWFkLicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjVGFic1tcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgfSwgcHJvcHMsIHtcbiAgICBtb3JlVHJhbnNpdGlvbk5hbWU6IFwic2xpZGUtdXBcIixcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSksIHNpemUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNhcmRcIiksIFsnY2FyZCcsICdlZGl0YWJsZS1jYXJkJ10uaW5jbHVkZXModHlwZSkpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVkaXRhYmxlLWNhcmRcIiksIHR5cGUgPT09ICdlZGl0YWJsZS1jYXJkJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VudGVyZWRcIiksIGNlbnRlcmVkKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpLFxuICAgIGVkaXRhYmxlOiBlZGl0YWJsZSxcbiAgICBtb3JlSWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0VsbGlwc2lzT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9KSk7XG59XG5cblRhYnMuVGFiUGFuZSA9IF9yY1RhYnMuVGFiUGFuZTtcbnZhciBfZGVmYXVsdCA9IFRhYnM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIENoZWNrYWJsZVRhZyA9IGZ1bmN0aW9uIENoZWNrYWJsZVRhZyhwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG5cbiAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkge1xuICAgIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZCxcbiAgICAgICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICAgICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2s7XG5cbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKCFjaGVja2VkKTtcbiAgICB9XG5cbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkLFxuICAgICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGVja2VkXCJdKTtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd0YWcnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaGVja2FibGVcIiksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrYWJsZS1jaGVja2VkXCIpLCBjaGVja2VkKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICBkZWxldGUgcmVzdFByb3BzLm9uQ2hhbmdlOyAvLyBUeXBlU2NyaXB0IGNhbm5vdCBjaGVjayBkZWxldGUgbm93LlxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByZXN0UHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGNscyxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGlja1xuICB9KSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBDaGVja2FibGVUYWc7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9DbG9zZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VPdXRsaW5lZFwiKSk7XG5cbnZhciBfQ2hlY2thYmxlVGFnID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9DaGVja2FibGVUYWdcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9jb2xvcnMgPSByZXF1aXJlKFwiLi4vX3V0aWwvY29sb3JzXCIpO1xuXG52YXIgX3dhdmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC93YXZlXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBQcmVzZXRDb2xvclJlZ2V4ID0gbmV3IFJlZ0V4cChcIl4oXCIuY29uY2F0KF9jb2xvcnMuUHJlc2V0Q29sb3JUeXBlcy5qb2luKCd8JyksIFwiKSgtaW52ZXJzZSk/JFwiKSk7XG52YXIgUHJlc2V0U3RhdHVzQ29sb3JSZWdleCA9IG5ldyBSZWdFeHAoXCJeKFwiLmNvbmNhdChfY29sb3JzLlByZXNldFN0YXR1c0NvbG9yVHlwZXMuam9pbignfCcpLCBcIikkXCIpKTtcblxudmFyIEludGVybmFsVGFnID0gZnVuY3Rpb24gSW50ZXJuYWxUYWcoX2EsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gX2Euc3R5bGUsXG4gICAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgICAgaWNvbiA9IF9hLmljb24sXG4gICAgICBjb2xvciA9IF9hLmNvbG9yLFxuICAgICAgb25DbG9zZSA9IF9hLm9uQ2xvc2UsXG4gICAgICBjbG9zZUljb24gPSBfYS5jbG9zZUljb24sXG4gICAgICBfYSRjbG9zYWJsZSA9IF9hLmNsb3NhYmxlLFxuICAgICAgY2xvc2FibGUgPSBfYSRjbG9zYWJsZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSRjbG9zYWJsZSxcbiAgICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImNoaWxkcmVuXCIsIFwiaWNvblwiLCBcImNvbG9yXCIsIFwib25DbG9zZVwiLCBcImNsb3NlSWNvblwiLCBcImNsb3NhYmxlXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUodHJ1ZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICB2aXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCd2aXNpYmxlJyBpbiBwcm9wcykge1xuICAgICAgc2V0VmlzaWJsZShwcm9wcy52aXNpYmxlKTtcbiAgICB9XG4gIH0sIFtwcm9wcy52aXNpYmxlXSk7XG5cbiAgdmFyIGlzUHJlc2V0Q29sb3IgPSBmdW5jdGlvbiBpc1ByZXNldENvbG9yKCkge1xuICAgIGlmICghY29sb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJlc2V0Q29sb3JSZWdleC50ZXN0KGNvbG9yKSB8fCBQcmVzZXRTdGF0dXNDb2xvclJlZ2V4LnRlc3QoY29sb3IpO1xuICB9O1xuXG4gIHZhciB0YWdTdHlsZSA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgYmFja2dyb3VuZENvbG9yOiBjb2xvciAmJiAhaXNQcmVzZXRDb2xvcigpID8gY29sb3IgOiB1bmRlZmluZWRcbiAgfSwgc3R5bGUpO1xuICB2YXIgcHJlc2V0Q29sb3IgPSBpc1ByZXNldENvbG9yKCk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3RhZycsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciB0YWdDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoY29sb3IpLCBwcmVzZXRDb2xvciksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFzLWNvbG9yXCIpLCBjb2xvciAmJiAhcHJlc2V0Q29sb3IpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhpZGRlblwiKSwgIXZpc2libGUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcblxuICB2YXIgaGFuZGxlQ2xvc2VDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsb3NlQ2xpY2soZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAob25DbG9zZSkge1xuICAgICAgb25DbG9zZShlKTtcbiAgICB9XG5cbiAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoJ3Zpc2libGUnIGluIHByb3BzKSkge1xuICAgICAgc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciByZW5kZXJDbG9zZUljb24gPSBmdW5jdGlvbiByZW5kZXJDbG9zZUljb24oKSB7XG4gICAgaWYgKGNsb3NhYmxlKSB7XG4gICAgICByZXR1cm4gY2xvc2VJY29uID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xvc2UtaWNvblwiKSxcbiAgICAgICAgb25DbGljazogaGFuZGxlQ2xvc2VDbGlja1xuICAgICAgfSwgY2xvc2VJY29uKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbG9zZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xvc2UtaWNvblwiKSxcbiAgICAgICAgb25DbGljazogaGFuZGxlQ2xvc2VDbGlja1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgdmFyIGlzTmVlZFdhdmUgPSAnb25DbGljaycgaW4gcHJvcHMgfHwgY2hpbGRyZW4gJiYgY2hpbGRyZW4udHlwZSA9PT0gJ2EnO1xuICB2YXIgdGFnUHJvcHMgPSAoMCwgX29taXRbXCJkZWZhdWx0XCJdKShwcm9wcywgWyd2aXNpYmxlJ10pO1xuICB2YXIgaWNvbk5vZGUgPSBpY29uIHx8IG51bGw7XG4gIHZhciBraWRzID0gaWNvbk5vZGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgaWNvbk5vZGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZHJlbikpIDogY2hpbGRyZW47XG4gIHZhciB0YWdOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgdGFnUHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IHRhZ0NsYXNzTmFtZSxcbiAgICBzdHlsZTogdGFnU3R5bGVcbiAgfSksIGtpZHMsIHJlbmRlckNsb3NlSWNvbigpKTtcbiAgcmV0dXJuIGlzTmVlZFdhdmUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfd2F2ZVtcImRlZmF1bHRcIl0sIG51bGwsIHRhZ05vZGUpIDogdGFnTm9kZTtcbn07XG5cbnZhciBUYWcgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFRhZyk7XG5UYWcuZGlzcGxheU5hbWUgPSAnVGFnJztcblRhZy5DaGVja2FibGVUYWcgPSBfQ2hlY2thYmxlVGFnW1wiZGVmYXVsdFwiXTtcbnZhciBfZGVmYXVsdCA9IFRhZztcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2RhdGVQaWNrZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9kYXRlLXBpY2tlclwiKSk7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIEludGVybmFsVGltZVBpY2tlciA9IF9kYXRlUGlja2VyW1wiZGVmYXVsdFwiXS5UaW1lUGlja2VyLFxuICAgIEludGVybmFsUmFuZ2VQaWNrZXIgPSBfZGF0ZVBpY2tlcltcImRlZmF1bHRcIl0uUmFuZ2VQaWNrZXI7XG52YXIgUmFuZ2VQaWNrZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW50ZXJuYWxSYW5nZVBpY2tlciwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBwcm9wcywge1xuICAgIHBpY2tlcjogXCJ0aW1lXCIsXG4gICAgbW9kZTogdW5kZWZpbmVkLFxuICAgIHJlZjogcmVmXG4gIH0pKTtcbn0pO1xudmFyIFRpbWVQaWNrZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX2EsIHJlZikge1xuICB2YXIgYWRkb24gPSBfYS5hZGRvbixcbiAgICAgIHJlbmRlckV4dHJhRm9vdGVyID0gX2EucmVuZGVyRXh0cmFGb290ZXIsXG4gICAgICBwb3B1cENsYXNzTmFtZSA9IF9hLnBvcHVwQ2xhc3NOYW1lLFxuICAgICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJhZGRvblwiLCBcInJlbmRlckV4dHJhRm9vdGVyXCIsIFwicG9wdXBDbGFzc05hbWVcIl0pO1xuXG4gIHZhciBpbnRlcm5hbFJlbmRlckV4dHJhRm9vdGVyID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJlbmRlckV4dHJhRm9vdGVyKSB7XG4gICAgICByZXR1cm4gcmVuZGVyRXh0cmFGb290ZXI7XG4gICAgfVxuXG4gICAgaWYgKGFkZG9uKSB7XG4gICAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKShmYWxzZSwgJ1RpbWVQaWNrZXInLCAnYGFkZG9uYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGByZW5kZXJFeHRyYUZvb3RlcmAgaW5zdGVhZC4nKTtcbiAgICAgIHJldHVybiBhZGRvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LCBbYWRkb24sIHJlbmRlckV4dHJhRm9vdGVyXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbFRpbWVQaWNrZXIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcmVzdFByb3BzLCB7XG4gICAgZHJvcGRvd25DbGFzc05hbWU6IHBvcHVwQ2xhc3NOYW1lLFxuICAgIG1vZGU6IHVuZGVmaW5lZCxcbiAgICByZWY6IHJlZixcbiAgICByZW5kZXJFeHRyYUZvb3RlcjogaW50ZXJuYWxSZW5kZXJFeHRyYUZvb3RlclxuICB9KSk7XG59KTtcblRpbWVQaWNrZXIuZGlzcGxheU5hbWUgPSAnVGltZVBpY2tlcic7XG5UaW1lUGlja2VyLlJhbmdlUGlja2VyID0gUmFuZ2VQaWNrZXI7XG52YXIgX2RlZmF1bHQgPSBUaW1lUGlja2VyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xudmFyIGxvY2FsZSA9IHtcbiAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgdGltZScsXG4gIHJhbmdlUGxhY2Vob2xkZXI6IFsnU3RhcnQgdGltZScsICdFbmQgdGltZSddXG59O1xudmFyIF9kZWZhdWx0ID0gbG9jYWxlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX0xvYWRpbmdPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0xvYWRpbmdPdXRsaW5lZFwiKSk7XG5cbnZhciBfVGltZWxpbmVJdGVtID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UaW1lbGluZUl0ZW1cIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9yZWFjdE5vZGUgPSByZXF1aXJlKFwiLi4vX3V0aWwvcmVhY3ROb2RlXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIFRpbWVsaW5lID0gZnVuY3Rpb24gVGltZWxpbmUocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBfcHJvcHMkcGVuZGluZyA9IHByb3BzLnBlbmRpbmcsXG4gICAgICBwZW5kaW5nID0gX3Byb3BzJHBlbmRpbmcgPT09IHZvaWQgMCA/IG51bGwgOiBfcHJvcHMkcGVuZGluZyxcbiAgICAgIHBlbmRpbmdEb3QgPSBwcm9wcy5wZW5kaW5nRG90LFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHJldmVyc2UgPSBwcm9wcy5yZXZlcnNlLFxuICAgICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInBlbmRpbmdcIiwgXCJwZW5kaW5nRG90XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJyZXZlcnNlXCIsIFwibW9kZVwiXSk7XG5cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndGltZWxpbmUnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgcGVuZGluZ05vZGUgPSB0eXBlb2YgcGVuZGluZyA9PT0gJ2Jvb2xlYW4nID8gbnVsbCA6IHBlbmRpbmc7XG4gIHZhciBwZW5kaW5nSXRlbSA9IHBlbmRpbmcgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfVGltZWxpbmVJdGVtW1wiZGVmYXVsdFwiXSwge1xuICAgIHBlbmRpbmc6ICEhcGVuZGluZyxcbiAgICBkb3Q6IHBlbmRpbmdEb3QgfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvYWRpbmdPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpXG4gIH0sIHBlbmRpbmdOb2RlKSA6IG51bGw7XG4gIHZhciB0aW1lTGluZUl0ZW1zID0gcmV2ZXJzZSA/IFtwZW5kaW5nSXRlbV0uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkoUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbikucmV2ZXJzZSgpKSkgOiBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKSksIFtwZW5kaW5nSXRlbV0pO1xuXG4gIHZhciBnZXRQb3NpdGlvbkNscyA9IGZ1bmN0aW9uIGdldFBvc2l0aW9uQ2xzKGVsZSwgaWR4KSB7XG4gICAgaWYgKG1vZGUgPT09ICdhbHRlcm5hdGUnKSB7XG4gICAgICBpZiAoZWxlLnByb3BzLnBvc2l0aW9uID09PSAncmlnaHQnKSByZXR1cm4gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLXJpZ2h0XCIpO1xuICAgICAgaWYgKGVsZS5wcm9wcy5wb3NpdGlvbiA9PT0gJ2xlZnQnKSByZXR1cm4gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWxlZnRcIik7XG4gICAgICByZXR1cm4gaWR4ICUgMiA9PT0gMCA/IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1sZWZ0XCIpIDogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLXJpZ2h0XCIpO1xuICAgIH1cblxuICAgIGlmIChtb2RlID09PSAnbGVmdCcpIHJldHVybiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbGVmdFwiKTtcbiAgICBpZiAobW9kZSA9PT0gJ3JpZ2h0JykgcmV0dXJuIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1yaWdodFwiKTtcbiAgICBpZiAoZWxlLnByb3BzLnBvc2l0aW9uID09PSAncmlnaHQnKSByZXR1cm4gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLXJpZ2h0XCIpO1xuICAgIHJldHVybiAnJztcbiAgfTsgLy8gUmVtb3ZlIGZhbHN5IGl0ZW1zXG5cblxuICB2YXIgdHJ1dGh5SXRlbXMgPSB0aW1lTGluZUl0ZW1zLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiAhIWl0ZW07XG4gIH0pO1xuICB2YXIgaXRlbXNDb3VudCA9IFJlYWN0LkNoaWxkcmVuLmNvdW50KHRydXRoeUl0ZW1zKTtcbiAgdmFyIGxhc3RDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbGFzdFwiKTtcbiAgdmFyIGl0ZW1zID0gUmVhY3QuQ2hpbGRyZW4ubWFwKHRydXRoeUl0ZW1zLCBmdW5jdGlvbiAoZWxlLCBpZHgpIHtcbiAgICB2YXIgcGVuZGluZ0NsYXNzID0gaWR4ID09PSBpdGVtc0NvdW50IC0gMiA/IGxhc3RDbHMgOiAnJztcbiAgICB2YXIgcmVhZHlDbGFzcyA9IGlkeCA9PT0gaXRlbXNDb3VudCAtIDEgPyBsYXN0Q2xzIDogJyc7XG4gICAgcmV0dXJuICgwLCBfcmVhY3ROb2RlLmNsb25lRWxlbWVudCkoZWxlLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFtlbGUucHJvcHMuY2xhc3NOYW1lLCAhcmV2ZXJzZSAmJiAhIXBlbmRpbmcgPyBwZW5kaW5nQ2xhc3MgOiByZWFkeUNsYXNzLCBnZXRQb3NpdGlvbkNscyhlbGUsIGlkeCldKVxuICAgIH0pO1xuICB9KTtcbiAgdmFyIGhhc0xhYmVsSXRlbSA9IHRpbWVMaW5lSXRlbXMuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciBfYTtcblxuICAgIHJldHVybiAhISgoX2EgPSBpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGl0ZW0ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYWJlbCk7XG4gIH0pO1xuICB2YXIgY2xhc3NTdHJpbmcgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBlbmRpbmdcIiksICEhcGVuZGluZyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcmV2ZXJzZVwiKSwgISFyZXZlcnNlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KG1vZGUpLCAhIW1vZGUgJiYgIWhhc0xhYmVsSXRlbSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGFiZWxcIiksIGhhc0xhYmVsSXRlbSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHJlc3RQcm9wcywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgfSksIGl0ZW1zKTtcbn07XG5cblRpbWVsaW5lLkl0ZW0gPSBfVGltZWxpbmVJdGVtW1wiZGVmYXVsdFwiXTtcblRpbWVsaW5lLmRlZmF1bHRQcm9wcyA9IHtcbiAgcmV2ZXJzZTogZmFsc2UsXG4gIG1vZGU6ICcnXG59O1xudmFyIF9kZWZhdWx0ID0gVGltZWxpbmU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm9taXQuanNcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBUaW1lbGluZUl0ZW0gPSBmdW5jdGlvbiBUaW1lbGluZUl0ZW0ocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzLCBfY2xhc3NOYW1lczI7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgcGVuZGluZyA9IHByb3BzLnBlbmRpbmcsXG4gICAgICBkb3QgPSBwcm9wcy5kb3QsXG4gICAgICBsYWJlbCA9IHByb3BzLmxhYmVsLFxuICAgICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNoaWxkcmVuXCIsIFwicGVuZGluZ1wiLCBcImRvdFwiLCBcImxhYmVsXCJdKTtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd0aW1lbGluZScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBpdGVtQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbVwiKSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1wZW5kaW5nXCIpLCBwZW5kaW5nKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICB2YXIgZG90Q2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWhlYWRcIiksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWhlYWQtY3VzdG9tXCIpLCBkb3QpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWhlYWQtXCIpLmNvbmNhdChjb2xvciksIHRydWUpLCBfY2xhc3NOYW1lczIpKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCAoMCwgX29taXRbXCJkZWZhdWx0XCJdKShyZXN0UHJvcHMsIFsncG9zaXRpb24nXSksIHtcbiAgICBjbGFzc05hbWU6IGl0ZW1DbGFzc05hbWVcbiAgfSksIGxhYmVsICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1sYWJlbFwiKVxuICB9LCBsYWJlbCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS10YWlsXCIpXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBkb3RDbGFzc05hbWUsXG4gICAgc3R5bGU6IHtcbiAgICAgIGJvcmRlckNvbG9yOiAvYmx1ZXxyZWR8Z3JlZW58Z3JheS8udGVzdChjb2xvciB8fCAnJykgPyB1bmRlZmluZWQgOiBjb2xvclxuICAgIH1cbiAgfSwgZG90KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWNvbnRlbnRcIilcbiAgfSwgY2hpbGRyZW4pKTtcbn07XG5cblRpbWVsaW5lSXRlbS5kZWZhdWx0UHJvcHMgPSB7XG4gIGNvbG9yOiAnYmx1ZScsXG4gIHBlbmRpbmc6IGZhbHNlLFxuICBwb3NpdGlvbjogJydcbn07XG52YXIgX2RlZmF1bHQgPSBUaW1lbGluZUl0ZW07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX1RpbWVsaW5lID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UaW1lbGluZVwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9UaW1lbGluZVtcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNUb29sdGlwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdG9vbHRpcFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3BsYWNlbWVudHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BsYWNlbWVudHNcIikpO1xuXG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWFjdE5vZGVcIik7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX2NvbG9ycyA9IHJlcXVpcmUoXCIuLi9fdXRpbC9jb2xvcnNcIik7XG5cbnZhciBzcGxpdE9iamVjdCA9IGZ1bmN0aW9uIHNwbGl0T2JqZWN0KG9iaiwga2V5cykge1xuICB2YXIgcGlja2VkID0ge307XG4gIHZhciBvbWl0dGVkID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBvYmopO1xuICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChvYmogJiYga2V5IGluIG9iaikge1xuICAgICAgcGlja2VkW2tleV0gPSBvYmpba2V5XTtcbiAgICAgIGRlbGV0ZSBvbWl0dGVkW2tleV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBwaWNrZWQ6IHBpY2tlZCxcbiAgICBvbWl0dGVkOiBvbWl0dGVkXG4gIH07XG59O1xuXG52YXIgUHJlc2V0Q29sb3JSZWdleCA9IG5ldyBSZWdFeHAoXCJeKFwiLmNvbmNhdChfY29sb3JzLlByZXNldENvbG9yVHlwZXMuam9pbignfCcpLCBcIikoLWludmVyc2UpPyRcIikpOyAvLyBGaXggVG9vbHRpcCB3b24ndCBoaWRlIGF0IGRpc2FibGVkIGJ1dHRvblxuLy8gbW91c2UgZXZlbnRzIGRvbid0IHRyaWdnZXIgYXQgZGlzYWJsZWQgYnV0dG9uIGluIENocm9tZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC90b29sdGlwL2lzc3Vlcy8xOFxuXG5mdW5jdGlvbiBnZXREaXNhYmxlZENvbXBhdGlibGVDaGlsZHJlbihlbGVtZW50LCBwcmVmaXhDbHMpIHtcbiAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gIGlmICgoZWxlbWVudFR5cGUuX19BTlRfQlVUVE9OID09PSB0cnVlIHx8IGVsZW1lbnRUeXBlLl9fQU5UX1NXSVRDSCA9PT0gdHJ1ZSB8fCBlbGVtZW50VHlwZS5fX0FOVF9DSEVDS0JPWCA9PT0gdHJ1ZSB8fCBlbGVtZW50LnR5cGUgPT09ICdidXR0b24nKSAmJiBlbGVtZW50LnByb3BzLmRpc2FibGVkKSB7XG4gICAgLy8gUGljayBzb21lIGxheW91dCByZWxhdGVkIHN0eWxlIHByb3BlcnRpZXMgdXAgdG8gc3BhblxuICAgIC8vIFByZXZlbnQgbGF5b3V0IGJ1Z3MgbGlrZSBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy81MjU0XG4gICAgdmFyIF9zcGxpdE9iamVjdCA9IHNwbGl0T2JqZWN0KGVsZW1lbnQucHJvcHMuc3R5bGUsIFsncG9zaXRpb24nLCAnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJywgJ2Zsb2F0JywgJ2Rpc3BsYXknLCAnekluZGV4J10pLFxuICAgICAgICBwaWNrZWQgPSBfc3BsaXRPYmplY3QucGlja2VkLFxuICAgICAgICBvbWl0dGVkID0gX3NwbGl0T2JqZWN0Lm9taXR0ZWQ7XG5cbiAgICB2YXIgc3BhblN0eWxlID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ1xuICAgIH0sIHBpY2tlZCksIHtcbiAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJyxcbiAgICAgIHdpZHRoOiBlbGVtZW50LnByb3BzLmJsb2NrID8gJzEwMCUnIDogbnVsbFxuICAgIH0pO1xuICAgIHZhciBidXR0b25TdHlsZSA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIG9taXR0ZWQpLCB7XG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICB9KTtcbiAgICB2YXIgY2hpbGQgPSAoMCwgX3JlYWN0Tm9kZS5jbG9uZUVsZW1lbnQpKGVsZW1lbnQsIHtcbiAgICAgIHN0eWxlOiBidXR0b25TdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgc3R5bGU6IHNwYW5TdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoZWxlbWVudC5wcm9wcy5jbGFzc05hbWUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWQtY29tcGF0aWJsZS13cmFwcGVyXCIpKVxuICAgIH0sIGNoaWxkKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG52YXIgVG9vbHRpcCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lczI7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCksXG4gICAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoISFwcm9wcy52aXNpYmxlIHx8ICEhcHJvcHMuZGVmYXVsdFZpc2libGUpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgdmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICgndmlzaWJsZScgaW4gcHJvcHMpIHtcbiAgICAgIHNldFZpc2libGUocHJvcHMudmlzaWJsZSk7XG4gICAgfVxuICB9LCBbcHJvcHMudmlzaWJsZV0pO1xuXG4gIHZhciBpc05vVGl0bGUgPSBmdW5jdGlvbiBpc05vVGl0bGUoKSB7XG4gICAgdmFyIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgICAgIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuICAgIHJldHVybiAhdGl0bGUgJiYgIW92ZXJsYXkgJiYgdGl0bGUgIT09IDA7IC8vIG92ZXJsYXkgZm9yIG9sZCB2ZXJzaW9uIGNvbXBhdGliaWxpdHlcbiAgfTtcblxuICB2YXIgb25WaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlKHZpcykge1xuICAgIGlmICghKCd2aXNpYmxlJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldFZpc2libGUoaXNOb1RpdGxlKCkgPyBmYWxzZSA6IHZpcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm9uVmlzaWJsZUNoYW5nZSAmJiAhaXNOb1RpdGxlKCkpIHtcbiAgICAgIHByb3BzLm9uVmlzaWJsZUNoYW5nZSh2aXMpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0VG9vbHRpcFBsYWNlbWVudHMgPSBmdW5jdGlvbiBnZXRUb29sdGlwUGxhY2VtZW50cygpIHtcbiAgICB2YXIgYnVpbHRpblBsYWNlbWVudHMgPSBwcm9wcy5idWlsdGluUGxhY2VtZW50cyxcbiAgICAgICAgYXJyb3dQb2ludEF0Q2VudGVyID0gcHJvcHMuYXJyb3dQb2ludEF0Q2VudGVyLFxuICAgICAgICBhdXRvQWRqdXN0T3ZlcmZsb3cgPSBwcm9wcy5hdXRvQWRqdXN0T3ZlcmZsb3c7XG4gICAgcmV0dXJuIGJ1aWx0aW5QbGFjZW1lbnRzIHx8ICgwLCBfcGxhY2VtZW50c1tcImRlZmF1bHRcIl0pKHtcbiAgICAgIGFycm93UG9pbnRBdENlbnRlcjogYXJyb3dQb2ludEF0Q2VudGVyLFxuICAgICAgYXV0b0FkanVzdE92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dcbiAgICB9KTtcbiAgfTsgLy8g5Yqo5oCB6K6+572u5Yqo55S754K5XG5cblxuICB2YXIgb25Qb3B1cEFsaWduID0gZnVuY3Rpb24gb25Qb3B1cEFsaWduKGRvbU5vZGUsIGFsaWduKSB7XG4gICAgdmFyIHBsYWNlbWVudHMgPSBnZXRUb29sdGlwUGxhY2VtZW50cygpOyAvLyDlvZPliY3ov5Tlm57nmoTkvY3nva5cblxuICAgIHZhciBwbGFjZW1lbnQgPSBPYmplY3Qua2V5cyhwbGFjZW1lbnRzKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIHBsYWNlbWVudHNba2V5XS5wb2ludHNbMF0gPT09IGFsaWduLnBvaW50c1swXSAmJiBwbGFjZW1lbnRzW2tleV0ucG9pbnRzWzFdID09PSBhbGlnbi5wb2ludHNbMV07XG4gICAgfSlbMF07XG5cbiAgICBpZiAoIXBsYWNlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8g5qC55o2u5b2T5YmN5Z2Q5qCH6K6+572u5Yqo55S754K5XG5cblxuICAgIHZhciByZWN0ID0gZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgdHJhbnNmb3JtT3JpZ2luID0ge1xuICAgICAgdG9wOiAnNTAlJyxcbiAgICAgIGxlZnQ6ICc1MCUnXG4gICAgfTtcblxuICAgIGlmIChwbGFjZW1lbnQuaW5kZXhPZigndG9wJykgPj0gMCB8fCBwbGFjZW1lbnQuaW5kZXhPZignQm90dG9tJykgPj0gMCkge1xuICAgICAgdHJhbnNmb3JtT3JpZ2luLnRvcCA9IFwiXCIuY29uY2F0KHJlY3QuaGVpZ2h0IC0gYWxpZ24ub2Zmc2V0WzFdLCBcInB4XCIpO1xuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50LmluZGV4T2YoJ1RvcCcpID49IDAgfHwgcGxhY2VtZW50LmluZGV4T2YoJ2JvdHRvbScpID49IDApIHtcbiAgICAgIHRyYW5zZm9ybU9yaWdpbi50b3AgPSBcIlwiLmNvbmNhdCgtYWxpZ24ub2Zmc2V0WzFdLCBcInB4XCIpO1xuICAgIH1cblxuICAgIGlmIChwbGFjZW1lbnQuaW5kZXhPZignbGVmdCcpID49IDAgfHwgcGxhY2VtZW50LmluZGV4T2YoJ1JpZ2h0JykgPj0gMCkge1xuICAgICAgdHJhbnNmb3JtT3JpZ2luLmxlZnQgPSBcIlwiLmNvbmNhdChyZWN0LndpZHRoIC0gYWxpZ24ub2Zmc2V0WzBdLCBcInB4XCIpO1xuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50LmluZGV4T2YoJ3JpZ2h0JykgPj0gMCB8fCBwbGFjZW1lbnQuaW5kZXhPZignTGVmdCcpID49IDApIHtcbiAgICAgIHRyYW5zZm9ybU9yaWdpbi5sZWZ0ID0gXCJcIi5jb25jYXQoLWFsaWduLm9mZnNldFswXSwgXCJweFwiKTtcbiAgICB9XG5cbiAgICBkb21Ob2RlLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IFwiXCIuY29uY2F0KHRyYW5zZm9ybU9yaWdpbi5sZWZ0LCBcIiBcIikuY29uY2F0KHRyYW5zZm9ybU9yaWdpbi50b3ApO1xuICB9O1xuXG4gIHZhciBnZXRPdmVybGF5ID0gZnVuY3Rpb24gZ2V0T3ZlcmxheSgpIHtcbiAgICB2YXIgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgICAgb3ZlcmxheSA9IHByb3BzLm92ZXJsYXk7XG5cbiAgICBpZiAodGl0bGUgPT09IDApIHtcbiAgICAgIHJldHVybiB0aXRsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3ZlcmxheSB8fCB0aXRsZSB8fCAnJztcbiAgfTtcblxuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgb3BlbkNsYXNzTmFtZSA9IHByb3BzLm9wZW5DbGFzc05hbWUsXG4gICAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgZ2V0VG9vbHRpcENvbnRhaW5lciA9IHByb3BzLmdldFRvb2x0aXBDb250YWluZXIsXG4gICAgICBvdmVybGF5Q2xhc3NOYW1lID0gcHJvcHMub3ZlcmxheUNsYXNzTmFtZSxcbiAgICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBvdmVybGF5SW5uZXJTdHlsZSA9IHByb3BzLm92ZXJsYXlJbm5lclN0eWxlLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndG9vbHRpcCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciB0ZW1wVmlzaWJsZSA9IHZpc2libGU7IC8vIEhpZGUgdG9vbHRpcCB3aGVuIHRoZXJlIGlzIG5vIHRpdGxlXG5cbiAgaWYgKCEoJ3Zpc2libGUnIGluIHByb3BzKSAmJiBpc05vVGl0bGUoKSkge1xuICAgIHRlbXBWaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICB2YXIgY2hpbGQgPSBnZXREaXNhYmxlZENvbXBhdGlibGVDaGlsZHJlbigoMCwgX3JlYWN0Tm9kZS5pc1ZhbGlkRWxlbWVudCkoY2hpbGRyZW4pID8gY2hpbGRyZW4gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY2hpbGRyZW4pLCBwcmVmaXhDbHMpO1xuICB2YXIgY2hpbGRQcm9wcyA9IGNoaWxkLnByb3BzO1xuICB2YXIgY2hpbGRDbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShjaGlsZFByb3BzLmNsYXNzTmFtZSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgb3BlbkNsYXNzTmFtZSB8fCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9wZW5cIiksIHRydWUpKTtcbiAgdmFyIGN1c3RvbU92ZXJsYXlDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShvdmVybGF5Q2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMyID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoY29sb3IpLCBjb2xvciAmJiBQcmVzZXRDb2xvclJlZ2V4LnRlc3QoY29sb3IpKSwgX2NsYXNzTmFtZXMyKSk7XG4gIHZhciBmb3JtYXR0ZWRPdmVybGF5SW5uZXJTdHlsZTtcbiAgdmFyIGFycm93Q29udGVudFN0eWxlO1xuXG4gIGlmIChjb2xvciAmJiAhUHJlc2V0Q29sb3JSZWdleC50ZXN0KGNvbG9yKSkge1xuICAgIGZvcm1hdHRlZE92ZXJsYXlJbm5lclN0eWxlID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgb3ZlcmxheUlubmVyU3R5bGUpLCB7XG4gICAgICBiYWNrZ3JvdW5kOiBjb2xvclxuICAgIH0pO1xuICAgIGFycm93Q29udGVudFN0eWxlID0ge1xuICAgICAgYmFja2dyb3VuZDogY29sb3JcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1Rvb2x0aXBbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb3ZlcmxheUNsYXNzTmFtZTogY3VzdG9tT3ZlcmxheUNsYXNzTmFtZSxcbiAgICBnZXRUb29sdGlwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lciB8fCBnZXRUb29sdGlwQ29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICByZWY6IHJlZixcbiAgICBidWlsdGluUGxhY2VtZW50czogZ2V0VG9vbHRpcFBsYWNlbWVudHMoKSxcbiAgICBvdmVybGF5OiBnZXRPdmVybGF5KCksXG4gICAgdmlzaWJsZTogdGVtcFZpc2libGUsXG4gICAgb25WaXNpYmxlQ2hhbmdlOiBvblZpc2libGVDaGFuZ2UsXG4gICAgb25Qb3B1cEFsaWduOiBvblBvcHVwQWxpZ24sXG4gICAgb3ZlcmxheUlubmVyU3R5bGU6IGZvcm1hdHRlZE92ZXJsYXlJbm5lclN0eWxlLFxuICAgIGFycm93Q29udGVudDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvdy1jb250ZW50XCIpLFxuICAgICAgc3R5bGU6IGFycm93Q29udGVudFN0eWxlXG4gICAgfSlcbiAgfSksIHRlbXBWaXNpYmxlID8gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShjaGlsZCwge1xuICAgIGNsYXNzTmFtZTogY2hpbGRDbHNcbiAgfSkgOiBjaGlsZCk7XG59KTtcblRvb2x0aXAuZGlzcGxheU5hbWUgPSAnVG9vbHRpcCc7XG5Ub29sdGlwLmRlZmF1bHRQcm9wcyA9IHtcbiAgcGxhY2VtZW50OiAndG9wJyxcbiAgdHJhbnNpdGlvbk5hbWU6ICd6b29tLWJpZy1mYXN0JyxcbiAgbW91c2VFbnRlckRlbGF5OiAwLjEsXG4gIG1vdXNlTGVhdmVEZWxheTogMC4xLFxuICBhcnJvd1BvaW50QXRDZW50ZXI6IGZhbHNlLFxuICBhdXRvQWRqdXN0T3ZlcmZsb3c6IHRydWVcbn07XG52YXIgX2RlZmF1bHQgPSBUb29sdGlwO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldE92ZXJmbG93T3B0aW9ucyA9IGdldE92ZXJmbG93T3B0aW9ucztcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZ2V0UGxhY2VtZW50cztcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfcGxhY2VtZW50cyA9IHJlcXVpcmUoXCJyYy10b29sdGlwL2xpYi9wbGFjZW1lbnRzXCIpO1xuXG52YXIgYXV0b0FkanVzdE92ZXJmbG93RW5hYmxlZCA9IHtcbiAgYWRqdXN0WDogMSxcbiAgYWRqdXN0WTogMVxufTtcbnZhciBhdXRvQWRqdXN0T3ZlcmZsb3dEaXNhYmxlZCA9IHtcbiAgYWRqdXN0WDogMCxcbiAgYWRqdXN0WTogMFxufTtcbnZhciB0YXJnZXRPZmZzZXQgPSBbMCwgMF07XG5cbmZ1bmN0aW9uIGdldE92ZXJmbG93T3B0aW9ucyhhdXRvQWRqdXN0T3ZlcmZsb3cpIHtcbiAgaWYgKHR5cGVvZiBhdXRvQWRqdXN0T3ZlcmZsb3cgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBhdXRvQWRqdXN0T3ZlcmZsb3cgPyBhdXRvQWRqdXN0T3ZlcmZsb3dFbmFibGVkIDogYXV0b0FkanVzdE92ZXJmbG93RGlzYWJsZWQ7XG4gIH1cblxuICByZXR1cm4gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgYXV0b0FkanVzdE92ZXJmbG93RGlzYWJsZWQpLCBhdXRvQWRqdXN0T3ZlcmZsb3cpO1xufVxuXG5mdW5jdGlvbiBnZXRQbGFjZW1lbnRzKGNvbmZpZykge1xuICB2YXIgX2NvbmZpZyRhcnJvd1dpZHRoID0gY29uZmlnLmFycm93V2lkdGgsXG4gICAgICBhcnJvd1dpZHRoID0gX2NvbmZpZyRhcnJvd1dpZHRoID09PSB2b2lkIDAgPyA1IDogX2NvbmZpZyRhcnJvd1dpZHRoLFxuICAgICAgX2NvbmZpZyRob3Jpem9udGFsQXJyID0gY29uZmlnLmhvcml6b250YWxBcnJvd1NoaWZ0LFxuICAgICAgaG9yaXpvbnRhbEFycm93U2hpZnQgPSBfY29uZmlnJGhvcml6b250YWxBcnIgPT09IHZvaWQgMCA/IDE2IDogX2NvbmZpZyRob3Jpem9udGFsQXJyLFxuICAgICAgX2NvbmZpZyR2ZXJ0aWNhbEFycm93ID0gY29uZmlnLnZlcnRpY2FsQXJyb3dTaGlmdCxcbiAgICAgIHZlcnRpY2FsQXJyb3dTaGlmdCA9IF9jb25maWckdmVydGljYWxBcnJvdyA9PT0gdm9pZCAwID8gOCA6IF9jb25maWckdmVydGljYWxBcnJvdyxcbiAgICAgIGF1dG9BZGp1c3RPdmVyZmxvdyA9IGNvbmZpZy5hdXRvQWRqdXN0T3ZlcmZsb3c7XG4gIHZhciBwbGFjZW1lbnRNYXAgPSB7XG4gICAgbGVmdDoge1xuICAgICAgcG9pbnRzOiBbJ2NyJywgJ2NsJ10sXG4gICAgICBvZmZzZXQ6IFstNCwgMF1cbiAgICB9LFxuICAgIHJpZ2h0OiB7XG4gICAgICBwb2ludHM6IFsnY2wnLCAnY3InXSxcbiAgICAgIG9mZnNldDogWzQsIDBdXG4gICAgfSxcbiAgICB0b3A6IHtcbiAgICAgIHBvaW50czogWydiYycsICd0YyddLFxuICAgICAgb2Zmc2V0OiBbMCwgLTRdXG4gICAgfSxcbiAgICBib3R0b206IHtcbiAgICAgIHBvaW50czogWyd0YycsICdiYyddLFxuICAgICAgb2Zmc2V0OiBbMCwgNF1cbiAgICB9LFxuICAgIHRvcExlZnQ6IHtcbiAgICAgIHBvaW50czogWydibCcsICd0YyddLFxuICAgICAgb2Zmc2V0OiBbLShob3Jpem9udGFsQXJyb3dTaGlmdCArIGFycm93V2lkdGgpLCAtNF1cbiAgICB9LFxuICAgIGxlZnRUb3A6IHtcbiAgICAgIHBvaW50czogWyd0cicsICdjbCddLFxuICAgICAgb2Zmc2V0OiBbLTQsIC0odmVydGljYWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aCldXG4gICAgfSxcbiAgICB0b3BSaWdodDoge1xuICAgICAgcG9pbnRzOiBbJ2JyJywgJ3RjJ10sXG4gICAgICBvZmZzZXQ6IFtob3Jpem9udGFsQXJyb3dTaGlmdCArIGFycm93V2lkdGgsIC00XVxuICAgIH0sXG4gICAgcmlnaHRUb3A6IHtcbiAgICAgIHBvaW50czogWyd0bCcsICdjciddLFxuICAgICAgb2Zmc2V0OiBbNCwgLSh2ZXJ0aWNhbEFycm93U2hpZnQgKyBhcnJvd1dpZHRoKV1cbiAgICB9LFxuICAgIGJvdHRvbVJpZ2h0OiB7XG4gICAgICBwb2ludHM6IFsndHInLCAnYmMnXSxcbiAgICAgIG9mZnNldDogW2hvcml6b250YWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aCwgNF1cbiAgICB9LFxuICAgIHJpZ2h0Qm90dG9tOiB7XG4gICAgICBwb2ludHM6IFsnYmwnLCAnY3InXSxcbiAgICAgIG9mZnNldDogWzQsIHZlcnRpY2FsQXJyb3dTaGlmdCArIGFycm93V2lkdGhdXG4gICAgfSxcbiAgICBib3R0b21MZWZ0OiB7XG4gICAgICBwb2ludHM6IFsndGwnLCAnYmMnXSxcbiAgICAgIG9mZnNldDogWy0oaG9yaXpvbnRhbEFycm93U2hpZnQgKyBhcnJvd1dpZHRoKSwgNF1cbiAgICB9LFxuICAgIGxlZnRCb3R0b206IHtcbiAgICAgIHBvaW50czogWydicicsICdjbCddLFxuICAgICAgb2Zmc2V0OiBbLTQsIHZlcnRpY2FsQXJyb3dTaGlmdCArIGFycm93V2lkdGhdXG4gICAgfVxuICB9O1xuICBPYmplY3Qua2V5cyhwbGFjZW1lbnRNYXApLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHBsYWNlbWVudE1hcFtrZXldID0gY29uZmlnLmFycm93UG9pbnRBdENlbnRlciA/ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHBsYWNlbWVudE1hcFtrZXldKSwge1xuICAgICAgb3ZlcmZsb3c6IGdldE92ZXJmbG93T3B0aW9ucyhhdXRvQWRqdXN0T3ZlcmZsb3cpLFxuICAgICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgICB9KSA6ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIF9wbGFjZW1lbnRzLnBsYWNlbWVudHNba2V5XSksIHtcbiAgICAgIG92ZXJmbG93OiBnZXRPdmVyZmxvd09wdGlvbnMoYXV0b0FkanVzdE92ZXJmbG93KVxuICAgIH0pO1xuICAgIHBsYWNlbWVudE1hcFtrZXldLmlnbm9yZVNoYWtlID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBwbGFjZW1lbnRNYXA7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHBvcnRzLk9taXRQcm9wcyA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfdHlwZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC90eXBlXCIpO1xuXG52YXIgX3BhZ2luYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9wYWdpbmF0aW9uXCIpKTtcblxudmFyIF9MaXN0SXRlbSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTGlzdEl0ZW1cIikpO1xuXG52YXIgT21pdFByb3BzID0gKDAsIF90eXBlLnR1cGxlKSgnaGFuZGxlRmlsdGVyJywgJ2hhbmRsZUNsZWFyJywgJ2NoZWNrZWRLZXlzJyk7XG5leHBvcnRzLk9taXRQcm9wcyA9IE9taXRQcm9wcztcblxuZnVuY3Rpb24gcGFyc2VQYWdpbmF0aW9uKHBhZ2luYXRpb24pIHtcbiAgaWYgKCFwYWdpbmF0aW9uKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZGVmYXVsdFBhZ2luYXRpb24gPSB7XG4gICAgcGFnZVNpemU6IDEwXG4gIH07XG5cbiAgaWYgKCgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKHBhZ2luYXRpb24pID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBkZWZhdWx0UGFnaW5hdGlvbiksIHBhZ2luYXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRQYWdpbmF0aW9uO1xufVxuXG52YXIgTGlzdEJvZHkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShMaXN0Qm9keSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoTGlzdEJvZHkpO1xuXG4gIGZ1bmN0aW9uIExpc3RCb2R5KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgTGlzdEJvZHkpO1xuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBjdXJyZW50OiAxXG4gICAgfTtcblxuICAgIF90aGlzLm9uSXRlbVNlbGVjdCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkl0ZW1TZWxlY3QgPSBfdGhpcyRwcm9wcy5vbkl0ZW1TZWxlY3QsXG4gICAgICAgICAgc2VsZWN0ZWRLZXlzID0gX3RoaXMkcHJvcHMuc2VsZWN0ZWRLZXlzO1xuICAgICAgdmFyIGNoZWNrZWQgPSBzZWxlY3RlZEtleXMuaW5kZXhPZihpdGVtLmtleSkgPj0gMDtcbiAgICAgIG9uSXRlbVNlbGVjdChpdGVtLmtleSwgIWNoZWNrZWQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkl0ZW1SZW1vdmUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIG9uSXRlbVJlbW92ZSA9IF90aGlzLnByb3BzLm9uSXRlbVJlbW92ZTtcbiAgICAgIG9uSXRlbVJlbW92ZSA9PT0gbnVsbCB8fCBvbkl0ZW1SZW1vdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uSXRlbVJlbW92ZShbaXRlbS5rZXldKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25QYWdlQ2hhbmdlID0gZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY3VycmVudDogY3VycmVudFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldEl0ZW1zID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBfdGhpcy5zdGF0ZS5jdXJyZW50O1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHBhZ2luYXRpb24gPSBfdGhpcyRwcm9wczIucGFnaW5hdGlvbixcbiAgICAgICAgICBmaWx0ZXJlZFJlbmRlckl0ZW1zID0gX3RoaXMkcHJvcHMyLmZpbHRlcmVkUmVuZGVySXRlbXM7XG4gICAgICB2YXIgbWVyZ2VkUGFnaW5hdGlvbiA9IHBhcnNlUGFnaW5hdGlvbihwYWdpbmF0aW9uKTtcbiAgICAgIHZhciBkaXNwbGF5SXRlbXMgPSBmaWx0ZXJlZFJlbmRlckl0ZW1zO1xuXG4gICAgICBpZiAobWVyZ2VkUGFnaW5hdGlvbikge1xuICAgICAgICBkaXNwbGF5SXRlbXMgPSBmaWx0ZXJlZFJlbmRlckl0ZW1zLnNsaWNlKChjdXJyZW50IC0gMSkgKiBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplLCBjdXJyZW50ICogbWVyZ2VkUGFnaW5hdGlvbi5wYWdlU2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaXNwbGF5SXRlbXM7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoTGlzdEJvZHksIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnN0YXRlLmN1cnJlbnQ7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczMucHJlZml4Q2xzLFxuICAgICAgICAgIG9uU2Nyb2xsID0gX3RoaXMkcHJvcHMzLm9uU2Nyb2xsLFxuICAgICAgICAgIGZpbHRlcmVkUmVuZGVySXRlbXMgPSBfdGhpcyRwcm9wczMuZmlsdGVyZWRSZW5kZXJJdGVtcyxcbiAgICAgICAgICBzZWxlY3RlZEtleXMgPSBfdGhpcyRwcm9wczMuc2VsZWN0ZWRLZXlzLFxuICAgICAgICAgIGdsb2JhbERpc2FibGVkID0gX3RoaXMkcHJvcHMzLmRpc2FibGVkLFxuICAgICAgICAgIHNob3dSZW1vdmUgPSBfdGhpcyRwcm9wczMuc2hvd1JlbW92ZSxcbiAgICAgICAgICBwYWdpbmF0aW9uID0gX3RoaXMkcHJvcHMzLnBhZ2luYXRpb247XG4gICAgICB2YXIgbWVyZ2VkUGFnaW5hdGlvbiA9IHBhcnNlUGFnaW5hdGlvbihwYWdpbmF0aW9uKTtcbiAgICAgIHZhciBwYWdpbmF0aW9uTm9kZSA9IG51bGw7XG5cbiAgICAgIGlmIChtZXJnZWRQYWdpbmF0aW9uKSB7XG4gICAgICAgIHBhZ2luYXRpb25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3BhZ2luYXRpb25bXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgICAgc2ltcGxlOiB0cnVlLFxuICAgICAgICAgIHNpemU6IFwic21hbGxcIixcbiAgICAgICAgICBkaXNhYmxlZDogZ2xvYmFsRGlzYWJsZWQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhZ2luYXRpb25cIiksXG4gICAgICAgICAgdG90YWw6IGZpbHRlcmVkUmVuZGVySXRlbXMubGVuZ3RoLFxuICAgICAgICAgIHBhZ2VTaXplOiBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplLFxuICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsXG4gICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25QYWdlQ2hhbmdlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LXNob3ctcmVtb3ZlXCIpLCBzaG93UmVtb3ZlKSksXG4gICAgICAgIG9uU2Nyb2xsOiBvblNjcm9sbFxuICAgICAgfSwgdGhpcy5nZXRJdGVtcygpLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgcmVuZGVyZWRFbCA9IF9yZWYucmVuZGVyZWRFbCxcbiAgICAgICAgICAgIHJlbmRlcmVkVGV4dCA9IF9yZWYucmVuZGVyZWRUZXh0LFxuICAgICAgICAgICAgaXRlbSA9IF9yZWYuaXRlbTtcbiAgICAgICAgdmFyIGRpc2FibGVkID0gaXRlbS5kaXNhYmxlZDtcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBzZWxlY3RlZEtleXMuaW5kZXhPZihpdGVtLmtleSkgPj0gMDtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9MaXN0SXRlbVtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICBkaXNhYmxlZDogZ2xvYmFsRGlzYWJsZWQgfHwgZGlzYWJsZWQsXG4gICAgICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgIHJlbmRlcmVkVGV4dDogcmVuZGVyZWRUZXh0LFxuICAgICAgICAgIHJlbmRlcmVkRWw6IHJlbmRlcmVkRWwsXG4gICAgICAgICAgY2hlY2tlZDogY2hlY2tlZCxcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBvbkNsaWNrOiBfdGhpczIub25JdGVtU2VsZWN0LFxuICAgICAgICAgIG9uUmVtb3ZlOiBfdGhpczIub25JdGVtUmVtb3ZlLFxuICAgICAgICAgIHNob3dSZW1vdmU6IHNob3dSZW1vdmVcbiAgICAgICAgfSk7XG4gICAgICB9KSksIHBhZ2luYXRpb25Ob2RlKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKF9yZWYyLCBfcmVmMykge1xuICAgICAgdmFyIGZpbHRlcmVkUmVuZGVySXRlbXMgPSBfcmVmMi5maWx0ZXJlZFJlbmRlckl0ZW1zLFxuICAgICAgICAgIHBhZ2luYXRpb24gPSBfcmVmMi5wYWdpbmF0aW9uO1xuICAgICAgdmFyIGN1cnJlbnQgPSBfcmVmMy5jdXJyZW50O1xuICAgICAgdmFyIG1lcmdlZFBhZ2luYXRpb24gPSBwYXJzZVBhZ2luYXRpb24ocGFnaW5hdGlvbik7XG5cbiAgICAgIGlmIChtZXJnZWRQYWdpbmF0aW9uKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgcGFnZSBudW1iZXJcbiAgICAgICAgdmFyIG1heFBhZ2VDb3VudCA9IE1hdGguY2VpbChmaWx0ZXJlZFJlbmRlckl0ZW1zLmxlbmd0aCAvIG1lcmdlZFBhZ2luYXRpb24ucGFnZVNpemUpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ID4gbWF4UGFnZUNvdW50KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IG1heFBhZ2VDb3VudFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBMaXN0Qm9keTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIF9kZWZhdWx0ID0gTGlzdEJvZHk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9EZWxldGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0RlbGV0ZU91dGxpbmVkXCIpKTtcblxudmFyIF9kZWZhdWx0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS9kZWZhdWx0XCIpKTtcblxudmFyIF9jaGVja2JveCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NoZWNrYm94XCIpKTtcblxudmFyIF90cmFuc0J1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL3RyYW5zQnV0dG9uXCIpKTtcblxudmFyIF9Mb2NhbGVSZWNlaXZlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS1wcm92aWRlci9Mb2NhbGVSZWNlaXZlclwiKSk7XG5cbnZhciBMaXN0SXRlbSA9IGZ1bmN0aW9uIExpc3RJdGVtKHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcblxuICB2YXIgcmVuZGVyZWRUZXh0ID0gcHJvcHMucmVuZGVyZWRUZXh0LFxuICAgICAgcmVuZGVyZWRFbCA9IHByb3BzLnJlbmRlcmVkRWwsXG4gICAgICBpdGVtID0gcHJvcHMuaXRlbSxcbiAgICAgIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkLFxuICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgICAgb25SZW1vdmUgPSBwcm9wcy5vblJlbW92ZSxcbiAgICAgIHNob3dSZW1vdmUgPSBwcm9wcy5zaG93UmVtb3ZlO1xuICB2YXIgY2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudC1pdGVtXCIpLCB0cnVlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWl0ZW0tZGlzYWJsZWRcIiksIGRpc2FibGVkIHx8IGl0ZW0uZGlzYWJsZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnQtaXRlbS1jaGVja2VkXCIpLCBjaGVja2VkKSwgX2NsYXNzTmFtZXMpKTtcbiAgdmFyIHRpdGxlO1xuXG4gIGlmICh0eXBlb2YgcmVuZGVyZWRUZXh0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVuZGVyZWRUZXh0ID09PSAnbnVtYmVyJykge1xuICAgIHRpdGxlID0gU3RyaW5nKHJlbmRlcmVkVGV4dCk7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwge1xuICAgIGNvbXBvbmVudE5hbWU6IFwiVHJhbnNmZXJcIixcbiAgICBkZWZhdWx0TG9jYWxlOiBfZGVmYXVsdDJbXCJkZWZhdWx0XCJdLlRyYW5zZmVyXG4gIH0sIGZ1bmN0aW9uICh0cmFuc2ZlckxvY2FsZSkge1xuICAgIHZhciBsaVByb3BzID0ge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICB0aXRsZTogdGl0bGVcbiAgICB9O1xuICAgIHZhciBsYWJlbE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnQtaXRlbS10ZXh0XCIpXG4gICAgfSwgcmVuZGVyZWRFbCk7IC8vIFNob3cgcmVtb3ZlXG5cbiAgICBpZiAoc2hvd1JlbW92ZSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgbGlQcm9wcywgbGFiZWxOb2RlLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdHJhbnNCdXR0b25bXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCB8fCBpdGVtLmRpc2FibGVkLFxuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudC1pdGVtLXJlbW92ZVwiKSxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IHRyYW5zZmVyTG9jYWxlLnJlbW92ZSxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICBvblJlbW92ZSA9PT0gbnVsbCB8fCBvblJlbW92ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25SZW1vdmUoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9EZWxldGVPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpKSk7XG4gICAgfSAvLyBEZWZhdWx0IGNsaWNrIHRvIHNlbGVjdFxuXG5cbiAgICBsaVByb3BzLm9uQ2xpY2sgPSBkaXNhYmxlZCB8fCBpdGVtLmRpc2FibGVkID8gdW5kZWZpbmVkIDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uQ2xpY2soaXRlbSk7XG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBsaVByb3BzLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY2hlY2tib3hbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkIHx8IGl0ZW0uZGlzYWJsZWRcbiAgICB9KSwgbGFiZWxOb2RlKTtcbiAgfSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhMaXN0SXRlbSk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9saXN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9saXN0XCIpKTtcblxudmFyIF9vcGVyYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL29wZXJhdGlvblwiKSk7XG5cbnZhciBfc2VhcmNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zZWFyY2hcIikpO1xuXG52YXIgX0xvY2FsZVJlY2VpdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyXCIpKTtcblxudmFyIF9kZWZhdWx0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS9kZWZhdWx0XCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgVHJhbnNmZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czJbXCJkZWZhdWx0XCJdKShUcmFuc2ZlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoVHJhbnNmZXIpO1xuXG4gIGZ1bmN0aW9uIFRyYW5zZmVyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBUcmFuc2Zlcik7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgX3RoaXMuc2VwYXJhdGVkRGF0YVNvdXJjZSA9IG51bGw7XG5cbiAgICBfdGhpcy5zZXRTdGF0ZUtleXMgPSBmdW5jdGlvbiAoZGlyZWN0aW9uLCBrZXlzKSB7XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICB2YXIgc291cmNlU2VsZWN0ZWRLZXlzID0gX3JlZi5zb3VyY2VTZWxlY3RlZEtleXM7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVNlbGVjdGVkS2V5czogdHlwZW9mIGtleXMgPT09ICdmdW5jdGlvbicgPyBrZXlzKHNvdXJjZVNlbGVjdGVkS2V5cyB8fCBbXSkgOiBrZXlzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICB2YXIgdGFyZ2V0U2VsZWN0ZWRLZXlzID0gX3JlZjIudGFyZ2V0U2VsZWN0ZWRLZXlzO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YXJnZXRTZWxlY3RlZEtleXM6IHR5cGVvZiBrZXlzID09PSAnZnVuY3Rpb24nID8ga2V5cyh0YXJnZXRTZWxlY3RlZEtleXMgfHwgW10pIDoga2V5c1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5nZXRMb2NhbGUgPSBmdW5jdGlvbiAodHJhbnNmZXJMb2NhbGUsIHJlbmRlckVtcHR5KSB7XG4gICAgICByZXR1cm4gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHRyYW5zZmVyTG9jYWxlKSwge1xuICAgICAgICBub3RGb3VuZENvbnRlbnQ6IHJlbmRlckVtcHR5KCdUcmFuc2ZlcicpXG4gICAgICB9KSwgX3RoaXMucHJvcHMubG9jYWxlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMubW92ZVRvID0gZnVuY3Rpb24gKGRpcmVjdGlvbikge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgX3RoaXMkcHJvcHMkdGFyZ2V0S2V5ID0gX3RoaXMkcHJvcHMudGFyZ2V0S2V5cyxcbiAgICAgICAgICB0YXJnZXRLZXlzID0gX3RoaXMkcHJvcHMkdGFyZ2V0S2V5ID09PSB2b2lkIDAgPyBbXSA6IF90aGlzJHByb3BzJHRhcmdldEtleSxcbiAgICAgICAgICBfdGhpcyRwcm9wcyRkYXRhU291cmMgPSBfdGhpcyRwcm9wcy5kYXRhU291cmNlLFxuICAgICAgICAgIGRhdGFTb3VyY2UgPSBfdGhpcyRwcm9wcyRkYXRhU291cmMgPT09IHZvaWQgMCA/IFtdIDogX3RoaXMkcHJvcHMkZGF0YVNvdXJjLFxuICAgICAgICAgIG9uQ2hhbmdlID0gX3RoaXMkcHJvcHMub25DaGFuZ2U7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICBzb3VyY2VTZWxlY3RlZEtleXMgPSBfdGhpcyRzdGF0ZS5zb3VyY2VTZWxlY3RlZEtleXMsXG4gICAgICAgICAgdGFyZ2V0U2VsZWN0ZWRLZXlzID0gX3RoaXMkc3RhdGUudGFyZ2V0U2VsZWN0ZWRLZXlzO1xuICAgICAgdmFyIG1vdmVLZXlzID0gZGlyZWN0aW9uID09PSAncmlnaHQnID8gc291cmNlU2VsZWN0ZWRLZXlzIDogdGFyZ2V0U2VsZWN0ZWRLZXlzOyAvLyBmaWx0ZXIgdGhlIGRpc2FibGVkIG9wdGlvbnNcblxuICAgICAgdmFyIG5ld01vdmVLZXlzID0gbW92ZUtleXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuICFkYXRhU291cmNlLnNvbWUoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gISEoa2V5ID09PSBkYXRhLmtleSAmJiBkYXRhLmRpc2FibGVkKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTsgLy8gbW92ZSBpdGVtcyB0byB0YXJnZXQgYm94XG5cbiAgICAgIHZhciBuZXdUYXJnZXRLZXlzID0gZGlyZWN0aW9uID09PSAncmlnaHQnID8gbmV3TW92ZUtleXMuY29uY2F0KHRhcmdldEtleXMpIDogdGFyZ2V0S2V5cy5maWx0ZXIoZnVuY3Rpb24gKHRhcmdldEtleSkge1xuICAgICAgICByZXR1cm4gbmV3TW92ZUtleXMuaW5kZXhPZih0YXJnZXRLZXkpID09PSAtMTtcbiAgICAgIH0pOyAvLyBlbXB0eSBjaGVja2VkIGtleXNcblxuICAgICAgdmFyIG9wcG9zaXRlRGlyZWN0aW9uID0gZGlyZWN0aW9uID09PSAncmlnaHQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcblxuICAgICAgX3RoaXMuc2V0U3RhdGVLZXlzKG9wcG9zaXRlRGlyZWN0aW9uLCBbXSk7XG5cbiAgICAgIF90aGlzLmhhbmRsZVNlbGVjdENoYW5nZShvcHBvc2l0ZURpcmVjdGlvbiwgW10pO1xuXG4gICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgb25DaGFuZ2UobmV3VGFyZ2V0S2V5cywgZGlyZWN0aW9uLCBuZXdNb3ZlS2V5cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm1vdmVUb0xlZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMubW92ZVRvKCdsZWZ0Jyk7XG4gICAgfTtcblxuICAgIF90aGlzLm1vdmVUb1JpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLm1vdmVUbygncmlnaHQnKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25JdGVtU2VsZWN0QWxsID0gZnVuY3Rpb24gKGRpcmVjdGlvbiwgc2VsZWN0ZWRLZXlzLCBjaGVja0FsbCkge1xuICAgICAgX3RoaXMuc2V0U3RhdGVLZXlzKGRpcmVjdGlvbiwgZnVuY3Rpb24gKHByZXZLZXlzKSB7XG4gICAgICAgIHZhciBtZXJnZWRDaGVja2VkS2V5cyA9IFtdO1xuXG4gICAgICAgIGlmIChjaGVja0FsbCkge1xuICAgICAgICAgIC8vIE1lcmdlIGN1cnJlbnQga2V5cyB3aXRoIG9yaWdpbiBrZXlcbiAgICAgICAgICBtZXJnZWRDaGVja2VkS2V5cyA9IEFycmF5LmZyb20obmV3IFNldChbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShwcmV2S2V5cyksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkoc2VsZWN0ZWRLZXlzKSkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBrZXlzIGZyb20gb3JpZ2luIGtleXNcbiAgICAgICAgICBtZXJnZWRDaGVja2VkS2V5cyA9IHByZXZLZXlzLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTE7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5oYW5kbGVTZWxlY3RDaGFuZ2UoZGlyZWN0aW9uLCBtZXJnZWRDaGVja2VkS2V5cyk7XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlZENoZWNrZWRLZXlzO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uTGVmdEl0ZW1TZWxlY3RBbGwgPSBmdW5jdGlvbiAoc2VsZWN0ZWRLZXlzLCBjaGVja0FsbCkge1xuICAgICAgcmV0dXJuIF90aGlzLm9uSXRlbVNlbGVjdEFsbCgnbGVmdCcsIHNlbGVjdGVkS2V5cywgY2hlY2tBbGwpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vblJpZ2h0SXRlbVNlbGVjdEFsbCA9IGZ1bmN0aW9uIChzZWxlY3RlZEtleXMsIGNoZWNrQWxsKSB7XG4gICAgICByZXR1cm4gX3RoaXMub25JdGVtU2VsZWN0QWxsKCdyaWdodCcsIHNlbGVjdGVkS2V5cywgY2hlY2tBbGwpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVGaWx0ZXIgPSBmdW5jdGlvbiAoZGlyZWN0aW9uLCBlKSB7XG4gICAgICB2YXIgb25TZWFyY2ggPSBfdGhpcy5wcm9wcy5vblNlYXJjaDtcbiAgICAgIHZhciB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuXG4gICAgICBpZiAob25TZWFyY2gpIHtcbiAgICAgICAgb25TZWFyY2goZGlyZWN0aW9uLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUxlZnRGaWx0ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZUZpbHRlcignbGVmdCcsIGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVSaWdodEZpbHRlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaGFuZGxlRmlsdGVyKCdyaWdodCcsIGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDbGVhciA9IGZ1bmN0aW9uIChkaXJlY3Rpb24pIHtcbiAgICAgIHZhciBvblNlYXJjaCA9IF90aGlzLnByb3BzLm9uU2VhcmNoO1xuXG4gICAgICBpZiAob25TZWFyY2gpIHtcbiAgICAgICAgb25TZWFyY2goZGlyZWN0aW9uLCAnJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUxlZnRDbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVDbGVhcignbGVmdCcpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVSaWdodENsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZUNsZWFyKCdyaWdodCcpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkl0ZW1TZWxlY3QgPSBmdW5jdGlvbiAoZGlyZWN0aW9uLCBzZWxlY3RlZEtleSwgY2hlY2tlZCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlMiA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIHNvdXJjZVNlbGVjdGVkS2V5cyA9IF90aGlzJHN0YXRlMi5zb3VyY2VTZWxlY3RlZEtleXMsXG4gICAgICAgICAgdGFyZ2V0U2VsZWN0ZWRLZXlzID0gX3RoaXMkc3RhdGUyLnRhcmdldFNlbGVjdGVkS2V5cztcbiAgICAgIHZhciBob2xkZXIgPSBkaXJlY3Rpb24gPT09ICdsZWZ0JyA/ICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkoc291cmNlU2VsZWN0ZWRLZXlzKSA6ICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkodGFyZ2V0U2VsZWN0ZWRLZXlzKTtcbiAgICAgIHZhciBpbmRleCA9IGhvbGRlci5pbmRleE9mKHNlbGVjdGVkS2V5KTtcblxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgaG9sZGVyLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIGhvbGRlci5wdXNoKHNlbGVjdGVkS2V5KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuaGFuZGxlU2VsZWN0Q2hhbmdlKGRpcmVjdGlvbiwgaG9sZGVyKTtcblxuICAgICAgaWYgKCFfdGhpcy5wcm9wcy5zZWxlY3RlZEtleXMpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGVLZXlzKGRpcmVjdGlvbiwgaG9sZGVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25MZWZ0SXRlbVNlbGVjdCA9IGZ1bmN0aW9uIChzZWxlY3RlZEtleSwgY2hlY2tlZCkge1xuICAgICAgcmV0dXJuIF90aGlzLm9uSXRlbVNlbGVjdCgnbGVmdCcsIHNlbGVjdGVkS2V5LCBjaGVja2VkKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25SaWdodEl0ZW1TZWxlY3QgPSBmdW5jdGlvbiAoc2VsZWN0ZWRLZXksIGNoZWNrZWQpIHtcbiAgICAgIHJldHVybiBfdGhpcy5vbkl0ZW1TZWxlY3QoJ3JpZ2h0Jywgc2VsZWN0ZWRLZXksIGNoZWNrZWQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vblJpZ2h0SXRlbVJlbW92ZSA9IGZ1bmN0aW9uIChzZWxlY3RlZEtleXMpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBfdGhpcyRwcm9wczIkdGFyZ2V0S2UgPSBfdGhpcyRwcm9wczIudGFyZ2V0S2V5cyxcbiAgICAgICAgICB0YXJnZXRLZXlzID0gX3RoaXMkcHJvcHMyJHRhcmdldEtlID09PSB2b2lkIDAgPyBbXSA6IF90aGlzJHByb3BzMiR0YXJnZXRLZSxcbiAgICAgICAgICBvbkNoYW5nZSA9IF90aGlzJHByb3BzMi5vbkNoYW5nZTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGVLZXlzKCdyaWdodCcsIFtdKTtcblxuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKHRhcmdldEtleXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gIXNlbGVjdGVkS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgICAgICB9KSwgJ2xlZnQnLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKHNlbGVjdGVkS2V5cykpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVTY3JvbGwgPSBmdW5jdGlvbiAoZGlyZWN0aW9uLCBlKSB7XG4gICAgICB2YXIgb25TY3JvbGwgPSBfdGhpcy5wcm9wcy5vblNjcm9sbDtcblxuICAgICAgaWYgKG9uU2Nyb2xsKSB7XG4gICAgICAgIG9uU2Nyb2xsKGRpcmVjdGlvbiwgZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUxlZnRTY3JvbGwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZVNjcm9sbCgnbGVmdCcsIGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVSaWdodFNjcm9sbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaGFuZGxlU2Nyb2xsKCdyaWdodCcsIGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVMaXN0U3R5bGUgPSBmdW5jdGlvbiAobGlzdFN0eWxlLCBkaXJlY3Rpb24pIHtcbiAgICAgIGlmICh0eXBlb2YgbGlzdFN0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBsaXN0U3R5bGUoe1xuICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlzdFN0eWxlO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJUcmFuc2ZlciA9IGZ1bmN0aW9uICh0cmFuc2ZlckxvY2FsZSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jb25maWdQcm92aWRlci5Db25maWdDb25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgICAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZjMuZ2V0UHJlZml4Q2xzLFxuICAgICAgICAgICAgcmVuZGVyRW1wdHkgPSBfcmVmMy5yZW5kZXJFbXB0eSxcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IF9yZWYzLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgY3VzdG9taXplUHJlZml4Q2xzID0gX3RoaXMkcHJvcHMzLnByZWZpeENscyxcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMy5jbGFzc05hbWUsXG4gICAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMy5kaXNhYmxlZCxcbiAgICAgICAgICAgIF90aGlzJHByb3BzMyRvcGVyYXRpbyA9IF90aGlzJHByb3BzMy5vcGVyYXRpb25zLFxuICAgICAgICAgICAgb3BlcmF0aW9ucyA9IF90aGlzJHByb3BzMyRvcGVyYXRpbyA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRwcm9wczMkb3BlcmF0aW8sXG4gICAgICAgICAgICBzaG93U2VhcmNoID0gX3RoaXMkcHJvcHMzLnNob3dTZWFyY2gsXG4gICAgICAgICAgICBmb290ZXIgPSBfdGhpcyRwcm9wczMuZm9vdGVyLFxuICAgICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczMuc3R5bGUsXG4gICAgICAgICAgICBsaXN0U3R5bGUgPSBfdGhpcyRwcm9wczMubGlzdFN0eWxlLFxuICAgICAgICAgICAgb3BlcmF0aW9uU3R5bGUgPSBfdGhpcyRwcm9wczMub3BlcmF0aW9uU3R5bGUsXG4gICAgICAgICAgICBmaWx0ZXJPcHRpb24gPSBfdGhpcyRwcm9wczMuZmlsdGVyT3B0aW9uLFxuICAgICAgICAgICAgcmVuZGVyID0gX3RoaXMkcHJvcHMzLnJlbmRlcixcbiAgICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMzLmNoaWxkcmVuLFxuICAgICAgICAgICAgc2hvd1NlbGVjdEFsbCA9IF90aGlzJHByb3BzMy5zaG93U2VsZWN0QWxsLFxuICAgICAgICAgICAgb25lV2F5ID0gX3RoaXMkcHJvcHMzLm9uZVdheSxcbiAgICAgICAgICAgIHBhZ2luYXRpb24gPSBfdGhpcyRwcm9wczMucGFnaW5hdGlvbjtcbiAgICAgICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndHJhbnNmZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuXG4gICAgICAgIHZhciBsb2NhbGUgPSBfdGhpcy5nZXRMb2NhbGUodHJhbnNmZXJMb2NhbGUsIHJlbmRlckVtcHR5KTtcblxuICAgICAgICB2YXIgX3RoaXMkc3RhdGUzID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgICBzb3VyY2VTZWxlY3RlZEtleXMgPSBfdGhpcyRzdGF0ZTMuc291cmNlU2VsZWN0ZWRLZXlzLFxuICAgICAgICAgICAgdGFyZ2V0U2VsZWN0ZWRLZXlzID0gX3RoaXMkc3RhdGUzLnRhcmdldFNlbGVjdGVkS2V5cztcbiAgICAgICAgdmFyIG1lcmdlZFBhZ2luYXRpb24gPSAhY2hpbGRyZW4gJiYgcGFnaW5hdGlvbjtcblxuICAgICAgICB2YXIgX3RoaXMkc2VwYXJhdGVEYXRhU291ID0gX3RoaXMuc2VwYXJhdGVEYXRhU291cmNlKCksXG4gICAgICAgICAgICBsZWZ0RGF0YVNvdXJjZSA9IF90aGlzJHNlcGFyYXRlRGF0YVNvdS5sZWZ0RGF0YVNvdXJjZSxcbiAgICAgICAgICAgIHJpZ2h0RGF0YVNvdXJjZSA9IF90aGlzJHNlcGFyYXRlRGF0YVNvdS5yaWdodERhdGFTb3VyY2U7XG5cbiAgICAgICAgdmFyIGxlZnRBY3RpdmUgPSB0YXJnZXRTZWxlY3RlZEtleXMubGVuZ3RoID4gMDtcbiAgICAgICAgdmFyIHJpZ2h0QWN0aXZlID0gc291cmNlU2VsZWN0ZWRLZXlzLmxlbmd0aCA+IDA7XG4gICAgICAgIHZhciBjbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY3VzdG9taXplLWxpc3RcIiksICEhY2hpbGRyZW4pLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcblxuICAgICAgICB2YXIgdGl0bGVzID0gX3RoaXMuZ2V0VGl0bGVzKGxvY2FsZSk7XG5cbiAgICAgICAgdmFyIHNlbGVjdEFsbExhYmVscyA9IF90aGlzLnByb3BzLnNlbGVjdEFsbExhYmVscyB8fCBbXTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNscyxcbiAgICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2xpc3RbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0XCIpLFxuICAgICAgICAgIHRpdGxlVGV4dDogdGl0bGVzWzBdLFxuICAgICAgICAgIGRhdGFTb3VyY2U6IGxlZnREYXRhU291cmNlLFxuICAgICAgICAgIGZpbHRlck9wdGlvbjogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgIHN0eWxlOiBfdGhpcy5oYW5kbGVMaXN0U3R5bGUobGlzdFN0eWxlLCAnbGVmdCcpLFxuICAgICAgICAgIGNoZWNrZWRLZXlzOiBzb3VyY2VTZWxlY3RlZEtleXMsXG4gICAgICAgICAgaGFuZGxlRmlsdGVyOiBfdGhpcy5oYW5kbGVMZWZ0RmlsdGVyLFxuICAgICAgICAgIGhhbmRsZUNsZWFyOiBfdGhpcy5oYW5kbGVMZWZ0Q2xlYXIsXG4gICAgICAgICAgb25JdGVtU2VsZWN0OiBfdGhpcy5vbkxlZnRJdGVtU2VsZWN0LFxuICAgICAgICAgIG9uSXRlbVNlbGVjdEFsbDogX3RoaXMub25MZWZ0SXRlbVNlbGVjdEFsbCxcbiAgICAgICAgICByZW5kZXI6IHJlbmRlcixcbiAgICAgICAgICBzaG93U2VhcmNoOiBzaG93U2VhcmNoLFxuICAgICAgICAgIHJlbmRlckxpc3Q6IGNoaWxkcmVuLFxuICAgICAgICAgIGZvb3RlcjogZm9vdGVyLFxuICAgICAgICAgIG9uU2Nyb2xsOiBfdGhpcy5oYW5kbGVMZWZ0U2Nyb2xsLFxuICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICBkaXJlY3Rpb246IFwibGVmdFwiLFxuICAgICAgICAgIHNob3dTZWxlY3RBbGw6IHNob3dTZWxlY3RBbGwsXG4gICAgICAgICAgc2VsZWN0QWxsTGFiZWw6IHNlbGVjdEFsbExhYmVsc1swXSxcbiAgICAgICAgICBwYWdpbmF0aW9uOiBtZXJnZWRQYWdpbmF0aW9uXG4gICAgICAgIH0sIGxvY2FsZSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfb3BlcmF0aW9uW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVyYXRpb25cIiksXG4gICAgICAgICAgcmlnaHRBY3RpdmU6IHJpZ2h0QWN0aXZlLFxuICAgICAgICAgIHJpZ2h0QXJyb3dUZXh0OiBvcGVyYXRpb25zWzBdLFxuICAgICAgICAgIG1vdmVUb1JpZ2h0OiBfdGhpcy5tb3ZlVG9SaWdodCxcbiAgICAgICAgICBsZWZ0QWN0aXZlOiBsZWZ0QWN0aXZlLFxuICAgICAgICAgIGxlZnRBcnJvd1RleHQ6IG9wZXJhdGlvbnNbMV0sXG4gICAgICAgICAgbW92ZVRvTGVmdDogX3RoaXMubW92ZVRvTGVmdCxcbiAgICAgICAgICBzdHlsZTogb3BlcmF0aW9uU3R5bGUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICAgIG9uZVdheTogb25lV2F5XG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfbGlzdFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3RcIiksXG4gICAgICAgICAgdGl0bGVUZXh0OiB0aXRsZXNbMV0sXG4gICAgICAgICAgZGF0YVNvdXJjZTogcmlnaHREYXRhU291cmNlLFxuICAgICAgICAgIGZpbHRlck9wdGlvbjogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgIHN0eWxlOiBfdGhpcy5oYW5kbGVMaXN0U3R5bGUobGlzdFN0eWxlLCAncmlnaHQnKSxcbiAgICAgICAgICBjaGVja2VkS2V5czogdGFyZ2V0U2VsZWN0ZWRLZXlzLFxuICAgICAgICAgIGhhbmRsZUZpbHRlcjogX3RoaXMuaGFuZGxlUmlnaHRGaWx0ZXIsXG4gICAgICAgICAgaGFuZGxlQ2xlYXI6IF90aGlzLmhhbmRsZVJpZ2h0Q2xlYXIsXG4gICAgICAgICAgb25JdGVtU2VsZWN0OiBfdGhpcy5vblJpZ2h0SXRlbVNlbGVjdCxcbiAgICAgICAgICBvbkl0ZW1TZWxlY3RBbGw6IF90aGlzLm9uUmlnaHRJdGVtU2VsZWN0QWxsLFxuICAgICAgICAgIG9uSXRlbVJlbW92ZTogX3RoaXMub25SaWdodEl0ZW1SZW1vdmUsXG4gICAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgICAgc2hvd1NlYXJjaDogc2hvd1NlYXJjaCxcbiAgICAgICAgICByZW5kZXJMaXN0OiBjaGlsZHJlbixcbiAgICAgICAgICBmb290ZXI6IGZvb3RlcixcbiAgICAgICAgICBvblNjcm9sbDogX3RoaXMuaGFuZGxlUmlnaHRTY3JvbGwsXG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgIGRpcmVjdGlvbjogXCJyaWdodFwiLFxuICAgICAgICAgIHNob3dTZWxlY3RBbGw6IHNob3dTZWxlY3RBbGwsXG4gICAgICAgICAgc2VsZWN0QWxsTGFiZWw6IHNlbGVjdEFsbExhYmVsc1sxXSxcbiAgICAgICAgICBzaG93UmVtb3ZlOiBvbmVXYXksXG4gICAgICAgICAgcGFnaW5hdGlvbjogbWVyZ2VkUGFnaW5hdGlvblxuICAgICAgICB9LCBsb2NhbGUpKSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIF9wcm9wcyRzZWxlY3RlZEtleXMgPSBwcm9wcy5zZWxlY3RlZEtleXMsXG4gICAgICAgIHNlbGVjdGVkS2V5cyA9IF9wcm9wcyRzZWxlY3RlZEtleXMgPT09IHZvaWQgMCA/IFtdIDogX3Byb3BzJHNlbGVjdGVkS2V5cyxcbiAgICAgICAgX3Byb3BzJHRhcmdldEtleXMgPSBwcm9wcy50YXJnZXRLZXlzLFxuICAgICAgICB0YXJnZXRLZXlzID0gX3Byb3BzJHRhcmdldEtleXMgPT09IHZvaWQgMCA/IFtdIDogX3Byb3BzJHRhcmdldEtleXM7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBzb3VyY2VTZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0S2V5cy5pbmRleE9mKGtleSkgPT09IC0xO1xuICAgICAgfSksXG4gICAgICB0YXJnZXRTZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0S2V5cy5pbmRleE9mKGtleSkgPiAtMTtcbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMltcImRlZmF1bHRcIl0pKFRyYW5zZmVyLCBbe1xuICAgIGtleTogXCJnZXRUaXRsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGl0bGVzKHRyYW5zZmVyTG9jYWxlKSB7XG4gICAgICB2YXIgdGl0bGVzID0gdGhpcy5wcm9wcy50aXRsZXM7XG5cbiAgICAgIGlmICh0aXRsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRpdGxlcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYW5zZmVyTG9jYWxlLnRpdGxlcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFuZGxlU2VsZWN0Q2hhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVNlbGVjdENoYW5nZShkaXJlY3Rpb24sIGhvbGRlcikge1xuICAgICAgdmFyIF90aGlzJHN0YXRlNCA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgc291cmNlU2VsZWN0ZWRLZXlzID0gX3RoaXMkc3RhdGU0LnNvdXJjZVNlbGVjdGVkS2V5cyxcbiAgICAgICAgICB0YXJnZXRTZWxlY3RlZEtleXMgPSBfdGhpcyRzdGF0ZTQudGFyZ2V0U2VsZWN0ZWRLZXlzO1xuICAgICAgdmFyIG9uU2VsZWN0Q2hhbmdlID0gdGhpcy5wcm9wcy5vblNlbGVjdENoYW5nZTtcblxuICAgICAgaWYgKCFvblNlbGVjdENoYW5nZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICBvblNlbGVjdENoYW5nZShob2xkZXIsIHRhcmdldFNlbGVjdGVkS2V5cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvblNlbGVjdENoYW5nZShzb3VyY2VTZWxlY3RlZEtleXMsIGhvbGRlcik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlcGFyYXRlRGF0YVNvdXJjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXBhcmF0ZURhdGFTb3VyY2UoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBkYXRhU291cmNlID0gX3RoaXMkcHJvcHM0LmRhdGFTb3VyY2UsXG4gICAgICAgICAgcm93S2V5ID0gX3RoaXMkcHJvcHM0LnJvd0tleSxcbiAgICAgICAgICBfdGhpcyRwcm9wczQkdGFyZ2V0S2UgPSBfdGhpcyRwcm9wczQudGFyZ2V0S2V5cyxcbiAgICAgICAgICB0YXJnZXRLZXlzID0gX3RoaXMkcHJvcHM0JHRhcmdldEtlID09PSB2b2lkIDAgPyBbXSA6IF90aGlzJHByb3BzNCR0YXJnZXRLZTtcbiAgICAgIHZhciBsZWZ0RGF0YVNvdXJjZSA9IFtdO1xuICAgICAgdmFyIHJpZ2h0RGF0YVNvdXJjZSA9IG5ldyBBcnJheSh0YXJnZXRLZXlzLmxlbmd0aCk7XG4gICAgICBkYXRhU291cmNlLmZvckVhY2goZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICBpZiAocm93S2V5KSB7XG4gICAgICAgICAgcmVjb3JkLmtleSA9IHJvd0tleShyZWNvcmQpO1xuICAgICAgICB9IC8vIHJpZ2h0RGF0YVNvdXJjZSBzaG91bGQgYmUgb3JkZXJlZCBieSB0YXJnZXRLZXlzXG4gICAgICAgIC8vIGxlZnREYXRhU291cmNlIHNob3VsZCBiZSBvcmRlcmVkIGJ5IGRhdGFTb3VyY2VcblxuXG4gICAgICAgIHZhciBpbmRleE9mS2V5ID0gdGFyZ2V0S2V5cy5pbmRleE9mKHJlY29yZC5rZXkpO1xuXG4gICAgICAgIGlmIChpbmRleE9mS2V5ICE9PSAtMSkge1xuICAgICAgICAgIHJpZ2h0RGF0YVNvdXJjZVtpbmRleE9mS2V5XSA9IHJlY29yZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZWZ0RGF0YVNvdXJjZS5wdXNoKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdERhdGFTb3VyY2U6IGxlZnREYXRhU291cmNlLFxuICAgICAgICByaWdodERhdGFTb3VyY2U6IHJpZ2h0RGF0YVNvdXJjZVxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTG9jYWxlUmVjZWl2ZXJbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgIGNvbXBvbmVudE5hbWU6IFwiVHJhbnNmZXJcIixcbiAgICAgICAgZGVmYXVsdExvY2FsZTogX2RlZmF1bHQyW1wiZGVmYXVsdFwiXS5UcmFuc2ZlclxuICAgICAgfSwgdGhpcy5yZW5kZXJUcmFuc2Zlcik7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhfcmVmNCkge1xuICAgICAgdmFyIHNlbGVjdGVkS2V5cyA9IF9yZWY0LnNlbGVjdGVkS2V5cyxcbiAgICAgICAgICB0YXJnZXRLZXlzID0gX3JlZjQudGFyZ2V0S2V5cyxcbiAgICAgICAgICBwYWdpbmF0aW9uID0gX3JlZjQucGFnaW5hdGlvbixcbiAgICAgICAgICBjaGlsZHJlbiA9IF9yZWY0LmNoaWxkcmVuO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRLZXlzKSB7XG4gICAgICAgIHZhciBtZXJnZWRUYXJnZXRLZXlzID0gdGFyZ2V0S2V5cyB8fCBbXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2VTZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuICFtZXJnZWRUYXJnZXRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFyZ2V0U2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZWRUYXJnZXRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoIXBhZ2luYXRpb24gfHwgIWNoaWxkcmVuLCAnVHJhbnNmZXInLCAnYHBhZ2luYXRpb25gIG5vdCBzdXBwb3J0IGN1c3RvbWl6ZSByZW5kZXIgbGlzdC4nKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVHJhbnNmZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7IC8vIEZvciBoaWdoLWxldmVsIGN1c3RvbWl6ZWQgVHJhbnNmZXIgQGRxYXJpYVxuXG5cblRyYW5zZmVyLkxpc3QgPSBfbGlzdFtcImRlZmF1bHRcIl07XG5UcmFuc2Zlci5PcGVyYXRpb24gPSBfb3BlcmF0aW9uW1wiZGVmYXVsdFwiXTtcblRyYW5zZmVyLlNlYXJjaCA9IF9zZWFyY2hbXCJkZWZhdWx0XCJdO1xuVHJhbnNmZXIuZGVmYXVsdFByb3BzID0ge1xuICBkYXRhU291cmNlOiBbXSxcbiAgbG9jYWxlOiB7fSxcbiAgc2hvd1NlYXJjaDogZmFsc2UsXG4gIGxpc3RTdHlsZTogZnVuY3Rpb24gbGlzdFN0eWxlKCkge31cbn07XG52YXIgX2RlZmF1bHQgPSBUcmFuc2ZlcjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfRG93bk91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvRG93bk91dGxpbmVkXCIpKTtcblxudmFyIF9jaGVja2JveCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NoZWNrYm94XCIpKTtcblxudmFyIF9tZW51ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbWVudVwiKSk7XG5cbnZhciBfZHJvcGRvd24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9kcm9wZG93blwiKSk7XG5cbnZhciBfc2VhcmNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zZWFyY2hcIikpO1xuXG52YXIgX0xpc3RCb2R5ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vTGlzdEJvZHlcIikpO1xuXG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC9yZWFjdE5vZGVcIik7XG5cbnZhciBkZWZhdWx0UmVuZGVyID0gZnVuY3Rpb24gZGVmYXVsdFJlbmRlcigpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc1JlbmRlclJlc3VsdFBsYWluT2JqZWN0KHJlc3VsdCkge1xuICByZXR1cm4gcmVzdWx0ICYmICEoMCwgX3JlYWN0Tm9kZS5pc1ZhbGlkRWxlbWVudCkocmVzdWx0KSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocmVzdWx0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbmZ1bmN0aW9uIGdldEVuYWJsZWRJdGVtS2V5cyhpdGVtcykge1xuICByZXR1cm4gaXRlbXMuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuICFkYXRhLmRpc2FibGVkO1xuICB9KS5tYXAoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5rZXk7XG4gIH0pO1xufVxuXG52YXIgVHJhbnNmZXJMaXN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkUHVyZUNvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKFRyYW5zZmVyTGlzdCwgX1JlYWN0JFB1cmVDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKFRyYW5zZmVyTGlzdCk7XG5cbiAgZnVuY3Rpb24gVHJhbnNmZXJMaXN0KHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBUcmFuc2Zlckxpc3QpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgIF90aGlzLmRlZmF1bHRMaXN0Qm9keVJlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGaWx0ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgX3RoaXMuaGFuZGxlRmlsdGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBoYW5kbGVGaWx0ZXIgPSBfdGhpcy5wcm9wcy5oYW5kbGVGaWx0ZXI7XG4gICAgICB2YXIgZmlsdGVyVmFsdWUgPSBlLnRhcmdldC52YWx1ZTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmaWx0ZXJWYWx1ZTogZmlsdGVyVmFsdWVcbiAgICAgIH0pO1xuXG4gICAgICBoYW5kbGVGaWx0ZXIoZSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGhhbmRsZUNsZWFyID0gX3RoaXMucHJvcHMuaGFuZGxlQ2xlYXI7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZmlsdGVyVmFsdWU6ICcnXG4gICAgICB9KTtcblxuICAgICAgaGFuZGxlQ2xlYXIoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMubWF0Y2hGaWx0ZXIgPSBmdW5jdGlvbiAodGV4dCwgaXRlbSkge1xuICAgICAgdmFyIGZpbHRlclZhbHVlID0gX3RoaXMuc3RhdGUuZmlsdGVyVmFsdWU7XG4gICAgICB2YXIgZmlsdGVyT3B0aW9uID0gX3RoaXMucHJvcHMuZmlsdGVyT3B0aW9uO1xuXG4gICAgICBpZiAoZmlsdGVyT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJPcHRpb24oZmlsdGVyVmFsdWUsIGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGV4dC5pbmRleE9mKGZpbHRlclZhbHVlKSA+PSAwO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRDdXJyZW50UGFnZUl0ZW1zID0gZnVuY3Rpb24gKCkge307IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gICAgX3RoaXMucmVuZGVyTGlzdEJvZHkgPSBmdW5jdGlvbiAocmVuZGVyTGlzdCwgcHJvcHMpIHtcbiAgICAgIHZhciBib2R5Q29udGVudCA9IHJlbmRlckxpc3QgPyByZW5kZXJMaXN0KHByb3BzKSA6IG51bGw7XG4gICAgICB2YXIgY3VzdG9taXplID0gISFib2R5Q29udGVudDtcblxuICAgICAgaWYgKCFjdXN0b21pemUpIHtcbiAgICAgICAgYm9keUNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTGlzdEJvZHlbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgIHJlZjogX3RoaXMuZGVmYXVsdExpc3RCb2R5UmVmXG4gICAgICAgIH0sIHByb3BzKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1c3RvbWl6ZTogY3VzdG9taXplLFxuICAgICAgICBib2R5Q29udGVudDogYm9keUNvbnRlbnRcbiAgICAgIH07XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlckl0ZW0gPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzJHJlbmRlciA9IF90aGlzLnByb3BzLnJlbmRlcixcbiAgICAgICAgICByZW5kZXIgPSBfdGhpcyRwcm9wcyRyZW5kZXIgPT09IHZvaWQgMCA/IGRlZmF1bHRSZW5kZXIgOiBfdGhpcyRwcm9wcyRyZW5kZXI7XG4gICAgICB2YXIgcmVuZGVyUmVzdWx0ID0gcmVuZGVyKGl0ZW0pO1xuICAgICAgdmFyIGlzUmVuZGVyUmVzdWx0UGxhaW4gPSBpc1JlbmRlclJlc3VsdFBsYWluT2JqZWN0KHJlbmRlclJlc3VsdCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZW5kZXJlZFRleHQ6IGlzUmVuZGVyUmVzdWx0UGxhaW4gPyByZW5kZXJSZXN1bHQudmFsdWUgOiByZW5kZXJSZXN1bHQsXG4gICAgICAgIHJlbmRlcmVkRWw6IGlzUmVuZGVyUmVzdWx0UGxhaW4gPyByZW5kZXJSZXN1bHQubGFiZWwgOiByZW5kZXJSZXN1bHQsXG4gICAgICAgIGl0ZW06IGl0ZW1cbiAgICAgIH07XG4gICAgfTtcblxuICAgIF90aGlzLmdldFNlbGVjdEFsbExhYmVsID0gZnVuY3Rpb24gKHNlbGVjdGVkQ291bnQsIHRvdGFsQ291bnQpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGl0ZW1zVW5pdCA9IF90aGlzJHByb3BzLml0ZW1zVW5pdCxcbiAgICAgICAgICBpdGVtVW5pdCA9IF90aGlzJHByb3BzLml0ZW1Vbml0LFxuICAgICAgICAgIHNlbGVjdEFsbExhYmVsID0gX3RoaXMkcHJvcHMuc2VsZWN0QWxsTGFiZWw7XG5cbiAgICAgIGlmIChzZWxlY3RBbGxMYWJlbCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHNlbGVjdEFsbExhYmVsID09PSAnZnVuY3Rpb24nID8gc2VsZWN0QWxsTGFiZWwoe1xuICAgICAgICAgIHNlbGVjdGVkQ291bnQ6IHNlbGVjdGVkQ291bnQsXG4gICAgICAgICAgdG90YWxDb3VudDogdG90YWxDb3VudFxuICAgICAgICB9KSA6IHNlbGVjdEFsbExhYmVsO1xuICAgICAgfVxuXG4gICAgICB2YXIgdW5pdCA9IHRvdGFsQ291bnQgPiAxID8gaXRlbXNVbml0IDogaXRlbVVuaXQ7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIChzZWxlY3RlZENvdW50ID4gMCA/IFwiXCIuY29uY2F0KHNlbGVjdGVkQ291bnQsIFwiL1wiKSA6ICcnKSArIHRvdGFsQ291bnQsIFwiIFwiLCB1bml0KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBmaWx0ZXJWYWx1ZTogJydcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoVHJhbnNmZXJMaXN0LCBbe1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRyaWdnZXJTY3JvbGxUaW1lcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENoZWNrU3RhdHVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENoZWNrU3RhdHVzKGZpbHRlcmVkSXRlbXMpIHtcbiAgICAgIHZhciBjaGVja2VkS2V5cyA9IHRoaXMucHJvcHMuY2hlY2tlZEtleXM7XG5cbiAgICAgIGlmIChjaGVja2VkS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICdub25lJztcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbHRlcmVkSXRlbXMuZXZlcnkoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrZWRLZXlzLmluZGV4T2YoaXRlbS5rZXkpID49IDAgfHwgISFpdGVtLmRpc2FibGVkO1xuICAgICAgfSkpIHtcbiAgICAgICAgcmV0dXJuICdhbGwnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ3BhcnQnO1xuICAgIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RmlsdGVyZWRJdGVtc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGaWx0ZXJlZEl0ZW1zKGRhdGFTb3VyY2UsIGZpbHRlclZhbHVlKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGZpbHRlcmVkSXRlbXMgPSBbXTtcbiAgICAgIHZhciBmaWx0ZXJlZFJlbmRlckl0ZW1zID0gW107XG4gICAgICBkYXRhU291cmNlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIHJlbmRlcmVkSXRlbSA9IF90aGlzMi5yZW5kZXJJdGVtKGl0ZW0pO1xuXG4gICAgICAgIHZhciByZW5kZXJlZFRleHQgPSByZW5kZXJlZEl0ZW0ucmVuZGVyZWRUZXh0OyAvLyBGaWx0ZXIgc2tpcFxuXG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZSAmJiAhX3RoaXMyLm1hdGNoRmlsdGVyKHJlbmRlcmVkVGV4dCwgaXRlbSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbHRlcmVkSXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgZmlsdGVyZWRSZW5kZXJJdGVtcy5wdXNoKHJlbmRlcmVkSXRlbSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbHRlcmVkSXRlbXM6IGZpbHRlcmVkSXRlbXMsXG4gICAgICAgIGZpbHRlcmVkUmVuZGVySXRlbXM6IGZpbHRlcmVkUmVuZGVySXRlbXNcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldExpc3RCb2R5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldExpc3RCb2R5KHByZWZpeENscywgc2VhcmNoUGxhY2Vob2xkZXIsIGZpbHRlclZhbHVlLCBmaWx0ZXJlZEl0ZW1zLCBub3RGb3VuZENvbnRlbnQsIGZpbHRlcmVkUmVuZGVySXRlbXMsIGNoZWNrZWRLZXlzLCByZW5kZXJMaXN0LCBzaG93U2VhcmNoLCBkaXNhYmxlZCkge1xuICAgICAgdmFyIHNlYXJjaCA9IHNob3dTZWFyY2ggPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib2R5LXNlYXJjaC13cmFwcGVyXCIpXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfc2VhcmNoW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VhcmNoXCIpLFxuICAgICAgICBvbkNoYW5nZTogdGhpcy5oYW5kbGVGaWx0ZXIsXG4gICAgICAgIGhhbmRsZUNsZWFyOiB0aGlzLmhhbmRsZUNsZWFyLFxuICAgICAgICBwbGFjZWhvbGRlcjogc2VhcmNoUGxhY2Vob2xkZXIsXG4gICAgICAgIHZhbHVlOiBmaWx0ZXJWYWx1ZSxcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgICB9KSkgOiBudWxsO1xuXG4gICAgICB2YXIgX3RoaXMkcmVuZGVyTGlzdEJvZHkgPSB0aGlzLnJlbmRlckxpc3RCb2R5KHJlbmRlckxpc3QsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sICgwLCBfb21pdFtcImRlZmF1bHRcIl0pKHRoaXMucHJvcHMsIF9MaXN0Qm9keS5PbWl0UHJvcHMpKSwge1xuICAgICAgICBmaWx0ZXJlZEl0ZW1zOiBmaWx0ZXJlZEl0ZW1zLFxuICAgICAgICBmaWx0ZXJlZFJlbmRlckl0ZW1zOiBmaWx0ZXJlZFJlbmRlckl0ZW1zLFxuICAgICAgICBzZWxlY3RlZEtleXM6IGNoZWNrZWRLZXlzXG4gICAgICB9KSksXG4gICAgICAgICAgYm9keUNvbnRlbnQgPSBfdGhpcyRyZW5kZXJMaXN0Qm9keS5ib2R5Q29udGVudCxcbiAgICAgICAgICBjdXN0b21pemUgPSBfdGhpcyRyZW5kZXJMaXN0Qm9keS5jdXN0b21pemU7XG5cbiAgICAgIHZhciBib2R5Tm9kZTsgLy8gV2Ugc2hvdWxkIHdyYXAgY3VzdG9taXplIGxpc3QgYm9keSBpbiBhIGNsYXNzTmFtZWQgZGl2IHRvIHVzZSBmbGV4IGxheW91dC5cblxuICAgICAgaWYgKGN1c3RvbWl6ZSkge1xuICAgICAgICBib2R5Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9keS1jdXN0b21pemUtd3JhcHBlclwiKVxuICAgICAgICB9LCBib2R5Q29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5Tm9kZSA9IGZpbHRlcmVkSXRlbXMubGVuZ3RoID8gYm9keUNvbnRlbnQgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvZHktbm90LWZvdW5kXCIpXG4gICAgICAgIH0sIG5vdEZvdW5kQ29udGVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoc2hvd1NlYXJjaCA/IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9keSBcIikuY29uY2F0KHByZWZpeENscywgXCItYm9keS13aXRoLXNlYXJjaFwiKSA6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9keVwiKSlcbiAgICAgIH0sIHNlYXJjaCwgYm9keU5vZGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDaGVja0JveFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDaGVja0JveChmaWx0ZXJlZEl0ZW1zLCBvbkl0ZW1TZWxlY3RBbGwsIHNob3dTZWxlY3RBbGwsIGRpc2FibGVkKSB7XG4gICAgICB2YXIgY2hlY2tTdGF0dXMgPSB0aGlzLmdldENoZWNrU3RhdHVzKGZpbHRlcmVkSXRlbXMpO1xuICAgICAgdmFyIGNoZWNrZWRBbGwgPSBjaGVja1N0YXR1cyA9PT0gJ2FsbCc7XG4gICAgICB2YXIgY2hlY2tBbGxDaGVja2JveCA9IHNob3dTZWxlY3RBbGwgIT09IGZhbHNlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jaGVja2JveFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICBjaGVja2VkOiBjaGVja2VkQWxsLFxuICAgICAgICBpbmRldGVybWluYXRlOiBjaGVja1N0YXR1cyA9PT0gJ3BhcnQnLFxuICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoKSB7XG4gICAgICAgICAgLy8gT25seSBzZWxlY3QgZW5hYmxlZCBpdGVtc1xuICAgICAgICAgIG9uSXRlbVNlbGVjdEFsbChmaWx0ZXJlZEl0ZW1zLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuICFpdGVtLmRpc2FibGVkO1xuICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5O1xuICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICB9KSwgIWNoZWNrZWRBbGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjaGVja0FsbENoZWNrYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzLFxuICAgICAgICAgIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBmaWx0ZXJWYWx1ZSA9IHRoaXMuc3RhdGUuZmlsdGVyVmFsdWU7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgIGRhdGFTb3VyY2UgPSBfdGhpcyRwcm9wczIuZGF0YVNvdXJjZSxcbiAgICAgICAgICB0aXRsZVRleHQgPSBfdGhpcyRwcm9wczIudGl0bGVUZXh0LFxuICAgICAgICAgIGNoZWNrZWRLZXlzID0gX3RoaXMkcHJvcHMyLmNoZWNrZWRLZXlzLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMyLmRpc2FibGVkLFxuICAgICAgICAgIGZvb3RlciA9IF90aGlzJHByb3BzMi5mb290ZXIsXG4gICAgICAgICAgc2hvd1NlYXJjaCA9IF90aGlzJHByb3BzMi5zaG93U2VhcmNoLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMyLnN0eWxlLFxuICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyID0gX3RoaXMkcHJvcHMyLnNlYXJjaFBsYWNlaG9sZGVyLFxuICAgICAgICAgIG5vdEZvdW5kQ29udGVudCA9IF90aGlzJHByb3BzMi5ub3RGb3VuZENvbnRlbnQsXG4gICAgICAgICAgc2VsZWN0QWxsID0gX3RoaXMkcHJvcHMyLnNlbGVjdEFsbCxcbiAgICAgICAgICBzZWxlY3RDdXJyZW50ID0gX3RoaXMkcHJvcHMyLnNlbGVjdEN1cnJlbnQsXG4gICAgICAgICAgc2VsZWN0SW52ZXJ0ID0gX3RoaXMkcHJvcHMyLnNlbGVjdEludmVydCxcbiAgICAgICAgICByZW1vdmVBbGwgPSBfdGhpcyRwcm9wczIucmVtb3ZlQWxsLFxuICAgICAgICAgIHJlbW92ZUN1cnJlbnQgPSBfdGhpcyRwcm9wczIucmVtb3ZlQ3VycmVudCxcbiAgICAgICAgICByZW5kZXJMaXN0ID0gX3RoaXMkcHJvcHMyLnJlbmRlckxpc3QsXG4gICAgICAgICAgb25JdGVtU2VsZWN0QWxsID0gX3RoaXMkcHJvcHMyLm9uSXRlbVNlbGVjdEFsbCxcbiAgICAgICAgICBvbkl0ZW1SZW1vdmUgPSBfdGhpcyRwcm9wczIub25JdGVtUmVtb3ZlLFxuICAgICAgICAgIHNob3dTZWxlY3RBbGwgPSBfdGhpcyRwcm9wczIuc2hvd1NlbGVjdEFsbCxcbiAgICAgICAgICBzaG93UmVtb3ZlID0gX3RoaXMkcHJvcHMyLnNob3dSZW1vdmUsXG4gICAgICAgICAgcGFnaW5hdGlvbiA9IF90aGlzJHByb3BzMi5wYWdpbmF0aW9uOyAvLyBDdXN0b20gTGF5b3V0XG5cbiAgICAgIHZhciBmb290ZXJEb20gPSBmb290ZXIgJiYgZm9vdGVyKHRoaXMucHJvcHMpO1xuICAgICAgdmFyIGxpc3RDbHMgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdpdGgtcGFnaW5hdGlvblwiKSwgcGFnaW5hdGlvbiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2l0aC1mb290ZXJcIiksIGZvb3RlckRvbSksIF9jbGFzc05hbWVzKSk7IC8vID09PT09PT09PT09PT09PT09PT09PT0gR2V0IGZpbHRlcmVkLCBjaGVja2VkIGl0ZW0gbGlzdCA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIHZhciBfdGhpcyRnZXRGaWx0ZXJlZEl0ZW0gPSB0aGlzLmdldEZpbHRlcmVkSXRlbXMoZGF0YVNvdXJjZSwgZmlsdGVyVmFsdWUpLFxuICAgICAgICAgIGZpbHRlcmVkSXRlbXMgPSBfdGhpcyRnZXRGaWx0ZXJlZEl0ZW0uZmlsdGVyZWRJdGVtcyxcbiAgICAgICAgICBmaWx0ZXJlZFJlbmRlckl0ZW1zID0gX3RoaXMkZ2V0RmlsdGVyZWRJdGVtLmZpbHRlcmVkUmVuZGVySXRlbXM7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBMaXN0IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgICAgdmFyIGxpc3RCb2R5ID0gdGhpcy5nZXRMaXN0Qm9keShwcmVmaXhDbHMsIHNlYXJjaFBsYWNlaG9sZGVyLCBmaWx0ZXJWYWx1ZSwgZmlsdGVyZWRJdGVtcywgbm90Rm91bmRDb250ZW50LCBmaWx0ZXJlZFJlbmRlckl0ZW1zLCBjaGVja2VkS2V5cywgcmVuZGVyTGlzdCwgc2hvd1NlYXJjaCwgZGlzYWJsZWQpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBMaXN0IEZvb3RlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICB2YXIgbGlzdEZvb3RlciA9IGZvb3RlckRvbSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvb3RlclwiKVxuICAgICAgfSwgZm9vdGVyRG9tKSA6IG51bGw7XG4gICAgICB2YXIgY2hlY2tBbGxDaGVja2JveCA9ICFzaG93UmVtb3ZlICYmICFwYWdpbmF0aW9uICYmIHRoaXMuZ2V0Q2hlY2tCb3goZmlsdGVyZWRJdGVtcywgb25JdGVtU2VsZWN0QWxsLCBzaG93U2VsZWN0QWxsLCBkaXNhYmxlZCk7XG4gICAgICB2YXIgbWVudSA9IG51bGw7XG5cbiAgICAgIGlmIChzaG93UmVtb3ZlKSB7XG4gICAgICAgIG1lbnUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfbWVudVtcImRlZmF1bHRcIl0sIG51bGwsIHBhZ2luYXRpb24gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX21lbnVbXCJkZWZhdWx0XCJdLkl0ZW0sIHtcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuXG4gICAgICAgICAgICB2YXIgcGFnZUtleXMgPSBnZXRFbmFibGVkSXRlbUtleXMoKCgoX2EgPSBfdGhpczMuZGVmYXVsdExpc3RCb2R5UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRJdGVtcygpKSB8fCBbXSkubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5pdGVtO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgb25JdGVtUmVtb3ZlID09PSBudWxsIHx8IG9uSXRlbVJlbW92ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25JdGVtUmVtb3ZlKHBhZ2VLZXlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHJlbW92ZUN1cnJlbnQpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfbWVudVtcImRlZmF1bHRcIl0uSXRlbSwge1xuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICBvbkl0ZW1SZW1vdmUgPT09IG51bGwgfHwgb25JdGVtUmVtb3ZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkl0ZW1SZW1vdmUoZ2V0RW5hYmxlZEl0ZW1LZXlzKGZpbHRlcmVkSXRlbXMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHJlbW92ZUFsbCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVudSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9tZW51W1wiZGVmYXVsdFwiXSwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX21lbnVbXCJkZWZhdWx0XCJdLkl0ZW0sIHtcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgdmFyIGtleXMgPSBnZXRFbmFibGVkSXRlbUtleXMoZmlsdGVyZWRJdGVtcyk7XG4gICAgICAgICAgICBvbkl0ZW1TZWxlY3RBbGwoa2V5cywga2V5cy5sZW5ndGggIT09IGNoZWNrZWRLZXlzLmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBzZWxlY3RBbGwpLCBwYWdpbmF0aW9uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9tZW51W1wiZGVmYXVsdFwiXS5JdGVtLCB7XG4gICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICAgIHZhciBfYTtcblxuICAgICAgICAgICAgdmFyIHBhZ2VJdGVtcyA9ICgoX2EgPSBfdGhpczMuZGVmYXVsdExpc3RCb2R5UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRJdGVtcygpKSB8fCBbXTtcbiAgICAgICAgICAgIG9uSXRlbVNlbGVjdEFsbChnZXRFbmFibGVkSXRlbUtleXMocGFnZUl0ZW1zLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbnRpdHkuaXRlbTtcbiAgICAgICAgICAgIH0pKSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBzZWxlY3RDdXJyZW50KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX21lbnVbXCJkZWZhdWx0XCJdLkl0ZW0sIHtcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuXG4gICAgICAgICAgICB2YXIgYXZhaWxhYmxlS2V5cztcblxuICAgICAgICAgICAgaWYgKHBhZ2luYXRpb24pIHtcbiAgICAgICAgICAgICAgYXZhaWxhYmxlS2V5cyA9IGdldEVuYWJsZWRJdGVtS2V5cygoKChfYSA9IF90aGlzMy5kZWZhdWx0TGlzdEJvZHlSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldEl0ZW1zKCkpIHx8IFtdKS5tYXAoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHkuaXRlbTtcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXZhaWxhYmxlS2V5cyA9IGdldEVuYWJsZWRJdGVtS2V5cyhmaWx0ZXJlZEl0ZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNoZWNrZWRLZXlTZXQgPSBuZXcgU2V0KGNoZWNrZWRLZXlzKTtcbiAgICAgICAgICAgIHZhciBuZXdDaGVja2VkS2V5cyA9IFtdO1xuICAgICAgICAgICAgdmFyIG5ld1VuQ2hlY2tlZEtleXMgPSBbXTtcbiAgICAgICAgICAgIGF2YWlsYWJsZUtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgIGlmIChjaGVja2VkS2V5U2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgbmV3VW5DaGVja2VkS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3Q2hlY2tlZEtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uSXRlbVNlbGVjdEFsbChuZXdDaGVja2VkS2V5cywgdHJ1ZSk7XG4gICAgICAgICAgICBvbkl0ZW1TZWxlY3RBbGwobmV3VW5DaGVja2VkS2V5cywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgc2VsZWN0SW52ZXJ0KSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBkcm9wZG93biA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9kcm9wZG93bltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlci1kcm9wZG93blwiKSxcbiAgICAgICAgb3ZlcmxheTogbWVudSxcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRG93bk91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCkpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGxpc3RDbHMsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyXCIpXG4gICAgICB9LCBjaGVja0FsbENoZWNrYm94LCBkcm9wZG93biwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlci1zZWxlY3RlZFwiKVxuICAgICAgfSwgdGhpcy5nZXRTZWxlY3RBbGxMYWJlbChjaGVja2VkS2V5cy5sZW5ndGgsIGZpbHRlcmVkSXRlbXMubGVuZ3RoKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXItdGl0bGVcIilcbiAgICAgIH0sIHRpdGxlVGV4dCkpLCBsaXN0Qm9keSwgbGlzdEZvb3Rlcik7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBUcmFuc2Zlckxpc3Q7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFRyYW5zZmVyTGlzdDtcblRyYW5zZmVyTGlzdC5kZWZhdWx0UHJvcHMgPSB7XG4gIGRhdGFTb3VyY2U6IFtdLFxuICB0aXRsZVRleHQ6ICcnLFxuICBzaG93U2VhcmNoOiBmYWxzZVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9MZWZ0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9MZWZ0T3V0bGluZWRcIikpO1xuXG52YXIgX1JpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9SaWdodE91dGxpbmVkXCIpKTtcblxudmFyIF9idXR0b24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9idXR0b25cIikpO1xuXG52YXIgT3BlcmF0aW9uID0gZnVuY3Rpb24gT3BlcmF0aW9uKF9yZWYpIHtcbiAgdmFyIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICAgIG1vdmVUb0xlZnQgPSBfcmVmLm1vdmVUb0xlZnQsXG4gICAgICBtb3ZlVG9SaWdodCA9IF9yZWYubW92ZVRvUmlnaHQsXG4gICAgICBfcmVmJGxlZnRBcnJvd1RleHQgPSBfcmVmLmxlZnRBcnJvd1RleHQsXG4gICAgICBsZWZ0QXJyb3dUZXh0ID0gX3JlZiRsZWZ0QXJyb3dUZXh0ID09PSB2b2lkIDAgPyAnJyA6IF9yZWYkbGVmdEFycm93VGV4dCxcbiAgICAgIF9yZWYkcmlnaHRBcnJvd1RleHQgPSBfcmVmLnJpZ2h0QXJyb3dUZXh0LFxuICAgICAgcmlnaHRBcnJvd1RleHQgPSBfcmVmJHJpZ2h0QXJyb3dUZXh0ID09PSB2b2lkIDAgPyAnJyA6IF9yZWYkcmlnaHRBcnJvd1RleHQsXG4gICAgICBsZWZ0QWN0aXZlID0gX3JlZi5sZWZ0QWN0aXZlLFxuICAgICAgcmlnaHRBY3RpdmUgPSBfcmVmLnJpZ2h0QWN0aXZlLFxuICAgICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbixcbiAgICAgIG9uZVdheSA9IF9yZWYub25lV2F5O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uW1wiZGVmYXVsdFwiXSwge1xuICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgIHNpemU6IFwic21hbGxcIixcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQgfHwgIXJpZ2h0QWN0aXZlLFxuICAgIG9uQ2xpY2s6IG1vdmVUb1JpZ2h0LFxuICAgIGljb246IGRpcmVjdGlvbiAhPT0gJ3J0bCcgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUmlnaHRPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xlZnRPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpXG4gIH0sIHJpZ2h0QXJyb3dUZXh0KSwgIW9uZVdheSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uW1wiZGVmYXVsdFwiXSwge1xuICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgIHNpemU6IFwic21hbGxcIixcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQgfHwgIWxlZnRBY3RpdmUsXG4gICAgb25DbGljazogbW92ZVRvTGVmdCxcbiAgICBpY29uOiBkaXJlY3Rpb24gIT09ICdydGwnID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xlZnRPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1JpZ2h0T3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKVxuICB9LCBsZWZ0QXJyb3dUZXh0KSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBPcGVyYXRpb247XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0Nsb3NlQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIikpO1xuXG52YXIgX1NlYXJjaE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvU2VhcmNoT3V0bGluZWRcIikpO1xuXG52YXIgX2lucHV0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaW5wdXRcIikpO1xuXG52YXIgU2VhcmNoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoU2VhcmNoLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjJbXCJkZWZhdWx0XCJdKShTZWFyY2gpO1xuXG4gIGZ1bmN0aW9uIFNlYXJjaCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIFNlYXJjaCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIF90aGlzLmhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25DaGFuZ2UgPSBfdGhpcy5wcm9wcy5vbkNoYW5nZTtcblxuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDbGVhciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBoYW5kbGVDbGVhciA9IF90aGlzJHByb3BzLmhhbmRsZUNsZWFyLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMuZGlzYWJsZWQ7XG5cbiAgICAgIGlmICghZGlzYWJsZWQgJiYgaGFuZGxlQ2xlYXIpIHtcbiAgICAgICAgaGFuZGxlQ2xlYXIoZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyW1wiZGVmYXVsdFwiXSkoU2VhcmNoLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcGxhY2Vob2xkZXIgPSBfdGhpcyRwcm9wczIucGxhY2Vob2xkZXIsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wczIudmFsdWUsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMi5kaXNhYmxlZDtcbiAgICAgIHZhciBpY29uID0gdmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3Rpb25cIiksXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xlYXJcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbG9zZUNpcmNsZUZpbGxlZFtcImRlZmF1bHRcIl0sIG51bGwpKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3Rpb25cIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TZWFyY2hPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2lucHV0W1wiZGVmYXVsdFwiXSwge1xuICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXIsXG4gICAgICAgIGNsYXNzTmFtZTogcHJlZml4Q2xzLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgICB9KSwgaWNvbik7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTZWFyY2g7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU2VhcmNoO1xuU2VhcmNoLmRlZmF1bHRQcm9wcyA9IHtcbiAgcGxhY2Vob2xkZXI6ICcnXG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyZWVOb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9yY1RyZWVTZWxlY3QuVHJlZU5vZGU7XG4gIH1cbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjVHJlZVNlbGVjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyYy10cmVlLXNlbGVjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX2ljb25VdGlsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vc2VsZWN0L3V0aWxzL2ljb25VdGlsXCIpKTtcblxudmFyIF9pY29uVXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi90cmVlL3V0aWxzL2ljb25VdGlsXCIpKTtcblxudmFyIF9TaXplQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dFwiKSk7XG5cbnZhciBUcmVlU2VsZWN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoVHJlZVNlbGVjdCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyW1wiZGVmYXVsdFwiXSkoVHJlZVNlbGVjdCk7XG5cbiAgZnVuY3Rpb24gVHJlZVNlbGVjdChwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgVHJlZVNlbGVjdCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgX3RoaXMuc2VsZWN0UmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuXG4gICAgX3RoaXMucmVuZGVyVHJlZVNlbGVjdCA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyID0gX3JlZi5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscyxcbiAgICAgICAgICByZW5kZXJFbXB0eSA9IF9yZWYucmVuZGVyRW1wdHksXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb24sXG4gICAgICAgICAgdmlydHVhbCA9IF9yZWYudmlydHVhbCxcbiAgICAgICAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBfcmVmLmRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IF90aGlzJHByb3BzLnByZWZpeENscyxcbiAgICAgICAgICBjdXN0b21pemVTaXplID0gX3RoaXMkcHJvcHMuc2l6ZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgdHJlZUNoZWNrYWJsZSA9IF90aGlzJHByb3BzLnRyZWVDaGVja2FibGUsXG4gICAgICAgICAgbXVsdGlwbGUgPSBfdGhpcyRwcm9wcy5tdWx0aXBsZSxcbiAgICAgICAgICBfdGhpcyRwcm9wcyRsaXN0SGVpZ2ggPSBfdGhpcyRwcm9wcy5saXN0SGVpZ2h0LFxuICAgICAgICAgIGxpc3RIZWlnaHQgPSBfdGhpcyRwcm9wcyRsaXN0SGVpZ2ggPT09IHZvaWQgMCA/IDI1NiA6IF90aGlzJHByb3BzJGxpc3RIZWlnaCxcbiAgICAgICAgICBfdGhpcyRwcm9wcyRsaXN0SXRlbUggPSBfdGhpcyRwcm9wcy5saXN0SXRlbUhlaWdodCxcbiAgICAgICAgICBsaXN0SXRlbUhlaWdodCA9IF90aGlzJHByb3BzJGxpc3RJdGVtSCA9PT0gdm9pZCAwID8gMjYgOiBfdGhpcyRwcm9wcyRsaXN0SXRlbUgsXG4gICAgICAgICAgbm90Rm91bmRDb250ZW50ID0gX3RoaXMkcHJvcHMubm90Rm91bmRDb250ZW50LFxuICAgICAgICAgIF9zd2l0Y2hlckljb24gPSBfdGhpcyRwcm9wcy5zd2l0Y2hlckljb24sXG4gICAgICAgICAgdHJlZUxpbmUgPSBfdGhpcyRwcm9wcy50cmVlTGluZSxcbiAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lciA9IF90aGlzJHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgICAgIGRyb3Bkb3duQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgICAgICAgYm9yZGVyZWQgPSBfdGhpcyRwcm9wcy5ib3JkZXJlZCxcbiAgICAgICAgICBfdGhpcyRwcm9wcyR0cmVlSWNvbiA9IF90aGlzJHByb3BzLnRyZWVJY29uLFxuICAgICAgICAgIHRyZWVJY29uID0gX3RoaXMkcHJvcHMkdHJlZUljb24gPT09IHZvaWQgMCA/IGZhbHNlIDogX3RoaXMkcHJvcHMkdHJlZUljb247XG4gICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzZWxlY3QnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgdmFyIHRyZWVQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NlbGVjdC10cmVlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICAgIHZhciB0cmVlU2VsZWN0UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd0cmVlLXNlbGVjdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgICB2YXIgbWVyZ2VkRHJvcGRvd25DbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShkcm9wZG93bkNsYXNzTmFtZSwgXCJcIi5jb25jYXQodHJlZVNlbGVjdFByZWZpeENscywgXCItZHJvcGRvd25cIiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHRyZWVTZWxlY3RQcmVmaXhDbHMsIFwiLWRyb3Bkb3duLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJykpO1xuICAgICAgdmFyIGlzTXVsdGlwbGUgPSAhISh0cmVlQ2hlY2thYmxlIHx8IG11bHRpcGxlKTsgLy8gPT09PT09PT09PT09PT09PT09PT09IEljb25zID09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICB2YXIgX2dldEljb25zID0gKDAsIF9pY29uVXRpbFtcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIF90aGlzLnByb3BzKSwge1xuICAgICAgICBtdWx0aXBsZTogaXNNdWx0aXBsZSxcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgICAgIH0pKSxcbiAgICAgICAgICBzdWZmaXhJY29uID0gX2dldEljb25zLnN1ZmZpeEljb24sXG4gICAgICAgICAgaXRlbUljb24gPSBfZ2V0SWNvbnMuaXRlbUljb24sXG4gICAgICAgICAgcmVtb3ZlSWNvbiA9IF9nZXRJY29ucy5yZW1vdmVJY29uLFxuICAgICAgICAgIGNsZWFySWNvbiA9IF9nZXRJY29ucy5jbGVhckljb247IC8vID09PT09PT09PT09PT09PT09PT09PSBFbXB0eSA9PT09PT09PT09PT09PT09PT09PT1cblxuXG4gICAgICB2YXIgbWVyZ2VkTm90Rm91bmQ7XG5cbiAgICAgIGlmIChub3RGb3VuZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXJnZWROb3RGb3VuZCA9IG5vdEZvdW5kQ29udGVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lcmdlZE5vdEZvdW5kID0gcmVuZGVyRW1wdHkoJ1NlbGVjdCcpO1xuICAgICAgfSAvLyA9PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgICAgdmFyIHNlbGVjdFByb3BzID0gKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkoX3RoaXMucHJvcHMsIFsncHJlZml4Q2xzJywgJ3N1ZmZpeEljb24nLCAnaXRlbUljb24nLCAncmVtb3ZlSWNvbicsICdjbGVhckljb24nLCAnc3dpdGNoZXJJY29uJywgJ3NpemUnLCAnYm9yZGVyZWQnXSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NpemVDb250ZXh0W1wiZGVmYXVsdFwiXS5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgICAgdmFyIF9jbGFzc05hbWVzMjtcblxuICAgICAgICB2YXIgbWVyZ2VkU2l6ZSA9IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZTtcbiAgICAgICAgdmFyIG1lcmdlZENsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKCFjdXN0b21pemVQcmVmaXhDbHMgJiYgdHJlZVNlbGVjdFByZWZpeENscywgKF9jbGFzc05hbWVzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sZ1wiKSwgbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtXCIpLCBtZXJnZWRTaXplID09PSAnc21hbGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2NsYXNzTmFtZXMyKSwgY2xhc3NOYW1lKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1RyZWVTZWxlY3RbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICAgIHZpcnR1YWw6IHZpcnR1YWwsXG4gICAgICAgICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcbiAgICAgICAgfSwgc2VsZWN0UHJvcHMsIHtcbiAgICAgICAgICByZWY6IF90aGlzLnNlbGVjdFJlZixcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZSxcbiAgICAgICAgICBsaXN0SGVpZ2h0OiBsaXN0SGVpZ2h0LFxuICAgICAgICAgIGxpc3RJdGVtSGVpZ2h0OiBsaXN0SXRlbUhlaWdodCxcbiAgICAgICAgICB0cmVlQ2hlY2thYmxlOiB0cmVlQ2hlY2thYmxlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlLWNoZWNrYm94LWlubmVyXCIpXG4gICAgICAgICAgfSkgOiB0cmVlQ2hlY2thYmxlLFxuICAgICAgICAgIGlucHV0SWNvbjogc3VmZml4SWNvbixcbiAgICAgICAgICBtZW51SXRlbVNlbGVjdGVkSWNvbjogaXRlbUljb24sXG4gICAgICAgICAgcmVtb3ZlSWNvbjogcmVtb3ZlSWNvbixcbiAgICAgICAgICBjbGVhckljb246IGNsZWFySWNvbixcbiAgICAgICAgICBzd2l0Y2hlckljb246IGZ1bmN0aW9uIHN3aXRjaGVySWNvbihub2RlUHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiAoMCwgX2ljb25VdGlsMltcImRlZmF1bHRcIl0pKHRyZWVQcmVmaXhDbHMsIF9zd2l0Y2hlckljb24sIHRyZWVMaW5lLCBub2RlUHJvcHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2hvd1RyZWVJY29uOiB0cmVlSWNvbixcbiAgICAgICAgICBub3RGb3VuZENvbnRlbnQ6IG1lcmdlZE5vdEZvdW5kLFxuICAgICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgdHJlZU1vdGlvbjogbnVsbCxcbiAgICAgICAgICBkcm9wZG93bkNsYXNzTmFtZTogbWVyZ2VkRHJvcGRvd25DbGFzc05hbWVcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKHByb3BzLm11bHRpcGxlICE9PSBmYWxzZSB8fCAhcHJvcHMudHJlZUNoZWNrYWJsZSwgJ1RyZWVTZWxlY3QnLCAnYG11bHRpcGxlYCB3aWxsIGFsd2F5IGJlIGB0cnVlYCB3aGVuIGB0cmVlQ2hlY2thYmxlYCBpcyB0cnVlJyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShUcmVlU2VsZWN0LCBbe1xuICAgIGtleTogXCJmb2N1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmx1clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RSZWYuY3VycmVudC5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnN1bWVyLCBudWxsLCB0aGlzLnJlbmRlclRyZWVTZWxlY3QpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVHJlZVNlbGVjdDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuVHJlZVNlbGVjdC5UcmVlTm9kZSA9IF9yY1RyZWVTZWxlY3QuVHJlZU5vZGU7XG5UcmVlU2VsZWN0LlNIT1dfQUxMID0gX3JjVHJlZVNlbGVjdC5TSE9XX0FMTDtcblRyZWVTZWxlY3QuU0hPV19QQVJFTlQgPSBfcmNUcmVlU2VsZWN0LlNIT1dfUEFSRU5UO1xuVHJlZVNlbGVjdC5TSE9XX0NISUxEID0gX3JjVHJlZVNlbGVjdC5TSE9XX0NISUxEO1xuVHJlZVNlbGVjdC5kZWZhdWx0UHJvcHMgPSB7XG4gIHRyYW5zaXRpb25OYW1lOiAnc2xpZGUtdXAnLFxuICBjaG9pY2VUcmFuc2l0aW9uTmFtZTogJycsXG4gIGJvcmRlcmVkOiB0cnVlXG59O1xudmFyIF9kZWZhdWx0ID0gVHJlZVNlbGVjdDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfZGVib3VuY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJsb2Rhc2gvZGVib3VuY2VcIikpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwicmMtdHJlZS9saWIvdXRpbFwiKTtcblxudmFyIF90cmVlVXRpbCA9IHJlcXVpcmUoXCJyYy10cmVlL2xpYi91dGlscy90cmVlVXRpbFwiKTtcblxudmFyIF9GaWxlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9GaWxlT3V0bGluZWRcIikpO1xuXG52YXIgX0ZvbGRlck9wZW5PdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0ZvbGRlck9wZW5PdXRsaW5lZFwiKSk7XG5cbnZhciBfRm9sZGVyT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Gb2xkZXJPdXRsaW5lZFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX1RyZWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RyZWVcIikpO1xuXG52YXIgX2RpY3RVdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvZGljdFV0aWxcIik7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG5mdW5jdGlvbiBnZXRJY29uKHByb3BzKSB7XG4gIHZhciBpc0xlYWYgPSBwcm9wcy5pc0xlYWYsXG4gICAgICBleHBhbmRlZCA9IHByb3BzLmV4cGFuZGVkO1xuXG4gIGlmIChpc0xlYWYpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZpbGVPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpO1xuICB9XG5cbiAgcmV0dXJuIGV4cGFuZGVkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZvbGRlck9wZW5PdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZvbGRlck91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyZWVEYXRhKF9yZWYpIHtcbiAgdmFyIHRyZWVEYXRhID0gX3JlZi50cmVlRGF0YSxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgcmV0dXJuIHRyZWVEYXRhIHx8ICgwLCBfdHJlZVV0aWwuY29udmVydFRyZWVUb0RhdGEpKGNoaWxkcmVuKTtcbn1cblxudmFyIERpcmVjdG9yeVRyZWUgPSBmdW5jdGlvbiBEaXJlY3RvcnlUcmVlKF9hLCByZWYpIHtcbiAgdmFyIGRlZmF1bHRFeHBhbmRBbGwgPSBfYS5kZWZhdWx0RXhwYW5kQWxsLFxuICAgICAgZGVmYXVsdEV4cGFuZFBhcmVudCA9IF9hLmRlZmF1bHRFeHBhbmRQYXJlbnQsXG4gICAgICBkZWZhdWx0RXhwYW5kZWRLZXlzID0gX2EuZGVmYXVsdEV4cGFuZGVkS2V5cyxcbiAgICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJkZWZhdWx0RXhwYW5kQWxsXCIsIFwiZGVmYXVsdEV4cGFuZFBhcmVudFwiLCBcImRlZmF1bHRFeHBhbmRlZEtleXNcIl0pOyAvLyBTaGlmdCBjbGljayB1c2FnZVxuXG5cbiAgdmFyIGxhc3RTZWxlY3RlZEtleSA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgY2FjaGVkU2VsZWN0ZWRLZXlzID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciB0cmVlUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0cmVlUmVmLmN1cnJlbnQ7XG4gIH0pO1xuXG4gIHZhciBnZXRJbml0RXhwYW5kZWRLZXlzID0gZnVuY3Rpb24gZ2V0SW5pdEV4cGFuZGVkS2V5cygpIHtcbiAgICB2YXIgX2NvbnZlcnREYXRhVG9FbnRpdGllID0gKDAsIF90cmVlVXRpbC5jb252ZXJ0RGF0YVRvRW50aXRpZXMpKGdldFRyZWVEYXRhKHByb3BzKSksXG4gICAgICAgIGtleUVudGl0aWVzID0gX2NvbnZlcnREYXRhVG9FbnRpdGllLmtleUVudGl0aWVzO1xuXG4gICAgdmFyIGluaXRFeHBhbmRlZEtleXM7IC8vIEV4cGFuZGVkIGtleXNcblxuICAgIGlmIChkZWZhdWx0RXhwYW5kQWxsKSB7XG4gICAgICBpbml0RXhwYW5kZWRLZXlzID0gT2JqZWN0LmtleXMoa2V5RW50aXRpZXMpO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdEV4cGFuZFBhcmVudCkge1xuICAgICAgaW5pdEV4cGFuZGVkS2V5cyA9ICgwLCBfdXRpbC5jb25kdWN0RXhwYW5kUGFyZW50KShwcm9wcy5leHBhbmRlZEtleXMgfHwgZGVmYXVsdEV4cGFuZGVkS2V5cywga2V5RW50aXRpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0RXhwYW5kZWRLZXlzID0gcHJvcHMuZXhwYW5kZWRLZXlzIHx8IGRlZmF1bHRFeHBhbmRlZEtleXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluaXRFeHBhbmRlZEtleXM7XG4gIH07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHByb3BzLnNlbGVjdGVkS2V5cyB8fCBwcm9wcy5kZWZhdWx0U2VsZWN0ZWRLZXlzIHx8IFtdKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHNlbGVjdGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTZWxlY3RlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZ2V0SW5pdEV4cGFuZGVkS2V5cygpKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgICBleHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0RXhwYW5kZWRLZXlzID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnc2VsZWN0ZWRLZXlzJyBpbiBwcm9wcykge1xuICAgICAgc2V0U2VsZWN0ZWRLZXlzKHByb3BzLnNlbGVjdGVkS2V5cyk7XG4gICAgfVxuICB9LCBbcHJvcHMuc2VsZWN0ZWRLZXlzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCdleHBhbmRlZEtleXMnIGluIHByb3BzKSB7XG4gICAgICBzZXRFeHBhbmRlZEtleXMocHJvcHMuZXhwYW5kZWRLZXlzKTtcbiAgICB9XG4gIH0sIFtwcm9wcy5leHBhbmRlZEtleXNdKTtcblxuICB2YXIgZXhwYW5kRm9sZGVyTm9kZSA9IGZ1bmN0aW9uIGV4cGFuZEZvbGRlck5vZGUoZXZlbnQsIG5vZGUpIHtcbiAgICB2YXIgaXNMZWFmID0gbm9kZS5pc0xlYWY7XG5cbiAgICBpZiAoaXNMZWFmIHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gQ2FsbCBpbnRlcm5hbCByYy10cmVlIGV4cGFuZCBmdW5jdGlvblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzEyNTY3XG5cblxuICAgIHRyZWVSZWYuY3VycmVudC5vbk5vZGVFeHBhbmQoZXZlbnQsIG5vZGUpO1xuICB9O1xuXG4gIHZhciBvbkRlYm91bmNlRXhwYW5kID0gKDAsIF9kZWJvdW5jZVtcImRlZmF1bHRcIl0pKGV4cGFuZEZvbGRlck5vZGUsIDIwMCwge1xuICAgIGxlYWRpbmc6IHRydWVcbiAgfSk7XG5cbiAgdmFyIG9uRXhwYW5kID0gZnVuY3Rpb24gb25FeHBhbmQoa2V5cywgaW5mbykge1xuICAgIGlmICghKCdleHBhbmRlZEtleXMnIGluIHByb3BzKSkge1xuICAgICAgc2V0RXhwYW5kZWRLZXlzKGtleXMpO1xuICAgIH0gLy8gQ2FsbCBvcmlnaW4gZnVuY3Rpb25cblxuXG4gICAgaWYgKHByb3BzLm9uRXhwYW5kKSB7XG4gICAgICByZXR1cm4gcHJvcHMub25FeHBhbmQoa2V5cywgaW5mbyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICB2YXIgb25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQsIG5vZGUpIHtcbiAgICB2YXIgZXhwYW5kQWN0aW9uID0gcHJvcHMuZXhwYW5kQWN0aW9uOyAvLyBFeHBhbmQgdGhlIHRyZWVcblxuICAgIGlmIChleHBhbmRBY3Rpb24gPT09ICdjbGljaycpIHtcbiAgICAgIG9uRGVib3VuY2VFeHBhbmQoZXZlbnQsIG5vZGUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5vbkNsaWNrKSB7XG4gICAgICBwcm9wcy5vbkNsaWNrKGV2ZW50LCBub2RlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uRG91YmxlQ2xpY2sgPSBmdW5jdGlvbiBvbkRvdWJsZUNsaWNrKGV2ZW50LCBub2RlKSB7XG4gICAgdmFyIGV4cGFuZEFjdGlvbiA9IHByb3BzLmV4cGFuZEFjdGlvbjsgLy8gRXhwYW5kIHRoZSB0cmVlXG5cbiAgICBpZiAoZXhwYW5kQWN0aW9uID09PSAnZG91YmxlQ2xpY2snKSB7XG4gICAgICBvbkRlYm91bmNlRXhwYW5kKGV2ZW50LCBub2RlKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMub25Eb3VibGVDbGljaykge1xuICAgICAgcHJvcHMub25Eb3VibGVDbGljayhldmVudCwgbm9kZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvblNlbGVjdCA9IGZ1bmN0aW9uIG9uU2VsZWN0KGtleXMsIGV2ZW50KSB7XG4gICAgdmFyIG11bHRpcGxlID0gcHJvcHMubXVsdGlwbGU7XG4gICAgdmFyIG5vZGUgPSBldmVudC5ub2RlLFxuICAgICAgICBuYXRpdmVFdmVudCA9IGV2ZW50Lm5hdGl2ZUV2ZW50O1xuICAgIHZhciBfbm9kZSRrZXkgPSBub2RlLmtleSxcbiAgICAgICAga2V5ID0gX25vZGUka2V5ID09PSB2b2lkIDAgPyAnJyA6IF9ub2RlJGtleTtcbiAgICB2YXIgdHJlZURhdGEgPSBnZXRUcmVlRGF0YShwcm9wcyk7IC8vIGNvbnN0IG5ld1N0YXRlOiBEaXJlY3RvcnlUcmVlU3RhdGUgPSB7fTtcbiAgICAvLyBXZSBuZWVkIHdyYXAgdGhpcyBldmVudCBzaW5jZSBzb21lIHZhbHVlIGlzIG5vdCBzYW1lXG5cbiAgICB2YXIgbmV3RXZlbnQgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBldmVudCksIHtcbiAgICAgIHNlbGVjdGVkOiB0cnVlXG4gICAgfSk7IC8vIFdpbmRvd3MgLyBNYWMgc2luZ2xlIHBpY2tcblxuICAgIHZhciBjdHJsUGljayA9IG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleTtcbiAgICB2YXIgc2hpZnRQaWNrID0gbmF0aXZlRXZlbnQuc2hpZnRLZXk7IC8vIEdlbmVyYXRlIG5ldyBzZWxlY3RlZCBrZXlzXG5cbiAgICB2YXIgbmV3U2VsZWN0ZWRLZXlzO1xuXG4gICAgaWYgKG11bHRpcGxlICYmIGN0cmxQaWNrKSB7XG4gICAgICAvLyBDb250cm9sIGNsaWNrXG4gICAgICBuZXdTZWxlY3RlZEtleXMgPSBrZXlzO1xuICAgICAgbGFzdFNlbGVjdGVkS2V5LmN1cnJlbnQgPSBrZXk7XG4gICAgICBjYWNoZWRTZWxlY3RlZEtleXMuY3VycmVudCA9IG5ld1NlbGVjdGVkS2V5cztcbiAgICAgIG5ld0V2ZW50LnNlbGVjdGVkTm9kZXMgPSAoMCwgX2RpY3RVdGlsLmNvbnZlcnREaXJlY3RvcnlLZXlzVG9Ob2RlcykodHJlZURhdGEsIG5ld1NlbGVjdGVkS2V5cyk7XG4gICAgfSBlbHNlIGlmIChtdWx0aXBsZSAmJiBzaGlmdFBpY2spIHtcbiAgICAgIC8vIFNoaWZ0IGNsaWNrXG4gICAgICBuZXdTZWxlY3RlZEtleXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyW1wiZGVmYXVsdFwiXSkoY2FjaGVkU2VsZWN0ZWRLZXlzLmN1cnJlbnQgfHwgW10pLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKCgwLCBfZGljdFV0aWwuY2FsY1JhbmdlS2V5cykoe1xuICAgICAgICB0cmVlRGF0YTogdHJlZURhdGEsXG4gICAgICAgIGV4cGFuZGVkS2V5czogZXhwYW5kZWRLZXlzLFxuICAgICAgICBzdGFydEtleToga2V5LFxuICAgICAgICBlbmRLZXk6IGxhc3RTZWxlY3RlZEtleS5jdXJyZW50XG4gICAgICB9KSkpKSk7XG4gICAgICBuZXdFdmVudC5zZWxlY3RlZE5vZGVzID0gKDAsIF9kaWN0VXRpbC5jb252ZXJ0RGlyZWN0b3J5S2V5c1RvTm9kZXMpKHRyZWVEYXRhLCBuZXdTZWxlY3RlZEtleXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTaW5nbGUgY2xpY2tcbiAgICAgIG5ld1NlbGVjdGVkS2V5cyA9IFtrZXldO1xuICAgICAgbGFzdFNlbGVjdGVkS2V5LmN1cnJlbnQgPSBrZXk7XG4gICAgICBjYWNoZWRTZWxlY3RlZEtleXMuY3VycmVudCA9IG5ld1NlbGVjdGVkS2V5cztcbiAgICAgIG5ld0V2ZW50LnNlbGVjdGVkTm9kZXMgPSAoMCwgX2RpY3RVdGlsLmNvbnZlcnREaXJlY3RvcnlLZXlzVG9Ob2RlcykodHJlZURhdGEsIG5ld1NlbGVjdGVkS2V5cyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm9uU2VsZWN0KSB7XG4gICAgICBwcm9wcy5vblNlbGVjdChuZXdTZWxlY3RlZEtleXMsIG5ld0V2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoISgnc2VsZWN0ZWRLZXlzJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldFNlbGVjdGVkS2V5cyhuZXdTZWxlY3RlZEtleXMpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgb3RoZXJQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCJdKTtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd0cmVlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGNvbm5lY3RDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpcmVjdG9yeVwiKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXJlY3RvcnktcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9UcmVlW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICBpY29uOiBnZXRJY29uLFxuICAgIHJlZjogdHJlZVJlZixcbiAgICBibG9ja05vZGU6IHRydWVcbiAgfSwgb3RoZXJQcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogY29ubmVjdENsYXNzTmFtZSxcbiAgICBleHBhbmRlZEtleXM6IGV4cGFuZGVkS2V5cyxcbiAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5cyxcbiAgICBvblNlbGVjdDogb25TZWxlY3QsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBvbkRvdWJsZUNsaWNrOiBvbkRvdWJsZUNsaWNrLFxuICAgIG9uRXhwYW5kOiBvbkV4cGFuZFxuICB9KSk7XG59O1xuXG52YXIgRm9yd2FyZERpcmVjdG9yeVRyZWUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihEaXJlY3RvcnlUcmVlKTtcbkZvcndhcmREaXJlY3RvcnlUcmVlLmRpc3BsYXlOYW1lID0gJ0RpcmVjdG9yeVRyZWUnO1xuRm9yd2FyZERpcmVjdG9yeVRyZWUuZGVmYXVsdFByb3BzID0ge1xuICBzaG93SWNvbjogdHJ1ZSxcbiAgZXhwYW5kQWN0aW9uOiAnY2xpY2snXG59O1xudmFyIF9kZWZhdWx0ID0gRm9yd2FyZERpcmVjdG9yeVRyZWU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY1RyZWUgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmMtdHJlZVwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX0RpcmVjdG9yeVRyZWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0RpcmVjdG9yeVRyZWVcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9tb3Rpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC9tb3Rpb25cIikpO1xuXG52YXIgX2ljb25VdGlsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dGlscy9pY29uVXRpbFwiKSk7XG5cbnZhciBUcmVlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgICAgdmlydHVhbCA9IF9SZWFjdCR1c2VDb250ZXh0LnZpcnR1YWw7XG5cbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHNob3dJY29uID0gcHJvcHMuc2hvd0ljb24sXG4gICAgICBzaG93TGluZSA9IHByb3BzLnNob3dMaW5lLFxuICAgICAgX3N3aXRjaGVySWNvbiA9IHByb3BzLnN3aXRjaGVySWNvbixcbiAgICAgIGJsb2NrTm9kZSA9IHByb3BzLmJsb2NrTm9kZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjaGVja2FibGUgPSBwcm9wcy5jaGVja2FibGU7XG4gIHZhciBuZXdQcm9wcyA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHByb3BzKSwge1xuICAgIHNob3dMaW5lOiBCb29sZWFuKHNob3dMaW5lKVxuICB9KTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndHJlZScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNUcmVlW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICBpdGVtSGVpZ2h0OiAyMCxcbiAgICByZWY6IHJlZixcbiAgICB2aXJ0dWFsOiB2aXJ0dWFsXG4gIH0sIG5ld1Byb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uLWhpZGVcIiksICFzaG93SWNvbiksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmxvY2stbm9kZVwiKSwgYmxvY2tOb2RlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSksXG4gICAgY2hlY2thYmxlOiBjaGVja2FibGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrYm94LWlubmVyXCIpXG4gICAgfSkgOiBjaGVja2FibGUsXG4gICAgc3dpdGNoZXJJY29uOiBmdW5jdGlvbiBzd2l0Y2hlckljb24obm9kZVByb3BzKSB7XG4gICAgICByZXR1cm4gKDAsIF9pY29uVXRpbFtcImRlZmF1bHRcIl0pKHByZWZpeENscywgX3N3aXRjaGVySWNvbiwgc2hvd0xpbmUsIG5vZGVQcm9wcyk7XG4gICAgfVxuICB9KSwgY2hpbGRyZW4pO1xufSk7XG5UcmVlLlRyZWVOb2RlID0gX3JjVHJlZS5UcmVlTm9kZTtcblRyZWUuRGlyZWN0b3J5VHJlZSA9IF9EaXJlY3RvcnlUcmVlW1wiZGVmYXVsdFwiXTtcblRyZWUuZGVmYXVsdFByb3BzID0ge1xuICBjaGVja2FibGU6IGZhbHNlLFxuICBzaG93SWNvbjogZmFsc2UsXG4gIG1vdGlvbjogKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgX21vdGlvbltcImRlZmF1bHRcIl0pLCB7XG4gICAgbW90aW9uQXBwZWFyOiBmYWxzZVxuICB9KSxcbiAgYmxvY2tOb2RlOiBmYWxzZVxufTtcbnZhciBfZGVmYXVsdCA9IFRyZWU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX1RyZWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RyZWVcIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfVHJlZVtcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FsY1JhbmdlS2V5cyA9IGNhbGNSYW5nZUtleXM7XG5leHBvcnRzLmNvbnZlcnREaXJlY3RvcnlLZXlzVG9Ob2RlcyA9IGNvbnZlcnREaXJlY3RvcnlLZXlzVG9Ob2RlcztcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIFJlY29yZDtcblxuKGZ1bmN0aW9uIChSZWNvcmQpIHtcbiAgUmVjb3JkW1JlY29yZFtcIk5vbmVcIl0gPSAwXSA9IFwiTm9uZVwiO1xuICBSZWNvcmRbUmVjb3JkW1wiU3RhcnRcIl0gPSAxXSA9IFwiU3RhcnRcIjtcbiAgUmVjb3JkW1JlY29yZFtcIkVuZFwiXSA9IDJdID0gXCJFbmRcIjtcbn0pKFJlY29yZCB8fCAoUmVjb3JkID0ge30pKTtcblxuZnVuY3Rpb24gdHJhdmVyc2VOb2Rlc0tleSh0cmVlRGF0YSwgY2FsbGJhY2spIHtcbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZGF0YU5vZGUpIHtcbiAgICB2YXIga2V5ID0gZGF0YU5vZGUua2V5LFxuICAgICAgICBjaGlsZHJlbiA9IGRhdGFOb2RlLmNoaWxkcmVuO1xuXG4gICAgaWYgKGNhbGxiYWNrKGtleSwgZGF0YU5vZGUpICE9PSBmYWxzZSkge1xuICAgICAgdHJhdmVyc2VOb2Rlc0tleShjaGlsZHJlbiB8fCBbXSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIHRyZWVEYXRhLmZvckVhY2gocHJvY2Vzc05vZGUpO1xufVxuLyoqIOiuoeeul+mAieS4reiMg+WbtO+8jOWPquiAg+iZkWV4cGFuZGVk5oOF5Ya15Lul5LyY5YyW5oCn6IO9ICovXG5cblxuZnVuY3Rpb24gY2FsY1JhbmdlS2V5cyhfcmVmKSB7XG4gIHZhciB0cmVlRGF0YSA9IF9yZWYudHJlZURhdGEsXG4gICAgICBleHBhbmRlZEtleXMgPSBfcmVmLmV4cGFuZGVkS2V5cyxcbiAgICAgIHN0YXJ0S2V5ID0gX3JlZi5zdGFydEtleSxcbiAgICAgIGVuZEtleSA9IF9yZWYuZW5kS2V5O1xuICB2YXIga2V5cyA9IFtdO1xuICB2YXIgcmVjb3JkID0gUmVjb3JkLk5vbmU7XG5cbiAgaWYgKHN0YXJ0S2V5ICYmIHN0YXJ0S2V5ID09PSBlbmRLZXkpIHtcbiAgICByZXR1cm4gW3N0YXJ0S2V5XTtcbiAgfVxuXG4gIGlmICghc3RhcnRLZXkgfHwgIWVuZEtleSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hdGNoS2V5KGtleSkge1xuICAgIHJldHVybiBrZXkgPT09IHN0YXJ0S2V5IHx8IGtleSA9PT0gZW5kS2V5O1xuICB9XG5cbiAgdHJhdmVyc2VOb2Rlc0tleSh0cmVlRGF0YSwgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChyZWNvcmQgPT09IFJlY29yZC5FbmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hLZXkoa2V5KSkge1xuICAgICAgLy8gTWF0Y2ggdGVzdFxuICAgICAga2V5cy5wdXNoKGtleSk7XG5cbiAgICAgIGlmIChyZWNvcmQgPT09IFJlY29yZC5Ob25lKSB7XG4gICAgICAgIHJlY29yZCA9IFJlY29yZC5TdGFydDtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkID09PSBSZWNvcmQuU3RhcnQpIHtcbiAgICAgICAgcmVjb3JkID0gUmVjb3JkLkVuZDtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVjb3JkID09PSBSZWNvcmQuU3RhcnQpIHtcbiAgICAgIC8vIEFwcGVuZCBzZWxlY3Rpb25cbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cblxuICAgIGlmIChleHBhbmRlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREaXJlY3RvcnlLZXlzVG9Ob2Rlcyh0cmVlRGF0YSwga2V5cykge1xuICB2YXIgcmVzdEtleXMgPSAoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKGtleXMpO1xuICB2YXIgbm9kZXMgPSBbXTtcbiAgdHJhdmVyc2VOb2Rlc0tleSh0cmVlRGF0YSwgZnVuY3Rpb24gKGtleSwgbm9kZSkge1xuICAgIHZhciBpbmRleCA9IHJlc3RLZXlzLmluZGV4T2Yoa2V5KTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICByZXN0S2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiAhIXJlc3RLZXlzLmxlbmd0aDtcbiAgfSk7XG4gIHJldHVybiBub2Rlcztcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHJlbmRlclN3aXRjaGVySWNvbjtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9Mb2FkaW5nT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Mb2FkaW5nT3V0bGluZWRcIikpO1xuXG52YXIgX0ZpbGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0ZpbGVPdXRsaW5lZFwiKSk7XG5cbnZhciBfTWludXNTcXVhcmVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL01pbnVzU3F1YXJlT3V0bGluZWRcIikpO1xuXG52YXIgX1BsdXNTcXVhcmVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1BsdXNTcXVhcmVPdXRsaW5lZFwiKSk7XG5cbnZhciBfQ2FyZXREb3duRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2FyZXREb3duRmlsbGVkXCIpKTtcblxudmFyIF9yZWFjdE5vZGUgPSByZXF1aXJlKFwiLi4vLi4vX3V0aWwvcmVhY3ROb2RlXCIpO1xuXG5mdW5jdGlvbiByZW5kZXJTd2l0Y2hlckljb24ocHJlZml4Q2xzLCBzd2l0Y2hlckljb24sIHNob3dMaW5lLCBfcmVmKSB7XG4gIHZhciBpc0xlYWYgPSBfcmVmLmlzTGVhZixcbiAgICAgIGV4cGFuZGVkID0gX3JlZi5leHBhbmRlZCxcbiAgICAgIGxvYWRpbmcgPSBfcmVmLmxvYWRpbmc7XG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvYWRpbmdPdXRsaW5lZFtcImRlZmF1bHRcIl0sIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1sb2FkaW5nLWljb25cIilcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBzaG93TGVhZkljb247XG5cbiAgaWYgKHNob3dMaW5lICYmICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKHNob3dMaW5lKSA9PT0gJ29iamVjdCcpIHtcbiAgICBzaG93TGVhZkljb24gPSBzaG93TGluZS5zaG93TGVhZkljb247XG4gIH1cblxuICBpZiAoaXNMZWFmKSB7XG4gICAgaWYgKHNob3dMaW5lKSB7XG4gICAgICBpZiAoKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoc2hvd0xpbmUpID09PSAnb2JqZWN0JyAmJiAhc2hvd0xlYWZJY29uKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1sZWFmLWxpbmVcIilcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRmlsZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoZXItbGluZS1pY29uXCIpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBzd2l0Y2hlckNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoZXItaWNvblwiKTtcblxuICBpZiAoKDAsIF9yZWFjdE5vZGUuaXNWYWxpZEVsZW1lbnQpKHN3aXRjaGVySWNvbikpIHtcbiAgICByZXR1cm4gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShzd2l0Y2hlckljb24sIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoc3dpdGNoZXJJY29uLnByb3BzLmNsYXNzTmFtZSB8fCAnJywgc3dpdGNoZXJDbHMpXG4gICAgfSk7XG4gIH1cblxuICBpZiAoc3dpdGNoZXJJY29uKSB7XG4gICAgcmV0dXJuIHN3aXRjaGVySWNvbjtcbiAgfVxuXG4gIGlmIChzaG93TGluZSkge1xuICAgIHJldHVybiBleHBhbmRlZCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9NaW51c1NxdWFyZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN3aXRjaGVyLWxpbmUtaWNvblwiKVxuICAgIH0pIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1BsdXNTcXVhcmVPdXRsaW5lZFtcImRlZmF1bHRcIl0sIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1saW5lLWljb25cIilcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2FyZXREb3duRmlsbGVkW1wiZGVmYXVsdFwiXSwge1xuICAgIGNsYXNzTmFtZTogc3dpdGNoZXJDbHNcbiAgfSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxudmFyIF9maW5kRE9NTm9kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9maW5kRE9NTm9kZVwiKSk7XG5cbnZhciBfY29weVRvQ2xpcGJvYXJkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY29weS10by1jbGlwYm9hcmRcIikpO1xuXG52YXIgX29taXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJvbWl0LmpzXCIpKTtcblxudmFyIF9FZGl0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9FZGl0T3V0bGluZWRcIikpO1xuXG52YXIgX0NoZWNrT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DaGVja091dGxpbmVkXCIpKTtcblxudmFyIF9Db3B5T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Db3B5T3V0bGluZWRcIikpO1xuXG52YXIgX3JjUmVzaXplT2JzZXJ2ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1yZXNpemUtb2JzZXJ2ZXJcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcblxudmFyIF9Mb2NhbGVSZWNlaXZlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS1wcm92aWRlci9Mb2NhbGVSZWNlaXZlclwiKSk7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX3RyYW5zQnV0dG9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvdHJhbnNCdXR0b25cIikpO1xuXG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL3JhZlwiKSk7XG5cbnZhciBfc3R5bGVDaGVja2VyID0gcmVxdWlyZShcIi4uL191dGlsL3N0eWxlQ2hlY2tlclwiKTtcblxudmFyIF90b29sdGlwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vdG9vbHRpcFwiKSk7XG5cbnZhciBfVHlwb2dyYXBoeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVHlwb2dyYXBoeVwiKSk7XG5cbnZhciBfRWRpdGFibGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0VkaXRhYmxlXCIpKTtcblxudmFyIF91dGlsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dGlsXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBpc0xpbmVDbGFtcFN1cHBvcnQgPSAoMCwgX3N0eWxlQ2hlY2tlci5pc1N0eWxlU3VwcG9ydCkoJ3dlYmtpdExpbmVDbGFtcCcpO1xudmFyIGlzVGV4dE92ZXJmbG93U3VwcG9ydCA9ICgwLCBfc3R5bGVDaGVja2VyLmlzU3R5bGVTdXBwb3J0KSgndGV4dE92ZXJmbG93Jyk7XG5cbmZ1bmN0aW9uIHdyYXBwZXJEZWNvcmF0aW9ucyhfcmVmLCBjb250ZW50KSB7XG4gIHZhciBtYXJrID0gX3JlZi5tYXJrLFxuICAgICAgY29kZSA9IF9yZWYuY29kZSxcbiAgICAgIHVuZGVybGluZSA9IF9yZWYudW5kZXJsaW5lLFxuICAgICAgZGVsID0gX3JlZltcImRlbGV0ZVwiXSxcbiAgICAgIHN0cm9uZyA9IF9yZWYuc3Ryb25nLFxuICAgICAga2V5Ym9hcmQgPSBfcmVmLmtleWJvYXJkO1xuICB2YXIgY3VycmVudENvbnRlbnQgPSBjb250ZW50O1xuXG4gIGZ1bmN0aW9uIHdyYXAobmVlZGVkLCB0YWcpIHtcbiAgICBpZiAoIW5lZWRlZCkgcmV0dXJuO1xuICAgIGN1cnJlbnRDb250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQodGFnLCB7fSwgY3VycmVudENvbnRlbnQpO1xuICB9XG5cbiAgd3JhcChzdHJvbmcsICdzdHJvbmcnKTtcbiAgd3JhcCh1bmRlcmxpbmUsICd1Jyk7XG4gIHdyYXAoZGVsLCAnZGVsJyk7XG4gIHdyYXAoY29kZSwgJ2NvZGUnKTtcbiAgd3JhcChtYXJrLCAnbWFyaycpO1xuICB3cmFwKGtleWJvYXJkLCAna2JkJyk7XG4gIHJldHVybiBjdXJyZW50Q29udGVudDtcbn1cblxudmFyIEVMTElQU0lTX1NUUiA9ICcuLi4nO1xuXG52YXIgQmFzZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMltcImRlZmF1bHRcIl0pKEJhc2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKEJhc2UpO1xuXG4gIGZ1bmN0aW9uIEJhc2UoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazJbXCJkZWZhdWx0XCJdKSh0aGlzLCBCYXNlKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLmNvbnRlbnRSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBlZGl0OiBmYWxzZSxcbiAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICBlbGxpcHNpc1RleHQ6ICcnLFxuICAgICAgZWxsaXBzaXNDb250ZW50OiBudWxsLFxuICAgICAgaXNFbGxpcHNpczogZmFsc2UsXG4gICAgICBleHBhbmRlZDogZmFsc2UsXG4gICAgICBjbGllbnRSZW5kZXJlZDogZmFsc2VcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0UHJlZml4Q2xzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF90aGlzLnByb3BzLnByZWZpeENscztcbiAgICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfdGhpcy5jb250ZXh0LmdldFByZWZpeENscztcbiAgICAgIHJldHVybiBnZXRQcmVmaXhDbHMoJ3R5cG9ncmFwaHknLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIH07IC8vID09PT09PT09PT09PT09PSBFeHBhbmQgPT09PT09PT09PT09PT09XG5cblxuICAgIF90aGlzLm9uRXhwYW5kQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJGdldEVsbGlwc2lzID0gX3RoaXMuZ2V0RWxsaXBzaXMoKSxcbiAgICAgICAgICBvbkV4cGFuZCA9IF90aGlzJGdldEVsbGlwc2lzLm9uRXhwYW5kO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGV4cGFuZGVkOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9uRXhwYW5kKSB7XG4gICAgICAgIG9uRXhwYW5kKGUpO1xuICAgICAgfVxuICAgIH07IC8vID09PT09PT09PT09PT09PT0gRWRpdCA9PT09PT09PT09PT09PT09XG5cblxuICAgIF90aGlzLm9uRWRpdENsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMudHJpZ2dlckVkaXQodHJ1ZSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uRWRpdENoYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIF90aGlzJGdldEVkaXRhYmxlID0gX3RoaXMuZ2V0RWRpdGFibGUoKSxcbiAgICAgICAgICBvbkNoYW5nZSA9IF90aGlzJGdldEVkaXRhYmxlLm9uQ2hhbmdlO1xuXG4gICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgb25DaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy50cmlnZ2VyRWRpdChmYWxzZSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uRWRpdENhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnRyaWdnZXJFZGl0KGZhbHNlKTtcbiAgICB9OyAvLyA9PT09PT09PT09PT09PT09IENvcHkgPT09PT09PT09PT09PT09PVxuXG5cbiAgICBfdGhpcy5vbkNvcHlDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgY29weWFibGUgPSBfdGhpcyRwcm9wcy5jb3B5YWJsZTtcbiAgICAgIHZhciBjb3B5Q29uZmlnID0gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCAoMCwgX3R5cGVvZjJbXCJkZWZhdWx0XCJdKShjb3B5YWJsZSkgPT09ICdvYmplY3QnID8gY29weWFibGUgOiBudWxsKTtcblxuICAgICAgaWYgKGNvcHlDb25maWcudGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvcHlDb25maWcudGV4dCA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgICgwLCBfY29weVRvQ2xpcGJvYXJkW1wiZGVmYXVsdFwiXSkoY29weUNvbmZpZy50ZXh0IHx8ICcnKTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjb3BpZWQ6IHRydWVcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNvcHlDb25maWcub25Db3B5KSB7XG4gICAgICAgICAgY29weUNvbmZpZy5vbkNvcHkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNvcHlJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBjb3BpZWQ6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDMwMDApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLnNldEVkaXRSZWYgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMuZWRpdEljb24gPSBub2RlO1xuICAgIH07XG5cbiAgICBfdGhpcy50cmlnZ2VyRWRpdCA9IGZ1bmN0aW9uIChlZGl0KSB7XG4gICAgICB2YXIgX3RoaXMkZ2V0RWRpdGFibGUyID0gX3RoaXMuZ2V0RWRpdGFibGUoKSxcbiAgICAgICAgICBvblN0YXJ0ID0gX3RoaXMkZ2V0RWRpdGFibGUyLm9uU3RhcnQ7XG5cbiAgICAgIGlmIChlZGl0ICYmIG9uU3RhcnQpIHtcbiAgICAgICAgb25TdGFydCgpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVkaXQ6IGVkaXRcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFlZGl0ICYmIF90aGlzLmVkaXRJY29uKSB7XG4gICAgICAgICAgX3RoaXMuZWRpdEljb24uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTsgLy8gPT09PT09PT09PT09PT0gRWxsaXBzaXMgPT09PT09PT09PT09PT1cblxuXG4gICAgX3RoaXMucmVzaXplT25OZXh0RnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfcmFmW1wiZGVmYXVsdFwiXS5jYW5jZWwoX3RoaXMucmFmSWQpO1xuXG4gICAgICBfdGhpcy5yYWZJZCA9ICgwLCBfcmFmW1wiZGVmYXVsdFwiXSkoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBEbyBub3QgYmluZCBgc3luY0VsbGlwc2lzYC4gSXQgbmVlZCBmb3IgdGVzdCB1c2FnZSBvbiBwcm90b3R5cGVcbiAgICAgICAgX3RoaXMuc3luY0VsbGlwc2lzKCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShCYXNlLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjbGllbnRSZW5kZXJlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc2l6ZU9uTmV4dEZyYW1lKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIGVsbGlwc2lzID0gdGhpcy5nZXRFbGxpcHNpcygpO1xuICAgICAgdmFyIHByZXZFbGxpcHNpcyA9IHRoaXMuZ2V0RWxsaXBzaXMocHJldlByb3BzKTtcblxuICAgICAgaWYgKGNoaWxkcmVuICE9PSBwcmV2UHJvcHMuY2hpbGRyZW4gfHwgZWxsaXBzaXMucm93cyAhPT0gcHJldkVsbGlwc2lzLnJvd3MpIHtcbiAgICAgICAgdGhpcy5yZXNpemVPbk5leHRGcmFtZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5jb3B5SWQpO1xuXG4gICAgICBfcmFmW1wiZGVmYXVsdFwiXS5jYW5jZWwodGhpcy5yYWZJZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEVkaXRhYmxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVkaXRhYmxlKHByb3BzKSB7XG4gICAgICB2YXIgZWRpdCA9IHRoaXMuc3RhdGUuZWRpdDtcblxuICAgICAgdmFyIF9yZWYyID0gcHJvcHMgfHwgdGhpcy5wcm9wcyxcbiAgICAgICAgICBlZGl0YWJsZSA9IF9yZWYyLmVkaXRhYmxlO1xuXG4gICAgICBpZiAoIWVkaXRhYmxlKSByZXR1cm4ge1xuICAgICAgICBlZGl0aW5nOiBlZGl0XG4gICAgICB9O1xuICAgICAgcmV0dXJuICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgIGVkaXRpbmc6IGVkaXRcbiAgICAgIH0sICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKGVkaXRhYmxlKSA9PT0gJ29iamVjdCcgPyBlZGl0YWJsZSA6IG51bGwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRFbGxpcHNpc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFbGxpcHNpcyhwcm9wcykge1xuICAgICAgdmFyIF9yZWYzID0gcHJvcHMgfHwgdGhpcy5wcm9wcyxcbiAgICAgICAgICBlbGxpcHNpcyA9IF9yZWYzLmVsbGlwc2lzO1xuXG4gICAgICBpZiAoIWVsbGlwc2lzKSByZXR1cm4ge307XG4gICAgICByZXR1cm4gKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgcm93czogMSxcbiAgICAgICAgZXhwYW5kYWJsZTogZmFsc2VcbiAgICAgIH0sICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKGVsbGlwc2lzKSA9PT0gJ29iamVjdCcgPyBlbGxpcHNpcyA6IG51bGwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjYW5Vc2VDU1NFbGxpcHNpc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5Vc2VDU1NFbGxpcHNpcygpIHtcbiAgICAgIHZhciBjbGllbnRSZW5kZXJlZCA9IHRoaXMuc3RhdGUuY2xpZW50UmVuZGVyZWQ7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBlZGl0YWJsZSA9IF90aGlzJHByb3BzMi5lZGl0YWJsZSxcbiAgICAgICAgICBjb3B5YWJsZSA9IF90aGlzJHByb3BzMi5jb3B5YWJsZTtcblxuICAgICAgdmFyIF90aGlzJGdldEVsbGlwc2lzMiA9IHRoaXMuZ2V0RWxsaXBzaXMoKSxcbiAgICAgICAgICByb3dzID0gX3RoaXMkZ2V0RWxsaXBzaXMyLnJvd3MsXG4gICAgICAgICAgZXhwYW5kYWJsZSA9IF90aGlzJGdldEVsbGlwc2lzMi5leHBhbmRhYmxlLFxuICAgICAgICAgIHN1ZmZpeCA9IF90aGlzJGdldEVsbGlwc2lzMi5zdWZmaXgsXG4gICAgICAgICAgb25FbGxpcHNpcyA9IF90aGlzJGdldEVsbGlwc2lzMi5vbkVsbGlwc2lzO1xuXG4gICAgICBpZiAoc3VmZml4KSByZXR1cm4gZmFsc2U7IC8vIENhbid0IHVzZSBjc3MgZWxsaXBzaXMgc2luY2Ugd2UgbmVlZCB0byBwcm92aWRlIHRoZSBwbGFjZSBmb3IgYnV0dG9uXG5cbiAgICAgIGlmIChlZGl0YWJsZSB8fCBjb3B5YWJsZSB8fCBleHBhbmRhYmxlIHx8ICFjbGllbnRSZW5kZXJlZCB8fCBvbkVsbGlwc2lzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJvd3MgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGlzVGV4dE92ZXJmbG93U3VwcG9ydDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzTGluZUNsYW1wU3VwcG9ydDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3luY0VsbGlwc2lzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN5bmNFbGxpcHNpcygpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgZWxsaXBzaXNUZXh0ID0gX3RoaXMkc3RhdGUuZWxsaXBzaXNUZXh0LFxuICAgICAgICAgIGlzRWxsaXBzaXMgPSBfdGhpcyRzdGF0ZS5pc0VsbGlwc2lzLFxuICAgICAgICAgIGV4cGFuZGVkID0gX3RoaXMkc3RhdGUuZXhwYW5kZWQ7XG5cbiAgICAgIHZhciBfdGhpcyRnZXRFbGxpcHNpczMgPSB0aGlzLmdldEVsbGlwc2lzKCksXG4gICAgICAgICAgcm93cyA9IF90aGlzJGdldEVsbGlwc2lzMy5yb3dzLFxuICAgICAgICAgIHN1ZmZpeCA9IF90aGlzJGdldEVsbGlwc2lzMy5zdWZmaXgsXG4gICAgICAgICAgb25FbGxpcHNpcyA9IF90aGlzJGdldEVsbGlwc2lzMy5vbkVsbGlwc2lzO1xuXG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKCFyb3dzIHx8IHJvd3MgPCAwIHx8ICF0aGlzLmNvbnRlbnRSZWYuY3VycmVudCB8fCBleHBhbmRlZCkgcmV0dXJuOyAvLyBEbyBub3QgbWVhc3VyZSBpZiBjc3MgYWxyZWFkeSBzdXBwb3J0IGVsbGlwc2lzXG5cbiAgICAgIGlmICh0aGlzLmNhblVzZUNTU0VsbGlwc2lzKCkpIHJldHVybjtcbiAgICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKCgwLCBfdG9BcnJheVtcImRlZmF1bHRcIl0pKGNoaWxkcmVuKS5ldmVyeShmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZyc7XG4gICAgICB9KSwgJ1R5cG9ncmFwaHknLCAnYGVsbGlwc2lzYCBzaG91bGQgdXNlIHN0cmluZyBhcyBjaGlsZHJlbiBvbmx5LicpO1xuXG4gICAgICB2YXIgX21lYXN1cmUgPSAoMCwgX3V0aWxbXCJkZWZhdWx0XCJdKSgoMCwgX2ZpbmRET01Ob2RlW1wiZGVmYXVsdFwiXSkodGhpcy5jb250ZW50UmVmLmN1cnJlbnQpLCB7XG4gICAgICAgIHJvd3M6IHJvd3MsXG4gICAgICAgIHN1ZmZpeDogc3VmZml4XG4gICAgICB9LCBjaGlsZHJlbiwgdGhpcy5yZW5kZXJPcGVyYXRpb25zKHRydWUpLCBFTExJUFNJU19TVFIpLFxuICAgICAgICAgIGNvbnRlbnQgPSBfbWVhc3VyZS5jb250ZW50LFxuICAgICAgICAgIHRleHQgPSBfbWVhc3VyZS50ZXh0LFxuICAgICAgICAgIGVsbGlwc2lzID0gX21lYXN1cmUuZWxsaXBzaXM7XG5cbiAgICAgIGlmIChlbGxpcHNpc1RleHQgIT09IHRleHQgfHwgaXNFbGxpcHNpcyAhPT0gZWxsaXBzaXMpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZWxsaXBzaXNUZXh0OiB0ZXh0LFxuICAgICAgICAgIGVsbGlwc2lzQ29udGVudDogY29udGVudCxcbiAgICAgICAgICBpc0VsbGlwc2lzOiBlbGxpcHNpc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNFbGxpcHNpcyAhPT0gZWxsaXBzaXMgJiYgb25FbGxpcHNpcykge1xuICAgICAgICAgIG9uRWxsaXBzaXMoZWxsaXBzaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckV4cGFuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJFeHBhbmQoZm9yY2VSZW5kZXIpIHtcbiAgICAgIHZhciBfdGhpcyRnZXRFbGxpcHNpczQgPSB0aGlzLmdldEVsbGlwc2lzKCksXG4gICAgICAgICAgZXhwYW5kYWJsZSA9IF90aGlzJGdldEVsbGlwc2lzNC5leHBhbmRhYmxlLFxuICAgICAgICAgIHN5bWJvbCA9IF90aGlzJGdldEVsbGlwc2lzNC5zeW1ib2w7XG5cbiAgICAgIHZhciBfdGhpcyRzdGF0ZTIgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgIGV4cGFuZGVkID0gX3RoaXMkc3RhdGUyLmV4cGFuZGVkLFxuICAgICAgICAgIGlzRWxsaXBzaXMgPSBfdGhpcyRzdGF0ZTIuaXNFbGxpcHNpcztcbiAgICAgIGlmICghZXhwYW5kYWJsZSkgcmV0dXJuIG51bGw7IC8vIGZvcmNlIHJlbmRlciBleHBhbmQgaWNvbiBmb3IgbWVhc3VyZSB1c2FnZSBvciBpdCB3aWxsIGNhdXNlIGRlYWQgbG9vcFxuXG4gICAgICBpZiAoIWZvcmNlUmVuZGVyICYmIChleHBhbmRlZCB8fCAhaXNFbGxpcHNpcykpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGV4cGFuZENvbnRlbnQ7XG5cbiAgICAgIGlmIChzeW1ib2wpIHtcbiAgICAgICAgZXhwYW5kQ29udGVudCA9IHN5bWJvbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cGFuZENvbnRlbnQgPSB0aGlzLmV4cGFuZFN0cjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICAgIGtleTogXCJleHBhbmRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdCh0aGlzLmdldFByZWZpeENscygpLCBcIi1leHBhbmRcIiksXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMub25FeHBhbmRDbGljayxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IHRoaXMuZXhwYW5kU3RyXG4gICAgICB9LCBleHBhbmRDb250ZW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyRWRpdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJFZGl0KCkge1xuICAgICAgdmFyIGVkaXRhYmxlID0gdGhpcy5wcm9wcy5lZGl0YWJsZTtcbiAgICAgIGlmICghZWRpdGFibGUpIHJldHVybjtcbiAgICAgIHZhciBpY29uID0gZWRpdGFibGUuaWNvbixcbiAgICAgICAgICB0b29sdGlwID0gZWRpdGFibGUudG9vbHRpcDtcbiAgICAgIHZhciB0aXRsZSA9ICgwLCBfdG9BcnJheVtcImRlZmF1bHRcIl0pKHRvb2x0aXApWzBdIHx8IHRoaXMuZWRpdFN0cjtcbiAgICAgIHZhciBhcmlhTGFiZWwgPSB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiAnJztcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdG9vbHRpcFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAga2V5OiBcImVkaXRcIixcbiAgICAgICAgdGl0bGU6IHRvb2x0aXAgPT09IGZhbHNlID8gJycgOiB0aXRsZVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3RyYW5zQnV0dG9uW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICByZWY6IHRoaXMuc2V0RWRpdFJlZixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdCh0aGlzLmdldFByZWZpeENscygpLCBcIi1lZGl0XCIpLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLm9uRWRpdENsaWNrLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogYXJpYUxhYmVsXG4gICAgICB9LCBpY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9FZGl0T3V0bGluZWRbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgIHJvbGU6IFwiYnV0dG9uXCJcbiAgICAgIH0pKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQ29weSgpIHtcbiAgICAgIHZhciBjb3BpZWQgPSB0aGlzLnN0YXRlLmNvcGllZDtcbiAgICAgIHZhciBjb3B5YWJsZSA9IHRoaXMucHJvcHMuY29weWFibGU7XG4gICAgICBpZiAoIWNvcHlhYmxlKSByZXR1cm47XG4gICAgICB2YXIgcHJlZml4Q2xzID0gdGhpcy5nZXRQcmVmaXhDbHMoKTtcbiAgICAgIHZhciB0b29sdGlwcyA9IGNvcHlhYmxlLnRvb2x0aXBzO1xuICAgICAgdmFyIHRvb2x0aXBOb2RlcyA9ICgwLCBfdG9BcnJheVtcImRlZmF1bHRcIl0pKHRvb2x0aXBzKTtcblxuICAgICAgaWYgKHRvb2x0aXBOb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdG9vbHRpcE5vZGVzID0gW3RoaXMuY29weVN0ciwgdGhpcy5jb3BpZWRTdHJdO1xuICAgICAgfVxuXG4gICAgICB2YXIgdGl0bGUgPSBjb3BpZWQgPyB0b29sdGlwTm9kZXNbMV0gOiB0b29sdGlwTm9kZXNbMF07XG4gICAgICB2YXIgYXJpYUxhYmVsID0gdHlwZW9mIHRpdGxlID09PSAnc3RyaW5nJyA/IHRpdGxlIDogJyc7XG4gICAgICB2YXIgaWNvbnMgPSAoMCwgX3RvQXJyYXlbXCJkZWZhdWx0XCJdKShjb3B5YWJsZS5pY29uKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdG9vbHRpcFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAga2V5OiBcImNvcHlcIixcbiAgICAgICAgdGl0bGU6IHRvb2x0aXBzID09PSBmYWxzZSA/ICcnIDogdGl0bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF90cmFuc0J1dHRvbltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvcHlcIiksIGNvcGllZCAmJiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvcHktc3VjY2Vzc1wiKSksXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMub25Db3B5Q2xpY2ssXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBhcmlhTGFiZWxcbiAgICAgIH0sIGNvcGllZCA/IGljb25zWzFdIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DaGVja091dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCkgOiBpY29uc1swXSB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ29weU91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCkpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyRWRpdElucHV0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckVkaXRJbnB1dCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMzLmNoaWxkcmVuLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMy5jbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczMuc3R5bGU7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5jb250ZXh0LmRpcmVjdGlvbjtcblxuICAgICAgdmFyIF90aGlzJGdldEVkaXRhYmxlMyA9IHRoaXMuZ2V0RWRpdGFibGUoKSxcbiAgICAgICAgICBtYXhMZW5ndGggPSBfdGhpcyRnZXRFZGl0YWJsZTMubWF4TGVuZ3RoLFxuICAgICAgICAgIGF1dG9TaXplID0gX3RoaXMkZ2V0RWRpdGFibGUzLmF1dG9TaXplO1xuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0VkaXRhYmxlW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICB2YWx1ZTogdHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJyA/IGNoaWxkcmVuIDogJycsXG4gICAgICAgIG9uU2F2ZTogdGhpcy5vbkVkaXRDaGFuZ2UsXG4gICAgICAgIG9uQ2FuY2VsOiB0aGlzLm9uRWRpdENhbmNlbCxcbiAgICAgICAgcHJlZml4Q2xzOiB0aGlzLmdldFByZWZpeENscygpLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgICAgbWF4TGVuZ3RoOiBtYXhMZW5ndGgsXG4gICAgICAgIGF1dG9TaXplOiBhdXRvU2l6ZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlck9wZXJhdGlvbnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyT3BlcmF0aW9ucyhmb3JjZVJlbmRlckV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gW3RoaXMucmVuZGVyRXhwYW5kKGZvcmNlUmVuZGVyRXhwYW5kZWQpLCB0aGlzLnJlbmRlckVkaXQoKSwgdGhpcy5yZW5kZXJDb3B5KCldLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJDb250ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHN0YXRlMyA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgZWxsaXBzaXNDb250ZW50ID0gX3RoaXMkc3RhdGUzLmVsbGlwc2lzQ29udGVudCxcbiAgICAgICAgICBpc0VsbGlwc2lzID0gX3RoaXMkc3RhdGUzLmlzRWxsaXBzaXMsXG4gICAgICAgICAgZXhwYW5kZWQgPSBfdGhpcyRzdGF0ZTMuZXhwYW5kZWQ7XG5cbiAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgY29tcG9uZW50ID0gX2EuY29tcG9uZW50LFxuICAgICAgICAgIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sXG4gICAgICAgICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgICAgICAgIHR5cGUgPSBfYS50eXBlLFxuICAgICAgICAgIGRpc2FibGVkID0gX2EuZGlzYWJsZWQsXG4gICAgICAgICAgc3R5bGUgPSBfYS5zdHlsZSxcbiAgICAgICAgICByZXN0UHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNvbXBvbmVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwidHlwZVwiLCBcImRpc2FibGVkXCIsIFwic3R5bGVcIl0pO1xuXG4gICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5jb250ZXh0LmRpcmVjdGlvbjtcblxuICAgICAgdmFyIF90aGlzJGdldEVsbGlwc2lzNSA9IHRoaXMuZ2V0RWxsaXBzaXMoKSxcbiAgICAgICAgICByb3dzID0gX3RoaXMkZ2V0RWxsaXBzaXM1LnJvd3MsXG4gICAgICAgICAgc3VmZml4ID0gX3RoaXMkZ2V0RWxsaXBzaXM1LnN1ZmZpeDtcblxuICAgICAgdmFyIHByZWZpeENscyA9IHRoaXMuZ2V0UHJlZml4Q2xzKCk7XG4gICAgICB2YXIgdGV4dFByb3BzID0gKDAsIF9vbWl0W1wiZGVmYXVsdFwiXSkocmVzdFByb3BzLCBbJ3ByZWZpeENscycsICdlZGl0YWJsZScsICdjb3B5YWJsZScsICdlbGxpcHNpcycsICdtYXJrJywgJ2NvZGUnLCAnZGVsZXRlJywgJ3VuZGVybGluZScsICdzdHJvbmcnLCAna2V5Ym9hcmQnXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTJbXCJkZWZhdWx0XCJdKShfY29uZmlnUHJvdmlkZXIuY29uZmlnQ29uc3VtZXJQcm9wcykpKTtcbiAgICAgIHZhciBjc3NFbGxpcHNpcyA9IHRoaXMuY2FuVXNlQ1NTRWxsaXBzaXMoKTtcbiAgICAgIHZhciBjc3NUZXh0T3ZlcmZsb3cgPSByb3dzID09PSAxICYmIGNzc0VsbGlwc2lzO1xuICAgICAgdmFyIGNzc0xpbmVDbGFtcCA9IHJvd3MgJiYgcm93cyA+IDEgJiYgY3NzRWxsaXBzaXM7XG4gICAgICB2YXIgdGV4dE5vZGUgPSBjaGlsZHJlbjtcbiAgICAgIHZhciBhcmlhTGFiZWw7IC8vIE9ubHkgdXNlIGpzIGVsbGlwc2lzIHdoZW4gY3NzIGVsbGlwc2lzIG5vdCBzdXBwb3J0XG5cbiAgICAgIGlmIChyb3dzICYmIGlzRWxsaXBzaXMgJiYgIWV4cGFuZGVkICYmICFjc3NFbGxpcHNpcykge1xuICAgICAgICB2YXIgdGl0bGUgPSByZXN0UHJvcHMudGl0bGU7XG4gICAgICAgIGFyaWFMYWJlbCA9IHRpdGxlO1xuXG4gICAgICAgIGlmICghdGl0bGUgJiYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICBhcmlhTGFiZWwgPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgICAgICB9IC8vIFdlIG1vdmUgZnVsbCBjb250ZW50IHRvIG91dGVyIGVsZW1lbnQgdG8gYXZvaWQgcmVwZWF0IHJlYWQgdGhlIGNvbnRlbnQgYnkgYWNjZXNzaWJpbGl0eVxuXG5cbiAgICAgICAgdGV4dE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIHRpdGxlOiBhcmlhTGFiZWwsXG4gICAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgICB9LCBlbGxpcHNpc0NvbnRlbnQsIEVMTElQU0lTX1NUUiwgc3VmZml4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuLCBzdWZmaXgpO1xuICAgICAgfVxuXG4gICAgICB0ZXh0Tm9kZSA9IHdyYXBwZXJEZWNvcmF0aW9ucyh0aGlzLnByb3BzLCB0ZXh0Tm9kZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvY2FsZVJlY2VpdmVyW1wiZGVmYXVsdFwiXSwge1xuICAgICAgICBjb21wb25lbnROYW1lOiBcIlRleHRcIlxuICAgICAgfSwgZnVuY3Rpb24gKF9yZWY0KSB7XG4gICAgICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgICAgICB2YXIgZWRpdCA9IF9yZWY0LmVkaXQsXG4gICAgICAgICAgICBjb3B5U3RyID0gX3JlZjQuY29weSxcbiAgICAgICAgICAgIGNvcGllZCA9IF9yZWY0LmNvcGllZCxcbiAgICAgICAgICAgIGV4cGFuZCA9IF9yZWY0LmV4cGFuZDtcbiAgICAgICAgX3RoaXMyLmVkaXRTdHIgPSBlZGl0O1xuICAgICAgICBfdGhpczIuY29weVN0ciA9IGNvcHlTdHI7XG4gICAgICAgIF90aGlzMi5jb3BpZWRTdHIgPSBjb3BpZWQ7XG4gICAgICAgIF90aGlzMi5leHBhbmRTdHIgPSBleHBhbmQ7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNSZXNpemVPYnNlcnZlcltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICBvblJlc2l6ZTogX3RoaXMyLnJlc2l6ZU9uTmV4dEZyYW1lLFxuICAgICAgICAgIGRpc2FibGVkOiAhcm93c1xuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfVHlwb2dyYXBoeVtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHR5cGUpLCB0eXBlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsbGlwc2lzXCIpLCByb3dzKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lbGxpcHNpcy1zaW5nbGUtbGluZVwiKSwgY3NzVGV4dE92ZXJmbG93KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lbGxpcHNpcy1tdWx0aXBsZS1saW5lXCIpLCBjc3NMaW5lQ2xhbXApLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSksXG4gICAgICAgICAgc3R5bGU6ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHN0eWxlKSwge1xuICAgICAgICAgICAgV2Via2l0TGluZUNsYW1wOiBjc3NMaW5lQ2xhbXAgPyByb3dzIDogbnVsbFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LFxuICAgICAgICAgIHJlZjogX3RoaXMyLmNvbnRlbnRSZWYsXG4gICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IGFyaWFMYWJlbCxcbiAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgICAgICB9LCB0ZXh0UHJvcHMpLCB0ZXh0Tm9kZSwgX3RoaXMyLnJlbmRlck9wZXJhdGlvbnMoKSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkZ2V0RWRpdGFibGU0ID0gdGhpcy5nZXRFZGl0YWJsZSgpLFxuICAgICAgICAgIGVkaXRpbmcgPSBfdGhpcyRnZXRFZGl0YWJsZTQuZWRpdGluZztcblxuICAgICAgaWYgKGVkaXRpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRWRpdElucHV0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbnRlbnQoKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIGNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIGVkaXRhYmxlID0gbmV4dFByb3BzLmVkaXRhYmxlO1xuICAgICAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoIWVkaXRhYmxlIHx8IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZycsICdUeXBvZ3JhcGh5JywgJ1doZW4gYGVkaXRhYmxlYCBpcyBlbmFibGVkLCB0aGUgYGNoaWxkcmVuYCBzaG91bGQgdXNlIHN0cmluZy4nKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEJhc2U7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkJhc2UuY29udGV4dFR5cGUgPSBfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dDtcbkJhc2UuZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogJydcbn07XG52YXIgX2RlZmF1bHQgPSBCYXNlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfS2V5Q29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0tleUNvZGVcIikpO1xuXG52YXIgX0VudGVyT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9FbnRlck91dGxpbmVkXCIpKTtcblxudmFyIF9UZXh0QXJlYSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2lucHV0L1RleHRBcmVhXCIpKTtcblxudmFyIEVkaXRhYmxlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyW1wiZGVmYXVsdFwiXSkoRWRpdGFibGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMltcImRlZmF1bHRcIl0pKEVkaXRhYmxlKTtcblxuICBmdW5jdGlvbiBFZGl0YWJsZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMltcImRlZmF1bHRcIl0pKHRoaXMsIEVkaXRhYmxlKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLmluQ29tcG9zaXRpb24gPSBmYWxzZTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGN1cnJlbnQ6ICcnXG4gICAgfTtcblxuICAgIF90aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9yZWYudGFyZ2V0LnZhbHVlO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGN1cnJlbnQ6IHZhbHVlLnJlcGxhY2UoL1tcXG5cXHJdL2csICcnKVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uQ29tcG9zaXRpb25TdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmluQ29tcG9zaXRpb24gPSB0cnVlO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkNvbXBvc2l0aW9uRW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuaW5Db21wb3NpdGlvbiA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbktleURvd24gPSBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciBrZXlDb2RlID0gX3JlZjIua2V5Q29kZTtcbiAgICAgIC8vIFdlIGRvbid0IHJlY29yZCBrZXlDb2RlIHdoZW4gSU1FIGlzIHVzaW5nXG4gICAgICBpZiAoX3RoaXMuaW5Db21wb3NpdGlvbikgcmV0dXJuO1xuICAgICAgX3RoaXMubGFzdEtleUNvZGUgPSBrZXlDb2RlO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbktleVVwID0gZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICB2YXIga2V5Q29kZSA9IF9yZWYzLmtleUNvZGUsXG4gICAgICAgICAgY3RybEtleSA9IF9yZWYzLmN0cmxLZXksXG4gICAgICAgICAgYWx0S2V5ID0gX3JlZjMuYWx0S2V5LFxuICAgICAgICAgIG1ldGFLZXkgPSBfcmVmMy5tZXRhS2V5LFxuICAgICAgICAgIHNoaWZ0S2V5ID0gX3JlZjMuc2hpZnRLZXk7XG4gICAgICB2YXIgb25DYW5jZWwgPSBfdGhpcy5wcm9wcy5vbkNhbmNlbDsgLy8gQ2hlY2sgaWYgaXQncyBhIHJlYWwga2V5XG5cbiAgICAgIGlmIChfdGhpcy5sYXN0S2V5Q29kZSA9PT0ga2V5Q29kZSAmJiAhX3RoaXMuaW5Db21wb3NpdGlvbiAmJiAhY3RybEtleSAmJiAhYWx0S2V5ICYmICFtZXRhS2V5ICYmICFzaGlmdEtleSkge1xuICAgICAgICBpZiAoa2V5Q29kZSA9PT0gX0tleUNvZGVbXCJkZWZhdWx0XCJdLkVOVEVSKSB7XG4gICAgICAgICAgX3RoaXMuY29uZmlybUNoYW5nZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IF9LZXlDb2RlW1wiZGVmYXVsdFwiXS5FU0MpIHtcbiAgICAgICAgICBvbkNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uQmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNvbmZpcm1DaGFuZ2UoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuY29uZmlybUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gX3RoaXMuc3RhdGUuY3VycmVudDtcbiAgICAgIHZhciBvblNhdmUgPSBfdGhpcy5wcm9wcy5vblNhdmU7XG4gICAgICBvblNhdmUoY3VycmVudC50cmltKCkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXRUZXh0YXJlYSA9IGZ1bmN0aW9uICh0ZXh0YXJlYSkge1xuICAgICAgX3RoaXMudGV4dGFyZWEgPSB0ZXh0YXJlYTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShFZGl0YWJsZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBpZiAodGhpcy50ZXh0YXJlYSAmJiB0aGlzLnRleHRhcmVhLnJlc2l6YWJsZVRleHRBcmVhKSB7XG4gICAgICAgIHZhciB0ZXh0QXJlYSA9IHRoaXMudGV4dGFyZWEucmVzaXphYmxlVGV4dEFyZWEudGV4dEFyZWE7XG4gICAgICAgIHRleHRBcmVhLmZvY3VzKCk7XG4gICAgICAgIHZhciBsZW5ndGggPSB0ZXh0QXJlYS52YWx1ZS5sZW5ndGg7XG4gICAgICAgIHRleHRBcmVhLnNldFNlbGVjdGlvblJhbmdlKGxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5zdGF0ZS5jdXJyZW50O1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgICAgYXJpYUxhYmVsID0gX3RoaXMkcHJvcHNbJ2FyaWEtbGFiZWwnXSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wcy5zdHlsZSxcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wcy5kaXJlY3Rpb24sXG4gICAgICAgICAgbWF4TGVuZ3RoID0gX3RoaXMkcHJvcHMubWF4TGVuZ3RoLFxuICAgICAgICAgIGF1dG9TaXplID0gX3RoaXMkcHJvcHMuYXV0b1NpemU7XG4gICAgICB2YXIgdGV4dEFyZWFDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWRpdC1jb250ZW50XCIpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIGNsYXNzTmFtZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHRleHRBcmVhQ2xhc3NOYW1lLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9UZXh0QXJlYVtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgcmVmOiB0aGlzLnNldFRleHRhcmVhLFxuICAgICAgICBtYXhMZW5ndGg6IG1heExlbmd0aCxcbiAgICAgICAgdmFsdWU6IGN1cnJlbnQsXG4gICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLFxuICAgICAgICBvbktleURvd246IHRoaXMub25LZXlEb3duLFxuICAgICAgICBvbktleVVwOiB0aGlzLm9uS2V5VXAsXG4gICAgICAgIG9uQ29tcG9zaXRpb25TdGFydDogdGhpcy5vbkNvbXBvc2l0aW9uU3RhcnQsXG4gICAgICAgIG9uQ29tcG9zaXRpb25FbmQ6IHRoaXMub25Db21wb3NpdGlvbkVuZCxcbiAgICAgICAgb25CbHVyOiB0aGlzLm9uQmx1cixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IGFyaWFMYWJlbCxcbiAgICAgICAgYXV0b1NpemU6IGF1dG9TaXplID09PSB1bmRlZmluZWQgfHwgYXV0b1NpemVcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRW50ZXJPdXRsaW5lZFtcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVkaXQtY29udGVudC1jb25maXJtXCIpXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgdmFyIHByZXZWYWx1ZSA9IHByZXZTdGF0ZS5wcmV2VmFsdWU7XG4gICAgICB2YXIgdmFsdWUgPSBuZXh0UHJvcHMudmFsdWU7XG4gICAgICB2YXIgbmV3U3RhdGUgPSB7XG4gICAgICAgIHByZXZWYWx1ZTogdmFsdWVcbiAgICAgIH07XG5cbiAgICAgIGlmIChwcmV2VmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIG5ld1N0YXRlLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRWRpdGFibGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBfZGVmYXVsdCA9IEVkaXRhYmxlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfQmFzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQmFzZVwiKSk7XG5cbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgTGluayA9IGZ1bmN0aW9uIExpbmsoX2EsIHJlZikge1xuICB2YXIgZWxsaXBzaXMgPSBfYS5lbGxpcHNpcyxcbiAgICAgIHJlbCA9IF9hLnJlbCxcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wiZWxsaXBzaXNcIiwgXCJyZWxcIl0pO1xuXG4gICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKCgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKGVsbGlwc2lzKSAhPT0gJ29iamVjdCcsICdUeXBvZ3JhcGh5LkxpbmsnLCAnYGVsbGlwc2lzYCBvbmx5IHN1cHBvcnRzIGJvb2xlYW4gdmFsdWUuJyk7XG4gIHZhciBiYXNlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcblxuICAgIHJldHVybiAoX2EgPSBiYXNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb250ZW50UmVmLmN1cnJlbnQ7XG4gIH0pO1xuICB2YXIgbWVyZ2VkUHJvcHMgPSAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByZXN0UHJvcHMpLCB7XG4gICAgcmVsOiByZWwgPT09IHVuZGVmaW5lZCAmJiByZXN0UHJvcHMudGFyZ2V0ID09PSAnX2JsYW5rJyA/ICdub29wZW5lciBub3JlZmVycmVyJyA6IHJlbFxuICB9KTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjY2MjJcbiAgLy8gQHRzLWlnbm9yZVxuXG4gIGRlbGV0ZSBtZXJnZWRQcm9wcy5uYXZpZ2F0ZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9CYXNlW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCBtZXJnZWRQcm9wcywge1xuICAgIHJlZjogYmFzZVJlZixcbiAgICBlbGxpcHNpczogISFlbGxpcHNpcyxcbiAgICBjb21wb25lbnQ6IFwiYVwiXG4gIH0pKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKExpbmspO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9CYXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9CYXNlXCIpKTtcblxudmFyIFBhcmFncmFwaCA9IGZ1bmN0aW9uIFBhcmFncmFwaChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Jhc2VbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHByb3BzLCB7XG4gICAgY29tcG9uZW50OiBcImRpdlwiXG4gIH0pKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IFBhcmFncmFwaDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX0Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0Jhc2VcIikpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIFRleHQgPSBmdW5jdGlvbiBUZXh0KF9hKSB7XG4gIHZhciBlbGxpcHNpcyA9IF9hLmVsbGlwc2lzLFxuICAgICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJlbGxpcHNpc1wiXSk7XG5cbiAgKDAsIF9kZXZXYXJuaW5nW1wiZGVmYXVsdFwiXSkoKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoZWxsaXBzaXMpICE9PSAnb2JqZWN0JywgJ1R5cG9ncmFwaHkuVGV4dCcsICdgZWxsaXBzaXNgIG9ubHkgc3VwcG9ydHMgYm9vbGVhbiB2YWx1ZS4nKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9CYXNlW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByZXN0UHJvcHMsIHtcbiAgICBlbGxpcHNpczogISFlbGxpcHNpcyxcbiAgICBjb21wb25lbnQ6IFwic3BhblwiXG4gIH0pKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IFRleHQ7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9kZXZXYXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvZGV2V2FybmluZ1wiKSk7XG5cbnZhciBfQmFzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQmFzZVwiKSk7XG5cbnZhciBfdHlwZSA9IHJlcXVpcmUoXCIuLi9fdXRpbC90eXBlXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIFRJVExFX0VMRV9MSVNUID0gKDAsIF90eXBlLnR1cGxlTnVtKSgxLCAyLCAzLCA0LCA1KTtcblxudmFyIFRpdGxlID0gZnVuY3Rpb24gVGl0bGUocHJvcHMpIHtcbiAgdmFyIF9wcm9wcyRsZXZlbCA9IHByb3BzLmxldmVsLFxuICAgICAgbGV2ZWwgPSBfcHJvcHMkbGV2ZWwgPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkbGV2ZWwsXG4gICAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcImxldmVsXCJdKTtcblxuICB2YXIgY29tcG9uZW50O1xuXG4gIGlmIChUSVRMRV9FTEVfTElTVC5pbmRleE9mKGxldmVsKSAhPT0gLTEpIHtcbiAgICBjb21wb25lbnQgPSBcImhcIi5jb25jYXQobGV2ZWwpO1xuICB9IGVsc2Uge1xuICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKGZhbHNlLCAnVHlwb2dyYXBoeS5UaXRsZScsICdUaXRsZSBvbmx5IGFjY2VwdCBgMSB8IDIgfCAzIHwgNCB8IDVgIGFzIGBsZXZlbGAgdmFsdWUuIEFuZCBgNWAgbmVlZCA0LjYuMCsgdmVyc2lvbi4nKTtcbiAgICBjb21wb25lbnQgPSAnaDEnO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9CYXNlW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCByZXN0UHJvcHMsIHtcbiAgICBjb21wb25lbnQ6IGNvbXBvbmVudFxuICB9KSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBUaXRsZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfZGV2V2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2Rldldhcm5pbmdcIikpO1xuXG52YXIgX3JlZjIgPSByZXF1aXJlKFwiLi4vX3V0aWwvcmVmXCIpO1xuXG52YXIgX19yZXN0ID0gdm9pZCAwICYmICh2b2lkIDApLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxudmFyIFR5cG9ncmFwaHkgPSBmdW5jdGlvbiBUeXBvZ3JhcGh5KF9hLCByZWYpIHtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICAgIF9hJGNvbXBvbmVudCA9IF9hLmNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudCA9IF9hJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2FydGljbGUnIDogX2EkY29tcG9uZW50LFxuICAgICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgICAgYXJpYUxhYmVsID0gX2FbJ2FyaWEtbGFiZWwnXSxcbiAgICAgIHNldENvbnRlbnRSZWYgPSBfYS5zZXRDb250ZW50UmVmLFxuICAgICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY29tcG9uZW50XCIsIFwiY2xhc3NOYW1lXCIsICdhcmlhLWxhYmVsJywgXCJzZXRDb250ZW50UmVmXCIsIFwiY2hpbGRyZW5cIl0pO1xuXG4gIHZhciBtZXJnZWRSZWYgPSByZWY7XG5cbiAgaWYgKHNldENvbnRlbnRSZWYpIHtcbiAgICAoMCwgX2Rldldhcm5pbmdbXCJkZWZhdWx0XCJdKShmYWxzZSwgJ1R5cG9ncmFwaHknLCAnYHNldENvbnRlbnRSZWZgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYHJlZmAgaW5zdGVhZC4nKTtcbiAgICBtZXJnZWRSZWYgPSAoMCwgX3JlZjIuY29tcG9zZVJlZikocmVmLCBzZXRDb250ZW50UmVmKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGdldFByZWZpeENscyA9IF9yZWYuZ2V0UHJlZml4Q2xzLFxuICAgICAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbjtcbiAgICB2YXIgQ29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3R5cG9ncmFwaHknLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBjb21wb25lbnRDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShwcmVmaXhDbHMsICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgY2xhc3NOYW1lOiBjb21wb25lbnRDbGFzc05hbWUsXG4gICAgICBcImFyaWEtbGFiZWxcIjogYXJpYUxhYmVsLFxuICAgICAgcmVmOiBtZXJnZWRSZWZcbiAgICB9LCByZXN0UHJvcHMpLCBjaGlsZHJlbik7XG4gIH0pO1xufTtcblxudmFyIFJlZlR5cG9ncmFwaHkgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihUeXBvZ3JhcGh5KTtcblJlZlR5cG9ncmFwaHkuZGlzcGxheU5hbWUgPSAnVHlwb2dyYXBoeSc7IC8vIGVzIGRlZmF1bHQgZXhwb3J0IHNob3VsZCB1c2UgY29uc3QgaW5zdGVhZCBvZiBsZXRcblxudmFyIEV4cG9ydFR5cG9ncmFwaHkgPSBSZWZUeXBvZ3JhcGh5O1xudmFyIF9kZWZhdWx0ID0gRXhwb3J0VHlwb2dyYXBoeTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfVHlwb2dyYXBoeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVHlwb2dyYXBoeVwiKSk7XG5cbnZhciBfVGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGV4dFwiKSk7XG5cbnZhciBfTGluayA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTGlua1wiKSk7XG5cbnZhciBfVGl0bGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RpdGxlXCIpKTtcblxudmFyIF9QYXJhZ3JhcGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcmFncmFwaFwiKSk7XG5cbnZhciBUeXBvZ3JhcGh5ID0gX1R5cG9ncmFwaHlbXCJkZWZhdWx0XCJdO1xuVHlwb2dyYXBoeS5UZXh0ID0gX1RleHRbXCJkZWZhdWx0XCJdO1xuVHlwb2dyYXBoeS5MaW5rID0gX0xpbmtbXCJkZWZhdWx0XCJdO1xuVHlwb2dyYXBoeS5UaXRsZSA9IF9UaXRsZVtcImRlZmF1bHRcIl07XG5UeXBvZ3JhcGh5LlBhcmFncmFwaCA9IF9QYXJhZ3JhcGhbXCJkZWZhdWx0XCJdO1xudmFyIF9kZWZhdWx0ID0gVHlwb2dyYXBoeTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxuLy8gV2Ugb25seSBoYW5kbGUgZWxlbWVudCAmIHRleHQgbm9kZS5cbnZhciBFTEVNRU5UX05PREUgPSAxO1xudmFyIFRFWFRfTk9ERSA9IDM7XG52YXIgQ09NTUVOVF9OT0RFID0gODtcbnZhciBlbGxpcHNpc0NvbnRhaW5lcjtcbnZhciB3cmFwcGVyU3R5bGUgPSB7XG4gIHBhZGRpbmc6IDAsXG4gIG1hcmdpbjogMCxcbiAgZGlzcGxheTogJ2lubGluZScsXG4gIGxpbmVIZWlnaHQ6ICdpbmhlcml0J1xufTtcblxuZnVuY3Rpb24gcHhUb051bWJlcih2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gMDtcbiAgdmFyIG1hdGNoID0gdmFsdWUubWF0Y2goL15cXGQqKFxcLlxcZCopPy8pO1xuICByZXR1cm4gbWF0Y2ggPyBOdW1iZXIobWF0Y2hbMF0pIDogMDtcbn1cblxuZnVuY3Rpb24gc3R5bGVUb1N0cmluZyhzdHlsZSkge1xuICAvLyBUaGVyZSBhcmUgc29tZSBkaWZmZXJlbnQgYmVoYXZpb3IgYmV0d2VlbiBGaXJlZm94ICYgQ2hyb21lLlxuICAvLyBXZSBoYXZlIHRvIGhhbmRsZSB0aGlzIG91cnNlbGYuXG4gIHZhciBzdHlsZU5hbWVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KHN0eWxlKTtcbiAgcmV0dXJuIHN0eWxlTmFtZXMubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KG5hbWUsIFwiOiBcIikuY29uY2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSksIFwiO1wiKTtcbiAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIGNoaWxkTGlzdCA9IFtdO1xuICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHZhciBwcmV2Q2hpbGQgPSBjaGlsZExpc3RbY2hpbGRMaXN0Lmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHByZXZDaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNoaWxkTGlzdFtjaGlsZExpc3QubGVuZ3RoIC0gMV0gKz0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkTGlzdC5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2hpbGRMaXN0O1xufVxuXG52YXIgX2RlZmF1bHQgPSBmdW5jdGlvbiBfZGVmYXVsdChvcmlnaW5FbGUsIG9wdGlvbiwgY29udGVudCwgZml4ZWRDb250ZW50LCBlbGxpcHNpc1N0cikge1xuICBpZiAoIWVsbGlwc2lzQ29udGFpbmVyKSB7XG4gICAgZWxsaXBzaXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGxpcHNpc0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsbGlwc2lzQ29udGFpbmVyKTtcbiAgfVxuXG4gIHZhciByb3dzID0gb3B0aW9uLnJvd3MsXG4gICAgICBfb3B0aW9uJHN1ZmZpeCA9IG9wdGlvbi5zdWZmaXgsXG4gICAgICBzdWZmaXggPSBfb3B0aW9uJHN1ZmZpeCA9PT0gdm9pZCAwID8gJycgOiBfb3B0aW9uJHN1ZmZpeDsgLy8gR2V0IG9yaWdpbiBzdHlsZVxuXG4gIHZhciBvcmlnaW5TdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG9yaWdpbkVsZSk7XG4gIHZhciBvcmlnaW5DU1MgPSBzdHlsZVRvU3RyaW5nKG9yaWdpblN0eWxlKTtcbiAgdmFyIGxpbmVIZWlnaHQgPSBweFRvTnVtYmVyKG9yaWdpblN0eWxlLmxpbmVIZWlnaHQpO1xuICB2YXIgbWF4SGVpZ2h0ID0gTWF0aC5yb3VuZChsaW5lSGVpZ2h0ICogKHJvd3MgKyAxKSArIHB4VG9OdW1iZXIob3JpZ2luU3R5bGUucGFkZGluZ1RvcCkgKyBweFRvTnVtYmVyKG9yaWdpblN0eWxlLnBhZGRpbmdCb3R0b20pKTsgLy8gU2V0IHNoYWRvd1xuXG4gIGVsbGlwc2lzQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBvcmlnaW5DU1MpO1xuICBlbGxpcHNpc0NvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgZWxsaXBzaXNDb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gJ2F1dG8nO1xuICBlbGxpcHNpc0NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSAnYXV0byc7XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLnRvcCA9ICctOTk5OTk5cHgnO1xuICBlbGxpcHNpc0NvbnRhaW5lci5zdHlsZS56SW5kZXggPSAnLTEwMDAnOyAvLyBjbGVhbiB1cCBjc3Mgb3ZlcmZsb3dcblxuICBlbGxpcHNpc0NvbnRhaW5lci5zdHlsZS50ZXh0T3ZlcmZsb3cgPSAnY2xpcCc7XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJztcbiAgZWxsaXBzaXNDb250YWluZXIuc3R5bGUud2Via2l0TGluZUNsYW1wID0gJ25vbmUnOyAvLyBSZW5kZXIgaW4gdGhlIGZha2UgY29udGFpbmVyXG5cbiAgdmFyIGNvbnRlbnRMaXN0ID0gbWVyZ2VDaGlsZHJlbigoMCwgX3RvQXJyYXlbXCJkZWZhdWx0XCJdKShjb250ZW50KSk7XG4gICgwLCBfcmVhY3REb20ucmVuZGVyKSggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiB3cmFwcGVyU3R5bGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBzdHlsZTogd3JhcHBlclN0eWxlXG4gIH0sIGNvbnRlbnRMaXN0LCBzdWZmaXgpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHN0eWxlOiB3cmFwcGVyU3R5bGVcbiAgfSwgZml4ZWRDb250ZW50KSksIGVsbGlwc2lzQ29udGFpbmVyKTsgLy8gd3JhcCBpbiBhbiBkaXYgZm9yIG9sZCB2ZXJzaW9uIHJlYWN0XG4gIC8vIENoZWNrIGlmIGVsbGlwc2lzIGluIG1lYXN1cmUgZGl2IGlzIGhlaWdodCBlbm91Z2ggZm9yIGNvbnRlbnRcblxuICBmdW5jdGlvbiBpblJhbmdlKCkge1xuICAgIHJldHVybiBlbGxpcHNpc0NvbnRhaW5lci5vZmZzZXRIZWlnaHQgPCBtYXhIZWlnaHQ7XG4gIH0gLy8gU2tpcCBlbGxpcHNpcyBpZiBhbHJlYWR5IG1hdGNoXG5cblxuICBpZiAoaW5SYW5nZSgpKSB7XG4gICAgKDAsIF9yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKShlbGxpcHNpc0NvbnRhaW5lcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICB0ZXh0OiBlbGxpcHNpc0NvbnRhaW5lci5pbm5lckhUTUwsXG4gICAgICBlbGxpcHNpczogZmFsc2VcbiAgICB9O1xuICB9IC8vIFdlIHNob3VsZCBjbG9uZSB0aGUgY2hpbGROb2RlIHNpbmNlIHRoZXkncmUgY29udHJvbGxlZCBieSBSZWFjdCBhbmQgd2UgY2FuJ3QgcmV1c2UgaXQgd2l0aG91dCB3YXJuaW5nXG5cblxuICB2YXIgY2hpbGROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShlbGxpcHNpc0NvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uY2xvbmVOb2RlKHRydWUpLmNoaWxkTm9kZXMpLmZpbHRlcihmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBub2RlVHlwZSA9IF9yZWYubm9kZVR5cGU7XG4gICAgcmV0dXJuIG5vZGVUeXBlICE9PSBDT01NRU5UX05PREU7XG4gIH0pO1xuICB2YXIgZml4ZWROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShlbGxpcHNpc0NvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0uY2xvbmVOb2RlKHRydWUpLmNoaWxkTm9kZXMpO1xuICAoMCwgX3JlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUpKGVsbGlwc2lzQ29udGFpbmVyKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBGaW5kIG1hdGNoIGVsbGlwc2lzIGNvbnRlbnQgPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBlbGxpcHNpc0NoaWxkcmVuID0gW107XG4gIGVsbGlwc2lzQ29udGFpbmVyLmlubmVySFRNTCA9ICcnOyAvLyBDcmVhdGUgb3JpZ2luIGNvbnRlbnQgaG9sZGVyXG5cbiAgdmFyIGVsbGlwc2lzQ29udGVudEhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgZWxsaXBzaXNDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxsaXBzaXNDb250ZW50SG9sZGVyKTtcbiAgdmFyIGVsbGlwc2lzVGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbGxpcHNpc1N0ciArIHN1ZmZpeCk7XG4gIGVsbGlwc2lzQ29udGVudEhvbGRlci5hcHBlbmRDaGlsZChlbGxpcHNpc1RleHROb2RlKTtcbiAgZml4ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZE5vZGUpIHtcbiAgICBlbGxpcHNpc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xuICB9KTsgLy8gQXBwZW5kIGJlZm9yZSBmaXhlZCBub2Rlc1xuXG4gIGZ1bmN0aW9uIGFwcGVuZENoaWxkTm9kZShub2RlKSB7XG4gICAgZWxsaXBzaXNDb250ZW50SG9sZGVyLmluc2VydEJlZm9yZShub2RlLCBlbGxpcHNpc1RleHROb2RlKTtcbiAgfSAvLyBHZXQgbWF4aW11bSB0ZXh0XG5cblxuICBmdW5jdGlvbiBtZWFzdXJlVGV4dCh0ZXh0Tm9kZSwgZnVsbFRleHQpIHtcbiAgICB2YXIgc3RhcnRMb2MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG4gICAgdmFyIGVuZExvYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZnVsbFRleHQubGVuZ3RoO1xuICAgIHZhciBsYXN0U3VjY2Vzc0xvYyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogMDtcbiAgICB2YXIgbWlkTG9jID0gTWF0aC5mbG9vcigoc3RhcnRMb2MgKyBlbmRMb2MpIC8gMik7XG4gICAgdmFyIGN1cnJlbnRUZXh0ID0gZnVsbFRleHQuc2xpY2UoMCwgbWlkTG9jKTtcbiAgICB0ZXh0Tm9kZS50ZXh0Q29udGVudCA9IGN1cnJlbnRUZXh0O1xuXG4gICAgaWYgKHN0YXJ0TG9jID49IGVuZExvYyAtIDEpIHtcbiAgICAgIC8vIExvb3Agd2hlbiBzdGVwIGlzIHNtYWxsXG4gICAgICBmb3IgKHZhciBzdGVwID0gZW5kTG9jOyBzdGVwID49IHN0YXJ0TG9jOyBzdGVwIC09IDEpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTdGVwVGV4dCA9IGZ1bGxUZXh0LnNsaWNlKDAsIHN0ZXApO1xuICAgICAgICB0ZXh0Tm9kZS50ZXh0Q29udGVudCA9IGN1cnJlbnRTdGVwVGV4dDtcblxuICAgICAgICBpZiAoaW5SYW5nZSgpIHx8ICFjdXJyZW50U3RlcFRleHQpIHtcbiAgICAgICAgICByZXR1cm4gc3RlcCA9PT0gZnVsbFRleHQubGVuZ3RoID8ge1xuICAgICAgICAgICAgZmluaXNoZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcmVhY3ROb2RlOiBmdWxsVGV4dFxuICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICBmaW5pc2hlZDogdHJ1ZSxcbiAgICAgICAgICAgIHJlYWN0Tm9kZTogY3VycmVudFN0ZXBUZXh0XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpblJhbmdlKCkpIHtcbiAgICAgIHJldHVybiBtZWFzdXJlVGV4dCh0ZXh0Tm9kZSwgZnVsbFRleHQsIG1pZExvYywgZW5kTG9jLCBtaWRMb2MpO1xuICAgIH1cblxuICAgIHJldHVybiBtZWFzdXJlVGV4dCh0ZXh0Tm9kZSwgZnVsbFRleHQsIHN0YXJ0TG9jLCBtaWRMb2MsIGxhc3RTdWNjZXNzTG9jKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lYXN1cmVOb2RlKGNoaWxkTm9kZSwgaW5kZXgpIHtcbiAgICB2YXIgdHlwZSA9IGNoaWxkTm9kZS5ub2RlVHlwZTtcblxuICAgIGlmICh0eXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIC8vIFdlIGRvbid0IHNwbGl0IGVsZW1lbnQsIGl0IHdpbGwga2VlcCBpZiB3aG9sZSBlbGVtZW50IGNhbiBiZSBkaXNwbGF5ZWQuXG4gICAgICBhcHBlbmRDaGlsZE5vZGUoY2hpbGROb2RlKTtcblxuICAgICAgaWYgKGluUmFuZ2UoKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpbmlzaGVkOiBmYWxzZSxcbiAgICAgICAgICByZWFjdE5vZGU6IGNvbnRlbnRMaXN0W2luZGV4XVxuICAgICAgICB9O1xuICAgICAgfSAvLyBDbGVhbiB1cCBpZiBjYW4gbm90IHB1bGwgaW5cblxuXG4gICAgICBlbGxpcHNpc0NvbnRlbnRIb2xkZXIucmVtb3ZlQ2hpbGQoY2hpbGROb2RlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbmlzaGVkOiB0cnVlLFxuICAgICAgICByZWFjdE5vZGU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgdmFyIGZ1bGxUZXh0ID0gY2hpbGROb2RlLnRleHRDb250ZW50IHx8ICcnO1xuICAgICAgdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZnVsbFRleHQpO1xuICAgICAgYXBwZW5kQ2hpbGROb2RlKHRleHROb2RlKTtcbiAgICAgIHJldHVybiBtZWFzdXJlVGV4dCh0ZXh0Tm9kZSwgZnVsbFRleHQpO1xuICAgIH0gLy8gTm90IGhhbmRsZSBvdGhlciB0eXBlIG9mIGNvbnRlbnRcbiAgICAvLyBQUzogVGhpcyBjb2RlIHNob3VsZCBub3QgYmUgYXR0YWNoZWQgYWZ0ZXIgcmVhY3QgMTZcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgIHJldHVybiB7XG4gICAgICBmaW5pc2hlZDogZmFsc2UsXG4gICAgICByZWFjdE5vZGU6IG51bGxcbiAgICB9O1xuICB9XG5cbiAgY2hpbGROb2Rlcy5zb21lKGZ1bmN0aW9uIChjaGlsZE5vZGUsIGluZGV4KSB7XG4gICAgdmFyIF9tZWFzdXJlTm9kZSA9IG1lYXN1cmVOb2RlKGNoaWxkTm9kZSwgaW5kZXgpLFxuICAgICAgICBmaW5pc2hlZCA9IF9tZWFzdXJlTm9kZS5maW5pc2hlZCxcbiAgICAgICAgcmVhY3ROb2RlID0gX21lYXN1cmVOb2RlLnJlYWN0Tm9kZTtcblxuICAgIGlmIChyZWFjdE5vZGUpIHtcbiAgICAgIGVsbGlwc2lzQ2hpbGRyZW4ucHVzaChyZWFjdE5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBmaW5pc2hlZDtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogZWxsaXBzaXNDaGlsZHJlbixcbiAgICB0ZXh0OiBlbGxpcHNpc0NvbnRhaW5lci5pbm5lckhUTUwsXG4gICAgZWxsaXBzaXM6IHRydWVcbiAgfTtcbn07XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1VwbG9hZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVXBsb2FkXCIpKTtcblxudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbnZhciBJbnRlcm5hbERyYWdnZXIgPSBmdW5jdGlvbiBJbnRlcm5hbERyYWdnZXIoX2EsIHJlZikge1xuICB2YXIgc3R5bGUgPSBfYS5zdHlsZSxcbiAgICAgIGhlaWdodCA9IF9hLmhlaWdodCxcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wic3R5bGVcIiwgXCJoZWlnaHRcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfVXBsb2FkW1wiZGVmYXVsdFwiXSwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICByZWY6IHJlZlxuICB9LCByZXN0UHJvcHMsIHtcbiAgICB0eXBlOiBcImRyYWdcIixcbiAgICBzdHlsZTogKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgc3R5bGUpLCB7XG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0pXG4gIH0pKTtcbn07XG5cbnZhciBEcmFnZ2VyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxEcmFnZ2VyKTtcbkRyYWdnZXIuZGlzcGxheU5hbWUgPSAnRHJhZ2dlcic7XG52YXIgX2RlZmF1bHQgPSBEcmFnZ2VyO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjVXBsb2FkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXBsb2FkXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfRHJhZ2dlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRHJhZ2dlclwiKSk7XG5cbnZhciBfVXBsb2FkTGlzdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVXBsb2FkTGlzdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcblxudmFyIF9Mb2NhbGVSZWNlaXZlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS1wcm92aWRlci9Mb2NhbGVSZWNlaXZlclwiKSk7XG5cbnZhciBfZGVmYXVsdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9sb2NhbGUvZGVmYXVsdFwiKSk7XG5cbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuXG52YXIgX2Rldldhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC9kZXZXYXJuaW5nXCIpKTtcblxudmFyIF91c2VGb3JjZVVwZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2hvb2tzL3VzZUZvcmNlVXBkYXRlXCIpKTtcblxudmFyIF91c2VGcmVzaFN0YXRlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXNlRnJlc2hTdGF0ZVwiKSk7XG5cbnZhciBJbnRlcm5hbFVwbG9hZCA9IGZ1bmN0aW9uIEludGVybmFsVXBsb2FkKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzMjtcblxuICB2YXIgZmlsZUxpc3RQcm9wID0gcHJvcHMuZmlsZUxpc3QsXG4gICAgICBkZWZhdWx0RmlsZUxpc3QgPSBwcm9wcy5kZWZhdWx0RmlsZUxpc3QsXG4gICAgICBvblJlbW92ZSA9IHByb3BzLm9uUmVtb3ZlLFxuICAgICAgc2hvd1VwbG9hZExpc3QgPSBwcm9wcy5zaG93VXBsb2FkTGlzdCxcbiAgICAgIGxpc3RUeXBlID0gcHJvcHMubGlzdFR5cGUsXG4gICAgICBvblByZXZpZXcgPSBwcm9wcy5vblByZXZpZXcsXG4gICAgICBvbkRvd25sb2FkID0gcHJvcHMub25Eb3dubG9hZCxcbiAgICAgIHByZXZpZXdGaWxlID0gcHJvcHMucHJldmlld0ZpbGUsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgcHJvcExvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICAgIGljb25SZW5kZXIgPSBwcm9wcy5pY29uUmVuZGVyLFxuICAgICAgaXNJbWFnZVVybCA9IHByb3BzLmlzSW1hZ2VVcmwsXG4gICAgICBwcm9ncmVzcyA9IHByb3BzLnByb2dyZXNzLFxuICAgICAgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoJ2Ryb3AnKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGRyYWdTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXREcmFnU3RhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBmb3JjZVVwZGF0ZSA9ICgwLCBfdXNlRm9yY2VVcGRhdGVbXCJkZWZhdWx0XCJdKSgpOyAvLyBSZWZyZXNoIGFsd2F5cyB1c2UgZnJlc2ggZGF0YVxuXG4gIHZhciBfdXNlRnJlc2hTdGF0ZSA9ICgwLCBfdXNlRnJlc2hTdGF0ZTNbXCJkZWZhdWx0XCJdKShmaWxlTGlzdFByb3AgfHwgZGVmYXVsdEZpbGVMaXN0IHx8IFtdLCBmaWxlTGlzdFByb3ApLFxuICAgICAgX3VzZUZyZXNoU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VGcmVzaFN0YXRlLCAyKSxcbiAgICAgIGdldEZpbGVMaXN0ID0gX3VzZUZyZXNoU3RhdGUyWzBdLFxuICAgICAgc2V0RmlsZUxpc3QgPSBfdXNlRnJlc2hTdGF0ZTJbMV07XG5cbiAgdmFyIHVwbG9hZCA9IFJlYWN0LnVzZVJlZigpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICgwLCBfZGV2V2FybmluZ1tcImRlZmF1bHRcIl0pKCdmaWxlTGlzdCcgaW4gcHJvcHMgfHwgISgndmFsdWUnIGluIHByb3BzKSwgJ1VwbG9hZCcsICdgdmFsdWVgIGlzIG5vdCBhIHZhbGlkIHByb3AsIGRvIHlvdSBtZWFuIGBmaWxlTGlzdGA/Jyk7XG4gIH0sIFtdKTtcblxuICB2YXIgb25DaGFuZ2UgPSBmdW5jdGlvbiBvbkNoYW5nZShpbmZvKSB7XG4gICAgc2V0RmlsZUxpc3QoaW5mby5maWxlTGlzdCk7XG4gICAgdmFyIG9uQ2hhbmdlUHJvcCA9IHByb3BzLm9uQ2hhbmdlO1xuXG4gICAgaWYgKG9uQ2hhbmdlUHJvcCkge1xuICAgICAgb25DaGFuZ2VQcm9wKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGluZm8pLCB7XG4gICAgICAgIGZpbGVMaXN0OiAoMCwgX3RvQ29uc3VtYWJsZUFycmF5MltcImRlZmF1bHRcIl0pKGluZm8uZmlsZUxpc3QpXG4gICAgICB9KSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvblN0YXJ0ID0gZnVuY3Rpb24gb25TdGFydChmaWxlKSB7XG4gICAgdmFyIHRhcmdldEl0ZW0gPSAoMCwgX3V0aWxzLmZpbGVUb09iamVjdCkoZmlsZSk7XG4gICAgdGFyZ2V0SXRlbS5zdGF0dXMgPSAndXBsb2FkaW5nJztcbiAgICB2YXIgbmV4dEZpbGVMaXN0ID0gZ2V0RmlsZUxpc3QoKS5jb25jYXQoKTtcbiAgICB2YXIgZmlsZUluZGV4ID0gbmV4dEZpbGVMaXN0LmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIHVpZCA9IF9yZWYudWlkO1xuICAgICAgcmV0dXJuIHVpZCA9PT0gdGFyZ2V0SXRlbS51aWQ7XG4gICAgfSk7XG5cbiAgICBpZiAoZmlsZUluZGV4ID09PSAtMSkge1xuICAgICAgbmV4dEZpbGVMaXN0LnB1c2godGFyZ2V0SXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRGaWxlTGlzdFtmaWxlSW5kZXhdID0gdGFyZ2V0SXRlbTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZSh7XG4gICAgICBmaWxlOiB0YXJnZXRJdGVtLFxuICAgICAgZmlsZUxpc3Q6IG5leHRGaWxlTGlzdFxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBvblN1Y2Nlc3MgPSBmdW5jdGlvbiBvblN1Y2Nlc3MocmVzcG9uc2UsIGZpbGUsIHhocikge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8qIGRvIG5vdGhpbmcgKi9cbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0SXRlbSA9ICgwLCBfdXRpbHMuZ2V0RmlsZUl0ZW0pKGZpbGUsIGdldEZpbGVMaXN0KCkpOyAvLyByZW1vdmVkXG5cbiAgICBpZiAoIXRhcmdldEl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0YXJnZXRJdGVtLnN0YXR1cyA9ICdkb25lJztcbiAgICB0YXJnZXRJdGVtLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGFyZ2V0SXRlbS54aHIgPSB4aHI7XG4gICAgb25DaGFuZ2Uoe1xuICAgICAgZmlsZTogKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCB0YXJnZXRJdGVtKSxcbiAgICAgIGZpbGVMaXN0OiBnZXRGaWxlTGlzdCgpLmNvbmNhdCgpXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIG9uUHJvZ3Jlc3MgPSBmdW5jdGlvbiBvblByb2dyZXNzKGUsIGZpbGUpIHtcbiAgICB2YXIgdGFyZ2V0SXRlbSA9ICgwLCBfdXRpbHMuZ2V0RmlsZUl0ZW0pKGZpbGUsIGdldEZpbGVMaXN0KCkpOyAvLyByZW1vdmVkXG5cbiAgICBpZiAoIXRhcmdldEl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0YXJnZXRJdGVtLnBlcmNlbnQgPSBlLnBlcmNlbnQ7XG4gICAgb25DaGFuZ2Uoe1xuICAgICAgZXZlbnQ6IGUsXG4gICAgICBmaWxlOiAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHRhcmdldEl0ZW0pLFxuICAgICAgZmlsZUxpc3Q6IGdldEZpbGVMaXN0KCkuY29uY2F0KClcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgb25FcnJvciA9IGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IsIHJlc3BvbnNlLCBmaWxlKSB7XG4gICAgdmFyIHRhcmdldEl0ZW0gPSAoMCwgX3V0aWxzLmdldEZpbGVJdGVtKShmaWxlLCBnZXRGaWxlTGlzdCgpKTsgLy8gcmVtb3ZlZFxuXG4gICAgaWYgKCF0YXJnZXRJdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGFyZ2V0SXRlbS5lcnJvciA9IGVycm9yO1xuICAgIHRhcmdldEl0ZW0ucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0YXJnZXRJdGVtLnN0YXR1cyA9ICdlcnJvcic7XG4gICAgb25DaGFuZ2Uoe1xuICAgICAgZmlsZTogKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHt9LCB0YXJnZXRJdGVtKSxcbiAgICAgIGZpbGVMaXN0OiBnZXRGaWxlTGlzdCgpLmNvbmNhdCgpXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGhhbmRsZVJlbW92ZSA9IGZ1bmN0aW9uIGhhbmRsZVJlbW92ZShmaWxlKSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHR5cGVvZiBvblJlbW92ZSA9PT0gJ2Z1bmN0aW9uJyA/IG9uUmVtb3ZlKGZpbGUpIDogb25SZW1vdmUpLnRoZW4oZnVuY3Rpb24gKHJldCkge1xuICAgICAgLy8gUHJldmVudCByZW1vdmluZyBmaWxlXG4gICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZW1vdmVkRmlsZUxpc3QgPSAoMCwgX3V0aWxzLnJlbW92ZUZpbGVJdGVtKShmaWxlLCBnZXRGaWxlTGlzdCgpKTtcblxuICAgICAgaWYgKHJlbW92ZWRGaWxlTGlzdCkge1xuICAgICAgICBmaWxlLnN0YXR1cyA9ICdyZW1vdmVkJztcblxuICAgICAgICBpZiAodXBsb2FkLmN1cnJlbnQpIHtcbiAgICAgICAgICB1cGxvYWQuY3VycmVudC5hYm9ydChmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uQ2hhbmdlKHtcbiAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgIGZpbGVMaXN0OiByZW1vdmVkRmlsZUxpc3RcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIG9uRmlsZURyb3AgPSBmdW5jdGlvbiBvbkZpbGVEcm9wKGUpIHtcbiAgICBzZXREcmFnU3RhdGUoZS50eXBlKTtcbiAgfTtcblxuICB2YXIgYmVmb3JlVXBsb2FkID0gZnVuY3Rpb24gYmVmb3JlVXBsb2FkKGZpbGUsIGZpbGVMaXN0QXJncykge1xuICAgIHZhciBiZWZvcmVVcGxvYWRQcm9wID0gcHJvcHMuYmVmb3JlVXBsb2FkO1xuXG4gICAgaWYgKCFiZWZvcmVVcGxvYWRQcm9wKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gYmVmb3JlVXBsb2FkUHJvcChmaWxlLCBmaWxlTGlzdEFyZ3MpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEdldCB1bmlxdWUgZmlsZSBsaXN0XG4gICAgICB2YXIgdW5pcXVlTGlzdCA9IFtdO1xuICAgICAgZ2V0RmlsZUxpc3QoKS5jb25jYXQoZmlsZUxpc3RBcmdzLm1hcChfdXRpbHMuZmlsZVRvT2JqZWN0KSkuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgICBpZiAodW5pcXVlTGlzdC5ldmVyeShmdW5jdGlvbiAodWYpIHtcbiAgICAgICAgICByZXR1cm4gdWYudWlkICE9PSBmLnVpZDtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICB1bmlxdWVMaXN0LnB1c2goZik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgb25DaGFuZ2Uoe1xuICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICBmaWxlTGlzdDogdW5pcXVlTGlzdFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAmJiByZXN1bHQudGhlbikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTsgLy8gVGVzdCBuZWVkc1xuXG5cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb25TdGFydDogb25TdGFydCxcbiAgICAgIG9uU3VjY2Vzczogb25TdWNjZXNzLFxuICAgICAgb25Qcm9ncmVzczogb25Qcm9ncmVzcyxcbiAgICAgIG9uRXJyb3I6IG9uRXJyb3IsXG4gICAgICBmaWxlTGlzdDogZ2V0RmlsZUxpc3QoKSxcbiAgICAgIHVwbG9hZDogdXBsb2FkLmN1cnJlbnQsXG4gICAgICBmb3JjZVVwZGF0ZTogZm9yY2VVcGRhdGVcbiAgICB9O1xuICB9KTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd1cGxvYWQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgcmNVcGxvYWRQcm9wcyA9ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe1xuICAgIG9uU3RhcnQ6IG9uU3RhcnQsXG4gICAgb25FcnJvcjogb25FcnJvcixcbiAgICBvblByb2dyZXNzOiBvblByb2dyZXNzLFxuICAgIG9uU3VjY2Vzczogb25TdWNjZXNzXG4gIH0sIHByb3BzKSwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGJlZm9yZVVwbG9hZDogYmVmb3JlVXBsb2FkXG4gIH0pO1xuICBkZWxldGUgcmNVcGxvYWRQcm9wcy5jbGFzc05hbWU7XG4gIGRlbGV0ZSByY1VwbG9hZFByb3BzLnN0eWxlOyAvLyBSZW1vdmUgaWQgdG8gYXZvaWQgb3BlbiBieSBsYWJlbCB3aGVuIHRyaWdnZXIgaXMgaGlkZGVuXG4gIC8vICFjaGlsZHJlbjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTQyOThcbiAgLy8gZGlzYWJsZWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE2NDc4XG4gIC8vICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNDE5N1xuXG4gIGlmICghY2hpbGRyZW4gfHwgZGlzYWJsZWQpIHtcbiAgICBkZWxldGUgcmNVcGxvYWRQcm9wcy5pZDtcbiAgfVxuXG4gIHZhciByZW5kZXJVcGxvYWRMaXN0ID0gZnVuY3Rpb24gcmVuZGVyVXBsb2FkTGlzdChidXR0b24pIHtcbiAgICByZXR1cm4gc2hvd1VwbG9hZExpc3QgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfTG9jYWxlUmVjZWl2ZXJbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBjb21wb25lbnROYW1lOiBcIlVwbG9hZFwiLFxuICAgICAgZGVmYXVsdExvY2FsZTogX2RlZmF1bHQyW1wiZGVmYXVsdFwiXS5VcGxvYWRcbiAgICB9LCBmdW5jdGlvbiAobG9jYWxlKSB7XG4gICAgICB2YXIgX3JlZjIgPSB0eXBlb2Ygc2hvd1VwbG9hZExpc3QgPT09ICdib29sZWFuJyA/IHt9IDogc2hvd1VwbG9hZExpc3QsXG4gICAgICAgICAgc2hvd1JlbW92ZUljb24gPSBfcmVmMi5zaG93UmVtb3ZlSWNvbixcbiAgICAgICAgICBzaG93UHJldmlld0ljb24gPSBfcmVmMi5zaG93UHJldmlld0ljb24sXG4gICAgICAgICAgc2hvd0Rvd25sb2FkSWNvbiA9IF9yZWYyLnNob3dEb3dubG9hZEljb24sXG4gICAgICAgICAgcmVtb3ZlSWNvbiA9IF9yZWYyLnJlbW92ZUljb24sXG4gICAgICAgICAgZG93bmxvYWRJY29uID0gX3JlZjIuZG93bmxvYWRJY29uO1xuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1VwbG9hZExpc3RbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgIGxpc3RUeXBlOiBsaXN0VHlwZSxcbiAgICAgICAgaXRlbXM6IGdldEZpbGVMaXN0KHRydWUpLFxuICAgICAgICBwcmV2aWV3RmlsZTogcHJldmlld0ZpbGUsXG4gICAgICAgIG9uUHJldmlldzogb25QcmV2aWV3LFxuICAgICAgICBvbkRvd25sb2FkOiBvbkRvd25sb2FkLFxuICAgICAgICBvblJlbW92ZTogaGFuZGxlUmVtb3ZlLFxuICAgICAgICBzaG93UmVtb3ZlSWNvbjogIWRpc2FibGVkICYmIHNob3dSZW1vdmVJY29uLFxuICAgICAgICBzaG93UHJldmlld0ljb246IHNob3dQcmV2aWV3SWNvbixcbiAgICAgICAgc2hvd0Rvd25sb2FkSWNvbjogc2hvd0Rvd25sb2FkSWNvbixcbiAgICAgICAgcmVtb3ZlSWNvbjogcmVtb3ZlSWNvbixcbiAgICAgICAgZG93bmxvYWRJY29uOiBkb3dubG9hZEljb24sXG4gICAgICAgIGljb25SZW5kZXI6IGljb25SZW5kZXIsXG4gICAgICAgIGxvY2FsZTogKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgbG9jYWxlKSwgcHJvcExvY2FsZSksXG4gICAgICAgIGlzSW1hZ2VVcmw6IGlzSW1hZ2VVcmwsXG4gICAgICAgIHByb2dyZXNzOiBwcm9ncmVzcyxcbiAgICAgICAgYXBwZW5kQWN0aW9uOiBidXR0b25cbiAgICAgIH0pO1xuICAgIH0pIDogYnV0dG9uO1xuICB9O1xuXG4gIGlmICh0eXBlID09PSAnZHJhZycpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICB2YXIgZHJhZ0NscyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJhZ1wiKSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJhZy11cGxvYWRpbmdcIiksIGdldEZpbGVMaXN0KCkuc29tZShmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgcmV0dXJuIGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJztcbiAgICB9KSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJhZy1ob3ZlclwiKSwgZHJhZ1N0YXRlID09PSAnZHJhZ292ZXInKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogZHJhZ0NscyxcbiAgICAgIG9uRHJvcDogb25GaWxlRHJvcCxcbiAgICAgIG9uRHJhZ092ZXI6IG9uRmlsZURyb3AsXG4gICAgICBvbkRyYWdMZWF2ZTogb25GaWxlRHJvcCxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1VwbG9hZFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcmNVcGxvYWRQcm9wcywge1xuICAgICAgcmVmOiB1cGxvYWQsXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYnRuXCIpXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kcmFnLWNvbnRhaW5lclwiKVxuICAgIH0sIGNoaWxkcmVuKSkpLCByZW5kZXJVcGxvYWRMaXN0KCkpO1xuICB9XG5cbiAgdmFyIHVwbG9hZEJ1dHRvbkNscyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKHByZWZpeENscywgKF9jbGFzc05hbWVzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3RcIiksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3QtXCIpLmNvbmNhdChsaXN0VHlwZSksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lczIpKTtcbiAgdmFyIHVwbG9hZEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHVwbG9hZEJ1dHRvbkNscyxcbiAgICBzdHlsZTogY2hpbGRyZW4gPyB1bmRlZmluZWQgOiB7XG4gICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY1VwbG9hZFtcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgcmNVcGxvYWRQcm9wcywge1xuICAgIHJlZjogdXBsb2FkXG4gIH0pKSk7XG5cbiAgaWYgKGxpc3RUeXBlID09PSAncGljdHVyZS1jYXJkJykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpY3R1cmUtY2FyZC13cmFwcGVyXCIpLCBjbGFzc05hbWUpXG4gICAgfSwgcmVuZGVyVXBsb2FkTGlzdCh1cGxvYWRCdXR0b24pKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0sIHVwbG9hZEJ1dHRvbiwgcmVuZGVyVXBsb2FkTGlzdCgpKTtcbn07XG5cbnZhciBVcGxvYWQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFVwbG9hZCk7XG5VcGxvYWQuRHJhZ2dlciA9IF9EcmFnZ2VyW1wiZGVmYXVsdFwiXTtcblVwbG9hZC5kaXNwbGF5TmFtZSA9ICdVcGxvYWQnO1xuVXBsb2FkLmRlZmF1bHRQcm9wcyA9IHtcbiAgdHlwZTogJ3NlbGVjdCcsXG4gIG11bHRpcGxlOiBmYWxzZSxcbiAgYWN0aW9uOiAnJyxcbiAgZGF0YToge30sXG4gIGFjY2VwdDogJycsXG4gIGJlZm9yZVVwbG9hZDogX3V0aWxzLlQsXG4gIHNob3dVcGxvYWRMaXN0OiB0cnVlLFxuICBsaXN0VHlwZTogJ3RleHQnLFxuICBjbGFzc05hbWU6ICcnLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIHN1cHBvcnRTZXJ2ZXJSZW5kZXI6IHRydWVcbn07XG52YXIgX2RlZmF1bHQgPSBVcGxvYWQ7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY0FuaW1hdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1hbmltYXRlXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfTG9hZGluZ091dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvTG9hZGluZ091dGxpbmVkXCIpKTtcblxudmFyIF9QYXBlckNsaXBPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1BhcGVyQ2xpcE91dGxpbmVkXCIpKTtcblxudmFyIF9QaWN0dXJlVHdvVG9uZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1BpY3R1cmVUd29Ub25lXCIpKTtcblxudmFyIF9GaWxlVHdvVG9uZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0ZpbGVUd29Ub25lXCIpKTtcblxudmFyIF9FeWVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0V5ZU91dGxpbmVkXCIpKTtcblxudmFyIF9EZWxldGVPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0RlbGV0ZU91dGxpbmVkXCIpKTtcblxudmFyIF9Eb3dubG9hZE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvRG93bmxvYWRPdXRsaW5lZFwiKSk7XG5cbnZhciBfcmVhY3ROb2RlID0gcmVxdWlyZShcIi4uL191dGlsL3JlYWN0Tm9kZVwiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG52YXIgX3Rvb2x0aXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi90b29sdGlwXCIpKTtcblxudmFyIF9wcm9ncmVzcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3Byb2dyZXNzXCIpKTtcblxudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIik7XG5cbnZhciBfYnV0dG9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vYnV0dG9uXCIpKTtcblxudmFyIF91c2VGb3JjZVVwZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2hvb2tzL3VzZUZvcmNlVXBkYXRlXCIpKTtcblxudmFyIEludGVybmFsVXBsb2FkTGlzdCA9IGZ1bmN0aW9uIEludGVybmFsVXBsb2FkTGlzdChfcmVmLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzNjtcblxuICB2YXIgbGlzdFR5cGUgPSBfcmVmLmxpc3RUeXBlLFxuICAgICAgcHJldmlld0ZpbGUgPSBfcmVmLnByZXZpZXdGaWxlLFxuICAgICAgb25QcmV2aWV3ID0gX3JlZi5vblByZXZpZXcsXG4gICAgICBvbkRvd25sb2FkID0gX3JlZi5vbkRvd25sb2FkLFxuICAgICAgb25SZW1vdmUgPSBfcmVmLm9uUmVtb3ZlLFxuICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICBpY29uUmVuZGVyID0gX3JlZi5pY29uUmVuZGVyLFxuICAgICAgaXNJbWdVcmwgPSBfcmVmLmlzSW1hZ2VVcmwsXG4gICAgICBjdXN0b21pemVQcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIF9yZWYkaXRlbXMgPSBfcmVmLml0ZW1zLFxuICAgICAgaXRlbXMgPSBfcmVmJGl0ZW1zID09PSB2b2lkIDAgPyBbXSA6IF9yZWYkaXRlbXMsXG4gICAgICBzaG93UHJldmlld0ljb24gPSBfcmVmLnNob3dQcmV2aWV3SWNvbixcbiAgICAgIHNob3dSZW1vdmVJY29uID0gX3JlZi5zaG93UmVtb3ZlSWNvbixcbiAgICAgIHNob3dEb3dubG9hZEljb24gPSBfcmVmLnNob3dEb3dubG9hZEljb24sXG4gICAgICBjdXN0b21SZW1vdmVJY29uID0gX3JlZi5yZW1vdmVJY29uLFxuICAgICAgY3VzdG9tRG93bmxvYWRJY29uID0gX3JlZi5kb3dubG9hZEljb24sXG4gICAgICBwcm9ncmVzc1Byb3BzID0gX3JlZi5wcm9ncmVzcyxcbiAgICAgIGFwcGVuZEFjdGlvbiA9IF9yZWYuYXBwZW5kQWN0aW9uO1xuICB2YXIgZm9yY2VVcGRhdGUgPSAoMCwgX3VzZUZvcmNlVXBkYXRlW1wiZGVmYXVsdFwiXSkoKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobGlzdFR5cGUgIT09ICdwaWN0dXJlJyAmJiBsaXN0VHlwZSAhPT0gJ3BpY3R1cmUtY2FyZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAoaXRlbXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cuRmlsZVJlYWRlciB8fCAhd2luZG93LkZpbGUgfHwgIShmaWxlLm9yaWdpbkZpbGVPYmogaW5zdGFuY2VvZiBGaWxlIHx8IGZpbGUub3JpZ2luRmlsZU9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8IGZpbGUudGh1bWJVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZpbGUudGh1bWJVcmwgPSAnJztcblxuICAgICAgaWYgKHByZXZpZXdGaWxlKSB7XG4gICAgICAgIHByZXZpZXdGaWxlKGZpbGUub3JpZ2luRmlsZU9iaikudGhlbihmdW5jdGlvbiAocHJldmlld0RhdGFVcmwpIHtcbiAgICAgICAgICAvLyBOZWVkIGFwcGVuZCAnJyB0byBhdm9pZCBkZWFkIGxvb3BcbiAgICAgICAgICBmaWxlLnRodW1iVXJsID0gcHJldmlld0RhdGFVcmwgfHwgJyc7XG4gICAgICAgICAgZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtsaXN0VHlwZSwgaXRlbXMsIHByZXZpZXdGaWxlXSk7XG5cbiAgdmFyIGhhbmRsZVByZXZpZXcgPSBmdW5jdGlvbiBoYW5kbGVQcmV2aWV3KGZpbGUsIGUpIHtcbiAgICBpZiAoIW9uUHJldmlldykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICByZXR1cm4gb25QcmV2aWV3KGZpbGUpO1xuICB9O1xuXG4gIHZhciBoYW5kbGVEb3dubG9hZCA9IGZ1bmN0aW9uIGhhbmRsZURvd25sb2FkKGZpbGUpIHtcbiAgICBpZiAodHlwZW9mIG9uRG93bmxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9uRG93bmxvYWQoZmlsZSk7XG4gICAgfSBlbHNlIGlmIChmaWxlLnVybCkge1xuICAgICAgd2luZG93Lm9wZW4oZmlsZS51cmwpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaGFuZGxlQ2xvc2UgPSBmdW5jdGlvbiBoYW5kbGVDbG9zZShmaWxlKSB7XG4gICAgaWYgKG9uUmVtb3ZlKSB7XG4gICAgICBvblJlbW92ZShmaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUljb25SZW5kZXIgPSBmdW5jdGlvbiBoYW5kbGVJY29uUmVuZGVyKGZpbGUpIHtcbiAgICBpZiAoaWNvblJlbmRlcikge1xuICAgICAgcmV0dXJuIGljb25SZW5kZXIoZmlsZSwgbGlzdFR5cGUpO1xuICAgIH1cblxuICAgIHZhciBpc0xvYWRpbmcgPSBmaWxlLnN0YXR1cyA9PT0gJ3VwbG9hZGluZyc7XG4gICAgdmFyIGZpbGVJY29uID0gaXNJbWdVcmwgJiYgaXNJbWdVcmwoZmlsZSkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUGljdHVyZVR3b1RvbmVbXCJkZWZhdWx0XCJdLCBudWxsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9GaWxlVHdvVG9uZVtcImRlZmF1bHRcIl0sIG51bGwpO1xuICAgIHZhciBpY29uID0gaXNMb2FkaW5nID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0xvYWRpbmdPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1BhcGVyQ2xpcE91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCk7XG5cbiAgICBpZiAobGlzdFR5cGUgPT09ICdwaWN0dXJlJykge1xuICAgICAgaWNvbiA9IGlzTG9hZGluZyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Mb2FkaW5nT3V0bGluZWRbXCJkZWZhdWx0XCJdLCBudWxsKSA6IGZpbGVJY29uO1xuICAgIH0gZWxzZSBpZiAobGlzdFR5cGUgPT09ICdwaWN0dXJlLWNhcmQnKSB7XG4gICAgICBpY29uID0gaXNMb2FkaW5nID8gbG9jYWxlLnVwbG9hZGluZyA6IGZpbGVJY29uO1xuICAgIH1cblxuICAgIHJldHVybiBpY29uO1xuICB9O1xuXG4gIHZhciBoYW5kbGVBY3Rpb25JY29uUmVuZGVyID0gZnVuY3Rpb24gaGFuZGxlQWN0aW9uSWNvblJlbmRlcihjdXN0b21JY29uLCBjYWxsYmFjaywgcHJlZml4Q2xzLCB0aXRsZSkge1xuICAgIHZhciBidG5Qcm9wcyA9IHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgY2FsbGJhY2soKTtcblxuICAgICAgICBpZiAoKDAsIF9yZWFjdE5vZGUuaXNWYWxpZEVsZW1lbnQpKGN1c3RvbUljb24pICYmIGN1c3RvbUljb24ucHJvcHMub25DbGljaykge1xuICAgICAgICAgIGN1c3RvbUljb24ucHJvcHMub25DbGljayhlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW0tY2FyZC1hY3Rpb25zLWJ0blwiKVxuICAgIH07XG5cbiAgICBpZiAoKDAsIF9yZWFjdE5vZGUuaXNWYWxpZEVsZW1lbnQpKGN1c3RvbUljb24pKSB7XG4gICAgICB2YXIgYnRuSWNvbiA9ICgwLCBfcmVhY3ROb2RlLmNsb25lRWxlbWVudCkoY3VzdG9tSWNvbiwgKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKCgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgY3VzdG9tSWNvbi5wcm9wcyksIHtcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHt9XG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2J1dHRvbltcImRlZmF1bHRcIl0sICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgYnRuUHJvcHMsIHtcbiAgICAgICAgaWNvbjogYnRuSWNvblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uW1wiZGVmYXVsdFwiXSwgYnRuUHJvcHMsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjdXN0b21JY29uKSk7XG4gIH07IC8vIFRlc3QgbmVlZHNcblxuXG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhbmRsZVByZXZpZXc6IGhhbmRsZVByZXZpZXcsXG4gICAgICBoYW5kbGVEb3dubG9hZDogaGFuZGxlRG93bmxvYWRcbiAgICB9O1xuICB9KTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KSxcbiAgICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd1cGxvYWQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgbGlzdCA9IGl0ZW1zLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgIHZhciBfY2xhc3NOYW1lczMsIF9jbGFzc05hbWVzNDtcblxuICAgIHZhciBwcm9ncmVzcztcbiAgICB2YXIgaWNvbk5vZGUgPSBoYW5kbGVJY29uUmVuZGVyKGZpbGUpO1xuICAgIHZhciBpY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRleHQtaWNvblwiKVxuICAgIH0sIGljb25Ob2RlKTtcblxuICAgIGlmIChsaXN0VHlwZSA9PT0gJ3BpY3R1cmUnIHx8IGxpc3RUeXBlID09PSAncGljdHVyZS1jYXJkJykge1xuICAgICAgaWYgKGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJyB8fCAhZmlsZS50aHVtYlVybCAmJiAhZmlsZS51cmwpIHtcbiAgICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICAgIHZhciB1cGxvYWRpbmdDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW0tdGh1bWJuYWlsXCIpLCB0cnVlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW0tZmlsZVwiKSwgZmlsZS5zdGF0dXMgIT09ICd1cGxvYWRpbmcnKSwgX2NsYXNzTmFtZXMpKTtcbiAgICAgICAgaWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IHVwbG9hZGluZ0NsYXNzTmFtZVxuICAgICAgICB9LCBpY29uTm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX2NsYXNzTmFtZXMyO1xuXG4gICAgICAgIHZhciB0aHVtYm5haWwgPSBpc0ltZ1VybCAmJiBpc0ltZ1VybChmaWxlKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgICBzcmM6IGZpbGUudGh1bWJVcmwgfHwgZmlsZS51cmwsXG4gICAgICAgICAgYWx0OiBmaWxlLm5hbWUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS1pbWFnZVwiKVxuICAgICAgICB9KSA6IGljb25Ob2RlO1xuICAgICAgICB2YXIgYUNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKChfY2xhc3NOYW1lczIgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdC1pdGVtLXRodW1ibmFpbFwiKSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS1maWxlXCIpLCBpc0ltZ1VybCAmJiAhaXNJbWdVcmwoZmlsZSkpLCBfY2xhc3NOYW1lczIpKTtcbiAgICAgICAgaWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBhQ2xhc3NOYW1lLFxuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVByZXZpZXcoZmlsZSwgZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBocmVmOiBmaWxlLnVybCB8fCBmaWxlLnRodW1iVXJsLFxuICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgICByZWw6IFwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgIH0sIHRodW1ibmFpbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJykge1xuICAgICAgLy8gc2hvdyBsb2FkaW5nIGljb24gaWYgdXBsb2FkIHByb2dyZXNzIGxpc3RlbmVyIGlzIGRpc2FibGVkXG4gICAgICB2YXIgbG9hZGluZ1Byb2dyZXNzID0gJ3BlcmNlbnQnIGluIGZpbGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcHJvZ3Jlc3NbXCJkZWZhdWx0XCJdLCAoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIHByb2dyZXNzUHJvcHMsIHtcbiAgICAgICAgdHlwZTogXCJsaW5lXCIsXG4gICAgICAgIHBlcmNlbnQ6IGZpbGUucGVyY2VudFxuICAgICAgfSkpIDogbnVsbDtcbiAgICAgIHByb2dyZXNzID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdC1pdGVtLXByb2dyZXNzXCIpLFxuICAgICAgICBrZXk6IFwicHJvZ3Jlc3NcIlxuICAgICAgfSwgbG9hZGluZ1Byb2dyZXNzKTtcbiAgICB9XG5cbiAgICB2YXIgaW5mb1VwbG9hZGluZ0NsYXNzID0gKDAsIF9jbGFzc25hbWVzW1wiZGVmYXVsdFwiXSkoKF9jbGFzc05hbWVzMyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW1cIiksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW0tXCIpLmNvbmNhdChmaWxlLnN0YXR1cyksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW0tbGlzdC10eXBlLVwiKS5jb25jYXQobGlzdFR5cGUpLCB0cnVlKSwgX2NsYXNzTmFtZXMzKSk7XG4gICAgdmFyIGxpbmtQcm9wcyA9IHR5cGVvZiBmaWxlLmxpbmtQcm9wcyA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGZpbGUubGlua1Byb3BzKSA6IGZpbGUubGlua1Byb3BzO1xuICAgIHZhciByZW1vdmVJY29uID0gc2hvd1JlbW92ZUljb24gPyBoYW5kbGVBY3Rpb25JY29uUmVuZGVyKGN1c3RvbVJlbW92ZUljb24gfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0RlbGV0ZU91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBoYW5kbGVDbG9zZShmaWxlKTtcbiAgICB9LCBwcmVmaXhDbHMsIGxvY2FsZS5yZW1vdmVGaWxlKSA6IG51bGw7XG4gICAgdmFyIGRvd25sb2FkSWNvbiA9IHNob3dEb3dubG9hZEljb24gJiYgZmlsZS5zdGF0dXMgPT09ICdkb25lJyA/IGhhbmRsZUFjdGlvbkljb25SZW5kZXIoY3VzdG9tRG93bmxvYWRJY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Eb3dubG9hZE91dGxpbmVkW1wiZGVmYXVsdFwiXSwgbnVsbCksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBoYW5kbGVEb3dubG9hZChmaWxlKTtcbiAgICB9LCBwcmVmaXhDbHMsIGxvY2FsZS5kb3dubG9hZEZpbGUpIDogbnVsbDtcbiAgICB2YXIgZG93bmxvYWRPckRlbGV0ZSA9IGxpc3RUeXBlICE9PSAncGljdHVyZS1jYXJkJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAga2V5OiBcImRvd25sb2FkLWRlbGV0ZVwiLFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS1jYXJkLWFjdGlvbnMgXCIpLmNvbmNhdChsaXN0VHlwZSA9PT0gJ3BpY3R1cmUnID8gJ3BpY3R1cmUnIDogJycpXG4gICAgfSwgZG93bmxvYWRJY29uLCByZW1vdmVJY29uKTtcbiAgICB2YXIgbGlzdEl0ZW1OYW1lQ2xhc3MgPSAoMCwgX2NsYXNzbmFtZXNbXCJkZWZhdWx0XCJdKSgoX2NsYXNzTmFtZXM0ID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXM0LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS1uYW1lXCIpLCB0cnVlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdC1pdGVtLW5hbWUtaWNvbi1jb3VudC1cIikuY29uY2F0KFtkb3dubG9hZEljb24sIHJlbW92ZUljb25dLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfSkubGVuZ3RoKSwgdHJ1ZSksIF9jbGFzc05hbWVzNCkpO1xuICAgIHZhciBwcmV2aWV3ID0gZmlsZS51cmwgPyBbLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBrZXk6IFwidmlld1wiLFxuICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgcmVsOiBcIm5vb3BlbmVyIG5vcmVmZXJyZXJcIixcbiAgICAgIGNsYXNzTmFtZTogbGlzdEl0ZW1OYW1lQ2xhc3MsXG4gICAgICB0aXRsZTogZmlsZS5uYW1lXG4gICAgfSwgbGlua1Byb3BzLCB7XG4gICAgICBocmVmOiBmaWxlLnVybCxcbiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICByZXR1cm4gaGFuZGxlUHJldmlldyhmaWxlLCBlKTtcbiAgICAgIH1cbiAgICB9KSwgZmlsZS5uYW1lKSwgZG93bmxvYWRPckRlbGV0ZV0gOiBbLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGtleTogXCJ2aWV3XCIsXG4gICAgICBjbGFzc05hbWU6IGxpc3RJdGVtTmFtZUNsYXNzLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVQcmV2aWV3KGZpbGUsIGUpO1xuICAgICAgfSxcbiAgICAgIHRpdGxlOiBmaWxlLm5hbWVcbiAgICB9LCBmaWxlLm5hbWUpLCBkb3dubG9hZE9yRGVsZXRlXTtcbiAgICB2YXIgc3R5bGUgPSB7XG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICBvcGFjaXR5OiAwLjVcbiAgICB9O1xuICAgIHZhciBwcmV2aWV3SWNvbiA9IHNob3dQcmV2aWV3SWNvbiA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICBocmVmOiBmaWxlLnVybCB8fCBmaWxlLnRodW1iVXJsLFxuICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgcmVsOiBcIm5vb3BlbmVyIG5vcmVmZXJyZXJcIixcbiAgICAgIHN0eWxlOiBmaWxlLnVybCB8fCBmaWxlLnRodW1iVXJsID8gdW5kZWZpbmVkIDogc3R5bGUsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVByZXZpZXcoZmlsZSwgZSk7XG4gICAgICB9LFxuICAgICAgdGl0bGU6IGxvY2FsZS5wcmV2aWV3RmlsZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9FeWVPdXRsaW5lZFtcImRlZmF1bHRcIl0sIG51bGwpKSA6IG51bGw7XG4gICAgdmFyIGFjdGlvbnMgPSBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcgJiYgZmlsZS5zdGF0dXMgIT09ICd1cGxvYWRpbmcnICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdC1pdGVtLWFjdGlvbnNcIilcbiAgICB9LCBwcmV2aWV3SWNvbiwgZmlsZS5zdGF0dXMgPT09ICdkb25lJyAmJiBkb3dubG9hZEljb24sIHJlbW92ZUljb24pO1xuICAgIHZhciBtZXNzYWdlO1xuXG4gICAgaWYgKGZpbGUucmVzcG9uc2UgJiYgdHlwZW9mIGZpbGUucmVzcG9uc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlID0gZmlsZS5yZXNwb25zZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZSA9IGZpbGUuZXJyb3IgJiYgZmlsZS5lcnJvci5zdGF0dXNUZXh0IHx8IGxvY2FsZS51cGxvYWRFcnJvcjtcbiAgICB9XG5cbiAgICB2YXIgaWNvbkFuZFByZXZpZXcgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgaWNvbiwgcHJldmlldyk7XG4gICAgdmFyIGRvbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogaW5mb1VwbG9hZGluZ0NsYXNzXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS1pbmZvXCIpXG4gICAgfSwgaWNvbkFuZFByZXZpZXcpLCBhY3Rpb25zLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcmNBbmltYXRlW1wiZGVmYXVsdFwiXSwge1xuICAgICAgdHJhbnNpdGlvbk5hbWU6IFwiZmFkZVwiLFxuICAgICAgY29tcG9uZW50OiBcIlwiXG4gICAgfSwgcHJvZ3Jlc3MpKTtcbiAgICB2YXIgbGlzdENvbnRhaW5lck5hbWVDbGFzcyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKCgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdC1waWN0dXJlLWNhcmQtY29udGFpbmVyXCIpLCBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcpKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAga2V5OiBmaWxlLnVpZCxcbiAgICAgIGNsYXNzTmFtZTogbGlzdENvbnRhaW5lck5hbWVDbGFzc1xuICAgIH0sIGZpbGUuc3RhdHVzID09PSAnZXJyb3InID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3Rvb2x0aXBbXCJkZWZhdWx0XCJdLCB7XG4gICAgICB0aXRsZTogbWVzc2FnZSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBmdW5jdGlvbiBnZXRQb3B1cENvbnRhaW5lcihub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgfSwgZG9tKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBkb20pKTtcbiAgfSk7XG4gIHZhciBsaXN0Q2xhc3NOYW1lcyA9ICgwLCBfY2xhc3NuYW1lc1tcImRlZmF1bHRcIl0pKChfY2xhc3NOYW1lczYgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKShfY2xhc3NOYW1lczYsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdFwiKSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkoX2NsYXNzTmFtZXM2LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtXCIpLmNvbmNhdChsaXN0VHlwZSksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKF9jbGFzc05hbWVzNiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzNikpO1xuICB2YXIgYW5pbWF0aW9uRGlyZWN0aW9uID0gbGlzdFR5cGUgPT09ICdwaWN0dXJlLWNhcmQnID8gJ2FuaW1hdGUtaW5saW5lJyA6ICdhbmltYXRlJztcbiAgdmFyIHRyYW5zaXRpb25OYW1lID0gbGlzdC5sZW5ndGggPT09IDAgPyAnJyA6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChhbmltYXRpb25EaXJlY3Rpb24pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjQW5pbWF0ZVtcImRlZmF1bHRcIl0sIHtcbiAgICB0cmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgY29tcG9uZW50OiBcImRpdlwiLFxuICAgIGNsYXNzTmFtZTogbGlzdENsYXNzTmFtZXNcbiAgfSwgbGlzdCwgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGFwcGVuZEFjdGlvbikgPyAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGFwcGVuZEFjdGlvbiwge1xuICAgIGtleTogJ2FwcGVuZEFjdGlvbidcbiAgfSkgOiBhcHBlbmRBY3Rpb24pO1xufTtcblxudmFyIFVwbG9hZExpc3QgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFVwbG9hZExpc3QpO1xuVXBsb2FkTGlzdC5kaXNwbGF5TmFtZSA9ICdVcGxvYWRMaXN0JztcblVwbG9hZExpc3QuZGVmYXVsdFByb3BzID0ge1xuICBsaXN0VHlwZTogJ3RleHQnLFxuICBwcm9ncmVzczoge1xuICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgIHNob3dJbmZvOiBmYWxzZVxuICB9LFxuICBzaG93UmVtb3ZlSWNvbjogdHJ1ZSxcbiAgc2hvd0Rvd25sb2FkSWNvbjogZmFsc2UsXG4gIHNob3dQcmV2aWV3SWNvbjogdHJ1ZSxcbiAgcHJldmlld0ZpbGU6IF91dGlscy5wcmV2aWV3SW1hZ2UsXG4gIGlzSW1hZ2VVcmw6IF91dGlscy5pc0ltYWdlVXJsXG59O1xudmFyIF9kZWZhdWx0ID0gVXBsb2FkTGlzdDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfVXBsb2FkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9VcGxvYWRcIikpO1xuXG52YXIgX0RyYWdnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0RyYWdnZXJcIikpO1xuXG5fVXBsb2FkW1wiZGVmYXVsdFwiXS5EcmFnZ2VyID0gX0RyYWdnZXJbXCJkZWZhdWx0XCJdO1xudmFyIF9kZWZhdWx0ID0gX1VwbG9hZFtcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdXNlRnJlc2hTdGF0ZTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yYWZcIikpO1xuXG52YXIgX3VzZUZvcmNlVXBkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvaG9va3MvdXNlRm9yY2VVcGRhdGVcIikpO1xuXG4vLyBOb3RlLiBPbmx5IGZvciB1cGxvYWQgdXNhZ2UuIERvIG5vdCBleHBvcnQgdG8gZ2xvYmFsIHV0aWwgaG9va3NcbmZ1bmN0aW9uIHVzZUZyZXNoU3RhdGUoZGVmYXVsdFZhbHVlLCBwcm9wVmFsdWUpIHtcbiAgdmFyIHZhbHVlUmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKGRlZmF1bHRWYWx1ZSk7XG4gIHZhciBmb3JjZVVwZGF0ZSA9ICgwLCBfdXNlRm9yY2VVcGRhdGVbXCJkZWZhdWx0XCJdKSgpO1xuICB2YXIgcmFmUmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKCk7IC8vIFNldCB2YWx1ZVxuXG4gIGZ1bmN0aW9uIHNldFZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgdmFsdWVSZWYuY3VycmVudCA9IG5ld1ZhbHVlO1xuICAgIGZvcmNlVXBkYXRlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhblVwKCkge1xuICAgIF9yYWZbXCJkZWZhdWx0XCJdLmNhbmNlbChyYWZSZWYuY3VycmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiByYWZTeW5jVmFsdWUobmV3VmFsdWUpIHtcbiAgICBjbGVhblVwKCk7XG4gICAgcmFmUmVmLmN1cnJlbnQgPSAoMCwgX3JhZltcImRlZmF1bHRcIl0pKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgfSAvLyBHZXQgdmFsdWVcblxuXG4gIGZ1bmN0aW9uIGdldFZhbHVlKCkge1xuICAgIHZhciBkaXNwbGF5VmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuXG4gICAgaWYgKGRpc3BsYXlWYWx1ZSkge1xuICAgICAgcmV0dXJuIHByb3BWYWx1ZSB8fCB2YWx1ZVJlZi5jdXJyZW50O1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVJlZi5jdXJyZW50O1xuICB9IC8vIEVmZmVjdCB3aWxsIGFsd2F5cyB1cGRhdGUgaW4gYSBuZXh0IGZyYW1lIHRvIGF2b2lkIHN5bmMgc3RhdGUgb3ZlcndyaXRlIGN1cnJlbnQgcHJvY2Vzc2luZyBzdGF0ZVxuXG5cbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvcFZhbHVlKSB7XG4gICAgICByYWZTeW5jVmFsdWUocHJvcFZhbHVlKTtcbiAgICB9XG4gIH0sIFtwcm9wVmFsdWVdKTsgLy8gQ2xlYW4gdXBcblxuICAoMCwgX3JlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhblVwKCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW2dldFZhbHVlLCBzZXRWYWx1ZV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5UID0gVDtcbmV4cG9ydHMuZmlsZVRvT2JqZWN0ID0gZmlsZVRvT2JqZWN0O1xuZXhwb3J0cy5nZXRGaWxlSXRlbSA9IGdldEZpbGVJdGVtO1xuZXhwb3J0cy5yZW1vdmVGaWxlSXRlbSA9IHJlbW92ZUZpbGVJdGVtO1xuZXhwb3J0cy5wcmV2aWV3SW1hZ2UgPSBwcmV2aWV3SW1hZ2U7XG5leHBvcnRzLmlzSW1hZ2VVcmwgPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG5mdW5jdGlvbiBUKCkge1xuICByZXR1cm4gdHJ1ZTtcbn0gLy8gRml4IElFIGZpbGUuc3RhdHVzIHByb2JsZW1cbi8vIHZpYSBjb3BpbmcgYSBuZXcgT2JqZWN0XG5cblxuZnVuY3Rpb24gZmlsZVRvT2JqZWN0KGZpbGUpIHtcbiAgcmV0dXJuICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSgoMCwgX2V4dGVuZHMyW1wiZGVmYXVsdFwiXSkoe30sIGZpbGUpLCB7XG4gICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcbiAgICBsYXN0TW9kaWZpZWREYXRlOiBmaWxlLmxhc3RNb2RpZmllZERhdGUsXG4gICAgbmFtZTogZmlsZS5uYW1lLFxuICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgdWlkOiBmaWxlLnVpZCxcbiAgICBwZXJjZW50OiAwLFxuICAgIG9yaWdpbkZpbGVPYmo6IGZpbGVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGVJdGVtKGZpbGUsIGZpbGVMaXN0KSB7XG4gIHZhciBtYXRjaEtleSA9IGZpbGUudWlkICE9PSB1bmRlZmluZWQgPyAndWlkJyA6ICduYW1lJztcbiAgcmV0dXJuIGZpbGVMaXN0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBpdGVtW21hdGNoS2V5XSA9PT0gZmlsZVttYXRjaEtleV07XG4gIH0pWzBdO1xufVxuXG5mdW5jdGlvbiByZW1vdmVGaWxlSXRlbShmaWxlLCBmaWxlTGlzdCkge1xuICB2YXIgbWF0Y2hLZXkgPSBmaWxlLnVpZCAhPT0gdW5kZWZpbmVkID8gJ3VpZCcgOiAnbmFtZSc7XG4gIHZhciByZW1vdmVkID0gZmlsZUxpc3QuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW1bbWF0Y2hLZXldICE9PSBmaWxlW21hdGNoS2V5XTtcbiAgfSk7XG5cbiAgaWYgKHJlbW92ZWQubGVuZ3RoID09PSBmaWxlTGlzdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiByZW1vdmVkO1xufSAvLyA9PT09PT09PT09PT09PT09PT09PSBEZWZhdWx0IEltYWdlIFByZXZpZXcgPT09PT09PT09PT09PT09PT09PT1cblxuXG52YXIgZXh0bmFtZSA9IGZ1bmN0aW9uIGV4dG5hbWUoKSB7XG4gIHZhciB1cmwgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICB2YXIgdGVtcCA9IHVybC5zcGxpdCgnLycpO1xuICB2YXIgZmlsZW5hbWUgPSB0ZW1wW3RlbXAubGVuZ3RoIC0gMV07XG4gIHZhciBmaWxlbmFtZVdpdGhvdXRTdWZmaXggPSBmaWxlbmFtZS5zcGxpdCgvI3xcXD8vKVswXTtcbiAgcmV0dXJuICgvXFwuW14uL1xcXFxdKiQvLmV4ZWMoZmlsZW5hbWVXaXRob3V0U3VmZml4KSB8fCBbJyddKVswXTtcbn07XG5cbnZhciBpc0ltYWdlRmlsZVR5cGUgPSBmdW5jdGlvbiBpc0ltYWdlRmlsZVR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZS5pbmRleE9mKCdpbWFnZS8nKSA9PT0gMDtcbn07XG5cbnZhciBpc0ltYWdlVXJsID0gZnVuY3Rpb24gaXNJbWFnZVVybChmaWxlKSB7XG4gIGlmIChmaWxlLnR5cGUgJiYgIWZpbGUudGh1bWJVcmwpIHtcbiAgICByZXR1cm4gaXNJbWFnZUZpbGVUeXBlKGZpbGUudHlwZSk7XG4gIH1cblxuICB2YXIgdXJsID0gZmlsZS50aHVtYlVybCB8fCBmaWxlLnVybDtcbiAgdmFyIGV4dGVuc2lvbiA9IGV4dG5hbWUodXJsKTtcblxuICBpZiAoL15kYXRhOmltYWdlXFwvLy50ZXN0KHVybCkgfHwgLyh3ZWJwfHN2Z3xwbmd8Z2lmfGpwZ3xqcGVnfGpmaWZ8Ym1wfGRwZ3xpY28pJC9pLnRlc3QoZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKC9eZGF0YTovLnRlc3QodXJsKSkge1xuICAgIC8vIG90aGVyIGZpbGUgdHlwZXMgb2YgYmFzZTY0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGV4dGVuc2lvbikge1xuICAgIC8vIG90aGVyIGZpbGUgdHlwZXMgd2hpY2ggaGF2ZSBleHRlbnNpb25cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydHMuaXNJbWFnZVVybCA9IGlzSW1hZ2VVcmw7XG52YXIgTUVBU1VSRV9TSVpFID0gMjAwO1xuXG5mdW5jdGlvbiBwcmV2aWV3SW1hZ2UoZmlsZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICBpZiAoIWZpbGUudHlwZSB8fCAhaXNJbWFnZUZpbGVUeXBlKGZpbGUudHlwZSkpIHtcbiAgICAgIHJlc29sdmUoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBNRUFTVVJFX1NJWkU7XG4gICAgY2FudmFzLmhlaWdodCA9IE1FQVNVUkVfU0laRTtcbiAgICBjYW52YXMuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246IGZpeGVkOyBsZWZ0OiAwOyB0b3A6IDA7IHdpZHRoOiBcIi5jb25jYXQoTUVBU1VSRV9TSVpFLCBcInB4OyBoZWlnaHQ6IFwiKS5jb25jYXQoTUVBU1VSRV9TSVpFLCBcInB4OyB6LWluZGV4OiA5OTk5OyBkaXNwbGF5OiBub25lO1wiKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcblxuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgd2lkdGggPSBpbWcud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gaW1nLmhlaWdodDtcbiAgICAgIHZhciBkcmF3V2lkdGggPSBNRUFTVVJFX1NJWkU7XG4gICAgICB2YXIgZHJhd0hlaWdodCA9IE1FQVNVUkVfU0laRTtcbiAgICAgIHZhciBvZmZzZXRYID0gMDtcbiAgICAgIHZhciBvZmZzZXRZID0gMDtcblxuICAgICAgaWYgKHdpZHRoIDwgaGVpZ2h0KSB7XG4gICAgICAgIGRyYXdIZWlnaHQgPSBoZWlnaHQgKiAoTUVBU1VSRV9TSVpFIC8gd2lkdGgpO1xuICAgICAgICBvZmZzZXRZID0gLShkcmF3SGVpZ2h0IC0gZHJhd1dpZHRoKSAvIDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmF3V2lkdGggPSB3aWR0aCAqIChNRUFTVVJFX1NJWkUgLyBoZWlnaHQpO1xuICAgICAgICBvZmZzZXRYID0gLShkcmF3V2lkdGggLSBkcmF3SGVpZ2h0KSAvIDI7XG4gICAgICB9XG5cbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCBvZmZzZXRYLCBvZmZzZXRZLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQpO1xuICAgICAgdmFyIGRhdGFVUkwgPSBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGNhbnZhcyk7XG4gICAgICByZXNvbHZlKGRhdGFVUkwpO1xuICAgIH07XG5cbiAgICBpbWcuc3JjID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XG4gIH0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3ZlcnNpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3ZlcnNpb25cIikpO1xuXG4vKiBlc2xpbnQgaW1wb3J0L25vLXVucmVzb2x2ZWQ6IDAgKi9cbi8vIEB0cy1pZ25vcmVcbnZhciBfZGVmYXVsdCA9IF92ZXJzaW9uW1wiZGVmYXVsdFwiXTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcbnZhciBfZGVmYXVsdCA9ICc0LjYuNic7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5hcnJheVRyZWVGaWx0ZXIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFycmF5VHJlZUZpbHRlcihkYXRhLCBmaWx0ZXJGbiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuY2hpbGRyZW5LZXlOYW1lID0gb3B0aW9ucy5jaGlsZHJlbktleU5hbWUgfHwgXCJjaGlsZHJlblwiO1xuICAgIHZhciBjaGlsZHJlbiA9IGRhdGEgfHwgW107XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBsZXZlbCA9IDA7XG4gICAgZG8ge1xuICAgICAgICB2YXIgZm91bmRJdGVtID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyRm4oaXRlbSwgbGV2ZWwpO1xuICAgICAgICB9KVswXTtcbiAgICAgICAgaWYgKCFmb3VuZEl0ZW0pIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKGZvdW5kSXRlbSk7XG4gICAgICAgIGNoaWxkcmVuID0gZm91bmRJdGVtW29wdGlvbnMuY2hpbGRyZW5LZXlOYW1lXSB8fCBbXTtcbiAgICAgICAgbGV2ZWwgKz0gMTtcbiAgICB9IHdoaWxlIChjaGlsZHJlbi5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5yZXR1cm4gYXJyYXlUcmVlRmlsdGVyO1xuXG59KSkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gIGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3Q7XG4gIH0gZWxzZSB7XG4gICAgX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBGdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCwgYSk7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgIGlmIChDbGFzcykgX3NldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVGdW5jdGlvbihmbikge1xuICByZXR1cm4gRnVuY3Rpb24udG9TdHJpbmcuY2FsbChmbikuaW5kZXhPZihcIltuYXRpdmUgY29kZV1cIikgIT09IC0xO1xufVxuXG5mdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gIHZhciBfY2FjaGUgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgPyBuZXcgTWFwKCkgOiB1bmRlZmluZWQ7XG5cbiAgX3dyYXBOYXRpdmVTdXBlciA9IGZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgICBpZiAoQ2xhc3MgPT09IG51bGwgfHwgIV9pc05hdGl2ZUZ1bmN0aW9uKENsYXNzKSkgcmV0dXJuIENsYXNzO1xuXG4gICAgaWYgKHR5cGVvZiBDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBfY2FjaGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChfY2FjaGUuaGFzKENsYXNzKSkgcmV0dXJuIF9jYWNoZS5nZXQoQ2xhc3MpO1xuXG4gICAgICBfY2FjaGUuc2V0KENsYXNzLCBXcmFwcGVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXcmFwcGVyKCkge1xuICAgICAgcmV0dXJuIF9jb25zdHJ1Y3QoQ2xhc3MsIGFyZ3VtZW50cywgX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yKTtcbiAgICB9XG5cbiAgICBXcmFwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogV3JhcHBlcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKFdyYXBwZXIsIENsYXNzKTtcbiAgfTtcblxuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7XG59XG5cbi8qIGVzbGludCBuby1jb25zb2xlOjAgKi9cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xudmFyIHdhcm5pbmcgPSBmdW5jdGlvbiB3YXJuaW5nKCkge307IC8vIGRvbid0IHByaW50IHdhcm5pbmcgbWVzc2FnZSB3aGVuIGluIHByb2R1Y3Rpb24gZW52IG9yIG5vZGUgcnVudGltZVxuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZyh0eXBlLCBlcnJvcnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgaWYgKGVycm9ycy5ldmVyeShmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdzdHJpbmcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHR5cGUsIGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzIHx8ICFlcnJvcnMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICBlcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICB2YXIgZmllbGQgPSBlcnJvci5maWVsZDtcbiAgICBmaWVsZHNbZmllbGRdID0gZmllbGRzW2ZpZWxkXSB8fCBbXTtcbiAgICBmaWVsZHNbZmllbGRdLnB1c2goZXJyb3IpO1xuICB9KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cbmZ1bmN0aW9uIGZvcm1hdCgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGYgPSBhcmdzWzBdO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG5cbiAgaWYgKHR5cGVvZiBmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncy5zbGljZSgxKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGYgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24gKHgpIHtcbiAgICAgIGlmICh4ID09PSAnJSUnKSB7XG4gICAgICAgIHJldHVybiAnJSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpID49IGxlbikge1xuICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh4KSB7XG4gICAgICAgIGNhc2UgJyVzJzpcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG5cbiAgICAgICAgY2FzZSAnJWQnOlxuICAgICAgICAgIHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcblxuICAgICAgICBjYXNlICclaic6XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcmV0dXJuIGY7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlU3RyaW5nVHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAndXJsJyB8fCB0eXBlID09PSAnaGV4JyB8fCB0eXBlID09PSAnZW1haWwnIHx8IHR5cGUgPT09ICdkYXRlJyB8fCB0eXBlID09PSAncGF0dGVybic7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlWYWx1ZSh2YWx1ZSwgdHlwZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdhcnJheScgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzTmF0aXZlU3RyaW5nVHlwZSh0eXBlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF2YWx1ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhc3luY1BhcmFsbGVsQXJyYXkoYXJyLCBmdW5jLCBjYWxsYmFjaykge1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcblxuICBmdW5jdGlvbiBjb3VudChlcnJvcnMpIHtcbiAgICByZXN1bHRzLnB1c2guYXBwbHkocmVzdWx0cywgZXJyb3JzKTtcbiAgICB0b3RhbCsrO1xuXG4gICAgaWYgKHRvdGFsID09PSBhcnJMZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKHJlc3VsdHMpO1xuICAgIH1cbiAgfVxuXG4gIGFyci5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7XG4gICAgZnVuYyhhLCBjb3VudCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3luY1NlcmlhbEFycmF5KGFyciwgZnVuYywgY2FsbGJhY2spIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKGVycm9ycyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG9yaWdpbmFsID0gaW5kZXg7XG4gICAgaW5kZXggPSBpbmRleCArIDE7XG5cbiAgICBpZiAob3JpZ2luYWwgPCBhcnJMZW5ndGgpIHtcbiAgICAgIGZ1bmMoYXJyW29yaWdpbmFsXSwgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKFtdKTtcbiAgICB9XG4gIH1cblxuICBuZXh0KFtdKTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbk9iakFycihvYmpBcnIpIHtcbiAgdmFyIHJldCA9IFtdO1xuICBPYmplY3Qua2V5cyhvYmpBcnIpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIG9iakFycltrXSk7XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufVxuXG52YXIgQXN5bmNWYWxpZGF0aW9uRXJyb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FcnJvcikge1xuICBfaW5oZXJpdHNMb29zZShBc3luY1ZhbGlkYXRpb25FcnJvciwgX0Vycm9yKTtcblxuICBmdW5jdGlvbiBBc3luY1ZhbGlkYXRpb25FcnJvcihlcnJvcnMsIGZpZWxkcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX0Vycm9yLmNhbGwodGhpcywgJ0FzeW5jIFZhbGlkYXRpb24gRXJyb3InKSB8fCB0aGlzO1xuICAgIF90aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICBfdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIEFzeW5jVmFsaWRhdGlvbkVycm9yO1xufSggLyojX19QVVJFX18qL193cmFwTmF0aXZlU3VwZXIoRXJyb3IpKTtcbmZ1bmN0aW9uIGFzeW5jTWFwKG9iakFyciwgb3B0aW9uLCBmdW5jLCBjYWxsYmFjaykge1xuICBpZiAob3B0aW9uLmZpcnN0KSB7XG4gICAgdmFyIF9wZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgICAgICBjYWxsYmFjayhlcnJvcnMpO1xuICAgICAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA/IHJlamVjdChuZXcgQXN5bmNWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLCBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKSkpIDogcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGZsYXR0ZW5BcnIgPSBmbGF0dGVuT2JqQXJyKG9iakFycik7XG4gICAgICBhc3luY1NlcmlhbEFycmF5KGZsYXR0ZW5BcnIsIGZ1bmMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgX3BlbmRpbmdbXCJjYXRjaFwiXShmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3BlbmRpbmc7XG4gIH1cblxuICB2YXIgZmlyc3RGaWVsZHMgPSBvcHRpb24uZmlyc3RGaWVsZHMgfHwgW107XG5cbiAgaWYgKGZpcnN0RmllbGRzID09PSB0cnVlKSB7XG4gICAgZmlyc3RGaWVsZHMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xuICB9XG5cbiAgdmFyIG9iakFycktleXMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xuICB2YXIgb2JqQXJyTGVuZ3RoID0gb2JqQXJyS2V5cy5sZW5ndGg7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMpO1xuICAgICAgdG90YWwrKztcblxuICAgICAgaWYgKHRvdGFsID09PSBvYmpBcnJMZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA/IHJlamVjdChuZXcgQXN5bmNWYWxpZGF0aW9uRXJyb3IocmVzdWx0cywgY29udmVydEZpZWxkc0Vycm9yKHJlc3VsdHMpKSkgOiByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghb2JqQXJyS2V5cy5sZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKHJlc3VsdHMpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIG9iakFycktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgYXJyID0gb2JqQXJyW2tleV07XG5cbiAgICAgIGlmIChmaXJzdEZpZWxkcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBuZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcGVuZGluZ1tcImNhdGNoXCJdKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH0pO1xuICByZXR1cm4gcGVuZGluZztcbn1cbmZ1bmN0aW9uIGNvbXBsZW1lbnRFcnJvcihydWxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAob2UpIHtcbiAgICBpZiAob2UgJiYgb2UubWVzc2FnZSkge1xuICAgICAgb2UuZmllbGQgPSBvZS5maWVsZCB8fCBydWxlLmZ1bGxGaWVsZDtcbiAgICAgIHJldHVybiBvZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdHlwZW9mIG9lID09PSAnZnVuY3Rpb24nID8gb2UoKSA6IG9lLFxuICAgICAgZmllbGQ6IG9lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkXG4gICAgfTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGRlZXBNZXJnZSh0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAoc291cmNlKSB7XG4gICAgZm9yICh2YXIgcyBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocykpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gc291cmNlW3NdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXRbc10gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGFyZ2V0W3NdID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIHRhcmdldFtzXSksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRbc10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgcmVxdWlyZWQgZmllbGRzLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbmZ1bmN0aW9uIHJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgdHlwZSkge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKSB8fCBpc0VtcHR5VmFsdWUodmFsdWUsIHR5cGUgfHwgcnVsZS50eXBlKSkpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5mdWxsRmllbGQpKTtcbiAgfVxufVxuXG4vKipcbiAqICBSdWxlIGZvciB2YWxpZGF0aW5nIHdoaXRlc3BhY2UuXG4gKlxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXG4gKiAgQHBhcmFtIGVycm9ycyBBbiBhcnJheSBvZiBlcnJvcnMgdGhhdCB0aGlzIHJ1bGUgbWF5IGFkZFxuICogIHZhbGlkYXRpb24gZXJyb3JzIHRvLlxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gKi9cblxuZnVuY3Rpb24gd2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKC9eXFxzKyQvLnRlc3QodmFsdWUpIHx8IHZhbHVlID09PSAnJykge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLndoaXRlc3BhY2UsIHJ1bGUuZnVsbEZpZWxkKSk7XG4gIH1cbn1cblxuLyogZXNsaW50IG1heC1sZW46MCAqL1xuXG52YXIgcGF0dGVybiA9IHtcbiAgLy8gaHR0cDovL2VtYWlscmVnZXguY29tL1xuICBlbWFpbDogL14oKFtePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC8sXG4gIHVybDogbmV3IFJlZ0V4cChcIl4oPyFtYWlsdG86KSg/Oig/Omh0dHB8aHR0cHN8ZnRwKTovL3wvLykoPzpcXFxcUysoPzo6XFxcXFMqKT9AKT8oPzooPzooPzpbMS05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAxXVxcXFxkfDIyWzAtM10pKD86XFxcXC4oPzoxP1xcXFxkezEsMn18MlswLTRdXFxcXGR8MjVbMC01XSkpezJ9KD86XFxcXC4oPzpbMC05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAtNF1cXFxcZHwyNVswLTRdKSl8KD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSg/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSooPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKSl8bG9jYWxob3N0KSg/OjpcXFxcZHsyLDV9KT8oPzooL3xcXFxcP3wjKVteXFxcXHNdKik/JFwiLCAnaScpLFxuICBoZXg6IC9eIz8oW2EtZjAtOV17Nn18W2EtZjAtOV17M30pJC9pXG59O1xudmFyIHR5cGVzID0ge1xuICBpbnRlZ2VyOiBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVzLm51bWJlcih2YWx1ZSkgJiYgcGFyc2VJbnQodmFsdWUsIDEwKSA9PT0gdmFsdWU7XG4gIH0sXG4gIFwiZmxvYXRcIjogZnVuY3Rpb24gZmxvYXQodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZXMubnVtYmVyKHZhbHVlKSAmJiAhdHlwZXMuaW50ZWdlcih2YWx1ZSk7XG4gIH0sXG4gIGFycmF5OiBmdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfSxcbiAgcmVnZXhwOiBmdW5jdGlvbiByZWdleHAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISFuZXcgUmVnRXhwKHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBkYXRlOiBmdW5jdGlvbiBkYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS5nZXRUaW1lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRNb250aCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuZ2V0WWVhciA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfSxcbiAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIG9iamVjdDogZnVuY3Rpb24gb2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXR5cGVzLmFycmF5KHZhbHVlKTtcbiAgfSxcbiAgbWV0aG9kOiBmdW5jdGlvbiBtZXRob2QodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuICB9LFxuICBlbWFpbDogZnVuY3Rpb24gZW1haWwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhIXZhbHVlLm1hdGNoKHBhdHRlcm4uZW1haWwpICYmIHZhbHVlLmxlbmd0aCA8IDI1NTtcbiAgfSxcbiAgdXJsOiBmdW5jdGlvbiB1cmwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhIXZhbHVlLm1hdGNoKHBhdHRlcm4udXJsKTtcbiAgfSxcbiAgaGV4OiBmdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhIXZhbHVlLm1hdGNoKHBhdHRlcm4uaGV4KTtcbiAgfVxufTtcbi8qKlxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgdGhlIHR5cGUgb2YgYSB2YWx1ZS5cbiAqXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cbiAqICBAcGFyYW0gZXJyb3JzIEFuIGFycmF5IG9mIGVycm9ycyB0aGF0IHRoaXMgcnVsZSBtYXkgYWRkXG4gKiAgdmFsaWRhdGlvbiBlcnJvcnMgdG8uXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqL1xuXG5mdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgY3VzdG9tID0gWydpbnRlZ2VyJywgJ2Zsb2F0JywgJ2FycmF5JywgJ3JlZ2V4cCcsICdvYmplY3QnLCAnbWV0aG9kJywgJ2VtYWlsJywgJ251bWJlcicsICdkYXRlJywgJ3VybCcsICdoZXgnXTtcbiAgdmFyIHJ1bGVUeXBlID0gcnVsZS50eXBlO1xuXG4gIGlmIChjdXN0b20uaW5kZXhPZihydWxlVHlwZSkgPiAtMSkge1xuICAgIGlmICghdHlwZXNbcnVsZVR5cGVdKHZhbHVlKSkge1xuICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMudHlwZXNbcnVsZVR5cGVdLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS50eXBlKSk7XG4gICAgfSAvLyBzdHJhaWdodCB0eXBlb2YgY2hlY2tcblxuICB9IGVsc2UgaWYgKHJ1bGVUeXBlICYmIHR5cGVvZiB2YWx1ZSAhPT0gcnVsZS50eXBlKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMudHlwZXNbcnVsZVR5cGVdLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS50eXBlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiAgUnVsZSBmb3IgdmFsaWRhdGluZyBtaW5pbXVtIGFuZCBtYXhpbXVtIGFsbG93ZWQgdmFsdWVzLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbmZ1bmN0aW9uIHJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICB2YXIgbGVuID0gdHlwZW9mIHJ1bGUubGVuID09PSAnbnVtYmVyJztcbiAgdmFyIG1pbiA9IHR5cGVvZiBydWxlLm1pbiA9PT0gJ251bWJlcic7XG4gIHZhciBtYXggPSB0eXBlb2YgcnVsZS5tYXggPT09ICdudW1iZXInOyAvLyDmraPliJnljLnphY3noIHngrnojIPlm7Tku45VKzAxMDAwMOS4gOebtOWIsFUrMTBGRkZG55qE5paH5a2X77yI6KGl5YWF5bmz6Z2iU3VwcGxlbWVudGFyeSBQbGFuZe+8iVxuXG4gIHZhciBzcFJlZ2V4cCA9IC9bXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdL2c7XG4gIHZhciB2YWwgPSB2YWx1ZTtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuICB2YXIgc3RyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgdmFyIGFyciA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuXG4gIGlmIChudW0pIHtcbiAgICBrZXkgPSAnbnVtYmVyJztcbiAgfSBlbHNlIGlmIChzdHIpIHtcbiAgICBrZXkgPSAnc3RyaW5nJztcbiAgfSBlbHNlIGlmIChhcnIpIHtcbiAgICBrZXkgPSAnYXJyYXknO1xuICB9IC8vIGlmIHRoZSB2YWx1ZSBpcyBub3Qgb2YgYSBzdXBwb3J0ZWQgdHlwZSBmb3IgcmFuZ2UgdmFsaWRhdGlvblxuICAvLyB0aGUgdmFsaWRhdGlvbiBydWxlIHJ1bGUgc2hvdWxkIHVzZSB0aGVcbiAgLy8gdHlwZSBwcm9wZXJ0eSB0byBhbHNvIHRlc3QgZm9yIGEgcGFydGljdWxhciB0eXBlXG5cblxuICBpZiAoIWtleSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhcnIpIHtcbiAgICB2YWwgPSB2YWx1ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAoc3RyKSB7XG4gICAgLy8g5aSE55CG56CB54K55aSn5LqOVSswMTAwMDDnmoTmloflrZdsZW5ndGjlsZ7mgKfkuI3lh4bnoa7nmoRidWfvvIzlpoJcIvCgrrfwoK638KCut1wiLmxlbmdodCAhPT0gM1xuICAgIHZhbCA9IHZhbHVlLnJlcGxhY2Uoc3BSZWdleHAsICdfJykubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGxlbikge1xuICAgIGlmICh2YWwgIT09IHJ1bGUubGVuKSB7XG4gICAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLmxlbiwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubGVuKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG1pbiAmJiAhbWF4ICYmIHZhbCA8IHJ1bGUubWluKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5taW4sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLm1pbikpO1xuICB9IGVsc2UgaWYgKG1heCAmJiAhbWluICYmIHZhbCA+IHJ1bGUubWF4KSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5tYXgsIHJ1bGUuZnVsbEZpZWxkLCBydWxlLm1heCkpO1xuICB9IGVsc2UgaWYgKG1pbiAmJiBtYXggJiYgKHZhbCA8IHJ1bGUubWluIHx8IHZhbCA+IHJ1bGUubWF4KSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ucmFuZ2UsIHJ1bGUuZnVsbEZpZWxkLCBydWxlLm1pbiwgcnVsZS5tYXgpKTtcbiAgfVxufVxuXG52YXIgRU5VTSA9ICdlbnVtJztcbi8qKlxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgYSB2YWx1ZSBleGlzdHMgaW4gYW4gZW51bWVyYWJsZSBsaXN0LlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbmZ1bmN0aW9uIGVudW1lcmFibGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIHJ1bGVbRU5VTV0gPSBBcnJheS5pc0FycmF5KHJ1bGVbRU5VTV0pID8gcnVsZVtFTlVNXSA6IFtdO1xuXG4gIGlmIChydWxlW0VOVU1dLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW0VOVU1dLCBydWxlLmZ1bGxGaWVsZCwgcnVsZVtFTlVNXS5qb2luKCcsICcpKSk7XG4gIH1cbn1cblxuLyoqXG4gKiAgUnVsZSBmb3IgdmFsaWRhdGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbmZ1bmN0aW9uIHBhdHRlcm4kMShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKHJ1bGUucGF0dGVybikge1xuICAgIGlmIChydWxlLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIGlmIGEgUmVnRXhwIGluc3RhbmNlIGlzIHBhc3NlZCwgcmVzZXQgYGxhc3RJbmRleGAgaW4gY2FzZSBpdHMgYGdsb2JhbGBcbiAgICAgIC8vIGZsYWcgaXMgYWNjaWRlbnRhbGx5IHNldCB0byBgdHJ1ZWAsIHdoaWNoIGluIGEgdmFsaWRhdGlvbiBzY2VuYXJpb1xuICAgICAgLy8gaXMgbm90IG5lY2Vzc2FyeSBhbmQgdGhlIHJlc3VsdCBtaWdodCBiZSBtaXNsZWFkaW5nXG4gICAgICBydWxlLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcblxuICAgICAgaWYgKCFydWxlLnBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucGF0dGVybi5taXNtYXRjaCwgcnVsZS5mdWxsRmllbGQsIHZhbHVlLCBydWxlLnBhdHRlcm4pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBydWxlLnBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgX3BhdHRlcm4gPSBuZXcgUmVnRXhwKHJ1bGUucGF0dGVybik7XG5cbiAgICAgIGlmICghX3BhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucGF0dGVybi5taXNtYXRjaCwgcnVsZS5mdWxsRmllbGQsIHZhbHVlLCBydWxlLnBhdHRlcm4pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHJ1bGVzID0ge1xuICByZXF1aXJlZDogcmVxdWlyZWQsXG4gIHdoaXRlc3BhY2U6IHdoaXRlc3BhY2UsXG4gIHR5cGU6IHR5cGUsXG4gIHJhbmdlOiByYW5nZSxcbiAgXCJlbnVtXCI6IGVudW1lcmFibGUsXG4gIHBhdHRlcm46IHBhdHRlcm4kMVxufTtcblxuLyoqXG4gKiAgUGVyZm9ybXMgdmFsaWRhdGlvbiBmb3Igc3RyaW5nIHR5cGVzLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqL1xuXG5mdW5jdGlvbiBzdHJpbmcocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ3N0cmluZycpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgICAgaWYgKHJ1bGUud2hpdGVzcGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICBydWxlcy53aGl0ZXNwYWNlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn1cblxuLyoqXG4gKiAgVmFsaWRhdGVzIGEgZnVuY3Rpb24uXG4gKlxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbmZ1bmN0aW9uIG1ldGhvZChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufVxuXG4vKipcbiAqICBWYWxpZGF0ZXMgYSBudW1iZXIuXG4gKlxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbmZ1bmN0aW9uIG51bWJlcihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn1cblxuLyoqXG4gKiAgVmFsaWRhdGVzIGEgYm9vbGVhbi5cbiAqXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cbiAqICBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gKi9cblxuZnVuY3Rpb24gX2Jvb2xlYW4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn1cblxuLyoqXG4gKiAgVmFsaWRhdGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdHlwZS5cbiAqXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cbiAqICBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gKi9cblxuZnVuY3Rpb24gcmVnZXhwKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufVxuXG4vKipcbiAqICBWYWxpZGF0ZXMgYSBudW1iZXIgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cbiAqICBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gKi9cblxuZnVuY3Rpb24gaW50ZWdlcihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn1cblxuLyoqXG4gKiAgVmFsaWRhdGVzIGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqL1xuXG5mdW5jdGlvbiBmbG9hdEZuKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufVxuXG4vKipcbiAqICBWYWxpZGF0ZXMgYW4gYXJyYXkuXG4gKlxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbmZ1bmN0aW9uIGFycmF5KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2FycmF5JykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ2FycmF5Jyk7XG5cbiAgICBpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2FycmF5JykpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn1cblxuLyoqXG4gKiAgVmFsaWRhdGVzIGFuIG9iamVjdC5cbiAqXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cbiAqICBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gKi9cblxuZnVuY3Rpb24gb2JqZWN0KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59XG5cbnZhciBFTlVNJDEgPSAnZW51bSc7XG4vKipcbiAqICBWYWxpZGF0ZXMgYW4gZW51bWVyYWJsZSBsaXN0LlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqL1xuXG5mdW5jdGlvbiBlbnVtZXJhYmxlJDEocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlc1tFTlVNJDFdKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn1cblxuLyoqXG4gKiAgVmFsaWRhdGVzIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uXG4gKlxuICogIFBlcmZvcm1zIHZhbGlkYXRpb24gd2hlbiBhIHJ1bGUgb25seSBjb250YWluc1xuICogIGEgcGF0dGVybiBwcm9wZXJ0eSBidXQgaXMgbm90IGRlY2xhcmVkIGFzIGEgc3RyaW5nIHR5cGUuXG4gKlxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbmZ1bmN0aW9uIHBhdHRlcm4kMihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufVxuXG5mdW5jdGlvbiBkYXRlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdpbnRlZ2VyIHJ1bGUgY2FsbGVkICVqJywgcnVsZSk7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7IC8vIGNvbnNvbGUubG9nKCd2YWxpZGF0ZSBvbiAlcyB2YWx1ZScsIHZhbHVlKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnZGF0ZScpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdkYXRlJykpIHtcbiAgICAgIHZhciBkYXRlT2JqZWN0O1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgZGF0ZU9iamVjdCwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoZGF0ZU9iamVjdCkge1xuICAgICAgICBydWxlcy5yYW5nZShydWxlLCBkYXRlT2JqZWN0LmdldFRpbWUoKSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkJDEocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdHlwZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gJ2FycmF5JyA6IHR5cGVvZiB2YWx1ZTtcbiAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCB0eXBlKTtcbiAgY2FsbGJhY2soZXJyb3JzKTtcbn1cblxuZnVuY3Rpb24gdHlwZSQxKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBydWxlVHlwZSA9IHJ1bGUudHlwZTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCBydWxlVHlwZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgcnVsZVR5cGUpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59XG5cbi8qKlxuICogIFBlcmZvcm1zIHZhbGlkYXRpb24gZm9yIGFueSB0eXBlLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqL1xuXG5mdW5jdGlvbiBhbnkocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59XG5cbnZhciB2YWxpZGF0b3JzID0ge1xuICBzdHJpbmc6IHN0cmluZyxcbiAgbWV0aG9kOiBtZXRob2QsXG4gIG51bWJlcjogbnVtYmVyLFxuICBcImJvb2xlYW5cIjogX2Jvb2xlYW4sXG4gIHJlZ2V4cDogcmVnZXhwLFxuICBpbnRlZ2VyOiBpbnRlZ2VyLFxuICBcImZsb2F0XCI6IGZsb2F0Rm4sXG4gIGFycmF5OiBhcnJheSxcbiAgb2JqZWN0OiBvYmplY3QsXG4gIFwiZW51bVwiOiBlbnVtZXJhYmxlJDEsXG4gIHBhdHRlcm46IHBhdHRlcm4kMixcbiAgZGF0ZTogZGF0ZSxcbiAgdXJsOiB0eXBlJDEsXG4gIGhleDogdHlwZSQxLFxuICBlbWFpbDogdHlwZSQxLFxuICByZXF1aXJlZDogcmVxdWlyZWQkMSxcbiAgYW55OiBhbnlcbn07XG5cbmZ1bmN0aW9uIG5ld01lc3NhZ2VzKCkge1xuICByZXR1cm4ge1xuICAgIFwiZGVmYXVsdFwiOiAnVmFsaWRhdGlvbiBlcnJvciBvbiBmaWVsZCAlcycsXG4gICAgcmVxdWlyZWQ6ICclcyBpcyByZXF1aXJlZCcsXG4gICAgXCJlbnVtXCI6ICclcyBtdXN0IGJlIG9uZSBvZiAlcycsXG4gICAgd2hpdGVzcGFjZTogJyVzIGNhbm5vdCBiZSBlbXB0eScsXG4gICAgZGF0ZToge1xuICAgICAgZm9ybWF0OiAnJXMgZGF0ZSAlcyBpcyBpbnZhbGlkIGZvciBmb3JtYXQgJXMnLFxuICAgICAgcGFyc2U6ICclcyBkYXRlIGNvdWxkIG5vdCBiZSBwYXJzZWQsICVzIGlzIGludmFsaWQgJyxcbiAgICAgIGludmFsaWQ6ICclcyBkYXRlICVzIGlzIGludmFsaWQnXG4gICAgfSxcbiAgICB0eXBlczoge1xuICAgICAgc3RyaW5nOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgbWV0aG9kOiAnJXMgaXMgbm90IGEgJXMgKGZ1bmN0aW9uKScsXG4gICAgICBhcnJheTogJyVzIGlzIG5vdCBhbiAlcycsXG4gICAgICBvYmplY3Q6ICclcyBpcyBub3QgYW4gJXMnLFxuICAgICAgbnVtYmVyOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgZGF0ZTogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIFwiYm9vbGVhblwiOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgaW50ZWdlcjogJyVzIGlzIG5vdCBhbiAlcycsXG4gICAgICBcImZsb2F0XCI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICByZWdleHA6ICclcyBpcyBub3QgYSB2YWxpZCAlcycsXG4gICAgICBlbWFpbDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcbiAgICAgIHVybDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcbiAgICAgIGhleDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJ1xuICAgIH0sXG4gICAgc3RyaW5nOiB7XG4gICAgICBsZW46ICclcyBtdXN0IGJlIGV4YWN0bHkgJXMgY2hhcmFjdGVycycsXG4gICAgICBtaW46ICclcyBtdXN0IGJlIGF0IGxlYXN0ICVzIGNoYXJhY3RlcnMnLFxuICAgICAgbWF4OiAnJXMgY2Fubm90IGJlIGxvbmdlciB0aGFuICVzIGNoYXJhY3RlcnMnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIGNoYXJhY3RlcnMnXG4gICAgfSxcbiAgICBudW1iZXI6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgZXF1YWwgJXMnLFxuICAgICAgbWluOiAnJXMgY2Fubm90IGJlIGxlc3MgdGhhbiAlcycsXG4gICAgICBtYXg6ICclcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICVzJyxcbiAgICAgIHJhbmdlOiAnJXMgbXVzdCBiZSBiZXR3ZWVuICVzIGFuZCAlcydcbiAgICB9LFxuICAgIGFycmF5OiB7XG4gICAgICBsZW46ICclcyBtdXN0IGJlIGV4YWN0bHkgJXMgaW4gbGVuZ3RoJyxcbiAgICAgIG1pbjogJyVzIGNhbm5vdCBiZSBsZXNzIHRoYW4gJXMgaW4gbGVuZ3RoJyxcbiAgICAgIG1heDogJyVzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJXMgaW4gbGVuZ3RoJyxcbiAgICAgIHJhbmdlOiAnJXMgbXVzdCBiZSBiZXR3ZWVuICVzIGFuZCAlcyBpbiBsZW5ndGgnXG4gICAgfSxcbiAgICBwYXR0ZXJuOiB7XG4gICAgICBtaXNtYXRjaDogJyVzIHZhbHVlICVzIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gJXMnXG4gICAgfSxcbiAgICBjbG9uZTogZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICB2YXIgY2xvbmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzKSk7XG4gICAgICBjbG9uZWQuY2xvbmUgPSB0aGlzLmNsb25lO1xuICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG4gIH07XG59XG52YXIgbWVzc2FnZXMgPSBuZXdNZXNzYWdlcygpO1xuXG4vKipcbiAqICBFbmNhcHN1bGF0ZXMgYSB2YWxpZGF0aW9uIHNjaGVtYS5cbiAqXG4gKiAgQHBhcmFtIGRlc2NyaXB0b3IgQW4gb2JqZWN0IGRlY2xhcmluZyB2YWxpZGF0aW9uIHJ1bGVzXG4gKiAgZm9yIHRoaXMgc2NoZW1hLlxuICovXG5cbmZ1bmN0aW9uIFNjaGVtYShkZXNjcmlwdG9yKSB7XG4gIHRoaXMucnVsZXMgPSBudWxsO1xuICB0aGlzLl9tZXNzYWdlcyA9IG1lc3NhZ2VzO1xuICB0aGlzLmRlZmluZShkZXNjcmlwdG9yKTtcbn1cblxuU2NoZW1hLnByb3RvdHlwZSA9IHtcbiAgbWVzc2FnZXM6IGZ1bmN0aW9uIG1lc3NhZ2VzKF9tZXNzYWdlcykge1xuICAgIGlmIChfbWVzc2FnZXMpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2VzID0gZGVlcE1lcmdlKG5ld01lc3NhZ2VzKCksIF9tZXNzYWdlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VzO1xuICB9LFxuICBkZWZpbmU6IGZ1bmN0aW9uIGRlZmluZShydWxlcykge1xuICAgIGlmICghcnVsZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbmZpZ3VyZSBhIHNjaGVtYSB3aXRoIG5vIHJ1bGVzJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydWxlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUnVsZXMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzID0ge307XG4gICAgdmFyIHo7XG4gICAgdmFyIGl0ZW07XG5cbiAgICBmb3IgKHogaW4gcnVsZXMpIHtcbiAgICAgIGlmIChydWxlcy5oYXNPd25Qcm9wZXJ0eSh6KSkge1xuICAgICAgICBpdGVtID0gcnVsZXNbel07XG4gICAgICAgIHRoaXMucnVsZXNbel0gPSBBcnJheS5pc0FycmF5KGl0ZW0pID8gaXRlbSA6IFtpdGVtXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZShzb3VyY2VfLCBvLCBvYykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAobyA9PT0gdm9pZCAwKSB7XG4gICAgICBvID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9jID09PSB2b2lkIDApIHtcbiAgICAgIG9jID0gZnVuY3Rpb24gb2MoKSB7fTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlID0gc291cmNlXztcbiAgICB2YXIgb3B0aW9ucyA9IG87XG4gICAgdmFyIGNhbGxiYWNrID0gb2M7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucnVsZXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlKHJlc3VsdHMpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgdmFyIGZpZWxkcyA9IHt9O1xuXG4gICAgICBmdW5jdGlvbiBhZGQoZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgICAgIHZhciBfZXJyb3JzO1xuXG4gICAgICAgICAgZXJyb3JzID0gKF9lcnJvcnMgPSBlcnJvcnMpLmNvbmNhdC5hcHBseShfZXJyb3JzLCBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhZGQocmVzdWx0c1tpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICBlcnJvcnMgPSBudWxsO1xuICAgICAgICBmaWVsZHMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGRzID0gY29udmVydEZpZWxkc0Vycm9yKGVycm9ycyk7XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrKGVycm9ycywgZmllbGRzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5tZXNzYWdlcykge1xuICAgICAgdmFyIG1lc3NhZ2VzJDEgPSB0aGlzLm1lc3NhZ2VzKCk7XG5cbiAgICAgIGlmIChtZXNzYWdlcyQxID09PSBtZXNzYWdlcykge1xuICAgICAgICBtZXNzYWdlcyQxID0gbmV3TWVzc2FnZXMoKTtcbiAgICAgIH1cblxuICAgICAgZGVlcE1lcmdlKG1lc3NhZ2VzJDEsIG9wdGlvbnMubWVzc2FnZXMpO1xuICAgICAgb3B0aW9ucy5tZXNzYWdlcyA9IG1lc3NhZ2VzJDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzKCk7XG4gICAgfVxuXG4gICAgdmFyIGFycjtcbiAgICB2YXIgdmFsdWU7XG4gICAgdmFyIHNlcmllcyA9IHt9O1xuICAgIHZhciBrZXlzID0gb3B0aW9ucy5rZXlzIHx8IE9iamVjdC5rZXlzKHRoaXMucnVsZXMpO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoeikge1xuICAgICAgYXJyID0gX3RoaXMucnVsZXNbel07XG4gICAgICB2YWx1ZSA9IHNvdXJjZVt6XTtcbiAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIHZhciBydWxlID0gcjtcblxuICAgICAgICBpZiAodHlwZW9mIHJ1bGUudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWYgKHNvdXJjZSA9PT0gc291cmNlXykge1xuICAgICAgICAgICAgc291cmNlID0gX2V4dGVuZHMoe30sIHNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBzb3VyY2Vbel0gPSBydWxlLnRyYW5zZm9ybSh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBydWxlID0ge1xuICAgICAgICAgICAgdmFsaWRhdG9yOiBydWxlXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBydWxlID0gX2V4dGVuZHMoe30sIHJ1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVsZS52YWxpZGF0b3IgPSBfdGhpcy5nZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpO1xuICAgICAgICBydWxlLmZpZWxkID0gejtcbiAgICAgICAgcnVsZS5mdWxsRmllbGQgPSBydWxlLmZ1bGxGaWVsZCB8fCB6O1xuICAgICAgICBydWxlLnR5cGUgPSBfdGhpcy5nZXRUeXBlKHJ1bGUpO1xuXG4gICAgICAgIGlmICghcnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXJpZXNbel0gPSBzZXJpZXNbel0gfHwgW107XG4gICAgICAgIHNlcmllc1t6XS5wdXNoKHtcbiAgICAgICAgICBydWxlOiBydWxlLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBmaWVsZDogelxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHZhciBlcnJvckZpZWxkcyA9IHt9O1xuICAgIHJldHVybiBhc3luY01hcChzZXJpZXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChkYXRhLCBkb0l0KSB7XG4gICAgICB2YXIgcnVsZSA9IGRhdGEucnVsZTtcbiAgICAgIHZhciBkZWVwID0gKHJ1bGUudHlwZSA9PT0gJ29iamVjdCcgfHwgcnVsZS50eXBlID09PSAnYXJyYXknKSAmJiAodHlwZW9mIHJ1bGUuZmllbGRzID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcnVsZS5kZWZhdWx0RmllbGQgPT09ICdvYmplY3QnKTtcbiAgICAgIGRlZXAgPSBkZWVwICYmIChydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIGRhdGEudmFsdWUpO1xuICAgICAgcnVsZS5maWVsZCA9IGRhdGEuZmllbGQ7XG5cbiAgICAgIGZ1bmN0aW9uIGFkZEZ1bGxmaWVsZChrZXksIHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIHNjaGVtYSksIHt9LCB7XG4gICAgICAgICAgZnVsbEZpZWxkOiBydWxlLmZ1bGxGaWVsZCArIFwiLlwiICsga2V5XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYihlKSB7XG4gICAgICAgIGlmIChlID09PSB2b2lkIDApIHtcbiAgICAgICAgICBlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXJyb3JzID0gZTtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXJyb3JzKSkge1xuICAgICAgICAgIGVycm9ycyA9IFtlcnJvcnNdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLnN1cHByZXNzV2FybmluZyAmJiBlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgU2NoZW1hLndhcm5pbmcoJ2FzeW5jLXZhbGlkYXRvcjonLCBlcnJvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggJiYgcnVsZS5tZXNzYWdlKSB7XG4gICAgICAgICAgZXJyb3JzID0gW10uY29uY2F0KHJ1bGUubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcnMgPSBlcnJvcnMubWFwKGNvbXBsZW1lbnRFcnJvcihydWxlKSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmlyc3QgJiYgZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgIGVycm9yRmllbGRzW3J1bGUuZmllbGRdID0gMTtcbiAgICAgICAgICByZXR1cm4gZG9JdChlcnJvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkZWVwKSB7XG4gICAgICAgICAgZG9JdChlcnJvcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHJ1bGUgaXMgcmVxdWlyZWQgYnV0IHRoZSB0YXJnZXQgb2JqZWN0XG4gICAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgZmFpbCBhdCB0aGUgcnVsZSBsZXZlbCBhbmQgZG9uJ3RcbiAgICAgICAgICAvLyBnbyBkZWVwZXJcbiAgICAgICAgICBpZiAocnVsZS5yZXF1aXJlZCAmJiAhZGF0YS52YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHJ1bGUubWVzc2FnZSkge1xuICAgICAgICAgICAgICBlcnJvcnMgPSBbXS5jb25jYXQocnVsZS5tZXNzYWdlKS5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lcnJvcikge1xuICAgICAgICAgICAgICBlcnJvcnMgPSBbb3B0aW9ucy5lcnJvcihydWxlLCBmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5maWVsZCkpXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRvSXQoZXJyb3JzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZmllbGRzU2NoZW1hID0ge307XG5cbiAgICAgICAgICBpZiAocnVsZS5kZWZhdWx0RmllbGQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YS52YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoZGF0YS52YWx1ZS5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkc1NjaGVtYVtrXSA9IHJ1bGUuZGVmYXVsdEZpZWxkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmllbGRzU2NoZW1hID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGZpZWxkc1NjaGVtYSksIGRhdGEucnVsZS5maWVsZHMpO1xuXG4gICAgICAgICAgZm9yICh2YXIgZiBpbiBmaWVsZHNTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHNTY2hlbWEuaGFzT3duUHJvcGVydHkoZikpIHtcbiAgICAgICAgICAgICAgdmFyIGZpZWxkU2NoZW1hID0gQXJyYXkuaXNBcnJheShmaWVsZHNTY2hlbWFbZl0pID8gZmllbGRzU2NoZW1hW2ZdIDogW2ZpZWxkc1NjaGVtYVtmXV07XG4gICAgICAgICAgICAgIGZpZWxkc1NjaGVtYVtmXSA9IGZpZWxkU2NoZW1hLm1hcChhZGRGdWxsZmllbGQuYmluZChudWxsLCBmKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHNjaGVtYSA9IG5ldyBTY2hlbWEoZmllbGRzU2NoZW1hKTtcbiAgICAgICAgICBzY2hlbWEubWVzc2FnZXMob3B0aW9ucy5tZXNzYWdlcyk7XG5cbiAgICAgICAgICBpZiAoZGF0YS5ydWxlLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIGRhdGEucnVsZS5vcHRpb25zLm1lc3NhZ2VzID0gb3B0aW9ucy5tZXNzYWdlcztcbiAgICAgICAgICAgIGRhdGEucnVsZS5vcHRpb25zLmVycm9yID0gb3B0aW9ucy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY2hlbWEudmFsaWRhdGUoZGF0YS52YWx1ZSwgZGF0YS5ydWxlLm9wdGlvbnMgfHwgb3B0aW9ucywgZnVuY3Rpb24gKGVycnMpIHtcbiAgICAgICAgICAgIHZhciBmaW5hbEVycm9ycyA9IFtdO1xuXG4gICAgICAgICAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZmluYWxFcnJvcnMucHVzaC5hcHBseShmaW5hbEVycm9ycywgZXJyb3JzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVycnMgJiYgZXJycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZmluYWxFcnJvcnMucHVzaC5hcHBseShmaW5hbEVycm9ycywgZXJycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvSXQoZmluYWxFcnJvcnMubGVuZ3RoID8gZmluYWxFcnJvcnMgOiBudWxsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVzO1xuXG4gICAgICBpZiAocnVsZS5hc3luY1ZhbGlkYXRvcikge1xuICAgICAgICByZXMgPSBydWxlLmFzeW5jVmFsaWRhdG9yKHJ1bGUsIGRhdGEudmFsdWUsIGNiLCBkYXRhLnNvdXJjZSwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKHJ1bGUudmFsaWRhdG9yKSB7XG4gICAgICAgIHJlcyA9IHJ1bGUudmFsaWRhdG9yKHJ1bGUsIGRhdGEudmFsdWUsIGNiLCBkYXRhLnNvdXJjZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgIGNiKHJ1bGUubWVzc2FnZSB8fCBydWxlLmZpZWxkICsgXCIgZmFpbHNcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjYihyZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY2IocmVzLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXMgJiYgcmVzLnRoZW4pIHtcbiAgICAgICAgcmVzLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBjYihlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGNvbXBsZXRlKHJlc3VsdHMpO1xuICAgIH0pO1xuICB9LFxuICBnZXRUeXBlOiBmdW5jdGlvbiBnZXRUeXBlKHJ1bGUpIHtcbiAgICBpZiAocnVsZS50eXBlID09PSB1bmRlZmluZWQgJiYgcnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBydWxlLnR5cGUgPSAncGF0dGVybic7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJyAmJiBydWxlLnR5cGUgJiYgIXZhbGlkYXRvcnMuaGFzT3duUHJvcGVydHkocnVsZS50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdCgnVW5rbm93biBydWxlIHR5cGUgJXMnLCBydWxlLnR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnVsZS50eXBlIHx8ICdzdHJpbmcnO1xuICB9LFxuICBnZXRWYWxpZGF0aW9uTWV0aG9kOiBmdW5jdGlvbiBnZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpIHtcbiAgICBpZiAodHlwZW9mIHJ1bGUudmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcnVsZS52YWxpZGF0b3I7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhydWxlKTtcbiAgICB2YXIgbWVzc2FnZUluZGV4ID0ga2V5cy5pbmRleE9mKCdtZXNzYWdlJyk7XG5cbiAgICBpZiAobWVzc2FnZUluZGV4ICE9PSAtMSkge1xuICAgICAga2V5cy5zcGxpY2UobWVzc2FnZUluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEgJiYga2V5c1swXSA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgcmV0dXJuIHZhbGlkYXRvcnMucmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvcnNbdGhpcy5nZXRUeXBlKHJ1bGUpXSB8fCBmYWxzZTtcbiAgfVxufTtcblxuU2NoZW1hLnJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIodHlwZSwgdmFsaWRhdG9yKSB7XG4gIGlmICh0eXBlb2YgdmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVnaXN0ZXIgYSB2YWxpZGF0b3IgYnkgdHlwZSwgdmFsaWRhdG9yIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICB2YWxpZGF0b3JzW3R5cGVdID0gdmFsaWRhdG9yO1xufTtcblxuU2NoZW1hLndhcm5pbmcgPSB3YXJuaW5nO1xuU2NoZW1hLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG5TY2hlbWEudmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFNjaGVtYTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiLyohXG4gIENvcHlyaWdodCAoYykgMjAxNyBKZWQgV2F0c29uLlxuICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuICBodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzXG4qL1xuLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMgKCkge1xuXHRcdHZhciBjbGFzc2VzID0gW107XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdGlmICghYXJnKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuXG5cdFx0XHRpZiAoYXJnVHlwZSA9PT0gJ3N0cmluZycgfHwgYXJnVHlwZSA9PT0gJ251bWJlcicpIHtcblx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGFyZyk7XG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSAmJiBhcmcubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBpbm5lciA9IGNsYXNzTmFtZXMuYXBwbHkobnVsbCwgYXJnKTtcblx0XHRcdFx0aWYgKGlubmVyKSB7XG5cdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGlubmVyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Y2xhc3NOYW1lcy5kZWZhdWx0ID0gY2xhc3NOYW1lcztcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwiZnVuY3Rpb24gdCh0KXtyZXR1cm4gbnVsbCE9dCYmXCJvYmplY3RcIj09dHlwZW9mIHQmJjE9PT10Lm5vZGVUeXBlfWZ1bmN0aW9uIGUodCxlKXtyZXR1cm4oIWV8fFwiaGlkZGVuXCIhPT10KSYmXCJ2aXNpYmxlXCIhPT10JiZcImNsaXBcIiE9PXR9ZnVuY3Rpb24gbih0LG4pe2lmKHQuY2xpZW50SGVpZ2h0PHQuc2Nyb2xsSGVpZ2h0fHx0LmNsaWVudFdpZHRoPHQuc2Nyb2xsV2lkdGgpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCxudWxsKTtyZXR1cm4gZShyLm92ZXJmbG93WSxuKXx8ZShyLm92ZXJmbG93WCxuKXx8ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7aWYoIXQub3duZXJEb2N1bWVudHx8IXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldylyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIHQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5mcmFtZUVsZW1lbnR9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSh0KTtyZXR1cm4hIWUmJihlLmNsaWVudEhlaWdodDx0LnNjcm9sbEhlaWdodHx8ZS5jbGllbnRXaWR0aDx0LnNjcm9sbFdpZHRoKX0odCl9cmV0dXJuITF9ZnVuY3Rpb24gcih0LGUsbixyLGksbyxsLGQpe3JldHVybiBvPHQmJmw+ZXx8bz50JiZsPGU/MDpvPD10JiZkPD1ufHxsPj1lJiZkPj1uP28tdC1yOmw+ZSYmZDxufHxvPHQmJmQ+bj9sLWUraTowfW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUsaSl7dmFyIG89d2luZG93LGw9aS5zY3JvbGxNb2RlLGQ9aS5ibG9jayx1PWkuaW5saW5lLGg9aS5ib3VuZGFyeSxjPWkuc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMsYT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBoP2g6ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1ofTtpZighdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCB0YXJnZXRcIik7Zm9yKHZhciBmPWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxzPVtdLHA9ZTt0KHApJiZhKHApOyl7aWYoKHA9cC5wYXJlbnROb2RlKT09PWYpe3MucHVzaChwKTticmVha31wPT09ZG9jdW1lbnQuYm9keSYmbihwKSYmIW4oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KXx8bihwLGMpJiZzLnB1c2gocCl9Zm9yKHZhciBtPW8udmlzdWFsVmlld3BvcnQ/by52aXN1YWxWaWV3cG9ydC53aWR0aDppbm5lcldpZHRoLGc9by52aXN1YWxWaWV3cG9ydD9vLnZpc3VhbFZpZXdwb3J0LmhlaWdodDppbm5lckhlaWdodCx3PXdpbmRvdy5zY3JvbGxYfHxwYWdlWE9mZnNldCx2PXdpbmRvdy5zY3JvbGxZfHxwYWdlWU9mZnNldCxXPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYj1XLmhlaWdodCxIPVcud2lkdGgseT1XLnRvcCxNPVcucmlnaHQsRT1XLmJvdHRvbSxWPVcubGVmdCx4PVwic3RhcnRcIj09PWR8fFwibmVhcmVzdFwiPT09ZD95OlwiZW5kXCI9PT1kP0U6eStiLzIsST1cImNlbnRlclwiPT09dT9WK0gvMjpcImVuZFwiPT09dT9NOlYsQz1bXSxUPTA7VDxzLmxlbmd0aDtUKyspe3ZhciBrPXNbVF0sQj1rLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEQ9Qi5oZWlnaHQsTz1CLndpZHRoLFI9Qi50b3AsWD1CLnJpZ2h0LFk9Qi5ib3R0b20sTD1CLmxlZnQ7aWYoXCJpZi1uZWVkZWRcIj09PWwmJnk+PTAmJlY+PTAmJkU8PWcmJk08PW0mJnk+PVImJkU8PVkmJlY+PUwmJk08PVgpcmV0dXJuIEM7dmFyIFM9Z2V0Q29tcHV0ZWRTdHlsZShrKSxqPXBhcnNlSW50KFMuYm9yZGVyTGVmdFdpZHRoLDEwKSxOPXBhcnNlSW50KFMuYm9yZGVyVG9wV2lkdGgsMTApLHE9cGFyc2VJbnQoUy5ib3JkZXJSaWdodFdpZHRoLDEwKSx6PXBhcnNlSW50KFMuYm9yZGVyQm90dG9tV2lkdGgsMTApLEE9MCxGPTAsRz1cIm9mZnNldFdpZHRoXCJpbiBrP2sub2Zmc2V0V2lkdGgtay5jbGllbnRXaWR0aC1qLXE6MCxKPVwib2Zmc2V0SGVpZ2h0XCJpbiBrP2sub2Zmc2V0SGVpZ2h0LWsuY2xpZW50SGVpZ2h0LU4tejowO2lmKGY9PT1rKUE9XCJzdGFydFwiPT09ZD94OlwiZW5kXCI9PT1kP3gtZzpcIm5lYXJlc3RcIj09PWQ/cih2LHYrZyxnLE4seix2K3gsdit4K2IsYik6eC1nLzIsRj1cInN0YXJ0XCI9PT11P0k6XCJjZW50ZXJcIj09PXU/SS1tLzI6XCJlbmRcIj09PXU/SS1tOnIodyx3K20sbSxqLHEsdytJLHcrSStILEgpLEE9TWF0aC5tYXgoMCxBK3YpLEY9TWF0aC5tYXgoMCxGK3cpO2Vsc2V7QT1cInN0YXJ0XCI9PT1kP3gtUi1OOlwiZW5kXCI9PT1kP3gtWSt6K0o6XCJuZWFyZXN0XCI9PT1kP3IoUixZLEQsTix6K0oseCx4K2IsYik6eC0oUitELzIpK0ovMixGPVwic3RhcnRcIj09PXU/SS1MLWo6XCJjZW50ZXJcIj09PXU/SS0oTCtPLzIpK0cvMjpcImVuZFwiPT09dT9JLVgrcStHOnIoTCxYLE8saixxK0csSSxJK0gsSCk7dmFyIEs9ay5zY3JvbGxMZWZ0LFA9ay5zY3JvbGxUb3A7eCs9UC0oQT1NYXRoLm1heCgwLE1hdGgubWluKFArQSxrLnNjcm9sbEhlaWdodC1EK0opKSksSSs9Sy0oRj1NYXRoLm1heCgwLE1hdGgubWluKEsrRixrLnNjcm9sbFdpZHRoLU8rRykpKX1DLnB1c2goe2VsOmssdG9wOkEsbGVmdDpGfSl9cmV0dXJuIEN9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGRlc2VsZWN0Q3VycmVudCA9IHJlcXVpcmUoXCJ0b2dnbGUtc2VsZWN0aW9uXCIpO1xuXG52YXIgY2xpcGJvYXJkVG9JRTExRm9ybWF0dGluZyA9IHtcbiAgXCJ0ZXh0L3BsYWluXCI6IFwiVGV4dFwiLFxuICBcInRleHQvaHRtbFwiOiBcIlVybFwiLFxuICBcImRlZmF1bHRcIjogXCJUZXh0XCJcbn1cblxudmFyIGRlZmF1bHRNZXNzYWdlID0gXCJDb3B5IHRvIGNsaXBib2FyZDogI3trZXl9LCBFbnRlclwiO1xuXG5mdW5jdGlvbiBmb3JtYXQobWVzc2FnZSkge1xuICB2YXIgY29weUtleSA9ICgvbWFjIG9zIHgvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpID8gXCLijJhcIiA6IFwiQ3RybFwiKSArIFwiK0NcIjtcbiAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvI3tcXHMqa2V5XFxzKn0vZywgY29weUtleSk7XG59XG5cbmZ1bmN0aW9uIGNvcHkodGV4dCwgb3B0aW9ucykge1xuICB2YXIgZGVidWcsXG4gICAgbWVzc2FnZSxcbiAgICByZXNlbGVjdFByZXZpb3VzLFxuICAgIHJhbmdlLFxuICAgIHNlbGVjdGlvbixcbiAgICBtYXJrLFxuICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZyB8fCBmYWxzZTtcbiAgdHJ5IHtcbiAgICByZXNlbGVjdFByZXZpb3VzID0gZGVzZWxlY3RDdXJyZW50KCk7XG5cbiAgICByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICBtYXJrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgbWFyay50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgLy8gcmVzZXQgdXNlciBzdHlsZXMgZm9yIHNwYW4gZWxlbWVudFxuICAgIG1hcmsuc3R5bGUuYWxsID0gXCJ1bnNldFwiO1xuICAgIC8vIHByZXZlbnRzIHNjcm9sbGluZyB0byB0aGUgZW5kIG9mIHRoZSBwYWdlXG4gICAgbWFyay5zdHlsZS5wb3NpdGlvbiA9IFwiZml4ZWRcIjtcbiAgICBtYXJrLnN0eWxlLnRvcCA9IDA7XG4gICAgbWFyay5zdHlsZS5jbGlwID0gXCJyZWN0KDAsIDAsIDAsIDApXCI7XG4gICAgLy8gdXNlZCB0byBwcmVzZXJ2ZSBzcGFjZXMgYW5kIGxpbmUgYnJlYWtzXG4gICAgbWFyay5zdHlsZS53aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgICAvLyBkbyBub3QgaW5oZXJpdCB1c2VyLXNlbGVjdCAoaXQgbWF5IGJlIGBub25lYClcbiAgICBtYXJrLnN0eWxlLndlYmtpdFVzZXJTZWxlY3QgPSBcInRleHRcIjtcbiAgICBtYXJrLnN0eWxlLk1velVzZXJTZWxlY3QgPSBcInRleHRcIjtcbiAgICBtYXJrLnN0eWxlLm1zVXNlclNlbGVjdCA9IFwidGV4dFwiO1xuICAgIG1hcmsuc3R5bGUudXNlclNlbGVjdCA9IFwidGV4dFwiO1xuICAgIG1hcmsuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChvcHRpb25zLmZvcm1hdCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0eXBlb2YgZS5jbGlwYm9hcmREYXRhID09PSBcInVuZGVmaW5lZFwiKSB7IC8vIElFIDExXG4gICAgICAgICAgZGVidWcgJiYgY29uc29sZS53YXJuKFwidW5hYmxlIHRvIHVzZSBlLmNsaXBib2FyZERhdGFcIik7XG4gICAgICAgICAgZGVidWcgJiYgY29uc29sZS53YXJuKFwidHJ5aW5nIElFIHNwZWNpZmljIHN0dWZmXCIpO1xuICAgICAgICAgIHdpbmRvdy5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpO1xuICAgICAgICAgIHZhciBmb3JtYXQgPSBjbGlwYm9hcmRUb0lFMTFGb3JtYXR0aW5nW29wdGlvbnMuZm9ybWF0XSB8fCBjbGlwYm9hcmRUb0lFMTFGb3JtYXR0aW5nW1wiZGVmYXVsdFwiXVxuICAgICAgICAgIHdpbmRvdy5jbGlwYm9hcmREYXRhLnNldERhdGEoZm9ybWF0LCB0ZXh0KTtcbiAgICAgICAgfSBlbHNlIHsgLy8gYWxsIG90aGVyIGJyb3dzZXJzXG4gICAgICAgICAgZS5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpO1xuICAgICAgICAgIGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKG9wdGlvbnMuZm9ybWF0LCB0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMub25Db3B5KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb3B0aW9ucy5vbkNvcHkoZS5jbGlwYm9hcmREYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWFyayk7XG5cbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobWFyayk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIHZhciBzdWNjZXNzZnVsID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xuICAgIGlmICghc3VjY2Vzc2Z1bCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29weSBjb21tYW5kIHdhcyB1bnN1Y2Nlc3NmdWxcIik7XG4gICAgfVxuICAgIHN1Y2Nlc3MgPSB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWJ1ZyAmJiBjb25zb2xlLmVycm9yKFwidW5hYmxlIHRvIGNvcHkgdXNpbmcgZXhlY0NvbW1hbmQ6IFwiLCBlcnIpO1xuICAgIGRlYnVnICYmIGNvbnNvbGUud2FybihcInRyeWluZyBJRSBzcGVjaWZpYyBzdHVmZlwiKTtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmNsaXBib2FyZERhdGEuc2V0RGF0YShvcHRpb25zLmZvcm1hdCB8fCBcInRleHRcIiwgdGV4dCk7XG4gICAgICBvcHRpb25zLm9uQ29weSAmJiBvcHRpb25zLm9uQ29weSh3aW5kb3cuY2xpcGJvYXJkRGF0YSk7XG4gICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGRlYnVnICYmIGNvbnNvbGUuZXJyb3IoXCJ1bmFibGUgdG8gY29weSB1c2luZyBjbGlwYm9hcmREYXRhOiBcIiwgZXJyKTtcbiAgICAgIGRlYnVnICYmIGNvbnNvbGUuZXJyb3IoXCJmYWxsaW5nIGJhY2sgdG8gcHJvbXB0XCIpO1xuICAgICAgbWVzc2FnZSA9IGZvcm1hdChcIm1lc3NhZ2VcIiBpbiBvcHRpb25zID8gb3B0aW9ucy5tZXNzYWdlIDogZGVmYXVsdE1lc3NhZ2UpO1xuICAgICAgd2luZG93LnByb21wdChtZXNzYWdlLCB0ZXh0KTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBzZWxlY3Rpb24ucmVtb3ZlUmFuZ2UgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVSYW5nZShyYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hcmspIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobWFyayk7XG4gICAgfVxuICAgIHJlc2VsZWN0UHJldmlvdXMoKTtcbiAgfVxuXG4gIHJldHVybiBzdWNjZXNzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHk7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciB2ZW5kb3JQcmVmaXg7XG52YXIganNDc3NNYXAgPSB7XG4gIFdlYmtpdDogJy13ZWJraXQtJyxcbiAgTW96OiAnLW1vei0nLFxuICAvLyBJRSBkaWQgaXQgd3JvbmcgYWdhaW4gLi4uXG4gIG1zOiAnLW1zLScsXG4gIE86ICctby0nXG59O1xuXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXgoKSB7XG4gIGlmICh2ZW5kb3JQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2ZW5kb3JQcmVmaXg7XG4gIH1cblxuICB2ZW5kb3JQcmVmaXggPSAnJztcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpLnN0eWxlO1xuICB2YXIgdGVzdFByb3AgPSAnVHJhbnNmb3JtJztcblxuICBmb3IgKHZhciBrZXkgaW4ganNDc3NNYXApIHtcbiAgICBpZiAoa2V5ICsgdGVzdFByb3AgaW4gc3R5bGUpIHtcbiAgICAgIHZlbmRvclByZWZpeCA9IGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmVuZG9yUHJlZml4O1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uTmFtZSgpIHtcbiAgcmV0dXJuIGdldFZlbmRvclByZWZpeCgpID8gXCJcIi5jb25jYXQoZ2V0VmVuZG9yUHJlZml4KCksIFwiVHJhbnNpdGlvblByb3BlcnR5XCIpIDogJ3RyYW5zaXRpb25Qcm9wZXJ0eSc7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zZm9ybU5hbWUoKSB7XG4gIHJldHVybiBnZXRWZW5kb3JQcmVmaXgoKSA/IFwiXCIuY29uY2F0KGdldFZlbmRvclByZWZpeCgpLCBcIlRyYW5zZm9ybVwiKSA6ICd0cmFuc2Zvcm0nO1xufVxuZnVuY3Rpb24gc2V0VHJhbnNpdGlvblByb3BlcnR5KG5vZGUsIHZhbHVlKSB7XG4gIHZhciBuYW1lID0gZ2V0VHJhbnNpdGlvbk5hbWUoKTtcblxuICBpZiAobmFtZSkge1xuICAgIG5vZGUuc3R5bGVbbmFtZV0gPSB2YWx1ZTtcblxuICAgIGlmIChuYW1lICE9PSAndHJhbnNpdGlvblByb3BlcnR5Jykge1xuICAgICAgbm9kZS5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHkgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0VHJhbnNmb3JtKG5vZGUsIHZhbHVlKSB7XG4gIHZhciBuYW1lID0gZ2V0VHJhbnNmb3JtTmFtZSgpO1xuXG4gIGlmIChuYW1lKSB7XG4gICAgbm9kZS5zdHlsZVtuYW1lXSA9IHZhbHVlO1xuXG4gICAgaWYgKG5hbWUgIT09ICd0cmFuc2Zvcm0nKSB7XG4gICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IHZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uUHJvcGVydHkobm9kZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHkgfHwgbm9kZS5zdHlsZVtnZXRUcmFuc2l0aW9uTmFtZSgpXTtcbn1cbmZ1bmN0aW9uIGdldFRyYW5zZm9ybVhZKG5vZGUpIHtcbiAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gIHZhciB0cmFuc2Zvcm0gPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2Zvcm0nKSB8fCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGdldFRyYW5zZm9ybU5hbWUoKSk7XG5cbiAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0gIT09ICdub25lJykge1xuICAgIHZhciBtYXRyaXggPSB0cmFuc2Zvcm0ucmVwbGFjZSgvW14wLTlcXC0uLF0vZywgJycpLnNwbGl0KCcsJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBhcnNlRmxvYXQobWF0cml4WzEyXSB8fCBtYXRyaXhbNF0sIDApLFxuICAgICAgeTogcGFyc2VGbG9hdChtYXRyaXhbMTNdIHx8IG1hdHJpeFs1XSwgMClcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbn1cbnZhciBtYXRyaXgyZCA9IC9tYXRyaXhcXCgoLiopXFwpLztcbnZhciBtYXRyaXgzZCA9IC9tYXRyaXgzZFxcKCguKilcXCkvO1xuZnVuY3Rpb24gc2V0VHJhbnNmb3JtWFkobm9kZSwgeHkpIHtcbiAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gIHZhciB0cmFuc2Zvcm0gPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2Zvcm0nKSB8fCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGdldFRyYW5zZm9ybU5hbWUoKSk7XG5cbiAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0gIT09ICdub25lJykge1xuICAgIHZhciBhcnI7XG4gICAgdmFyIG1hdGNoMmQgPSB0cmFuc2Zvcm0ubWF0Y2gobWF0cml4MmQpO1xuXG4gICAgaWYgKG1hdGNoMmQpIHtcbiAgICAgIG1hdGNoMmQgPSBtYXRjaDJkWzFdO1xuICAgICAgYXJyID0gbWF0Y2gyZC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChpdGVtLCAxMCk7XG4gICAgICB9KTtcbiAgICAgIGFycls0XSA9IHh5Lng7XG4gICAgICBhcnJbNV0gPSB4eS55O1xuICAgICAgc2V0VHJhbnNmb3JtKG5vZGUsIFwibWF0cml4KFwiLmNvbmNhdChhcnIuam9pbignLCcpLCBcIilcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWF0Y2gzZCA9IHRyYW5zZm9ybS5tYXRjaChtYXRyaXgzZClbMV07XG4gICAgICBhcnIgPSBtYXRjaDNkLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGl0ZW0sIDEwKTtcbiAgICAgIH0pO1xuICAgICAgYXJyWzEyXSA9IHh5Lng7XG4gICAgICBhcnJbMTNdID0geHkueTtcbiAgICAgIHNldFRyYW5zZm9ybShub2RlLCBcIm1hdHJpeDNkKFwiLmNvbmNhdChhcnIuam9pbignLCcpLCBcIilcIikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZXRUcmFuc2Zvcm0obm9kZSwgXCJ0cmFuc2xhdGVYKFwiLmNvbmNhdCh4eS54LCBcInB4KSB0cmFuc2xhdGVZKFwiKS5jb25jYXQoeHkueSwgXCJweCkgdHJhbnNsYXRlWigwKVwiKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG52YXIgUkVfTlVNID0gL1tcXC0rXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVtcXC0rXT9cXGQrfCkvLnNvdXJjZTtcbnZhciBnZXRDb21wdXRlZFN0eWxlWDsgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM0ODU2NTQvMzA0MDYwNVxuXG5mdW5jdGlvbiBmb3JjZVJlbGF5b3V0KGVsZW0pIHtcbiAgdmFyIG9yaWdpbmFsU3R5bGUgPSBlbGVtLnN0eWxlLmRpc3BsYXk7XG4gIGVsZW0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgZWxlbS5vZmZzZXRIZWlnaHQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICBlbGVtLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbFN0eWxlO1xufVxuXG5mdW5jdGlvbiBjc3MoZWwsIG5hbWUsIHYpIHtcbiAgdmFyIHZhbHVlID0gdjtcblxuICBpZiAoX3R5cGVvZihuYW1lKSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHZhciBpIGluIG5hbWUpIHtcbiAgICAgIGlmIChuYW1lLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIGNzcyhlbCwgaSwgbmFtZVtpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhbHVlID0gXCJcIi5jb25jYXQodmFsdWUsIFwicHhcIik7XG4gICAgfVxuXG4gICAgZWwuc3R5bGVbbmFtZV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGVYKGVsLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UG9zaXRpb24oZWxlbSkge1xuICB2YXIgYm94O1xuICB2YXIgeDtcbiAgdmFyIHk7XG4gIHZhciBkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIHZhciBkb2NFbGVtID0gZG9jICYmIGRvYy5kb2N1bWVudEVsZW1lbnQ7IC8vIOagueaNriBHQlMg5pyA5paw5pWw5o2u77yMQS1HcmFkZSBCcm93c2VycyDpg73lt7LmlK/mjIEgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IOaWueazle+8jOS4jeeUqOWGjeiAg+iZkeS8oOe7n+eahOWunueOsOaWueW8j1xuXG4gIGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIOazqO+8mmpRdWVyeSDov5jogIPomZHlh4/ljrsgZG9jRWxlbS5jbGllbnRMZWZ0L2NsaWVudFRvcFxuICAvLyDkvYbmtYvor5Xlj5HnjrDvvIzov5nmoLflj43ogIzkvJrlr7zoh7TlvZMgaHRtbCDlkowgYm9keSDmnInovrnot50v6L655qGG5qC35byP5pe277yM6I635Y+W55qE5YC85LiN5q2j56GuXG4gIC8vIOatpOWklu+8jGllNiDkvJrlv73nlaUgaHRtbCDnmoQgbWFyZ2luIOWAvO+8jOW5uOi/kOWcsOaYr+ayoeacieiwgeS8muWOu+iuvue9riBodG1sIOeahCBtYXJnaW5cblxuICB4ID0gYm94LmxlZnQ7XG4gIHkgPSBib3gudG9wOyAvLyBJbiBJRSwgbW9zdCBvZiB0aGUgdGltZSwgMiBleHRyYSBwaXhlbHMgYXJlIGFkZGVkIHRvIHRoZSB0b3AgYW5kIGxlZnRcbiAgLy8gZHVlIHRvIHRoZSBpbXBsaWNpdCAyLXBpeGVsIGluc2V0IGJvcmRlci4gIEluIElFNi83IHF1aXJrcyBtb2RlIGFuZFxuICAvLyBJRTYgc3RhbmRhcmRzIG1vZGUsIHRoaXMgYm9yZGVyIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNldHRpbmcgdGhlXG4gIC8vIGRvY3VtZW50IGVsZW1lbnQncyBib3JkZXIgdG8gemVybyAtLSB0aHVzLCB3ZSBjYW5ub3QgcmVseSBvbiB0aGVcbiAgLy8gb2Zmc2V0IGFsd2F5cyBiZWluZyAyIHBpeGVscy5cbiAgLy8gSW4gcXVpcmtzIG1vZGUsIHRoZSBvZmZzZXQgY2FuIGJlIGRldGVybWluZWQgYnkgcXVlcnlpbmcgdGhlIGJvZHknc1xuICAvLyBjbGllbnRMZWZ0L2NsaWVudFRvcCwgYnV0IGluIHN0YW5kYXJkcyBtb2RlLCBpdCBpcyBmb3VuZCBieSBxdWVyeWluZ1xuICAvLyB0aGUgZG9jdW1lbnQgZWxlbWVudCdzIGNsaWVudExlZnQvY2xpZW50VG9wLiAgU2luY2Ugd2UgYWxyZWFkeSBjYWxsZWRcbiAgLy8gZ2V0Q2xpZW50Qm91bmRpbmdSZWN0IHdlIGhhdmUgYWxyZWFkeSBmb3JjZWQgYSByZWZsb3csIHNvIGl0IGlzIG5vdFxuICAvLyB0b28gZXhwZW5zaXZlIGp1c3QgdG8gcXVlcnkgdGhlbSBhbGwuXG4gIC8vIGllIOS4i+W6lOivpeWHj+WOu+eql+WPo+eahOi+ueahhuWQp++8jOavleern+m7mOiupCBhYnNvbHV0ZSDpg73mmK/nm7jlr7nnqpflj6PlrprkvY3nmoRcbiAgLy8g56qX5Y+j6L655qGG5qCH5YeG5piv6K6+IGRvY3VtZW50RWxlbWVudCAscXVpcmtzIOaXtuiuvue9riBib2R5XG4gIC8vIOacgOWlveemgeatouWcqCBib2R5IOWSjCBodG1sIOS4iui+ueahhiDvvIzkvYYgaWUgPCA5IGh0bWwg6buY6K6k5pyJIDJweCDvvIzlh4/ljrtcbiAgLy8g5L2G5piv6Z2eIGllIOS4jeWPr+iDveiuvue9rueql+WPo+i+ueahhu+8jGJvZHkgaHRtbCDkuZ/kuI3mmK/nqpflj6MgLGllIOWPr+S7pemAmui/hyBodG1sLGJvZHkg6K6+572uXG4gIC8vIOagh+WHhiBpZSDkuIsgZG9jRWxlbS5jbGllbnRUb3Ag5bCx5pivIGJvcmRlci10b3BcbiAgLy8gaWU3IGh0bWwg5Y2z56qX5Y+j6L655qGG5pS55Y+Y5LiN5LqG44CC5rC46L+c5Li6IDJcbiAgLy8g5L2G5qCH5YeGIGZpcmVmb3gvY2hyb21lL2llOSDkuIsgZG9jRWxlbS5jbGllbnRUb3Ag5piv56qX5Y+j6L655qGG77yM5Y2z5L2/6K6+5LqGIGJvcmRlci10b3Ag5Lmf5Li6IDBcblxuICB4IC09IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcbiAgeSAtPSBkb2NFbGVtLmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRvcCB8fCAwO1xuICByZXR1cm4ge1xuICAgIGxlZnQ6IHgsXG4gICAgdG9wOiB5XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFNjcm9sbCh3LCB0b3ApIHtcbiAgdmFyIHJldCA9IHdbXCJwYWdlXCIuY29uY2F0KHRvcCA/ICdZJyA6ICdYJywgXCJPZmZzZXRcIildO1xuICB2YXIgbWV0aG9kID0gXCJzY3JvbGxcIi5jb25jYXQodG9wID8gJ1RvcCcgOiAnTGVmdCcpO1xuXG4gIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuICAgIHZhciBkID0gdy5kb2N1bWVudDsgLy8gaWU2LDcsOCBzdGFuZGFyZCBtb2RlXG5cbiAgICByZXQgPSBkLmRvY3VtZW50RWxlbWVudFttZXRob2RdO1xuXG4gICAgaWYgKHR5cGVvZiByZXQgIT09ICdudW1iZXInKSB7XG4gICAgICAvLyBxdWlya3MgbW9kZVxuICAgICAgcmV0ID0gZC5ib2R5W21ldGhvZF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsTGVmdCh3KSB7XG4gIHJldHVybiBnZXRTY3JvbGwodyk7XG59XG5cbmZ1bmN0aW9uIGdldFNjcm9sbFRvcCh3KSB7XG4gIHJldHVybiBnZXRTY3JvbGwodywgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldChlbCkge1xuICB2YXIgcG9zID0gZ2V0Q2xpZW50UG9zaXRpb24oZWwpO1xuICB2YXIgZG9jID0gZWwub3duZXJEb2N1bWVudDtcbiAgdmFyIHcgPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgcG9zLmxlZnQgKz0gZ2V0U2Nyb2xsTGVmdCh3KTtcbiAgcG9zLnRvcCArPSBnZXRTY3JvbGxUb3Aodyk7XG4gIHJldHVybiBwb3M7XG59XG4vKipcbiAqIEEgY3J1ZGUgd2F5IG9mIGRldGVybWluaW5nIGlmIGFuIG9iamVjdCBpcyBhIHdpbmRvd1xuICogQG1lbWJlciB1dGlsXG4gKi9cblxuXG5mdW5jdGlvbiBpc1dpbmRvdyhvYmopIHtcbiAgLy8gbXVzdCB1c2UgPT0gZm9yIGllOFxuXG4gIC8qIGVzbGludCBlcWVxZXE6MCAqL1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiA9PSBvYmoud2luZG93O1xufVxuXG5mdW5jdGlvbiBnZXREb2N1bWVudChub2RlKSB7XG4gIGlmIChpc1dpbmRvdyhub2RlKSkge1xuICAgIHJldHVybiBub2RlLmRvY3VtZW50O1xuICB9XG5cbiAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG5hbWUsIGNzKSB7XG4gIHZhciBjb21wdXRlZFN0eWxlID0gY3M7XG4gIHZhciB2YWwgPSAnJztcbiAgdmFyIGQgPSBnZXREb2N1bWVudChlbGVtKTtcbiAgY29tcHV0ZWRTdHlsZSA9IGNvbXB1dGVkU3R5bGUgfHwgZC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOyAvLyBodHRwczovL2dpdGh1Yi5jb20va2lzc3l0ZWFtL2tpc3N5L2lzc3Vlcy82MVxuXG4gIGlmIChjb21wdXRlZFN0eWxlKSB7XG4gICAgdmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpIHx8IGNvbXB1dGVkU3R5bGVbbmFtZV07XG4gIH1cblxuICByZXR1cm4gdmFsO1xufVxuXG52YXIgX1JFX05VTV9OT19QWCA9IG5ldyBSZWdFeHAoXCJeKFwiLmNvbmNhdChSRV9OVU0sIFwiKSg/IXB4KVthLXolXSskXCIpLCAnaScpO1xuXG52YXIgUkVfUE9TID0gL14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvO1xudmFyIENVUlJFTlRfU1RZTEUgPSAnY3VycmVudFN0eWxlJztcbnZhciBSVU5USU1FX1NUWUxFID0gJ3J1bnRpbWVTdHlsZSc7XG52YXIgTEVGVCA9ICdsZWZ0JztcbnZhciBQWCA9ICdweCc7XG5cbmZ1bmN0aW9uIF9nZXRDb21wdXRlZFN0eWxlSUUoZWxlbSwgbmFtZSkge1xuICAvLyBjdXJyZW50U3R5bGUgbWF5YmUgbnVsbFxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzUyMzEuYXNweFxuICB2YXIgcmV0ID0gZWxlbVtDVVJSRU5UX1NUWUxFXSAmJiBlbGVtW0NVUlJFTlRfU1RZTEVdW25hbWVdOyAvLyDlvZMgd2lkdGgvaGVpZ2h0IOiuvue9ruS4uueZvuWIhuavlOaXtu+8jOmAmui/hyBwaXhlbExlZnQg5pa55byP6L2s5o2i55qEIHdpZHRoL2hlaWdodCDlgLxcbiAgLy8g5LiA5byA5aeL5bCx5aSE55CG5LqGISBDVVNUT01fU1RZTEUuaGVpZ2h0LENVU1RPTV9TVFlMRS53aWR0aCAsY3NzSG9vayDop6PlhrNAMjAxMS0wOC0xOVxuICAvLyDlnKggaWUg5LiL5LiN5a+577yM6ZyA6KaB55u05o6l55SoIG9mZnNldCDmlrnlvI9cbiAgLy8gYm9yZGVyV2lkdGgg562J5YC85Lmf5pyJ6Zeu6aKY77yM5L2G6ICD6JmR5YiwIGJvcmRlcldpZHRoIOiuvuS4uueZvuWIhuavlOeahOamgueOh+W+iOWwj++8jOi/memHjOWwseS4jeiAg+iZkeS6hlxuICAvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXG4gIC8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTFcbiAgLy8gSWYgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIHJlZ3VsYXIgcGl4ZWwgbnVtYmVyXG4gIC8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVsc1xuICAvLyBleGNsdWRlIGxlZnQgcmlnaHQgZm9yIHJlbGF0aXZpdHlcblxuICBpZiAoX1JFX05VTV9OT19QWC50ZXN0KHJldCkgJiYgIVJFX1BPUy50ZXN0KG5hbWUpKSB7XG4gICAgLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuICAgIHZhciBzdHlsZSA9IGVsZW0uc3R5bGU7XG4gICAgdmFyIGxlZnQgPSBzdHlsZVtMRUZUXTtcbiAgICB2YXIgcnNMZWZ0ID0gZWxlbVtSVU5USU1FX1NUWUxFXVtMRUZUXTsgLy8gcHJldmVudCBmbGFzaGluZyBvZiBjb250ZW50XG5cbiAgICBlbGVtW1JVTlRJTUVfU1RZTEVdW0xFRlRdID0gZWxlbVtDVVJSRU5UX1NUWUxFXVtMRUZUXTsgLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXG4gICAgc3R5bGVbTEVGVF0gPSBuYW1lID09PSAnZm9udFNpemUnID8gJzFlbScgOiByZXQgfHwgMDtcbiAgICByZXQgPSBzdHlsZS5waXhlbExlZnQgKyBQWDsgLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXG4gICAgc3R5bGVbTEVGVF0gPSBsZWZ0O1xuICAgIGVsZW1bUlVOVElNRV9TVFlMRV1bTEVGVF0gPSByc0xlZnQ7XG4gIH1cblxuICByZXR1cm4gcmV0ID09PSAnJyA/ICdhdXRvJyA6IHJldDtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIGdldENvbXB1dGVkU3R5bGVYID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUgPyBfZ2V0Q29tcHV0ZWRTdHlsZSA6IF9nZXRDb21wdXRlZFN0eWxlSUU7XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldERpcmVjdGlvbihkaXIsIG9wdGlvbikge1xuICBpZiAoZGlyID09PSAnbGVmdCcpIHtcbiAgICByZXR1cm4gb3B0aW9uLnVzZUNzc1JpZ2h0ID8gJ3JpZ2h0JyA6IGRpcjtcbiAgfVxuXG4gIHJldHVybiBvcHRpb24udXNlQ3NzQm90dG9tID8gJ2JvdHRvbScgOiBkaXI7XG59XG5cbmZ1bmN0aW9uIG9wcG9zaXRlT2Zmc2V0RGlyZWN0aW9uKGRpcikge1xuICBpZiAoZGlyID09PSAnbGVmdCcpIHtcbiAgICByZXR1cm4gJ3JpZ2h0JztcbiAgfSBlbHNlIGlmIChkaXIgPT09ICdyaWdodCcpIHtcbiAgICByZXR1cm4gJ2xlZnQnO1xuICB9IGVsc2UgaWYgKGRpciA9PT0gJ3RvcCcpIHtcbiAgICByZXR1cm4gJ2JvdHRvbSc7XG4gIH0gZWxzZSBpZiAoZGlyID09PSAnYm90dG9tJykge1xuICAgIHJldHVybiAndG9wJztcbiAgfVxufSAvLyDorr7nva4gZWxlbSDnm7jlr7kgZWxlbS5vd25lckRvY3VtZW50IOeahOWdkOagh1xuXG5cbmZ1bmN0aW9uIHNldExlZnRUb3AoZWxlbSwgb2Zmc2V0LCBvcHRpb24pIHtcbiAgLy8gc2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuICBpZiAoY3NzKGVsZW0sICdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgIGVsZW0uc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICB9XG5cbiAgdmFyIHByZXNldEggPSAtOTk5O1xuICB2YXIgcHJlc2V0ViA9IC05OTk7XG4gIHZhciBob3Jpem9udGFsUHJvcGVydHkgPSBnZXRPZmZzZXREaXJlY3Rpb24oJ2xlZnQnLCBvcHRpb24pO1xuICB2YXIgdmVydGljYWxQcm9wZXJ0eSA9IGdldE9mZnNldERpcmVjdGlvbigndG9wJywgb3B0aW9uKTtcbiAgdmFyIG9wcG9zaXRlSG9yaXpvbnRhbFByb3BlcnR5ID0gb3Bwb3NpdGVPZmZzZXREaXJlY3Rpb24oaG9yaXpvbnRhbFByb3BlcnR5KTtcbiAgdmFyIG9wcG9zaXRlVmVydGljYWxQcm9wZXJ0eSA9IG9wcG9zaXRlT2Zmc2V0RGlyZWN0aW9uKHZlcnRpY2FsUHJvcGVydHkpO1xuXG4gIGlmIChob3Jpem9udGFsUHJvcGVydHkgIT09ICdsZWZ0Jykge1xuICAgIHByZXNldEggPSA5OTk7XG4gIH1cblxuICBpZiAodmVydGljYWxQcm9wZXJ0eSAhPT0gJ3RvcCcpIHtcbiAgICBwcmVzZXRWID0gOTk5O1xuICB9XG5cbiAgdmFyIG9yaWdpbmFsVHJhbnNpdGlvbiA9ICcnO1xuICB2YXIgb3JpZ2luYWxPZmZzZXQgPSBnZXRPZmZzZXQoZWxlbSk7XG5cbiAgaWYgKCdsZWZ0JyBpbiBvZmZzZXQgfHwgJ3RvcCcgaW4gb2Zmc2V0KSB7XG4gICAgb3JpZ2luYWxUcmFuc2l0aW9uID0gZ2V0VHJhbnNpdGlvblByb3BlcnR5KGVsZW0pIHx8ICcnO1xuICAgIHNldFRyYW5zaXRpb25Qcm9wZXJ0eShlbGVtLCAnbm9uZScpO1xuICB9XG5cbiAgaWYgKCdsZWZ0JyBpbiBvZmZzZXQpIHtcbiAgICBlbGVtLnN0eWxlW29wcG9zaXRlSG9yaXpvbnRhbFByb3BlcnR5XSA9ICcnO1xuICAgIGVsZW0uc3R5bGVbaG9yaXpvbnRhbFByb3BlcnR5XSA9IFwiXCIuY29uY2F0KHByZXNldEgsIFwicHhcIik7XG4gIH1cblxuICBpZiAoJ3RvcCcgaW4gb2Zmc2V0KSB7XG4gICAgZWxlbS5zdHlsZVtvcHBvc2l0ZVZlcnRpY2FsUHJvcGVydHldID0gJyc7XG4gICAgZWxlbS5zdHlsZVt2ZXJ0aWNhbFByb3BlcnR5XSA9IFwiXCIuY29uY2F0KHByZXNldFYsIFwicHhcIik7XG4gIH0gLy8gZm9yY2UgcmVsYXlvdXRcblxuXG4gIGZvcmNlUmVsYXlvdXQoZWxlbSk7XG4gIHZhciBvbGQgPSBnZXRPZmZzZXQoZWxlbSk7XG4gIHZhciBvcmlnaW5hbFN0eWxlID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIG9mZnNldCkge1xuICAgIGlmIChvZmZzZXQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgdmFyIGRpciA9IGdldE9mZnNldERpcmVjdGlvbihrZXksIG9wdGlvbik7XG4gICAgICB2YXIgcHJlc2V0ID0ga2V5ID09PSAnbGVmdCcgPyBwcmVzZXRIIDogcHJlc2V0VjtcbiAgICAgIHZhciBvZmYgPSBvcmlnaW5hbE9mZnNldFtrZXldIC0gb2xkW2tleV07XG5cbiAgICAgIGlmIChkaXIgPT09IGtleSkge1xuICAgICAgICBvcmlnaW5hbFN0eWxlW2Rpcl0gPSBwcmVzZXQgKyBvZmY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbFN0eWxlW2Rpcl0gPSBwcmVzZXQgLSBvZmY7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3NzKGVsZW0sIG9yaWdpbmFsU3R5bGUpOyAvLyBmb3JjZSByZWxheW91dFxuXG4gIGZvcmNlUmVsYXlvdXQoZWxlbSk7XG5cbiAgaWYgKCdsZWZ0JyBpbiBvZmZzZXQgfHwgJ3RvcCcgaW4gb2Zmc2V0KSB7XG4gICAgc2V0VHJhbnNpdGlvblByb3BlcnR5KGVsZW0sIG9yaWdpbmFsVHJhbnNpdGlvbik7XG4gIH1cblxuICB2YXIgcmV0ID0ge307XG5cbiAgZm9yICh2YXIgX2tleSBpbiBvZmZzZXQpIHtcbiAgICBpZiAob2Zmc2V0Lmhhc093blByb3BlcnR5KF9rZXkpKSB7XG4gICAgICB2YXIgX2RpciA9IGdldE9mZnNldERpcmVjdGlvbihfa2V5LCBvcHRpb24pO1xuXG4gICAgICB2YXIgX29mZiA9IG9mZnNldFtfa2V5XSAtIG9yaWdpbmFsT2Zmc2V0W19rZXldO1xuXG4gICAgICBpZiAoX2tleSA9PT0gX2Rpcikge1xuICAgICAgICByZXRbX2Rpcl0gPSBvcmlnaW5hbFN0eWxlW19kaXJdICsgX29mZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFtfZGlyXSA9IG9yaWdpbmFsU3R5bGVbX2Rpcl0gLSBfb2ZmO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNzcyhlbGVtLCByZXQpO1xufVxuXG5mdW5jdGlvbiBzZXRUcmFuc2Zvcm0kMShlbGVtLCBvZmZzZXQpIHtcbiAgdmFyIG9yaWdpbmFsT2Zmc2V0ID0gZ2V0T2Zmc2V0KGVsZW0pO1xuICB2YXIgb3JpZ2luYWxYWSA9IGdldFRyYW5zZm9ybVhZKGVsZW0pO1xuICB2YXIgcmVzdWx0WFkgPSB7XG4gICAgeDogb3JpZ2luYWxYWS54LFxuICAgIHk6IG9yaWdpbmFsWFkueVxuICB9O1xuXG4gIGlmICgnbGVmdCcgaW4gb2Zmc2V0KSB7XG4gICAgcmVzdWx0WFkueCA9IG9yaWdpbmFsWFkueCArIG9mZnNldC5sZWZ0IC0gb3JpZ2luYWxPZmZzZXQubGVmdDtcbiAgfVxuXG4gIGlmICgndG9wJyBpbiBvZmZzZXQpIHtcbiAgICByZXN1bHRYWS55ID0gb3JpZ2luYWxYWS55ICsgb2Zmc2V0LnRvcCAtIG9yaWdpbmFsT2Zmc2V0LnRvcDtcbiAgfVxuXG4gIHNldFRyYW5zZm9ybVhZKGVsZW0sIHJlc3VsdFhZKTtcbn1cblxuZnVuY3Rpb24gc2V0T2Zmc2V0KGVsZW0sIG9mZnNldCwgb3B0aW9uKSB7XG4gIGlmIChvcHRpb24uaWdub3JlU2hha2UpIHtcbiAgICB2YXIgb3JpT2Zmc2V0ID0gZ2V0T2Zmc2V0KGVsZW0pO1xuICAgIHZhciBvTGVmdCA9IG9yaU9mZnNldC5sZWZ0LnRvRml4ZWQoMCk7XG4gICAgdmFyIG9Ub3AgPSBvcmlPZmZzZXQudG9wLnRvRml4ZWQoMCk7XG4gICAgdmFyIHRMZWZ0ID0gb2Zmc2V0LmxlZnQudG9GaXhlZCgwKTtcbiAgICB2YXIgdFRvcCA9IG9mZnNldC50b3AudG9GaXhlZCgwKTtcblxuICAgIGlmIChvTGVmdCA9PT0gdExlZnQgJiYgb1RvcCA9PT0gdFRvcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb24udXNlQ3NzUmlnaHQgfHwgb3B0aW9uLnVzZUNzc0JvdHRvbSkge1xuICAgIHNldExlZnRUb3AoZWxlbSwgb2Zmc2V0LCBvcHRpb24pO1xuICB9IGVsc2UgaWYgKG9wdGlvbi51c2VDc3NUcmFuc2Zvcm0gJiYgZ2V0VHJhbnNmb3JtTmFtZSgpIGluIGRvY3VtZW50LmJvZHkuc3R5bGUpIHtcbiAgICBzZXRUcmFuc2Zvcm0kMShlbGVtLCBvZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIHNldExlZnRUb3AoZWxlbSwgb2Zmc2V0LCBvcHRpb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVhY2goYXJyLCBmbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGZuKGFycltpXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNCb3JkZXJCb3hGbihlbGVtKSB7XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlWChlbGVtLCAnYm94U2l6aW5nJykgPT09ICdib3JkZXItYm94Jztcbn1cblxudmFyIEJPWF9NT0RFTFMgPSBbJ21hcmdpbicsICdib3JkZXInLCAncGFkZGluZyddO1xudmFyIENPTlRFTlRfSU5ERVggPSAtMTtcbnZhciBQQURESU5HX0lOREVYID0gMjtcbnZhciBCT1JERVJfSU5ERVggPSAxO1xudmFyIE1BUkdJTl9JTkRFWCA9IDA7XG5cbmZ1bmN0aW9uIHN3YXAoZWxlbSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIG9sZCA9IHt9O1xuICB2YXIgc3R5bGUgPSBlbGVtLnN0eWxlO1xuICB2YXIgbmFtZTsgLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG5cbiAgZm9yIChuYW1lIGluIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgb2xkW25hbWVdID0gc3R5bGVbbmFtZV07XG4gICAgICBzdHlsZVtuYW1lXSA9IG9wdGlvbnNbbmFtZV07XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2suY2FsbChlbGVtKTsgLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cbiAgZm9yIChuYW1lIGluIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgc3R5bGVbbmFtZV0gPSBvbGRbbmFtZV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBCTVdpZHRoKGVsZW0sIHByb3BzLCB3aGljaCkge1xuICB2YXIgdmFsdWUgPSAwO1xuICB2YXIgcHJvcDtcbiAgdmFyIGo7XG4gIHZhciBpO1xuXG4gIGZvciAoaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgIHByb3AgPSBwcm9wc1tqXTtcblxuICAgIGlmIChwcm9wKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgd2hpY2gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNzc1Byb3AgPSB2b2lkIDA7XG5cbiAgICAgICAgaWYgKHByb3AgPT09ICdib3JkZXInKSB7XG4gICAgICAgICAgY3NzUHJvcCA9IFwiXCIuY29uY2F0KHByb3ApLmNvbmNhdCh3aGljaFtpXSwgXCJXaWR0aFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjc3NQcm9wID0gcHJvcCArIHdoaWNoW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlWChlbGVtLCBjc3NQcm9wKSkgfHwgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBkb21VdGlscyA9IHtcbiAgZ2V0UGFyZW50OiBmdW5jdGlvbiBnZXRQYXJlbnQoZWxlbWVudCkge1xuICAgIHZhciBwYXJlbnQgPSBlbGVtZW50O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50Lmhvc3QpIHtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Lmhvc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gOSk7XG5cbiAgICByZXR1cm4gcGFyZW50O1xuICB9XG59O1xuZWFjaChbJ1dpZHRoJywgJ0hlaWdodCddLCBmdW5jdGlvbiAobmFtZSkge1xuICBkb21VdGlsc1tcImRvY1wiLmNvbmNhdChuYW1lKV0gPSBmdW5jdGlvbiAocmVmV2luKSB7XG4gICAgdmFyIGQgPSByZWZXaW4uZG9jdW1lbnQ7XG4gICAgcmV0dXJuIE1hdGgubWF4KCAvLyBmaXJlZm94IGNocm9tZSBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0PCBib2R5LnNjcm9sbEhlaWdodFxuICAgIC8vIGllIHN0YW5kYXJkIG1vZGUgOiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0PiBib2R5LnNjcm9sbEhlaWdodFxuICAgIGQuZG9jdW1lbnRFbGVtZW50W1wic2Nyb2xsXCIuY29uY2F0KG5hbWUpXSwgLy8gcXVpcmtzIDogZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCDmnIDlpKfnrYnkuo7lj6/op4bnqpflj6PlpJrkuIDngrnvvJ9cbiAgICBkLmJvZHlbXCJzY3JvbGxcIi5jb25jYXQobmFtZSldLCBkb21VdGlsc1tcInZpZXdwb3J0XCIuY29uY2F0KG5hbWUpXShkKSk7XG4gIH07XG5cbiAgZG9tVXRpbHNbXCJ2aWV3cG9ydFwiLmNvbmNhdChuYW1lKV0gPSBmdW5jdGlvbiAod2luKSB7XG4gICAgLy8gcGMgYnJvd3NlciBpbmNsdWRlcyBzY3JvbGxiYXIgaW4gd2luZG93LmlubmVyV2lkdGhcbiAgICB2YXIgcHJvcCA9IFwiY2xpZW50XCIuY29uY2F0KG5hbWUpO1xuICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gICAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50UHJvcCA9IGRvY3VtZW50RWxlbWVudFtwcm9wXTsgLy8g5qCH5YeG5qih5byP5Y+WIGRvY3VtZW50RWxlbWVudFxuICAgIC8vIGJhY2tjb21wYXQg5Y+WIGJvZHlcblxuICAgIHJldHVybiBkb2MuY29tcGF0TW9kZSA9PT0gJ0NTUzFDb21wYXQnICYmIGRvY3VtZW50RWxlbWVudFByb3AgfHwgYm9keSAmJiBib2R5W3Byb3BdIHx8IGRvY3VtZW50RWxlbWVudFByb3A7XG4gIH07XG59KTtcbi8qXG4g5b6X5Yiw5YWD57Sg55qE5aSn5bCP5L+h5oGvXG4gQHBhcmFtIGVsZW1cbiBAcGFyYW0gbmFtZVxuIEBwYXJhbSB7U3RyaW5nfSBbZXh0cmFdICAncGFkZGluZycgOiAoY3NzIHdpZHRoKSArIHBhZGRpbmdcbiAnYm9yZGVyJyA6IChjc3Mgd2lkdGgpICsgcGFkZGluZyArIGJvcmRlclxuICdtYXJnaW4nIDogKGNzcyB3aWR0aCkgKyBwYWRkaW5nICsgYm9yZGVyICsgbWFyZ2luXG4gKi9cblxuZnVuY3Rpb24gZ2V0V0goZWxlbSwgbmFtZSwgZXgpIHtcbiAgdmFyIGV4dHJhID0gZXg7XG5cbiAgaWYgKGlzV2luZG93KGVsZW0pKSB7XG4gICAgcmV0dXJuIG5hbWUgPT09ICd3aWR0aCcgPyBkb21VdGlscy52aWV3cG9ydFdpZHRoKGVsZW0pIDogZG9tVXRpbHMudmlld3BvcnRIZWlnaHQoZWxlbSk7XG4gIH0gZWxzZSBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gOSkge1xuICAgIHJldHVybiBuYW1lID09PSAnd2lkdGgnID8gZG9tVXRpbHMuZG9jV2lkdGgoZWxlbSkgOiBkb21VdGlscy5kb2NIZWlnaHQoZWxlbSk7XG4gIH1cblxuICB2YXIgd2hpY2ggPSBuYW1lID09PSAnd2lkdGgnID8gWydMZWZ0JywgJ1JpZ2h0J10gOiBbJ1RvcCcsICdCb3R0b20nXTtcbiAgdmFyIGJvcmRlckJveFZhbHVlID0gbmFtZSA9PT0gJ3dpZHRoJyA/IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgdmFyIGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlWChlbGVtKTtcbiAgdmFyIGlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3hGbihlbGVtKTtcbiAgdmFyIGNzc0JveFZhbHVlID0gMDtcblxuICBpZiAoYm9yZGVyQm94VmFsdWUgPT09IG51bGwgfHwgYm9yZGVyQm94VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBib3JkZXJCb3hWYWx1ZSA8PSAwKSB7XG4gICAgYm9yZGVyQm94VmFsdWUgPSB1bmRlZmluZWQ7IC8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuIGNvbXB1dGVkIGNzcyBpZiBuZWNlc3NhcnlcblxuICAgIGNzc0JveFZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZVgoZWxlbSwgbmFtZSk7XG5cbiAgICBpZiAoY3NzQm94VmFsdWUgPT09IG51bGwgfHwgY3NzQm94VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBOdW1iZXIoY3NzQm94VmFsdWUpIDwgMCkge1xuICAgICAgY3NzQm94VmFsdWUgPSBlbGVtLnN0eWxlW25hbWVdIHx8IDA7XG4gICAgfSAvLyBOb3JtYWxpemUgJycsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuXG5cbiAgICBjc3NCb3hWYWx1ZSA9IHBhcnNlRmxvYXQoY3NzQm94VmFsdWUpIHx8IDA7XG4gIH1cblxuICBpZiAoZXh0cmEgPT09IHVuZGVmaW5lZCkge1xuICAgIGV4dHJhID0gaXNCb3JkZXJCb3ggPyBCT1JERVJfSU5ERVggOiBDT05URU5UX0lOREVYO1xuICB9XG5cbiAgdmFyIGJvcmRlckJveFZhbHVlT3JJc0JvcmRlckJveCA9IGJvcmRlckJveFZhbHVlICE9PSB1bmRlZmluZWQgfHwgaXNCb3JkZXJCb3g7XG4gIHZhciB2YWwgPSBib3JkZXJCb3hWYWx1ZSB8fCBjc3NCb3hWYWx1ZTtcblxuICBpZiAoZXh0cmEgPT09IENPTlRFTlRfSU5ERVgpIHtcbiAgICBpZiAoYm9yZGVyQm94VmFsdWVPcklzQm9yZGVyQm94KSB7XG4gICAgICByZXR1cm4gdmFsIC0gZ2V0UEJNV2lkdGgoZWxlbSwgWydib3JkZXInLCAncGFkZGluZyddLCB3aGljaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNzc0JveFZhbHVlO1xuICB9IGVsc2UgaWYgKGJvcmRlckJveFZhbHVlT3JJc0JvcmRlckJveCkge1xuICAgIGlmIChleHRyYSA9PT0gQk9SREVSX0lOREVYKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWwgKyAoZXh0cmEgPT09IFBBRERJTkdfSU5ERVggPyAtZ2V0UEJNV2lkdGgoZWxlbSwgWydib3JkZXInXSwgd2hpY2gpIDogZ2V0UEJNV2lkdGgoZWxlbSwgWydtYXJnaW4nXSwgd2hpY2gpKTtcbiAgfVxuXG4gIHJldHVybiBjc3NCb3hWYWx1ZSArIGdldFBCTVdpZHRoKGVsZW0sIEJPWF9NT0RFTFMuc2xpY2UoZXh0cmEpLCB3aGljaCk7XG59XG5cbnZhciBjc3NTaG93ID0ge1xuICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gIGRpc3BsYXk6ICdibG9jaydcbn07IC8vIGZpeCAjMTE5IDogaHR0cHM6Ly9naXRodWIuY29tL2tpc3N5dGVhbS9raXNzeS9pc3N1ZXMvMTE5XG5cbmZ1bmN0aW9uIGdldFdISWdub3JlRGlzcGxheSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG5cbiAgdmFyIHZhbDtcbiAgdmFyIGVsZW0gPSBhcmdzWzBdOyAvLyBpbiBjYXNlIGVsZW0gaXMgd2luZG93XG4gIC8vIGVsZW0ub2Zmc2V0V2lkdGggPT09IHVuZGVmaW5lZFxuXG4gIGlmIChlbGVtLm9mZnNldFdpZHRoICE9PSAwKSB7XG4gICAgdmFsID0gZ2V0V0guYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBzd2FwKGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbCA9IGdldFdILmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufVxuXG5lYWNoKFsnd2lkdGgnLCAnaGVpZ2h0J10sIGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciBmaXJzdCA9IG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIGRvbVV0aWxzW1wib3V0ZXJcIi5jb25jYXQoZmlyc3QpXSA9IGZ1bmN0aW9uIChlbCwgaW5jbHVkZU1hcmdpbikge1xuICAgIHJldHVybiBlbCAmJiBnZXRXSElnbm9yZURpc3BsYXkoZWwsIG5hbWUsIGluY2x1ZGVNYXJnaW4gPyBNQVJHSU5fSU5ERVggOiBCT1JERVJfSU5ERVgpO1xuICB9O1xuXG4gIHZhciB3aGljaCA9IG5hbWUgPT09ICd3aWR0aCcgPyBbJ0xlZnQnLCAnUmlnaHQnXSA6IFsnVG9wJywgJ0JvdHRvbSddO1xuXG4gIGRvbVV0aWxzW25hbWVdID0gZnVuY3Rpb24gKGVsZW0sIHYpIHtcbiAgICB2YXIgdmFsID0gdjtcblxuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlWChlbGVtKTtcbiAgICAgICAgdmFyIGlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3hGbihlbGVtKTtcblxuICAgICAgICBpZiAoaXNCb3JkZXJCb3gpIHtcbiAgICAgICAgICB2YWwgKz0gZ2V0UEJNV2lkdGgoZWxlbSwgWydwYWRkaW5nJywgJ2JvcmRlciddLCB3aGljaCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3NzKGVsZW0sIG5hbWUsIHZhbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW0gJiYgZ2V0V0hJZ25vcmVEaXNwbGF5KGVsZW0sIG5hbWUsIENPTlRFTlRfSU5ERVgpO1xuICB9O1xufSk7XG5cbmZ1bmN0aW9uIG1peCh0bywgZnJvbSkge1xuICBmb3IgKHZhciBpIGluIGZyb20pIHtcbiAgICBpZiAoZnJvbS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgdG9baV0gPSBmcm9tW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0bztcbn1cblxudmFyIHV0aWxzID0ge1xuICBnZXRXaW5kb3c6IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gICAgaWYgKG5vZGUgJiYgbm9kZS5kb2N1bWVudCAmJiBub2RlLnNldFRpbWVvdXQpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZTtcbiAgICByZXR1cm4gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gIH0sXG4gIGdldERvY3VtZW50OiBnZXREb2N1bWVudCxcbiAgb2Zmc2V0OiBmdW5jdGlvbiBvZmZzZXQoZWwsIHZhbHVlLCBvcHRpb24pIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgc2V0T2Zmc2V0KGVsLCB2YWx1ZSwgb3B0aW9uIHx8IHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldE9mZnNldChlbCk7XG4gICAgfVxuICB9LFxuICBpc1dpbmRvdzogaXNXaW5kb3csXG4gIGVhY2g6IGVhY2gsXG4gIGNzczogY3NzLFxuICBjbG9uZTogZnVuY3Rpb24gY2xvbmUob2JqKSB7XG4gICAgdmFyIGk7XG4gICAgdmFyIHJldCA9IHt9O1xuXG4gICAgZm9yIChpIGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICByZXRbaV0gPSBvYmpbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG92ZXJmbG93ID0gb2JqLm92ZXJmbG93O1xuXG4gICAgaWYgKG92ZXJmbG93KSB7XG4gICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICByZXQub3ZlcmZsb3dbaV0gPSBvYmoub3ZlcmZsb3dbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBtaXg6IG1peCxcbiAgZ2V0V2luZG93U2Nyb2xsTGVmdDogZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsTGVmdCh3KSB7XG4gICAgcmV0dXJuIGdldFNjcm9sbExlZnQodyk7XG4gIH0sXG4gIGdldFdpbmRvd1Njcm9sbFRvcDogZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsVG9wKHcpIHtcbiAgICByZXR1cm4gZ2V0U2Nyb2xsVG9wKHcpO1xuICB9LFxuICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7XG4gICAgdmFyIHJldCA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHV0aWxzLm1peChyZXQsIGkgPCAwIHx8IGFyZ3VtZW50cy5sZW5ndGggPD0gaSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfSxcbiAgdmlld3BvcnRXaWR0aDogMCxcbiAgdmlld3BvcnRIZWlnaHQ6IDBcbn07XG5taXgodXRpbHMsIGRvbVV0aWxzKTtcblxuLyoqXG4gKiDlvpfliLDkvJrlr7zoh7TlhYPntKDmmL7npLrkuI3lhajnmoTnpZblhYjlhYPntKBcbiAqL1xuXG52YXIgZ2V0UGFyZW50ID0gdXRpbHMuZ2V0UGFyZW50O1xuXG5mdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAodXRpbHMuaXNXaW5kb3coZWxlbWVudCkgfHwgZWxlbWVudC5ub2RlVHlwZSA9PT0gOSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIGllIOi/meS4quS5n+S4jeaYr+WujOWFqOWPr+ihjFxuXG4gIC8qXG4gICA8ZGl2IHN0eWxlPVwid2lkdGg6IDUwcHg7aGVpZ2h0OiAxMDBweDtvdmVyZmxvdzogaGlkZGVuXCI+XG4gICA8ZGl2IHN0eWxlPVwid2lkdGg6IDUwcHg7aGVpZ2h0OiAxMDBweDtwb3NpdGlvbjogcmVsYXRpdmU7XCIgaWQ9XCJkNlwiPlxuICAg5YWD57SgIDYg6auYIDEwMHB4IOWuvSA1MHB4PGJyLz5cbiAgIDwvZGl2PlxuICAgPC9kaXY+XG4gICAqL1xuICAvLyBlbGVtZW50Lm9mZnNldFBhcmVudCBkb2VzIHRoZSByaWdodCB0aGluZyBpbiBpZTcgYW5kIGJlbG93LiBSZXR1cm4gcGFyZW50IHdpdGggbGF5b3V0IVxuICAvLyAgSW4gb3RoZXIgYnJvd3NlcnMgaXQgb25seSBpbmNsdWRlcyBlbGVtZW50cyB3aXRoIHBvc2l0aW9uIGFic29sdXRlLCByZWxhdGl2ZSBvclxuICAvLyBmaXhlZCwgbm90IGVsZW1lbnRzIHdpdGggb3ZlcmZsb3cgc2V0IHRvIGF1dG8gb3Igc2Nyb2xsLlxuICAvLyAgICAgICAgaWYgKFVBLmllICYmIGllTW9kZSA8IDgpIHtcbiAgLy8gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG4gIC8vICAgICAgICB9XG4gIC8vIOe7n+S4gOeahCBvZmZzZXRQYXJlbnQg5pa55rOVXG5cblxuICB2YXIgZG9jID0gdXRpbHMuZ2V0RG9jdW1lbnQoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIHZhciBwYXJlbnQ7XG4gIHZhciBwb3NpdGlvblN0eWxlID0gdXRpbHMuY3NzKGVsZW1lbnQsICdwb3NpdGlvbicpO1xuICB2YXIgc2tpcFN0YXRpYyA9IHBvc2l0aW9uU3R5bGUgPT09ICdmaXhlZCcgfHwgcG9zaXRpb25TdHlsZSA9PT0gJ2Fic29sdXRlJztcblxuICBpZiAoIXNraXBTdGF0aWMpIHtcbiAgICByZXR1cm4gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaHRtbCcgPyBudWxsIDogZ2V0UGFyZW50KGVsZW1lbnQpO1xuICB9XG5cbiAgZm9yIChwYXJlbnQgPSBnZXRQYXJlbnQoZWxlbWVudCk7IHBhcmVudCAmJiBwYXJlbnQgIT09IGJvZHkgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSA5OyBwYXJlbnQgPSBnZXRQYXJlbnQocGFyZW50KSkge1xuICAgIHBvc2l0aW9uU3R5bGUgPSB1dGlscy5jc3MocGFyZW50LCAncG9zaXRpb24nKTtcblxuICAgIGlmIChwb3NpdGlvblN0eWxlICE9PSAnc3RhdGljJykge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGdldFBhcmVudCQxID0gdXRpbHMuZ2V0UGFyZW50O1xuZnVuY3Rpb24gaXNBbmNlc3RvckZpeGVkKGVsZW1lbnQpIHtcbiAgaWYgKHV0aWxzLmlzV2luZG93KGVsZW1lbnQpIHx8IGVsZW1lbnQubm9kZVR5cGUgPT09IDkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZG9jID0gdXRpbHMuZ2V0RG9jdW1lbnQoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIHZhciBwYXJlbnQgPSBudWxsO1xuXG4gIGZvciAocGFyZW50ID0gZ2V0UGFyZW50JDEoZWxlbWVudCk7IHBhcmVudCAmJiBwYXJlbnQgIT09IGJvZHk7IHBhcmVudCA9IGdldFBhcmVudCQxKHBhcmVudCkpIHtcbiAgICB2YXIgcG9zaXRpb25TdHlsZSA9IHV0aWxzLmNzcyhwYXJlbnQsICdwb3NpdGlvbicpO1xuXG4gICAgaWYgKHBvc2l0aW9uU3R5bGUgPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiDojrflvpflhYPntKDnmoTmmL7npLrpg6jliIbnmoTljLrln59cbiAqL1xuXG5mdW5jdGlvbiBnZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQoZWxlbWVudCwgYWx3YXlzQnlWaWV3cG9ydCkge1xuICB2YXIgdmlzaWJsZVJlY3QgPSB7XG4gICAgbGVmdDogMCxcbiAgICByaWdodDogSW5maW5pdHksXG4gICAgdG9wOiAwLFxuICAgIGJvdHRvbTogSW5maW5pdHlcbiAgfTtcbiAgdmFyIGVsID0gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuICB2YXIgZG9jID0gdXRpbHMuZ2V0RG9jdW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7IC8vIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlzaWJsZSByZWN0IGJ5IGNsaW1iaW5nIHRoZSBkb20gYWNjb3VudGluZyBmb3JcbiAgLy8gYWxsIHNjcm9sbGFibGUgY29udGFpbmVycy5cblxuICB3aGlsZSAoZWwpIHtcbiAgICAvLyBjbGllbnRXaWR0aCBpcyB6ZXJvIGZvciBpbmxpbmUgYmxvY2sgZWxlbWVudHMgaW4gaWUuXG4gICAgaWYgKChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKSA9PT0gLTEgfHwgZWwuY2xpZW50V2lkdGggIT09IDApICYmIC8vIGJvZHkgbWF5IGhhdmUgb3ZlcmZsb3cgc2V0IG9uIGl0LCB5ZXQgd2Ugc3RpbGwgZ2V0IHRoZSBlbnRpcmVcbiAgICAvLyB2aWV3cG9ydC4gSW4gc29tZSBicm93c2VycywgZWwub2Zmc2V0UGFyZW50IG1heSBiZVxuICAgIC8vIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgc28gY2hlY2sgZm9yIHRoYXQgdG9vLlxuICAgIGVsICE9PSBib2R5ICYmIGVsICE9PSBkb2N1bWVudEVsZW1lbnQgJiYgdXRpbHMuY3NzKGVsLCAnb3ZlcmZsb3cnKSAhPT0gJ3Zpc2libGUnKSB7XG4gICAgICB2YXIgcG9zID0gdXRpbHMub2Zmc2V0KGVsKTsgLy8gYWRkIGJvcmRlclxuXG4gICAgICBwb3MubGVmdCArPSBlbC5jbGllbnRMZWZ0O1xuICAgICAgcG9zLnRvcCArPSBlbC5jbGllbnRUb3A7XG4gICAgICB2aXNpYmxlUmVjdC50b3AgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC50b3AsIHBvcy50b3ApO1xuICAgICAgdmlzaWJsZVJlY3QucmlnaHQgPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5yaWdodCwgLy8gY29uc2lkZXIgYXJlYSB3aXRob3V0IHNjcm9sbEJhclxuICAgICAgcG9zLmxlZnQgKyBlbC5jbGllbnRXaWR0aCk7XG4gICAgICB2aXNpYmxlUmVjdC5ib3R0b20gPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5ib3R0b20sIHBvcy50b3AgKyBlbC5jbGllbnRIZWlnaHQpO1xuICAgICAgdmlzaWJsZVJlY3QubGVmdCA9IE1hdGgubWF4KHZpc2libGVSZWN0LmxlZnQsIHBvcy5sZWZ0KTtcbiAgICB9IGVsc2UgaWYgKGVsID09PSBib2R5IHx8IGVsID09PSBkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGVsID0gZ2V0T2Zmc2V0UGFyZW50KGVsKTtcbiAgfSAvLyBTZXQgZWxlbWVudCBwb3NpdGlvbiB0byBmaXhlZFxuICAvLyBtYWtlIHN1cmUgYWJzb2x1dGUgZWxlbWVudCBpdHNlbGYgZG9uJ3QgYWZmZWN0IGl0J3MgdmlzaWJsZSBhcmVhXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzc2MDFcblxuXG4gIHZhciBvcmlnaW5hbFBvc2l0aW9uID0gbnVsbDtcblxuICBpZiAoIXV0aWxzLmlzV2luZG93KGVsZW1lbnQpICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IDkpIHtcbiAgICBvcmlnaW5hbFBvc2l0aW9uID0gZWxlbWVudC5zdHlsZS5wb3NpdGlvbjtcbiAgICB2YXIgcG9zaXRpb24gPSB1dGlscy5jc3MoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzY3JvbGxYID0gdXRpbHMuZ2V0V2luZG93U2Nyb2xsTGVmdCh3aW4pO1xuICB2YXIgc2Nyb2xsWSA9IHV0aWxzLmdldFdpbmRvd1Njcm9sbFRvcCh3aW4pO1xuICB2YXIgdmlld3BvcnRXaWR0aCA9IHV0aWxzLnZpZXdwb3J0V2lkdGgod2luKTtcbiAgdmFyIHZpZXdwb3J0SGVpZ2h0ID0gdXRpbHMudmlld3BvcnRIZWlnaHQod2luKTtcbiAgdmFyIGRvY3VtZW50V2lkdGggPSBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gIHZhciBkb2N1bWVudEhlaWdodCA9IGRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7IC8vIHNjcm9sbFhYWCBvbiBodG1sIGlzIHN5bmMgd2l0aCBib2R5IHdoaWNoIG1lYW5zIG92ZXJmbG93OiBoaWRkZW4gb24gYm9keSBnZXRzIHdyb25nIHNjcm9sbFhYWC5cbiAgLy8gV2Ugc2hvdWxkIGN1dCB0aGlzIG91cnNlbGYuXG5cbiAgdmFyIGJvZHlTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGJvZHkpO1xuXG4gIGlmIChib2R5U3R5bGUub3ZlcmZsb3dYID09PSAnaGlkZGVuJykge1xuICAgIGRvY3VtZW50V2lkdGggPSB3aW4uaW5uZXJXaWR0aDtcbiAgfVxuXG4gIGlmIChib2R5U3R5bGUub3ZlcmZsb3dZID09PSAnaGlkZGVuJykge1xuICAgIGRvY3VtZW50SGVpZ2h0ID0gd2luLmlubmVySGVpZ2h0O1xuICB9IC8vIFJlc2V0IGVsZW1lbnQgcG9zaXRpb24gYWZ0ZXIgY2FsY3VsYXRlIHRoZSB2aXNpYmxlIGFyZWFcblxuXG4gIGlmIChlbGVtZW50LnN0eWxlKSB7XG4gICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IG9yaWdpbmFsUG9zaXRpb247XG4gIH1cblxuICBpZiAoYWx3YXlzQnlWaWV3cG9ydCB8fCBpc0FuY2VzdG9yRml4ZWQoZWxlbWVudCkpIHtcbiAgICAvLyBDbGlwIGJ5IHZpZXdwb3J0J3Mgc2l6ZS5cbiAgICB2aXNpYmxlUmVjdC5sZWZ0ID0gTWF0aC5tYXgodmlzaWJsZVJlY3QubGVmdCwgc2Nyb2xsWCk7XG4gICAgdmlzaWJsZVJlY3QudG9wID0gTWF0aC5tYXgodmlzaWJsZVJlY3QudG9wLCBzY3JvbGxZKTtcbiAgICB2aXNpYmxlUmVjdC5yaWdodCA9IE1hdGgubWluKHZpc2libGVSZWN0LnJpZ2h0LCBzY3JvbGxYICsgdmlld3BvcnRXaWR0aCk7XG4gICAgdmlzaWJsZVJlY3QuYm90dG9tID0gTWF0aC5taW4odmlzaWJsZVJlY3QuYm90dG9tLCBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIC8vIENsaXAgYnkgZG9jdW1lbnQncyBzaXplLlxuICAgIHZhciBtYXhWaXNpYmxlV2lkdGggPSBNYXRoLm1heChkb2N1bWVudFdpZHRoLCBzY3JvbGxYICsgdmlld3BvcnRXaWR0aCk7XG4gICAgdmlzaWJsZVJlY3QucmlnaHQgPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5yaWdodCwgbWF4VmlzaWJsZVdpZHRoKTtcbiAgICB2YXIgbWF4VmlzaWJsZUhlaWdodCA9IE1hdGgubWF4KGRvY3VtZW50SGVpZ2h0LCBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQpO1xuICAgIHZpc2libGVSZWN0LmJvdHRvbSA9IE1hdGgubWluKHZpc2libGVSZWN0LmJvdHRvbSwgbWF4VmlzaWJsZUhlaWdodCk7XG4gIH1cblxuICByZXR1cm4gdmlzaWJsZVJlY3QudG9wID49IDAgJiYgdmlzaWJsZVJlY3QubGVmdCA+PSAwICYmIHZpc2libGVSZWN0LmJvdHRvbSA+IHZpc2libGVSZWN0LnRvcCAmJiB2aXNpYmxlUmVjdC5yaWdodCA+IHZpc2libGVSZWN0LmxlZnQgPyB2aXNpYmxlUmVjdCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFkanVzdEZvclZpZXdwb3J0KGVsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QsIG92ZXJmbG93KSB7XG4gIHZhciBwb3MgPSB1dGlscy5jbG9uZShlbEZ1dHVyZVBvcyk7XG4gIHZhciBzaXplID0ge1xuICAgIHdpZHRoOiBlbFJlZ2lvbi53aWR0aCxcbiAgICBoZWlnaHQ6IGVsUmVnaW9uLmhlaWdodFxuICB9O1xuXG4gIGlmIChvdmVyZmxvdy5hZGp1c3RYICYmIHBvcy5sZWZ0IDwgdmlzaWJsZVJlY3QubGVmdCkge1xuICAgIHBvcy5sZWZ0ID0gdmlzaWJsZVJlY3QubGVmdDtcbiAgfSAvLyBMZWZ0IGVkZ2UgaW5zaWRlIGFuZCByaWdodCBlZGdlIG91dHNpZGUgdmlld3BvcnQsIHRyeSB0byByZXNpemUgaXQuXG5cblxuICBpZiAob3ZlcmZsb3cucmVzaXplV2lkdGggJiYgcG9zLmxlZnQgPj0gdmlzaWJsZVJlY3QubGVmdCAmJiBwb3MubGVmdCArIHNpemUud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodCkge1xuICAgIHNpemUud2lkdGggLT0gcG9zLmxlZnQgKyBzaXplLndpZHRoIC0gdmlzaWJsZVJlY3QucmlnaHQ7XG4gIH0gLy8gUmlnaHQgZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gbW92ZSBpdC5cblxuXG4gIGlmIChvdmVyZmxvdy5hZGp1c3RYICYmIHBvcy5sZWZ0ICsgc2l6ZS53aWR0aCA+IHZpc2libGVSZWN0LnJpZ2h0KSB7XG4gICAgLy8g5L+d6K+B5bem6L6555WM5ZKM5Y+v6KeG5Yy65Z+f5bem6L6555WM5a+56b2QXG4gICAgcG9zLmxlZnQgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC5yaWdodCAtIHNpemUud2lkdGgsIHZpc2libGVSZWN0LmxlZnQpO1xuICB9IC8vIFRvcCBlZGdlIG91dHNpZGUgdmlld3BvcnQsIHRyeSB0byBtb3ZlIGl0LlxuXG5cbiAgaWYgKG92ZXJmbG93LmFkanVzdFkgJiYgcG9zLnRvcCA8IHZpc2libGVSZWN0LnRvcCkge1xuICAgIHBvcy50b3AgPSB2aXNpYmxlUmVjdC50b3A7XG4gIH0gLy8gVG9wIGVkZ2UgaW5zaWRlIGFuZCBib3R0b20gZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gcmVzaXplIGl0LlxuXG5cbiAgaWYgKG92ZXJmbG93LnJlc2l6ZUhlaWdodCAmJiBwb3MudG9wID49IHZpc2libGVSZWN0LnRvcCAmJiBwb3MudG9wICsgc2l6ZS5oZWlnaHQgPiB2aXNpYmxlUmVjdC5ib3R0b20pIHtcbiAgICBzaXplLmhlaWdodCAtPSBwb3MudG9wICsgc2l6ZS5oZWlnaHQgLSB2aXNpYmxlUmVjdC5ib3R0b207XG4gIH0gLy8gQm90dG9tIGVkZ2Ugb3V0c2lkZSB2aWV3cG9ydCwgdHJ5IHRvIG1vdmUgaXQuXG5cblxuICBpZiAob3ZlcmZsb3cuYWRqdXN0WSAmJiBwb3MudG9wICsgc2l6ZS5oZWlnaHQgPiB2aXNpYmxlUmVjdC5ib3R0b20pIHtcbiAgICAvLyDkv53or4HkuIrovrnnlYzlkozlj6/op4bljLrln5/kuIrovrnnlYzlr7npvZBcbiAgICBwb3MudG9wID0gTWF0aC5tYXgodmlzaWJsZVJlY3QuYm90dG9tIC0gc2l6ZS5oZWlnaHQsIHZpc2libGVSZWN0LnRvcCk7XG4gIH1cblxuICByZXR1cm4gdXRpbHMubWl4KHBvcywgc2l6ZSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2lvbihub2RlKSB7XG4gIHZhciBvZmZzZXQ7XG4gIHZhciB3O1xuICB2YXIgaDtcblxuICBpZiAoIXV0aWxzLmlzV2luZG93KG5vZGUpICYmIG5vZGUubm9kZVR5cGUgIT09IDkpIHtcbiAgICBvZmZzZXQgPSB1dGlscy5vZmZzZXQobm9kZSk7XG4gICAgdyA9IHV0aWxzLm91dGVyV2lkdGgobm9kZSk7XG4gICAgaCA9IHV0aWxzLm91dGVySGVpZ2h0KG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSB1dGlscy5nZXRXaW5kb3cobm9kZSk7XG4gICAgb2Zmc2V0ID0ge1xuICAgICAgbGVmdDogdXRpbHMuZ2V0V2luZG93U2Nyb2xsTGVmdCh3aW4pLFxuICAgICAgdG9wOiB1dGlscy5nZXRXaW5kb3dTY3JvbGxUb3Aod2luKVxuICAgIH07XG4gICAgdyA9IHV0aWxzLnZpZXdwb3J0V2lkdGgod2luKTtcbiAgICBoID0gdXRpbHMudmlld3BvcnRIZWlnaHQod2luKTtcbiAgfVxuXG4gIG9mZnNldC53aWR0aCA9IHc7XG4gIG9mZnNldC5oZWlnaHQgPSBoO1xuICByZXR1cm4gb2Zmc2V0O1xufVxuXG4vKipcbiAqIOiOt+WPliBub2RlIOS4iueahCBhbGlnbiDlr7npvZDngrkg55u45a+55LqO6aG16Z2i55qE5Z2Q5qCHXG4gKi9cbmZ1bmN0aW9uIGdldEFsaWduT2Zmc2V0KHJlZ2lvbiwgYWxpZ24pIHtcbiAgdmFyIFYgPSBhbGlnbi5jaGFyQXQoMCk7XG4gIHZhciBIID0gYWxpZ24uY2hhckF0KDEpO1xuICB2YXIgdyA9IHJlZ2lvbi53aWR0aDtcbiAgdmFyIGggPSByZWdpb24uaGVpZ2h0O1xuICB2YXIgeCA9IHJlZ2lvbi5sZWZ0O1xuICB2YXIgeSA9IHJlZ2lvbi50b3A7XG5cbiAgaWYgKFYgPT09ICdjJykge1xuICAgIHkgKz0gaCAvIDI7XG4gIH0gZWxzZSBpZiAoViA9PT0gJ2InKSB7XG4gICAgeSArPSBoO1xuICB9XG5cbiAgaWYgKEggPT09ICdjJykge1xuICAgIHggKz0gdyAvIDI7XG4gIH0gZWxzZSBpZiAoSCA9PT0gJ3InKSB7XG4gICAgeCArPSB3O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiB4LFxuICAgIHRvcDogeVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRFbEZ1dHVyZVBvcyhlbFJlZ2lvbiwgcmVmTm9kZVJlZ2lvbiwgcG9pbnRzLCBvZmZzZXQsIHRhcmdldE9mZnNldCkge1xuICB2YXIgcDEgPSBnZXRBbGlnbk9mZnNldChyZWZOb2RlUmVnaW9uLCBwb2ludHNbMV0pO1xuICB2YXIgcDIgPSBnZXRBbGlnbk9mZnNldChlbFJlZ2lvbiwgcG9pbnRzWzBdKTtcbiAgdmFyIGRpZmYgPSBbcDIubGVmdCAtIHAxLmxlZnQsIHAyLnRvcCAtIHAxLnRvcF07XG4gIHJldHVybiB7XG4gICAgbGVmdDogTWF0aC5yb3VuZChlbFJlZ2lvbi5sZWZ0IC0gZGlmZlswXSArIG9mZnNldFswXSAtIHRhcmdldE9mZnNldFswXSksXG4gICAgdG9wOiBNYXRoLnJvdW5kKGVsUmVnaW9uLnRvcCAtIGRpZmZbMV0gKyBvZmZzZXRbMV0gLSB0YXJnZXRPZmZzZXRbMV0pXG4gIH07XG59XG5cbi8qKlxuICogYWxpZ24gZG9tIG5vZGUgZmxleGlibHlcbiAqIEBhdXRob3IgeWltaW5naGVAZ21haWwuY29tXG4gKi9cblxuZnVuY3Rpb24gaXNGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy5sZWZ0IDwgdmlzaWJsZVJlY3QubGVmdCB8fCBlbEZ1dHVyZVBvcy5sZWZ0ICsgZWxSZWdpb24ud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodDtcbn1cblxuZnVuY3Rpb24gaXNGYWlsWShlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy50b3AgPCB2aXNpYmxlUmVjdC50b3AgfHwgZWxGdXR1cmVQb3MudG9wICsgZWxSZWdpb24uaGVpZ2h0ID4gdmlzaWJsZVJlY3QuYm90dG9tO1xufVxuXG5mdW5jdGlvbiBpc0NvbXBsZXRlRmFpbFgoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkge1xuICByZXR1cm4gZWxGdXR1cmVQb3MubGVmdCA+IHZpc2libGVSZWN0LnJpZ2h0IHx8IGVsRnV0dXJlUG9zLmxlZnQgKyBlbFJlZ2lvbi53aWR0aCA8IHZpc2libGVSZWN0LmxlZnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ29tcGxldGVGYWlsWShlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy50b3AgPiB2aXNpYmxlUmVjdC5ib3R0b20gfHwgZWxGdXR1cmVQb3MudG9wICsgZWxSZWdpb24uaGVpZ2h0IDwgdmlzaWJsZVJlY3QudG9wO1xufVxuXG5mdW5jdGlvbiBmbGlwKHBvaW50cywgcmVnLCBtYXApIHtcbiAgdmFyIHJldCA9IFtdO1xuICB1dGlscy5lYWNoKHBvaW50cywgZnVuY3Rpb24gKHApIHtcbiAgICByZXQucHVzaChwLnJlcGxhY2UocmVnLCBmdW5jdGlvbiAobSkge1xuICAgICAgcmV0dXJuIG1hcFttXTtcbiAgICB9KSk7XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBmbGlwT2Zmc2V0KG9mZnNldCwgaW5kZXgpIHtcbiAgb2Zmc2V0W2luZGV4XSA9IC1vZmZzZXRbaW5kZXhdO1xuICByZXR1cm4gb2Zmc2V0O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0T2Zmc2V0KHN0ciwgb2Zmc2V0TGVuKSB7XG4gIHZhciBuO1xuXG4gIGlmICgvJSQvLnRlc3Qoc3RyKSkge1xuICAgIG4gPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGggLSAxKSwgMTApIC8gMTAwICogb2Zmc2V0TGVuO1xuICB9IGVsc2Uge1xuICAgIG4gPSBwYXJzZUludChzdHIsIDEwKTtcbiAgfVxuXG4gIHJldHVybiBuIHx8IDA7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldChvZmZzZXQsIGVsKSB7XG4gIG9mZnNldFswXSA9IGNvbnZlcnRPZmZzZXQob2Zmc2V0WzBdLCBlbC53aWR0aCk7XG4gIG9mZnNldFsxXSA9IGNvbnZlcnRPZmZzZXQob2Zmc2V0WzFdLCBlbC5oZWlnaHQpO1xufVxuLyoqXG4gKiBAcGFyYW0gZWxcbiAqIEBwYXJhbSB0Z3RSZWdpb24g5Y+C54Wn6IqC54K55omA5Y2g55qE5Yy65Z+fOiB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9XG4gKiBAcGFyYW0gYWxpZ25cbiAqL1xuXG5cbmZ1bmN0aW9uIGRvQWxpZ24oZWwsIHRndFJlZ2lvbiwgYWxpZ24sIGlzVGd0UmVnaW9uVmlzaWJsZSkge1xuICB2YXIgcG9pbnRzID0gYWxpZ24ucG9pbnRzO1xuICB2YXIgb2Zmc2V0ID0gYWxpZ24ub2Zmc2V0IHx8IFswLCAwXTtcbiAgdmFyIHRhcmdldE9mZnNldCA9IGFsaWduLnRhcmdldE9mZnNldCB8fCBbMCwgMF07XG4gIHZhciBvdmVyZmxvdyA9IGFsaWduLm92ZXJmbG93O1xuICB2YXIgc291cmNlID0gYWxpZ24uc291cmNlIHx8IGVsO1xuICBvZmZzZXQgPSBbXS5jb25jYXQob2Zmc2V0KTtcbiAgdGFyZ2V0T2Zmc2V0ID0gW10uY29uY2F0KHRhcmdldE9mZnNldCk7XG4gIG92ZXJmbG93ID0gb3ZlcmZsb3cgfHwge307XG4gIHZhciBuZXdPdmVyZmxvd0NmZyA9IHt9O1xuICB2YXIgZmFpbCA9IDA7XG4gIHZhciBhbHdheXNCeVZpZXdwb3J0ID0gISEob3ZlcmZsb3cgJiYgb3ZlcmZsb3cuYWx3YXlzQnlWaWV3cG9ydCk7IC8vIOW9k+WJjeiKgueCueWPr+S7peiiq+aUvue9rueahOaYvuekuuWMuuWfn1xuXG4gIHZhciB2aXNpYmxlUmVjdCA9IGdldFZpc2libGVSZWN0Rm9yRWxlbWVudChzb3VyY2UsIGFsd2F5c0J5Vmlld3BvcnQpOyAvLyDlvZPliY3oioLngrnmiYDljaDnmoTljLrln58sIGxlZnQvdG9wL3dpZHRoL2hlaWdodFxuXG4gIHZhciBlbFJlZ2lvbiA9IGdldFJlZ2lvbihzb3VyY2UpOyAvLyDlsIYgb2Zmc2V0IOi9rOaNouaIkOaVsOWAvO+8jOaUr+aMgeeZvuWIhuavlFxuXG4gIG5vcm1hbGl6ZU9mZnNldChvZmZzZXQsIGVsUmVnaW9uKTtcbiAgbm9ybWFsaXplT2Zmc2V0KHRhcmdldE9mZnNldCwgdGd0UmVnaW9uKTsgLy8g5b2T5YmN6IqC54K55bCG6KaB6KKr5pS+572u55qE5L2N572uXG5cbiAgdmFyIGVsRnV0dXJlUG9zID0gZ2V0RWxGdXR1cmVQb3MoZWxSZWdpb24sIHRndFJlZ2lvbiwgcG9pbnRzLCBvZmZzZXQsIHRhcmdldE9mZnNldCk7IC8vIOW9k+WJjeiKgueCueWwhuimgeaJgOWkhOeahOWMuuWfn1xuXG4gIHZhciBuZXdFbFJlZ2lvbiA9IHV0aWxzLm1lcmdlKGVsUmVnaW9uLCBlbEZ1dHVyZVBvcyk7IC8vIOWmguaenOWPr+inhuWMuuWfn+S4jeiDveWujOWFqOaUvue9ruW9k+WJjeiKgueCueaXtuWFgeiuuOiwg+aVtFxuXG4gIGlmICh2aXNpYmxlUmVjdCAmJiAob3ZlcmZsb3cuYWRqdXN0WCB8fCBvdmVyZmxvdy5hZGp1c3RZKSAmJiBpc1RndFJlZ2lvblZpc2libGUpIHtcbiAgICBpZiAob3ZlcmZsb3cuYWRqdXN0WCkge1xuICAgICAgLy8g5aaC5p6c5qiq5ZCR5LiN6IO95pS+5LiLXG4gICAgICBpZiAoaXNGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAvLyDlr7npvZDkvY3nva7lj43kuItcbiAgICAgICAgdmFyIG5ld1BvaW50cyA9IGZsaXAocG9pbnRzLCAvW2xyXS9naSwge1xuICAgICAgICAgIGw6ICdyJyxcbiAgICAgICAgICByOiAnbCdcbiAgICAgICAgfSk7IC8vIOWBj+enu+mHj+S5n+WPjeS4i1xuXG4gICAgICAgIHZhciBuZXdPZmZzZXQgPSBmbGlwT2Zmc2V0KG9mZnNldCwgMCk7XG4gICAgICAgIHZhciBuZXdUYXJnZXRPZmZzZXQgPSBmbGlwT2Zmc2V0KHRhcmdldE9mZnNldCwgMCk7XG4gICAgICAgIHZhciBuZXdFbEZ1dHVyZVBvcyA9IGdldEVsRnV0dXJlUG9zKGVsUmVnaW9uLCB0Z3RSZWdpb24sIG5ld1BvaW50cywgbmV3T2Zmc2V0LCBuZXdUYXJnZXRPZmZzZXQpO1xuXG4gICAgICAgIGlmICghaXNDb21wbGV0ZUZhaWxYKG5ld0VsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QpKSB7XG4gICAgICAgICAgZmFpbCA9IDE7XG4gICAgICAgICAgcG9pbnRzID0gbmV3UG9pbnRzO1xuICAgICAgICAgIG9mZnNldCA9IG5ld09mZnNldDtcbiAgICAgICAgICB0YXJnZXRPZmZzZXQgPSBuZXdUYXJnZXRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3ZlcmZsb3cuYWRqdXN0WSkge1xuICAgICAgLy8g5aaC5p6c57q15ZCR5LiN6IO95pS+5LiLXG4gICAgICBpZiAoaXNGYWlsWShlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAvLyDlr7npvZDkvY3nva7lj43kuItcbiAgICAgICAgdmFyIF9uZXdQb2ludHMgPSBmbGlwKHBvaW50cywgL1t0Yl0vZ2ksIHtcbiAgICAgICAgICB0OiAnYicsXG4gICAgICAgICAgYjogJ3QnXG4gICAgICAgIH0pOyAvLyDlgY/np7vph4/kuZ/lj43kuItcblxuXG4gICAgICAgIHZhciBfbmV3T2Zmc2V0ID0gZmxpcE9mZnNldChvZmZzZXQsIDEpO1xuXG4gICAgICAgIHZhciBfbmV3VGFyZ2V0T2Zmc2V0ID0gZmxpcE9mZnNldCh0YXJnZXRPZmZzZXQsIDEpO1xuXG4gICAgICAgIHZhciBfbmV3RWxGdXR1cmVQb3MgPSBnZXRFbEZ1dHVyZVBvcyhlbFJlZ2lvbiwgdGd0UmVnaW9uLCBfbmV3UG9pbnRzLCBfbmV3T2Zmc2V0LCBfbmV3VGFyZ2V0T2Zmc2V0KTtcblxuICAgICAgICBpZiAoIWlzQ29tcGxldGVGYWlsWShfbmV3RWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkpIHtcbiAgICAgICAgICBmYWlsID0gMTtcbiAgICAgICAgICBwb2ludHMgPSBfbmV3UG9pbnRzO1xuICAgICAgICAgIG9mZnNldCA9IF9uZXdPZmZzZXQ7XG4gICAgICAgICAgdGFyZ2V0T2Zmc2V0ID0gX25ld1RhcmdldE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8g5aaC5p6c5aSx6LSl77yM6YeN5paw6K6h566X5b2T5YmN6IqC54K55bCG6KaB6KKr5pS+572u55qE5L2N572uXG5cblxuICAgIGlmIChmYWlsKSB7XG4gICAgICBlbEZ1dHVyZVBvcyA9IGdldEVsRnV0dXJlUG9zKGVsUmVnaW9uLCB0Z3RSZWdpb24sIHBvaW50cywgb2Zmc2V0LCB0YXJnZXRPZmZzZXQpO1xuICAgICAgdXRpbHMubWl4KG5ld0VsUmVnaW9uLCBlbEZ1dHVyZVBvcyk7XG4gICAgfVxuXG4gICAgdmFyIGlzU3RpbGxGYWlsWCA9IGlzRmFpbFgoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCk7XG4gICAgdmFyIGlzU3RpbGxGYWlsWSA9IGlzRmFpbFkoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCk7IC8vIOajgOafpeWPjeS4i+WQjueahOS9jee9ruaYr+WQpuWPr+S7peaUvuS4i+S6hu+8jOWmguaenOS7jeeEtuaUvuS4jeS4i++8mlxuICAgIC8vIDEuIOWkjeWOn+S/ruaUuei/h+eahOWumuS9jeWPguaVsFxuXG4gICAgaWYgKGlzU3RpbGxGYWlsWCB8fCBpc1N0aWxsRmFpbFkpIHtcbiAgICAgIHZhciBfbmV3UG9pbnRzMiA9IHBvaW50czsgLy8g6YeN572u5a+55bqU6YOo5YiG55qE57+76L2s6YC76L6RXG5cbiAgICAgIGlmIChpc1N0aWxsRmFpbFgpIHtcbiAgICAgICAgX25ld1BvaW50czIgPSBmbGlwKHBvaW50cywgL1tscl0vZ2ksIHtcbiAgICAgICAgICBsOiAncicsXG4gICAgICAgICAgcjogJ2wnXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNTdGlsbEZhaWxZKSB7XG4gICAgICAgIF9uZXdQb2ludHMyID0gZmxpcChwb2ludHMsIC9bdGJdL2dpLCB7XG4gICAgICAgICAgdDogJ2InLFxuICAgICAgICAgIGI6ICd0J1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcG9pbnRzID0gX25ld1BvaW50czI7XG4gICAgICBvZmZzZXQgPSBhbGlnbi5vZmZzZXQgfHwgWzAsIDBdO1xuICAgICAgdGFyZ2V0T2Zmc2V0ID0gYWxpZ24udGFyZ2V0T2Zmc2V0IHx8IFswLCAwXTtcbiAgICB9IC8vIDIuIOWPquacieaMh+WumuS6huWPr+S7peiwg+aVtOW9k+WJjeaWueWQkeaJjeiwg+aVtFxuXG5cbiAgICBuZXdPdmVyZmxvd0NmZy5hZGp1c3RYID0gb3ZlcmZsb3cuYWRqdXN0WCAmJiBpc1N0aWxsRmFpbFg7XG4gICAgbmV3T3ZlcmZsb3dDZmcuYWRqdXN0WSA9IG92ZXJmbG93LmFkanVzdFkgJiYgaXNTdGlsbEZhaWxZOyAvLyDnoa7lrp7opoHosIPmlbTvvIznlJroh7Plj6/og73kvJrosIPmlbTpq5jluqblrr3luqZcblxuICAgIGlmIChuZXdPdmVyZmxvd0NmZy5hZGp1c3RYIHx8IG5ld092ZXJmbG93Q2ZnLmFkanVzdFkpIHtcbiAgICAgIG5ld0VsUmVnaW9uID0gYWRqdXN0Rm9yVmlld3BvcnQoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCwgbmV3T3ZlcmZsb3dDZmcpO1xuICAgIH1cbiAgfSAvLyBuZWVkIGp1ZGdlIHRvIGluIGNhc2Ugc2V0IGZpeGVkIHdpdGggaW4gY3NzIG9uIGhlaWdodCBhdXRvIGVsZW1lbnRcblxuXG4gIGlmIChuZXdFbFJlZ2lvbi53aWR0aCAhPT0gZWxSZWdpb24ud2lkdGgpIHtcbiAgICB1dGlscy5jc3Moc291cmNlLCAnd2lkdGgnLCB1dGlscy53aWR0aChzb3VyY2UpICsgbmV3RWxSZWdpb24ud2lkdGggLSBlbFJlZ2lvbi53aWR0aCk7XG4gIH1cblxuICBpZiAobmV3RWxSZWdpb24uaGVpZ2h0ICE9PSBlbFJlZ2lvbi5oZWlnaHQpIHtcbiAgICB1dGlscy5jc3Moc291cmNlLCAnaGVpZ2h0JywgdXRpbHMuaGVpZ2h0KHNvdXJjZSkgKyBuZXdFbFJlZ2lvbi5oZWlnaHQgLSBlbFJlZ2lvbi5oZWlnaHQpO1xuICB9IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9raXNzeXRlYW0va2lzc3kvaXNzdWVzLzE5MFxuICAvLyDnm7jlr7nkuo7lsY/luZXkvY3nva7msqHlj5jvvIzogIwgbGVmdC90b3Ag5Y+Y5LqGXG4gIC8vIOS+i+WmgiA8ZGl2ICdyZWxhdGl2ZSc+PGVsIGFic29sdXRlPjwvZGl2PlxuXG5cbiAgdXRpbHMub2Zmc2V0KHNvdXJjZSwge1xuICAgIGxlZnQ6IG5ld0VsUmVnaW9uLmxlZnQsXG4gICAgdG9wOiBuZXdFbFJlZ2lvbi50b3BcbiAgfSwge1xuICAgIHVzZUNzc1JpZ2h0OiBhbGlnbi51c2VDc3NSaWdodCxcbiAgICB1c2VDc3NCb3R0b206IGFsaWduLnVzZUNzc0JvdHRvbSxcbiAgICB1c2VDc3NUcmFuc2Zvcm06IGFsaWduLnVzZUNzc1RyYW5zZm9ybSxcbiAgICBpZ25vcmVTaGFrZTogYWxpZ24uaWdub3JlU2hha2VcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcG9pbnRzOiBwb2ludHMsXG4gICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXQsXG4gICAgb3ZlcmZsb3c6IG5ld092ZXJmbG93Q2ZnXG4gIH07XG59XG4vKipcbiAqICAyMDEyLTA0LTI2IHlpbWluZ2hlQGdtYWlsLmNvbVxuICogICAtIOS8mOWMluaZuuiDveWvuem9kOeul+azlVxuICogICAtIOaFjueUqCByZXNpemVYWFxuICpcbiAqICAyMDExLTA3LTEzIHlpbWluZ2hlQGdtYWlsLmNvbSBub3RlOlxuICogICAtIOWinuWKoOaZuuiDveWvuem9kO+8jOS7peWPiuWkp+Wwj+iwg+aVtOmAiemhuVxuICoqL1xuXG5mdW5jdGlvbiBpc091dE9mVmlzaWJsZVJlY3QodGFyZ2V0LCBhbHdheXNCeVZpZXdwb3J0KSB7XG4gIHZhciB2aXNpYmxlUmVjdCA9IGdldFZpc2libGVSZWN0Rm9yRWxlbWVudCh0YXJnZXQsIGFsd2F5c0J5Vmlld3BvcnQpO1xuICB2YXIgdGFyZ2V0UmVnaW9uID0gZ2V0UmVnaW9uKHRhcmdldCk7XG4gIHJldHVybiAhdmlzaWJsZVJlY3QgfHwgdGFyZ2V0UmVnaW9uLmxlZnQgKyB0YXJnZXRSZWdpb24ud2lkdGggPD0gdmlzaWJsZVJlY3QubGVmdCB8fCB0YXJnZXRSZWdpb24udG9wICsgdGFyZ2V0UmVnaW9uLmhlaWdodCA8PSB2aXNpYmxlUmVjdC50b3AgfHwgdGFyZ2V0UmVnaW9uLmxlZnQgPj0gdmlzaWJsZVJlY3QucmlnaHQgfHwgdGFyZ2V0UmVnaW9uLnRvcCA+PSB2aXNpYmxlUmVjdC5ib3R0b207XG59XG5cbmZ1bmN0aW9uIGFsaWduRWxlbWVudChlbCwgcmVmTm9kZSwgYWxpZ24pIHtcbiAgdmFyIHRhcmdldCA9IGFsaWduLnRhcmdldCB8fCByZWZOb2RlO1xuICB2YXIgcmVmTm9kZVJlZ2lvbiA9IGdldFJlZ2lvbih0YXJnZXQpO1xuICB2YXIgaXNUYXJnZXROb3RPdXRPZlZpc2libGUgPSAhaXNPdXRPZlZpc2libGVSZWN0KHRhcmdldCwgYWxpZ24ub3ZlcmZsb3cgJiYgYWxpZ24ub3ZlcmZsb3cuYWx3YXlzQnlWaWV3cG9ydCk7XG4gIHJldHVybiBkb0FsaWduKGVsLCByZWZOb2RlUmVnaW9uLCBhbGlnbiwgaXNUYXJnZXROb3RPdXRPZlZpc2libGUpO1xufVxuXG5hbGlnbkVsZW1lbnQuX19nZXRPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQ7XG5hbGlnbkVsZW1lbnQuX19nZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQgPSBnZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQ7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cbi8qKlxuICogYHRndFBvaW50YDogeyBwYWdlWCwgcGFnZVkgfSBvciB7IGNsaWVudFgsIGNsaWVudFkgfS5cbiAqIElmIGNsaWVudCBwb3NpdGlvbiBwcm92aWRlZCwgd2lsbCBpbnRlcm5hbCBjb252ZXJ0IHRvIHBhZ2UgcG9zaXRpb24uXG4gKi9cblxuZnVuY3Rpb24gYWxpZ25Qb2ludChlbCwgdGd0UG9pbnQsIGFsaWduKSB7XG4gIHZhciBwYWdlWDtcbiAgdmFyIHBhZ2VZO1xuICB2YXIgZG9jID0gdXRpbHMuZ2V0RG9jdW1lbnQoZWwpO1xuICB2YXIgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gIHZhciBzY3JvbGxYID0gdXRpbHMuZ2V0V2luZG93U2Nyb2xsTGVmdCh3aW4pO1xuICB2YXIgc2Nyb2xsWSA9IHV0aWxzLmdldFdpbmRvd1Njcm9sbFRvcCh3aW4pO1xuICB2YXIgdmlld3BvcnRXaWR0aCA9IHV0aWxzLnZpZXdwb3J0V2lkdGgod2luKTtcbiAgdmFyIHZpZXdwb3J0SGVpZ2h0ID0gdXRpbHMudmlld3BvcnRIZWlnaHQod2luKTtcblxuICBpZiAoJ3BhZ2VYJyBpbiB0Z3RQb2ludCkge1xuICAgIHBhZ2VYID0gdGd0UG9pbnQucGFnZVg7XG4gIH0gZWxzZSB7XG4gICAgcGFnZVggPSBzY3JvbGxYICsgdGd0UG9pbnQuY2xpZW50WDtcbiAgfVxuXG4gIGlmICgncGFnZVknIGluIHRndFBvaW50KSB7XG4gICAgcGFnZVkgPSB0Z3RQb2ludC5wYWdlWTtcbiAgfSBlbHNlIHtcbiAgICBwYWdlWSA9IHNjcm9sbFkgKyB0Z3RQb2ludC5jbGllbnRZO1xuICB9XG5cbiAgdmFyIHRndFJlZ2lvbiA9IHtcbiAgICBsZWZ0OiBwYWdlWCxcbiAgICB0b3A6IHBhZ2VZLFxuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuICB2YXIgcG9pbnRJblZpZXcgPSBwYWdlWCA+PSAwICYmIHBhZ2VYIDw9IHNjcm9sbFggKyB2aWV3cG9ydFdpZHRoICYmIHBhZ2VZID49IDAgJiYgcGFnZVkgPD0gc2Nyb2xsWSArIHZpZXdwb3J0SGVpZ2h0OyAvLyBQcm92aWRlIGRlZmF1bHQgdGFyZ2V0IHBvaW50XG5cbiAgdmFyIHBvaW50cyA9IFthbGlnbi5wb2ludHNbMF0sICdjYyddO1xuICByZXR1cm4gZG9BbGlnbihlbCwgdGd0UmVnaW9uLCBfb2JqZWN0U3ByZWFkKHt9LCBhbGlnbiwge1xuICAgIHBvaW50czogcG9pbnRzXG4gIH0pLCBwb2ludEluVmlldyk7XG59XG5cbmV4cG9ydHMuYWxpZ25FbGVtZW50ID0gYWxpZ25FbGVtZW50O1xuZXhwb3J0cy5hbGlnblBvaW50ID0gYWxpZ25Qb2ludDtcbmV4cG9ydHMuZGVmYXVsdCA9IGFsaWduRWxlbWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHt9O1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuRm9yd2FyZFJlZl0gPSBGT1JXQVJEX1JFRl9TVEFUSUNTO1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuTWVtb10gPSBNRU1PX1NUQVRJQ1M7XG5cbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIC8vIFJlYWN0IHYxNi4xMSBhbmQgYmVsb3dcbiAgaWYgKHJlYWN0SXMuaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9IC8vIFJlYWN0IHYxNi4xMiBhbmQgYWJvdmVcblxuXG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50WyckJHR5cGVvZiddXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGJsYWNrbGlzdCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIHZhciBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICB2YXIgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdFtrZXldKSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaG9pc3ROb25SZWFjdFN0YXRpY3M7XG4iLCJ2YXIgY29udGFpbmVycyA9IFtdOyAvLyB3aWxsIHN0b3JlIGNvbnRhaW5lciBIVE1MRWxlbWVudCByZWZlcmVuY2VzXG52YXIgc3R5bGVFbGVtZW50cyA9IFtdOyAvLyB3aWxsIHN0b3JlIHtwcmVwZW5kOiBIVE1MRWxlbWVudCwgYXBwZW5kOiBIVE1MRWxlbWVudH1cblxudmFyIHVzYWdlID0gJ2luc2VydC1jc3M6IFlvdSBuZWVkIHRvIHByb3ZpZGUgYSBDU1Mgc3RyaW5nLiBVc2FnZTogaW5zZXJ0Q3NzKGNzc1N0cmluZ1ssIG9wdGlvbnNdKS4nO1xuXG5mdW5jdGlvbiBpbnNlcnRDc3MoY3NzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoY3NzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHVzYWdlKTtcbiAgICB9XG5cbiAgICB2YXIgcG9zaXRpb24gPSBvcHRpb25zLnByZXBlbmQgPT09IHRydWUgPyAncHJlcGVuZCcgOiAnYXBwZW5kJztcbiAgICB2YXIgY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY29udGFpbmVyIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpO1xuICAgIHZhciBjb250YWluZXJJZCA9IGNvbnRhaW5lcnMuaW5kZXhPZihjb250YWluZXIpO1xuXG4gICAgLy8gZmlyc3QgdGltZSB3ZSBzZWUgdGhpcyBjb250YWluZXIsIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IGVudHJpZXNcbiAgICBpZiAoY29udGFpbmVySWQgPT09IC0xKSB7XG4gICAgICAgIGNvbnRhaW5lcklkID0gY29udGFpbmVycy5wdXNoKGNvbnRhaW5lcikgLSAxO1xuICAgICAgICBzdHlsZUVsZW1lbnRzW2NvbnRhaW5lcklkXSA9IHt9O1xuICAgIH1cblxuICAgIC8vIHRyeSB0byBnZXQgdGhlIGNvcnJlcG9uZGluZyBjb250YWluZXIgKyBwb3NpdGlvbiBzdHlsZUVsZW1lbnQsIGNyZWF0ZSBpdCBvdGhlcndpc2VcbiAgICB2YXIgc3R5bGVFbGVtZW50O1xuXG4gICAgaWYgKHN0eWxlRWxlbWVudHNbY29udGFpbmVySWRdICE9PSB1bmRlZmluZWQgJiYgc3R5bGVFbGVtZW50c1tjb250YWluZXJJZF1bcG9zaXRpb25dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3R5bGVFbGVtZW50ID0gc3R5bGVFbGVtZW50c1tjb250YWluZXJJZF1bcG9zaXRpb25dO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlRWxlbWVudCA9IHN0eWxlRWxlbWVudHNbY29udGFpbmVySWRdW3Bvc2l0aW9uXSA9IGNyZWF0ZVN0eWxlRWxlbWVudCgpO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ3ByZXBlbmQnKSB7XG4gICAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHN0eWxlRWxlbWVudCwgY29udGFpbmVyLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzdHJpcCBwb3RlbnRpYWwgVVRGLTggQk9NIGlmIGNzcyB3YXMgcmVhZCBmcm9tIGEgZmlsZVxuICAgIGlmIChjc3MuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7IGNzcyA9IGNzcy5zdWJzdHIoMSwgY3NzLmxlbmd0aCk7IH1cblxuICAgIC8vIGFjdHVhbGx5IGFkZCB0aGUgc3R5bGVzaGVldFxuICAgIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgICAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ICs9IGNzc1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlRWxlbWVudC50ZXh0Q29udGVudCArPSBjc3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlRWxlbWVudDtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudCgpIHtcbiAgICB2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7XG4gICAgcmV0dXJuIHN0eWxlRWxlbWVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRDc3M7XG5tb2R1bGUuZXhwb3J0cy5pbnNlcnRDc3MgPSBpbnNlcnRDc3M7XG4iLCJ2YXIgY2FtZWwyaHlwaGVuID0gcmVxdWlyZSgnc3RyaW5nLWNvbnZlcnQvY2FtZWwyaHlwaGVuJyk7XG5cbnZhciBpc0RpbWVuc2lvbiA9IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gIHZhciByZSA9IC9baGVpZ2h0fHdpZHRoXSQvO1xuICByZXR1cm4gcmUudGVzdChmZWF0dXJlKTtcbn07XG5cbnZhciBvYmoybXEgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBtcSA9ICcnO1xuICB2YXIgZmVhdHVyZXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmZWF0dXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChmZWF0dXJlLCBpbmRleCkge1xuICAgIHZhciB2YWx1ZSA9IG9ialtmZWF0dXJlXTtcbiAgICBmZWF0dXJlID0gY2FtZWwyaHlwaGVuKGZlYXR1cmUpO1xuICAgIC8vIEFkZCBweCB0byBkaW1lbnNpb24gZmVhdHVyZXNcbiAgICBpZiAoaXNEaW1lbnNpb24oZmVhdHVyZSkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZSArICdweCc7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgbXEgKz0gZmVhdHVyZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgbXEgKz0gJ25vdCAnICsgZmVhdHVyZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbXEgKz0gJygnICsgZmVhdHVyZSArICc6ICcgKyB2YWx1ZSArICcpJztcbiAgICB9XG4gICAgaWYgKGluZGV4IDwgZmVhdHVyZXMubGVuZ3RoLTEpIHtcbiAgICAgIG1xICs9ICcgYW5kICdcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbXE7XG59O1xuXG52YXIganNvbjJtcSA9IGZ1bmN0aW9uIChxdWVyeSkge1xuICB2YXIgbXEgPSAnJztcbiAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cbiAgLy8gSGFuZGxpbmcgYXJyYXkgb2YgbWVkaWEgcXVlcmllc1xuICBpZiAocXVlcnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHF1ZXJ5LmZvckVhY2goZnVuY3Rpb24gKHEsIGluZGV4KSB7XG4gICAgICBtcSArPSBvYmoybXEocSk7XG4gICAgICBpZiAoaW5kZXggPCBxdWVyeS5sZW5ndGgtMSkge1xuICAgICAgICBtcSArPSAnLCAnXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1xO1xuICB9XG4gIC8vIEhhbmRsaW5nIHNpbmdsZSBtZWRpYSBxdWVyeVxuICByZXR1cm4gb2JqMm1xKHF1ZXJ5KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ganNvbjJtcTsiLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFWaWV3O1xuIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iLCJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyksXG4gICAgc2V0Q2FjaGVBZGQgPSByZXF1aXJlKCcuL19zZXRDYWNoZUFkZCcpLFxuICAgIHNldENhY2hlSGFzID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVIYXMnKTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldENhY2hlO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlGaWx0ZXI7XG4iLCJ2YXIgYmFzZVRpbWVzID0gcmVxdWlyZSgnLi9fYmFzZVRpbWVzJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TGlrZUtleXM7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TWFwO1xuIiwiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UHVzaDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlTb21lO1xuIiwidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbnZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpU2l6ZTtcbiIsIi8qKlxuICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5zcGxpdCgnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlUb0FycmF5O1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc29jSW5kZXhPZjtcbiIsInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gKiBga2V5c0Z1bmNgIGFuZCBgc3ltYm9sc0Z1bmNgIHRvIGdldCB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzeW1ib2xzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0QWxsS2V5cztcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiIsInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzVHlwZWRBcnJheTtcbiIsInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHk7XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUZsb29yID0gTWF0aC5mbG9vcjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLCBuKSB7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC5cbiAgLy8gU2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0V4cG9uZW50aWF0aW9uX2J5X3NxdWFyaW5nIGZvciBtb3JlIGRldGFpbHMuXG4gIGRvIHtcbiAgICBpZiAobiAlIDIpIHtcbiAgICAgIHJlc3VsdCArPSBzdHJpbmc7XG4gICAgfVxuICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7XG4gICAgaWYgKG4pIHtcbiAgICAgIHN0cmluZyArPSBzdHJpbmc7XG4gICAgfVxuICB9IHdoaWxlIChuKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZXBlYXQ7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gIH1cbiAgZW5kID0gZW5kID4gbGVuZ3RoID8gbGVuZ3RoIDogZW5kO1xuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5ndGg7XG4gIH1cbiAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNsaWNlO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FjaGVIYXM7XG4iLCJ2YXIgYmFzZVNsaWNlID0gcmVxdWlyZSgnLi9fYmFzZVNsaWNlJyk7XG5cbi8qKlxuICogQ2FzdHMgYGFycmF5YCB0byBhIHNsaWNlIGlmIGl0J3MgbmVlZGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgcG9zaXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3Qgc2xpY2UuXG4gKi9cbmZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZDtcbiAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FzdFNsaWNlO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbm1vZHVsZS5leHBvcnRzID0gY29yZUpzRGF0YTtcbiIsInZhciBiYXNlUmVwZWF0ID0gcmVxdWlyZSgnLi9fYmFzZVJlcGVhdCcpLFxuICAgIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpLFxuICAgIGNhc3RTbGljZSA9IHJlcXVpcmUoJy4vX2Nhc3RTbGljZScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgc3RyaW5nU2l6ZSA9IHJlcXVpcmUoJy4vX3N0cmluZ1NpemUnKSxcbiAgICBzdHJpbmdUb0FycmF5ID0gcmVxdWlyZSgnLi9fc3RyaW5nVG9BcnJheScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlQ2VpbCA9IE1hdGguY2VpbDtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gKiBpcyB0cnVuY2F0ZWQgaWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4Y2VlZHMgYGxlbmd0aGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhZGRpbmcobGVuZ3RoLCBjaGFycykge1xuICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDtcbiAgaWYgKGNoYXJzTGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgfVxuICB2YXIgcmVzdWx0ID0gYmFzZVJlcGVhdChjaGFycywgbmF0aXZlQ2VpbChsZW5ndGggLyBzdHJpbmdTaXplKGNoYXJzKSkpO1xuICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICA/IGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksIDAsIGxlbmd0aCkuam9pbignJylcbiAgICA6IHJlc3VsdC5zbGljZSgwLCBsZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVBhZGRpbmc7XG4iLCJ2YXIgU2V0Q2FjaGUgPSByZXF1aXJlKCcuL19TZXRDYWNoZScpLFxuICAgIGFycmF5U29tZSA9IHJlcXVpcmUoJy4vX2FycmF5U29tZScpLFxuICAgIGNhY2hlSGFzID0gcmVxdWlyZSgnLi9fY2FjaGVIYXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgYXJyYXlzIHdpdGggc3VwcG9ydCBmb3JcbiAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYGFycmF5YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBvdGhMZW5ndGggPSBvdGhlci5sZW5ndGg7XG5cbiAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICB2YXIgYXJyU3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgIHJldHVybiBhcnJTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gYXJyYXk7XG4gIH1cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgc2VlbiA9IChiaXRtYXNrICYgQ09NUEFSRV9VTk9SREVSRURfRkxBRykgPyBuZXcgU2V0Q2FjaGUgOiB1bmRlZmluZWQ7XG5cbiAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIGFyclZhbHVlLCBpbmRleCwgb3RoZXIsIGFycmF5LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgIH1cbiAgICBpZiAoY29tcGFyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoc2Vlbikge1xuICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlLCBvdGhJbmRleCkge1xuICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIShcbiAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQXJyYXlzO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5JyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIG1hcFRvQXJyYXkgPSByZXF1aXJlKCcuL19tYXBUb0FycmF5JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgKG9iamVjdC5ieXRlT2Zmc2V0ICE9IG90aGVyLmJ5dGVPZmZzZXQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XG4gICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAvLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLlxuICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcblxuICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cyxcbiAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTtcblxuICAgIGNhc2UgbWFwVGFnOlxuICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICBpZiAob2JqZWN0LnNpemUgIT0gb3RoZXIuc2l6ZSAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIGlmIChzeW1ib2xWYWx1ZU9mKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbEJ5VGFnO1xuIiwidmFyIGdldEFsbEtleXMgPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIG9ialByb3BzID0gZ2V0QWxsS2V5cyhvYmplY3QpLFxuICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgb3RoUHJvcHMgPSBnZXRBbGxLZXlzKG90aGVyKSxcbiAgICAgIG90aExlbmd0aCA9IG90aFByb3BzLmxlbmd0aDtcblxuICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBvYmpTdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgaWYgKG9ialN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgIHJldHVybiBvYmpTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gb2JqZWN0O1xuICB9XG4gIHZhciByZXN1bHQgPSB0cnVlO1xuICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gIHdoaWxlICgrK2luZGV4IDwgb2JqTGVuZ3RoKSB7XG4gICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgb2JqVmFsdWUsIGtleSwgb3RoZXIsIG9iamVjdCwgc3RhY2spXG4gICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICA6IGNvbXBhcmVkXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgfVxuICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBvdGhDdG9yID0gb3RoZXIuY29uc3RydWN0b3I7XG5cbiAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICgnY29uc3RydWN0b3InIGluIG9iamVjdCAmJiAnY29uc3RydWN0b3InIGluIG90aGVyKSAmJlxuICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsT2JqZWN0cztcbiIsIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnJlZUdsb2JhbDtcbiIsInZhciBiYXNlR2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRBbGxLZXlzJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5cztcbiIsInZhciBpc0tleWFibGUgPSByZXF1aXJlKCcuL19pc0tleWFibGUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hcERhdGE7XG4iLCJ2YXIgYmFzZUlzTmF0aXZlID0gcmVxdWlyZSgnLi9fYmFzZUlzTmF0aXZlJyksXG4gICAgZ2V0VmFsdWUgPSByZXF1aXJlKCcuL19nZXRWYWx1ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5hdGl2ZTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgc3R1YkFycmF5ID0gcmVxdWlyZSgnLi9zdHViQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHM7XG4iLCJ2YXIgRGF0YVZpZXcgPSByZXF1aXJlKCcuL19EYXRhVmlldycpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIFByb21pc2UgPSByZXF1aXJlKCcuL19Qcm9taXNlJyksXG4gICAgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgV2Vha01hcCA9IHJlcXVpcmUoJy4vX1dlYWtNYXAnKSxcbiAgICBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUYWc7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRWYWx1ZTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbnZhciByZUhhc1VuaWNvZGUgPSBSZWdFeHAoJ1snICsgcnNaV0ogKyByc0FzdHJhbFJhbmdlICArIHJzQ29tYm9SYW5nZSArIHJzVmFyUmFuZ2UgKyAnXScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1VuaWNvZGU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hHZXQ7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoSGFzO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoU2V0O1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW5kZXg7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNLZXlhYmxlO1xuIiwidmFyIGNvcmVKc0RhdGEgPSByZXF1aXJlKCcuL19jb3JlSnNEYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG52YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xufSgpKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXNrZWQ7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm90b3R5cGU7XG4iLCIvKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gW107XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlQ2xlYXI7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgIGRhdGEucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICB9XG4gIC0tdGhpcy5zaXplO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVEZWxldGU7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlR2V0O1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVIYXM7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgKyt0aGlzLnNpemU7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVTZXQ7XG4iLCJ2YXIgSGFzaCA9IHJlcXVpcmUoJy4vX0hhc2gnKSxcbiAgICBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlQ2xlYXI7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVEZWxldGU7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlR2V0O1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVIYXM7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlU2V0O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICovXG5mdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBUb0FycmF5O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUNyZWF0ZTtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5cztcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vZGVVdGlsO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuIiwidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByb290O1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVIYXM7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRvQXJyYXk7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqL1xuZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0RlbGV0ZTtcbiIsIi8qKlxuICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0dldDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tIYXM7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgfVxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja1NldDtcbiIsInZhciBhc2NpaVNpemUgPSByZXF1aXJlKCcuL19hc2NpaVNpemUnKSxcbiAgICBoYXNVbmljb2RlID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZScpLFxuICAgIHVuaWNvZGVTaXplID0gcmVxdWlyZSgnLi9fdW5pY29kZVNpemUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgID8gdW5pY29kZVNpemUoc3RyaW5nKVxuICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nU2l6ZTtcbiIsInZhciBhc2NpaVRvQXJyYXkgPSByZXF1aXJlKCcuL19hc2NpaVRvQXJyYXknKSxcbiAgICBoYXNVbmljb2RlID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZScpLFxuICAgIHVuaWNvZGVUb0FycmF5ID0gcmVxdWlyZSgnLi9fdW5pY29kZVRvQXJyYXknKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgIDogYXNjaWlUb0FycmF5KHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nVG9BcnJheTtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICovXG5mdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiAnJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1NvdXJjZTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgKytyZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmljb2RlU2l6ZTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiB1bmljb2RlVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVUb0FycmF5O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIG5vdyA9IHJlcXVpcmUoJy4vbm93JyksXG4gICAgdG9OdW1iZXIgPSByZXF1aXJlKCcuL3RvTnVtYmVyJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmdcbiAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgIDogdGltZVdhaXRpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlO1xuIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXE7XG4iLCJ2YXIgYmFzZUlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9fYmFzZUlzQXJndW1lbnRzJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKSxcbiAgICBzdHViRmFsc2UgPSByZXF1aXJlKCcuL3N0dWJGYWxzZScpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCdWZmZXI7XG4iLCJ2YXIgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbCcpO1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAqIGVxdWl2YWxlbnQuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICogZGF0ZSBvYmplY3RzLCBlcnJvciBvYmplY3RzLCBtYXBzLCBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLFxuICogc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkIGFycmF5cy4gYE9iamVjdGAgb2JqZWN0cyBhcmUgY29tcGFyZWRcbiAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICogbm9kZXMgYXJlIGNvbXBhcmVkIGJ5IHN0cmljdCBlcXVhbGl0eSwgaS5lLiBgPT09YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIG9iamVjdCA9PT0gb3RoZXI7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VxdWFsO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3ltYm9sO1xuIiwidmFyIGJhc2VJc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19iYXNlSXNUeXBlZEFycmF5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG4iLCJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXM7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3c7XG4iLCJ2YXIgY3JlYXRlUGFkZGluZyA9IHJlcXVpcmUoJy4vX2NyZWF0ZVBhZGRpbmcnKSxcbiAgICBzdHJpbmdTaXplID0gcmVxdWlyZSgnLi9fc3RyaW5nU2l6ZScpLFxuICAgIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vdG9JbnRlZ2VyJyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKlxuICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgcmlnaHQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucGFkRW5kKCdhYmMnLCA2KTtcbiAqIC8vID0+ICdhYmMgICAnXG4gKlxuICogXy5wYWRFbmQoJ2FiYycsIDYsICdfLScpO1xuICogLy8gPT4gJ2FiY18tXydcbiAqXG4gKiBfLnBhZEVuZCgnYWJjJywgMyk7XG4gKiAvLyA9PiAnYWJjJ1xuICovXG5mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgPyAoc3RyaW5nICsgY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSlcbiAgICA6IHN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYWRFbmQ7XG4iLCJ2YXIgY3JlYXRlUGFkZGluZyA9IHJlcXVpcmUoJy4vX2NyZWF0ZVBhZGRpbmcnKSxcbiAgICBzdHJpbmdTaXplID0gcmVxdWlyZSgnLi9fc3RyaW5nU2l6ZScpLFxuICAgIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vdG9JbnRlZ2VyJyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKlxuICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5wYWRTdGFydCgnYWJjJywgNik7XG4gKiAvLyA9PiAnICAgYWJjJ1xuICpcbiAqIF8ucGFkU3RhcnQoJ2FiYycsIDYsICdfLScpO1xuICogLy8gPT4gJ18tX2FiYydcbiAqXG4gKiBfLnBhZFN0YXJ0KCdhYmMnLCAzKTtcbiAqIC8vID0+ICdhYmMnXG4gKi9cbmZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgID8gKGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykgKyBzdHJpbmcpXG4gICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFkU3RhcnQ7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5cyk7XG4gKiAvLyA9PiBbW10sIFtdXVxuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5c1swXSA9PT0gYXJyYXlzWzFdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIHN0dWJBcnJheSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJBcnJheTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCJ2YXIgdG9OdW1iZXIgPSByZXF1aXJlKCcuL3RvTnVtYmVyJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwODtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvRmluaXRlO1xuIiwidmFyIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvSW50ZWdlcjtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvTnVtYmVyO1xuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFJlYWN0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5leHBvcnRzLk1pbmlTdG9yZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xudmFyIFByb3ZpZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQcm92aWRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcm92aWRlcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQcm92aWRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoZXhwb3J0cy5NaW5pU3RvcmVDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiB0aGlzLnByb3BzLnN0b3JlIH0sIHRoaXMucHJvcHMuY2hpbGRyZW4pKTtcbiAgICB9O1xuICAgIHJldHVybiBQcm92aWRlcjtcbn0oUmVhY3QuQ29tcG9uZW50KSk7XG5leHBvcnRzLlByb3ZpZGVyID0gUHJvdmlkZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XG4gICAgcmVzdWx0W1wiZGVmYXVsdFwiXSA9IG1vZDtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBSZWFjdCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIHNoYWxsb3dlcXVhbF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJzaGFsbG93ZXF1YWxcIikpO1xudmFyIGhvaXN0X25vbl9yZWFjdF9zdGF0aWNzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImhvaXN0LW5vbi1yZWFjdC1zdGF0aWNzXCIpKTtcbnZhciBQcm92aWRlcl8xID0gcmVxdWlyZShcIi4vUHJvdmlkZXJcIik7XG5mdW5jdGlvbiBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xufVxudmFyIGRlZmF1bHRNYXBTdGF0ZVRvUHJvcHMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoe30pOyB9O1xuZnVuY3Rpb24gY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHZhciBzaG91bGRTdWJzY3JpYmUgPSAhIW1hcFN0YXRlVG9Qcm9wcztcbiAgICB2YXIgZmluYWxNYXBTdGF0ZVRvUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMgfHwgZGVmYXVsdE1hcFN0YXRlVG9Qcm9wcztcbiAgICByZXR1cm4gZnVuY3Rpb24gd3JhcFdpdGhDb25uZWN0KFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIENvbm5lY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgICAgICBfX2V4dGVuZHMoQ29ubmVjdCwgX3N1cGVyKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIENvbm5lY3QocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkgfHwgdGhpcztcbiAgICAgICAgICAgICAgICBfdGhpcy51bnN1YnNjcmliZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV90aGlzLnVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRTdGF0ZSA9IGZpbmFsTWFwU3RhdGVUb1Byb3BzKF90aGlzLnN0b3JlLmdldFN0YXRlKCksIF90aGlzLnByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUoeyBzdWJzY3JpYmVkOiBuZXh0U3RhdGUgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zdG9yZSA9IF90aGlzLmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZWQ6IGZpbmFsTWFwU3RhdGVUb1Byb3BzKF90aGlzLnN0b3JlLmdldFN0YXRlKCksIHByb3BzKSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmU6IF90aGlzLnN0b3JlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDb25uZWN0LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGZ1bmN0aW9uIChwcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gdXNpbmcgb3duUHJvcHNcbiAgICAgICAgICAgICAgICBpZiAobWFwU3RhdGVUb1Byb3BzICYmIG1hcFN0YXRlVG9Qcm9wcy5sZW5ndGggPT09IDIgJiYgcHJvcHMgIT09IHByZXZTdGF0ZS5wcm9wcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlZDogZmluYWxNYXBTdGF0ZVRvUHJvcHMocHJldlN0YXRlLnN0b3JlLmdldFN0YXRlKCksIHByb3BzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvcHM6IHByb3BzIH07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ29ubmVjdC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlTdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDb25uZWN0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ29ubmVjdC5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICghc2hhbGxvd2VxdWFsXzEuZGVmYXVsdCh0aGlzLnByb3BzLCBuZXh0UHJvcHMpIHx8XG4gICAgICAgICAgICAgICAgICAgICFzaGFsbG93ZXF1YWxfMS5kZWZhdWx0KHRoaXMuc3RhdGUuc3Vic2NyaWJlZCwgbmV4dFN0YXRlLnN1YnNjcmliZWQpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDb25uZWN0LnByb3RvdHlwZS50cnlTdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFN1YnNjcmliZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlID0gdGhpcy5zdG9yZS5zdWJzY3JpYmUodGhpcy5oYW5kbGVDaGFuZ2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDb25uZWN0LnByb3RvdHlwZS50cnlVbnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51bnN1YnNjcmliZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDb25uZWN0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMucHJvcHMpLCB0aGlzLnN0YXRlLnN1YnNjcmliZWQpLCB7IHN0b3JlOiB0aGlzLnN0b3JlIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIF9fYXNzaWduKHt9LCBwcm9wcywgeyByZWY6IHRoaXMucHJvcHMubWluaVN0b3JlRm9yd2FyZGVkUmVmIH0pKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDb25uZWN0LmRpc3BsYXlOYW1lID0gXCJDb25uZWN0KFwiICsgZ2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCkgKyBcIilcIjtcbiAgICAgICAgICAgIENvbm5lY3QuY29udGV4dFR5cGUgPSBQcm92aWRlcl8xLk1pbmlTdG9yZUNvbnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gQ29ubmVjdDtcbiAgICAgICAgfShSZWFjdC5Db21wb25lbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZm9yd2FyZFJlZikge1xuICAgICAgICAgICAgdmFyIGZvcndhcmRlZCA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb25uZWN0LCBfX2Fzc2lnbih7fSwgcHJvcHMsIHsgbWluaVN0b3JlRm9yd2FyZGVkUmVmOiByZWYgfSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaG9pc3Rfbm9uX3JlYWN0X3N0YXRpY3NfMS5kZWZhdWx0KGZvcndhcmRlZCwgV3JhcHBlZENvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhvaXN0X25vbl9yZWFjdF9zdGF0aWNzXzEuZGVmYXVsdChDb25uZWN0LCBXcmFwcGVkQ29tcG9uZW50KTtcbiAgICB9O1xufVxuZXhwb3J0cy5jb25uZWN0ID0gY29ubmVjdDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGNyZWF0ZShpbml0aWFsU3RhdGUpIHtcbiAgICB2YXIgc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgIGZ1bmN0aW9uIHNldFN0YXRlKHBhcnRpYWwpIHtcbiAgICAgICAgc3RhdGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3RhdGUpLCBwYXJ0aWFsKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxpc3RlbmVyc1tpXSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzZXRTdGF0ZTogc2V0U3RhdGUsXG4gICAgICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICAgICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG4gICAgfTtcbn1cbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgUHJvdmlkZXJfMSA9IHJlcXVpcmUoXCIuL1Byb3ZpZGVyXCIpO1xuZXhwb3J0cy5Qcm92aWRlciA9IFByb3ZpZGVyXzEuUHJvdmlkZXI7XG52YXIgY29ubmVjdF8xID0gcmVxdWlyZShcIi4vY29ubmVjdFwiKTtcbmV4cG9ydHMuY29ubmVjdCA9IGNvbm5lY3RfMS5jb25uZWN0O1xudmFyIGNyZWF0ZV8xID0gcmVxdWlyZShcIi4vY3JlYXRlXCIpO1xuZXhwb3J0cy5jcmVhdGUgPSBjcmVhdGVfMS5jcmVhdGU7XG4iLCIvLyEgbW9tZW50LmpzXG4vLyEgdmVyc2lvbiA6IDIuMjkuMFxuLy8hIGF1dGhvcnMgOiBUaW0gV29vZCwgSXNrcmVuIENoZXJuZXYsIE1vbWVudC5qcyBjb250cmlidXRvcnNcbi8vISBsaWNlbnNlIDogTUlUXG4vLyEgbW9tZW50anMuY29tXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzKCkge1xuICAgICAgICByZXR1cm4gaG9va0NhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBkb25lIHRvIHJlZ2lzdGVyIHRoZSBtZXRob2QgY2FsbGVkIHdpdGggbW9tZW50KClcbiAgICAvLyB3aXRob3V0IGNyZWF0aW5nIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICBmdW5jdGlvbiBzZXRIb29rQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgICAgaG9va0NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBcnJheShpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBBcnJheSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgICAgIC8vIElFOCB3aWxsIHRyZWF0IHVuZGVmaW5lZCBhbmQgbnVsbCBhcyBvYmplY3QgaWYgaXQgd2Fzbid0IGZvclxuICAgICAgICAvLyBpbnB1dCAhPSBudWxsXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dCAhPSBudWxsICYmXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBPYmplY3RdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc093blByb3AoYSwgYikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0RW1wdHkob2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3Aob2JqLCBrKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT09IHZvaWQgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RhdGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwKGFyciwgZm4pIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIHRydWUpLnV0YygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZGVlcCBjbG9uZSB0aGlzIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVtcHR5OiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VuczogW10sXG4gICAgICAgICAgICB1bnVzZWRJbnB1dDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdzogLTIsXG4gICAgICAgICAgICBjaGFyc0xlZnRPdmVyOiAwLFxuICAgICAgICAgICAgbnVsbElucHV0OiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRFcmE6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkTW9udGg6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0OiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBpc286IGZhbHNlLFxuICAgICAgICAgICAgcGFyc2VkRGF0ZVBhcnRzOiBbXSxcbiAgICAgICAgICAgIGVyYTogbnVsbCxcbiAgICAgICAgICAgIG1lcmlkaWVtOiBudWxsLFxuICAgICAgICAgICAgcmZjMjgyMjogZmFsc2UsXG4gICAgICAgICAgICB3ZWVrZGF5TWlzbWF0Y2g6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNpbmdGbGFncyhtKSB7XG4gICAgICAgIGlmIChtLl9wZiA9PSBudWxsKSB7XG4gICAgICAgICAgICBtLl9wZiA9IGRlZmF1bHRQYXJzaW5nRmxhZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5fcGY7XG4gICAgfVxuXG4gICAgdmFyIHNvbWU7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5zb21lKSB7XG4gICAgICAgIHNvbWUgPSBBcnJheS5wcm90b3R5cGUuc29tZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzb21lID0gZnVuY3Rpb24gKGZ1bikge1xuICAgICAgICAgICAgdmFyIHQgPSBPYmplY3QodGhpcyksXG4gICAgICAgICAgICAgICAgbGVuID0gdC5sZW5ndGggPj4+IDAsXG4gICAgICAgICAgICAgICAgaTtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gdCAmJiBmdW4uY2FsbCh0aGlzLCB0W2ldLCBpLCB0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkKG0pIHtcbiAgICAgICAgaWYgKG0uX2lzVmFsaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGZsYWdzID0gZ2V0UGFyc2luZ0ZsYWdzKG0pLFxuICAgICAgICAgICAgICAgIHBhcnNlZFBhcnRzID0gc29tZS5jYWxsKGZsYWdzLnBhcnNlZERhdGVQYXJ0cywgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpc05vd1ZhbGlkID1cbiAgICAgICAgICAgICAgICAgICAgIWlzTmFOKG0uX2QuZ2V0VGltZSgpKSAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5vdmVyZmxvdyA8IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkRXJhICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkTW9udGggJiZcbiAgICAgICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRXZWVrZGF5ICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAgICAgIWZsYWdzLm51bGxJbnB1dCAmJlxuICAgICAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZEZvcm1hdCAmJlxuICAgICAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICghZmxhZ3MubWVyaWRpZW0gfHwgKGZsYWdzLm1lcmlkaWVtICYmIHBhcnNlZFBhcnRzKSk7XG5cbiAgICAgICAgICAgIGlmIChtLl9zdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBpc05vd1ZhbGlkID1cbiAgICAgICAgICAgICAgICAgICAgaXNOb3dWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5jaGFyc0xlZnRPdmVyID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLnVudXNlZFRva2Vucy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYmlnSG91ciA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuID09IG51bGwgfHwgIU9iamVjdC5pc0Zyb3plbihtKSkge1xuICAgICAgICAgICAgICAgIG0uX2lzVmFsaWQgPSBpc05vd1ZhbGlkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkKGZsYWdzKSB7XG4gICAgICAgIHZhciBtID0gY3JlYXRlVVRDKE5hTik7XG4gICAgICAgIGlmIChmbGFncyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHRlbmQoZ2V0UGFyc2luZ0ZsYWdzKG0pLCBmbGFncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkudXNlckludmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIC8vIFBsdWdpbnMgdGhhdCBhZGQgcHJvcGVydGllcyBzaG91bGQgYWxzbyBhZGQgdGhlIGtleSBoZXJlIChudWxsIHZhbHVlKSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJvcGVybHkgY2xvbmUgb3Vyc2VsdmVzLlxuICAgIHZhciBtb21lbnRQcm9wZXJ0aWVzID0gKGhvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXSksXG4gICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgLy8gTW9tZW50IHByb3RvdHlwZSBvYmplY3RcbiAgICBmdW5jdGlvbiBNb21lbnQoY29uZmlnKSB7XG4gICAgICAgIGNvcHlDb25maWcodGhpcywgY29uZmlnKTtcbiAgICAgICAgdGhpcy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5fZCAhPSBudWxsID8gY29uZmlnLl9kLmdldFRpbWUoKSA6IE5hTik7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiBjYXNlIHVwZGF0ZU9mZnNldCBjcmVhdGVzIG5ldyBtb21lbnRcbiAgICAgICAgLy8gb2JqZWN0cy5cbiAgICAgICAgaWYgKHVwZGF0ZUluUHJvZ3Jlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTW9tZW50KG9iaikge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgb2JqIGluc3RhbmNlb2YgTW9tZW50IHx8IChvYmogIT0gbnVsbCAmJiBvYmouX2lzQU1vbWVudE9iamVjdCAhPSBudWxsKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgY29uc29sZS53YXJuXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICBrZXk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0gJ1xcblsnICsgaSArICddICc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChhcmd1bWVudHNbMF0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9IGtleSArICc6ICcgKyBhcmd1bWVudHNbMF1ba2V5XSArICcsICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnNsaWNlKDAsIC0yKTsgLy8gUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGFuZCBzcGFjZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICAgICBtc2cgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbkFyZ3VtZW50czogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKS5qb2luKCcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoKS5zdGFja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSwgZm4pO1xuICAgIH1cblxuICAgIHZhciBkZXByZWNhdGlvbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCBtc2cpIHtcbiAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobmFtZSwgbXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICAgICAgZGVwcmVjYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZhbHNlO1xuICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodHlwZW9mIEZ1bmN0aW9uICE9PSAndW5kZWZpbmVkJyAmJiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldChjb25maWcpIHtcbiAgICAgICAgdmFyIHByb3AsIGk7XG4gICAgICAgIGZvciAoaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGNvbmZpZywgaSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIC8vIExlbmllbnQgb3JkaW5hbCBwYXJzaW5nIGFjY2VwdHMganVzdCBhIG51bWJlciBpbiBhZGRpdGlvbiB0b1xuICAgICAgICAvLyBudW1iZXIgKyAocG9zc2libHkpIHN0dWZmIGNvbWluZyBmcm9tIF9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLlxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICh0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLnNvdXJjZSB8fCB0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlKSArXG4gICAgICAgICAgICAgICAgJ3wnICtcbiAgICAgICAgICAgICAgICAvXFxkezEsMn0vLnNvdXJjZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksXG4gICAgICAgICAgICBwcm9wO1xuICAgICAgICBmb3IgKHByb3AgaW4gY2hpbGRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChwYXJlbnRDb25maWdbcHJvcF0pICYmIGlzT2JqZWN0KGNoaWxkQ29uZmlnW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgcGFyZW50Q29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgY2hpbGRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRDb25maWdbcHJvcF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBjaGlsZENvbmZpZ1twcm9wXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gcGFyZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcChwYXJlbnRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNoYW5nZXMgdG8gcHJvcGVydGllcyBkb24ndCBtb2RpZnkgcGFyZW50IGNvbmZpZ1xuICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGV4dGVuZCh7fSwgcmVzW3Byb3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvY2FsZShjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleXM7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGtleXMgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgICAgICByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB6ZXJvRmlsbChudW1iZXIsIHRhcmdldExlbmd0aCwgZm9yY2VTaWduKSB7XG4gICAgICAgIHZhciBhYnNOdW1iZXIgPSAnJyArIE1hdGguYWJzKG51bWJlciksXG4gICAgICAgICAgICB6ZXJvc1RvRmlsbCA9IHRhcmdldExlbmd0aCAtIGFic051bWJlci5sZW5ndGgsXG4gICAgICAgICAgICBzaWduID0gbnVtYmVyID49IDA7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2lnbiA/IChmb3JjZVNpZ24gPyAnKycgOiAnJykgOiAnLScpICtcbiAgICAgICAgICAgIE1hdGgucG93KDEwLCBNYXRoLm1heCgwLCB6ZXJvc1RvRmlsbCkpLnRvU3RyaW5nKCkuc3Vic3RyKDEpICtcbiAgICAgICAgICAgIGFic051bWJlclxuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KFtIaF1tbShzcyk/fE1vfE1NP00/TT98RG98REREb3xERD9EP0Q/fGRkZD9kP3xkbz98d1tvfHddP3xXW298V10/fFFvP3xOezEsNX18WVlZWVlZfFlZWVlZfFlZWVl8WVl8eXsyLDR9fHlvP3xnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xraz98bW0/fHNzP3xTezEsOX18eHxYfHp6P3xaWj98LikvZyxcbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KExUU3xMVHxMTD9MP0w/fGx7MSw0fSkvZyxcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zID0ge30sXG4gICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zID0ge307XG5cbiAgICAvLyB0b2tlbjogICAgJ00nXG4gICAgLy8gcGFkZGVkOiAgIFsnTU0nLCAyXVxuICAgIC8vIG9yZGluYWw6ICAnTW8nXG4gICAgLy8gY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHsgdGhpcy5tb250aCgpICsgMSB9XG4gICAgZnVuY3Rpb24gYWRkRm9ybWF0VG9rZW4odG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGJhY2tdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGVkKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW29yZGluYWxdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKFxuICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgICAgICAgICAgIHRva2VuXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5tYXRjaCgvXFxbW1xcc1xcU10vKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gZm9ybWF0Lm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJyxcbiAgICAgICAgICAgICAgICBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGlzRnVuY3Rpb24oYXJyYXlbaV0pXG4gICAgICAgICAgICAgICAgICAgID8gYXJyYXlbaV0uY2FsbChtb20sIGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgOiBhcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IGRhdGUgdXNpbmcgbmF0aXZlIGRhdGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gZm9ybWF0TW9tZW50KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbS5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGV4cGFuZEZvcm1hdChmb3JtYXQsIG0ubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gPVxuICAgICAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gfHwgbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxvY2FsZSkge1xuICAgICAgICB2YXIgaSA9IDU7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2VucyxcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb25nRGF0ZUZvcm1hdCA9IHtcbiAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICBMOiAnTU0vREQvWVlZWScsXG4gICAgICAgIExMOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgTExMOiAnTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9uZ0RhdGVGb3JtYXQoa2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldLFxuICAgICAgICAgICAgZm9ybWF0VXBwZXIgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXkudG9VcHBlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGZvcm1hdCB8fCAhZm9ybWF0VXBwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldID0gZm9ybWF0VXBwZXJcbiAgICAgICAgICAgIC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAodG9rKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdNTU1NJyB8fFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdNTScgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnREQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ2RkZGQnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2suc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0b2s7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0SW52YWxpZERhdGUgPSAnSW52YWxpZCBkYXRlJztcblxuICAgIGZ1bmN0aW9uIGludmFsaWREYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJyxcbiAgICAgICAgZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UgPSAvXFxkezEsMn0vO1xuXG4gICAgZnVuY3Rpb24gb3JkaW5hbChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZSgnJWQnLCBudW1iZXIpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UmVsYXRpdmVUaW1lID0ge1xuICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgIHc6ICdhIHdlZWsnLFxuICAgICAgICB3dzogJyVkIHdlZWtzJyxcbiAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dClcbiAgICAgICAgICAgID8gb3V0cHV0KG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSlcbiAgICAgICAgICAgIDogb3V0cHV0LnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFzdEZ1dHVyZShkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFsaWFzZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRBbGlhcyh1bml0LCBzaG9ydGhhbmQpIHtcbiAgICAgICAgdmFyIGxvd2VyQ2FzZSA9IHVuaXQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYWxpYXNlc1tsb3dlckNhc2VdID0gYWxpYXNlc1tsb3dlckNhc2UgKyAncyddID0gYWxpYXNlc1tzaG9ydGhhbmRdID0gdW5pdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVVbml0cyh1bml0cykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHVuaXRzID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVPYmplY3RVbml0cyhpbnB1dE9iamVjdCkge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0ge30sXG4gICAgICAgICAgICBub3JtYWxpemVkUHJvcCxcbiAgICAgICAgICAgIHByb3A7XG5cbiAgICAgICAgZm9yIChwcm9wIGluIGlucHV0T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChpbnB1dE9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZVVuaXRzKHByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkSW5wdXRbbm9ybWFsaXplZFByb3BdID0gaW5wdXRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRJbnB1dDtcbiAgICB9XG5cbiAgICB2YXIgcHJpb3JpdGllcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkVW5pdFByaW9yaXR5KHVuaXQsIHByaW9yaXR5KSB7XG4gICAgICAgIHByaW9yaXRpZXNbdW5pdF0gPSBwcmlvcml0eTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzT2JqKSB7XG4gICAgICAgIHZhciB1bml0cyA9IFtdLFxuICAgICAgICAgICAgdTtcbiAgICAgICAgZm9yICh1IGluIHVuaXRzT2JqKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcCh1bml0c09iaiwgdSkpIHtcbiAgICAgICAgICAgICAgICB1bml0cy5wdXNoKHsgdW5pdDogdSwgcHJpb3JpdHk6IHByaW9yaXRpZXNbdV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApIHx8IHllYXIgJSA0MDAgPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzRmxvb3IobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICAvLyAtMCAtPiAwXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcikgfHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0ludChhcmd1bWVudEZvckNvZXJjaW9uKSB7XG4gICAgICAgIHZhciBjb2VyY2VkTnVtYmVyID0gK2FyZ3VtZW50Rm9yQ29lcmNpb24sXG4gICAgICAgICAgICB2YWx1ZSA9IDA7XG5cbiAgICAgICAgaWYgKGNvZXJjZWROdW1iZXIgIT09IDAgJiYgaXNGaW5pdGUoY29lcmNlZE51bWJlcikpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYWJzRmxvb3IoY29lcmNlZE51bWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldFNldCh1bml0LCBrZWVwVGltZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHNldCQxKHRoaXMsIHVuaXQsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywga2VlcFRpbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldChtb20sIHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbS5pc1ZhbGlkKClcbiAgICAgICAgICAgID8gbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKClcbiAgICAgICAgICAgIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCQxKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG1vbS5pc1ZhbGlkKCkgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHVuaXQgPT09ICdGdWxsWWVhcicgJiZcbiAgICAgICAgICAgICAgICBpc0xlYXBZZWFyKG1vbS55ZWFyKCkpICYmXG4gICAgICAgICAgICAgICAgbW9tLm1vbnRoKCkgPT09IDEgJiZcbiAgICAgICAgICAgICAgICBtb20uZGF0ZSgpID09PSAyOVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0ludCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbW9tLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgIGRheXNJbk1vbnRoKHZhbHVlLCBtb20ubW9udGgoKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb20uX2RbJ3NldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgdW5pdF0odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc3RyaW5nR2V0KHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzXSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1NldCh1bml0cywgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1bml0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplT2JqZWN0VW5pdHModW5pdHMpO1xuICAgICAgICAgICAgdmFyIHByaW9yaXRpemVkID0gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0cyksXG4gICAgICAgICAgICAgICAgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmlvcml0aXplZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXNbcHJpb3JpdGl6ZWRbaV0udW5pdF0odW5pdHNbcHJpb3JpdGl6ZWRbaV0udW5pdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciBtYXRjaDEgPSAvXFxkLywgLy8gICAgICAgMCAtIDlcbiAgICAgICAgbWF0Y2gyID0gL1xcZFxcZC8sIC8vICAgICAgMDAgLSA5OVxuICAgICAgICBtYXRjaDMgPSAvXFxkezN9LywgLy8gICAgIDAwMCAtIDk5OVxuICAgICAgICBtYXRjaDQgPSAvXFxkezR9LywgLy8gICAgMDAwMCAtIDk5OTlcbiAgICAgICAgbWF0Y2g2ID0gL1srLV0/XFxkezZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzIgPSAvXFxkXFxkPy8sIC8vICAgICAgIDAgLSA5OVxuICAgICAgICBtYXRjaDN0bzQgPSAvXFxkXFxkXFxkXFxkPy8sIC8vICAgICA5OTkgLSA5OTk5XG4gICAgICAgIG1hdGNoNXRvNiA9IC9cXGRcXGRcXGRcXGRcXGRcXGQ/LywgLy8gICA5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzMgPSAvXFxkezEsM30vLCAvLyAgICAgICAwIC0gOTk5XG4gICAgICAgIG1hdGNoMXRvNCA9IC9cXGR7MSw0fS8sIC8vICAgICAgIDAgLSA5OTk5XG4gICAgICAgIG1hdGNoMXRvNiA9IC9bKy1dP1xcZHsxLDZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaFVuc2lnbmVkID0gL1xcZCsvLCAvLyAgICAgICAwIC0gaW5mXG4gICAgICAgIG1hdGNoU2lnbmVkID0gL1srLV0/XFxkKy8sIC8vICAgIC1pbmYgLSBpbmZcbiAgICAgICAgbWF0Y2hPZmZzZXQgPSAvWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2ksIC8vICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgICAgICBtYXRjaFNob3J0T2Zmc2V0ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2ksIC8vICswMCAtMDAgKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgICAgIG1hdGNoVGltZXN0YW1wID0gL1srLV0/XFxkKyhcXC5cXGR7MSwzfSk/LywgLy8gMTIzNDU2Nzg5IDEyMzQ1Njc4OS4xMjNcbiAgICAgICAgLy8gYW55IHdvcmQgKG9yIHR3bykgY2hhcmFjdGVycyBvciBudW1iZXJzIGluY2x1ZGluZyB0d28vdGhyZWUgd29yZCBtb250aCBpbiBhcmFiaWMuXG4gICAgICAgIC8vIGluY2x1ZGVzIHNjb3R0aXNoIGdhZWxpYyB0d28gd29yZCBhbmQgaHlwaGVuYXRlZCBtb250aHNcbiAgICAgICAgbWF0Y2hXb3JkID0gL1swLTldezAsMjU2fVsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRjA3XFx1RkYxMC1cXHVGRkVGXXsxLDI1Nn18W1xcdTA2MDAtXFx1MDZGRlxcL117MSwyNTZ9KFxccyo/W1xcdTA2MDAtXFx1MDZGRl17MSwyNTZ9KXsxLDJ9L2ksXG4gICAgICAgIHJlZ2V4ZXM7XG5cbiAgICByZWdleGVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRSZWdleFRva2VuKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KVxuICAgICAgICAgICAgPyByZWdleFxuICAgICAgICAgICAgOiBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZURhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpc1N0cmljdCAmJiBzdHJpY3RSZWdleCA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHJlZ2V4ZXMsIHRva2VuKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodW5lc2NhcGVGb3JtYXQodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWdleGVzW3Rva2VuXShjb25maWcuX3N0cmljdCwgY29uZmlnLl9sb2NhbGUpO1xuICAgIH1cblxuICAgIC8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcbiAgICBmdW5jdGlvbiB1bmVzY2FwZUZvcm1hdChzKSB7XG4gICAgICAgIHJldHVybiByZWdleEVzY2FwZShcbiAgICAgICAgICAgIHNcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnXFxcXCcsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcKFxcWyl8XFxcXChcXF0pfFxcWyhbXlxcXVxcW10qKVxcXXxcXFxcKC4pL2csIGZ1bmN0aW9uIChcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCxcbiAgICAgICAgICAgICAgICAgICAgcDEsXG4gICAgICAgICAgICAgICAgICAgIHAyLFxuICAgICAgICAgICAgICAgICAgICBwMyxcbiAgICAgICAgICAgICAgICAgICAgcDRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAxIHx8IHAyIHx8IHAzIHx8IHA0O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVnZXhFc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICB2YXIgdG9rZW5zID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRQYXJzZVRva2VuKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRva2VuID0gW3Rva2VuXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOdW1iZXIoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2NhbGxiYWNrXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5baV1dID0gZnVuYztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtQYXJzZVRva2VuKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayhpbnB1dCwgY29uZmlnLl93LCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBZRUFSID0gMCxcbiAgICAgICAgTU9OVEggPSAxLFxuICAgICAgICBEQVRFID0gMixcbiAgICAgICAgSE9VUiA9IDMsXG4gICAgICAgIE1JTlVURSA9IDQsXG4gICAgICAgIFNFQ09ORCA9IDUsXG4gICAgICAgIE1JTExJU0VDT05EID0gNixcbiAgICAgICAgV0VFSyA9IDcsXG4gICAgICAgIFdFRUtEQVkgPSA4O1xuXG4gICAgZnVuY3Rpb24gbW9kKG4sIHgpIHtcbiAgICAgICAgcmV0dXJuICgobiAlIHgpICsgeCkgJSB4O1xuICAgIH1cblxuICAgIHZhciBpbmRleE9mO1xuXG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XG4gICAgICAgIGluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleE9mID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIC8vIEkga25vd1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW2ldID09PSBvKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgICBpZiAoaXNOYU4oeWVhcikgfHwgaXNOYU4obW9udGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtb2RNb250aCA9IG1vZChtb250aCwgMTIpO1xuICAgICAgICB5ZWFyICs9IChtb250aCAtIG1vZE1vbnRoKSAvIDEyO1xuICAgICAgICByZXR1cm4gbW9kTW9udGggPT09IDFcbiAgICAgICAgICAgID8gaXNMZWFwWWVhcih5ZWFyKVxuICAgICAgICAgICAgICAgID8gMjlcbiAgICAgICAgICAgICAgICA6IDI4XG4gICAgICAgICAgICA6IDMxIC0gKChtb2RNb250aCAlIDcpICUgMik7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ00nLCBbJ01NJywgMl0sICdNbycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9udGgoKSArIDE7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21vbnRoJywgJ00nKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21vbnRoJywgOCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdNJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU0nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTU0nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNJywgJ01NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gdG9JbnQoaW5wdXQpIC0gMTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNTU0nLCAnTU1NTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciBtb250aCA9IGNvbmZpZy5fbG9jYWxlLm1vbnRoc1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1vbnRoIG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZC5cbiAgICAgICAgaWYgKG1vbnRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFycmF5W01PTlRIXSA9IG1vbnRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZE1vbnRoID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIHZhciBkZWZhdWx0TG9jYWxlTW9udGhzID0gJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCA9ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgTU9OVEhTX0lOX0ZPUk1BVCA9IC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0/LyxcbiAgICAgICAgZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXggPSBtYXRjaFdvcmQsXG4gICAgICAgIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRocyhtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocylcbiAgICAgICAgICAgID8gdGhpcy5fbW9udGhzW20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzW1xuICAgICAgICAgICAgICAgICAgKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgICA/ICdmb3JtYXQnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnc3RhbmRhbG9uZSdcbiAgICAgICAgICAgICAgXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KVxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0WydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpXG4gICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0W20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRbXG4gICAgICAgICAgICAgICAgICBNT05USFNfSU5fRk9STUFULnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF1bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgdXNlZFxuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UuY2FsbCh0aGlzLCBtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGFkZCBzb3J0aW5nXG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXJcbiAgICAgICAgLy8gc2VlIHNvcnRpbmcgaW4gY29tcHV0ZU1vbnRoc1BhcnNlXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdHJpY3QgJiYgIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKSArICd8XicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU1NJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU0nICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX21vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc2V0TW9udGgobW9tLCB2YWx1ZSkge1xuICAgICAgICB2YXIgZGF5T2ZNb250aDtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXlPZk1vbnRoID0gTWF0aC5taW4obW9tLmRhdGUoKSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0TW9udGgodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsICdNb250aCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF5c0luTW9udGgoKSB7XG4gICAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFJlZ2V4ID0gZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1JlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IGRlZmF1bHRNb250aHNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZU1vbnRoc1BhcnNlKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hvcnRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGxvbmdQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbW9tO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2godGhpcy5tb250aHNTaG9ydChtb20sICcnKSk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyB6ZXJvRmlsbCh5LCA0KSA6ICcrJyArIHk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZJywgNF0sIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsIDVdLCAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVlZJywgNiwgdHJ1ZV0sIDAsICd5ZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3llYXInLCAneScpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd5ZWFyJywgMSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdZJywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVknLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ1lZWVlZJywgJ1lZWVlZWSddLCBZRUFSKTtcbiAgICBhZGRQYXJzZVRva2VuKCdZWVlZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9XG4gICAgICAgICAgICBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgaG9va3MucGFyc2VUd29EaWdpdFllYXIgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRvSW50KGlucHV0KSArICh0b0ludChpbnB1dCkgPiA2OCA/IDE5MDAgOiAyMDAwKTtcbiAgICB9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFllYXIgPSBtYWtlR2V0U2V0KCdGdWxsWWVhcicsIHRydWUpO1xuXG4gICAgZnVuY3Rpb24gZ2V0SXNMZWFwWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpIHtcbiAgICAgICAgLy8gY2FuJ3QganVzdCBhcHBseSgpIHRvIGNyZWF0ZSBhIGRhdGU6XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xODEzNDhcbiAgICAgICAgdmFyIGRhdGU7XG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSArIDQwMCwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVUQ0RhdGUoeSkge1xuICAgICAgICB2YXIgZGF0ZSwgYXJncztcbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGFyZ3NbMF0gPSB5ICsgNDAwO1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3MpKTtcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpKSB7XG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0LW9mLWZpcnN0LXdlZWsgLSBzdGFydC1vZi15ZWFyXG4gICAgZnVuY3Rpb24gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciAvLyBmaXJzdC13ZWVrIGRheSAtLSB3aGljaCBqYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayAoNCBmb3IgaXNvLCAxIGZvciBvdGhlcilcbiAgICAgICAgICAgIGZ3ZCA9IDcgKyBkb3cgLSBkb3ksXG4gICAgICAgICAgICAvLyBmaXJzdC13ZWVrIGRheSBsb2NhbCB3ZWVrZGF5IC0tIHdoaWNoIGxvY2FsIHdlZWtkYXkgaXMgZndkXG4gICAgICAgICAgICBmd2RsdyA9ICg3ICsgY3JlYXRlVVRDRGF0ZSh5ZWFyLCAwLCBmd2QpLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG5cbiAgICAgICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZSNDYWxjdWxhdGluZ19hX2RhdGVfZ2l2ZW5fdGhlX3llYXIuMkNfd2Vla19udW1iZXJfYW5kX3dlZWtkYXlcbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla3MoeWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGxvY2FsV2Vla2RheSA9ICg3ICsgd2Vla2RheSAtIGRvdykgJSA3LFxuICAgICAgICAgICAgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXlPZlllYXIgPSAxICsgNyAqICh3ZWVrIC0gMSkgKyBsb2NhbFdlZWtkYXkgKyB3ZWVrT2Zmc2V0LFxuICAgICAgICAgICAgcmVzWWVhcixcbiAgICAgICAgICAgIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQobW9tLnllYXIoKSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2VlayA9IE1hdGguZmxvb3IoKG1vbS5kYXlPZlllYXIoKSAtIHdlZWtPZmZzZXQgLSAxKSAvIDcpICsgMSxcbiAgICAgICAgICAgIHJlc1dlZWssXG4gICAgICAgICAgICByZXNZZWFyO1xuXG4gICAgICAgIGlmICh3ZWVrIDwgMSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgLSAxO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgKyB3ZWVrc0luWWVhcihyZXNZZWFyLCBkb3csIGRveSk7XG4gICAgICAgIH0gZWxzZSBpZiAod2VlayA+IHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KSkge1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgLSB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSk7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdlZWs6IHJlc1dlZWssXG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrJywgJ3cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWsnLCAnVycpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrJywgNSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrJywgNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd3JywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCd3dycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdXJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdXVycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsndycsICd3dycsICdXJywgJ1dXJ10sIGZ1bmN0aW9uIChcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHdlZWssXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdG9rZW5cbiAgICApIHtcbiAgICAgICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMSldID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vlayhtb20pIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrID0ge1xuICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZldlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB0aGlzLmxvY2FsZURhdGEoKS53ZWVrKHRoaXMpO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2VlayhpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkud2VlaztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkJywgMCwgJ2RvJywgJ2RheScpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZScsIDAsIDAsICd3ZWVrZGF5Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ0UnLCAwLCAwLCAnaXNvV2Vla2RheScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXknLCAnZCcpO1xuICAgIGFkZFVuaXRBbGlhcygnd2Vla2RheScsICdlJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrZGF5JywgJ0UnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrZGF5JywgMTEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla2RheScsIDExKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2QnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2UnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0UnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c01pblJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdkZGQnLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkZCcsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2RkJywgJ2RkZCcsICdkZGRkJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgd2Vla2RheSA9IGNvbmZpZy5fbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBnZXQgYSB3ZWVrZGF5IG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZFxuICAgICAgICBpZiAod2Vla2RheSAhPSBudWxsKSB7XG4gICAgICAgICAgICB3ZWVrLmQgPSB3ZWVrZGF5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZFdlZWtkYXkgPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkJywgJ2UnLCAnRSddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbnB1dCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KSAlIDcgfHwgNztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNOYU4oaW5wdXQpID8gbnVsbCA6IGlucHV0O1xuICAgIH1cblxuICAgIC8vIExPQ0FMRVNcbiAgICBmdW5jdGlvbiBzaGlmdFdlZWtkYXlzKHdzLCBuKSB7XG4gICAgICAgIHJldHVybiB3cy5zbGljZShuLCA3KS5jb25jYXQod3Muc2xpY2UoMCwgbikpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0ID0gJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluID0gJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBkZWZhdWx0V2Vla2RheXNSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzTWluUmVnZXggPSBtYXRjaFdvcmQ7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5cyhtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIHdlZWtkYXlzID0gaXNBcnJheSh0aGlzLl93ZWVrZGF5cylcbiAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNcbiAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNbXG4gICAgICAgICAgICAgICAgICBtICYmIG0gIT09IHRydWUgJiYgdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgICAgPyAnZm9ybWF0J1xuICAgICAgICAgICAgICAgICAgICAgIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF07XG4gICAgICAgIHJldHVybiBtID09PSB0cnVlXG4gICAgICAgICAgICA/IHNoaWZ0V2Vla2RheXMod2Vla2RheXMsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICA/IHdlZWtkYXlzW20uZGF5KCldXG4gICAgICAgICAgICA6IHdlZWtkYXlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzU2hvcnQobSkge1xuICAgICAgICByZXR1cm4gbSA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyBzaGlmdFdlZWtkYXlzKHRoaXMuX3dlZWtkYXlzU2hvcnQsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV1cbiAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNTaG9ydDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c01pbihtKSB7XG4gICAgICAgIHJldHVybiBtID09PSB0cnVlXG4gICAgICAgICAgICA/IHNoaWZ0V2Vla2RheXModGhpcy5fd2Vla2RheXNNaW4sIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldXG4gICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzTWluO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmljdFBhcnNlJDEod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSB3ZWVrZGF5TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzTWluKFxuICAgICAgICAgICAgICAgICAgICBtb20sXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlJDEuY2FsbCh0aGlzLCB3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcblxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzKG1vbSwgJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ3xeJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSArXG4gICAgICAgICAgICAgICAgICAgICd8XicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ2RkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5ID0gdGhpcy5faXNVVEMgPyB0aGlzLl9kLmdldFVUQ0RheSgpIDogdGhpcy5fZC5nZXREYXkoKTtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlucHV0ID0gcGFyc2VXZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoaW5wdXQgLSBkYXksICdkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJlaGF2ZXMgdGhlIHNhbWUgYXMgbW9tZW50I2RheSBleGNlcHRcbiAgICAgICAgLy8gYXMgYSBnZXR0ZXIsIHJldHVybnMgNyBpbnN0ZWFkIG9mIDAgKDEtNyByYW5nZSBpbnN0ZWFkIG9mIDAtNilcbiAgICAgICAgLy8gYXMgYSBzZXR0ZXIsIHN1bmRheSBzaG91bGQgYmVsb25nIHRvIHRoZSBwcmV2aW91cyB3ZWVrLlxuXG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgd2Vla2RheSA9IHBhcnNlSXNvV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KHRoaXMuZGF5KCkgJSA3ID8gd2Vla2RheSA6IHdlZWtkYXkgLSA3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpIHx8IDc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNNaW5SZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNNaW5SZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlV2Vla2RheXNQYXJzZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pblBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgc2hvcnRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGxvbmdQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgbWlucCxcbiAgICAgICAgICAgIHNob3J0cCxcbiAgICAgICAgICAgIGxvbmdwO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIG1pbnAgPSByZWdleEVzY2FwZSh0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpKTtcbiAgICAgICAgICAgIHNob3J0cCA9IHJlZ2V4RXNjYXBlKHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSk7XG4gICAgICAgICAgICBsb25ncCA9IHJlZ2V4RXNjYXBlKHRoaXMud2Vla2RheXMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWluUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2gobG9uZ3ApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobG9uZ3ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgd2Vla2RheSAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlciBpdFxuICAgICAgICAvLyB3aWxsIG1hdGNoIHRoZSBsb25nZXIgcGllY2UuXG4gICAgICAgIG1pblBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbG9uZ1BpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIG1peGVkUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gaEZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgfHwgMjQ7XG4gICAgfVxuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0gnLCBbJ0hIJywgMl0sIDAsICdob3VyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ2gnLCBbJ2hoJywgMl0sIDAsIGhGb3JtYXQpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdrJywgWydraycsIDJdLCAwLCBrRm9ybWF0KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdobW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIGhGb3JtYXQuYXBwbHkodGhpcykgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICBoRm9ybWF0LmFwcGx5KHRoaXMpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLnNlY29uZHMoKSwgMilcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICcnICtcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtZXJpZGllbSh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0oXG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgICAgIGxvd2VyY2FzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnaG91cicsICdoJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnaG91cicsIDEzKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0oaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLl9tZXJpZGllbVBhcnNlO1xuICAgIH1cblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2EnLCBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdBJywgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignSCcsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignaCcsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignaycsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbigna2snLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydrJywgJ2trJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIga0lucHV0ID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQsXG4gICAgICAgICAgICBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0LFxuICAgICAgICAgICAgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTShpbnB1dCkge1xuICAgICAgICAvLyBJRTggUXVpcmtzIE1vZGUgJiBJRTcgU3RhbmRhcmRzIE1vZGUgZG8gbm90IGFsbG93IGFjY2Vzc2luZyBzdHJpbmdzIGxpa2UgYXJyYXlzXG4gICAgICAgIC8vIFVzaW5nIGNoYXJBdCBzaG91bGQgYmUgbW9yZSBjb21wYXRpYmxlLlxuICAgICAgICByZXR1cm4gKGlucHV0ICsgJycpLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApID09PSAncCc7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2ksXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGhvdXIgc2hvdWxkIGtlZXAgdGhlIHRpbWUsIGJlY2F1c2UgdGhlIHVzZXIgZXhwbGljaXRseVxuICAgICAgICAvLyBzcGVjaWZpZWQgd2hpY2ggaG91ciB0aGV5IHdhbnQuIFNvIHRyeWluZyB0byBtYWludGFpbiB0aGUgc2FtZSBob3VyIChpblxuICAgICAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAgICAgLy8gdGhpcyBydWxlLlxuICAgICAgICBnZXRTZXRIb3VyID0gbWFrZUdldFNldCgnSG91cnMnLCB0cnVlKTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1lcmlkaWVtKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBiYXNlQ29uZmlnID0ge1xuICAgICAgICBjYWxlbmRhcjogZGVmYXVsdENhbGVuZGFyLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDogZGVmYXVsdExvbmdEYXRlRm9ybWF0LFxuICAgICAgICBpbnZhbGlkRGF0ZTogZGVmYXVsdEludmFsaWREYXRlLFxuICAgICAgICBvcmRpbmFsOiBkZWZhdWx0T3JkaW5hbCxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UsXG4gICAgICAgIHJlbGF0aXZlVGltZTogZGVmYXVsdFJlbGF0aXZlVGltZSxcblxuICAgICAgICBtb250aHM6IGRlZmF1bHRMb2NhbGVNb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQsXG5cbiAgICAgICAgd2VlazogZGVmYXVsdExvY2FsZVdlZWssXG5cbiAgICAgICAgd2Vla2RheXM6IGRlZmF1bHRMb2NhbGVXZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46IGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbixcbiAgICAgICAgd2Vla2RheXNTaG9ydDogZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQsXG5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2UsXG4gICAgfTtcblxuICAgIC8vIGludGVybmFsIHN0b3JhZ2UgZm9yIGxvY2FsZSBjb25maWcgZmlsZXNcbiAgICB2YXIgbG9jYWxlcyA9IHt9LFxuICAgICAgICBsb2NhbGVGYW1pbGllcyA9IHt9LFxuICAgICAgICBnbG9iYWxMb2NhbGU7XG5cbiAgICBmdW5jdGlvbiBjb21tb25QcmVmaXgoYXJyMSwgYXJyMikge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIG1pbmwgPSBNYXRoLm1pbihhcnIxLmxlbmd0aCwgYXJyMi5sZW5ndGgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWlubDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoYXJyMVtpXSAhPT0gYXJyMltpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW5sO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSA/IGtleS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ18nLCAnLScpIDoga2V5O1xuICAgIH1cblxuICAgIC8vIHBpY2sgdGhlIGxvY2FsZSBmcm9tIHRoZSBhcnJheVxuICAgIC8vIHRyeSBbJ2VuLWF1JywgJ2VuLWdiJ10gYXMgJ2VuLWF1JywgJ2VuLWdiJywgJ2VuJywgYXMgaW4gbW92ZSB0aHJvdWdoIHRoZSBsaXN0IHRyeWluZyBlYWNoXG4gICAgLy8gc3Vic3RyaW5nIGZyb20gbW9zdCBzcGVjaWZpYyB0byBsZWFzdCwgYnV0IG1vdmUgdG8gdGhlIG5leHQgYXJyYXkgaXRlbSBpZiBpdCdzIGEgbW9yZSBzcGVjaWZpYyB2YXJpYW50IHRoYW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgIGZ1bmN0aW9uIGNob29zZUxvY2FsZShuYW1lcykge1xuICAgICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgICBqLFxuICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIHNwbGl0O1xuXG4gICAgICAgIHdoaWxlIChpIDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzcGxpdCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpXSkuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGogPSBzcGxpdC5sZW5ndGg7XG4gICAgICAgICAgICBuZXh0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2kgKyAxXSk7XG4gICAgICAgICAgICBuZXh0ID0gbmV4dCA/IG5leHQuc3BsaXQoJy0nKSA6IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAoaiA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKHNwbGl0LnNsaWNlKDAsIGopLmpvaW4oJy0nKSk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG5leHQgJiZcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5sZW5ndGggPj0gaiAmJlxuICAgICAgICAgICAgICAgICAgICBjb21tb25QcmVmaXgoc3BsaXQsIG5leHQpID49IGogLSAxXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgYXJyYXkgaXRlbSBpcyBiZXR0ZXIgdGhhbiBhIHNoYWxsb3dlciBzdWJzdHJpbmcgb2YgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRMb2NhbGUobmFtZSkge1xuICAgICAgICB2YXIgb2xkTG9jYWxlID0gbnVsbCxcbiAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlO1xuICAgICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWdpc3RlciBhbmQgbG9hZCBhbGwgdGhlIGxvY2FsZXMgaW4gTm9kZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBtb2R1bGUgJiZcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzXG4gICAgICAgICkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvbGRMb2NhbGUgPSBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyBub3QgZm91bmQgdG8gYXZvaWQgcmVwZWF0aW5nIGV4cGVuc2l2ZSBmaWxlIHJlcXVpcmUgY2FsbCBjYXVzaW5nIGhpZ2ggQ1BVXG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gZmluZCBlbi1VUywgZW5fVVMsIGVuLXVzIGZvciBldmVyeSBmb3JtYXQgY2FsbFxuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBudWxsOyAvLyBudWxsIG1lYW5zIG5vdCBmb3VuZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUoa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGVmaW5lTG9jYWxlKGtleSwgdmFsdWVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBtb21lbnQuZHVyYXRpb24uX2xvY2FsZSA9IG1vbWVudC5fbG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgICAgICBnbG9iYWxMb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICdMb2NhbGUgJyArIGtleSArICcgbm90IGZvdW5kLiBEaWQgeW91IGZvcmdldCB0byBsb2FkIGl0PydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmluZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShcbiAgICAgICAgICAgICAgICAgICAgJ2RlZmluZUxvY2FsZU92ZXJyaWRlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbmV3IExvY2FsZShtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpKTtcblxuICAgICAgICAgICAgaWYgKGxvY2FsZUZhbWlsaWVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVMb2NhbGUoeC5uYW1lLCB4LmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNldCB0aGUgbG9jYWxlIEFGVEVSIGFsbCBjaGlsZCBsb2NhbGVzIGhhdmUgYmVlblxuICAgICAgICAgICAgLy8gY3JlYXRlZCwgc28gd2Ugd29uJ3QgZW5kIHVwIHdpdGggdGhlIGNoaWxkIGxvY2FsZSBzZXQuXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nXG4gICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlTG9jYWxlKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG5cbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwgJiYgbG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjaGlsZCBsb2NhbGUgaW4tcGxhY2UgdG8gYXZvaWQgbWVtb3J5LWxlYWtzXG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXS5zZXQobWVyZ2VDb25maWdzKGxvY2FsZXNbbmFtZV0uX2NvbmZpZywgY29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1FUkdFXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gdG1wTG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHRtcExvY2FsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZUxvY2FsZSBpcyBjYWxsZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYWJiciBzbyBpdCB3aWxsIGhhdmUgYSBuYW1lIChnZXR0ZXJzIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQgb3RoZXJ3aXNlKS5cbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgbG9jYWxlLnBhcmVudExvY2FsZSA9IGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGdldFNldEdsb2JhbExvY2FsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZShrZXkpIHtcbiAgICAgICAgdmFyIGxvY2FsZTtcblxuICAgICAgICBpZiAoa2V5ICYmIGtleS5fbG9jYWxlICYmIGtleS5fbG9jYWxlLl9hYmJyKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIC8vc2hvcnQtY2lyY3VpdCBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5ID0gW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hvb3NlTG9jYWxlKGtleSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdExvY2FsZXMoKSB7XG4gICAgICAgIHJldHVybiBrZXlzKGxvY2FsZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3cobSkge1xuICAgICAgICB2YXIgb3ZlcmZsb3csXG4gICAgICAgICAgICBhID0gbS5fYTtcblxuICAgICAgICBpZiAoYSAmJiBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPT09IC0yKSB7XG4gICAgICAgICAgICBvdmVyZmxvdyA9XG4gICAgICAgICAgICAgICAgYVtNT05USF0gPCAwIHx8IGFbTU9OVEhdID4gMTFcbiAgICAgICAgICAgICAgICAgICAgPyBNT05USFxuICAgICAgICAgICAgICAgICAgICA6IGFbREFURV0gPCAxIHx8IGFbREFURV0gPiBkYXlzSW5Nb250aChhW1lFQVJdLCBhW01PTlRIXSlcbiAgICAgICAgICAgICAgICAgICAgPyBEQVRFXG4gICAgICAgICAgICAgICAgICAgIDogYVtIT1VSXSA8IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICBhW0hPVVJdID4gMjQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoYVtIT1VSXSA9PT0gMjQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGFbTUlOVVRFXSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtTRUNPTkRdICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW01JTExJU0VDT05EXSAhPT0gMCkpXG4gICAgICAgICAgICAgICAgICAgID8gSE9VUlxuICAgICAgICAgICAgICAgICAgICA6IGFbTUlOVVRFXSA8IDAgfHwgYVtNSU5VVEVdID4gNTlcbiAgICAgICAgICAgICAgICAgICAgPyBNSU5VVEVcbiAgICAgICAgICAgICAgICAgICAgOiBhW1NFQ09ORF0gPCAwIHx8IGFbU0VDT05EXSA+IDU5XG4gICAgICAgICAgICAgICAgICAgID8gU0VDT05EXG4gICAgICAgICAgICAgICAgICAgIDogYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5XG4gICAgICAgICAgICAgICAgICAgID8gTUlMTElTRUNPTkRcbiAgICAgICAgICAgICAgICAgICAgOiAtMTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dEYXlPZlllYXIgJiZcbiAgICAgICAgICAgICAgICAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gREFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla3MgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrZGF5ICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFS0RBWTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBpc28gODYwMSByZWdleFxuICAgIC8vIDAwMDAtMDAtMDAgMDAwMC1XMDAgb3IgMDAwMC1XMDAtMCArIFQgKyAwMCBvciAwMDowMCBvciAwMDowMDowMCBvciAwMDowMDowMC4wMDAgKyArMDA6MDAgb3IgKzAwMDAgb3IgKzAwKVxuICAgIHZhciBleHRlbmRlZElzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoWystXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sXG4gICAgICAgIGJhc2ljSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkfCkpKD86KFR8ICkoXFxkXFxkKD86XFxkXFxkKD86XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvLFxuICAgICAgICB0elJlZ2V4ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vLFxuICAgICAgICBpc29EYXRlcyA9IFtcbiAgICAgICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICAgICAgWydZWVlZLU1NLUREJywgL1xcZHs0fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1ctRScsIC9cXGR7NH0tV1xcZFxcZC1cXGQvXSxcbiAgICAgICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWS1EREQnLCAvXFxkezR9LVxcZHszfS9dLFxuICAgICAgICAgICAgWydZWVlZLU1NJywgL1xcZHs0fS1cXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICAgICAgICAgIFsnWVlZWU1NREQnLCAvXFxkezh9L10sXG4gICAgICAgICAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgICAgICAgICAgWydHR0dHW1ddV1cnLCAvXFxkezR9V1xcZHsyfS8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWURERCcsIC9cXGR7N30vXSxcbiAgICAgICAgICAgIFsnWVlZWU1NJywgL1xcZHs2fS8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWScsIC9cXGR7NH0vLCBmYWxzZV0sXG4gICAgICAgIF0sXG4gICAgICAgIC8vIGlzbyB0aW1lIGZvcm1hdHMgYW5kIHJlZ2V4ZXNcbiAgICAgICAgaXNvVGltZXMgPSBbXG4gICAgICAgICAgICBbJ0hIOm1tOnNzLlNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgICAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgICAgICAgICAgWydISDptbTpzcycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISDptbScsIC9cXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgICAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgICAgIFsnSEhtbXNzLFNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkLFxcZCsvXSxcbiAgICAgICAgICAgIFsnSEhtbXNzJywgL1xcZFxcZFxcZFxcZFxcZFxcZC9dLFxuICAgICAgICAgICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgICAgICAgICAgWydISCcsIC9cXGRcXGQvXSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNwTmV0SnNvblJlZ2V4ID0gL15cXC8/RGF0ZVxcKCgtP1xcZCspL2ksXG4gICAgICAgIC8vIFJGQyAyODIyIHJlZ2V4OiBGb3IgZGV0YWlscyBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI4MjIjc2VjdGlvbi0zLjNcbiAgICAgICAgcmZjMjgyMiA9IC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksP1xccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoWystXVxcZHs0fSkpJC8sXG4gICAgICAgIG9ic09mZnNldHMgPSB7XG4gICAgICAgICAgICBVVDogMCxcbiAgICAgICAgICAgIEdNVDogMCxcbiAgICAgICAgICAgIEVEVDogLTQgKiA2MCxcbiAgICAgICAgICAgIEVTVDogLTUgKiA2MCxcbiAgICAgICAgICAgIENEVDogLTUgKiA2MCxcbiAgICAgICAgICAgIENTVDogLTYgKiA2MCxcbiAgICAgICAgICAgIE1EVDogLTYgKiA2MCxcbiAgICAgICAgICAgIE1TVDogLTcgKiA2MCxcbiAgICAgICAgICAgIFBEVDogLTcgKiA2MCxcbiAgICAgICAgICAgIFBTVDogLTggKiA2MCxcbiAgICAgICAgfTtcblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlTTyhjb25maWcpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgc3RyaW5nID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgbWF0Y2ggPSBleHRlbmRlZElzb1JlZ2V4LmV4ZWMoc3RyaW5nKSB8fCBiYXNpY0lzb1JlZ2V4LmV4ZWMoc3RyaW5nKSxcbiAgICAgICAgICAgIGFsbG93VGltZSxcbiAgICAgICAgICAgIGRhdGVGb3JtYXQsXG4gICAgICAgICAgICB0aW1lRm9ybWF0LFxuICAgICAgICAgICAgdHpGb3JtYXQ7XG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pc28gPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvRGF0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzb0RhdGVzW2ldWzFdLmV4ZWMobWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSBpc29EYXRlc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dUaW1lID0gaXNvRGF0ZXNbaV1bMl0gIT09IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNvVGltZXNbaV1bMV0uZXhlYyhtYXRjaFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzJdIHNob3VsZCBiZSAnVCcgb3Igc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVGb3JtYXQgPSAobWF0Y2hbMl0gfHwgJyAnKSArIGlzb1RpbWVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYWxsb3dUaW1lICYmIHRpbWVGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFs0XSkge1xuICAgICAgICAgICAgICAgIGlmICh0elJlZ2V4LmV4ZWMobWF0Y2hbNF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHR6Rm9ybWF0ID0gJ1onO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnLl9mID0gZGF0ZUZvcm1hdCArICh0aW1lRm9ybWF0IHx8ICcnKSArICh0ekZvcm1hdCB8fCAnJyk7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoXG4gICAgICAgIHllYXJTdHIsXG4gICAgICAgIG1vbnRoU3RyLFxuICAgICAgICBkYXlTdHIsXG4gICAgICAgIGhvdXJTdHIsXG4gICAgICAgIG1pbnV0ZVN0cixcbiAgICAgICAgc2Vjb25kU3RyXG4gICAgKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgICAgICB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSxcbiAgICAgICAgICAgIGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGRheVN0ciwgMTApLFxuICAgICAgICAgICAgcGFyc2VJbnQoaG91clN0ciwgMTApLFxuICAgICAgICAgICAgcGFyc2VJbnQobWludXRlU3RyLCAxMCksXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHNlY29uZFN0cikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQoc2Vjb25kU3RyLCAxMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSB7XG4gICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQoeWVhclN0ciwgMTApO1xuICAgICAgICBpZiAoeWVhciA8PSA0OSkge1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyB5ZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXIgPD0gOTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gMTkwMCArIHllYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAgICAgICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICAgICAgICByZXR1cm4gc1xuICAgICAgICAgICAgLnJlcGxhY2UoL1xcKFteKV0qXFwpfFtcXG5cXHRdL2csICcgJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15cXHNcXHMqLywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzXFxzKiQvLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tXZWVrZGF5KHdlZWtkYXlTdHIsIHBhcnNlZElucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlcGxhY2UgdGhlIHZhbmlsbGEgSlMgRGF0ZSBvYmplY3Qgd2l0aCBhbiBpbmRlcGVuZGVudCBkYXktb2Ytd2VlayBjaGVjay5cbiAgICAgICAgICAgIHZhciB3ZWVrZGF5UHJvdmlkZWQgPSBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpLFxuICAgICAgICAgICAgICAgIHdlZWtkYXlBY3R1YWwgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSW5wdXRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZElucHV0WzFdLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRJbnB1dFsyXVxuICAgICAgICAgICAgICAgICkuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAod2Vla2RheVByb3ZpZGVkICE9PSB3ZWVrZGF5QWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlT2Zmc2V0KG9ic09mZnNldCwgbWlsaXRhcnlPZmZzZXQsIG51bU9mZnNldCkge1xuICAgICAgICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbGl0YXJ5T2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyB0aGUgb25seSBhbGxvd2VkIG1pbGl0YXJ5IHR6IGlzIFpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGhtID0gcGFyc2VJbnQobnVtT2Zmc2V0LCAxMCksXG4gICAgICAgICAgICAgICAgbSA9IGhtICUgMTAwLFxuICAgICAgICAgICAgICAgIGggPSAoaG0gLSBtKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBoICogNjAgKyBtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBhbmQgdGltZSBmcm9tIHJlZiAyODIyIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2ggPSByZmMyODIyLmV4ZWMocHJlcHJvY2Vzc1JGQzI4MjIoY29uZmlnLl9pKSksXG4gICAgICAgICAgICBwYXJzZWRBcnJheTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBwYXJzZWRBcnJheSA9IGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoXG4gICAgICAgICAgICAgICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbN11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWNoZWNrV2Vla2RheShtYXRjaFsxXSwgcGFyc2VkQXJyYXksIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IHBhcnNlZEFycmF5O1xuICAgICAgICAgICAgY29uZmlnLl90em0gPSBjYWxjdWxhdGVPZmZzZXQobWF0Y2hbOF0sIG1hdGNoWzldLCBtYXRjaFsxMF0pO1xuXG4gICAgICAgICAgICBjb25maWcuX2QgPSBjcmVhdGVVVENEYXRlLmFwcGx5KG51bGwsIGNvbmZpZy5fYSk7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5yZmMyODIyID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIDEpIEFTUC5ORVQsIDIpIElTTywgMykgUkZDIDI4MjIgZm9ybWF0cywgb3IgNCkgb3B0aW9uYWwgZmFsbGJhY2sgaWYgcGFyc2luZyBpc24ndCBzdHJpY3RcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGNvbmZpZy5faSk7XG4gICAgICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9zdHJpY3QpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmluYWwgYXR0ZW1wdCwgdXNlIElucHV0IEZhbGxiYWNrXG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgJyArXG4gICAgICAgICAgICAnd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gUkZDMjgyMi9JU08gZGF0ZSBmb3JtYXRzIGFyZSAnICtcbiAgICAgICAgICAgICdkaXNjb3VyYWdlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIG1ham9yIHJlbGVhc2UuIFBsZWFzZSByZWZlciB0byAnICtcbiAgICAgICAgICAgICdodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2pzLWRhdGUvIGZvciBtb3JlIGluZm8uJyxcbiAgICAgICAgZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoY29uZmlnLl9pICsgKGNvbmZpZy5fdXNlVVRDID8gJyBVVEMnIDogJycpKTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBQaWNrIHRoZSBmaXJzdCBkZWZpbmVkIG9mIHR3byBvciB0aHJlZSBhcmd1bWVudHMuXG4gICAgZnVuY3Rpb24gZGVmYXVsdHMoYSwgYiwgYykge1xuICAgICAgICBpZiAoYSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZykge1xuICAgICAgICAvLyBob29rcyBpcyBhY3R1YWxseSB0aGUgZXhwb3J0ZWQgbW9tZW50IG9iamVjdFxuICAgICAgICB2YXIgbm93VmFsdWUgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIGlmIChjb25maWcuX3VzZVVUQykge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBub3dWYWx1ZS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICAgICAgICAgIG5vd1ZhbHVlLmdldFVUQ01vbnRoKCksXG4gICAgICAgICAgICAgICAgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldEZ1bGxZZWFyKCksIG5vd1ZhbHVlLmdldE1vbnRoKCksIG5vd1ZhbHVlLmdldERhdGUoKV07XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGlucHV0ID0gW10sXG4gICAgICAgICAgICBjdXJyZW50RGF0ZSxcbiAgICAgICAgICAgIGV4cGVjdGVkV2Vla2RheSxcbiAgICAgICAgICAgIHllYXJUb1VzZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKTtcblxuICAgICAgICAvL2NvbXB1dGUgZGF5IG9mIHRoZSB5ZWFyIGZyb20gd2Vla3MgYW5kIHdlZWtkYXlzXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgY29uZmlnLl9hW0RBVEVdID09IG51bGwgJiYgY29uZmlnLl9hW01PTlRIXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWYgdGhlIGRheSBvZiB0aGUgeWVhciBpcyBzZXQsIGZpZ3VyZSBvdXQgd2hhdCBpdCBpc1xuICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgeWVhclRvVXNlID0gZGVmYXVsdHMoY29uZmlnLl9hW1lFQVJdLCBjdXJyZW50RGF0ZVtZRUFSXSk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA+IGRheXNJblllYXIoeWVhclRvVXNlKSB8fFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dEYXlPZlllYXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZSh5ZWFyVG9Vc2UsIDAsIGNvbmZpZy5fZGF5T2ZZZWFyKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNT05USF0gPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgICAgICAgICBjb25maWcuX2FbREFURV0gPSBkYXRlLmdldFVUQ0RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCBkYXRlLlxuICAgICAgICAvLyAqIGlmIG5vIHllYXIsIG1vbnRoLCBkYXkgb2YgbW9udGggYXJlIGdpdmVuLCBkZWZhdWx0IHRvIHRvZGF5XG4gICAgICAgIC8vICogaWYgZGF5IG9mIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG1vbnRoIGFuZCB5ZWFyXG4gICAgICAgIC8vICogaWYgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgb25seSB5ZWFyXG4gICAgICAgIC8vICogaWYgeWVhciBpcyBnaXZlbiwgZG9uJ3QgZGVmYXVsdCBhbnl0aGluZ1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiBjb25maWcuX2FbaV0gPT0gbnVsbDsgKytpKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IGN1cnJlbnREYXRlW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWmVybyBvdXQgd2hhdGV2ZXIgd2FzIG5vdCBkZWZhdWx0ZWQsIGluY2x1ZGluZyB0aW1lXG4gICAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9XG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW2ldID09IG51bGwgPyAoaSA9PT0gMiA/IDEgOiAwKSA6IGNvbmZpZy5fYVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciAyNDowMDowMC4wMDBcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID09PSAyNCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtTRUNPTkRdID09PSAwICYmXG4gICAgICAgICAgICBjb25maWcuX2FbTUlMTElTRUNPTkRdID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uZmlnLl9uZXh0RGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcuX2QgPSAoY29uZmlnLl91c2VVVEMgPyBjcmVhdGVVVENEYXRlIDogY3JlYXRlRGF0ZSkuYXBwbHkoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgaW5wdXRcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0ZWRXZWVrZGF5ID0gY29uZmlnLl91c2VVVENcbiAgICAgICAgICAgID8gY29uZmlnLl9kLmdldFVUQ0RheSgpXG4gICAgICAgICAgICA6IGNvbmZpZy5fZC5nZXREYXkoKTtcblxuICAgICAgICAvLyBBcHBseSB0aW1lem9uZSBvZmZzZXQgZnJvbSBpbnB1dC4gVGhlIGFjdHVhbCB1dGNPZmZzZXQgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgLy8gd2l0aCBwYXJzZVpvbmUuXG4gICAgICAgIGlmIChjb25maWcuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fbmV4dERheSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMjQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBmb3IgbWlzbWF0Y2hpbmcgZGF5IG9mIHdlZWtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnLl93ICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uZmlnLl93LmQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBjb25maWcuX3cuZCAhPT0gZXhwZWN0ZWRXZWVrZGF5XG4gICAgICAgICkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpIHtcbiAgICAgICAgdmFyIHcsIHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSwgdGVtcCwgd2Vla2RheU92ZXJmbG93LCBjdXJXZWVrO1xuXG4gICAgICAgIHcgPSBjb25maWcuX3c7XG4gICAgICAgIGlmICh3LkdHICE9IG51bGwgfHwgdy5XICE9IG51bGwgfHwgdy5FICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRvdyA9IDE7XG4gICAgICAgICAgICBkb3kgPSA0O1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBXZSBuZWVkIHRvIHRha2UgdGhlIGN1cnJlbnQgaXNvV2Vla1llYXIsIGJ1dCB0aGF0IGRlcGVuZHMgb25cbiAgICAgICAgICAgIC8vIGhvdyB3ZSBpbnRlcnByZXQgbm93IChsb2NhbCwgdXRjLCBmaXhlZCBvZmZzZXQpLiBTbyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGEgbm93IHZlcnNpb24gb2YgY3VycmVudCBjb25maWcgKHRha2UgbG9jYWwvdXRjL29mZnNldCBmbGFncywgYW5kXG4gICAgICAgICAgICAvLyBjcmVhdGUgbm93KS5cbiAgICAgICAgICAgIHdlZWtZZWFyID0gZGVmYXVsdHMoXG4gICAgICAgICAgICAgICAgdy5HRyxcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbWUVBUl0sXG4gICAgICAgICAgICAgICAgd2Vla09mWWVhcihjcmVhdGVMb2NhbCgpLCAxLCA0KS55ZWFyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcuVywgMSk7XG4gICAgICAgICAgICB3ZWVrZGF5ID0gZGVmYXVsdHMody5FLCAxKTtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMSB8fCB3ZWVrZGF5ID4gNykge1xuICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb3cgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3c7XG4gICAgICAgICAgICBkb3kgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3k7XG5cbiAgICAgICAgICAgIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LmdnLCBjb25maWcuX2FbWUVBUl0sIGN1cldlZWsueWVhcik7XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCB3ZWVrLlxuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IDAgfHwgd2Vla2RheSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHcuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgd2Vla2RheSAtLSBjb3VudGluZyBzdGFydHMgZnJvbSBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmUgKyBkb3c7XG4gICAgICAgICAgICAgICAgaWYgKHcuZSA8IDAgfHwgdy5lID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlZWsgPCAxIHx8IHdlZWsgPiB3ZWVrc0luWWVhcih3ZWVrWWVhciwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla2RheU92ZXJmbG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtkYXkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gdGVtcC55ZWFyO1xuICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBJU08gc3RhbmRhcmRcbiAgICBob29rcy5JU09fODYwMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIFJGQyAyODIyIGZvcm1cbiAgICBob29rcy5SRkNfMjgyMiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyB0byBhbm90aGVyIHBhcnQgb2YgdGhlIGNyZWF0aW9uIGZsb3cgdG8gcHJldmVudCBjaXJjdWxhciBkZXBzXG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLklTT184NjAxKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuUkZDXzI4MjIpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnLl9hID0gW107XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIGFycmF5IGlzIHVzZWQgdG8gbWFrZSBhIERhdGUsIGVpdGhlciB3aXRoIGBuZXcgRGF0ZWAgb3IgYERhdGUuVVRDYFxuICAgICAgICB2YXIgc3RyaW5nID0gJycgKyBjb25maWcuX2ksXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcGFyc2VkSW5wdXQsXG4gICAgICAgICAgICB0b2tlbnMsXG4gICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIHNraXBwZWQsXG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCA9IDAsXG4gICAgICAgICAgICBlcmE7XG5cbiAgICAgICAgdG9rZW5zID1cbiAgICAgICAgICAgIGV4cGFuZEZvcm1hdChjb25maWcuX2YsIGNvbmZpZy5fbG9jYWxlKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSB8fCBbXTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgICAgICAgIHBhcnNlZElucHV0ID0gKHN0cmluZy5tYXRjaChnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpIHx8XG4gICAgICAgICAgICAgICAgW10pWzBdO1xuICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc2tpcHBlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpICsgcGFyc2VkSW5wdXQubGVuZ3RoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoICs9IHBhcnNlZElucHV0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRvbid0IHBhcnNlIGlmIGl0J3Mgbm90IGEga25vd24gdG9rZW5cbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLl9zdHJpY3QgJiYgIXBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHJlbWFpbmluZyB1bnBhcnNlZCBpbnB1dCBsZW5ndGggdG8gdGhlIHN0cmluZ1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5jaGFyc0xlZnRPdmVyID1cbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCAtIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGg7XG4gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgXzEyaCBmbGFnIGlmIGhvdXIgaXMgPD0gMTJcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdIDw9IDEyICYmXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID09PSB0cnVlICYmXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnBhcnNlZERhdGVQYXJ0cyA9IGNvbmZpZy5fYS5zbGljZSgwKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykubWVyaWRpZW0gPSBjb25maWcuX21lcmlkaWVtO1xuICAgICAgICAvLyBoYW5kbGUgbWVyaWRpZW1cbiAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gbWVyaWRpZW1GaXhXcmFwKFxuICAgICAgICAgICAgY29uZmlnLl9sb2NhbGUsXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0sXG4gICAgICAgICAgICBjb25maWcuX21lcmlkaWVtXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gaGFuZGxlIGVyYVxuICAgICAgICBlcmEgPSBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lcmE7XG4gICAgICAgIGlmIChlcmEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IGNvbmZpZy5fbG9jYWxlLmVyYXNDb252ZXJ0WWVhcihlcmEsIGNvbmZpZy5fYVtZRUFSXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgY2hlY2tPdmVyZmxvdyhjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtRml4V3JhcChsb2NhbGUsIGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgIHZhciBpc1BtO1xuXG4gICAgICAgIGlmIChtZXJpZGllbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxlLm1lcmlkaWVtSG91ciAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLm1lcmlkaWVtSG91cihob3VyLCBtZXJpZGllbSk7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWxlLmlzUE0gIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgICAgIGlzUG0gPSBsb2NhbGUuaXNQTShtZXJpZGllbSk7XG4gICAgICAgICAgICBpZiAoaXNQbSAmJiBob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyICs9IDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1BtICYmIGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlblxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBhcnJheSBvZiBmb3JtYXQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIHRlbXBDb25maWcsXG4gICAgICAgICAgICBiZXN0TW9tZW50LFxuICAgICAgICAgICAgc2NvcmVUb0JlYXQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgY3VycmVudFNjb3JlLFxuICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZCxcbiAgICAgICAgICAgIGJlc3RGb3JtYXRJc1ZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWcuX2YubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSA9IDA7XG4gICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICB0ZW1wQ29uZmlnID0gY29weUNvbmZpZyh7fSwgY29uZmlnKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuX3VzZVVUQyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVtcENvbmZpZy5fdXNlVVRDID0gY29uZmlnLl91c2VVVEM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZW1wQ29uZmlnLl9mID0gY29uZmlnLl9mW2ldO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKGlzVmFsaWQodGVtcENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWQgYWRkIGEgcGVuYWx0eSBmb3IgdGhhdCBmb3JtYXRcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykudW51c2VkVG9rZW5zLmxlbmd0aCAqIDEwO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuc2NvcmUgPSBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgICAgIGlmICghYmVzdEZvcm1hdElzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQgfHxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEZvcm1hdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0SXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tT2JqZWN0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGNvbmZpZy5faSksXG4gICAgICAgICAgICBkYXlPckRhdGUgPSBpLmRheSA9PT0gdW5kZWZpbmVkID8gaS5kYXRlIDogaS5kYXk7XG4gICAgICAgIGNvbmZpZy5fYSA9IG1hcChcbiAgICAgICAgICAgIFtpLnllYXIsIGkubW9udGgsIGRheU9yRGF0ZSwgaS5ob3VyLCBpLm1pbnV0ZSwgaS5zZWNvbmQsIGkubWlsbGlzZWNvbmRdLFxuICAgICAgICAgICAgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRnJvbUNvbmZpZyhjb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhwcmVwYXJlQ29uZmlnKGNvbmZpZykpKTtcbiAgICAgICAgaWYgKHJlcy5fbmV4dERheSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGlzIHNtYXJ0IGVub3VnaCBhcm91bmQgRFNUXG4gICAgICAgICAgICByZXMuYWRkKDEsICdkJyk7XG4gICAgICAgICAgICByZXMuX25leHREYXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVDb25maWcoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcblxuICAgICAgICBjb25maWcuX2xvY2FsZSA9IGNvbmZpZy5fbG9jYWxlIHx8IGdldExvY2FsZShjb25maWcuX2wpO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCAoZm9ybWF0ID09PSB1bmRlZmluZWQgJiYgaW5wdXQgPT09ICcnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoeyBudWxsSW5wdXQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnLl9pID0gaW5wdXQgPSBjb25maWcuX2xvY2FsZS5wcmVwYXJzZShpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNb21lbnQoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vbWVudChjaGVja092ZXJmbG93KGlucHV0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gaW5wdXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShmb3JtYXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQudmFsdWVPZigpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nKGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGlzVVRDKSB7XG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gdHJ1ZSB8fCBmb3JtYXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBmb3JtYXQ7XG4gICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9jYWxlID09PSB0cnVlIHx8IGxvY2FsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxvY2FsZTtcbiAgICAgICAgICAgIGxvY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChpc09iamVjdChpbnB1dCkgJiYgaXNPYmplY3RFbXB0eShpbnB1dCkpIHx8XG4gICAgICAgICAgICAoaXNBcnJheShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID09PSAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgICAgICBjLl9pc0FNb21lbnRPYmplY3QgPSB0cnVlO1xuICAgICAgICBjLl91c2VVVEMgPSBjLl9pc1VUQyA9IGlzVVRDO1xuICAgICAgICBjLl9sID0gbG9jYWxlO1xuICAgICAgICBjLl9pID0gaW5wdXQ7XG4gICAgICAgIGMuX2YgPSBmb3JtYXQ7XG4gICAgICAgIGMuX3N0cmljdCA9IHN0cmljdDtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRnJvbUNvbmZpZyhjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBwcm90b3R5cGVNaW4gPSBkZXByZWNhdGUoXG4gICAgICAgICAgICAnbW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBwcm90b3R5cGVNYXggPSBkZXByZWNhdGUoXG4gICAgICAgICAgICAnbW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPiB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgLy8gUGljayBhIG1vbWVudCBtIGZyb20gbW9tZW50cyBzbyB0aGF0IG1bZm5dKG90aGVyKSBpcyB0cnVlIGZvciBhbGxcbiAgICAvLyBvdGhlci4gVGhpcyByZWxpZXMgb24gdGhlIGZ1bmN0aW9uIGZuIHRvIGJlIHRyYW5zaXRpdmUuXG4gICAgLy9cbiAgICAvLyBtb21lbnRzIHNob3VsZCBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMgb3IgYW4gYXJyYXksIHdob3NlXG4gICAgLy8gZmlyc3QgZWxlbWVudCBpcyBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cy5cbiAgICBmdW5jdGlvbiBwaWNrQnkoZm4sIG1vbWVudHMpIHtcbiAgICAgICAgdmFyIHJlcywgaTtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkobW9tZW50c1swXSkpIHtcbiAgICAgICAgICAgIG1vbWVudHMgPSBtb21lbnRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcyA9IG1vbWVudHNbMF07XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtb21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudHNbaV0uaXNWYWxpZCgpIHx8IG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBtb21lbnRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIFtdLnNvcnQgaW5zdGVhZD9cbiAgICBmdW5jdGlvbiBtaW4oKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQmVmb3JlJywgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF4KCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0FmdGVyJywgYXJncyk7XG4gICAgfVxuXG4gICAgdmFyIG5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93ID8gRGF0ZS5ub3coKSA6ICtuZXcgRGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgb3JkZXJpbmcgPSBbXG4gICAgICAgICd5ZWFyJyxcbiAgICAgICAgJ3F1YXJ0ZXInLFxuICAgICAgICAnbW9udGgnLFxuICAgICAgICAnd2VlaycsXG4gICAgICAgICdkYXknLFxuICAgICAgICAnaG91cicsXG4gICAgICAgICdtaW51dGUnLFxuICAgICAgICAnc2Vjb25kJyxcbiAgICAgICAgJ21pbGxpc2Vjb25kJyxcbiAgICBdO1xuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvblZhbGlkKG0pIHtcbiAgICAgICAgdmFyIGtleSxcbiAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gZmFsc2UsXG4gICAgICAgICAgICBpO1xuICAgICAgICBmb3IgKGtleSBpbiBtKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcChtLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhPZi5jYWxsKG9yZGVyaW5nLCBrZXkpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAobVtrZXldID09IG51bGwgfHwgIWlzTmFOKG1ba2V5XSkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAobVtvcmRlcmluZ1tpXV0pIHtcbiAgICAgICAgICAgICAgICBpZiAodW5pdEhhc0RlY2ltYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBvbmx5IGFsbG93IG5vbi1pbnRlZ2VycyBmb3Igc21hbGxlc3QgdW5pdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtW29yZGVyaW5nW2ldXSkgIT09IHRvSW50KG1bb3JkZXJpbmdbaV1dKSkge1xuICAgICAgICAgICAgICAgICAgICB1bml0SGFzRGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihOYU4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIER1cmF0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhkdXJhdGlvbiksXG4gICAgICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgICAgICBxdWFydGVycyA9IG5vcm1hbGl6ZWRJbnB1dC5xdWFydGVyIHx8IDAsXG4gICAgICAgICAgICBtb250aHMgPSBub3JtYWxpemVkSW5wdXQubW9udGggfHwgMCxcbiAgICAgICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgbm9ybWFsaXplZElucHV0Lmlzb1dlZWsgfHwgMCxcbiAgICAgICAgICAgIGRheXMgPSBub3JtYWxpemVkSW5wdXQuZGF5IHx8IDAsXG4gICAgICAgICAgICBob3VycyA9IG5vcm1hbGl6ZWRJbnB1dC5ob3VyIHx8IDAsXG4gICAgICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQgfHwgMCxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5taWxsaXNlY29uZCB8fCAwO1xuXG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBpc0R1cmF0aW9uVmFsaWQobm9ybWFsaXplZElucHV0KTtcblxuICAgICAgICAvLyByZXByZXNlbnRhdGlvbiBmb3IgZGF0ZUFkZFJlbW92ZVxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPVxuICAgICAgICAgICAgK21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICBzZWNvbmRzICogMWUzICsgLy8gMTAwMFxuICAgICAgICAgICAgbWludXRlcyAqIDZlNCArIC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgaG91cnMgKiAxMDAwICogNjAgKiA2MDsgLy91c2luZyAxMDAwICogNjAgKiA2MCBpbnN0ZWFkIG9mIDM2ZTUgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yOTc4XG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgZGF0ZUFkZFJlbW92ZSB0cmVhdHMgMjQgaG91cnMgYXMgZGlmZmVyZW50IGZyb20gYVxuICAgICAgICAvLyBkYXkgd2hlbiB3b3JraW5nIGFyb3VuZCBEU1QsIHdlIG5lZWQgdG8gc3RvcmUgdGhlbSBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuX2RheXMgPSArZGF5cyArIHdlZWtzICogNztcbiAgICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgbW9udGhzIGludG8gZGF5cyB3aXRob3V0IGtub3dpbmdcbiAgICAgICAgLy8gd2hpY2ggbW9udGhzIHlvdSBhcmUgYXJlIHRhbGtpbmcgYWJvdXQsIHNvIHdlIGhhdmUgdG8gc3RvcmVcbiAgICAgICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fbW9udGhzID0gK21vbnRocyArIHF1YXJ0ZXJzICogMyArIHllYXJzICogMTI7XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IGdldExvY2FsZSgpO1xuXG4gICAgICAgIHRoaXMuX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNSb3VuZChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKC0xICogbnVtYmVyKSAqIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbXBhcmUgdHdvIGFycmF5cywgcmV0dXJuIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXNcbiAgICBmdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycmF5MSwgYXJyYXkyLCBkb250Q29udmVydCkge1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBsZW5ndGhEaWZmID0gTWF0aC5hYnMoYXJyYXkxLmxlbmd0aCAtIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgZGlmZnMgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGRvbnRDb252ZXJ0ICYmIGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB8fFxuICAgICAgICAgICAgICAgICghZG9udENvbnZlcnQgJiYgdG9JbnQoYXJyYXkxW2ldKSAhPT0gdG9JbnQoYXJyYXkyW2ldKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRpZmZzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpZmZzICsgbGVuZ3RoRGlmZjtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBvZmZzZXQodG9rZW4sIHNlcGFyYXRvcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudXRjT2Zmc2V0KCksXG4gICAgICAgICAgICAgICAgc2lnbiA9ICcrJztcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDtcbiAgICAgICAgICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBzaWduICtcbiAgICAgICAgICAgICAgICB6ZXJvRmlsbCh+fihvZmZzZXQgLyA2MCksIDIpICtcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IgK1xuICAgICAgICAgICAgICAgIHplcm9GaWxsKH5+b2Zmc2V0ICUgNjAsIDIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvZmZzZXQoJ1onLCAnOicpO1xuICAgIG9mZnNldCgnWlonLCAnJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdaJywgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUmVnZXhUb2tlbignWlonLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnWicsICdaWiddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgICAgICBjb25maWcuX3R6bSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gdGltZXpvbmUgY2h1bmtlclxuICAgIC8vICcrMTA6MDAnID4gWycxMCcsICAnMDAnXVxuICAgIC8vICctMTUzMCcgID4gWyctMTUnLCAnMzAnXVxuICAgIHZhciBjaHVua09mZnNldCA9IC8oW1xcK1xcLV18XFxkXFxkKS9naTtcblxuICAgIGZ1bmN0aW9uIG9mZnNldEZyb21TdHJpbmcobWF0Y2hlciwgc3RyaW5nKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gKHN0cmluZyB8fCAnJykubWF0Y2gobWF0Y2hlciksXG4gICAgICAgICAgICBjaHVuayxcbiAgICAgICAgICAgIHBhcnRzLFxuICAgICAgICAgICAgbWludXRlcztcblxuICAgICAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjaHVuayA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXSB8fCBbXTtcbiAgICAgICAgcGFydHMgPSAoY2h1bmsgKyAnJykubWF0Y2goY2h1bmtPZmZzZXQpIHx8IFsnLScsIDAsIDBdO1xuICAgICAgICBtaW51dGVzID0gKyhwYXJ0c1sxXSAqIDYwKSArIHRvSW50KHBhcnRzWzJdKTtcblxuICAgICAgICByZXR1cm4gbWludXRlcyA9PT0gMCA/IDAgOiBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhIG1vbWVudCBmcm9tIGlucHV0LCB0aGF0IGlzIGxvY2FsL3V0Yy96b25lIGVxdWl2YWxlbnQgdG8gbW9kZWwuXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCBtb2RlbCkge1xuICAgICAgICB2YXIgcmVzLCBkaWZmO1xuICAgICAgICBpZiAobW9kZWwuX2lzVVRDKSB7XG4gICAgICAgICAgICByZXMgPSBtb2RlbC5jbG9uZSgpO1xuICAgICAgICAgICAgZGlmZiA9XG4gICAgICAgICAgICAgICAgKGlzTW9tZW50KGlucHV0KSB8fCBpc0RhdGUoaW5wdXQpXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgICAgIDogY3JlYXRlTG9jYWwoaW5wdXQpLnZhbHVlT2YoKSkgLSByZXMudmFsdWVPZigpO1xuICAgICAgICAgICAgLy8gVXNlIGxvdy1sZXZlbCBhcGksIGJlY2F1c2UgdGhpcyBmbiBpcyBsb3ctbGV2ZWwgYXBpLlxuICAgICAgICAgICAgcmVzLl9kLnNldFRpbWUocmVzLl9kLnZhbHVlT2YoKSArIGRpZmYpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHJlcywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCkubG9jYWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERhdGVPZmZzZXQobSkge1xuICAgICAgICAvLyBPbiBGaXJlZm94LjI0IERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9wdWxsLzE4NzFcbiAgICAgICAgcmV0dXJuIC1NYXRoLnJvdW5kKG0uX2QuZ2V0VGltZXpvbmVPZmZzZXQoKSk7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBtb21lbnQgaXMgbXV0YXRlZC5cbiAgICAvLyBJdCBpcyBpbnRlbmRlZCB0byBrZWVwIHRoZSBvZmZzZXQgaW4gc3luYyB3aXRoIHRoZSB0aW1lem9uZS5cbiAgICBob29rcy51cGRhdGVPZmZzZXQgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIC8vIGtlZXBMb2NhbFRpbWUgPSB0cnVlIG1lYW5zIG9ubHkgY2hhbmdlIHRoZSB0aW1lem9uZSwgd2l0aG91dFxuICAgIC8vIGFmZmVjdGluZyB0aGUgbG9jYWwgaG91ci4gU28gNTozMToyNiArMDMwMCAtLVt1dGNPZmZzZXQoMiwgdHJ1ZSldLS0+XG4gICAgLy8gNTozMToyNiArMDIwMCBJdCBpcyBwb3NzaWJsZSB0aGF0IDU6MzE6MjYgZG9lc24ndCBleGlzdCB3aXRoIG9mZnNldFxuICAgIC8vICswMjAwLCBzbyB3ZSBhZGp1c3QgdGhlIHRpbWUgYXMgbmVlZGVkLCB0byBiZSB2YWxpZC5cbiAgICAvL1xuICAgIC8vIEtlZXBpbmcgdGhlIHRpbWUgYWN0dWFsbHkgYWRkcy9zdWJ0cmFjdHMgKG9uZSBob3VyKVxuICAgIC8vIGZyb20gdGhlIGFjdHVhbCByZXByZXNlbnRlZCB0aW1lLiBUaGF0IGlzIHdoeSB3ZSBjYWxsIHVwZGF0ZU9mZnNldFxuICAgIC8vIGEgc2Vjb25kIHRpbWUuIEluIGNhc2UgaXQgd2FudHMgdXMgdG8gY2hhbmdlIHRoZSBvZmZzZXQgYWdhaW5cbiAgICAvLyBfY2hhbmdlSW5Qcm9ncmVzcyA9PSB0cnVlIGNhc2UsIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QsIGJlY2F1c2VcbiAgICAvLyB0aGVyZSBpcyBubyBzdWNoIHRpbWUgaW4gdGhlIGdpdmVuIHRpbWV6b25lLlxuICAgIGZ1bmN0aW9uIGdldFNldE9mZnNldChpbnB1dCwga2VlcExvY2FsVGltZSwga2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldCB8fCAwLFxuICAgICAgICAgICAgbG9jYWxBZGp1c3Q7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGlucHV0KSA8IDE2ICYmICFrZWVwTWludXRlcykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgKiA2MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5faXNVVEMgJiYga2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIGxvY2FsQWRqdXN0ID0gZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IGlucHV0O1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGxvY2FsQWRqdXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChsb2NhbEFkanVzdCwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvZmZzZXQgIT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZWVwTG9jYWxUaW1lIHx8IHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU3VidHJhY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRHVyYXRpb24oaW5wdXQgLSBvZmZzZXQsICdtJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFpvbmUoaW5wdXQsIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSAtaW5wdXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLXRoaXMudXRjT2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1VUQyhrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb0xvY2FsKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzVVRDKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJ0cmFjdChnZXREYXRlT2Zmc2V0KHRoaXMpLCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0KCkge1xuICAgICAgICBpZiAodGhpcy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9pID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHRab25lID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaE9mZnNldCwgdGhpcy5faSk7XG4gICAgICAgICAgICBpZiAodFpvbmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRab25lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzQWxpZ25lZEhvdXJPZmZzZXQoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gaW5wdXQgPyBjcmVhdGVMb2NhbChpbnB1dCkudXRjT2Zmc2V0KCkgOiAwO1xuXG4gICAgICAgIHJldHVybiAodGhpcy51dGNPZmZzZXQoKSAtIGlucHV0KSAlIDYwID09PSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCgwKS51dGNPZmZzZXQoKSB8fFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCg1KS51dGNPZmZzZXQoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCgpIHtcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9pc0RTVFNoaWZ0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGMgPSB7fSxcbiAgICAgICAgICAgIG90aGVyO1xuXG4gICAgICAgIGNvcHlDb25maWcoYywgdGhpcyk7XG4gICAgICAgIGMgPSBwcmVwYXJlQ29uZmlnKGMpO1xuXG4gICAgICAgIGlmIChjLl9hKSB7XG4gICAgICAgICAgICBvdGhlciA9IGMuX2lzVVRDID8gY3JlYXRlVVRDKGMuX2EpIDogY3JlYXRlTG9jYWwoYy5fYSk7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPVxuICAgICAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmIGNvbXBhcmVBcnJheXMoYy5fYSwgb3RoZXIudG9BcnJheSgpKSA+IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gIXRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGNPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDICYmIHRoaXMuX29mZnNldCA9PT0gMCA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxuICAgIHZhciBhc3BOZXRSZWdleCA9IC9eKC18XFwrKT8oPzooXFxkKilbLiBdKT8oXFxkKyk6KFxcZCspKD86OihcXGQrKShcXC5cXGQqKT8pPyQvLFxuICAgICAgICAvLyBmcm9tIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvY2xvc3VyZV9nb29nX2RhdGVfZGF0ZS5qcy5zb3VyY2UuaHRtbFxuICAgICAgICAvLyBzb21ld2hhdCBtb3JlIGluIGxpbmUgd2l0aCA0LjQuMy4yIDIwMDQgc3BlYywgYnV0IGFsbG93cyBkZWNpbWFsIGFueXdoZXJlXG4gICAgICAgIC8vIGFuZCBmdXJ0aGVyIG1vZGlmaWVkIHRvIGFsbG93IGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgYm90aCB3ZWVrIGFuZCBkYXlcbiAgICAgICAgaXNvUmVnZXggPSAvXigtfFxcKyk/UCg/OihbLStdP1swLTksLl0qKVkpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVcpPyg/OihbLStdP1swLTksLl0qKUQpPyg/OlQoPzooWy0rXT9bMC05LC5dKilIKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilTKT8pPyQvO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24oaW5wdXQsIGtleSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgICAgIC8vIG1hdGNoaW5nIGFnYWluc3QgcmVnZXhwIGlzIGV4cGVuc2l2ZSwgZG8gaXQgb24gZGVtYW5kXG4gICAgICAgICAgICBtYXRjaCA9IG51bGwsXG4gICAgICAgICAgICBzaWduLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgZGlmZlJlcztcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG1zOiBpbnB1dC5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgICAgIGQ6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgICAgIE06IGlucHV0Ll9tb250aHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSB8fCAhaXNOYU4oK2lucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gK2lucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSAraW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gbWF0Y2hbMV0gPT09ICctJyA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgZDogdG9JbnQobWF0Y2hbREFURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBoOiB0b0ludChtYXRjaFtIT1VSXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIG06IHRvSW50KG1hdGNoW01JTlVURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBzOiB0b0ludChtYXRjaFtTRUNPTkRdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXM6IHRvSW50KGFic1JvdW5kKG1hdGNoW01JTExJU0VDT05EXSAqIDEwMDApKSAqIHNpZ24sIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICgobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSBtYXRjaFsxXSA9PT0gJy0nID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeTogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE06IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgICAgICB3OiBwYXJzZUlzbyhtYXRjaFs0XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgZDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGg6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBtOiBwYXJzZUlzbyhtYXRjaFs3XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgczogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpZmZSZXMgPSBtb21lbnRzRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi5mcm9tKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi50bylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgZHVyYXRpb24uTSA9IGRpZmZSZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19sb2NhbGUnKSkge1xuICAgICAgICAgICAgcmV0Ll9sb2NhbGUgPSBpbnB1dC5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfaXNWYWxpZCcpKSB7XG4gICAgICAgICAgICByZXQuX2lzVmFsaWQgPSBpbnB1dC5faXNWYWxpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvKGlucCwgc2lnbikge1xuICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAvLyBjb252ZXJ0cyBmbG9hdHMgdG8gaW50cy5cbiAgICAgICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxuICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgLy8gYXBwbHkgc2lnbiB3aGlsZSB3ZSdyZSBhdCBpdFxuICAgICAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzID0ge307XG5cbiAgICAgICAgcmVzLm1vbnRocyA9XG4gICAgICAgICAgICBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICsgKG90aGVyLnllYXIoKSAtIGJhc2UueWVhcigpKSAqIDEyO1xuICAgICAgICBpZiAoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpLmlzQWZ0ZXIob3RoZXIpKSB7XG4gICAgICAgICAgICAtLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gK290aGVyIC0gK2Jhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlciA9IGNsb25lV2l0aE9mZnNldChvdGhlciwgYmFzZSk7XG4gICAgICAgIGlmIChiYXNlLmlzQmVmb3JlKG90aGVyKSkge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKG90aGVyLCBiYXNlKTtcbiAgICAgICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSAtcmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJlcy5tb250aHMgPSAtcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlICduYW1lJyBhcmcgYWZ0ZXIgZGVwcmVjYXRpb24gaXMgcmVtb3ZlZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFkZGVyKGRpcmVjdGlvbiwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgZHVyLCB0bXA7XG4gICAgICAgICAgICAvL2ludmVydCB0aGUgYXJndW1lbnRzLCBidXQgY29tcGxhaW4gYWJvdXQgaXRcbiAgICAgICAgICAgIGlmIChwZXJpb2QgIT09IG51bGwgJiYgIWlzTmFOKCtwZXJpb2QpKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAnbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcobnVtYmVyLCBwZXJpb2QpLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9hZGQtaW52ZXJ0ZWQtcGFyYW0vIGZvciBtb3JlIGluZm8uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdG1wID0gdmFsO1xuICAgICAgICAgICAgICAgIHZhbCA9IHBlcmlvZDtcbiAgICAgICAgICAgICAgICBwZXJpb2QgPSB0bXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGR1ciA9IGNyZWF0ZUR1cmF0aW9uKHZhbCwgcGVyaW9kKTtcbiAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGR1ciwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0KG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCB1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gYWJzUm91bmQoZHVyYXRpb24uX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzUm91bmQoZHVyYXRpb24uX21vbnRocyk7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0ID09IG51bGwgPyB0cnVlIDogdXBkYXRlT2Zmc2V0O1xuXG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG1vbSwgZ2V0KG1vbSwgJ01vbnRoJykgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIHNldCQxKG1vbSwgJ0RhdGUnLCBnZXQobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhZGQgPSBjcmVhdGVBZGRlcigxLCAnYWRkJyksXG4gICAgICAgIHN1YnRyYWN0ID0gY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpO1xuXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gdHlwZSBNb21lbnRJbnB1dCA9IE1vbWVudCB8IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgTW9tZW50SW5wdXRPYmplY3QgfCB2b2lkOyAvLyBudWxsIHwgdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dChpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNNb21lbnQoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc0RhdGUoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc1N0cmluZyhpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzTnVtYmVyKGlucHV0KSB8fFxuICAgICAgICAgICAgaXNOdW1iZXJPclN0cmluZ0FycmF5KGlucHV0KSB8fFxuICAgICAgICAgICAgaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkgfHxcbiAgICAgICAgICAgIGlucHV0ID09PSBudWxsIHx8XG4gICAgICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkge1xuICAgICAgICB2YXIgb2JqZWN0VGVzdCA9IGlzT2JqZWN0KGlucHV0KSAmJiAhaXNPYmplY3RFbXB0eShpbnB1dCksXG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAgICAgJ3llYXJzJyxcbiAgICAgICAgICAgICAgICAneWVhcicsXG4gICAgICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgICAgICdtb250aHMnLFxuICAgICAgICAgICAgICAgICdtb250aCcsXG4gICAgICAgICAgICAgICAgJ00nLFxuICAgICAgICAgICAgICAgICdkYXlzJyxcbiAgICAgICAgICAgICAgICAnZGF5JyxcbiAgICAgICAgICAgICAgICAnZCcsXG4gICAgICAgICAgICAgICAgJ2RhdGVzJyxcbiAgICAgICAgICAgICAgICAnZGF0ZScsXG4gICAgICAgICAgICAgICAgJ0QnLFxuICAgICAgICAgICAgICAgICdob3VycycsXG4gICAgICAgICAgICAgICAgJ2hvdXInLFxuICAgICAgICAgICAgICAgICdoJyxcbiAgICAgICAgICAgICAgICAnbWludXRlcycsXG4gICAgICAgICAgICAgICAgJ21pbnV0ZScsXG4gICAgICAgICAgICAgICAgJ20nLFxuICAgICAgICAgICAgICAgICdzZWNvbmRzJyxcbiAgICAgICAgICAgICAgICAnc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAncycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kcycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAnbXMnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwcm9wZXJ0eTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gcHJvcGVydHlUZXN0IHx8IGhhc093blByb3AoaW5wdXQsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYmplY3RUZXN0ICYmIHByb3BlcnR5VGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlck9yU3RyaW5nQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgdmFyIGFycmF5VGVzdCA9IGlzQXJyYXkoaW5wdXQpLFxuICAgICAgICAgICAgZGF0YVR5cGVUZXN0ID0gZmFsc2U7XG4gICAgICAgIGlmIChhcnJheVRlc3QpIHtcbiAgICAgICAgICAgIGRhdGFUeXBlVGVzdCA9XG4gICAgICAgICAgICAgICAgaW5wdXQuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNOdW1iZXIoaXRlbSkgJiYgaXNTdHJpbmcoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH0pLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXlUZXN0ICYmIGRhdGFUeXBlVGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0NhbGVuZGFyU3BlYyhpbnB1dCkge1xuICAgICAgICB2YXIgb2JqZWN0VGVzdCA9IGlzT2JqZWN0KGlucHV0KSAmJiAhaXNPYmplY3RFbXB0eShpbnB1dCksXG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAgICAgJ3NhbWVEYXknLFxuICAgICAgICAgICAgICAgICduZXh0RGF5JyxcbiAgICAgICAgICAgICAgICAnbGFzdERheScsXG4gICAgICAgICAgICAgICAgJ25leHRXZWVrJyxcbiAgICAgICAgICAgICAgICAnbGFzdFdlZWsnLFxuICAgICAgICAgICAgICAgICdzYW1lRWxzZScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHByb3BlcnR5O1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBwcm9wZXJ0eVRlc3QgfHwgaGFzT3duUHJvcChpbnB1dCwgcHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iamVjdFRlc3QgJiYgcHJvcGVydHlUZXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENhbGVuZGFyRm9ybWF0KG15TW9tZW50LCBub3cpIHtcbiAgICAgICAgdmFyIGRpZmYgPSBteU1vbWVudC5kaWZmKG5vdywgJ2RheXMnLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGRpZmYgPCAtNlxuICAgICAgICAgICAgPyAnc2FtZUVsc2UnXG4gICAgICAgICAgICA6IGRpZmYgPCAtMVxuICAgICAgICAgICAgPyAnbGFzdFdlZWsnXG4gICAgICAgICAgICA6IGRpZmYgPCAwXG4gICAgICAgICAgICA/ICdsYXN0RGF5J1xuICAgICAgICAgICAgOiBkaWZmIDwgMVxuICAgICAgICAgICAgPyAnc2FtZURheSdcbiAgICAgICAgICAgIDogZGlmZiA8IDJcbiAgICAgICAgICAgID8gJ25leHREYXknXG4gICAgICAgICAgICA6IGRpZmYgPCA3XG4gICAgICAgICAgICA/ICduZXh0V2VlaydcbiAgICAgICAgICAgIDogJ3NhbWVFbHNlJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciQxKHRpbWUsIGZvcm1hdHMpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBmb3Igc2luZ2xlIHBhcmFtZXRlciwgZm9ybWF0cyBvbmx5IG92ZXJsb2FkIHRvIHRoZSBjYWxlbmRhciBmdW5jdGlvblxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKCFhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTW9tZW50SW5wdXQoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgICAgIHRpbWUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAgICAgZm9ybWF0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDYWxlbmRhclNwZWMoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAgICAgdGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAvLyBHZXR0aW5nIHN0YXJ0LW9mLXRvZGF5IGRlcGVuZHMgb24gd2hldGhlciB3ZSdyZSBsb2NhbC91dGMvb2Zmc2V0IG9yIG5vdC5cbiAgICAgICAgdmFyIG5vdyA9IHRpbWUgfHwgY3JlYXRlTG9jYWwoKSxcbiAgICAgICAgICAgIHNvZCA9IGNsb25lV2l0aE9mZnNldChub3csIHRoaXMpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgZm9ybWF0ID0gaG9va3MuY2FsZW5kYXJGb3JtYXQodGhpcywgc29kKSB8fCAnc2FtZUVsc2UnLFxuICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBmb3JtYXRzICYmXG4gICAgICAgICAgICAgICAgKGlzRnVuY3Rpb24oZm9ybWF0c1tmb3JtYXRdKVxuICAgICAgICAgICAgICAgICAgICA/IGZvcm1hdHNbZm9ybWF0XS5jYWxsKHRoaXMsIG5vdylcbiAgICAgICAgICAgICAgICAgICAgOiBmb3JtYXRzW2Zvcm1hdF0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChcbiAgICAgICAgICAgIG91dHB1dCB8fCB0aGlzLmxvY2FsZURhdGEoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMsIGNyZWF0ZUxvY2FsKG5vdykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50KHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQWZ0ZXIoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID4gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxJbnB1dC52YWx1ZU9mKCkgPCB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZWZvcmUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmV0d2Vlbihmcm9tLCB0bywgdW5pdHMsIGluY2x1c2l2aXR5KSB7XG4gICAgICAgIHZhciBsb2NhbEZyb20gPSBpc01vbWVudChmcm9tKSA/IGZyb20gOiBjcmVhdGVMb2NhbChmcm9tKSxcbiAgICAgICAgICAgIGxvY2FsVG8gPSBpc01vbWVudCh0bykgPyB0byA6IGNyZWF0ZUxvY2FsKHRvKTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxGcm9tLmlzVmFsaWQoKSAmJiBsb2NhbFRvLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpbmNsdXNpdml0eSA9IGluY2x1c2l2aXR5IHx8ICcoKSc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoaW5jbHVzaXZpdHlbMF0gPT09ICcoJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5pc0FmdGVyKGxvY2FsRnJvbSwgdW5pdHMpXG4gICAgICAgICAgICAgICAgOiAhdGhpcy5pc0JlZm9yZShsb2NhbEZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknXG4gICAgICAgICAgICAgICAgPyB0aGlzLmlzQmVmb3JlKGxvY2FsVG8sIHVuaXRzKVxuICAgICAgICAgICAgICAgIDogIXRoaXMuaXNBZnRlcihsb2NhbFRvLCB1bml0cykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpLFxuICAgICAgICAgICAgaW5wdXRNcztcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXRNcyA9IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpIDw9IGlucHV0TXMgJiZcbiAgICAgICAgICAgICAgICBpbnB1dE1zIDw9IHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JBZnRlcihpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0FmdGVyKGlucHV0LCB1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JCZWZvcmUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmKGlucHV0LCB1bml0cywgYXNGbG9hdCkge1xuICAgICAgICB2YXIgdGhhdCwgem9uZURlbHRhLCBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDEyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAxZTM7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDBcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0ICogNywgbmVnYXRlIGRzdFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzIC0gdGhhdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhc0Zsb2F0ID8gb3V0cHV0IDogYWJzRmxvb3Iob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aERpZmYoYSwgYikge1xuICAgICAgICBpZiAoYS5kYXRlKCkgPCBiLmRhdGUoKSkge1xuICAgICAgICAgICAgLy8gZW5kLW9mLW1vbnRoIGNhbGN1bGF0aW9ucyB3b3JrIGNvcnJlY3Qgd2hlbiB0aGUgc3RhcnQgbW9udGggaGFzIG1vcmVcbiAgICAgICAgICAgIC8vIGRheXMgdGhhbiB0aGUgZW5kIG1vbnRoLlxuICAgICAgICAgICAgcmV0dXJuIC1tb250aERpZmYoYiwgYSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlmZmVyZW5jZSBpbiBtb250aHNcbiAgICAgICAgdmFyIHdob2xlTW9udGhEaWZmID0gKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIgKyAoYi5tb250aCgpIC0gYS5tb250aCgpKSxcbiAgICAgICAgICAgIC8vIGIgaXMgaW4gKGFuY2hvciAtIDEgbW9udGgsIGFuY2hvciArIDEgbW9udGgpXG4gICAgICAgICAgICBhbmNob3IgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmLCAnbW9udGhzJyksXG4gICAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgICAgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKCdlbicpLmZvcm1hdCgnZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlonKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyhrZWVwT2Zmc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1dGMgPSBrZWVwT2Zmc2V0ICE9PSB0cnVlLFxuICAgICAgICAgICAgbSA9IHV0YyA/IHRoaXMuY2xvbmUoKS51dGMoKSA6IHRoaXM7XG4gICAgICAgIGlmIChtLnllYXIoKSA8IDAgfHwgbS55ZWFyKCkgPiA5OTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KFxuICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgdXRjXG4gICAgICAgICAgICAgICAgICAgID8gJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXSdcbiAgICAgICAgICAgICAgICAgICAgOiAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApXG4gICAgICAgICAgICAgICAgICAgIC50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdaJywgZm9ybWF0TW9tZW50KG0sICdaJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQoXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgdXRjID8gJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ21vbWVudC5pbnZhbGlkKC8qICcgKyB0aGlzLl9pICsgJyAqLyknO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jID0gJ21vbWVudCcsXG4gICAgICAgICAgICB6b25lID0gJycsXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICB5ZWFyLFxuICAgICAgICAgICAgZGF0ZXRpbWUsXG4gICAgICAgICAgICBzdWZmaXg7XG4gICAgICAgIGlmICghdGhpcy5pc0xvY2FsKCkpIHtcbiAgICAgICAgICAgIGZ1bmMgPSB0aGlzLnV0Y09mZnNldCgpID09PSAwID8gJ21vbWVudC51dGMnIDogJ21vbWVudC5wYXJzZVpvbmUnO1xuICAgICAgICAgICAgem9uZSA9ICdaJztcbiAgICAgICAgfVxuICAgICAgICBwcmVmaXggPSAnWycgKyBmdW5jICsgJyhcIl0nO1xuICAgICAgICB5ZWFyID0gMCA8PSB0aGlzLnllYXIoKSAmJiB0aGlzLnllYXIoKSA8PSA5OTk5ID8gJ1lZWVknIDogJ1lZWVlZWSc7XG4gICAgICAgIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHN1ZmZpeCA9IHpvbmUgKyAnW1wiKV0nO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChwcmVmaXggKyB5ZWFyICsgZGF0ZXRpbWUgKyBzdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdChpbnB1dFN0cmluZykge1xuICAgICAgICBpZiAoIWlucHV0U3RyaW5nKSB7XG4gICAgICAgICAgICBpbnB1dFN0cmluZyA9IHRoaXMuaXNVdGMoKVxuICAgICAgICAgICAgICAgID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0Y1xuICAgICAgICAgICAgICAgIDogaG9va3MuZGVmYXVsdEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8IGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyB0bzogdGhpcywgZnJvbTogdGltZSB9KVxuICAgICAgICAgICAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUoKSlcbiAgICAgICAgICAgICAgICAuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tTm93KHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbShjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0byh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fCBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgZnJvbTogdGhpcywgdG86IHRpbWUgfSlcbiAgICAgICAgICAgICAgICAubG9jYWxlKHRoaXMubG9jYWxlKCkpXG4gICAgICAgICAgICAgICAgLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9Ob3cod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUoa2V5KSB7XG4gICAgICAgIHZhciBuZXdMb2NhbGVEYXRhO1xuXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xvY2FsZURhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChuZXdMb2NhbGVEYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBuZXdMb2NhbGVEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuJyxcbiAgICAgICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIHZhciBNU19QRVJfU0VDT05EID0gMTAwMCxcbiAgICAgICAgTVNfUEVSX01JTlVURSA9IDYwICogTVNfUEVSX1NFQ09ORCxcbiAgICAgICAgTVNfUEVSX0hPVVIgPSA2MCAqIE1TX1BFUl9NSU5VVEUsXG4gICAgICAgIE1TX1BFUl80MDBfWUVBUlMgPSAoMzY1ICogNDAwICsgOTcpICogMjQgKiBNU19QRVJfSE9VUjtcblxuICAgIC8vIGFjdHVhbCBtb2R1bG8gLSBoYW5kbGVzIG5lZ2F0aXZlIG51bWJlcnMgKGZvciBkYXRlcyBiZWZvcmUgMTk3MCk6XG4gICAgZnVuY3Rpb24gbW9kJDEoZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgICAgcmV0dXJuICgoZGl2aWRlbmQgJSBkaXZpc29yKSArIGRpdmlzb3IpICUgZGl2aXNvcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbFN0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSwgbSwgZCkudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRjU3RhcnRPZkRhdGUoeSwgbSwgZCkge1xuICAgICAgICAvLyBEYXRlLlVUQyByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgcmV0dXJuIERhdGUuVVRDKHkgKyA0MDAsIG0sIGQpIC0gTVNfUEVSXzQwMF9ZRUFSUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5LCBtLCBkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0T2YodW5pdHMpIHtcbiAgICAgICAgdmFyIHRpbWUsIHN0YXJ0T2ZEYXRlO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZEYXRlID0gdGhpcy5faXNVVEMgPyB1dGNTdGFydE9mRGF0ZSA6IGxvY2FsU3RhcnRPZkRhdGU7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCAwLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSAtICh0aGlzLm1vbnRoKCkgJSAzKSxcbiAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtIHRoaXMud2Vla2RheSgpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSAodGhpcy5pc29XZWVrZGF5KCkgLSAxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIHRoaXMuZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKFxuICAgICAgICAgICAgICAgICAgICB0aW1lICsgKHRoaXMuX2lzVVRDID8gMCA6IHRoaXMudXRjT2Zmc2V0KCkgKiBNU19QRVJfTUlOVVRFKSxcbiAgICAgICAgICAgICAgICAgICAgTVNfUEVSX0hPVVJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSAtPSBtb2QkMSh0aW1lLCBNU19QRVJfTUlOVVRFKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX1NFQ09ORCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kLnNldFRpbWUodGltZSk7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5kT2YodW5pdHMpIHtcbiAgICAgICAgdmFyIHRpbWUsIHN0YXJ0T2ZEYXRlO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZEYXRlID0gdGhpcy5faXNVVEMgPyB1dGNTdGFydE9mRGF0ZSA6IGxvY2FsU3RhcnRPZkRhdGU7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpICsgMSwgMCwgMSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICAgICAgdGltZSA9XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCkgLSAodGhpcy5tb250aCgpICUgMykgKyAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICApIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSArIDEsIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKSArIDdcbiAgICAgICAgICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gKHRoaXMuaXNvV2Vla2RheSgpIC0gMSkgKyA3XG4gICAgICAgICAgICAgICAgICAgICkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSArIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9XG4gICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSIC1cbiAgICAgICAgICAgICAgICAgICAgbW9kJDEoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lICsgKHRoaXMuX2lzVVRDID8gMCA6IHRoaXMudXRjT2Zmc2V0KCkgKiBNU19QRVJfTUlOVVRFKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSXG4gICAgICAgICAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgICAgICAgICAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPSBNU19QRVJfTUlOVVRFIC0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPSBNU19QRVJfU0VDT05EIC0gbW9kJDEodGltZSwgTVNfUEVSX1NFQ09ORCkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kLnZhbHVlT2YoKSAtICh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bml4KCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBtLnllYXIoKSxcbiAgICAgICAgICAgIG0ubW9udGgoKSxcbiAgICAgICAgICAgIG0uZGF0ZSgpLFxuICAgICAgICAgICAgbS5ob3VyKCksXG4gICAgICAgICAgICBtLm1pbnV0ZSgpLFxuICAgICAgICAgICAgbS5zZWNvbmQoKSxcbiAgICAgICAgICAgIG0ubWlsbGlzZWNvbmQoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IG0ueWVhcigpLFxuICAgICAgICAgICAgbW9udGhzOiBtLm1vbnRoKCksXG4gICAgICAgICAgICBkYXRlOiBtLmRhdGUoKSxcbiAgICAgICAgICAgIGhvdXJzOiBtLmhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiBtLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHNlY29uZHM6IG0uc2Vjb25kcygpLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiBtLm1pbGxpc2Vjb25kcygpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgICAgLy8gbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMigpIHtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBnZXRQYXJzaW5nRmxhZ3ModGhpcykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludmFsaWRBdCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNpbmdGbGFncyh0aGlzKS5vdmVyZmxvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGlvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnB1dDogdGhpcy5faSxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5fZixcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5fbG9jYWxlLFxuICAgICAgICAgICAgaXNVVEM6IHRoaXMuX2lzVVRDLFxuICAgICAgICAgICAgc3RyaWN0OiB0aGlzLl9zdHJpY3QsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ04nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTk4nLCAwLCAwLCAnZXJhTmFtZScpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk5OTicsIDAsIDAsICdlcmFOYXJyb3cnKTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5JywgMV0sICd5bycsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5JywgMl0sIDAsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5eScsIDNdLCAwLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eXl5JywgNF0sIDAsICdlcmFZZWFyJyk7XG5cbiAgICBhZGRSZWdleFRva2VuKCdOJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk5OJywgbWF0Y2hFcmFOYW1lKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk5OTicsIG1hdGNoRXJhTmFycm93KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydOJywgJ05OJywgJ05OTicsICdOTk5OJywgJ05OTk5OJ10sIGZ1bmN0aW9uIChcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIGFycmF5LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHRva2VuXG4gICAgKSB7XG4gICAgICAgIHZhciBlcmEgPSBjb25maWcuX2xvY2FsZS5lcmFzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIGlmIChlcmEpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVyYSA9IGVyYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRFcmEgPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkUmVnZXhUb2tlbigneScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3l5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXl5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXl5eScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3lvJywgbWF0Y2hFcmFZZWFyT3JkaW5hbCk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsneScsICd5eScsICd5eXknLCAneXl5eSddLCBZRUFSKTtcbiAgICBhZGRQYXJzZVRva2VuKFsneW8nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIGlmIChjb25maWcuX2xvY2FsZS5fZXJhWWVhck9yZGluYWxSZWdleCkge1xuICAgICAgICAgICAgbWF0Y2ggPSBpbnB1dC5tYXRjaChjb25maWcuX2xvY2FsZS5fZXJhWWVhck9yZGluYWxSZWdleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9sb2NhbGUuZXJhWWVhck9yZGluYWxQYXJzZSkge1xuICAgICAgICAgICAgYXJyYXlbWUVBUl0gPSBjb25maWcuX2xvY2FsZS5lcmFZZWFyT3JkaW5hbFBhcnNlKGlucHV0LCBtYXRjaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXMobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5fZXJhcyB8fCBnZXRMb2NhbGUoJ2VuJykuX2VyYXM7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGhvb2tzKGVyYXNbaV0uc2luY2UpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnNpbmNlID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS51bnRpbCA9ICtJbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gaG9va3MoZXJhc1tpXS51bnRpbCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnVudGlsID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcmFzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXNQYXJzZShlcmFOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5lcmFzKCksXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgYWJicixcbiAgICAgICAgICAgIG5hcnJvdztcbiAgICAgICAgZXJhTmFtZSA9IGVyYU5hbWUudG9VcHBlckNhc2UoKTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIG5hbWUgPSBlcmFzW2ldLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGFiYnIgPSBlcmFzW2ldLmFiYnIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIG5hcnJvdyA9IGVyYXNbaV0ubmFycm93LnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFiYnIgPT09IGVyYU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVyYU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTk5OJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXJyb3cgPT09IGVyYU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoW25hbWUsIGFiYnIsIG5hcnJvd10uaW5kZXhPZihlcmFOYW1lKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVFcmFzQ29udmVydFllYXIoZXJhLCB5ZWFyKSB7XG4gICAgICAgIHZhciBkaXIgPSBlcmEuc2luY2UgPD0gZXJhLnVudGlsID8gKzEgOiAtMTtcbiAgICAgICAgaWYgKHllYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhvb2tzKGVyYS5zaW5jZSkueWVhcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhvb2tzKGVyYS5zaW5jZSkueWVhcigpICsgKHllYXIgLSBlcmEub2Zmc2V0KSAqIGRpcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYU5hbWUoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhTmFycm93KCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hcnJvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hcnJvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFBYmJyKCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLmFiYnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5hYmJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYVllYXIoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgZGlyID0gZXJhc1tpXS5zaW5jZSA8PSBlcmFzW2ldLnVudGlsID8gKzEgOiAtMTtcblxuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkgfHxcbiAgICAgICAgICAgICAgICAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAodGhpcy55ZWFyKCkgLSBob29rcyhlcmFzW2ldLnNpbmNlKS55ZWFyKCkpICogZGlyICtcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS5vZmZzZXRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVyYXNOYW1lUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc05hbWVSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc05hbWVSZWdleCA6IHRoaXMuX2VyYXNSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcmFzQWJiclJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX2VyYXNBYmJyUmVnZXgnKSkge1xuICAgICAgICAgICAgY29tcHV0ZUVyYXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/IHRoaXMuX2VyYXNBYmJyUmVnZXggOiB0aGlzLl9lcmFzUmVnZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJhc05hcnJvd1JlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX2VyYXNOYXJyb3dSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc05hcnJvd1JlZ2V4IDogdGhpcy5fZXJhc1JlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhQWJicihpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZXJhc0FiYnJSZWdleChpc1N0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFOYW1lKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzTmFtZVJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYU5hcnJvdyhpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZXJhc05hcnJvd1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYVllYXJPcmRpbmFsKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fZXJhWWVhck9yZGluYWxSZWdleCB8fCBtYXRjaFVuc2lnbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVFcmFzUGFyc2UoKSB7XG4gICAgICAgIHZhciBhYmJyUGllY2VzID0gW10sXG4gICAgICAgICAgICBuYW1lUGllY2VzID0gW10sXG4gICAgICAgICAgICBuYXJyb3dQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmVyYXMoKTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIG5hbWVQaWVjZXMucHVzaChyZWdleEVzY2FwZShlcmFzW2ldLm5hbWUpKTtcbiAgICAgICAgICAgIGFiYnJQaWVjZXMucHVzaChyZWdleEVzY2FwZShlcmFzW2ldLmFiYnIpKTtcbiAgICAgICAgICAgIG5hcnJvd1BpZWNlcy5wdXNoKHJlZ2V4RXNjYXBlKGVyYXNbaV0ubmFycm93KSk7XG5cbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gocmVnZXhFc2NhcGUoZXJhc1tpXS5uYW1lKSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHJlZ2V4RXNjYXBlKGVyYXNbaV0uYWJicikpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChyZWdleEVzY2FwZShlcmFzW2ldLm5hcnJvdykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZXJhc1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9lcmFzTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbmFtZVBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX2VyYXNBYmJyUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBhYmJyUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fZXJhc05hcnJvd1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBuYXJyb3dQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydnZycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ0dHJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4odG9rZW4sIGdldHRlcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbigwLCBbdG9rZW4sIHRva2VuLmxlbmd0aF0sIDAsIGdldHRlcik7XG4gICAgfVxuXG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZycsICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2dnJywgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHRycsICdpc29XZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3dlZWtZZWFyJywgJ2dnJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrWWVhcicsICdHRycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnd2Vla1llYXInLCAxKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWtZZWFyJywgMSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdHJywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2cnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHRycsIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0dHJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2dnJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZ2dnJywgJ2dnZ2dnJywgJ0dHR0cnLCAnR0dHR0cnXSwgZnVuY3Rpb24gKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgd2VlayxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB0b2tlblxuICAgICkge1xuICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnJywgJ0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgdGhpcy53ZWVrKCksXG4gICAgICAgICAgICB0aGlzLndlZWtkYXkoKSxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWtZZWFyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgdGhpcy5pc29XZWVrKCksXG4gICAgICAgICAgICB0aGlzLmlzb1dlZWtkYXkoKSxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICA0XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJbklTT1dlZWtZZWFyKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy5pc29XZWVrWWVhcigpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luWWVhcigpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFdlZWtzSW5XZWVrWWVhcigpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLndlZWtZZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhckhlbHBlcihpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtzVGFyZ2V0O1xuICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIodGhpcywgZG93LCBkb3kpLnllYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3ZWVrc1RhcmdldCA9IHdlZWtzSW5ZZWFyKGlucHV0LCBkb3csIGRveSk7XG4gICAgICAgICAgICBpZiAod2VlayA+IHdlZWtzVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgd2VlayA9IHdlZWtzVGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNldFdlZWtBbGwuY2FsbCh0aGlzLCBpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0V2Vla0FsbCh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhckRhdGEgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKGRheU9mWWVhckRhdGEueWVhciwgMCwgZGF5T2ZZZWFyRGF0YS5kYXlPZlllYXIpO1xuXG4gICAgICAgIHRoaXMueWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpO1xuICAgICAgICB0aGlzLm1vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSk7XG4gICAgICAgIHRoaXMuZGF0ZShkYXRlLmdldFVUQ0RhdGUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdRJywgMCwgJ1FvJywgJ3F1YXJ0ZXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygncXVhcnRlcicsICdRJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdxdWFydGVyJywgNyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdRJywgbWF0Y2gxKTtcbiAgICBhZGRQYXJzZVRva2VuKCdRJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSAodG9JbnQoaW5wdXQpIC0gMSkgKiAzO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0UXVhcnRlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbFxuICAgICAgICAgICAgPyBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEpIC8gMylcbiAgICAgICAgICAgIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyAodGhpcy5tb250aCgpICUgMykpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEJywgWydERCcsIDJdLCAnRG8nLCAnZGF0ZScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXRlJywgJ0QnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXRlJywgOSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdERCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdEbycsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBcIm9yZGluYWxQYXJzZVwiIGZhbGxiYWNrIGluIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0XG4gICAgICAgICAgICA/IGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZSB8fCBsb2NhbGUuX29yZGluYWxQYXJzZVxuICAgICAgICAgICAgOiBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50O1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0QnLCAnREQnXSwgREFURSk7XG4gICAgYWRkUGFyc2VUb2tlbignRG8nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W0RBVEVdID0gdG9JbnQoaW5wdXQubWF0Y2gobWF0Y2gxdG8yKVswXSk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0RGF5T2ZNb250aCA9IG1ha2VHZXRTZXQoJ0RhdGUnLCB0cnVlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEREQnLCBbJ0REREQnLCAzXSwgJ0RERG8nLCAnZGF5T2ZZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheU9mWWVhcicsICdEREQnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXlPZlllYXInLCA0KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0RERCcsIG1hdGNoMXRvMyk7XG4gICAgYWRkUmVnZXhUb2tlbignRERERCcsIG1hdGNoMyk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ0RERCcsICdEREREJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mWWVhcihpbnB1dCkge1xuICAgICAgICB2YXIgZGF5T2ZZZWFyID1cbiAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgKHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKSAtIHRoaXMuY2xvbmUoKS5zdGFydE9mKCd5ZWFyJykpIC8gODY0ZTVcbiAgICAgICAgICAgICkgKyAxO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IGRheU9mWWVhciA6IHRoaXMuYWRkKGlucHV0IC0gZGF5T2ZZZWFyLCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdtJywgWydtbScsIDJdLCAwLCAnbWludXRlJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21pbnV0ZScsICdtJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtaW51dGUnLCAxNCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdtJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdtbScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnbScsICdtbSddLCBNSU5VVEUpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldE1pbnV0ZSA9IG1ha2VHZXRTZXQoJ01pbnV0ZXMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigncycsIFsnc3MnLCAyXSwgMCwgJ3NlY29uZCcpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdzZWNvbmQnLCAncycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnc2Vjb25kJywgMTUpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigncycsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignc3MnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ3MnLCAnc3MnXSwgU0VDT05EKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRTZWNvbmQgPSBtYWtlR2V0U2V0KCdTZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMDApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTUycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTUycsIDNdLCAwLCAnbWlsbGlzZWNvbmQnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1MnLCA0XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTUycsIDVdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1MnLCA2XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1MnLCA3XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTUycsIDhdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTU1MnLCA5XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwMDtcbiAgICB9KTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbWlsbGlzZWNvbmQnLCAnbXMnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21pbGxpc2Vjb25kJywgMTYpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUycsIG1hdGNoMXRvMywgbWF0Y2gxKTtcbiAgICBhZGRSZWdleFRva2VuKCdTUycsIG1hdGNoMXRvMywgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdTU1MnLCBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbiAgICB2YXIgdG9rZW4sIGdldFNldE1pbGxpc2Vjb25kO1xuICAgIGZvciAodG9rZW4gPSAnU1NTUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUmVnZXhUb2tlbih0b2tlbiwgbWF0Y2hVbnNpZ25lZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VNcyhpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTUlMTElTRUNPTkRdID0gdG9JbnQoKCcwLicgKyBpbnB1dCkgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmb3IgKHRva2VuID0gJ1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIHBhcnNlTXMpO1xuICAgIH1cblxuICAgIGdldFNldE1pbGxpc2Vjb25kID0gbWFrZUdldFNldCgnTWlsbGlzZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3onLCAwLCAwLCAnem9uZUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignenonLCAwLCAwLCAnem9uZU5hbWUnKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFpvbmVBYmJyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFpvbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUnIDogJyc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxuICAgIHByb3RvLmFkZCA9IGFkZDtcbiAgICBwcm90by5jYWxlbmRhciA9IGNhbGVuZGFyJDE7XG4gICAgcHJvdG8uY2xvbmUgPSBjbG9uZTtcbiAgICBwcm90by5kaWZmID0gZGlmZjtcbiAgICBwcm90by5lbmRPZiA9IGVuZE9mO1xuICAgIHByb3RvLmZvcm1hdCA9IGZvcm1hdDtcbiAgICBwcm90by5mcm9tID0gZnJvbTtcbiAgICBwcm90by5mcm9tTm93ID0gZnJvbU5vdztcbiAgICBwcm90by50byA9IHRvO1xuICAgIHByb3RvLnRvTm93ID0gdG9Ob3c7XG4gICAgcHJvdG8uZ2V0ID0gc3RyaW5nR2V0O1xuICAgIHByb3RvLmludmFsaWRBdCA9IGludmFsaWRBdDtcbiAgICBwcm90by5pc0FmdGVyID0gaXNBZnRlcjtcbiAgICBwcm90by5pc0JlZm9yZSA9IGlzQmVmb3JlO1xuICAgIHByb3RvLmlzQmV0d2VlbiA9IGlzQmV0d2VlbjtcbiAgICBwcm90by5pc1NhbWUgPSBpc1NhbWU7XG4gICAgcHJvdG8uaXNTYW1lT3JBZnRlciA9IGlzU2FtZU9yQWZ0ZXI7XG4gICAgcHJvdG8uaXNTYW1lT3JCZWZvcmUgPSBpc1NhbWVPckJlZm9yZTtcbiAgICBwcm90by5pc1ZhbGlkID0gaXNWYWxpZCQyO1xuICAgIHByb3RvLmxhbmcgPSBsYW5nO1xuICAgIHByb3RvLmxvY2FsZSA9IGxvY2FsZTtcbiAgICBwcm90by5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcbiAgICBwcm90by5tYXggPSBwcm90b3R5cGVNYXg7XG4gICAgcHJvdG8ubWluID0gcHJvdG90eXBlTWluO1xuICAgIHByb3RvLnBhcnNpbmdGbGFncyA9IHBhcnNpbmdGbGFncztcbiAgICBwcm90by5zZXQgPSBzdHJpbmdTZXQ7XG4gICAgcHJvdG8uc3RhcnRPZiA9IHN0YXJ0T2Y7XG4gICAgcHJvdG8uc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBwcm90by50b0FycmF5ID0gdG9BcnJheTtcbiAgICBwcm90by50b09iamVjdCA9IHRvT2JqZWN0O1xuICAgIHByb3RvLnRvRGF0ZSA9IHRvRGF0ZTtcbiAgICBwcm90by50b0lTT1N0cmluZyA9IHRvSVNPU3RyaW5nO1xuICAgIHByb3RvLmluc3BlY3QgPSBpbnNwZWN0O1xuICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuZm9yICE9IG51bGwpIHtcbiAgICAgICAgcHJvdG9bU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ01vbWVudDwnICsgdGhpcy5mb3JtYXQoKSArICc+JztcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHJvdG8udG9KU09OID0gdG9KU09OO1xuICAgIHByb3RvLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgcHJvdG8udW5peCA9IHVuaXg7XG4gICAgcHJvdG8udmFsdWVPZiA9IHZhbHVlT2Y7XG4gICAgcHJvdG8uY3JlYXRpb25EYXRhID0gY3JlYXRpb25EYXRhO1xuICAgIHByb3RvLmVyYU5hbWUgPSBnZXRFcmFOYW1lO1xuICAgIHByb3RvLmVyYU5hcnJvdyA9IGdldEVyYU5hcnJvdztcbiAgICBwcm90by5lcmFBYmJyID0gZ2V0RXJhQWJicjtcbiAgICBwcm90by5lcmFZZWFyID0gZ2V0RXJhWWVhcjtcbiAgICBwcm90by55ZWFyID0gZ2V0U2V0WWVhcjtcbiAgICBwcm90by5pc0xlYXBZZWFyID0gZ2V0SXNMZWFwWWVhcjtcbiAgICBwcm90by53ZWVrWWVhciA9IGdldFNldFdlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtZZWFyID0gZ2V0U2V0SVNPV2Vla1llYXI7XG4gICAgcHJvdG8ucXVhcnRlciA9IHByb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcbiAgICBwcm90by5tb250aCA9IGdldFNldE1vbnRoO1xuICAgIHByb3RvLmRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG4gICAgcHJvdG8ud2VlayA9IHByb3RvLndlZWtzID0gZ2V0U2V0V2VlaztcbiAgICBwcm90by5pc29XZWVrID0gcHJvdG8uaXNvV2Vla3MgPSBnZXRTZXRJU09XZWVrO1xuICAgIHByb3RvLndlZWtzSW5ZZWFyID0gZ2V0V2Vla3NJblllYXI7XG4gICAgcHJvdG8ud2Vla3NJbldlZWtZZWFyID0gZ2V0V2Vla3NJbldlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtzSW5ZZWFyID0gZ2V0SVNPV2Vla3NJblllYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJbklTT1dlZWtZZWFyID0gZ2V0SVNPV2Vla3NJbklTT1dlZWtZZWFyO1xuICAgIHByb3RvLmRhdGUgPSBnZXRTZXREYXlPZk1vbnRoO1xuICAgIHByb3RvLmRheSA9IHByb3RvLmRheXMgPSBnZXRTZXREYXlPZldlZWs7XG4gICAgcHJvdG8ud2Vla2RheSA9IGdldFNldExvY2FsZURheU9mV2VlaztcbiAgICBwcm90by5pc29XZWVrZGF5ID0gZ2V0U2V0SVNPRGF5T2ZXZWVrO1xuICAgIHByb3RvLmRheU9mWWVhciA9IGdldFNldERheU9mWWVhcjtcbiAgICBwcm90by5ob3VyID0gcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuICAgIHByb3RvLm1pbnV0ZSA9IHByb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG4gICAgcHJvdG8uc2Vjb25kID0gcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcbiAgICBwcm90by5taWxsaXNlY29uZCA9IHByb3RvLm1pbGxpc2Vjb25kcyA9IGdldFNldE1pbGxpc2Vjb25kO1xuICAgIHByb3RvLnV0Y09mZnNldCA9IGdldFNldE9mZnNldDtcbiAgICBwcm90by51dGMgPSBzZXRPZmZzZXRUb1VUQztcbiAgICBwcm90by5sb2NhbCA9IHNldE9mZnNldFRvTG9jYWw7XG4gICAgcHJvdG8ucGFyc2Vab25lID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQ7XG4gICAgcHJvdG8uaGFzQWxpZ25lZEhvdXJPZmZzZXQgPSBoYXNBbGlnbmVkSG91ck9mZnNldDtcbiAgICBwcm90by5pc0RTVCA9IGlzRGF5bGlnaHRTYXZpbmdUaW1lO1xuICAgIHByb3RvLmlzTG9jYWwgPSBpc0xvY2FsO1xuICAgIHByb3RvLmlzVXRjT2Zmc2V0ID0gaXNVdGNPZmZzZXQ7XG4gICAgcHJvdG8uaXNVdGMgPSBpc1V0YztcbiAgICBwcm90by5pc1VUQyA9IGlzVXRjO1xuICAgIHByb3RvLnpvbmVBYmJyID0gZ2V0Wm9uZUFiYnI7XG4gICAgcHJvdG8uem9uZU5hbWUgPSBnZXRab25lTmFtZTtcbiAgICBwcm90by5kYXRlcyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0U2V0RGF5T2ZNb250aFxuICAgICk7XG4gICAgcHJvdG8ubW9udGhzID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9udGhzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb250aCBpbnN0ZWFkJyxcbiAgICAgICAgZ2V0U2V0TW9udGhcbiAgICApO1xuICAgIHByb3RvLnllYXJzID0gZGVwcmVjYXRlKFxuICAgICAgICAneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsXG4gICAgICAgIGdldFNldFllYXJcbiAgICApO1xuICAgIHByb3RvLnpvbmUgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLycsXG4gICAgICAgIGdldFNldFpvbmVcbiAgICApO1xuICAgIHByb3RvLmlzRFNUU2hpZnRlZCA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2lzRFNUU2hpZnRlZCBpcyBkZXByZWNhdGVkLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kc3Qtc2hpZnRlZC8gZm9yIG1vcmUgaW5mb3JtYXRpb24nLFxuICAgICAgICBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWRcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlVW5peChpbnB1dCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJblpvbmUoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhcnNlWm9uZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZVBhcnNlUG9zdEZvcm1hdChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMSA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgICBwcm90byQxLmNhbGVuZGFyID0gY2FsZW5kYXI7XG4gICAgcHJvdG8kMS5sb25nRGF0ZUZvcm1hdCA9IGxvbmdEYXRlRm9ybWF0O1xuICAgIHByb3RvJDEuaW52YWxpZERhdGUgPSBpbnZhbGlkRGF0ZTtcbiAgICBwcm90byQxLm9yZGluYWwgPSBvcmRpbmFsO1xuICAgIHByb3RvJDEucHJlcGFyc2UgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5wb3N0Zm9ybWF0ID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucmVsYXRpdmVUaW1lID0gcmVsYXRpdmVUaW1lO1xuICAgIHByb3RvJDEucGFzdEZ1dHVyZSA9IHBhc3RGdXR1cmU7XG4gICAgcHJvdG8kMS5zZXQgPSBzZXQ7XG4gICAgcHJvdG8kMS5lcmFzID0gbG9jYWxlRXJhcztcbiAgICBwcm90byQxLmVyYXNQYXJzZSA9IGxvY2FsZUVyYXNQYXJzZTtcbiAgICBwcm90byQxLmVyYXNDb252ZXJ0WWVhciA9IGxvY2FsZUVyYXNDb252ZXJ0WWVhcjtcbiAgICBwcm90byQxLmVyYXNBYmJyUmVnZXggPSBlcmFzQWJiclJlZ2V4O1xuICAgIHByb3RvJDEuZXJhc05hbWVSZWdleCA9IGVyYXNOYW1lUmVnZXg7XG4gICAgcHJvdG8kMS5lcmFzTmFycm93UmVnZXggPSBlcmFzTmFycm93UmVnZXg7XG5cbiAgICBwcm90byQxLm1vbnRocyA9IGxvY2FsZU1vbnRocztcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0ID0gbG9jYWxlTW9udGhzU2hvcnQ7XG4gICAgcHJvdG8kMS5tb250aHNQYXJzZSA9IGxvY2FsZU1vbnRoc1BhcnNlO1xuICAgIHByb3RvJDEubW9udGhzUmVnZXggPSBtb250aHNSZWdleDtcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0UmVnZXggPSBtb250aHNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2VlayA9IGxvY2FsZVdlZWs7XG4gICAgcHJvdG8kMS5maXJzdERheU9mWWVhciA9IGxvY2FsZUZpcnN0RGF5T2ZZZWFyO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZldlZWsgPSBsb2NhbGVGaXJzdERheU9mV2VlaztcblxuICAgIHByb3RvJDEud2Vla2RheXMgPSBsb2NhbGVXZWVrZGF5cztcbiAgICBwcm90byQxLndlZWtkYXlzTWluID0gbG9jYWxlV2Vla2RheXNNaW47XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0ID0gbG9jYWxlV2Vla2RheXNTaG9ydDtcbiAgICBwcm90byQxLndlZWtkYXlzUGFyc2UgPSBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5c1JlZ2V4ID0gd2Vla2RheXNSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnRSZWdleCA9IHdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzTWluUmVnZXggPSB3ZWVrZGF5c01pblJlZ2V4O1xuXG4gICAgcHJvdG8kMS5pc1BNID0gbG9jYWxlSXNQTTtcbiAgICBwcm90byQxLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbiAgICBmdW5jdGlvbiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHV0YyA9IGNyZWF0ZVVUQygpLnNldChzZXR0ZXIsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGxvY2FsZVtmaWVsZF0odXRjLCBmb3JtYXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIGksIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIC8vICgpXG4gICAgLy8gKDUpXG4gICAgLy8gKGZtdCwgNSlcbiAgICAvLyAoZm10KVxuICAgIC8vICh0cnVlKVxuICAgIC8vICh0cnVlLCA1KVxuICAgIC8vICh0cnVlLCBmbXQsIDUpXG4gICAgLy8gKHRydWUsIGZtdClcbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGVTb3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgbG9jYWxlU29ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICBzaGlmdCA9IGxvY2FsZVNvcnRlZCA/IGxvY2FsZS5fd2Vlay5kb3cgOiAwLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG91dCA9IFtdO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCAoaW5kZXggKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCAoaSArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzU2hvcnQoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRoc1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c1Nob3J0KGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzTWluKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c01pbicpO1xuICAgIH1cblxuICAgIGdldFNldEdsb2JhbExvY2FsZSgnZW4nLCB7XG4gICAgICAgIGVyYXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDEtMDEtMDEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiArSW5maW5pdHksXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdBbm5vIERvbWluaScsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQUQnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdBRCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMC0xMi0zMScsXG4gICAgICAgICAgICAgICAgdW50aWw6IC1JbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0JlZm9yZSBDaHJpc3QnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0JDJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQkMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgdG9JbnQoKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuICAgIGhvb2tzLmxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLicsXG4gICAgICAgIGdldFNldEdsb2JhbExvY2FsZVxuICAgICk7XG4gICAgaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZ0RhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGVEYXRhIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0TG9jYWxlXG4gICAgKTtcblxuICAgIHZhciBtYXRoQWJzID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBhYnMoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgICAgIHRoaXMuX2RheXMgPSBtYXRoQWJzKHRoaXMuX2RheXMpO1xuICAgICAgICB0aGlzLl9tb250aHMgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzID0gbWF0aEFicyhkYXRhLnNlY29uZHMpO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgPSBtYXRoQWJzKGRhdGEubWludXRlcyk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBtYXRoQWJzKGRhdGEuaG91cnMpO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1hdGhBYnMoZGF0YS5tb250aHMpO1xuICAgICAgICBkYXRhLnllYXJzID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCQxKGR1cmF0aW9uLCBpbnB1dCwgdmFsdWUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgICAgIGR1cmF0aW9uLl9taWxsaXNlY29uZHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgZHVyYXRpb24uX2RheXMgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgICAgIGR1cmF0aW9uLl9tb250aHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21vbnRocztcblxuICAgICAgICByZXR1cm4gZHVyYXRpb24uX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBhZGQkMShpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAxKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBzdWJ0cmFjdCgxLCAncycpIG9yIHN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0JDEoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgLTEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0NlaWwobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnViYmxlKCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMsXG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMsXG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHNlY29uZHMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIG1vbnRoc0Zyb21EYXlzO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAgICAgLy8gY2hlY2s6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yMTY2XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA+PSAwICYmIGRheXMgPj0gMCAmJiBtb250aHMgPj0gMCkgfHxcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzIDw9IDAgJiYgZGF5cyA8PSAwICYmIG1vbnRocyA8PSAwKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgICAgIGRheXMgPSAwO1xuICAgICAgICAgICAgbW9udGhzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBidWJibGVzIHVwIHZhbHVlcywgc2VlIHRoZSB0ZXN0cyBmb3JcbiAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICAgICAgc2Vjb25kcyA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgICAgICBkYXRhLnNlY29uZHMgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgbWludXRlcyA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGRhdGEubWludXRlcyA9IG1pbnV0ZXMgJSA2MDtcblxuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBob3VycyAlIDI0O1xuXG4gICAgICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAgICAgLy8gY29udmVydCBkYXlzIHRvIG1vbnRoc1xuICAgICAgICBtb250aHNGcm9tRGF5cyA9IGFic0Zsb29yKGRheXNUb01vbnRocyhkYXlzKSk7XG4gICAgICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICAgICAgZGF5cyAtPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHNGcm9tRGF5cykpO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICBkYXRhLmRheXMgPSBkYXlzO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocztcbiAgICAgICAgZGF0YS55ZWFycyA9IHllYXJzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNUb01vbnRocyhkYXlzKSB7XG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTIgbW9udGhzID09PSA0ODAwXG4gICAgICAgIHJldHVybiAoZGF5cyAqIDQ4MDApIC8gMTQ2MDk3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1RvRGF5cyhtb250aHMpIHtcbiAgICAgICAgLy8gdGhlIHJldmVyc2Ugb2YgZGF5c1RvTW9udGhzXG4gICAgICAgIHJldHVybiAobW9udGhzICogMTQ2MDk3KSAvIDQ4MDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXModW5pdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5cyxcbiAgICAgICAgICAgIG1vbnRocyxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICdxdWFydGVyJyB8fCB1bml0cyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvTW9udGhzKGRheXMpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocztcbiAgICAgICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocyAvIDM7XG4gICAgICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aHMgLyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBtaWxsaXNlY29uZHMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChpc3N1ZSAjMTg2NylcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZChtb250aHNUb0RheXModGhpcy5fbW9udGhzKSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzIC8gNyArIG1pbGxpc2Vjb25kcyAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDI0ICsgbWlsbGlzZWNvbmRzIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDE0NDAgKyBtaWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgKiA4NjQwMCArIG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgICAgICAgICAgICAgLy8gTWF0aC5mbG9vciBwcmV2ZW50cyBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyBoZXJlXG4gICAgICAgICAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihkYXlzICogODY0ZTUpICsgbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB1bml0ICcgKyB1bml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBVc2UgdGhpcy5hcygnbXMnKT9cbiAgICBmdW5jdGlvbiB2YWx1ZU9mJDEoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xuICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICB0b0ludCh0aGlzLl9tb250aHMgLyAxMikgKiAzMTUzNmU2XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcyhhbGlhcyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGFzTWlsbGlzZWNvbmRzID0gbWFrZUFzKCdtcycpLFxuICAgICAgICBhc1NlY29uZHMgPSBtYWtlQXMoJ3MnKSxcbiAgICAgICAgYXNNaW51dGVzID0gbWFrZUFzKCdtJyksXG4gICAgICAgIGFzSG91cnMgPSBtYWtlQXMoJ2gnKSxcbiAgICAgICAgYXNEYXlzID0gbWFrZUFzKCdkJyksXG4gICAgICAgIGFzV2Vla3MgPSBtYWtlQXMoJ3cnKSxcbiAgICAgICAgYXNNb250aHMgPSBtYWtlQXMoJ00nKSxcbiAgICAgICAgYXNRdWFydGVycyA9IG1ha2VBcygnUScpLFxuICAgICAgICBhc1llYXJzID0gbWFrZUFzKCd5Jyk7XG5cbiAgICBmdW5jdGlvbiBjbG9uZSQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXNbdW5pdHMgKyAncyddKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9kYXRhW25hbWVdIDogTmFOO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtYWtlR2V0dGVyKCdtaWxsaXNlY29uZHMnKSxcbiAgICAgICAgc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKSxcbiAgICAgICAgbWludXRlcyA9IG1ha2VHZXR0ZXIoJ21pbnV0ZXMnKSxcbiAgICAgICAgaG91cnMgPSBtYWtlR2V0dGVyKCdob3VycycpLFxuICAgICAgICBkYXlzID0gbWFrZUdldHRlcignZGF5cycpLFxuICAgICAgICBtb250aHMgPSBtYWtlR2V0dGVyKCdtb250aHMnKSxcbiAgICAgICAgeWVhcnMgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MoKSB7XG4gICAgICAgIHJldHVybiBhYnNGbG9vcih0aGlzLmRheXMoKSAvIDcpO1xuICAgIH1cblxuICAgIHZhciByb3VuZCA9IE1hdGgucm91bmQsXG4gICAgICAgIHRocmVzaG9sZHMgPSB7XG4gICAgICAgICAgICBzczogNDQsIC8vIGEgZmV3IHNlY29uZHMgdG8gc2Vjb25kc1xuICAgICAgICAgICAgczogNDUsIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgICAgICAgICBtOiA0NSwgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgICAgICBoOiAyMiwgLy8gaG91cnMgdG8gZGF5XG4gICAgICAgICAgICBkOiAyNiwgLy8gZGF5cyB0byBtb250aC93ZWVrXG4gICAgICAgICAgICB3OiBudWxsLCAvLyB3ZWVrcyB0byBtb250aFxuICAgICAgICAgICAgTTogMTEsIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgICAgIH07XG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIG1vbWVudC5mbi5mcm9tLCBtb21lbnQuZm4uZnJvbU5vdywgYW5kIG1vbWVudC5kdXJhdGlvbi5mbi5odW1hbml6ZVxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUucmVsYXRpdmVUaW1lKG51bWJlciB8fCAxLCAhIXdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZSQxKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCB0aHJlc2hvbGRzLCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpLFxuICAgICAgICAgICAgc2Vjb25kcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpLFxuICAgICAgICAgICAgbWludXRlcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdtJykpLFxuICAgICAgICAgICAgaG91cnMgPSByb3VuZChkdXJhdGlvbi5hcygnaCcpKSxcbiAgICAgICAgICAgIGRheXMgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKSxcbiAgICAgICAgICAgIG1vbnRocyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdNJykpLFxuICAgICAgICAgICAgd2Vla3MgPSByb3VuZChkdXJhdGlvbi5hcygndycpKSxcbiAgICAgICAgICAgIHllYXJzID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSksXG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICAoc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdKSB8fFxuICAgICAgICAgICAgICAgIChzZWNvbmRzIDwgdGhyZXNob2xkcy5zICYmIFsnc3MnLCBzZWNvbmRzXSkgfHxcbiAgICAgICAgICAgICAgICAobWludXRlcyA8PSAxICYmIFsnbSddKSB8fFxuICAgICAgICAgICAgICAgIChtaW51dGVzIDwgdGhyZXNob2xkcy5tICYmIFsnbW0nLCBtaW51dGVzXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPD0gMSAmJiBbJ2gnXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPCB0aHJlc2hvbGRzLmggJiYgWydoaCcsIGhvdXJzXSkgfHxcbiAgICAgICAgICAgICAgICAoZGF5cyA8PSAxICYmIFsnZCddKSB8fFxuICAgICAgICAgICAgICAgIChkYXlzIDwgdGhyZXNob2xkcy5kICYmIFsnZGQnLCBkYXlzXSk7XG5cbiAgICAgICAgaWYgKHRocmVzaG9sZHMudyAhPSBudWxsKSB7XG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICBhIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDw9IDEgJiYgWyd3J10pIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDwgdGhyZXNob2xkcy53ICYmIFsnd3cnLCB3ZWVrc10pO1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhIHx8XG4gICAgICAgICAgICAobW9udGhzIDw9IDEgJiYgWydNJ10pIHx8XG4gICAgICAgICAgICAobW9udGhzIDwgdGhyZXNob2xkcy5NICYmIFsnTU0nLCBtb250aHNdKSB8fFxuICAgICAgICAgICAgKHllYXJzIDw9IDEgJiYgWyd5J10pIHx8IFsneXknLCB5ZWFyc107XG5cbiAgICAgICAgYVsyXSA9IHdpdGhvdXRTdWZmaXg7XG4gICAgICAgIGFbM10gPSArcG9zTmVnRHVyYXRpb24gPiAwO1xuICAgICAgICBhWzRdID0gbG9jYWxlO1xuICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZVRpbWVBZ28uYXBwbHkobnVsbCwgYSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgcm91bmRpbmcgZnVuY3Rpb24gZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygcm91bmRpbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcm91bmQgPSByb3VuZGluZ0Z1bmN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZCh0aHJlc2hvbGQsIGxpbWl0KSB7XG4gICAgICAgIGlmICh0aHJlc2hvbGRzW3RocmVzaG9sZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyZXNob2xkc1t0aHJlc2hvbGRdO1xuICAgICAgICB9XG4gICAgICAgIHRocmVzaG9sZHNbdGhyZXNob2xkXSA9IGxpbWl0O1xuICAgICAgICBpZiAodGhyZXNob2xkID09PSAncycpIHtcbiAgICAgICAgICAgIHRocmVzaG9sZHMuc3MgPSBsaW1pdCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaHVtYW5pemUoYXJnV2l0aFN1ZmZpeCwgYXJnVGhyZXNob2xkcykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3aXRoU3VmZml4ID0gZmFsc2UsXG4gICAgICAgICAgICB0aCA9IHRocmVzaG9sZHMsXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgYXJnVGhyZXNob2xkcyA9IGFyZ1dpdGhTdWZmaXg7XG4gICAgICAgICAgICBhcmdXaXRoU3VmZml4ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHdpdGhTdWZmaXggPSBhcmdXaXRoU3VmZml4O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnVGhyZXNob2xkcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoID0gT2JqZWN0LmFzc2lnbih7fSwgdGhyZXNob2xkcywgYXJnVGhyZXNob2xkcyk7XG4gICAgICAgICAgICBpZiAoYXJnVGhyZXNob2xkcy5zICE9IG51bGwgJiYgYXJnVGhyZXNob2xkcy5zcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGguc3MgPSBhcmdUaHJlc2hvbGRzLnMgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxlID0gdGhpcy5sb2NhbGVEYXRhKCk7XG4gICAgICAgIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCB0aCwgbG9jYWxlKTtcblxuICAgICAgICBpZiAod2l0aFN1ZmZpeCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gbG9jYWxlLnBhc3RGdXR1cmUoK3RoaXMsIG91dHB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9jYWxlLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWJzJDEgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIHNpZ24oeCkge1xuICAgICAgICByZXR1cm4gKHggPiAwKSAtICh4IDwgMCkgfHwgK3g7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAgICAgLy8gZm9yIElTTyBzdHJpbmdzIHdlIGRvIG5vdCB1c2UgdGhlIG5vcm1hbCBidWJibGluZyBydWxlczpcbiAgICAgICAgLy8gICogbWlsbGlzZWNvbmRzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSBob3Vyc1xuICAgICAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgICAgIC8vICAqIG1vbnRocyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgeWVhcnNcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRleHQtZnJlZSBjb252ZXJzaW9uIGJldHdlZW4gaG91cnMgYW5kIGRheXNcbiAgICAgICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgICAgIC8vIGFuZCBhbHNvIG5vdCBiZXR3ZWVuIGRheXMgYW5kIG1vbnRocyAoMjgtMzEgZGF5cyBwZXIgbW9udGgpXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY29uZHMgPSBhYnMkMSh0aGlzLl9taWxsaXNlY29uZHMpIC8gMTAwMCxcbiAgICAgICAgICAgIGRheXMgPSBhYnMkMSh0aGlzLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFicyQxKHRoaXMuX21vbnRocyksXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCksXG4gICAgICAgICAgICB0b3RhbFNpZ24sXG4gICAgICAgICAgICB5bVNpZ24sXG4gICAgICAgICAgICBkYXlzU2lnbixcbiAgICAgICAgICAgIGhtc1NpZ247XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIHNlY29uZHMgJT0gNjA7XG4gICAgICAgIG1pbnV0ZXMgJT0gNjA7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIC8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3JkaWxsZS9tb21lbnQtaXNvZHVyYXRpb24vYmxvYi9tYXN0ZXIvbW9tZW50Lmlzb2R1cmF0aW9uLmpzXG4gICAgICAgIHMgPSBzZWNvbmRzID8gc2Vjb25kcy50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJykgOiAnJztcblxuICAgICAgICB0b3RhbFNpZ24gPSB0b3RhbCA8IDAgPyAnLScgOiAnJztcbiAgICAgICAgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICBkYXlzU2lnbiA9IHNpZ24odGhpcy5fZGF5cykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIGhtc1NpZ24gPSBzaWduKHRoaXMuX21pbGxpc2Vjb25kcykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRvdGFsU2lnbiArXG4gICAgICAgICAgICAnUCcgK1xuICAgICAgICAgICAgKHllYXJzID8geW1TaWduICsgeWVhcnMgKyAnWScgOiAnJykgK1xuICAgICAgICAgICAgKG1vbnRocyA/IHltU2lnbiArIG1vbnRocyArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAoZGF5cyA/IGRheXNTaWduICsgZGF5cyArICdEJyA6ICcnKSArXG4gICAgICAgICAgICAoaG91cnMgfHwgbWludXRlcyB8fCBzZWNvbmRzID8gJ1QnIDogJycpICtcbiAgICAgICAgICAgIChob3VycyA/IGhtc1NpZ24gKyBob3VycyArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobWludXRlcyA/IGhtc1NpZ24gKyBtaW51dGVzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzZWNvbmRzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDIuaXNWYWxpZCA9IGlzVmFsaWQkMTtcbiAgICBwcm90byQyLmFicyA9IGFicztcbiAgICBwcm90byQyLmFkZCA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgPSBhc1NlY29uZHM7XG4gICAgcHJvdG8kMi5hc01pbnV0ZXMgPSBhc01pbnV0ZXM7XG4gICAgcHJvdG8kMi5hc0hvdXJzID0gYXNIb3VycztcbiAgICBwcm90byQyLmFzRGF5cyA9IGFzRGF5cztcbiAgICBwcm90byQyLmFzV2Vla3MgPSBhc1dlZWtzO1xuICAgIHByb3RvJDIuYXNNb250aHMgPSBhc01vbnRocztcbiAgICBwcm90byQyLmFzUXVhcnRlcnMgPSBhc1F1YXJ0ZXJzO1xuICAgIHByb3RvJDIuYXNZZWFycyA9IGFzWWVhcnM7XG4gICAgcHJvdG8kMi52YWx1ZU9mID0gdmFsdWVPZiQxO1xuICAgIHByb3RvJDIuX2J1YmJsZSA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCA9IGdldCQyO1xuICAgIHByb3RvJDIubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzO1xuICAgIHByb3RvJDIuc2Vjb25kcyA9IHNlY29uZHM7XG4gICAgcHJvdG8kMi5taW51dGVzID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzID0gZGF5cztcbiAgICBwcm90byQyLndlZWtzID0gd2Vla3M7XG4gICAgcHJvdG8kMi5tb250aHMgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiA9IHRvSVNPU3RyaW5nJDE7XG4gICAgcHJvdG8kMi5sb2NhbGUgPSBsb2NhbGU7XG4gICAgcHJvdG8kMi5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcblxuICAgIHByb3RvJDIudG9Jc29TdHJpbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsXG4gICAgICAgIHRvSVNPU3RyaW5nJDFcbiAgICApO1xuICAgIHByb3RvJDIubGFuZyA9IGxhbmc7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWCcsIDAsIDAsICd1bml4Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3gnLCAwLCAwLCAndmFsdWVPZicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigneCcsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdYJywgbWF0Y2hUaW1lc3RhbXApO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUocGFyc2VGbG9hdChpbnB1dCkgKiAxMDAwKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCd4JywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHRvSW50KGlucHV0KSk7XG4gICAgfSk7XG5cbiAgICAvLyEgbW9tZW50LmpzXG5cbiAgICBob29rcy52ZXJzaW9uID0gJzIuMjkuMCc7XG5cbiAgICBzZXRIb29rQ2FsbGJhY2soY3JlYXRlTG9jYWwpO1xuXG4gICAgaG9va3MuZm4gPSBwcm90bztcbiAgICBob29rcy5taW4gPSBtaW47XG4gICAgaG9va3MubWF4ID0gbWF4O1xuICAgIGhvb2tzLm5vdyA9IG5vdztcbiAgICBob29rcy51dGMgPSBjcmVhdGVVVEM7XG4gICAgaG9va3MudW5peCA9IGNyZWF0ZVVuaXg7XG4gICAgaG9va3MubW9udGhzID0gbGlzdE1vbnRocztcbiAgICBob29rcy5pc0RhdGUgPSBpc0RhdGU7XG4gICAgaG9va3MubG9jYWxlID0gZ2V0U2V0R2xvYmFsTG9jYWxlO1xuICAgIGhvb2tzLmludmFsaWQgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb247XG4gICAgaG9va3MuaXNNb21lbnQgPSBpc01vbWVudDtcbiAgICBob29rcy53ZWVrZGF5cyA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSA9IGdldExvY2FsZTtcbiAgICBob29rcy5pc0R1cmF0aW9uID0gaXNEdXJhdGlvbjtcbiAgICBob29rcy5tb250aHNTaG9ydCA9IGxpc3RNb250aHNTaG9ydDtcbiAgICBob29rcy53ZWVrZGF5c01pbiA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgPSBsaXN0TG9jYWxlcztcbiAgICBob29rcy53ZWVrZGF5c1Nob3J0ID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG4gICAgaG9va3Mubm9ybWFsaXplVW5pdHMgPSBub3JtYWxpemVVbml0cztcbiAgICBob29rcy5yZWxhdGl2ZVRpbWVSb3VuZGluZyA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCA9IGdldENhbGVuZGFyRm9ybWF0O1xuICAgIGhvb2tzLnByb3RvdHlwZSA9IHByb3RvO1xuXG4gICAgLy8gY3VycmVudGx5IEhUTUw1IGlucHV0IHR5cGUgb25seSBzdXBwb3J0cyAyNC1ob3VyIGZvcm1hdHNcbiAgICBob29rcy5IVE1MNV9GTVQgPSB7XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMOiAnWVlZWS1NTS1ERFRISDptbScsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9TRUNPTkRTOiAnWVlZWS1NTS1ERFRISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdGVwPVwiMVwiIC8+XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMX01TOiAnWVlZWS1NTS1ERFRISDptbTpzcy5TU1MnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgREFURTogJ1lZWVktTU0tREQnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGVcIiAvPlxuICAgICAgICBUSU1FOiAnSEg6bW0nLCAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiAvPlxuICAgICAgICBUSU1FX1NFQ09ORFM6ICdISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIFdFRUs6ICdHR0dHLVtXXVdXJywgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJywgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgIHJldHVybiBob29rcztcblxufSkpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBvbWl0KG9iaiwgZmllbGRzKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItb2JqZWN0LXNwcmVhZFxuICB2YXIgc2hhbGxvd0NvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGtleSA9IGZpZWxkc1tpXTtcbiAgICBkZWxldGUgc2hhbGxvd0NvcHlba2V5XTtcbiAgfVxuXG4gIHJldHVybiBzaGFsbG93Q29weTtcbn1cblxudmFyIF9kZWZhdWx0ID0gb21pdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi4yXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBnZXROYW5vU2Vjb25kcywgaHJ0aW1lLCBsb2FkVGltZSwgbW9kdWxlTG9hZFRpbWUsIG5vZGVMb2FkVGltZSwgdXBUaW1lO1xuXG4gIGlmICgodHlwZW9mIHBlcmZvcm1hbmNlICE9PSBcInVuZGVmaW5lZFwiICYmIHBlcmZvcm1hbmNlICE9PSBudWxsKSAmJiBwZXJmb3JtYW5jZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MgIT09IG51bGwpICYmIHByb2Nlc3MuaHJ0aW1lKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAoZ2V0TmFub1NlY29uZHMoKSAtIG5vZGVMb2FkVGltZSkgLyAxZTY7XG4gICAgfTtcbiAgICBocnRpbWUgPSBwcm9jZXNzLmhydGltZTtcbiAgICBnZXROYW5vU2Vjb25kcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGhyO1xuICAgICAgaHIgPSBocnRpbWUoKTtcbiAgICAgIHJldHVybiBoclswXSAqIDFlOSArIGhyWzFdO1xuICAgIH07XG4gICAgbW9kdWxlTG9hZFRpbWUgPSBnZXROYW5vU2Vjb25kcygpO1xuICAgIHVwVGltZSA9IHByb2Nlc3MudXB0aW1lKCkgKiAxZTk7XG4gICAgbm9kZUxvYWRUaW1lID0gbW9kdWxlTG9hZFRpbWUgLSB1cFRpbWU7XG4gIH0gZWxzZSBpZiAoRGF0ZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBsb2FkVGltZTtcbiAgICB9O1xuICAgIGxvYWRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbG9hZFRpbWU7XG4gICAgfTtcbiAgICBsb2FkVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG5cbn0pLmNhbGwodGhpcyk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBlcmZvcm1hbmNlLW5vdy5qcy5tYXBcbiIsInZhciBub3cgPSByZXF1aXJlKCdwZXJmb3JtYW5jZS1ub3cnKVxuICAsIHJvb3QgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvd1xuICAsIHZlbmRvcnMgPSBbJ21veicsICd3ZWJraXQnXVxuICAsIHN1ZmZpeCA9ICdBbmltYXRpb25GcmFtZSdcbiAgLCByYWYgPSByb290WydyZXF1ZXN0JyArIHN1ZmZpeF1cbiAgLCBjYWYgPSByb290WydjYW5jZWwnICsgc3VmZml4XSB8fCByb290WydjYW5jZWxSZXF1ZXN0JyArIHN1ZmZpeF1cblxuZm9yKHZhciBpID0gMDsgIXJhZiAmJiBpIDwgdmVuZG9ycy5sZW5ndGg7IGkrKykge1xuICByYWYgPSByb290W3ZlbmRvcnNbaV0gKyAnUmVxdWVzdCcgKyBzdWZmaXhdXG4gIGNhZiA9IHJvb3RbdmVuZG9yc1tpXSArICdDYW5jZWwnICsgc3VmZml4XVxuICAgICAgfHwgcm9vdFt2ZW5kb3JzW2ldICsgJ0NhbmNlbFJlcXVlc3QnICsgc3VmZml4XVxufVxuXG4vLyBTb21lIHZlcnNpb25zIG9mIEZGIGhhdmUgckFGIGJ1dCBub3QgY0FGXG5pZighcmFmIHx8ICFjYWYpIHtcbiAgdmFyIGxhc3QgPSAwXG4gICAgLCBpZCA9IDBcbiAgICAsIHF1ZXVlID0gW11cbiAgICAsIGZyYW1lRHVyYXRpb24gPSAxMDAwIC8gNjBcblxuICByYWYgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIGlmKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdmFyIF9ub3cgPSBub3coKVxuICAgICAgICAsIG5leHQgPSBNYXRoLm1heCgwLCBmcmFtZUR1cmF0aW9uIC0gKF9ub3cgLSBsYXN0KSlcbiAgICAgIGxhc3QgPSBuZXh0ICsgX25vd1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNwID0gcXVldWUuc2xpY2UoMClcbiAgICAgICAgLy8gQ2xlYXIgcXVldWUgaGVyZSB0byBwcmV2ZW50XG4gICAgICAgIC8vIGNhbGxiYWNrcyBmcm9tIGFwcGVuZGluZyBsaXN0ZW5lcnNcbiAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgZnJhbWUncyBxdWV1ZVxuICAgICAgICBxdWV1ZS5sZW5ndGggPSAwXG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmKCFjcFtpXS5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgY3BbaV0uY2FsbGJhY2sobGFzdClcbiAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0aHJvdyBlIH0sIDApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBNYXRoLnJvdW5kKG5leHQpKVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKHtcbiAgICAgIGhhbmRsZTogKytpZCxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgIGNhbmNlbGxlZDogZmFsc2VcbiAgICB9KVxuICAgIHJldHVybiBpZFxuICB9XG5cbiAgY2FmID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZihxdWV1ZVtpXS5oYW5kbGUgPT09IGhhbmRsZSkge1xuICAgICAgICBxdWV1ZVtpXS5jYW5jZWxsZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4pIHtcbiAgLy8gV3JhcCBpbiBhIG5ldyBmdW5jdGlvbiB0byBwcmV2ZW50XG4gIC8vIGBjYW5jZWxgIHBvdGVudGlhbGx5IGJlaW5nIGFzc2lnbmVkXG4gIC8vIHRvIHRoZSBuYXRpdmUgckFGIGZ1bmN0aW9uXG4gIHJldHVybiByYWYuY2FsbChyb290LCBmbilcbn1cbm1vZHVsZS5leHBvcnRzLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICBjYWYuYXBwbHkocm9vdCwgYXJndW1lbnRzKVxufVxubW9kdWxlLmV4cG9ydHMucG9seWZpbGwgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICBvYmplY3QgPSByb290O1xuICB9XG4gIG9iamVjdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSByYWZcbiAgb2JqZWN0LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gY2FmXG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmVmMiA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yZWZcIik7XG5cbnZhciBfaXNWaXNpYmxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2lzVmlzaWJsZVwiKSk7XG5cbnZhciBfZG9tQWxpZ24gPSByZXF1aXJlKFwiZG9tLWFsaWduXCIpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbnZhciBfdXNlQnVmZmVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlQnVmZmVyXCIpKTtcblxuLyoqXG4gKiBSZW1vdmVkIHByb3BzOlxuICogIC0gY2hpbGRyZW5Qcm9wc1xuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50KGZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGZ1bmMoKTtcbn1cblxuZnVuY3Rpb24gZ2V0UG9pbnQocG9pbnQpIHtcbiAgaWYgKCgwLCBfdHlwZW9mMi5kZWZhdWx0KShwb2ludCkgIT09ICdvYmplY3QnIHx8ICFwb2ludCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBwb2ludDtcbn1cblxudmFyIEFsaWduID0gZnVuY3Rpb24gQWxpZ24oX3JlZiwgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgICB0YXJnZXQgPSBfcmVmLnRhcmdldCxcbiAgICAgIGFsaWduID0gX3JlZi5hbGlnbixcbiAgICAgIG9uQWxpZ24gPSBfcmVmLm9uQWxpZ24sXG4gICAgICBtb25pdG9yV2luZG93UmVzaXplID0gX3JlZi5tb25pdG9yV2luZG93UmVzaXplLFxuICAgICAgX3JlZiRtb25pdG9yQnVmZmVyVGltID0gX3JlZi5tb25pdG9yQnVmZmVyVGltZSxcbiAgICAgIG1vbml0b3JCdWZmZXJUaW1lID0gX3JlZiRtb25pdG9yQnVmZmVyVGltID09PSB2b2lkIDAgPyAwIDogX3JlZiRtb25pdG9yQnVmZmVyVGltO1xuXG4gIHZhciBjYWNoZVJlZiA9IF9yZWFjdC5kZWZhdWx0LnVzZVJlZih7fSk7XG5cbiAgdmFyIG5vZGVSZWYgPSBfcmVhY3QuZGVmYXVsdC51c2VSZWYoKTtcblxuICB2YXIgY2hpbGROb2RlID0gX3JlYWN0LmRlZmF1bHQuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7IC8vID09PT09PT09PT09PT09PT09PT09PSBBbGlnbiA9PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFdlIHNhdmUgdGhlIHByb3BzIGhlcmUgdG8gYXZvaWQgY2xvc3VyZSBtYWtlcyBwcm9wcyBvb2RcblxuXG4gIHZhciBmb3JjZUFsaWduUHJvcHNSZWYgPSBfcmVhY3QuZGVmYXVsdC51c2VSZWYoe30pO1xuXG4gIGZvcmNlQWxpZ25Qcm9wc1JlZi5jdXJyZW50LmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gIGZvcmNlQWxpZ25Qcm9wc1JlZi5jdXJyZW50LnRhcmdldCA9IHRhcmdldDtcbiAgZm9yY2VBbGlnblByb3BzUmVmLmN1cnJlbnQub25BbGlnbiA9IG9uQWxpZ247XG5cbiAgdmFyIF91c2VCdWZmZXIgPSAoMCwgX3VzZUJ1ZmZlcjMuZGVmYXVsdCkoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfZm9yY2VBbGlnblByb3BzUmVmJGMgPSBmb3JjZUFsaWduUHJvcHNSZWYuY3VycmVudCxcbiAgICAgICAgbGF0ZXN0RGlzYWJsZWQgPSBfZm9yY2VBbGlnblByb3BzUmVmJGMuZGlzYWJsZWQsXG4gICAgICAgIGxhdGVzdFRhcmdldCA9IF9mb3JjZUFsaWduUHJvcHNSZWYkYy50YXJnZXQ7XG5cbiAgICBpZiAoIWxhdGVzdERpc2FibGVkICYmIGxhdGVzdFRhcmdldCkge1xuICAgICAgdmFyIHNvdXJjZSA9IG5vZGVSZWYuY3VycmVudDtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICB2YXIgZWxlbWVudCA9IGdldEVsZW1lbnQobGF0ZXN0VGFyZ2V0KTtcbiAgICAgIHZhciBwb2ludCA9IGdldFBvaW50KGxhdGVzdFRhcmdldCk7XG4gICAgICBjYWNoZVJlZi5jdXJyZW50LmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgY2FjaGVSZWYuY3VycmVudC5wb2ludCA9IHBvaW50OyAvLyBJRSBsb3NlIGZvY3VzIGFmdGVyIGVsZW1lbnQgcmVhbGlnblxuICAgICAgLy8gV2Ugc2hvdWxkIHJlY29yZCBhY3RpdmVFbGVtZW50IGFuZCByZXN0b3JlIGxhdGVyXG5cbiAgICAgIHZhciBfZG9jdW1lbnQgPSBkb2N1bWVudCxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50ID0gX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7IC8vIFdlIG9ubHkgYWxpZ24gd2hlbiBlbGVtZW50IGlzIHZpc2libGVcblxuICAgICAgaWYgKGVsZW1lbnQgJiYgKDAsIF9pc1Zpc2libGUuZGVmYXVsdCkoZWxlbWVudCkpIHtcbiAgICAgICAgcmVzdWx0ID0gKDAsIF9kb21BbGlnbi5hbGlnbkVsZW1lbnQpKHNvdXJjZSwgZWxlbWVudCwgYWxpZ24pO1xuICAgICAgfSBlbHNlIGlmIChwb2ludCkge1xuICAgICAgICByZXN1bHQgPSAoMCwgX2RvbUFsaWduLmFsaWduUG9pbnQpKHNvdXJjZSwgcG9pbnQsIGFsaWduKTtcbiAgICAgIH1cblxuICAgICAgKDAsIF91dGlsLnJlc3RvcmVGb2N1cykoYWN0aXZlRWxlbWVudCwgc291cmNlKTtcblxuICAgICAgaWYgKG9uQWxpZ24gJiYgcmVzdWx0KSB7XG4gICAgICAgIG9uQWxpZ24oc291cmNlLCByZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIG1vbml0b3JCdWZmZXJUaW1lKSxcbiAgICAgIF91c2VCdWZmZXIyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlQnVmZmVyLCAyKSxcbiAgICAgIF9mb3JjZUFsaWduID0gX3VzZUJ1ZmZlcjJbMF0sXG4gICAgICBjYW5jZWxGb3JjZUFsaWduID0gX3VzZUJ1ZmZlcjJbMV07IC8vID09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExpc3RlbiBmb3IgdGFyZ2V0IHVwZGF0ZWRcblxuXG4gIHZhciByZXNpemVNb25pdG9yID0gX3JlYWN0LmRlZmF1bHQudXNlUmVmKHtcbiAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHt9XG4gIH0pOyAvLyBMaXN0ZW4gZm9yIHNvdXJjZSB1cGRhdGVkXG5cblxuICB2YXIgc291cmNlUmVzaXplTW9uaXRvciA9IF9yZWFjdC5kZWZhdWx0LnVzZVJlZih7XG4gICAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7fVxuICB9KTtcblxuICBfcmVhY3QuZGVmYXVsdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbGVtZW50ID0gZ2V0RWxlbWVudCh0YXJnZXQpO1xuICAgIHZhciBwb2ludCA9IGdldFBvaW50KHRhcmdldCk7XG5cbiAgICBpZiAobm9kZVJlZi5jdXJyZW50ICE9PSBzb3VyY2VSZXNpemVNb25pdG9yLmN1cnJlbnQuZWxlbWVudCkge1xuICAgICAgc291cmNlUmVzaXplTW9uaXRvci5jdXJyZW50LmNhbmNlbCgpO1xuICAgICAgc291cmNlUmVzaXplTW9uaXRvci5jdXJyZW50LmVsZW1lbnQgPSBub2RlUmVmLmN1cnJlbnQ7XG4gICAgICBzb3VyY2VSZXNpemVNb25pdG9yLmN1cnJlbnQuY2FuY2VsID0gKDAsIF91dGlsLm1vbml0b3JSZXNpemUpKG5vZGVSZWYuY3VycmVudCwgX2ZvcmNlQWxpZ24pO1xuICAgIH1cblxuICAgIGlmIChjYWNoZVJlZi5jdXJyZW50LmVsZW1lbnQgIT09IGVsZW1lbnQgfHwgISgwLCBfdXRpbC5pc1NhbWVQb2ludCkoY2FjaGVSZWYuY3VycmVudC5wb2ludCwgcG9pbnQpKSB7XG4gICAgICBfZm9yY2VBbGlnbigpOyAvLyBBZGQgcmVzaXplIG9ic2VydmVyXG5cblxuICAgICAgaWYgKHJlc2l6ZU1vbml0b3IuY3VycmVudC5lbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICAgIHJlc2l6ZU1vbml0b3IuY3VycmVudC5jYW5jZWwoKTtcbiAgICAgICAgcmVzaXplTW9uaXRvci5jdXJyZW50LmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICByZXNpemVNb25pdG9yLmN1cnJlbnQuY2FuY2VsID0gKDAsIF91dGlsLm1vbml0b3JSZXNpemUpKGVsZW1lbnQsIF9mb3JjZUFsaWduKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pOyAvLyBMaXN0ZW4gZm9yIGRpc2FibGVkIGNoYW5nZVxuXG5cbiAgX3JlYWN0LmRlZmF1bHQudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICBfZm9yY2VBbGlnbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW5jZWxGb3JjZUFsaWduKCk7XG4gICAgfVxuICB9LCBbZGlzYWJsZWRdKTsgLy8gTGlzdGVuIGZvciB3aW5kb3cgcmVzaXplXG5cblxuICB2YXIgd2luUmVzaXplUmVmID0gX3JlYWN0LmRlZmF1bHQudXNlUmVmKG51bGwpO1xuXG4gIF9yZWFjdC5kZWZhdWx0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1vbml0b3JXaW5kb3dSZXNpemUpIHtcbiAgICAgIGlmICghd2luUmVzaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgd2luUmVzaXplUmVmLmN1cnJlbnQgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIuZGVmYXVsdCkod2luZG93LCAncmVzaXplJywgX2ZvcmNlQWxpZ24pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAod2luUmVzaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgIHdpblJlc2l6ZVJlZi5jdXJyZW50LnJlbW92ZSgpO1xuICAgICAgd2luUmVzaXplUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfSwgW21vbml0b3JXaW5kb3dSZXNpemVdKTsgLy8gQ2xlYXIgYWxsIGlmIHVubW91bnRcblxuXG4gIF9yZWFjdC5kZWZhdWx0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc2l6ZU1vbml0b3IuY3VycmVudC5jYW5jZWwoKTtcbiAgICAgIHNvdXJjZVJlc2l6ZU1vbml0b3IuY3VycmVudC5jYW5jZWwoKTtcbiAgICAgIGlmICh3aW5SZXNpemVSZWYuY3VycmVudCkgd2luUmVzaXplUmVmLmN1cnJlbnQucmVtb3ZlKCk7XG4gICAgICBjYW5jZWxGb3JjZUFsaWduKCk7XG4gICAgfTtcbiAgfSwgW10pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgX3JlYWN0LmRlZmF1bHQudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9yY2VBbGlnbjogZnVuY3Rpb24gZm9yY2VBbGlnbigpIHtcbiAgICAgICAgcmV0dXJuIF9mb3JjZUFsaWduKHRydWUpO1xuICAgICAgfVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgaWYgKF9yZWFjdC5kZWZhdWx0LmlzVmFsaWRFbGVtZW50KGNoaWxkTm9kZSkpIHtcbiAgICBjaGlsZE5vZGUgPSBfcmVhY3QuZGVmYXVsdC5jbG9uZUVsZW1lbnQoY2hpbGROb2RlLCB7XG4gICAgICByZWY6ICgwLCBfcmVmMi5jb21wb3NlUmVmKShjaGlsZE5vZGUucmVmLCBub2RlUmVmKVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkTm9kZTtcbn07XG5cbnZhciBSZWZBbGlnbiA9IF9yZWFjdC5kZWZhdWx0LmZvcndhcmRSZWYoQWxpZ24pO1xuXG5SZWZBbGlnbi5kaXNwbGF5TmFtZSA9ICdBbGlnbic7XG52YXIgX2RlZmF1bHQgPSBSZWZBbGlnbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9kZWZhdWx0ID0gZnVuY3Rpb24gX2RlZmF1bHQoY2FsbGJhY2ssIGJ1ZmZlcikge1xuICB2YXIgY2FsbGVkUmVmID0gX3JlYWN0LmRlZmF1bHQudXNlUmVmKGZhbHNlKTtcblxuICB2YXIgdGltZW91dFJlZiA9IF9yZWFjdC5kZWZhdWx0LnVzZVJlZihudWxsKTtcblxuICBmdW5jdGlvbiBjYW5jZWxUcmlnZ2VyKCkge1xuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaWdnZXIoZm9yY2UpIHtcbiAgICBpZiAoIWNhbGxlZFJlZi5jdXJyZW50IHx8IGZvcmNlID09PSB0cnVlKSB7XG4gICAgICBpZiAoY2FsbGJhY2soKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgLy8gTm90IGRlbGF5IHNpbmNlIGNhbGxiYWNrIGNhbmNlbGxlZCBzZWxmXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FsbGVkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgY2FuY2VsVHJpZ2dlcigpO1xuICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfSwgYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FuY2VsVHJpZ2dlcigpO1xuICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICB9LCBidWZmZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbdHJpZ2dlciwgZnVuY3Rpb24gKCkge1xuICAgIGNhbGxlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgY2FuY2VsVHJpZ2dlcigpO1xuICB9XTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9BbGlnbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQWxpZ25cIikpO1xuXG4vLyBleHBvcnQgdGhpcyBwYWNrYWdlJ3MgYXBpXG52YXIgX2RlZmF1bHQgPSBfQWxpZ24uZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNTYW1lUG9pbnQgPSBpc1NhbWVQb2ludDtcbmV4cG9ydHMucmVzdG9yZUZvY3VzID0gcmVzdG9yZUZvY3VzO1xuZXhwb3J0cy5tb25pdG9yUmVzaXplID0gbW9uaXRvclJlc2l6ZTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbFwiKSk7XG5cbnZhciBfY29udGFpbnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vY29udGFpbnNcIikpO1xuXG5mdW5jdGlvbiBpc1NhbWVQb2ludChwcmV2LCBuZXh0KSB7XG4gIGlmIChwcmV2ID09PSBuZXh0KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwcmV2IHx8ICFuZXh0KSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKCdwYWdlWCcgaW4gbmV4dCAmJiAncGFnZVknIGluIG5leHQpIHtcbiAgICByZXR1cm4gcHJldi5wYWdlWCA9PT0gbmV4dC5wYWdlWCAmJiBwcmV2LnBhZ2VZID09PSBuZXh0LnBhZ2VZO1xuICB9XG5cbiAgaWYgKCdjbGllbnRYJyBpbiBuZXh0ICYmICdjbGllbnRZJyBpbiBuZXh0KSB7XG4gICAgcmV0dXJuIHByZXYuY2xpZW50WCA9PT0gbmV4dC5jbGllbnRYICYmIHByZXYuY2xpZW50WSA9PT0gbmV4dC5jbGllbnRZO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlRm9jdXMoYWN0aXZlRWxlbWVudCwgY29udGFpbmVyKSB7XG4gIC8vIEZvY3VzIGJhY2sgaWYgaXMgaW4gdGhlIGNvbnRhaW5lclxuICBpZiAoYWN0aXZlRWxlbWVudCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoMCwgX2NvbnRhaW5zLmRlZmF1bHQpKGNvbnRhaW5lciwgYWN0aXZlRWxlbWVudCkgJiYgdHlwZW9mIGFjdGl2ZUVsZW1lbnQuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhY3RpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW9uaXRvclJlc2l6ZShlbGVtZW50LCBjYWxsYmFjaykge1xuICB2YXIgcHJldldpZHRoID0gbnVsbDtcbiAgdmFyIHByZXZIZWlnaHQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIG9uUmVzaXplKF9yZWYpIHtcbiAgICB2YXIgX3JlZjIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9yZWYsIDEpLFxuICAgICAgICB0YXJnZXQgPSBfcmVmMlswXS50YXJnZXQ7XG5cbiAgICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0YXJnZXQpKSByZXR1cm47XG5cbiAgICB2YXIgX3RhcmdldCRnZXRCb3VuZGluZ0NsID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICB3aWR0aCA9IF90YXJnZXQkZ2V0Qm91bmRpbmdDbC53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLmhlaWdodDtcblxuICAgIHZhciBmaXhlZFdpZHRoID0gTWF0aC5mbG9vcih3aWR0aCk7XG4gICAgdmFyIGZpeGVkSGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQpO1xuXG4gICAgaWYgKHByZXZXaWR0aCAhPT0gZml4ZWRXaWR0aCB8fCBwcmV2SGVpZ2h0ICE9PSBmaXhlZEhlaWdodCkge1xuICAgICAgLy8gaHR0cHM6Ly93ZWJraXQub3JnL2Jsb2cvOTk5Ny9yZXNpemVvYnNlcnZlci1pbi13ZWJraXQvXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2soe1xuICAgICAgICAgIHdpZHRoOiBmaXhlZFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogZml4ZWRIZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcmV2V2lkdGggPSBmaXhlZFdpZHRoO1xuICAgIHByZXZIZWlnaHQgPSBmaXhlZEhlaWdodDtcbiAgfVxuXG4gIHZhciByZXNpemVPYnNlcnZlciA9IG5ldyBfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbC5kZWZhdWx0KG9uUmVzaXplKTtcblxuICBpZiAoZWxlbWVudCkge1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF91bnNhZmVMaWZlY3ljbGVzUG9seWZpbGwgPSByZXF1aXJlKCdyYy11dGlsL2xpYi91bnNhZmVMaWZlY3ljbGVzUG9seWZpbGwnKTtcblxudmFyIF91bnNhZmVMaWZlY3ljbGVzUG9seWZpbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdW5zYWZlTGlmZWN5Y2xlc1BvbHlmaWxsKTtcblxudmFyIF9DaGlsZHJlblV0aWxzID0gcmVxdWlyZSgnLi9DaGlsZHJlblV0aWxzJyk7XG5cbnZhciBfQW5pbWF0ZUNoaWxkID0gcmVxdWlyZSgnLi9BbmltYXRlQ2hpbGQnKTtcblxudmFyIF9BbmltYXRlQ2hpbGQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQW5pbWF0ZUNoaWxkKTtcblxudmFyIF9hbmltYXRlID0gcmVxdWlyZSgnLi91dGlsL2FuaW1hdGUnKTtcblxudmFyIF9hbmltYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FuaW1hdGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH0gLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cblxuXG52YXIgZGVmYXVsdEtleSA9ICdyY19hbmltYXRlXycgKyBEYXRlLm5vdygpO1xuXG5mdW5jdGlvbiBnZXRDaGlsZHJlbkZyb21Qcm9wcyhwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgaWYgKF9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICBpZiAoIWNoaWxkcmVuLmtleSkge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgICAga2V5OiBkZWZhdWx0S2V5XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIEFuaW1hdGUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQW5pbWF0ZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQW5pbWF0ZShwcm9wcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRlKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChBbmltYXRlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQW5pbWF0ZSkpLmNhbGwodGhpcywgcHJvcHMpKTtcblxuICAgIF9pbml0aWFsaXNlUHJvcHMuY2FsbChfdGhpcyk7XG5cbiAgICBfdGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzID0ge307XG4gICAgX3RoaXMua2V5c1RvRW50ZXIgPSBbXTtcbiAgICBfdGhpcy5rZXlzVG9MZWF2ZSA9IFtdO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBjaGlsZHJlbjogKDAsIF9DaGlsZHJlblV0aWxzLnRvQXJyYXlDaGlsZHJlbikoZ2V0Q2hpbGRyZW5Gcm9tUHJvcHMocHJvcHMpKVxuICAgIH07XG5cbiAgICBfdGhpcy5jaGlsZHJlblJlZnMgPSB7fTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gIF9jcmVhdGVDbGFzcyhBbmltYXRlLCBbe1xuICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHNob3dQcm9wID0gdGhpcy5wcm9wcy5zaG93UHJvcDtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuc3RhdGUuY2hpbGRyZW47XG4gICAgICBpZiAoc2hvd1Byb3ApIHtcbiAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgcmV0dXJuICEhY2hpbGQucHJvcHNbc2hvd1Byb3BdO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgIF90aGlzMi5wZXJmb3JtQXBwZWFyKGNoaWxkLmtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHRoaXMubmV4dFByb3BzID0gbmV4dFByb3BzO1xuICAgICAgdmFyIG5leHRDaGlsZHJlbiA9ICgwLCBfQ2hpbGRyZW5VdGlscy50b0FycmF5Q2hpbGRyZW4pKGdldENoaWxkcmVuRnJvbVByb3BzKG5leHRQcm9wcykpO1xuICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIC8vIGV4Y2x1c2l2ZSBuZWVkcyBpbW1lZGlhdGUgcmVzcG9uc2VcbiAgICAgIGlmIChwcm9wcy5leGNsdXNpdmUpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBfdGhpczMuc3RvcChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBzaG93UHJvcCA9IHByb3BzLnNob3dQcm9wO1xuICAgICAgdmFyIGN1cnJlbnRseUFuaW1hdGluZ0tleXMgPSB0aGlzLmN1cnJlbnRseUFuaW1hdGluZ0tleXM7XG4gICAgICAvLyBsYXN0IHByb3BzIGNoaWxkcmVuIGlmIGV4Y2x1c2l2ZVxuICAgICAgdmFyIGN1cnJlbnRDaGlsZHJlbiA9IHByb3BzLmV4Y2x1c2l2ZSA/ICgwLCBfQ2hpbGRyZW5VdGlscy50b0FycmF5Q2hpbGRyZW4pKGdldENoaWxkcmVuRnJvbVByb3BzKHByb3BzKSkgOiB0aGlzLnN0YXRlLmNoaWxkcmVuO1xuICAgICAgLy8gaW4gY2FzZSBkZXN0cm95IGluIHNob3dQcm9wIG1vZGVcbiAgICAgIHZhciBuZXdDaGlsZHJlbiA9IFtdO1xuICAgICAgaWYgKHNob3dQcm9wKSB7XG4gICAgICAgIGN1cnJlbnRDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50Q2hpbGQpIHtcbiAgICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VycmVudENoaWxkICYmICgwLCBfQ2hpbGRyZW5VdGlscy5maW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkpKG5leHRDaGlsZHJlbiwgY3VycmVudENoaWxkLmtleSk7XG4gICAgICAgICAgdmFyIG5ld0NoaWxkID0gdm9pZCAwO1xuICAgICAgICAgIGlmICgoIW5leHRDaGlsZCB8fCAhbmV4dENoaWxkLnByb3BzW3Nob3dQcm9wXSkgJiYgY3VycmVudENoaWxkLnByb3BzW3Nob3dQcm9wXSkge1xuICAgICAgICAgICAgbmV3Q2hpbGQgPSBfcmVhY3QyWydkZWZhdWx0J10uY2xvbmVFbGVtZW50KG5leHRDaGlsZCB8fCBjdXJyZW50Q2hpbGQsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgc2hvd1Byb3AsIHRydWUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3Q2hpbGQgPSBuZXh0Q2hpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdDaGlsZCkge1xuICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChuZXdDaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbmV4dENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKG5leHRDaGlsZCkge1xuICAgICAgICAgIGlmICghbmV4dENoaWxkIHx8ICEoMCwgX0NoaWxkcmVuVXRpbHMuZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5KShjdXJyZW50Q2hpbGRyZW4sIG5leHRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKG5leHRDaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0NoaWxkcmVuID0gKDAsIF9DaGlsZHJlblV0aWxzLm1lcmdlQ2hpbGRyZW4pKGN1cnJlbnRDaGlsZHJlbiwgbmV4dENoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgLy8gbmVlZCByZW5kZXIgdG8gYXZvaWQgdXBkYXRlXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY2hpbGRyZW46IG5ld0NoaWxkcmVuXG4gICAgICB9KTtcblxuICAgICAgbmV4dENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBrZXkgPSBjaGlsZCAmJiBjaGlsZC5rZXk7XG4gICAgICAgIGlmIChjaGlsZCAmJiBjdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhhc1ByZXYgPSBjaGlsZCAmJiAoMCwgX0NoaWxkcmVuVXRpbHMuZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5KShjdXJyZW50Q2hpbGRyZW4sIGtleSk7XG4gICAgICAgIGlmIChzaG93UHJvcCkge1xuICAgICAgICAgIHZhciBzaG93SW5OZXh0ID0gY2hpbGQucHJvcHNbc2hvd1Byb3BdO1xuICAgICAgICAgIGlmIChoYXNQcmV2KSB7XG4gICAgICAgICAgICB2YXIgc2hvd0luTm93ID0gKDAsIF9DaGlsZHJlblV0aWxzLmZpbmRTaG93bkNoaWxkSW5DaGlsZHJlbkJ5S2V5KShjdXJyZW50Q2hpbGRyZW4sIGtleSwgc2hvd1Byb3ApO1xuICAgICAgICAgICAgaWYgKCFzaG93SW5Ob3cgJiYgc2hvd0luTmV4dCkge1xuICAgICAgICAgICAgICBfdGhpczMua2V5c1RvRW50ZXIucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd0luTmV4dCkge1xuICAgICAgICAgICAgX3RoaXMzLmtleXNUb0VudGVyLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc1ByZXYpIHtcbiAgICAgICAgICBfdGhpczMua2V5c1RvRW50ZXIucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY3VycmVudENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBrZXkgPSBjaGlsZCAmJiBjaGlsZC5rZXk7XG4gICAgICAgIGlmIChjaGlsZCAmJiBjdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhhc05leHQgPSBjaGlsZCAmJiAoMCwgX0NoaWxkcmVuVXRpbHMuZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5KShuZXh0Q2hpbGRyZW4sIGtleSk7XG4gICAgICAgIGlmIChzaG93UHJvcCkge1xuICAgICAgICAgIHZhciBzaG93SW5Ob3cgPSBjaGlsZC5wcm9wc1tzaG93UHJvcF07XG4gICAgICAgICAgaWYgKGhhc05leHQpIHtcbiAgICAgICAgICAgIHZhciBzaG93SW5OZXh0ID0gKDAsIF9DaGlsZHJlblV0aWxzLmZpbmRTaG93bkNoaWxkSW5DaGlsZHJlbkJ5S2V5KShuZXh0Q2hpbGRyZW4sIGtleSwgc2hvd1Byb3ApO1xuICAgICAgICAgICAgaWYgKCFzaG93SW5OZXh0ICYmIHNob3dJbk5vdykge1xuICAgICAgICAgICAgICBfdGhpczMua2V5c1RvTGVhdmUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd0luTm93KSB7XG4gICAgICAgICAgICBfdGhpczMua2V5c1RvTGVhdmUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaGFzTmV4dCkge1xuICAgICAgICAgIF90aGlzMy5rZXlzVG9MZWF2ZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHZhciBrZXlzVG9FbnRlciA9IHRoaXMua2V5c1RvRW50ZXI7XG4gICAgICB0aGlzLmtleXNUb0VudGVyID0gW107XG4gICAgICBrZXlzVG9FbnRlci5mb3JFYWNoKHRoaXMucGVyZm9ybUVudGVyKTtcbiAgICAgIHZhciBrZXlzVG9MZWF2ZSA9IHRoaXMua2V5c1RvTGVhdmU7XG4gICAgICB0aGlzLmtleXNUb0xlYXZlID0gW107XG4gICAgICBrZXlzVG9MZWF2ZS5mb3JFYWNoKHRoaXMucGVyZm9ybUxlYXZlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkQ2hpbGRCeUtleScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWRDaGlsZEJ5S2V5KGN1cnJlbnRDaGlsZHJlbiwga2V5KSB7XG4gICAgICB2YXIgc2hvd1Byb3AgPSB0aGlzLnByb3BzLnNob3dQcm9wO1xuICAgICAgaWYgKHNob3dQcm9wKSB7XG4gICAgICAgIHJldHVybiAoMCwgX0NoaWxkcmVuVXRpbHMuZmluZFNob3duQ2hpbGRJbkNoaWxkcmVuQnlLZXkpKGN1cnJlbnRDaGlsZHJlbiwga2V5LCBzaG93UHJvcCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKDAsIF9DaGlsZHJlblV0aWxzLmZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleSkoY3VycmVudENoaWxkcmVuLCBrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3N0b3AnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKGtleSkge1xuICAgICAgZGVsZXRlIHRoaXMuY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY2hpbGRyZW5SZWZzW2tleV07XG4gICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB0aGlzLm5leHRQcm9wcyA9IHByb3BzO1xuICAgICAgdmFyIHN0YXRlQ2hpbGRyZW4gPSB0aGlzLnN0YXRlLmNoaWxkcmVuO1xuICAgICAgdmFyIGNoaWxkcmVuID0gbnVsbDtcbiAgICAgIGlmIChzdGF0ZUNoaWxkcmVuKSB7XG4gICAgICAgIGNoaWxkcmVuID0gc3RhdGVDaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjaGlsZC5rZXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzZXQga2V5IGZvciA8cmMtYW5pbWF0ZT4gY2hpbGRyZW4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgX0FuaW1hdGVDaGlsZDJbJ2RlZmF1bHQnXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBjaGlsZC5rZXksXG4gICAgICAgICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBfdGhpczQuY2hpbGRyZW5SZWZzW2NoaWxkLmtleV0gPSBub2RlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhbmltYXRpb246IHByb3BzLmFuaW1hdGlvbixcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbk5hbWU6IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgICAgICAgICAgICB0cmFuc2l0aW9uRW50ZXI6IHByb3BzLnRyYW5zaXRpb25FbnRlcixcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbkFwcGVhcjogcHJvcHMudHJhbnNpdGlvbkFwcGVhcixcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbkxlYXZlOiBwcm9wcy50cmFuc2l0aW9uTGVhdmVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIENvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudDtcbiAgICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIHBhc3NlZFByb3BzID0gcHJvcHM7XG4gICAgICAgIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHBhc3NlZFByb3BzID0gX2V4dGVuZHMoe1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgICBzdHlsZTogcHJvcHMuc3R5bGVcbiAgICAgICAgICB9LCBwcm9wcy5jb21wb25lbnRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICBwYXNzZWRQcm9wcyxcbiAgICAgICAgICBjaGlsZHJlblxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuWzBdIHx8IG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFuaW1hdGU7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5BbmltYXRlLmlzQW5pbWF0ZSA9IHRydWU7XG5BbmltYXRlLmRlZmF1bHRQcm9wcyA9IHtcbiAgYW5pbWF0aW9uOiB7fSxcbiAgY29tcG9uZW50OiAnc3BhbicsXG4gIGNvbXBvbmVudFByb3BzOiB7fSxcbiAgdHJhbnNpdGlvbkVudGVyOiB0cnVlLFxuICB0cmFuc2l0aW9uTGVhdmU6IHRydWUsXG4gIHRyYW5zaXRpb25BcHBlYXI6IGZhbHNlLFxuICBvbkVuZDogbm9vcCxcbiAgb25FbnRlcjogbm9vcCxcbiAgb25MZWF2ZTogbm9vcCxcbiAgb25BcHBlYXI6IG5vb3Bcbn07XG5cbnZhciBfaW5pdGlhbGlzZVByb3BzID0gZnVuY3Rpb24gX2luaXRpYWxpc2VQcm9wcygpIHtcbiAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgdGhpcy5wZXJmb3JtRW50ZXIgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgLy8gbWF5IGFscmVhZHkgcmVtb3ZlIGJ5IGV4Y2x1c2l2ZVxuICAgIGlmIChfdGhpczUuY2hpbGRyZW5SZWZzW2tleV0pIHtcbiAgICAgIF90aGlzNS5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV0gPSB0cnVlO1xuICAgICAgX3RoaXM1LmNoaWxkcmVuUmVmc1trZXldLmNvbXBvbmVudFdpbGxFbnRlcihfdGhpczUuaGFuZGxlRG9uZUFkZGluZy5iaW5kKF90aGlzNSwga2V5LCAnZW50ZXInKSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucGVyZm9ybUFwcGVhciA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoX3RoaXM1LmNoaWxkcmVuUmVmc1trZXldKSB7XG4gICAgICBfdGhpczUuY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldID0gdHJ1ZTtcbiAgICAgIF90aGlzNS5jaGlsZHJlblJlZnNba2V5XS5jb21wb25lbnRXaWxsQXBwZWFyKF90aGlzNS5oYW5kbGVEb25lQWRkaW5nLmJpbmQoX3RoaXM1LCBrZXksICdhcHBlYXInKSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlRG9uZUFkZGluZyA9IGZ1bmN0aW9uIChrZXksIHR5cGUpIHtcbiAgICB2YXIgcHJvcHMgPSBfdGhpczUucHJvcHM7XG4gICAgZGVsZXRlIF90aGlzNS5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV07XG4gICAgLy8gaWYgdXBkYXRlIG9uIGV4Y2x1c2l2ZSBtb2RlLCBza2lwIGNoZWNrXG4gICAgaWYgKHByb3BzLmV4Y2x1c2l2ZSAmJiBwcm9wcyAhPT0gX3RoaXM1Lm5leHRQcm9wcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3VycmVudENoaWxkcmVuID0gKDAsIF9DaGlsZHJlblV0aWxzLnRvQXJyYXlDaGlsZHJlbikoZ2V0Q2hpbGRyZW5Gcm9tUHJvcHMocHJvcHMpKTtcbiAgICBpZiAoIV90aGlzNS5pc1ZhbGlkQ2hpbGRCeUtleShjdXJyZW50Q2hpbGRyZW4sIGtleSkpIHtcbiAgICAgIC8vIGV4Y2x1c2l2ZSB3aWxsIG5vdCBuZWVkIHRoaXNcbiAgICAgIF90aGlzNS5wZXJmb3JtTGVhdmUoa2V5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcHBlYXInKSB7XG4gICAgICBpZiAoX2FuaW1hdGUyWydkZWZhdWx0J10uYWxsb3dBcHBlYXJDYWxsYmFjayhwcm9wcykpIHtcbiAgICAgICAgcHJvcHMub25BcHBlYXIoa2V5KTtcbiAgICAgICAgcHJvcHMub25FbmQoa2V5LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF9hbmltYXRlMlsnZGVmYXVsdCddLmFsbG93RW50ZXJDYWxsYmFjayhwcm9wcykpIHtcbiAgICAgIHByb3BzLm9uRW50ZXIoa2V5KTtcbiAgICAgIHByb3BzLm9uRW5kKGtleSwgdHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gKGtleSkge1xuICAgIC8vIG1heSBhbHJlYWR5IHJlbW92ZSBieSBleGNsdXNpdmVcbiAgICBpZiAoX3RoaXM1LmNoaWxkcmVuUmVmc1trZXldKSB7XG4gICAgICBfdGhpczUuY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldID0gdHJ1ZTtcbiAgICAgIF90aGlzNS5jaGlsZHJlblJlZnNba2V5XS5jb21wb25lbnRXaWxsTGVhdmUoX3RoaXM1LmhhbmRsZURvbmVMZWF2aW5nLmJpbmQoX3RoaXM1LCBrZXkpKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVEb25lTGVhdmluZyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcHJvcHMgPSBfdGhpczUucHJvcHM7XG4gICAgZGVsZXRlIF90aGlzNS5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV07XG4gICAgLy8gaWYgdXBkYXRlIG9uIGV4Y2x1c2l2ZSBtb2RlLCBza2lwIGNoZWNrXG4gICAgaWYgKHByb3BzLmV4Y2x1c2l2ZSAmJiBwcm9wcyAhPT0gX3RoaXM1Lm5leHRQcm9wcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3VycmVudENoaWxkcmVuID0gKDAsIF9DaGlsZHJlblV0aWxzLnRvQXJyYXlDaGlsZHJlbikoZ2V0Q2hpbGRyZW5Gcm9tUHJvcHMocHJvcHMpKTtcbiAgICAvLyBpbiBjYXNlIHN0YXRlIGNoYW5nZSBpcyB0b28gZmFzdFxuICAgIGlmIChfdGhpczUuaXNWYWxpZENoaWxkQnlLZXkoY3VycmVudENoaWxkcmVuLCBrZXkpKSB7XG4gICAgICBfdGhpczUucGVyZm9ybUVudGVyKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlbmQgPSBmdW5jdGlvbiBlbmQoKSB7XG4gICAgICAgIGlmIChfYW5pbWF0ZTJbJ2RlZmF1bHQnXS5hbGxvd0xlYXZlQ2FsbGJhY2socHJvcHMpKSB7XG4gICAgICAgICAgcHJvcHMub25MZWF2ZShrZXkpO1xuICAgICAgICAgIHByb3BzLm9uRW5kKGtleSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKCEoMCwgX0NoaWxkcmVuVXRpbHMuaXNTYW1lQ2hpbGRyZW4pKF90aGlzNS5zdGF0ZS5jaGlsZHJlbiwgY3VycmVudENoaWxkcmVuLCBwcm9wcy5zaG93UHJvcCkpIHtcbiAgICAgICAgX3RoaXM1LnNldFN0YXRlKHtcbiAgICAgICAgICBjaGlsZHJlbjogY3VycmVudENoaWxkcmVuXG4gICAgICAgIH0sIGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX3Vuc2FmZUxpZmVjeWNsZXNQb2x5ZmlsbDJbJ2RlZmF1bHQnXSkoQW5pbWF0ZSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9jc3NBbmltYXRpb24gPSByZXF1aXJlKCdAYW50LWRlc2lnbi9jc3MtYW5pbWF0aW9uJyk7XG5cbnZhciBfY3NzQW5pbWF0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nzc0FuaW1hdGlvbik7XG5cbnZhciBfYW5pbWF0ZSA9IHJlcXVpcmUoJy4vdXRpbC9hbmltYXRlJyk7XG5cbnZhciBfYW5pbWF0ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hbmltYXRlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9IC8qIGVzbGludCByZWFjdC9wcm9wLXR5cGVzOiAwICovXG5cblxudmFyIHRyYW5zaXRpb25NYXAgPSB7XG4gIGVudGVyOiAndHJhbnNpdGlvbkVudGVyJyxcbiAgYXBwZWFyOiAndHJhbnNpdGlvbkFwcGVhcicsXG4gIGxlYXZlOiAndHJhbnNpdGlvbkxlYXZlJ1xufTtcblxudmFyIEFuaW1hdGVDaGlsZCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhBbmltYXRlQ2hpbGQsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEFuaW1hdGVDaGlsZCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5pbWF0ZUNoaWxkKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoQW5pbWF0ZUNoaWxkLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQW5pbWF0ZUNoaWxkKSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQW5pbWF0ZUNoaWxkLCBbe1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxVbm1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsRW50ZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsRW50ZXIoZG9uZSkge1xuICAgICAgaWYgKF9hbmltYXRlMlsnZGVmYXVsdCddLmlzRW50ZXJTdXBwb3J0ZWQodGhpcy5wcm9wcykpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uKCdlbnRlcicsIGRvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxBcHBlYXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsQXBwZWFyKGRvbmUpIHtcbiAgICAgIGlmIChfYW5pbWF0ZTJbJ2RlZmF1bHQnXS5pc0FwcGVhclN1cHBvcnRlZCh0aGlzLnByb3BzKSkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb24oJ2FwcGVhcicsIGRvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxMZWF2ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxMZWF2ZShkb25lKSB7XG4gICAgICBpZiAoX2FuaW1hdGUyWydkZWZhdWx0J10uaXNMZWF2ZVN1cHBvcnRlZCh0aGlzLnByb3BzKSkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb24oJ2xlYXZlJywgZG9uZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhbHdheXMgc3luYywgZG8gbm90IGludGVydXB0IHdpdGggcmVhY3QgY29tcG9uZW50IGxpZmUgY3ljbGVcbiAgICAgICAgLy8gdXBkYXRlIGhpZGRlbiAtPiBhbmltYXRlIGhpZGRlbiAtPlxuICAgICAgICAvLyBkaWRVcGRhdGUgLT4gYW5pbWF0ZSBsZWF2ZSAtPiB1bm1vdW50IChpZiBhbmltYXRlIGlzIG5vbmUpXG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0cmFuc2l0aW9uJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdHJhbnNpdGlvbihhbmltYXRpb25UeXBlLCBmaW5pc2hDYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBub2RlID0gX3JlYWN0RG9tMlsnZGVmYXVsdCddLmZpbmRET01Ob2RlKHRoaXMpO1xuICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lO1xuICAgICAgdmFyIG5hbWVJc09iaiA9IHR5cGVvZiB0cmFuc2l0aW9uTmFtZSA9PT0gJ29iamVjdCc7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHZhciBlbmQgPSBmdW5jdGlvbiBlbmQoKSB7XG4gICAgICAgIF90aGlzMi5zdG9wcGVyID0gbnVsbDtcbiAgICAgICAgZmluaXNoQ2FsbGJhY2soKTtcbiAgICAgIH07XG4gICAgICBpZiAoKF9jc3NBbmltYXRpb24uaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQgfHwgIXByb3BzLmFuaW1hdGlvblthbmltYXRpb25UeXBlXSkgJiYgdHJhbnNpdGlvbk5hbWUgJiYgcHJvcHNbdHJhbnNpdGlvbk1hcFthbmltYXRpb25UeXBlXV0pIHtcbiAgICAgICAgdmFyIG5hbWUgPSBuYW1lSXNPYmogPyB0cmFuc2l0aW9uTmFtZVthbmltYXRpb25UeXBlXSA6IHRyYW5zaXRpb25OYW1lICsgJy0nICsgYW5pbWF0aW9uVHlwZTtcbiAgICAgICAgdmFyIGFjdGl2ZU5hbWUgPSBuYW1lICsgJy1hY3RpdmUnO1xuICAgICAgICBpZiAobmFtZUlzT2JqICYmIHRyYW5zaXRpb25OYW1lW2FuaW1hdGlvblR5cGUgKyAnQWN0aXZlJ10pIHtcbiAgICAgICAgICBhY3RpdmVOYW1lID0gdHJhbnNpdGlvbk5hbWVbYW5pbWF0aW9uVHlwZSArICdBY3RpdmUnXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3BwZXIgPSAoMCwgX2Nzc0FuaW1hdGlvbjJbJ2RlZmF1bHQnXSkobm9kZSwge1xuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgYWN0aXZlOiBhY3RpdmVOYW1lXG4gICAgICAgIH0sIGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3BwZXIgPSBwcm9wcy5hbmltYXRpb25bYW5pbWF0aW9uVHlwZV0obm9kZSwgZW5kKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdG9wJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHZhciBzdG9wcGVyID0gdGhpcy5zdG9wcGVyO1xuICAgICAgaWYgKHN0b3BwZXIpIHtcbiAgICAgICAgdGhpcy5zdG9wcGVyID0gbnVsbDtcbiAgICAgICAgc3RvcHBlci5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFuaW1hdGVDaGlsZDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFuaW1hdGVDaGlsZDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudG9BcnJheUNoaWxkcmVuID0gdG9BcnJheUNoaWxkcmVuO1xuZXhwb3J0cy5maW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkgPSBmaW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXk7XG5leHBvcnRzLmZpbmRTaG93bkNoaWxkSW5DaGlsZHJlbkJ5S2V5ID0gZmluZFNob3duQ2hpbGRJbkNoaWxkcmVuQnlLZXk7XG5leHBvcnRzLmZpbmRIaWRkZW5DaGlsZEluQ2hpbGRyZW5CeUtleSA9IGZpbmRIaWRkZW5DaGlsZEluQ2hpbGRyZW5CeUtleTtcbmV4cG9ydHMuaXNTYW1lQ2hpbGRyZW4gPSBpc1NhbWVDaGlsZHJlbjtcbmV4cG9ydHMubWVyZ2VDaGlsZHJlbiA9IG1lcmdlQ2hpbGRyZW47XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiB0b0FycmF5Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIHJldCA9IFtdO1xuICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0LnB1c2goY2hpbGQpO1xuICB9KTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5KGNoaWxkcmVuLCBrZXkpIHtcbiAgdmFyIHJldCA9IG51bGw7XG4gIGlmIChjaGlsZHJlbikge1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICByZXQgPSBjaGlsZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBmaW5kU2hvd25DaGlsZEluQ2hpbGRyZW5CeUtleShjaGlsZHJlbiwga2V5LCBzaG93UHJvcCkge1xuICB2YXIgcmV0ID0gbnVsbDtcbiAgaWYgKGNoaWxkcmVuKSB7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5rZXkgPT09IGtleSAmJiBjaGlsZC5wcm9wc1tzaG93UHJvcF0pIHtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndHdvIGNoaWxkIHdpdGggc2FtZSBrZXkgZm9yIDxyYy1hbmltYXRlPiBjaGlsZHJlbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldCA9IGNoaWxkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRIaWRkZW5DaGlsZEluQ2hpbGRyZW5CeUtleShjaGlsZHJlbiwga2V5LCBzaG93UHJvcCkge1xuICB2YXIgZm91bmQgPSAwO1xuICBpZiAoY2hpbGRyZW4pIHtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvdW5kID0gY2hpbGQgJiYgY2hpbGQua2V5ID09PSBrZXkgJiYgIWNoaWxkLnByb3BzW3Nob3dQcm9wXTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZm91bmQ7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZUNoaWxkcmVuKGMxLCBjMiwgc2hvd1Byb3ApIHtcbiAgdmFyIHNhbWUgPSBjMS5sZW5ndGggPT09IGMyLmxlbmd0aDtcbiAgaWYgKHNhbWUpIHtcbiAgICBjMS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHZhciBjaGlsZDIgPSBjMltpbmRleF07XG4gICAgICBpZiAoY2hpbGQgJiYgY2hpbGQyKSB7XG4gICAgICAgIGlmIChjaGlsZCAmJiAhY2hpbGQyIHx8ICFjaGlsZCAmJiBjaGlsZDIpIHtcbiAgICAgICAgICBzYW1lID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGQua2V5ICE9PSBjaGlsZDIua2V5KSB7XG4gICAgICAgICAgc2FtZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHNob3dQcm9wICYmIGNoaWxkLnByb3BzW3Nob3dQcm9wXSAhPT0gY2hpbGQyLnByb3BzW3Nob3dQcm9wXSkge1xuICAgICAgICAgIHNhbWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzYW1lO1xufVxuXG5mdW5jdGlvbiBtZXJnZUNoaWxkcmVuKHByZXYsIG5leHQpIHtcbiAgdmFyIHJldCA9IFtdO1xuXG4gIC8vIEZvciBlYWNoIGtleSBvZiBgbmV4dGAsIHRoZSBsaXN0IG9mIGtleXMgdG8gaW5zZXJ0IGJlZm9yZSB0aGF0IGtleSBpblxuICAvLyB0aGUgY29tYmluZWQgbGlzdFxuICB2YXIgbmV4dENoaWxkcmVuUGVuZGluZyA9IHt9O1xuICB2YXIgcGVuZGluZ0NoaWxkcmVuID0gW107XG4gIHByZXYuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoY2hpbGQgJiYgZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5KG5leHQsIGNoaWxkLmtleSkpIHtcbiAgICAgIGlmIChwZW5kaW5nQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIG5leHRDaGlsZHJlblBlbmRpbmdbY2hpbGQua2V5XSA9IHBlbmRpbmdDaGlsZHJlbjtcbiAgICAgICAgcGVuZGluZ0NoaWxkcmVuID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlbmRpbmdDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH0pO1xuXG4gIG5leHQuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoY2hpbGQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5leHRDaGlsZHJlblBlbmRpbmcsIGNoaWxkLmtleSkpIHtcbiAgICAgIHJldCA9IHJldC5jb25jYXQobmV4dENoaWxkcmVuUGVuZGluZ1tjaGlsZC5rZXldKTtcbiAgICB9XG4gICAgcmV0LnB1c2goY2hpbGQpO1xuICB9KTtcblxuICByZXQgPSByZXQuY29uY2F0KHBlbmRpbmdDaGlsZHJlbik7XG5cbiAgcmV0dXJuIHJldDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciB1dGlsID0ge1xuICBpc0FwcGVhclN1cHBvcnRlZDogZnVuY3Rpb24gaXNBcHBlYXJTdXBwb3J0ZWQocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbk5hbWUgJiYgcHJvcHMudHJhbnNpdGlvbkFwcGVhciB8fCBwcm9wcy5hbmltYXRpb24uYXBwZWFyO1xuICB9LFxuICBpc0VudGVyU3VwcG9ydGVkOiBmdW5jdGlvbiBpc0VudGVyU3VwcG9ydGVkKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRyYW5zaXRpb25OYW1lICYmIHByb3BzLnRyYW5zaXRpb25FbnRlciB8fCBwcm9wcy5hbmltYXRpb24uZW50ZXI7XG4gIH0sXG4gIGlzTGVhdmVTdXBwb3J0ZWQ6IGZ1bmN0aW9uIGlzTGVhdmVTdXBwb3J0ZWQocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbk5hbWUgJiYgcHJvcHMudHJhbnNpdGlvbkxlYXZlIHx8IHByb3BzLmFuaW1hdGlvbi5sZWF2ZTtcbiAgfSxcbiAgYWxsb3dBcHBlYXJDYWxsYmFjazogZnVuY3Rpb24gYWxsb3dBcHBlYXJDYWxsYmFjayhwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy50cmFuc2l0aW9uQXBwZWFyIHx8IHByb3BzLmFuaW1hdGlvbi5hcHBlYXI7XG4gIH0sXG4gIGFsbG93RW50ZXJDYWxsYmFjazogZnVuY3Rpb24gYWxsb3dFbnRlckNhbGxiYWNrKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRyYW5zaXRpb25FbnRlciB8fCBwcm9wcy5hbmltYXRpb24uZW50ZXI7XG4gIH0sXG4gIGFsbG93TGVhdmVDYWxsYmFjazogZnVuY3Rpb24gYWxsb3dMZWF2ZUNhbGxiYWNrKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRyYW5zaXRpb25MZWF2ZSB8fCBwcm9wcy5hbmltYXRpb24ubGVhdmU7XG4gIH1cbn07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHV0aWw7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIHVuc2FmZUxpZmVjeWNsZXNQb2x5ZmlsbCA9IGZ1bmN0aW9uIHVuc2FmZUxpZmVjeWNsZXNQb2x5ZmlsbChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG5cbiAgaWYgKCFwcm90b3R5cGUgfHwgIXByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBwb2x5ZmlsbCBjbGFzcyBjb21wb25lbnRzJyk7XG4gIH0gLy8gb25seSBoYW5kbGUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1xuXG5cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBDb21wb25lbnQ7XG4gIH0gLy8gSW4gUmVhY3QgMTYuOSwgUmVhY3QuUHJvZmlsZXIgd2FzIGludHJvZHVjZWQgdG9nZXRoZXIgd2l0aCBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1xuICAvLyBodHRwczovL3JlYWN0anMub3JnL2Jsb2cvMjAxOS8wOC8wOC9yZWFjdC12MTYuOS4wLmh0bWwjcGVyZm9ybWFuY2UtbWVhc3VyZW1lbnRzLXdpdGgtcmVhY3Rwcm9maWxlclxuXG5cbiAgaWYgKCFfcmVhY3QuZGVmYXVsdC5Qcm9maWxlcikge1xuICAgIHJldHVybiBDb21wb25lbnQ7XG4gIH0gLy8gSGVyZSBwb2x5ZmlsbCBnZXQgc3RhcnRlZFxuXG5cbiAgcHJvdG90eXBlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gcHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM7XG4gIGRlbGV0ZSBwcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcztcbiAgcmV0dXJuIENvbXBvbmVudDtcbn07XG5cbnZhciBfZGVmYXVsdCA9IHVuc2FmZUxpZmVjeWNsZXNQb2x5ZmlsbDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjVHJpZ2dlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXRyaWdnZXJcIikpO1xuXG52YXIgX3dhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJ3YXJuaW5nXCIpKTtcblxudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvS2V5Q29kZVwiKSk7XG5cbnZhciBfYXJyYXlUcmVlRmlsdGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiYXJyYXktdHJlZS1maWx0ZXJcIikpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5cbnZhciBfTWVudXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL01lbnVzXCIpKTtcblxudmFyIF9wbGFjZW1lbnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wbGFjZW1lbnRzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbnZhciBDYXNjYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQ2FzY2FkZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ2FzY2FkZXIpO1xuXG4gIGZ1bmN0aW9uIENhc2NhZGVyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENhc2NhZGVyKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgX3RoaXMuc2V0UG9wdXBWaXNpYmxlID0gZnVuY3Rpb24gKHBvcHVwVmlzaWJsZSkge1xuICAgICAgdmFyIHZhbHVlID0gX3RoaXMuc3RhdGUudmFsdWU7XG5cbiAgICAgIGlmICghKCdwb3B1cFZpc2libGUnIGluIF90aGlzLnByb3BzKSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcG9wdXBWaXNpYmxlOiBwb3B1cFZpc2libGVcbiAgICAgICAgfSk7XG4gICAgICB9IC8vIHN5bmMgYWN0aXZlVmFsdWUgd2l0aCB2YWx1ZSB3aGVuIHBhbmVsIG9wZW5cblxuXG4gICAgICBpZiAocG9wdXBWaXNpYmxlICYmICFfdGhpcy5zdGF0ZS5wb3B1cFZpc2libGUpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGFjdGl2ZVZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMucHJvcHMub25Qb3B1cFZpc2libGVDaGFuZ2UocG9wdXBWaXNpYmxlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKG9wdGlvbnMsIF9yZWYsIGUpIHtcbiAgICAgIHZhciB2aXNpYmxlID0gX3JlZi52aXNpYmxlO1xuXG4gICAgICBpZiAoZS50eXBlICE9PSAna2V5ZG93bicgfHwgZS5rZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uQ2hhbmdlKG9wdGlvbnMubWFwKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG9bX3RoaXMuZ2V0RmllbGROYW1lKCd2YWx1ZScpXTtcbiAgICAgICAgfSksIG9wdGlvbnMpO1xuXG4gICAgICAgIF90aGlzLnNldFBvcHVwVmlzaWJsZSh2aXNpYmxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlUG9wdXBWaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gKHBvcHVwVmlzaWJsZSkge1xuICAgICAgX3RoaXMuc2V0UG9wdXBWaXNpYmxlKHBvcHVwVmlzaWJsZSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU1lbnVTZWxlY3QgPSBmdW5jdGlvbiAodGFyZ2V0T3B0aW9uLCBtZW51SW5kZXgsIGUpIHtcbiAgICAgIC8vIEtlZXAgZm9jdXNlZCBzdGF0ZSBmb3Iga2V5Ym9hcmQgc3VwcG9ydFxuICAgICAgdmFyIHRyaWdnZXJOb2RlID0gX3RoaXMudHJpZ2dlci5nZXRSb290RG9tTm9kZSgpO1xuXG4gICAgICBpZiAodHJpZ2dlck5vZGUgJiYgdHJpZ2dlck5vZGUuZm9jdXMpIHtcbiAgICAgICAgdHJpZ2dlck5vZGUuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgY2hhbmdlT25TZWxlY3QgPSBfdGhpcyRwcm9wcy5jaGFuZ2VPblNlbGVjdCxcbiAgICAgICAgICBsb2FkRGF0YSA9IF90aGlzJHByb3BzLmxvYWREYXRhLFxuICAgICAgICAgIGV4cGFuZFRyaWdnZXIgPSBfdGhpcyRwcm9wcy5leHBhbmRUcmlnZ2VyO1xuXG4gICAgICBpZiAoIXRhcmdldE9wdGlvbiB8fCB0YXJnZXRPcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWN0aXZlVmFsdWUgPSBfdGhpcy5zdGF0ZS5hY3RpdmVWYWx1ZTtcbiAgICAgIGFjdGl2ZVZhbHVlID0gYWN0aXZlVmFsdWUuc2xpY2UoMCwgbWVudUluZGV4ICsgMSk7XG4gICAgICBhY3RpdmVWYWx1ZVttZW51SW5kZXhdID0gdGFyZ2V0T3B0aW9uW190aGlzLmdldEZpZWxkTmFtZSgndmFsdWUnKV07XG5cbiAgICAgIHZhciBhY3RpdmVPcHRpb25zID0gX3RoaXMuZ2V0QWN0aXZlT3B0aW9ucyhhY3RpdmVWYWx1ZSk7XG5cbiAgICAgIGlmICh0YXJnZXRPcHRpb24uaXNMZWFmID09PSBmYWxzZSAmJiAhdGFyZ2V0T3B0aW9uW190aGlzLmdldEZpZWxkTmFtZSgnY2hpbGRyZW4nKV0gJiYgbG9hZERhdGEpIHtcbiAgICAgICAgaWYgKGNoYW5nZU9uU2VsZWN0KSB7XG4gICAgICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlKGFjdGl2ZU9wdGlvbnMsIHtcbiAgICAgICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgICAgICB9LCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBhY3RpdmVWYWx1ZTogYWN0aXZlVmFsdWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbG9hZERhdGEoYWN0aXZlT3B0aW9ucyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld1N0YXRlID0ge307XG5cbiAgICAgIGlmICghdGFyZ2V0T3B0aW9uW190aGlzLmdldEZpZWxkTmFtZSgnY2hpbGRyZW4nKV0gfHwgIXRhcmdldE9wdGlvbltfdGhpcy5nZXRGaWVsZE5hbWUoJ2NoaWxkcmVuJyldLmxlbmd0aCkge1xuICAgICAgICBfdGhpcy5oYW5kbGVDaGFuZ2UoYWN0aXZlT3B0aW9ucywge1xuICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgIH0sIGUpOyAvLyBzZXQgdmFsdWUgdG8gYWN0aXZlVmFsdWUgd2hlbiBzZWxlY3QgbGVhZiBvcHRpb25cblxuXG4gICAgICAgIG5ld1N0YXRlLnZhbHVlID0gYWN0aXZlVmFsdWU7IC8vIGFkZCBlLnR5cGUganVkZ2VtZW50IHRvIHByZXZlbnQgYG9uQ2hhbmdlYCBiZWluZyB0cmlnZ2VyZWQgYnkgbW91c2VFbnRlclxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VPblNlbGVjdCAmJiAoZS50eXBlID09PSAnY2xpY2snIHx8IGUudHlwZSA9PT0gJ2tleWRvd24nKSkge1xuICAgICAgICBpZiAoZXhwYW5kVHJpZ2dlciA9PT0gJ2hvdmVyJykge1xuICAgICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShhY3RpdmVPcHRpb25zLCB7XG4gICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgICAgIH0sIGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShhY3RpdmVPcHRpb25zLCB7XG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICAgICAgfSwgZSk7XG4gICAgICAgIH0gLy8gc2V0IHZhbHVlIHRvIGFjdGl2ZVZhbHVlIG9uIGV2ZXJ5IHNlbGVjdFxuXG5cbiAgICAgICAgbmV3U3RhdGUudmFsdWUgPSBhY3RpdmVWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgbmV3U3RhdGUuYWN0aXZlVmFsdWUgPSBhY3RpdmVWYWx1ZTsgLy8gIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIGJ5IGtleWJvYXJkXG5cbiAgICAgIGlmICgndmFsdWUnIGluIF90aGlzLnByb3BzIHx8IGUudHlwZSA9PT0gJ2tleWRvd24nICYmIGUua2V5Q29kZSAhPT0gX0tleUNvZGUuZGVmYXVsdC5FTlRFUikge1xuICAgICAgICBkZWxldGUgbmV3U3RhdGUudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlSXRlbURvdWJsZUNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNoYW5nZU9uU2VsZWN0ID0gX3RoaXMucHJvcHMuY2hhbmdlT25TZWxlY3Q7XG5cbiAgICAgIGlmIChjaGFuZ2VPblNlbGVjdCkge1xuICAgICAgICBfdGhpcy5zZXRQb3B1cFZpc2libGUoZmFsc2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IF90aGlzLnByb3BzLmNoaWxkcmVuOyAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy82NzE3XG4gICAgICAvLyBEb24ndCBiaW5kIGtleWJvYXJkIHN1cHBvcnQgd2hlbiBjaGlsZHJlbiBzcGVjaWZ5IHRoZSBvbktleURvd25cblxuICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLnByb3BzLm9uS2V5RG93bikge1xuICAgICAgICBjaGlsZHJlbi5wcm9wcy5vbktleURvd24oZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjdGl2ZVZhbHVlID0gX3RvQ29uc3VtYWJsZUFycmF5KF90aGlzLnN0YXRlLmFjdGl2ZVZhbHVlKTtcblxuICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IGFjdGl2ZVZhbHVlLmxlbmd0aCAtIDEgPCAwID8gMCA6IGFjdGl2ZVZhbHVlLmxlbmd0aCAtIDE7XG5cbiAgICAgIHZhciBjdXJyZW50T3B0aW9ucyA9IF90aGlzLmdldEN1cnJlbnRMZXZlbE9wdGlvbnMoKTtcblxuICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IGN1cnJlbnRPcHRpb25zLm1hcChmdW5jdGlvbiAobykge1xuICAgICAgICByZXR1cm4gb1tfdGhpcy5nZXRGaWVsZE5hbWUoJ3ZhbHVlJyldO1xuICAgICAgfSkuaW5kZXhPZihhY3RpdmVWYWx1ZVtjdXJyZW50TGV2ZWxdKTtcblxuICAgICAgaWYgKGUua2V5Q29kZSAhPT0gX0tleUNvZGUuZGVmYXVsdC5ET1dOICYmIGUua2V5Q29kZSAhPT0gX0tleUNvZGUuZGVmYXVsdC5VUCAmJiBlLmtleUNvZGUgIT09IF9LZXlDb2RlLmRlZmF1bHQuTEVGVCAmJiBlLmtleUNvZGUgIT09IF9LZXlDb2RlLmRlZmF1bHQuUklHSFQgJiYgZS5rZXlDb2RlICE9PSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSICYmIGUua2V5Q29kZSAhPT0gX0tleUNvZGUuZGVmYXVsdC5TUEFDRSAmJiBlLmtleUNvZGUgIT09IF9LZXlDb2RlLmRlZmF1bHQuQkFDS1NQQUNFICYmIGUua2V5Q29kZSAhPT0gX0tleUNvZGUuZGVmYXVsdC5FU0MgJiYgZS5rZXlDb2RlICE9PSBfS2V5Q29kZS5kZWZhdWx0LlRBQikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFByZXNzIGFueSBrZXlzIGFib3ZlIHRvIHJlb3BlbiBtZW51XG5cblxuICAgICAgaWYgKCFfdGhpcy5zdGF0ZS5wb3B1cFZpc2libGUgJiYgZS5rZXlDb2RlICE9PSBfS2V5Q29kZS5kZWZhdWx0LkJBQ0tTUEFDRSAmJiBlLmtleUNvZGUgIT09IF9LZXlDb2RlLmRlZmF1bHQuTEVGVCAmJiBlLmtleUNvZGUgIT09IF9LZXlDb2RlLmRlZmF1bHQuUklHSFQgJiYgZS5rZXlDb2RlICE9PSBfS2V5Q29kZS5kZWZhdWx0LkVTQyAmJiBlLmtleUNvZGUgIT09IF9LZXlDb2RlLmRlZmF1bHQuVEFCKSB7XG4gICAgICAgIF90aGlzLnNldFBvcHVwVmlzaWJsZSh0cnVlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlLmtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuRE9XTiB8fCBlLmtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuVVApIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB2YXIgbmV4dEluZGV4ID0gY3VycmVudEluZGV4O1xuXG4gICAgICAgIGlmIChuZXh0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5ET1dOKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggKz0gMTtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IG5leHRJbmRleCA+PSBjdXJyZW50T3B0aW9ucy5sZW5ndGggPyAwIDogbmV4dEluZGV4O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggLT0gMTtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IG5leHRJbmRleCA8IDAgPyBjdXJyZW50T3B0aW9ucy5sZW5ndGggLSAxIDogbmV4dEluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgYWN0aXZlVmFsdWVbY3VycmVudExldmVsXSA9IGN1cnJlbnRPcHRpb25zW25leHRJbmRleF1bX3RoaXMuZ2V0RmllbGROYW1lKCd2YWx1ZScpXTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkxFRlQgfHwgZS5rZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkJBQ0tTUEFDRSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGFjdGl2ZVZhbHVlLnNwbGljZShhY3RpdmVWYWx1ZS5sZW5ndGggLSAxLCAxKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LlJJR0hUKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoY3VycmVudE9wdGlvbnNbY3VycmVudEluZGV4XSAmJiBjdXJyZW50T3B0aW9uc1tjdXJyZW50SW5kZXhdW190aGlzLmdldEZpZWxkTmFtZSgnY2hpbGRyZW4nKV0pIHtcbiAgICAgICAgICBhY3RpdmVWYWx1ZS5wdXNoKGN1cnJlbnRPcHRpb25zW2N1cnJlbnRJbmRleF1bX3RoaXMuZ2V0RmllbGROYW1lKCdjaGlsZHJlbicpXVswXVtfdGhpcy5nZXRGaWVsZE5hbWUoJ3ZhbHVlJyldKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuRVNDIHx8IGUua2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5UQUIpIHtcbiAgICAgICAgX3RoaXMuc2V0UG9wdXBWaXNpYmxlKGZhbHNlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghYWN0aXZlVmFsdWUgfHwgYWN0aXZlVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIF90aGlzLnNldFBvcHVwVmlzaWJsZShmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhY3RpdmVPcHRpb25zID0gX3RoaXMuZ2V0QWN0aXZlT3B0aW9ucyhhY3RpdmVWYWx1ZSk7XG5cbiAgICAgIHZhciB0YXJnZXRPcHRpb24gPSBhY3RpdmVPcHRpb25zW2FjdGl2ZU9wdGlvbnMubGVuZ3RoIC0gMV07XG5cbiAgICAgIF90aGlzLmhhbmRsZU1lbnVTZWxlY3QodGFyZ2V0T3B0aW9uLCBhY3RpdmVPcHRpb25zLmxlbmd0aCAtIDEsIGUpO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMub25LZXlEb3duKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uS2V5RG93bihlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuc2F2ZVRyaWdnZXIgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMudHJpZ2dlciA9IG5vZGU7XG4gICAgfTtcblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSBbXTtcblxuICAgIGlmICgndmFsdWUnIGluIHByb3BzKSB7XG4gICAgICBpbml0aWFsVmFsdWUgPSBwcm9wcy52YWx1ZSB8fCBbXTtcbiAgICB9IGVsc2UgaWYgKCdkZWZhdWx0VmFsdWUnIGluIHByb3BzKSB7XG4gICAgICBpbml0aWFsVmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUgfHwgW107XG4gICAgfVxuXG4gICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKCEoJ2ZpbGVkTmFtZXMnIGluIHByb3BzKSwgJ2BmaWxlZE5hbWVzYCBvZiBDYXNjYWRlciBpcyBhIHR5cG8gdXNhZ2UgYW5kIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgYGZpZWxkTmFtZXNgIGluc3RlYWQuJyk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBwb3B1cFZpc2libGU6IHByb3BzLnBvcHVwVmlzaWJsZSxcbiAgICAgIGFjdGl2ZVZhbHVlOiBpbml0aWFsVmFsdWUsXG4gICAgICB2YWx1ZTogaW5pdGlhbFZhbHVlLFxuICAgICAgcHJldlByb3BzOiBwcm9wc1xuICAgIH07XG4gICAgX3RoaXMuZGVmYXVsdEZpZWxkTmFtZXMgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHZhbHVlOiAndmFsdWUnLFxuICAgICAgY2hpbGRyZW46ICdjaGlsZHJlbidcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDYXNjYWRlciwgW3tcbiAgICBrZXk6IFwiZ2V0UG9wdXBET01Ob2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvcHVwRE9NTm9kZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyaWdnZXIuZ2V0UG9wdXBEb21Ob2RlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEZpZWxkTmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGaWVsZE5hbWUobmFtZSkge1xuICAgICAgdmFyIGRlZmF1bHRGaWVsZE5hbWVzID0gdGhpcy5kZWZhdWx0RmllbGROYW1lcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGZpZWxkTmFtZXMgPSBfdGhpcyRwcm9wczIuZmllbGROYW1lcyxcbiAgICAgICAgICBmaWxlZE5hbWVzID0gX3RoaXMkcHJvcHMyLmZpbGVkTmFtZXM7XG5cbiAgICAgIGlmICgnZmlsZWROYW1lcycgaW4gdGhpcy5wcm9wcykge1xuICAgICAgICByZXR1cm4gZmlsZWROYW1lc1tuYW1lXSB8fCBkZWZhdWx0RmllbGROYW1lc1tuYW1lXTsgLy8gRm9yIG9sZCBjb21wYXRpYmlsaXR5XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZE5hbWVzW25hbWVdIHx8IGRlZmF1bHRGaWVsZE5hbWVzW25hbWVdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRGaWVsZE5hbWVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZpZWxkTmFtZXMoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBmaWVsZE5hbWVzID0gX3RoaXMkcHJvcHMzLmZpZWxkTmFtZXMsXG4gICAgICAgICAgZmlsZWROYW1lcyA9IF90aGlzJHByb3BzMy5maWxlZE5hbWVzO1xuXG4gICAgICBpZiAoJ2ZpbGVkTmFtZXMnIGluIHRoaXMucHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVkTmFtZXM7IC8vIEZvciBvbGQgY29tcGF0aWJpbGl0eVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGROYW1lcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudExldmVsT3B0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50TGV2ZWxPcHRpb25zKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyRvcHRpb25zID0gdGhpcy5wcm9wcy5vcHRpb25zLFxuICAgICAgICAgIG9wdGlvbnMgPSBfdGhpcyRwcm9wcyRvcHRpb25zID09PSB2b2lkIDAgPyBbXSA6IF90aGlzJHByb3BzJG9wdGlvbnM7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUkYWN0aXZlVmFsID0gdGhpcy5zdGF0ZS5hY3RpdmVWYWx1ZSxcbiAgICAgICAgICBhY3RpdmVWYWx1ZSA9IF90aGlzJHN0YXRlJGFjdGl2ZVZhbCA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRzdGF0ZSRhY3RpdmVWYWw7XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIF9hcnJheVRyZWVGaWx0ZXIuZGVmYXVsdCkob3B0aW9ucywgZnVuY3Rpb24gKG8sIGxldmVsKSB7XG4gICAgICAgIHJldHVybiBvW190aGlzMi5nZXRGaWVsZE5hbWUoJ3ZhbHVlJyldID09PSBhY3RpdmVWYWx1ZVtsZXZlbF07XG4gICAgICB9LCB7XG4gICAgICAgIGNoaWxkcmVuS2V5TmFtZTogdGhpcy5nZXRGaWVsZE5hbWUoJ2NoaWxkcmVuJylcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAyXSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAyXVt0aGlzLmdldEZpZWxkTmFtZSgnY2hpbGRyZW4nKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdG9Db25zdW1hYmxlQXJyYXkob3B0aW9ucykuZmlsdGVyKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHJldHVybiAhby5kaXNhYmxlZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBY3RpdmVPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFjdGl2ZU9wdGlvbnMoYWN0aXZlVmFsdWUpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gKDAsIF9hcnJheVRyZWVGaWx0ZXIuZGVmYXVsdCkodGhpcy5wcm9wcy5vcHRpb25zIHx8IFtdLCBmdW5jdGlvbiAobywgbGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIG9bX3RoaXMzLmdldEZpZWxkTmFtZSgndmFsdWUnKV0gPT09IGFjdGl2ZVZhbHVlW2xldmVsXTtcbiAgICAgIH0sIHtcbiAgICAgICAgY2hpbGRyZW5LZXlOYW1lOiB0aGlzLmdldEZpZWxkTmFtZSgnY2hpbGRyZW4nKVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczQucHJlZml4Q2xzLFxuICAgICAgICAgIHRyYW5zaXRpb25OYW1lID0gX3RoaXMkcHJvcHM0LnRyYW5zaXRpb25OYW1lLFxuICAgICAgICAgIHBvcHVwQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHM0LnBvcHVwQ2xhc3NOYW1lLFxuICAgICAgICAgIF90aGlzJHByb3BzNCRvcHRpb25zID0gX3RoaXMkcHJvcHM0Lm9wdGlvbnMsXG4gICAgICAgICAgb3B0aW9ucyA9IF90aGlzJHByb3BzNCRvcHRpb25zID09PSB2b2lkIDAgPyBbXSA6IF90aGlzJHByb3BzNCRvcHRpb25zLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHM0LmRpc2FibGVkLFxuICAgICAgICAgIGJ1aWx0aW5QbGFjZW1lbnRzID0gX3RoaXMkcHJvcHM0LmJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgICAgICAgIHBvcHVwUGxhY2VtZW50ID0gX3RoaXMkcHJvcHM0LnBvcHVwUGxhY2VtZW50LFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHM0LmNoaWxkcmVuLFxuICAgICAgICAgIGRyb3Bkb3duUmVuZGVyID0gX3RoaXMkcHJvcHM0LmRyb3Bkb3duUmVuZGVyLFxuICAgICAgICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wczQsIFtcInByZWZpeENsc1wiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwicG9wdXBDbGFzc05hbWVcIiwgXCJvcHRpb25zXCIsIFwiZGlzYWJsZWRcIiwgXCJidWlsdGluUGxhY2VtZW50c1wiLCBcInBvcHVwUGxhY2VtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJkcm9wZG93blJlbmRlclwiXSk7IC8vIERpZCBub3Qgc2hvdyBwb3B1cCB3aGVuIHRoZXJlIGlzIG5vIG9wdGlvbnNcblxuXG4gICAgICB2YXIgbWVudXMgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwpO1xuICAgICAgdmFyIGVtcHR5TWVudUNsYXNzTmFtZSA9ICcnO1xuXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbWVudXMgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9NZW51cy5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCB7XG4gICAgICAgICAgZmllbGROYW1lczogdGhpcy5nZXRGaWVsZE5hbWVzKCksXG4gICAgICAgICAgZGVmYXVsdEZpZWxkTmFtZXM6IHRoaXMuZGVmYXVsdEZpZWxkTmFtZXMsXG4gICAgICAgICAgYWN0aXZlVmFsdWU6IHRoaXMuc3RhdGUuYWN0aXZlVmFsdWUsXG4gICAgICAgICAgb25TZWxlY3Q6IHRoaXMuaGFuZGxlTWVudVNlbGVjdCxcbiAgICAgICAgICBvbkl0ZW1Eb3VibGVDbGljazogdGhpcy5oYW5kbGVJdGVtRG91YmxlQ2xpY2ssXG4gICAgICAgICAgdmlzaWJsZTogdGhpcy5zdGF0ZS5wb3B1cFZpc2libGVcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1wdHlNZW51Q2xhc3NOYW1lID0gXCIgXCIuY29uY2F0KHByZWZpeENscywgXCItbWVudXMtZW1wdHlcIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBwb3B1cE5vZGUgPSBtZW51cztcblxuICAgICAgaWYgKGRyb3Bkb3duUmVuZGVyKSB7XG4gICAgICAgIHBvcHVwTm9kZSA9IGRyb3Bkb3duUmVuZGVyKG1lbnVzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjVHJpZ2dlci5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcmVmOiB0aGlzLnNhdmVUcmlnZ2VyXG4gICAgICB9LCByZXN0UHJvcHMsIHtcbiAgICAgICAgcG9wdXBQbGFjZW1lbnQ6IHBvcHVwUGxhY2VtZW50LFxuICAgICAgICBidWlsdGluUGxhY2VtZW50czogYnVpbHRpblBsYWNlbWVudHMsXG4gICAgICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgICAgICBhY3Rpb246IGRpc2FibGVkID8gW10gOiBbJ2NsaWNrJ10sXG4gICAgICAgIHBvcHVwVmlzaWJsZTogZGlzYWJsZWQgPyBmYWxzZSA6IHRoaXMuc3RhdGUucG9wdXBWaXNpYmxlLFxuICAgICAgICBvblBvcHVwVmlzaWJsZUNoYW5nZTogdGhpcy5oYW5kbGVQb3B1cFZpc2libGVDaGFuZ2UsXG4gICAgICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZW51c1wiKSxcbiAgICAgICAgcG9wdXBDbGFzc05hbWU6IHBvcHVwQ2xhc3NOYW1lICsgZW1wdHlNZW51Q2xhc3NOYW1lLFxuICAgICAgICBwb3B1cDogcG9wdXBOb2RlXG4gICAgICB9KSwgUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICAgIG9uS2V5RG93bjogdGhpcy5oYW5kbGVLZXlEb3duLFxuICAgICAgICB0YWJJbmRleDogZGlzYWJsZWQgPyB1bmRlZmluZWQgOiAwXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgdmFyIF9wcmV2U3RhdGUkcHJldlByb3BzID0gcHJldlN0YXRlLnByZXZQcm9wcyxcbiAgICAgICAgICBwcmV2UHJvcHMgPSBfcHJldlN0YXRlJHByZXZQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJldlN0YXRlJHByZXZQcm9wcztcbiAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAgICAgcHJldlByb3BzOiBuZXh0UHJvcHNcbiAgICAgIH07XG5cbiAgICAgIGlmICgndmFsdWUnIGluIG5leHRQcm9wcyAmJiAhKDAsIF91dGlscy5pc0VxdWFsQXJyYXlzKShwcmV2UHJvcHMudmFsdWUsIG5leHRQcm9wcy52YWx1ZSkpIHtcbiAgICAgICAgbmV3U3RhdGUudmFsdWUgPSBuZXh0UHJvcHMudmFsdWUgfHwgW107IC8vIGFsbG93IGFjdGl2ZVZhbHVlIGRpZmYgZnJvbSB2YWx1ZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNzY3XG5cbiAgICAgICAgaWYgKCEoJ2xvYWREYXRhJyBpbiBuZXh0UHJvcHMpKSB7XG4gICAgICAgICAgbmV3U3RhdGUuYWN0aXZlVmFsdWUgPSBuZXh0UHJvcHMudmFsdWUgfHwgW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCdwb3B1cFZpc2libGUnIGluIG5leHRQcm9wcykge1xuICAgICAgICBuZXdTdGF0ZS5wb3B1cFZpc2libGUgPSBuZXh0UHJvcHMucG9wdXBWaXNpYmxlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENhc2NhZGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5DYXNjYWRlci5kZWZhdWx0UHJvcHMgPSB7XG4gIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZSgpIHt9LFxuICBvblBvcHVwVmlzaWJsZUNoYW5nZTogZnVuY3Rpb24gb25Qb3B1cFZpc2libGVDaGFuZ2UoKSB7fSxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICB0cmFuc2l0aW9uTmFtZTogJycsXG4gIHByZWZpeENsczogJ3JjLWNhc2NhZGVyJyxcbiAgcG9wdXBDbGFzc05hbWU6ICcnLFxuICBwb3B1cFBsYWNlbWVudDogJ2JvdHRvbUxlZnQnLFxuICBidWlsdGluUGxhY2VtZW50czogX3BsYWNlbWVudHMuZGVmYXVsdCxcbiAgZXhwYW5kVHJpZ2dlcjogJ2NsaWNrJyxcbiAgZmllbGROYW1lczoge1xuICAgIGxhYmVsOiAnbGFiZWwnLFxuICAgIHZhbHVlOiAndmFsdWUnLFxuICAgIGNoaWxkcmVuOiAnY2hpbGRyZW4nXG4gIH0sXG4gIGV4cGFuZEljb246ICc+J1xufTtcbnZhciBfZGVmYXVsdCA9IENhc2NhZGVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfYXJyYXlUcmVlRmlsdGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiYXJyYXktdHJlZS1maWx0ZXJcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbnZhciBNZW51cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoTWVudXMsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWVudXMpO1xuXG4gIGZ1bmN0aW9uIE1lbnVzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51cyk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLm1lbnVJdGVtcyA9IHt9O1xuXG4gICAgX3RoaXMuc2F2ZU1lbnVJdGVtID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgX3RoaXMubWVudUl0ZW1zW2luZGV4XSA9IG5vZGU7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWVudXMsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zY3JvbGxBY3RpdmVJdGVtVG9WaWV3KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICBpZiAoIXByZXZQcm9wcy52aXNpYmxlICYmIHRoaXMucHJvcHMudmlzaWJsZSkge1xuICAgICAgICB0aGlzLnNjcm9sbEFjdGl2ZUl0ZW1Ub1ZpZXcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RmllbGROYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZpZWxkTmFtZShuYW1lKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGZpZWxkTmFtZXMgPSBfdGhpcyRwcm9wcy5maWVsZE5hbWVzLFxuICAgICAgICAgIGRlZmF1bHRGaWVsZE5hbWVzID0gX3RoaXMkcHJvcHMuZGVmYXVsdEZpZWxkTmFtZXM7IC8vIOmYsuatouWPquiuvue9ruWNleS4quWxnuaAp+eahOWQjeWtl1xuXG4gICAgICByZXR1cm4gZmllbGROYW1lc1tuYW1lXSB8fCBkZWZhdWx0RmllbGROYW1lc1tuYW1lXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0T3B0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9wdGlvbihvcHRpb24sIG1lbnVJbmRleCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgICBleHBhbmRUcmlnZ2VyID0gX3RoaXMkcHJvcHMyLmV4cGFuZFRyaWdnZXIsXG4gICAgICAgICAgZXhwYW5kSWNvbiA9IF90aGlzJHByb3BzMi5leHBhbmRJY29uLFxuICAgICAgICAgIGxvYWRpbmdJY29uID0gX3RoaXMkcHJvcHMyLmxvYWRpbmdJY29uO1xuICAgICAgdmFyIG9uU2VsZWN0ID0gdGhpcy5wcm9wcy5vblNlbGVjdC5iaW5kKHRoaXMsIG9wdGlvbiwgbWVudUluZGV4KTtcbiAgICAgIHZhciBvbkl0ZW1Eb3VibGVDbGljayA9IHRoaXMucHJvcHMub25JdGVtRG91YmxlQ2xpY2suYmluZCh0aGlzLCBvcHRpb24sIG1lbnVJbmRleCk7XG4gICAgICB2YXIgZXhwYW5kUHJvcHMgPSB7XG4gICAgICAgIG9uQ2xpY2s6IG9uU2VsZWN0LFxuICAgICAgICBvbkRvdWJsZUNsaWNrOiBvbkl0ZW1Eb3VibGVDbGlja1xuICAgICAgfTtcbiAgICAgIHZhciBtZW51SXRlbUNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVudS1pdGVtXCIpO1xuICAgICAgdmFyIGV4cGFuZEljb25Ob2RlID0gbnVsbDtcbiAgICAgIHZhciBoYXNDaGlsZHJlbiA9IG9wdGlvblt0aGlzLmdldEZpZWxkTmFtZSgnY2hpbGRyZW4nKV0gJiYgb3B0aW9uW3RoaXMuZ2V0RmllbGROYW1lKCdjaGlsZHJlbicpXS5sZW5ndGggPiAwO1xuXG4gICAgICBpZiAoaGFzQ2hpbGRyZW4gfHwgb3B0aW9uLmlzTGVhZiA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWVudUl0ZW1DbHMgKz0gXCIgXCIuY29uY2F0KHByZWZpeENscywgXCItbWVudS1pdGVtLWV4cGFuZFwiKTtcblxuICAgICAgICBpZiAoIW9wdGlvbi5sb2FkaW5nKSB7XG4gICAgICAgICAgZXhwYW5kSWNvbk5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVudS1pdGVtLWV4cGFuZC1pY29uXCIpXG4gICAgICAgICAgfSwgZXhwYW5kSWNvbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGV4cGFuZFRyaWdnZXIgPT09ICdob3ZlcicgJiYgKGhhc0NoaWxkcmVuIHx8IG9wdGlvbi5pc0xlYWYgPT09IGZhbHNlKSkge1xuICAgICAgICBleHBhbmRQcm9wcyA9IHtcbiAgICAgICAgICBvbk1vdXNlRW50ZXI6IHRoaXMuZGVsYXlPblNlbGVjdC5iaW5kKHRoaXMsIG9uU2VsZWN0KSxcbiAgICAgICAgICBvbk1vdXNlTGVhdmU6IHRoaXMuZGVsYXlPblNlbGVjdC5iaW5kKHRoaXMpLFxuICAgICAgICAgIG9uQ2xpY2s6IG9uU2VsZWN0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzQWN0aXZlT3B0aW9uKG9wdGlvbiwgbWVudUluZGV4KSkge1xuICAgICAgICBtZW51SXRlbUNscyArPSBcIiBcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZW51LWl0ZW0tYWN0aXZlXCIpO1xuICAgICAgICBleHBhbmRQcm9wcy5yZWYgPSB0aGlzLnNhdmVNZW51SXRlbShtZW51SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICAgIG1lbnVJdGVtQ2xzICs9IFwiIFwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lbnUtaXRlbS1kaXNhYmxlZFwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxvYWRpbmdJY29uTm9kZSA9IG51bGw7XG5cbiAgICAgIGlmIChvcHRpb24ubG9hZGluZykge1xuICAgICAgICBtZW51SXRlbUNscyArPSBcIiBcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZW51LWl0ZW0tbG9hZGluZ1wiKTtcbiAgICAgICAgbG9hZGluZ0ljb25Ob2RlID0gbG9hZGluZ0ljb24gfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHRpdGxlID0gJyc7XG5cbiAgICAgIGlmICgndGl0bGUnIGluIG9wdGlvbikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgICAgdGl0bGUgPSBvcHRpb24udGl0bGU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25bdGhpcy5nZXRGaWVsZE5hbWUoJ2xhYmVsJyldID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aXRsZSA9IG9wdGlvblt0aGlzLmdldEZpZWxkTmFtZSgnbGFiZWwnKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGtleTogb3B0aW9uW3RoaXMuZ2V0RmllbGROYW1lKCd2YWx1ZScpXSxcbiAgICAgICAgY2xhc3NOYW1lOiBtZW51SXRlbUNscyxcbiAgICAgICAgdGl0bGU6IHRpdGxlXG4gICAgICB9LCBleHBhbmRQcm9wcywge1xuICAgICAgICByb2xlOiBcIm1lbnVpdGVtXCIsXG4gICAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSksIG9wdGlvblt0aGlzLmdldEZpZWxkTmFtZSgnbGFiZWwnKV0sIGV4cGFuZEljb25Ob2RlLCBsb2FkaW5nSWNvbk5vZGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBY3RpdmVPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFjdGl2ZU9wdGlvbnModmFsdWVzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLnByb3BzLm9wdGlvbnM7XG4gICAgICB2YXIgYWN0aXZlVmFsdWUgPSB2YWx1ZXMgfHwgdGhpcy5wcm9wcy5hY3RpdmVWYWx1ZTtcbiAgICAgIHJldHVybiAoMCwgX2FycmF5VHJlZUZpbHRlci5kZWZhdWx0KShvcHRpb25zLCBmdW5jdGlvbiAobywgbGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIG9bX3RoaXMyLmdldEZpZWxkTmFtZSgndmFsdWUnKV0gPT09IGFjdGl2ZVZhbHVlW2xldmVsXTtcbiAgICAgIH0sIHtcbiAgICAgICAgY2hpbGRyZW5LZXlOYW1lOiB0aGlzLmdldEZpZWxkTmFtZSgnY2hpbGRyZW4nKVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNob3dPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNob3dPcHRpb25zKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5wcm9wcy5vcHRpb25zO1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuZ2V0QWN0aXZlT3B0aW9ucygpLm1hcChmdW5jdGlvbiAoYWN0aXZlT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBhY3RpdmVPcHRpb25bX3RoaXMzLmdldEZpZWxkTmFtZSgnY2hpbGRyZW4nKV07XG4gICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGFjdGl2ZU9wdGlvbikge1xuICAgICAgICByZXR1cm4gISFhY3RpdmVPcHRpb247XG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsYXlPblNlbGVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxheU9uU2VsZWN0KG9uU2VsZWN0KSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGVsYXlUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWxheVRpbWVyKTtcbiAgICAgICAgdGhpcy5kZWxheVRpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvblNlbGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLmRlbGF5VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgb25TZWxlY3QoYXJncyk7XG4gICAgICAgICAgX3RoaXM0LmRlbGF5VGltZXIgPSBudWxsO1xuICAgICAgICB9LCAxNTApO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzY3JvbGxBY3RpdmVJdGVtVG9WaWV3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjcm9sbEFjdGl2ZUl0ZW1Ub1ZpZXcoKSB7XG4gICAgICAvLyBzY3JvbGwgaW50byB2aWV3XG4gICAgICB2YXIgb3B0aW9uc0xlbmd0aCA9IHRoaXMuZ2V0U2hvd09wdGlvbnMoKS5sZW5ndGg7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1c1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnNMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbUNvbXBvbmVudCA9IHRoaXMubWVudUl0ZW1zW2ldO1xuXG4gICAgICAgIGlmIChpdGVtQ29tcG9uZW50ICYmIGl0ZW1Db21wb25lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgIGl0ZW1Db21wb25lbnQucGFyZW50RWxlbWVudC5zY3JvbGxUb3AgPSBpdGVtQ29tcG9uZW50Lm9mZnNldFRvcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0FjdGl2ZU9wdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0FjdGl2ZU9wdGlvbihvcHRpb24sIG1lbnVJbmRleCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzJGFjdGl2ZVZhbCA9IHRoaXMucHJvcHMuYWN0aXZlVmFsdWUsXG4gICAgICAgICAgYWN0aXZlVmFsdWUgPSBfdGhpcyRwcm9wcyRhY3RpdmVWYWwgPT09IHZvaWQgMCA/IFtdIDogX3RoaXMkcHJvcHMkYWN0aXZlVmFsO1xuICAgICAgcmV0dXJuIGFjdGl2ZVZhbHVlW21lbnVJbmRleF0gPT09IG9wdGlvblt0aGlzLmdldEZpZWxkTmFtZSgndmFsdWUnKV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMzLnByZWZpeENscyxcbiAgICAgICAgICBkcm9wZG93bk1lbnVDb2x1bW5TdHlsZSA9IF90aGlzJHByb3BzMy5kcm9wZG93bk1lbnVDb2x1bW5TdHlsZTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIHRoaXMuZ2V0U2hvd09wdGlvbnMoKS5tYXAoZnVuY3Rpb24gKG9wdGlvbnMsIG1lbnVJbmRleCkge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVudVwiKSxcbiAgICAgICAgICBrZXk6IG1lbnVJbmRleCxcbiAgICAgICAgICBzdHlsZTogZHJvcGRvd25NZW51Q29sdW1uU3R5bGVcbiAgICAgICAgfSwgb3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICAgIHJldHVybiBfdGhpczUuZ2V0T3B0aW9uKG9wdGlvbiwgbWVudUluZGV4KTtcbiAgICAgICAgfSkpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNZW51cztcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuTWVudXMuZGVmYXVsdFByb3BzID0ge1xuICBvcHRpb25zOiBbXSxcbiAgdmFsdWU6IFtdLFxuICBhY3RpdmVWYWx1ZTogW10sXG4gIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdCgpIHt9LFxuICBwcmVmaXhDbHM6ICdyYy1jYXNjYWRlci1tZW51cycsXG4gIHZpc2libGU6IGZhbHNlLFxuICBleHBhbmRUcmlnZ2VyOiAnY2xpY2snXG59O1xudmFyIF9kZWZhdWx0ID0gTWVudXM7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9DYXNjYWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ2FzY2FkZXJcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgX2RlZmF1bHQgPSBfQ2FzY2FkZXIuZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIEJVSUxUX0lOX1BMQUNFTUVOVFMgPSB7XG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICBvdmVyZmxvdzoge1xuICAgICAgYWRqdXN0WDogMSxcbiAgICAgIGFkanVzdFk6IDFcbiAgICB9XG4gIH0sXG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGwnXSxcbiAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIGFkanVzdFg6IDEsXG4gICAgICBhZGp1c3RZOiAxXG4gICAgfVxuICB9LFxuICBib3R0b21SaWdodDoge1xuICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIG92ZXJmbG93OiB7XG4gICAgICBhZGp1c3RYOiAxLFxuICAgICAgYWRqdXN0WTogMVxuICAgIH1cbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIGFkanVzdFg6IDEsXG4gICAgICBhZGp1c3RZOiAxXG4gICAgfVxuICB9XG59O1xudmFyIF9kZWZhdWx0ID0gQlVJTFRfSU5fUExBQ0VNRU5UUztcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc0VxdWFsQXJyYXlzID0gaXNFcXVhbEFycmF5cztcblxuZnVuY3Rpb24gaXNFcXVhbEFycmF5cyhhcnJBLCBhcnJCKSB7XG4gIGlmIChhcnJBID09PSBhcnJCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIWFyckEgfHwgIWFyckIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgbGVuID0gYXJyQS5sZW5ndGg7XG5cbiAgaWYgKGFyckIubGVuZ3RoICE9PSBsZW4pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFyckFbaV0gIT09IGFyckJbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCIpKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIuZGVmYXVsdCkodGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBDaGVja2JveCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShDaGVja2JveCwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDaGVja2JveCk7XG5cbiAgZnVuY3Rpb24gQ2hlY2tib3gocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBDaGVja2JveCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfdGhpcy5oYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgICBvbkNoYW5nZSA9IF90aGlzJHByb3BzLm9uQ2hhbmdlO1xuXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoISgnY2hlY2tlZCcgaW4gX3RoaXMucHJvcHMpKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjaGVja2VkOiBlLnRhcmdldC5jaGVja2VkXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgb25DaGFuZ2Uoe1xuICAgICAgICAgIHRhcmdldDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpcy5wcm9wcyksIHt9LCB7XG4gICAgICAgICAgICBjaGVja2VkOiBlLnRhcmdldC5jaGVja2VkXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbmF0aXZlRXZlbnQ6IGUubmF0aXZlRXZlbnRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNhdmVJbnB1dCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBfdGhpcy5pbnB1dCA9IG5vZGU7XG4gICAgfTtcblxuICAgIHZhciBjaGVja2VkID0gJ2NoZWNrZWQnIGluIHByb3BzID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgY2hlY2tlZDogY2hlY2tlZFxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoQ2hlY2tib3gsIFt7XG4gICAga2V5OiBcImZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJibHVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMyLnN0eWxlLFxuICAgICAgICAgIG5hbWUgPSBfdGhpcyRwcm9wczIubmFtZSxcbiAgICAgICAgICBpZCA9IF90aGlzJHByb3BzMi5pZCxcbiAgICAgICAgICB0eXBlID0gX3RoaXMkcHJvcHMyLnR5cGUsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczIuZGlzYWJsZWQsXG4gICAgICAgICAgcmVhZE9ubHkgPSBfdGhpcyRwcm9wczIucmVhZE9ubHksXG4gICAgICAgICAgdGFiSW5kZXggPSBfdGhpcyRwcm9wczIudGFiSW5kZXgsXG4gICAgICAgICAgb25DbGljayA9IF90aGlzJHByb3BzMi5vbkNsaWNrLFxuICAgICAgICAgIG9uRm9jdXMgPSBfdGhpcyRwcm9wczIub25Gb2N1cyxcbiAgICAgICAgICBvbkJsdXIgPSBfdGhpcyRwcm9wczIub25CbHVyLFxuICAgICAgICAgIGF1dG9Gb2N1cyA9IF90aGlzJHByb3BzMi5hdXRvRm9jdXMsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wczIudmFsdWUsXG4gICAgICAgICAgcmVxdWlyZWQgPSBfdGhpcyRwcm9wczIucmVxdWlyZWQsXG4gICAgICAgICAgb3RoZXJzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3RoaXMkcHJvcHMyLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcIm5hbWVcIiwgXCJpZFwiLCBcInR5cGVcIiwgXCJkaXNhYmxlZFwiLCBcInJlYWRPbmx5XCIsIFwidGFiSW5kZXhcIiwgXCJvbkNsaWNrXCIsIFwib25Gb2N1c1wiLCBcIm9uQmx1clwiLCBcImF1dG9Gb2N1c1wiLCBcInZhbHVlXCIsIFwicmVxdWlyZWRcIl0pO1xuICAgICAgdmFyIGdsb2JhbFByb3BzID0gT2JqZWN0LmtleXMob3RoZXJzKS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGtleSkge1xuICAgICAgICBpZiAoa2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJyB8fCBrZXkuc3Vic3RyKDAsIDUpID09PSAnZGF0YS0nIHx8IGtleSA9PT0gJ3JvbGUnKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgcHJldltrZXldID0gb3RoZXJzW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIHt9KTtcbiAgICAgIHZhciBjaGVja2VkID0gdGhpcy5zdGF0ZS5jaGVja2VkO1xuICAgICAgdmFyIGNsYXNzU3RyaW5nID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHByZWZpeENscywgY2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2hlY2tlZFwiKSwgY2hlY2tlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIF9jbGFzc05hbWVzKSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9LCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIsICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZCxcbiAgICAgICAgcmVhZE9ubHk6IHJlYWRPbmx5LFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpLFxuICAgICAgICBjaGVja2VkOiAhIWNoZWNrZWQsXG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICAgIG9uRm9jdXM6IG9uRm9jdXMsXG4gICAgICAgIG9uQmx1cjogb25CbHVyLFxuICAgICAgICBvbkNoYW5nZTogdGhpcy5oYW5kbGVDaGFuZ2UsXG4gICAgICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZUlucHV0LFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0sIGdsb2JhbFByb3BzKSksIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lclwiKVxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgICBpZiAoJ2NoZWNrZWQnIGluIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgICAgICBjaGVja2VkOiBwcm9wcy5jaGVja2VkXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENoZWNrYm94O1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuQ2hlY2tib3guZGVmYXVsdFByb3BzID0ge1xuICBwcmVmaXhDbHM6ICdyYy1jaGVja2JveCcsXG4gIGNsYXNzTmFtZTogJycsXG4gIHN0eWxlOiB7fSxcbiAgdHlwZTogJ2NoZWNrYm94JyxcbiAgZGVmYXVsdENoZWNrZWQ6IGZhbHNlLFxuICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKCkge30sXG4gIG9uQmx1cjogZnVuY3Rpb24gb25CbHVyKCkge30sXG4gIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZSgpIHt9XG59O1xudmFyIF9kZWZhdWx0ID0gQ2hlY2tib3g7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfc2hhbGxvd2VxdWFsID0gcmVxdWlyZSgnc2hhbGxvd2VxdWFsJyk7XG5cbnZhciBfc2hhbGxvd2VxdWFsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NoYWxsb3dlcXVhbCk7XG5cbnZhciBfdG9BcnJheSA9IHJlcXVpcmUoJ3JjLXV0aWwvbGliL0NoaWxkcmVuL3RvQXJyYXknKTtcblxudmFyIF90b0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3RvQXJyYXkpO1xuXG52YXIgX1BhbmVsID0gcmVxdWlyZSgnLi9QYW5lbCcpO1xuXG52YXIgX1BhbmVsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhbmVsKTtcblxudmFyIF9vcGVuQW5pbWF0aW9uRmFjdG9yeSA9IHJlcXVpcmUoJy4vb3BlbkFuaW1hdGlvbkZhY3RvcnknKTtcblxudmFyIF9vcGVuQW5pbWF0aW9uRmFjdG9yeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vcGVuQW5pbWF0aW9uRmFjdG9yeSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9IC8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cblxuXG5mdW5jdGlvbiBnZXRBY3RpdmVLZXlzQXJyYXkoYWN0aXZlS2V5KSB7XG4gIHZhciBjdXJyZW50QWN0aXZlS2V5ID0gYWN0aXZlS2V5O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudEFjdGl2ZUtleSkpIHtcbiAgICBjdXJyZW50QWN0aXZlS2V5ID0gY3VycmVudEFjdGl2ZUtleSA/IFtjdXJyZW50QWN0aXZlS2V5XSA6IFtdO1xuICB9XG4gIHJldHVybiBjdXJyZW50QWN0aXZlS2V5Lm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIFN0cmluZyhrZXkpO1xuICB9KTtcbn1cblxudmFyIENvbGxhcHNlID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKENvbGxhcHNlLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDb2xsYXBzZShwcm9wcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xsYXBzZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoQ29sbGFwc2UuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDb2xsYXBzZSkpLmNhbGwodGhpcywgcHJvcHMpKTtcblxuICAgIF9pbml0aWFsaXNlUHJvcHMuY2FsbChfdGhpcyk7XG5cbiAgICB2YXIgYWN0aXZlS2V5ID0gcHJvcHMuYWN0aXZlS2V5LFxuICAgICAgICBkZWZhdWx0QWN0aXZlS2V5ID0gcHJvcHMuZGVmYXVsdEFjdGl2ZUtleTtcblxuICAgIHZhciBjdXJyZW50QWN0aXZlS2V5ID0gZGVmYXVsdEFjdGl2ZUtleTtcbiAgICBpZiAoJ2FjdGl2ZUtleScgaW4gcHJvcHMpIHtcbiAgICAgIGN1cnJlbnRBY3RpdmVLZXkgPSBhY3RpdmVLZXk7XG4gICAgfVxuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBvcGVuQW5pbWF0aW9uOiBwcm9wcy5vcGVuQW5pbWF0aW9uIHx8ICgwLCBfb3BlbkFuaW1hdGlvbkZhY3RvcnkyWydkZWZhdWx0J10pKHByb3BzLnByZWZpeENscyksXG4gICAgICBhY3RpdmVLZXk6IGdldEFjdGl2ZUtleXNBcnJheShjdXJyZW50QWN0aXZlS2V5KVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbGxhcHNlLCBbe1xuICAgIGtleTogJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgcmV0dXJuICEoMCwgX3NoYWxsb3dlcXVhbDJbJ2RlZmF1bHQnXSkodGhpcy5wcm9wcywgbmV4dFByb3BzKSB8fCAhKDAsIF9zaGFsbG93ZXF1YWwyWydkZWZhdWx0J10pKHRoaXMuc3RhdGUsIG5leHRTdGF0ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgICAgYWNjb3JkaW9uID0gX3Byb3BzLmFjY29yZGlvbjtcblxuICAgICAgdmFyIGNvbGxhcHNlQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKSgoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBwcmVmaXhDbHMsIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIGNsYXNzTmFtZSwgISFjbGFzc05hbWUpLCBfY2xhc3NOYW1lcykpO1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6IGNvbGxhcHNlQ2xhc3NOYW1lLCBzdHlsZTogc3R5bGUsIHJvbGU6IGFjY29yZGlvbiA/ICd0YWJsaXN0JyA6IG51bGwgfSxcbiAgICAgICAgdGhpcy5nZXRJdGVtcygpXG4gICAgICApO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG5ld1N0YXRlID0ge307XG4gICAgICBpZiAoJ2FjdGl2ZUtleScgaW4gbmV4dFByb3BzKSB7XG4gICAgICAgIG5ld1N0YXRlLmFjdGl2ZUtleSA9IGdldEFjdGl2ZUtleXNBcnJheShuZXh0UHJvcHMuYWN0aXZlS2V5KTtcbiAgICAgIH1cbiAgICAgIGlmICgnb3BlbkFuaW1hdGlvbicgaW4gbmV4dFByb3BzKSB7XG4gICAgICAgIG5ld1N0YXRlLm9wZW5BbmltYXRpb24gPSBuZXh0UHJvcHMub3BlbkFuaW1hdGlvbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdTdGF0ZS5hY3RpdmVLZXkgfHwgbmV3U3RhdGUub3BlbkFuaW1hdGlvbiA/IG5ld1N0YXRlIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29sbGFwc2U7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG52YXIgX2luaXRpYWxpc2VQcm9wcyA9IGZ1bmN0aW9uIF9pbml0aWFsaXNlUHJvcHMoKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIHRoaXMub25DbGlja0l0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGFjdGl2ZUtleSA9IF90aGlzMi5zdGF0ZS5hY3RpdmVLZXk7XG4gICAgaWYgKF90aGlzMi5wcm9wcy5hY2NvcmRpb24pIHtcbiAgICAgIGFjdGl2ZUtleSA9IGFjdGl2ZUtleVswXSA9PT0ga2V5ID8gW10gOiBba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZlS2V5ID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhY3RpdmVLZXkpKTtcbiAgICAgIHZhciBpbmRleCA9IGFjdGl2ZUtleS5pbmRleE9mKGtleSk7XG4gICAgICB2YXIgaXNBY3RpdmUgPSBpbmRleCA+IC0xO1xuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBhY3RpdmUgc3RhdGVcbiAgICAgICAgYWN0aXZlS2V5LnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmVLZXkucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBfdGhpczIuc2V0QWN0aXZlS2V5KGFjdGl2ZUtleSk7XG4gIH07XG5cbiAgdGhpcy5nZXROZXdDaGlsZCA9IGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICBpZiAoIWNoaWxkKSByZXR1cm4gbnVsbDtcblxuICAgIHZhciBhY3RpdmVLZXkgPSBfdGhpczIuc3RhdGUuYWN0aXZlS2V5O1xuICAgIHZhciBfcHJvcHMyID0gX3RoaXMyLnByb3BzLFxuICAgICAgICBwcmVmaXhDbHMgPSBfcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgYWNjb3JkaW9uID0gX3Byb3BzMi5hY2NvcmRpb24sXG4gICAgICAgIGRlc3Ryb3lJbmFjdGl2ZVBhbmVsID0gX3Byb3BzMi5kZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgZXhwYW5kSWNvbiA9IF9wcm9wczIuZXhwYW5kSWNvbjtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBrZXkgcHJvdmlkZSwgdXNlIHRoZSBwYW5lbCBvcmRlciBhcyBkZWZhdWx0IGtleVxuXG4gICAgdmFyIGtleSA9IGNoaWxkLmtleSB8fCBTdHJpbmcoaW5kZXgpO1xuICAgIHZhciBfY2hpbGQkcHJvcHMgPSBjaGlsZC5wcm9wcyxcbiAgICAgICAgaGVhZGVyID0gX2NoaWxkJHByb3BzLmhlYWRlcixcbiAgICAgICAgaGVhZGVyQ2xhc3MgPSBfY2hpbGQkcHJvcHMuaGVhZGVyQ2xhc3MsXG4gICAgICAgIGRpc2FibGVkID0gX2NoaWxkJHByb3BzLmRpc2FibGVkO1xuXG4gICAgdmFyIGlzQWN0aXZlID0gZmFsc2U7XG4gICAgaWYgKGFjY29yZGlvbikge1xuICAgICAgaXNBY3RpdmUgPSBhY3RpdmVLZXlbMF0gPT09IGtleTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNBY3RpdmUgPSBhY3RpdmVLZXkuaW5kZXhPZihrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgdmFyIHByb3BzID0ge1xuICAgICAga2V5OiBrZXksXG4gICAgICBwYW5lbEtleToga2V5LFxuICAgICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgICBoZWFkZXJDbGFzczogaGVhZGVyQ2xhc3MsXG4gICAgICBpc0FjdGl2ZTogaXNBY3RpdmUsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGRlc3Ryb3lJbmFjdGl2ZVBhbmVsOiBkZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgIG9wZW5BbmltYXRpb246IF90aGlzMi5zdGF0ZS5vcGVuQW5pbWF0aW9uLFxuICAgICAgYWNjb3JkaW9uOiBhY2NvcmRpb24sXG4gICAgICBjaGlsZHJlbjogY2hpbGQucHJvcHMuY2hpbGRyZW4sXG4gICAgICBvbkl0ZW1DbGljazogZGlzYWJsZWQgPyBudWxsIDogX3RoaXMyLm9uQ2xpY2tJdGVtLFxuICAgICAgZXhwYW5kSWNvbjogZXhwYW5kSWNvblxuICAgIH07XG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMDQ3OVxuICAgIGlmICh0eXBlb2YgY2hpbGQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNsb25lRWxlbWVudChjaGlsZCwgcHJvcHMpO1xuICB9O1xuXG4gIHRoaXMuZ2V0SXRlbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX3RoaXMyLnByb3BzLmNoaWxkcmVuO1xuXG4gICAgcmV0dXJuICgwLCBfdG9BcnJheTJbJ2RlZmF1bHQnXSkoY2hpbGRyZW4pLm1hcChfdGhpczIuZ2V0TmV3Q2hpbGQpO1xuICB9O1xuXG4gIHRoaXMuc2V0QWN0aXZlS2V5ID0gZnVuY3Rpb24gKGFjdGl2ZUtleSkge1xuICAgIGlmICghKCdhY3RpdmVLZXknIGluIF90aGlzMi5wcm9wcykpIHtcbiAgICAgIF90aGlzMi5zZXRTdGF0ZSh7IGFjdGl2ZUtleTogYWN0aXZlS2V5IH0pO1xuICAgIH1cbiAgICBfdGhpczIucHJvcHMub25DaGFuZ2UoX3RoaXMyLnByb3BzLmFjY29yZGlvbiA/IGFjdGl2ZUtleVswXSA6IGFjdGl2ZUtleSk7XG4gIH07XG59O1xuXG5Db2xsYXBzZS5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZWZpeENsczogJ3JjLWNvbGxhcHNlJyxcbiAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKCkge30sXG5cbiAgYWNjb3JkaW9uOiBmYWxzZSxcbiAgZGVzdHJveUluYWN0aXZlUGFuZWw6IGZhbHNlXG59O1xuXG5Db2xsYXBzZS5QYW5lbCA9IF9QYW5lbDJbJ2RlZmF1bHQnXTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQ29sbGFwc2U7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfUGFuZWxDb250ZW50ID0gcmVxdWlyZSgnLi9QYW5lbENvbnRlbnQnKTtcblxudmFyIF9QYW5lbENvbnRlbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWxDb250ZW50KTtcblxudmFyIF9yY0FuaW1hdGUgPSByZXF1aXJlKCdyYy1hbmltYXRlJyk7XG5cbnZhciBfcmNBbmltYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JjQW5pbWF0ZSk7XG5cbnZhciBfc2hhbGxvd2VxdWFsID0gcmVxdWlyZSgnc2hhbGxvd2VxdWFsJyk7XG5cbnZhciBfc2hhbGxvd2VxdWFsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NoYWxsb3dlcXVhbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfSAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9wcm9wLXR5cGVzICovXG5cblxudmFyIENvbGxhcHNlUGFuZWwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQ29sbGFwc2VQYW5lbCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ29sbGFwc2VQYW5lbCgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29sbGFwc2VQYW5lbCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChfcmVmID0gQ29sbGFwc2VQYW5lbC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENvbGxhcHNlUGFuZWwpKS5jYWxsLmFwcGx5KF9yZWYsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5oYW5kbGVJdGVtQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkl0ZW1DbGljayA9IF90aGlzJHByb3BzLm9uSXRlbUNsaWNrLFxuICAgICAgICAgIHBhbmVsS2V5ID0gX3RoaXMkcHJvcHMucGFuZWxLZXk7XG5cblxuICAgICAgaWYgKHR5cGVvZiBvbkl0ZW1DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkl0ZW1DbGljayhwYW5lbEtleSk7XG4gICAgICB9XG4gICAgfSwgX3RoaXMuaGFuZGxlS2V5UHJlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5Q29kZSA9PT0gMTMgfHwgZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgX3RoaXMuaGFuZGxlSXRlbUNsaWNrKCk7XG4gICAgICB9XG4gICAgfSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29sbGFwc2VQYW5lbCwgW3tcbiAgICBrZXk6ICdzaG91bGRDb21wb25lbnRVcGRhdGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gISgwLCBfc2hhbGxvd2VxdWFsMlsnZGVmYXVsdCddKSh0aGlzLnByb3BzLCBuZXh0UHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfY2xhc3NOYW1lczI7XG5cbiAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgaWQgPSBfcHJvcHMuaWQsXG4gICAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3Byb3BzLnByZWZpeENscyxcbiAgICAgICAgICBoZWFkZXIgPSBfcHJvcHMuaGVhZGVyLFxuICAgICAgICAgIGhlYWRlckNsYXNzID0gX3Byb3BzLmhlYWRlckNsYXNzLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIGlzQWN0aXZlID0gX3Byb3BzLmlzQWN0aXZlLFxuICAgICAgICAgIHNob3dBcnJvdyA9IF9wcm9wcy5zaG93QXJyb3csXG4gICAgICAgICAgZGVzdHJveUluYWN0aXZlUGFuZWwgPSBfcHJvcHMuZGVzdHJveUluYWN0aXZlUGFuZWwsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgICAgYWNjb3JkaW9uID0gX3Byb3BzLmFjY29yZGlvbixcbiAgICAgICAgICBmb3JjZVJlbmRlciA9IF9wcm9wcy5mb3JjZVJlbmRlcixcbiAgICAgICAgICBleHBhbmRJY29uID0gX3Byb3BzLmV4cGFuZEljb24sXG4gICAgICAgICAgZXh0cmEgPSBfcHJvcHMuZXh0cmE7XG5cbiAgICAgIHZhciBoZWFkZXJDbHMgPSAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKHByZWZpeENscyArICctaGVhZGVyJywgX2RlZmluZVByb3BlcnR5KHt9LCBoZWFkZXJDbGFzcywgaGVhZGVyQ2xhc3MpKTtcbiAgICAgIHZhciBpdGVtQ2xzID0gKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKSgoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIHByZWZpeENscyArICctaXRlbScsIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBwcmVmaXhDbHMgKyAnLWl0ZW0tYWN0aXZlJywgaXNBY3RpdmUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBwcmVmaXhDbHMgKyAnLWl0ZW0tZGlzYWJsZWQnLCBkaXNhYmxlZCksIF9jbGFzc05hbWVzMiksIGNsYXNzTmFtZSk7XG5cbiAgICAgIHZhciBpY29uID0gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2knLCB7IGNsYXNzTmFtZTogJ2Fycm93JyB9KTtcbiAgICAgIGlmIChzaG93QXJyb3cgJiYgdHlwZW9mIGV4cGFuZEljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWNvbiA9IGV4cGFuZEljb24odGhpcy5wcm9wcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogaXRlbUNscywgc3R5bGU6IHN0eWxlLCBpZDogaWQgfSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2RpdicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBoZWFkZXJDbHMsXG4gICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUl0ZW1DbGljayxcbiAgICAgICAgICAgIHJvbGU6IGFjY29yZGlvbiA/ICd0YWInIDogJ2J1dHRvbicsXG4gICAgICAgICAgICB0YWJJbmRleDogZGlzYWJsZWQgPyAtMSA6IDAsXG4gICAgICAgICAgICAnYXJpYS1leHBhbmRlZCc6ICcnICsgaXNBY3RpdmUsXG4gICAgICAgICAgICBvbktleVByZXNzOiB0aGlzLmhhbmRsZUtleVByZXNzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzaG93QXJyb3cgJiYgaWNvbixcbiAgICAgICAgICBoZWFkZXIsXG4gICAgICAgICAgZXh0cmEgJiYgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBwcmVmaXhDbHMgKyAnLWV4dHJhJyB9LFxuICAgICAgICAgICAgZXh0cmFcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9yY0FuaW1hdGUyWydkZWZhdWx0J10sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2hvd1Byb3A6ICdpc0FjdGl2ZScsXG4gICAgICAgICAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBjb21wb25lbnQ6ICcnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0aGlzLnByb3BzLm9wZW5BbmltYXRpb25cbiAgICAgICAgICB9LFxuICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgX1BhbmVsQ29udGVudDJbJ2RlZmF1bHQnXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgICAgIGlzQWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgICAgICAgZGVzdHJveUluYWN0aXZlUGFuZWw6IGRlc3Ryb3lJbmFjdGl2ZVBhbmVsLFxuICAgICAgICAgICAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXIsXG4gICAgICAgICAgICAgIHJvbGU6IGFjY29yZGlvbiA/ICd0YWJwYW5lbCcgOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbGxhcHNlUGFuZWw7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5Db2xsYXBzZVBhbmVsLmRlZmF1bHRQcm9wcyA9IHtcbiAgc2hvd0Fycm93OiB0cnVlLFxuICBpc0FjdGl2ZTogZmFsc2UsXG4gIGRlc3Ryb3lJbmFjdGl2ZVBhbmVsOiBmYWxzZSxcbiAgb25JdGVtQ2xpY2s6IGZ1bmN0aW9uIG9uSXRlbUNsaWNrKCkge30sXG5cbiAgaGVhZGVyQ2xhc3M6ICcnLFxuICBmb3JjZVJlbmRlcjogZmFsc2Vcbn07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvbGxhcHNlUGFuZWw7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9jbGFzc25hbWVzMiA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMyKTtcblxudmFyIF9zaGFsbG93ZXF1YWwgPSByZXF1aXJlKCdzaGFsbG93ZXF1YWwnKTtcblxudmFyIF9zaGFsbG93ZXF1YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hhbGxvd2VxdWFsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9IC8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cblxuXG52YXIgUGFuZWxDb250ZW50ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFBhbmVsQ29udGVudCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUGFuZWxDb250ZW50KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYW5lbENvbnRlbnQpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChQYW5lbENvbnRlbnQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihQYW5lbENvbnRlbnQpKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQYW5lbENvbnRlbnQsIFt7XG4gICAga2V5OiAnc2hvdWxkQ29tcG9uZW50VXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuZm9yY2VSZW5kZXIgfHwgISgwLCBfc2hhbGxvd2VxdWFsMlsnZGVmYXVsdCddKSh0aGlzLnByb3BzLCBuZXh0UHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfY2xhc3NuYW1lcztcblxuICAgICAgdGhpcy5faXNBY3RpdmVkID0gdGhpcy5wcm9wcy5mb3JjZVJlbmRlciB8fCB0aGlzLl9pc0FjdGl2ZWQgfHwgdGhpcy5wcm9wcy5pc0FjdGl2ZTtcbiAgICAgIGlmICghdGhpcy5faXNBY3RpdmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3Byb3BzLnByZWZpeENscyxcbiAgICAgICAgICBpc0FjdGl2ZSA9IF9wcm9wcy5pc0FjdGl2ZSxcbiAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBkZXN0cm95SW5hY3RpdmVQYW5lbCA9IF9wcm9wcy5kZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgICBmb3JjZVJlbmRlciA9IF9wcm9wcy5mb3JjZVJlbmRlcixcbiAgICAgICAgICByb2xlID0gX3Byb3BzLnJvbGU7XG5cbiAgICAgIHZhciBjb250ZW50Q2xzID0gKDAsIF9jbGFzc25hbWVzM1snZGVmYXVsdCddKShwcmVmaXhDbHMgKyAnLWNvbnRlbnQnLCAoX2NsYXNzbmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc25hbWVzLCBwcmVmaXhDbHMgKyAnLWNvbnRlbnQtYWN0aXZlJywgaXNBY3RpdmUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzbmFtZXMsIHByZWZpeENscyArICctY29udGVudC1pbmFjdGl2ZScsICFpc0FjdGl2ZSksIF9jbGFzc25hbWVzKSk7XG4gICAgICB2YXIgY2hpbGQgPSAhZm9yY2VSZW5kZXIgJiYgIWlzQWN0aXZlICYmIGRlc3Ryb3lJbmFjdGl2ZVBhbmVsID8gbnVsbCA6IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6IHByZWZpeENscyArICctY29udGVudC1ib3gnIH0sXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApO1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogY29udGVudENscyxcbiAgICAgICAgICByb2xlOiByb2xlXG4gICAgICAgIH0sXG4gICAgICAgIGNoaWxkXG4gICAgICApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQYW5lbENvbnRlbnQ7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBQYW5lbENvbnRlbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlBhbmVsID0gdW5kZWZpbmVkO1xuXG52YXIgX0NvbGxhcHNlID0gcmVxdWlyZSgnLi9Db2xsYXBzZScpO1xuXG52YXIgX0NvbGxhcHNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbGxhcHNlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBfQ29sbGFwc2UyWydkZWZhdWx0J107XG52YXIgUGFuZWwgPSBleHBvcnRzLlBhbmVsID0gX0NvbGxhcHNlMlsnZGVmYXVsdCddLlBhbmVsOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jc3NBbmltYXRpb24gPSByZXF1aXJlKCdAYW50LWRlc2lnbi9jc3MtYW5pbWF0aW9uJyk7XG5cbnZhciBfY3NzQW5pbWF0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nzc0FuaW1hdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gYW5pbWF0ZShub2RlLCBzaG93LCB0cmFuc2l0aW9uTmFtZSwgZG9uZSkge1xuICB2YXIgaGVpZ2h0ID0gdm9pZCAwO1xuICByZXR1cm4gKDAsIF9jc3NBbmltYXRpb24yWydkZWZhdWx0J10pKG5vZGUsIHRyYW5zaXRpb25OYW1lLCB7XG4gICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgaWYgKCFzaG93KSB7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gbm9kZS5vZmZzZXRIZWlnaHQgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVpZ2h0ID0gbm9kZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gMDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuICAgICAgbm9kZS5zdHlsZS5oZWlnaHQgPSAoc2hvdyA/IGhlaWdodCA6IDApICsgJ3B4JztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24gZW5kKCkge1xuICAgICAgbm9kZS5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhbmltYXRpb24ocHJlZml4Q2xzKSB7XG4gIHJldHVybiB7XG4gICAgZW50ZXI6IGZ1bmN0aW9uIGVudGVyKG5vZGUsIGRvbmUpIHtcbiAgICAgIHJldHVybiBhbmltYXRlKG5vZGUsIHRydWUsIHByZWZpeENscyArICctYW5pbScsIGRvbmUpO1xuICAgIH0sXG4gICAgbGVhdmU6IGZ1bmN0aW9uIGxlYXZlKG5vZGUsIGRvbmUpIHtcbiAgICAgIHJldHVybiBhbmltYXRlKG5vZGUsIGZhbHNlLCBwcmVmaXhDbHMgKyAnLWFuaW0nLCBkb25lKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGFuaW1hdGlvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIFJlYWN0RE9NID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0LWRvbVwiKSk7XG5cbnZhciBfS2V5Q29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0tleUNvZGVcIikpO1xuXG52YXIgX2NvbnRhaW5zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2NvbnRhaW5zXCIpKTtcblxudmFyIF9yY0FuaW1hdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1hbmltYXRlXCIpKTtcblxudmFyIF9MYXp5UmVuZGVyQm94ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9MYXp5UmVuZGVyQm94XCIpKTtcblxudmFyIHV1aWQgPSAwO1xuLyogZXNsaW50IHJlYWN0L25vLWlzLW1vdW50ZWQ6MCAqL1xuXG5mdW5jdGlvbiBnZXRTY3JvbGwodywgdG9wKSB7XG4gIHZhciByZXQgPSB3W1wicGFnZVwiLmNvbmNhdCh0b3AgPyAnWScgOiAnWCcsIFwiT2Zmc2V0XCIpXTtcbiAgdmFyIG1ldGhvZCA9IFwic2Nyb2xsXCIuY29uY2F0KHRvcCA/ICdUb3AnIDogJ0xlZnQnKTtcblxuICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICB2YXIgZCA9IHcuZG9jdW1lbnQ7XG4gICAgcmV0ID0gZC5kb2N1bWVudEVsZW1lbnRbbWV0aG9kXTtcblxuICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuICAgICAgcmV0ID0gZC5ib2R5W21ldGhvZF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2V0VHJhbnNmb3JtT3JpZ2luKG5vZGUsIHZhbHVlKSB7XG4gIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XG4gIFsnV2Via2l0JywgJ01veicsICdNcycsICdtcyddLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIHN0eWxlW1wiXCIuY29uY2F0KHByZWZpeCwgXCJUcmFuc2Zvcm1PcmlnaW5cIildID0gdmFsdWU7XG4gIH0pO1xuICBzdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0KGVsKSB7XG4gIHZhciByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBwb3MgPSB7XG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHRvcDogcmVjdC50b3BcbiAgfTtcbiAgdmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3ID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gIHBvcy5sZWZ0ICs9IGdldFNjcm9sbCh3KTtcbiAgcG9zLnRvcCArPSBnZXRTY3JvbGwodywgdHJ1ZSk7XG4gIHJldHVybiBwb3M7XG59XG5cbnZhciBEaWFsb2cgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoRGlhbG9nLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoRGlhbG9nKTtcblxuICBmdW5jdGlvbiBEaWFsb2cocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBEaWFsb2cpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgIF90aGlzLmluVHJhbnNpdGlvbiA9IGZhbHNlO1xuXG4gICAgX3RoaXMub25BbmltYXRlTGVhdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBhZnRlckNsb3NlID0gX3RoaXMkcHJvcHMuYWZ0ZXJDbG9zZSxcbiAgICAgICAgICBnZXRPcGVuQ291bnQgPSBfdGhpcyRwcm9wcy5nZXRPcGVuQ291bnQsXG4gICAgICAgICAgZm9jdXNUcmlnZ2VyQWZ0ZXJDbG9zZSA9IF90aGlzJHByb3BzLmZvY3VzVHJpZ2dlckFmdGVyQ2xvc2UsXG4gICAgICAgICAgbWFzayA9IF90aGlzJHByb3BzLm1hc2s7IC8vIG5lZWQgZGVtbz9cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvZGlhbG9nL3B1bGwvMjhcblxuICAgICAgaWYgKF90aGlzLndyYXApIHtcbiAgICAgICAgX3RoaXMud3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5pblRyYW5zaXRpb24gPSBmYWxzZTsgLy8g5aaC5p6c5rKh5pyJ5omT5byA55qE54q25oCB77yM5YiZ5riF6ZmkIGVmZmVjdCDlkowgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIxNTM5XG5cbiAgICAgIGlmICghZ2V0T3BlbkNvdW50KCkpIHtcbiAgICAgICAgX3RoaXMuc3dpdGNoU2Nyb2xsaW5nRWZmZWN0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXNrICYmIF90aGlzLmxhc3RPdXRTaWRlRm9jdXNOb2RlICYmIGZvY3VzVHJpZ2dlckFmdGVyQ2xvc2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBfdGhpcy5sYXN0T3V0U2lkZUZvY3VzTm9kZS5mb2N1cyh7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBfdGhpcy5sYXN0T3V0U2lkZUZvY3VzTm9kZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5sYXN0T3V0U2lkZUZvY3VzTm9kZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZnRlckNsb3NlKSB7XG4gICAgICAgIGFmdGVyQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25EaWFsb2dNb3VzZURvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5kaWFsb2dNb3VzZURvd24gPSB0cnVlO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbk1hc2tNb3VzZVVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmRpYWxvZ01vdXNlRG93bikge1xuICAgICAgICBfdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5kaWFsb2dNb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uTWFza0NsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIGFuZHJvaWQgdHJpZ2dlciBjbGljayBvbiBvcGVuIChmYXN0Y2xpY2s/PylcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gX3RoaXMub3BlblRpbWUgPCAzMDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZS50YXJnZXQgPT09IGUuY3VycmVudFRhcmdldCAmJiAhX3RoaXMuZGlhbG9nTW91c2VEb3duKSB7XG4gICAgICAgIF90aGlzLmNsb3NlKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbktleURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGtleWJvYXJkID0gX3RoaXMkcHJvcHMyLmtleWJvYXJkLFxuICAgICAgICAgIHZpc2libGUgPSBfdGhpcyRwcm9wczIudmlzaWJsZTtcblxuICAgICAgaWYgKGtleWJvYXJkICYmIGUua2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5FU0MpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBfdGhpcy5jbG9zZShlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIGtlZXAgZm9jdXMgaW5zaWRlIGRpYWxvZ1xuXG5cbiAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuVEFCKSB7XG4gICAgICAgICAgdmFyIF9kb2N1bWVudCA9IGRvY3VtZW50LFxuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50ID0gX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQgPT09IF90aGlzLnNlbnRpbmVsU3RhcnQpIHtcbiAgICAgICAgICAgICAgX3RoaXMuc2VudGluZWxFbmQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUVsZW1lbnQgPT09IF90aGlzLnNlbnRpbmVsRW5kKSB7XG4gICAgICAgICAgICBfdGhpcy5zZW50aW5lbFN0YXJ0LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmdldERpYWxvZ0VsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgY2xvc2FibGUgPSBfdGhpcyRwcm9wczMuY2xvc2FibGUsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMzLnByZWZpeENscyxcbiAgICAgICAgICB3aWR0aCA9IF90aGlzJHByb3BzMy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfdGhpcyRwcm9wczMuaGVpZ2h0LFxuICAgICAgICAgIGZvb3RlciA9IF90aGlzJHByb3BzMy5mb290ZXIsXG4gICAgICAgICAgdGl0bGUgPSBfdGhpcyRwcm9wczMudGl0bGUsXG4gICAgICAgICAgY2xvc2VJY29uID0gX3RoaXMkcHJvcHMzLmNsb3NlSWNvbixcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMy5zdHlsZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczMuY2xhc3NOYW1lLFxuICAgICAgICAgIHZpc2libGUgPSBfdGhpcyRwcm9wczMudmlzaWJsZSxcbiAgICAgICAgICBmb3JjZVJlbmRlciA9IF90aGlzJHByb3BzMy5mb3JjZVJlbmRlcixcbiAgICAgICAgICBib2R5U3R5bGUgPSBfdGhpcyRwcm9wczMuYm9keVN0eWxlLFxuICAgICAgICAgIGJvZHlQcm9wcyA9IF90aGlzJHByb3BzMy5ib2R5UHJvcHMsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczMuY2hpbGRyZW4sXG4gICAgICAgICAgZGVzdHJveU9uQ2xvc2UgPSBfdGhpcyRwcm9wczMuZGVzdHJveU9uQ2xvc2U7XG4gICAgICB2YXIgZGVzdCA9IHt9O1xuXG4gICAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXN0LndpZHRoID0gd2lkdGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChoZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXN0LmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cblxuICAgICAgdmFyIGZvb3Rlck5vZGU7XG5cbiAgICAgIGlmIChmb290ZXIpIHtcbiAgICAgICAgZm9vdGVyTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb290ZXJcIiksXG4gICAgICAgICAgcmVmOiBfdGhpcy5zYXZlUmVmKCdmb290ZXInKVxuICAgICAgICB9LCBmb290ZXIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVhZGVyTm9kZTtcblxuICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgIGhlYWRlck5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyXCIpLFxuICAgICAgICAgIHJlZjogX3RoaXMuc2F2ZVJlZignaGVhZGVyJylcbiAgICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpdGxlXCIpLFxuICAgICAgICAgIGlkOiBfdGhpcy50aXRsZUlkXG4gICAgICAgIH0sIHRpdGxlKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjbG9zZXI7XG5cbiAgICAgIGlmIChjbG9zYWJsZSkge1xuICAgICAgICBjbG9zZXIgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgIG9uQ2xpY2s6IF90aGlzLmNsb3NlLFxuICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIkNsb3NlXCIsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlXCIpXG4gICAgICAgIH0sIGNsb3NlSWNvbiB8fCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlLXhcIilcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVCb3ggPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzdHlsZSksIGRlc3QpO1xuICAgICAgdmFyIHNlbnRpbmVsU3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgb3V0bGluZTogJ25vbmUnXG4gICAgICB9O1xuXG4gICAgICB2YXIgdHJhbnNpdGlvbk5hbWUgPSBfdGhpcy5nZXRUcmFuc2l0aW9uTmFtZSgpO1xuXG4gICAgICB2YXIgZGlhbG9nRWxlbWVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0xhenlSZW5kZXJCb3guZGVmYXVsdCwge1xuICAgICAgICBrZXk6IFwiZGlhbG9nLWVsZW1lbnRcIixcbiAgICAgICAgcm9sZTogXCJkb2N1bWVudFwiLFxuICAgICAgICByZWY6IF90aGlzLnNhdmVSZWYoJ2RpYWxvZycpLFxuICAgICAgICBzdHlsZTogc3R5bGVCb3gsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIiBcIikuY29uY2F0KGNsYXNzTmFtZSB8fCAnJyksXG4gICAgICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgICAgIGZvcmNlUmVuZGVyOiBmb3JjZVJlbmRlcixcbiAgICAgICAgb25Nb3VzZURvd246IF90aGlzLm9uRGlhbG9nTW91c2VEb3duXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgIHJlZjogX3RoaXMuc2F2ZVJlZignc2VudGluZWxTdGFydCcpLFxuICAgICAgICBzdHlsZTogc2VudGluZWxTdHlsZSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKVxuICAgICAgfSwgY2xvc2VyLCBoZWFkZXJOb2RlLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9keVwiKSxcbiAgICAgICAgc3R5bGU6IGJvZHlTdHlsZSxcbiAgICAgICAgcmVmOiBfdGhpcy5zYXZlUmVmKCdib2R5JylcbiAgICAgIH0sIGJvZHlQcm9wcyksIGNoaWxkcmVuKSwgZm9vdGVyTm9kZSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICB0YWJJbmRleDogMCxcbiAgICAgICAgcmVmOiBfdGhpcy5zYXZlUmVmKCdzZW50aW5lbEVuZCcpLFxuICAgICAgICBzdHlsZTogc2VudGluZWxTdHlsZSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjQW5pbWF0ZS5kZWZhdWx0LCB7XG4gICAgICAgIGtleTogXCJkaWFsb2dcIixcbiAgICAgICAgc2hvd1Byb3A6IFwidmlzaWJsZVwiLFxuICAgICAgICBvbkxlYXZlOiBfdGhpcy5vbkFuaW1hdGVMZWF2ZSxcbiAgICAgICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgICAgICBjb21wb25lbnQ6IFwiXCIsXG4gICAgICAgIHRyYW5zaXRpb25BcHBlYXI6IHRydWVcbiAgICAgIH0sIHZpc2libGUgfHwgIWRlc3Ryb3lPbkNsb3NlID8gZGlhbG9nRWxlbWVudCA6IG51bGwpO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRaSW5kZXhTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdHlsZSA9IHt9O1xuICAgICAgdmFyIHpJbmRleCA9IF90aGlzLnByb3BzLnpJbmRleDtcblxuICAgICAgaWYgKHpJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0eWxlLnpJbmRleCA9IHpJbmRleDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRXcmFwU3R5bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgX3RoaXMuZ2V0WkluZGV4U3R5bGUoKSksIF90aGlzLnByb3BzLndyYXBTdHlsZSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldE1hc2tTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBfdGhpcy5nZXRaSW5kZXhTdHlsZSgpKSwgX3RoaXMucHJvcHMubWFza1N0eWxlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0TWFza0VsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgbWFzayA9IF90aGlzJHByb3BzNC5tYXNrLFxuICAgICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzNC5wcmVmaXhDbHMsXG4gICAgICAgICAgdmlzaWJsZSA9IF90aGlzJHByb3BzNC52aXNpYmxlLFxuICAgICAgICAgIG1hc2tQcm9wcyA9IF90aGlzJHByb3BzNC5tYXNrUHJvcHM7XG4gICAgICB2YXIgbWFza0VsZW1lbnQ7XG5cbiAgICAgIGlmIChtYXNrKSB7XG4gICAgICAgIHZhciBtYXNrVHJhbnNpdGlvbiA9IF90aGlzLmdldE1hc2tUcmFuc2l0aW9uTmFtZSgpO1xuXG4gICAgICAgIG1hc2tFbGVtZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChfTGF6eVJlbmRlckJveC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICBzdHlsZTogX3RoaXMuZ2V0TWFza1N0eWxlKCksXG4gICAgICAgICAga2V5OiBcIm1hc2tcIixcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFza1wiKSxcbiAgICAgICAgICBoaWRkZW5DbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFzay1oaWRkZW5cIiksXG4gICAgICAgICAgdmlzaWJsZTogdmlzaWJsZVxuICAgICAgICB9LCBtYXNrUHJvcHMpKTtcblxuICAgICAgICBpZiAobWFza1RyYW5zaXRpb24pIHtcbiAgICAgICAgICBtYXNrRWxlbWVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjQW5pbWF0ZS5kZWZhdWx0LCB7XG4gICAgICAgICAgICBrZXk6IFwibWFza1wiLFxuICAgICAgICAgICAgc2hvd1Byb3A6IFwidmlzaWJsZVwiLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvbmVudDogXCJcIixcbiAgICAgICAgICAgIHRyYW5zaXRpb25OYW1lOiBtYXNrVHJhbnNpdGlvblxuICAgICAgICAgIH0sIG1hc2tFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFza0VsZW1lbnQ7XG4gICAgfTtcblxuICAgIF90aGlzLmdldE1hc2tUcmFuc2l0aW9uTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBtYXNrVHJhbnNpdGlvbk5hbWUgPSBfdGhpcyRwcm9wczUubWFza1RyYW5zaXRpb25OYW1lLFxuICAgICAgICAgIG1hc2tBbmltYXRpb24gPSBfdGhpcyRwcm9wczUubWFza0FuaW1hdGlvbixcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczUucHJlZml4Q2xzO1xuICAgICAgdmFyIHRyYW5zaXRpb25OYW1lID0gbWFza1RyYW5zaXRpb25OYW1lO1xuICAgICAgdmFyIGFuaW1hdGlvbiA9IG1hc2tBbmltYXRpb247XG5cbiAgICAgIGlmICghdHJhbnNpdGlvbk5hbWUgJiYgYW5pbWF0aW9uKSB7XG4gICAgICAgIHRyYW5zaXRpb25OYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGFuaW1hdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cmFuc2l0aW9uTmFtZTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0VHJhbnNpdGlvbk5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgdHJhbnNpdGlvbk5hbWUgPSBfdGhpcyRwcm9wczYudHJhbnNpdGlvbk5hbWUsXG4gICAgICAgICAgYW5pbWF0aW9uID0gX3RoaXMkcHJvcHM2LmFuaW1hdGlvbixcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczYucHJlZml4Q2xzO1xuICAgICAgdmFyIHRyYW5zaXRpb25OYW1lUmVzdWx0ID0gdHJhbnNpdGlvbk5hbWU7XG5cbiAgICAgIGlmICghdHJhbnNpdGlvbk5hbWUgJiYgYW5pbWF0aW9uKSB7XG4gICAgICAgIHRyYW5zaXRpb25OYW1lUmVzdWx0ID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGFuaW1hdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cmFuc2l0aW9uTmFtZVJlc3VsdDtcbiAgICB9O1xuXG4gICAgX3RoaXMuY2xvc2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uQ2xvc2UgPSBfdGhpcy5wcm9wcy5vbkNsb3NlO1xuXG4gICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICBvbkNsb3NlKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlUmVmID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBfdGhpc1tuYW1lXSA9IG5vZGU7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBfdGhpcy50aXRsZUlkID0gXCJyY0RpYWxvZ1RpdGxlXCIuY29uY2F0KHV1aWQpO1xuICAgIHV1aWQgKz0gMTtcblxuICAgIF90aGlzLnN3aXRjaFNjcm9sbGluZ0VmZmVjdCA9IHByb3BzLnN3aXRjaFNjcm9sbGluZ0VmZmVjdCB8fCBmdW5jdGlvbiAoKSB7fTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKERpYWxvZywgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudERpZFVwZGF0ZSh7fSk7IC8vIGlmIGZvcmNlUmVuZGVyIGlzIHRydWUsIHNldCBlbGVtZW50IHN0eWxlIGRpc3BsYXkgdG8gYmUgbm9uZTtcblxuICAgICAgaWYgKHRoaXMucHJvcHMuZm9yY2VSZW5kZXIgJiYgdGhpcy5wcm9wcy52aXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCh0aGlzLnByb3BzLmZvcmNlUmVuZGVyIHx8IHRoaXMucHJvcHMuZ2V0Q29udGFpbmVyID09PSBmYWxzZSAmJiAhdGhpcy5wcm9wcy52aXNpYmxlKSAmJiB0aGlzLndyYXApIHtcbiAgICAgICAgdGhpcy53cmFwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICB2YXIgdmlzaWJsZSA9IHRoaXMucHJvcHMudmlzaWJsZTtcbiAgICAgIHZhciBtb3VzZVBvc2l0aW9uID0gdGhpcy5wcm9wcy5tb3VzZVBvc2l0aW9uO1xuXG4gICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAvLyBmaXJzdCBzaG93XG4gICAgICAgIGlmICghcHJldlByb3BzLnZpc2libGUpIHtcbiAgICAgICAgICB0aGlzLm9wZW5UaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB0aGlzLnN3aXRjaFNjcm9sbGluZ0VmZmVjdCgpO1xuICAgICAgICAgIHRoaXMudHJ5Rm9jdXMoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWZpbmQtZG9tLW5vZGVcblxuICAgICAgICAgIHZhciBkaWFsb2dOb2RlID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5kaWFsb2cpO1xuXG4gICAgICAgICAgaWYgKG1vdXNlUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBlbE9mZnNldCA9IG9mZnNldChkaWFsb2dOb2RlKTtcbiAgICAgICAgICAgIHNldFRyYW5zZm9ybU9yaWdpbihkaWFsb2dOb2RlLCBcIlwiLmNvbmNhdChtb3VzZVBvc2l0aW9uLnggLSBlbE9mZnNldC5sZWZ0LCBcInB4IFwiKS5jb25jYXQobW91c2VQb3NpdGlvbi55IC0gZWxPZmZzZXQudG9wLCBcInB4XCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VHJhbnNmb3JtT3JpZ2luKGRpYWxvZ05vZGUsICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocHJldlByb3BzLnZpc2libGUpIHtcbiAgICAgICAgdGhpcy5pblRyYW5zaXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczcgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHZpc2libGUgPSBfdGhpcyRwcm9wczcudmlzaWJsZSxcbiAgICAgICAgICBnZXRPcGVuQ291bnQgPSBfdGhpcyRwcm9wczcuZ2V0T3BlbkNvdW50O1xuXG4gICAgICBpZiAoKHZpc2libGUgfHwgdGhpcy5pblRyYW5zaXRpb24pICYmICFnZXRPcGVuQ291bnQoKSkge1xuICAgICAgICB0aGlzLnN3aXRjaFNjcm9sbGluZ0VmZmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0cnlGb2N1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cnlGb2N1cygpIHtcbiAgICAgIGlmICghKDAsIF9jb250YWlucy5kZWZhdWx0KSh0aGlzLndyYXAsIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMubGFzdE91dFNpZGVGb2N1c05vZGUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnNlbnRpbmVsU3RhcnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgIG1hc2tDbG9zYWJsZSA9IHByb3BzLm1hc2tDbG9zYWJsZTtcbiAgICAgIHZhciBzdHlsZSA9IHRoaXMuZ2V0V3JhcFN0eWxlKCk7IC8vIGNsZWFyIGhpZGUgZGlzcGxheVxuICAgICAgLy8gYW5kIG9ubHkgc2V0IGRpc3BsYXkgYWZ0ZXIgYXN5bmMgYW5pbSwgbm90IGhlcmUgZm9yIGhpZGVcblxuICAgICAgaWYgKHByb3BzLnZpc2libGUpIHtcbiAgICAgICAgc3R5bGUuZGlzcGxheSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJvb3RcIilcbiAgICAgIH0sIHRoaXMuZ2V0TWFza0VsZW1lbnQoKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBvbktleURvd246IHRoaXMub25LZXlEb3duLFxuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcCBcIikuY29uY2F0KHByb3BzLndyYXBDbGFzc05hbWUgfHwgJycpLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZVJlZignd3JhcCcpLFxuICAgICAgICBvbkNsaWNrOiBtYXNrQ2xvc2FibGUgPyB0aGlzLm9uTWFza0NsaWNrIDogbnVsbCxcbiAgICAgICAgb25Nb3VzZVVwOiBtYXNrQ2xvc2FibGUgPyB0aGlzLm9uTWFza01vdXNlVXAgOiBudWxsLFxuICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiBwcm9wcy50aXRsZSA/IHRoaXMudGl0bGVJZCA6IG51bGwsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgcHJvcHMud3JhcFByb3BzKSwgdGhpcy5nZXREaWFsb2dFbGVtZW50KCkpKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIERpYWxvZztcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gRGlhbG9nO1xuRGlhbG9nLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2xhc3NOYW1lOiAnJyxcbiAgbWFzazogdHJ1ZSxcbiAgdmlzaWJsZTogZmFsc2UsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBjbG9zYWJsZTogdHJ1ZSxcbiAgbWFza0Nsb3NhYmxlOiB0cnVlLFxuICBkZXN0cm95T25DbG9zZTogZmFsc2UsXG4gIHByZWZpeENsczogJ3JjLWRpYWxvZycsXG4gIGZvY3VzVHJpZ2dlckFmdGVyQ2xvc2U6IHRydWVcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1BvcnRhbFdyYXBwZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Qb3J0YWxXcmFwcGVyXCIpKTtcblxudmFyIF9EaWFsb2cgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0RpYWxvZ1wiKSk7XG5cbi8vIGZpeCBpc3N1ZSAjMTA2NTZcblxuLypcbiAqIGdldENvbnRhaW5lciByZW1hcmtzXG4gKiBDdXN0b20gY29udGFpbmVyIHNob3VsZCBub3QgYmUgcmV0dXJuLCBiZWNhdXNlIGluIHRoZSBQb3J0YWwgY29tcG9uZW50LCBpdCB3aWxsIHJlbW92ZSB0aGVcbiAqIHJldHVybiBjb250YWluZXIgZWxlbWVudCBoZXJlLCBpZiB0aGUgY3VzdG9tIGNvbnRhaW5lciBpcyB0aGUgb25seSBjaGlsZCBvZiBpdCdzIGNvbXBvbmVudCxcbiAqIGxpa2UgaXNzdWUgIzEwNjU2LCBJdCB3aWxsIGhhcyBhIGNvbmZsaWN0IHdpdGggcmVtb3ZlQ2hpbGQgbWV0aG9kIGluIHJlYWN0LWRvbS5cbiAqIFNvIGhlcmUgc2hvdWxkIGFkZCBhIGNoaWxkIChkaXYgZWxlbWVudCkgdG8gY3VzdG9tIGNvbnRhaW5lci5cbiAqICovXG52YXIgX2RlZmF1bHQgPSBmdW5jdGlvbiBfZGVmYXVsdChwcm9wcykge1xuICB2YXIgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgICBnZXRDb250YWluZXIgPSBwcm9wcy5nZXRDb250YWluZXIsXG4gICAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyOyAvLyDmuLLmn5PlnKjlvZPliY0gZG9tIOmHjO+8m1xuXG4gIGlmIChnZXRDb250YWluZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0RpYWxvZy5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgZ2V0T3BlbkNvdW50OiBmdW5jdGlvbiBnZXRPcGVuQ291bnQoKSB7XG4gICAgICAgIHJldHVybiAyO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9Qb3J0YWxXcmFwcGVyLmRlZmF1bHQsIHtcbiAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgIGZvcmNlUmVuZGVyOiBmb3JjZVJlbmRlcixcbiAgICBnZXRDb250YWluZXI6IGdldENvbnRhaW5lclxuICB9LCBmdW5jdGlvbiAoY2hpbGRQcm9wcykge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9EaWFsb2cuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIGNoaWxkUHJvcHMpKTtcbiAgfSk7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBMYXp5UmVuZGVyQm94ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKExhenlSZW5kZXJCb3gsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShMYXp5UmVuZGVyQm94KTtcblxuICBmdW5jdGlvbiBMYXp5UmVuZGVyQm94KCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIExhenlSZW5kZXJCb3gpO1xuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKExhenlSZW5kZXJCb3gsIFt7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICBpZiAobmV4dFByb3BzLmZvcmNlUmVuZGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gISFuZXh0UHJvcHMuaGlkZGVuQ2xhc3NOYW1lIHx8ICEhbmV4dFByb3BzLnZpc2libGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBoaWRkZW5DbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5oaWRkZW5DbGFzc05hbWUsXG4gICAgICAgICAgdmlzaWJsZSA9IF90aGlzJHByb3BzLnZpc2libGUsXG4gICAgICAgICAgZm9yY2VSZW5kZXIgPSBfdGhpcyRwcm9wcy5mb3JjZVJlbmRlcixcbiAgICAgICAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfdGhpcyRwcm9wcywgW1wiY2xhc3NOYW1lXCIsIFwiaGlkZGVuQ2xhc3NOYW1lXCIsIFwidmlzaWJsZVwiLCBcImZvcmNlUmVuZGVyXCJdKTtcbiAgICAgIHZhciB1c2VDbGFzc05hbWUgPSBjbGFzc05hbWU7XG5cbiAgICAgIGlmICghIWhpZGRlbkNsYXNzTmFtZSAmJiAhdmlzaWJsZSkge1xuICAgICAgICB1c2VDbGFzc05hbWUgKz0gXCIgXCIuY29uY2F0KGhpZGRlbkNsYXNzTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6IHVzZUNsYXNzTmFtZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gTGF6eVJlbmRlckJveDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gTGF6eVJlbmRlckJveDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfRGlhbG9nV3JhcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRGlhbG9nV3JhcFwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9EaWFsb2dXcmFwLmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKSk7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiKSk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9nZXRTY3JvbGxCYXJTaXplID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvZ2V0U2Nyb2xsQmFyU2l6ZVwiKSk7XG5cbnZhciBfS2V5Q29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0tleUNvZGVcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMi5kZWZhdWx0KSh0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIGN1cnJlbnREcmF3ZXIgPSB7fTtcblxudmFyIERyYXdlckNoaWxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKERyYXdlckNoaWxkLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKERyYXdlckNoaWxkKTtcblxuICBmdW5jdGlvbiBEcmF3ZXJDaGlsZChwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIERyYXdlckNoaWxkKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF90aGlzLmRvbUZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmRvbSkge1xuICAgICAgICBfdGhpcy5kb20uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMucmVtb3ZlU3RhcnRIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnN0YXJ0UG9zID0ge1xuICAgICAgICB4OiBlLnRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgeTogZS50b3VjaGVzWzBdLmNsaWVudFlcbiAgICAgIH07XG4gICAgfTtcblxuICAgIF90aGlzLnJlbW92ZU1vdmVIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IGUuY3VycmVudFRhcmdldDtcbiAgICAgIHZhciBkaWZmZXJYID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gX3RoaXMuc3RhcnRQb3MueDtcbiAgICAgIHZhciBkaWZmZXJZID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gX3RoaXMuc3RhcnRQb3MueTtcblxuICAgICAgaWYgKChjdXJyZW50VGFyZ2V0ID09PSBfdGhpcy5tYXNrRG9tIHx8IGN1cnJlbnRUYXJnZXQgPT09IF90aGlzLmhhbmRsZXJEb20gfHwgY3VycmVudFRhcmdldCA9PT0gX3RoaXMuY29udGVudERvbSAmJiAoMCwgX3V0aWxzLmdldFRvdWNoUGFyZW50U2Nyb2xsKShjdXJyZW50VGFyZ2V0LCBlLnRhcmdldCwgZGlmZmVyWCwgZGlmZmVyWSkpICYmIGUuY2FuY2VsYWJsZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGRvbSA9IGUudGFyZ2V0O1xuICAgICAgKDAsIF91dGlscy5yZW1vdmVFdmVudExpc3RlbmVyKShkb20sIF91dGlscy50cmFuc2l0aW9uRW5kLCBfdGhpcy50cmFuc2l0aW9uRW5kKTtcbiAgICAgIGRvbS5zdHlsZS50cmFuc2l0aW9uID0gJyc7XG4gICAgfTtcblxuICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkVTQykge1xuICAgICAgICB2YXIgb25DbG9zZSA9IF90aGlzLnByb3BzLm9uQ2xvc2U7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgICBvbkNsb3NlKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uV3JhcHBlclRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb3BlbiA9IF90aGlzJHByb3BzLm9wZW4sXG4gICAgICAgICAgYWZ0ZXJWaXNpYmxlQ2hhbmdlID0gX3RoaXMkcHJvcHMuYWZ0ZXJWaXNpYmxlQ2hhbmdlO1xuXG4gICAgICBpZiAoZS50YXJnZXQgPT09IF90aGlzLmNvbnRlbnRXcmFwcGVyICYmIGUucHJvcGVydHlOYW1lLm1hdGNoKC90cmFuc2Zvcm0kLykpIHtcbiAgICAgICAgX3RoaXMuZG9tLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcblxuICAgICAgICBpZiAoIW9wZW4gJiYgX3RoaXMuZ2V0Q3VycmVudERyYXdlclNvbWUoKSkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dYID0gJyc7XG5cbiAgICAgICAgICBpZiAoX3RoaXMubWFza0RvbSkge1xuICAgICAgICAgICAgX3RoaXMubWFza0RvbS5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgICAgICAgICBfdGhpcy5tYXNrRG9tLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFmdGVyVmlzaWJsZUNoYW5nZSkge1xuICAgICAgICAgIGFmdGVyVmlzaWJsZUNoYW5nZSghIW9wZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9wZW5MZXZlbFRyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb3BlbiA9IF90aGlzJHByb3BzMi5vcGVuLFxuICAgICAgICAgIHdpZHRoID0gX3RoaXMkcHJvcHMyLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzMi5oZWlnaHQ7XG5cbiAgICAgIHZhciBfdGhpcyRnZXRIb3Jpem9udGFsQm8gPSBfdGhpcy5nZXRIb3Jpem9udGFsQm9vbEFuZFBsYWNlbWVudE5hbWUoKSxcbiAgICAgICAgICBpc0hvcml6b250YWwgPSBfdGhpcyRnZXRIb3Jpem9udGFsQm8uaXNIb3Jpem9udGFsLFxuICAgICAgICAgIHBsYWNlbWVudE5hbWUgPSBfdGhpcyRnZXRIb3Jpem9udGFsQm8ucGxhY2VtZW50TmFtZTtcblxuICAgICAgdmFyIGNvbnRlbnRWYWx1ZSA9IF90aGlzLmNvbnRlbnREb20gPyBfdGhpcy5jb250ZW50RG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2lzSG9yaXpvbnRhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0J10gOiAwO1xuICAgICAgdmFyIHZhbHVlID0gKGlzSG9yaXpvbnRhbCA/IHdpZHRoIDogaGVpZ2h0KSB8fCBjb250ZW50VmFsdWU7XG5cbiAgICAgIF90aGlzLnNldExldmVsQW5kU2Nyb2xsaW5nKG9wZW4sIHBsYWNlbWVudE5hbWUsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2V0TGV2ZWxUcmFuc2Zvcm0gPSBmdW5jdGlvbiAob3BlbiwgcGxhY2VtZW50TmFtZSwgdmFsdWUsIHJpZ2h0KSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgcGxhY2VtZW50ID0gX3RoaXMkcHJvcHMzLnBsYWNlbWVudCxcbiAgICAgICAgICBsZXZlbE1vdmUgPSBfdGhpcyRwcm9wczMubGV2ZWxNb3ZlLFxuICAgICAgICAgIGR1cmF0aW9uID0gX3RoaXMkcHJvcHMzLmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2UgPSBfdGhpcyRwcm9wczMuZWFzZSxcbiAgICAgICAgICBzaG93TWFzayA9IF90aGlzJHByb3BzMy5zaG93TWFzazsgLy8gcm91dGVyIOWIh+aNouaXtuWPr+iDveS8muWvvOiHs+mhtemdouWkseWOu+a7muWKqOadoe+8jOaJgOS7pemcgOimgeaXtuaXtuiOt+WPluOAglxuXG4gICAgICBfdGhpcy5sZXZlbERvbS5mb3JFYWNoKGZ1bmN0aW9uIChkb20pIHtcbiAgICAgICAgZG9tLnN0eWxlLnRyYW5zaXRpb24gPSBcInRyYW5zZm9ybSBcIi5jb25jYXQoZHVyYXRpb24sIFwiIFwiKS5jb25jYXQoZWFzZSk7XG4gICAgICAgICgwLCBfdXRpbHMuYWRkRXZlbnRMaXN0ZW5lcikoZG9tLCBfdXRpbHMudHJhbnNpdGlvbkVuZCwgX3RoaXMudHJhbnNpdGlvbkVuZCk7XG4gICAgICAgIHZhciBsZXZlbFZhbHVlID0gb3BlbiA/IHZhbHVlIDogMDtcblxuICAgICAgICBpZiAobGV2ZWxNb3ZlKSB7XG4gICAgICAgICAgdmFyICRsZXZlbE1vdmUgPSAoMCwgX3V0aWxzLnRyYW5zZm9ybUFyZ3VtZW50cykobGV2ZWxNb3ZlLCB7XG4gICAgICAgICAgICB0YXJnZXQ6IGRvbSxcbiAgICAgICAgICAgIG9wZW46IG9wZW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXZlbFZhbHVlID0gb3BlbiA/ICRsZXZlbE1vdmVbMF0gOiAkbGV2ZWxNb3ZlWzFdIHx8IDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgJHZhbHVlID0gdHlwZW9mIGxldmVsVmFsdWUgPT09ICdudW1iZXInID8gXCJcIi5jb25jYXQobGV2ZWxWYWx1ZSwgXCJweFwiKSA6IGxldmVsVmFsdWU7XG4gICAgICAgIHZhciBwbGFjZW1lbnRQb3MgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyB8fCBwbGFjZW1lbnQgPT09ICd0b3AnID8gJHZhbHVlIDogXCItXCIuY29uY2F0KCR2YWx1ZSk7XG4gICAgICAgIHBsYWNlbWVudFBvcyA9IHNob3dNYXNrICYmIHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyAmJiByaWdodCA/IFwiY2FsYyhcIi5jb25jYXQocGxhY2VtZW50UG9zLCBcIiArIFwiKS5jb25jYXQocmlnaHQsIFwicHgpXCIpIDogcGxhY2VtZW50UG9zO1xuICAgICAgICBkb20uc3R5bGUudHJhbnNmb3JtID0gbGV2ZWxWYWx1ZSA/IFwiXCIuY29uY2F0KHBsYWNlbWVudE5hbWUsIFwiKFwiKS5jb25jYXQocGxhY2VtZW50UG9zLCBcIilcIikgOiAnJztcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXRMZXZlbEFuZFNjcm9sbGluZyA9IGZ1bmN0aW9uIChvcGVuLCBwbGFjZW1lbnROYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIG9uQ2hhbmdlID0gX3RoaXMucHJvcHMub25DaGFuZ2U7XG5cbiAgICAgIGlmICghX3V0aWxzLndpbmRvd0lzVW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciByaWdodCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ID4gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggPyAoMCwgX2dldFNjcm9sbEJhclNpemUuZGVmYXVsdCkodHJ1ZSkgOiAwO1xuXG4gICAgICAgIF90aGlzLnNldExldmVsVHJhbnNmb3JtKG9wZW4sIHBsYWNlbWVudE5hbWUsIHZhbHVlLCByaWdodCk7XG5cbiAgICAgICAgX3RoaXMudG9nZ2xlU2Nyb2xsaW5nVG9EcmF3ZXJBbmRCb2R5KHJpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKG9wZW4pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy50b2dnbGVTY3JvbGxpbmdUb0RyYXdlckFuZEJvZHkgPSBmdW5jdGlvbiAocmlnaHQpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBnZXRPcGVuQ291bnQgPSBfdGhpcyRwcm9wczQuZ2V0T3BlbkNvdW50LFxuICAgICAgICAgIGdldENvbnRhaW5lciA9IF90aGlzJHByb3BzNC5nZXRDb250YWluZXIsXG4gICAgICAgICAgc2hvd01hc2sgPSBfdGhpcyRwcm9wczQuc2hvd01hc2ssXG4gICAgICAgICAgb3BlbiA9IF90aGlzJHByb3BzNC5vcGVuO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lciAmJiBnZXRDb250YWluZXIoKTtcbiAgICAgIHZhciBvcGVuQ291bnQgPSBnZXRPcGVuQ291bnQgJiYgZ2V0T3BlbkNvdW50KCk7IC8vIOWkhOeQhiBib2R5IOa7muWKqFxuXG4gICAgICBpZiAoY29udGFpbmVyICYmIGNvbnRhaW5lci5wYXJlbnROb2RlID09PSBkb2N1bWVudC5ib2R5ICYmIHNob3dNYXNrKSB7XG4gICAgICAgIHZhciBldmVudEFycmF5ID0gWyd0b3VjaHN0YXJ0J107XG4gICAgICAgIHZhciBkb21BcnJheSA9IFtkb2N1bWVudC5ib2R5LCBfdGhpcy5tYXNrRG9tLCBfdGhpcy5oYW5kbGVyRG9tLCBfdGhpcy5jb250ZW50RG9tXTtcblxuICAgICAgICBpZiAob3BlbiAmJiBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ICE9PSAnaGlkZGVuJykge1xuICAgICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgX3RoaXMuYWRkU2Nyb2xsaW5nRWZmZWN0KHJpZ2h0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3BlbkNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS50b3VjaEFjdGlvbiA9ICdub25lJzsgLy8g5omL5py656aB5ruaXG5cbiAgICAgICAgICBkb21BcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAoMCwgX3V0aWxzLmFkZEV2ZW50TGlzdGVuZXIpKGl0ZW0sIGV2ZW50QXJyYXlbaV0gfHwgJ3RvdWNobW92ZScsIGkgPyBfdGhpcy5yZW1vdmVNb3ZlSGFuZGxlciA6IF90aGlzLnJlbW92ZVN0YXJ0SGFuZGxlciwgX3RoaXMucGFzc2l2ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoX3RoaXMuZ2V0Q3VycmVudERyYXdlclNvbWUoKSkge1xuICAgICAgICAgIC8vIOayoeacieW8ueahhueahOeKtuaAgeS4i+a4hemZpCBvdmVyZmxvdztcbiAgICAgICAgICBpZiAoIW9wZW5Db3VudCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudG91Y2hBY3Rpb24gPSAnJztcblxuICAgICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgX3RoaXMucmVtU2Nyb2xsaW5nRWZmZWN0KHJpZ2h0KTtcbiAgICAgICAgICB9IC8vIOaBouWkjeS6i+S7tlxuXG5cbiAgICAgICAgICBkb21BcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAoMCwgX3V0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIpKGl0ZW0sIGV2ZW50QXJyYXlbaV0gfHwgJ3RvdWNobW92ZScsIGkgPyBfdGhpcy5yZW1vdmVNb3ZlSGFuZGxlciA6IF90aGlzLnJlbW92ZVN0YXJ0SGFuZGxlciwgX3RoaXMucGFzc2l2ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuYWRkU2Nyb2xsaW5nRWZmZWN0ID0gZnVuY3Rpb24gKHJpZ2h0KSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgcGxhY2VtZW50ID0gX3RoaXMkcHJvcHM1LnBsYWNlbWVudCxcbiAgICAgICAgICBkdXJhdGlvbiA9IF90aGlzJHByb3BzNS5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlID0gX3RoaXMkcHJvcHM1LmVhc2UsXG4gICAgICAgICAgZ2V0T3BlbkNvdW50ID0gX3RoaXMkcHJvcHM1LmdldE9wZW5Db3VudCxcbiAgICAgICAgICBzd2l0Y2hTY3JvbGxpbmdFZmZlY3QgPSBfdGhpcyRwcm9wczUuc3dpdGNoU2Nyb2xsaW5nRWZmZWN0O1xuICAgICAgdmFyIG9wZW5Db3VudCA9IGdldE9wZW5Db3VudCAmJiBnZXRPcGVuQ291bnQoKTtcblxuICAgICAgaWYgKG9wZW5Db3VudCA9PT0gMSkge1xuICAgICAgICBzd2l0Y2hTY3JvbGxpbmdFZmZlY3QoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHdpZHRoVHJhbnNpdGlvbiA9IFwid2lkdGggXCIuY29uY2F0KGR1cmF0aW9uLCBcIiBcIikuY29uY2F0KGVhc2UpO1xuICAgICAgdmFyIHRyYW5zZm9ybVRyYW5zaXRpb24gPSBcInRyYW5zZm9ybSBcIi5jb25jYXQoZHVyYXRpb24sIFwiIFwiKS5jb25jYXQoZWFzZSk7XG4gICAgICBfdGhpcy5kb20uc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcblxuICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIF90aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVgoLVwiLmNvbmNhdChyaWdodCwgXCJweClcIik7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICBfdGhpcy5kb20uc3R5bGUud2lkdGggPSBcImNhbGMoMTAwJSAtIFwiLmNvbmNhdChyaWdodCwgXCJweClcIik7XG4gICAgICAgICAgX3RoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVaKDApJztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjbGVhclRpbWVvdXQoX3RoaXMudGltZW91dCk7XG4gICAgICBfdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpcy5kb20pIHtcbiAgICAgICAgICBfdGhpcy5kb20uc3R5bGUudHJhbnNpdGlvbiA9IFwiXCIuY29uY2F0KHRyYW5zZm9ybVRyYW5zaXRpb24sIFwiLFwiKS5jb25jYXQod2lkdGhUcmFuc2l0aW9uKTtcbiAgICAgICAgICBfdGhpcy5kb20uc3R5bGUud2lkdGggPSAnJztcbiAgICAgICAgICBfdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW1TY3JvbGxpbmdFZmZlY3QgPSBmdW5jdGlvbiAocmlnaHQpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBwbGFjZW1lbnQgPSBfdGhpcyRwcm9wczYucGxhY2VtZW50LFxuICAgICAgICAgIGR1cmF0aW9uID0gX3RoaXMkcHJvcHM2LmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2UgPSBfdGhpcyRwcm9wczYuZWFzZSxcbiAgICAgICAgICBnZXRPcGVuQ291bnQgPSBfdGhpcyRwcm9wczYuZ2V0T3BlbkNvdW50LFxuICAgICAgICAgIHN3aXRjaFNjcm9sbGluZ0VmZmVjdCA9IF90aGlzJHByb3BzNi5zd2l0Y2hTY3JvbGxpbmdFZmZlY3Q7XG4gICAgICB2YXIgb3BlbkNvdW50ID0gZ2V0T3BlbkNvdW50ICYmIGdldE9wZW5Db3VudCgpO1xuXG4gICAgICBpZiAoIW9wZW5Db3VudCkge1xuICAgICAgICBzd2l0Y2hTY3JvbGxpbmdFZmZlY3QodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdXRpbHMudHJhbnNpdGlvblN0cikge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5kb20uc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgIHZhciBoZWlnaHRUcmFuc2l0aW9uO1xuICAgICAgdmFyIHdpZHRoVHJhbnNpdGlvbiA9IFwid2lkdGggXCIuY29uY2F0KGR1cmF0aW9uLCBcIiBcIikuY29uY2F0KGVhc2UpO1xuICAgICAgdmFyIHRyYW5zZm9ybVRyYW5zaXRpb24gPSBcInRyYW5zZm9ybSBcIi5jb25jYXQoZHVyYXRpb24sIFwiIFwiKS5jb25jYXQoZWFzZSk7XG5cbiAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIF90aGlzLmRvbS5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgIHdpZHRoVHJhbnNpdGlvbiA9IFwid2lkdGggMHMgXCIuY29uY2F0KGVhc2UsIFwiIFwiKS5jb25jYXQoZHVyYXRpb24pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGVYKFwiLmNvbmNhdChyaWdodCwgXCJweClcIik7XG4gICAgICAgICAgICBfdGhpcy5kb20uc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgICAgICB3aWR0aFRyYW5zaXRpb24gPSBcIndpZHRoIDBzIFwiLmNvbmNhdChlYXNlLCBcIiBcIikuY29uY2F0KGR1cmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKF90aGlzLm1hc2tEb20pIHtcbiAgICAgICAgICAgICAgX3RoaXMubWFza0RvbS5zdHlsZS5sZWZ0ID0gXCItXCIuY29uY2F0KHJpZ2h0LCBcInB4XCIpO1xuICAgICAgICAgICAgICBfdGhpcy5tYXNrRG9tLnN0eWxlLndpZHRoID0gXCJjYWxjKDEwMCUgKyBcIi5jb25jYXQocmlnaHQsIFwicHgpXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGhpcy5kb20uc3R5bGUud2lkdGggPSBcImNhbGMoMTAwJSArIFwiLmNvbmNhdChyaWdodCwgXCJweClcIik7XG4gICAgICAgICAgICBfdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgICAgICAgX3RoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVaKDApJztcbiAgICAgICAgICAgIGhlaWdodFRyYW5zaXRpb24gPSBcImhlaWdodCAwcyBcIi5jb25jYXQoZWFzZSwgXCIgXCIpLmNvbmNhdChkdXJhdGlvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLnRpbWVvdXQpO1xuICAgICAgX3RoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuZG9tKSB7XG4gICAgICAgICAgX3RoaXMuZG9tLnN0eWxlLnRyYW5zaXRpb24gPSBcIlwiLmNvbmNhdCh0cmFuc2Zvcm1UcmFuc2l0aW9uLCBcIixcIikuY29uY2F0KGhlaWdodFRyYW5zaXRpb24gPyBcIlwiLmNvbmNhdChoZWlnaHRUcmFuc2l0aW9uLCBcIixcIikgOiAnJykuY29uY2F0KHdpZHRoVHJhbnNpdGlvbik7XG4gICAgICAgICAgX3RoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgICAgIF90aGlzLmRvbS5zdHlsZS53aWR0aCA9ICcnO1xuICAgICAgICAgIF90aGlzLmRvbS5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldEN1cnJlbnREcmF3ZXJTb21lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICFPYmplY3Qua2V5cyhjdXJyZW50RHJhd2VyKS5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREcmF3ZXJba2V5XTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRMZXZlbERvbSA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgbGV2ZWwgPSBfcmVmLmxldmVsLFxuICAgICAgICAgIGdldENvbnRhaW5lciA9IF9yZWYuZ2V0Q29udGFpbmVyO1xuXG4gICAgICBpZiAoX3V0aWxzLndpbmRvd0lzVW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lciAmJiBnZXRDb250YWluZXIoKTtcbiAgICAgIHZhciBwYXJlbnQgPSBjb250YWluZXIgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IG51bGw7XG4gICAgICBfdGhpcy5sZXZlbERvbSA9IFtdO1xuXG4gICAgICBpZiAobGV2ZWwgPT09ICdhbGwnKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudCA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHBhcmVudC5jaGlsZHJlbikgOiBbXTtcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICBpZiAoY2hpbGQubm9kZU5hbWUgIT09ICdTQ1JJUFQnICYmIGNoaWxkLm5vZGVOYW1lICE9PSAnU1RZTEUnICYmIGNoaWxkLm5vZGVOYW1lICE9PSAnTElOSycgJiYgY2hpbGQgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgICAgX3RoaXMubGV2ZWxEb20ucHVzaChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAobGV2ZWwpIHtcbiAgICAgICAgKDAsIF91dGlscy5kYXRhVG9BcnJheSkobGV2ZWwpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBfdGhpcy5sZXZlbERvbS5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0SG9yaXpvbnRhbEJvb2xBbmRQbGFjZW1lbnROYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBsYWNlbWVudCA9IF90aGlzLnByb3BzLnBsYWNlbWVudDtcbiAgICAgIHZhciBpc0hvcml6b250YWwgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyB8fCBwbGFjZW1lbnQgPT09ICdyaWdodCc7XG4gICAgICB2YXIgcGxhY2VtZW50TmFtZSA9IFwidHJhbnNsYXRlXCIuY29uY2F0KGlzSG9yaXpvbnRhbCA/ICdYJyA6ICdZJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc0hvcml6b250YWw6IGlzSG9yaXpvbnRhbCxcbiAgICAgICAgcGxhY2VtZW50TmFtZTogcGxhY2VtZW50TmFtZVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBfc2VsZjogKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoRHJhd2VyQ2hpbGQsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICghX3V0aWxzLndpbmRvd0lzVW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gICAgICAgIHRoaXMucGFzc2l2ZSA9IHBhc3NpdmVTdXBwb3J0ZWQgPyB7XG4gICAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgICAgfSA6IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBvcGVuID0gX3RoaXMkcHJvcHM3Lm9wZW4sXG4gICAgICAgICAgZ2V0Q29udGFpbmVyID0gX3RoaXMkcHJvcHM3LmdldENvbnRhaW5lcjtcbiAgICAgIHZhciBjb250YWluZXIgPSBnZXRDb250YWluZXIgJiYgZ2V0Q29udGFpbmVyKCk7XG4gICAgICB0aGlzLmRyYXdlcklkID0gXCJkcmF3ZXJfaWRfXCIuY29uY2F0KE51bWJlcigoRGF0ZS5ub3coKSArIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDkpLnRvU3RyaW5nKCkpKS50b1N0cmluZygxNikpO1xuICAgICAgdGhpcy5nZXRMZXZlbERvbSh0aGlzLnByb3BzKTtcblxuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgaWYgKGNvbnRhaW5lciAmJiBjb250YWluZXIucGFyZW50Tm9kZSA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgIGN1cnJlbnREcmF3ZXJbdGhpcy5kcmF3ZXJJZF0gPSBvcGVuO1xuICAgICAgICB9IC8vIOm7mOiupOaJk+W8gOeKtuaAgeaXtuaOqOWHuiBsZXZlbDtcblxuXG4gICAgICAgIHRoaXMub3BlbkxldmVsVHJhbnNpdGlvbigpO1xuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIuZG9tRm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM4ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBvcGVuID0gX3RoaXMkcHJvcHM4Lm9wZW4sXG4gICAgICAgICAgZ2V0Q29udGFpbmVyID0gX3RoaXMkcHJvcHM4LmdldENvbnRhaW5lcjtcbiAgICAgIHZhciBjb250YWluZXIgPSBnZXRDb250YWluZXIgJiYgZ2V0Q29udGFpbmVyKCk7XG5cbiAgICAgIGlmIChvcGVuICE9PSBwcmV2UHJvcHMub3Blbikge1xuICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgIHRoaXMuZG9tRm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLnBhcmVudE5vZGUgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICBjdXJyZW50RHJhd2VyW3RoaXMuZHJhd2VySWRdID0gISFvcGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcGVuTGV2ZWxUcmFuc2l0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzOSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgZ2V0T3BlbkNvdW50ID0gX3RoaXMkcHJvcHM5LmdldE9wZW5Db3VudCxcbiAgICAgICAgICBvcGVuID0gX3RoaXMkcHJvcHM5Lm9wZW4sXG4gICAgICAgICAgc3dpdGNoU2Nyb2xsaW5nRWZmZWN0ID0gX3RoaXMkcHJvcHM5LnN3aXRjaFNjcm9sbGluZ0VmZmVjdDtcbiAgICAgIHZhciBvcGVuQ291bnQgPSB0eXBlb2YgZ2V0T3BlbkNvdW50ID09PSAnZnVuY3Rpb24nICYmIGdldE9wZW5Db3VudCgpO1xuICAgICAgZGVsZXRlIGN1cnJlbnREcmF3ZXJbdGhpcy5kcmF3ZXJJZF07XG5cbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIHRoaXMuc2V0TGV2ZWxUcmFuc2Zvcm0oZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnRvdWNoQWN0aW9uID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGlmICghb3BlbkNvdW50KSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICAgICAgc3dpdGNoU2Nyb2xsaW5nRWZmZWN0KHRydWUpO1xuICAgICAgfVxuICAgIH0gLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1lbWJlci1vcmRlcmluZ1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfY2xhc3NuYW1lcyxcbiAgICAgICAgICBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMxMCA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMxMC5jbGFzc05hbWUsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczEwLmNoaWxkcmVuLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMxMC5zdHlsZSxcbiAgICAgICAgICB3aWR0aCA9IF90aGlzJHByb3BzMTAud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMxMC5oZWlnaHQsXG4gICAgICAgICAgZGVmYXVsdE9wZW4gPSBfdGhpcyRwcm9wczEwLmRlZmF1bHRPcGVuLFxuICAgICAgICAgICRvcGVuID0gX3RoaXMkcHJvcHMxMC5vcGVuLFxuICAgICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzMTAucHJlZml4Q2xzLFxuICAgICAgICAgIHBsYWNlbWVudCA9IF90aGlzJHByb3BzMTAucGxhY2VtZW50LFxuICAgICAgICAgIGxldmVsID0gX3RoaXMkcHJvcHMxMC5sZXZlbCxcbiAgICAgICAgICBsZXZlbE1vdmUgPSBfdGhpcyRwcm9wczEwLmxldmVsTW92ZSxcbiAgICAgICAgICBlYXNlID0gX3RoaXMkcHJvcHMxMC5lYXNlLFxuICAgICAgICAgIGR1cmF0aW9uID0gX3RoaXMkcHJvcHMxMC5kdXJhdGlvbixcbiAgICAgICAgICBnZXRDb250YWluZXIgPSBfdGhpcyRwcm9wczEwLmdldENvbnRhaW5lcixcbiAgICAgICAgICBoYW5kbGVyID0gX3RoaXMkcHJvcHMxMC5oYW5kbGVyLFxuICAgICAgICAgIG9uQ2hhbmdlID0gX3RoaXMkcHJvcHMxMC5vbkNoYW5nZSxcbiAgICAgICAgICBhZnRlclZpc2libGVDaGFuZ2UgPSBfdGhpcyRwcm9wczEwLmFmdGVyVmlzaWJsZUNoYW5nZSxcbiAgICAgICAgICBzaG93TWFzayA9IF90aGlzJHByb3BzMTAuc2hvd01hc2ssXG4gICAgICAgICAgbWFza0Nsb3NhYmxlID0gX3RoaXMkcHJvcHMxMC5tYXNrQ2xvc2FibGUsXG4gICAgICAgICAgbWFza1N0eWxlID0gX3RoaXMkcHJvcHMxMC5tYXNrU3R5bGUsXG4gICAgICAgICAgb25DbG9zZSA9IF90aGlzJHByb3BzMTAub25DbG9zZSxcbiAgICAgICAgICBvbkhhbmRsZUNsaWNrID0gX3RoaXMkcHJvcHMxMC5vbkhhbmRsZUNsaWNrLFxuICAgICAgICAgIGtleWJvYXJkID0gX3RoaXMkcHJvcHMxMC5rZXlib2FyZCxcbiAgICAgICAgICBnZXRPcGVuQ291bnQgPSBfdGhpcyRwcm9wczEwLmdldE9wZW5Db3VudCxcbiAgICAgICAgICBzd2l0Y2hTY3JvbGxpbmdFZmZlY3QgPSBfdGhpcyRwcm9wczEwLnN3aXRjaFNjcm9sbGluZ0VmZmVjdCxcbiAgICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF90aGlzJHByb3BzMTAsIFtcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwic3R5bGVcIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcImRlZmF1bHRPcGVuXCIsIFwib3BlblwiLCBcInByZWZpeENsc1wiLCBcInBsYWNlbWVudFwiLCBcImxldmVsXCIsIFwibGV2ZWxNb3ZlXCIsIFwiZWFzZVwiLCBcImR1cmF0aW9uXCIsIFwiZ2V0Q29udGFpbmVyXCIsIFwiaGFuZGxlclwiLCBcIm9uQ2hhbmdlXCIsIFwiYWZ0ZXJWaXNpYmxlQ2hhbmdlXCIsIFwic2hvd01hc2tcIiwgXCJtYXNrQ2xvc2FibGVcIiwgXCJtYXNrU3R5bGVcIiwgXCJvbkNsb3NlXCIsIFwib25IYW5kbGVDbGlja1wiLCBcImtleWJvYXJkXCIsIFwiZ2V0T3BlbkNvdW50XCIsIFwic3dpdGNoU2Nyb2xsaW5nRWZmZWN0XCJdKTsgLy8g6aaW5qyh5riy5p+T6YO95bCG5piv5YWz6Zet54q25oCB44CCXG5cbiAgICAgIHZhciBvcGVuID0gdGhpcy5kb20gPyAkb3BlbiA6IGZhbHNlO1xuICAgICAgdmFyIHdyYXBwZXJDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXMyLmRlZmF1bHQpKHByZWZpeENscywgKF9jbGFzc25hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc25hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQocGxhY2VtZW50KSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc25hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9wZW5cIiksIG9wZW4pLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NuYW1lcywgY2xhc3NOYW1lIHx8ICcnLCAhIWNsYXNzTmFtZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc25hbWVzLCAnbm8tbWFzaycsICFzaG93TWFzayksIF9jbGFzc25hbWVzKSk7XG5cbiAgICAgIHZhciBfdGhpcyRnZXRIb3Jpem9udGFsQm8yID0gdGhpcy5nZXRIb3Jpem9udGFsQm9vbEFuZFBsYWNlbWVudE5hbWUoKSxcbiAgICAgICAgICBwbGFjZW1lbnROYW1lID0gX3RoaXMkZ2V0SG9yaXpvbnRhbEJvMi5wbGFjZW1lbnROYW1lOyAvLyDnmb7liIbmr5TkuI7lg4/ntKDliqjnlLvkuI3lkIzmraXvvIznrKzkuIDmrKHmiZPnlKjlkI7lhajnlKjlg4/ntKDliqjnlLvjgIJcbiAgICAgIC8vIGNvbnN0IGRlZmF1bHRWYWx1ZSA9ICF0aGlzLmNvbnRlbnREb20gfHwgIWxldmVsID8gJzEwMCUnIDogYCR7dmFsdWV9cHhgO1xuXG5cbiAgICAgIHZhciBwbGFjZW1lbnRQb3MgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyB8fCBwbGFjZW1lbnQgPT09ICd0b3AnID8gJy0xMDAlJyA6ICcxMDAlJztcbiAgICAgIHZhciB0cmFuc2Zvcm0gPSBvcGVuID8gJycgOiBcIlwiLmNvbmNhdChwbGFjZW1lbnROYW1lLCBcIihcIikuY29uY2F0KHBsYWNlbWVudFBvcywgXCIpXCIpO1xuICAgICAgdmFyIGhhbmRsZXJDaGlsZHJlbiA9IGhhbmRsZXIgJiYgUmVhY3QuY2xvbmVFbGVtZW50KGhhbmRsZXIsIHtcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXIucHJvcHMub25DbGljaykge1xuICAgICAgICAgICAgaGFuZGxlci5wcm9wcy5vbkNsaWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9uSGFuZGxlQ2xpY2spIHtcbiAgICAgICAgICAgIG9uSGFuZGxlQ2xpY2soZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihjKSB7XG4gICAgICAgICAgX3RoaXMzLmhhbmRsZXJEb20gPSBjO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgY2xhc3NOYW1lOiB3cmFwcGVyQ2xhc3NOYW1lLFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKGMpIHtcbiAgICAgICAgICBfdGhpczMuZG9tID0gYztcbiAgICAgICAgfSxcbiAgICAgICAgb25LZXlEb3duOiBvcGVuICYmIGtleWJvYXJkID8gdGhpcy5vbktleURvd24gOiB1bmRlZmluZWQsXG4gICAgICAgIG9uVHJhbnNpdGlvbkVuZDogdGhpcy5vbldyYXBwZXJUcmFuc2l0aW9uRW5kXG4gICAgICB9KSwgc2hvd01hc2sgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tYXNrXCIpLFxuICAgICAgICBvbkNsaWNrOiBtYXNrQ2xvc2FibGUgPyBvbkNsb3NlIDogdW5kZWZpbmVkLFxuICAgICAgICBzdHlsZTogbWFza1N0eWxlLFxuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihjKSB7XG4gICAgICAgICAgX3RoaXMzLm1hc2tEb20gPSBjO1xuICAgICAgICB9XG4gICAgICB9KSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LXdyYXBwZXJcIiksXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgbXNUcmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgICAgICAgICB3aWR0aDogKDAsIF91dGlscy5pc051bWVyaWMpKHdpZHRoKSA/IFwiXCIuY29uY2F0KHdpZHRoLCBcInB4XCIpIDogd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiAoMCwgX3V0aWxzLmlzTnVtZXJpYykoaGVpZ2h0KSA/IFwiXCIuY29uY2F0KGhlaWdodCwgXCJweFwiKSA6IGhlaWdodFxuICAgICAgICB9LFxuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihjKSB7XG4gICAgICAgICAgX3RoaXMzLmNvbnRlbnRXcmFwcGVyID0gYztcbiAgICAgICAgfVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLFxuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihjKSB7XG4gICAgICAgICAgX3RoaXMzLmNvbnRlbnREb20gPSBjO1xuICAgICAgICB9LFxuICAgICAgICBvblRvdWNoU3RhcnQ6IG9wZW4gJiYgc2hvd01hc2sgPyB0aGlzLnJlbW92ZVN0YXJ0SGFuZGxlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgb25Ub3VjaE1vdmU6IG9wZW4gJiYgc2hvd01hc2sgPyB0aGlzLnJlbW92ZU1vdmVIYW5kbGVyIDogdW5kZWZpbmVkXG4gICAgICB9LCBjaGlsZHJlbiksIGhhbmRsZXJDaGlsZHJlbikpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgICB2YXIgcHJldlByb3BzID0gX3JlZjIucHJldlByb3BzLFxuICAgICAgICAgIF9zZWxmID0gX3JlZjIuX3NlbGY7XG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBwcmV2UHJvcHM6IHByb3BzXG4gICAgICB9O1xuXG4gICAgICBpZiAocHJldlByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICAgICAgICAgIGxldmVsID0gcHJvcHMubGV2ZWw7XG5cbiAgICAgICAgaWYgKHBsYWNlbWVudCAhPT0gcHJldlByb3BzLnBsYWNlbWVudCkge1xuICAgICAgICAgIC8vIHRlc3Qg55qEIGJ1Zywg5pyJ5Yqo55S76L+H5Zy677yM5Yig6ZmkIGRvbVxuICAgICAgICAgIF9zZWxmLmNvbnRlbnREb20gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxldmVsICE9PSBwcmV2UHJvcHMubGV2ZWwpIHtcbiAgICAgICAgICBfc2VsZi5nZXRMZXZlbERvbShwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIERyYXdlckNoaWxkO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5EcmF3ZXJDaGlsZC5kZWZhdWx0UHJvcHMgPSB7XG4gIHN3aXRjaFNjcm9sbGluZ0VmZmVjdDogZnVuY3Rpb24gc3dpdGNoU2Nyb2xsaW5nRWZmZWN0KCkge31cbn07XG52YXIgX2RlZmF1bHQgPSBEcmF3ZXJDaGlsZDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKSk7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiKSk7XG5cbnZhciBfUG9ydGFsV3JhcHBlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL1BvcnRhbFdyYXBwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0RyYXdlckNoaWxkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9EcmF3ZXJDaGlsZFwiKSk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMi5kZWZhdWx0KSh0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIERyYXdlcldyYXBwZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoRHJhd2VyV3JhcHBlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihEcmF3ZXJXcmFwcGVyKTtcblxuICBmdW5jdGlvbiBEcmF3ZXJXcmFwcGVyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgRHJhd2VyV3JhcHBlcik7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfdGhpcy5vbkhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uSGFuZGxlQ2xpY2sgPSBfdGhpcyRwcm9wcy5vbkhhbmRsZUNsaWNrLFxuICAgICAgICAgICRvcGVuID0gX3RoaXMkcHJvcHMub3BlbjtcblxuICAgICAgaWYgKG9uSGFuZGxlQ2xpY2spIHtcbiAgICAgICAgb25IYW5kbGVDbGljayhlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiAkb3BlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIF9vcGVuID0gX3RoaXMuc3RhdGUub3BlbjtcblxuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlbjogIV9vcGVuXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbkNsb3NlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkNsb3NlID0gX3RoaXMkcHJvcHMyLm9uQ2xvc2UsXG4gICAgICAgICAgb3BlbiA9IF90aGlzJHByb3BzMi5vcGVuO1xuXG4gICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICBvbkNsb3NlKGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9wZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBvcGVuOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIG9wZW4gPSB0eXBlb2YgcHJvcHMub3BlbiAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9wcy5vcGVuIDogISFwcm9wcy5kZWZhdWx0T3BlbjtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIG9wZW46IG9wZW5cbiAgICB9O1xuXG4gICAgaWYgKCdvbk1hc2tDbGljaycgaW4gcHJvcHMpIHtcbiAgICAgIGNvbnNvbGUud2FybignYG9uTWFza0NsaWNrYCBhcmUgcmVtb3ZlZCwgcGxlYXNlIHVzZSBgb25DbG9zZWAgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShEcmF3ZXJXcmFwcGVyLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWVtYmVyLW9yZGVyaW5nXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBkZWZhdWx0T3BlbiA9IF90aGlzJHByb3BzMy5kZWZhdWx0T3BlbixcbiAgICAgICAgICBnZXRDb250YWluZXIgPSBfdGhpcyRwcm9wczMuZ2V0Q29udGFpbmVyLFxuICAgICAgICAgIHdyYXBwZXJDbGFzc05hbWUgPSBfdGhpcyRwcm9wczMud3JhcHBlckNsYXNzTmFtZSxcbiAgICAgICAgICBmb3JjZVJlbmRlciA9IF90aGlzJHByb3BzMy5mb3JjZVJlbmRlcixcbiAgICAgICAgICBoYW5kbGVyID0gX3RoaXMkcHJvcHMzLmhhbmRsZXIsXG4gICAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfdGhpcyRwcm9wczMsIFtcImRlZmF1bHRPcGVuXCIsIFwiZ2V0Q29udGFpbmVyXCIsIFwid3JhcHBlckNsYXNzTmFtZVwiLCBcImZvcmNlUmVuZGVyXCIsIFwiaGFuZGxlclwiXSk7XG4gICAgICB2YXIgb3BlbiA9IHRoaXMuc3RhdGUub3BlbjsgLy8g5riy5p+T5Zyo5b2T5YmNIGRvbSDph4zvvJtcblxuICAgICAgaWYgKCFnZXRDb250YWluZXIpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzTmFtZSxcbiAgICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihjKSB7XG4gICAgICAgICAgICBfdGhpczIuZG9tID0gYztcbiAgICAgICAgICB9XG4gICAgICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0RyYXdlckNoaWxkLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgb3Blbjogb3BlbixcbiAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgICAgIGdldENvbnRhaW5lcjogZnVuY3Rpb24gZ2V0Q29udGFpbmVyKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5kb207XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNsb3NlOiB0aGlzLm9uQ2xvc2UsXG4gICAgICAgICAgb25IYW5kbGVDbGljazogdGhpcy5vbkhhbmRsZUNsaWNrXG4gICAgICAgIH0pKSk7XG4gICAgICB9IC8vIOWmguaenOaciSBoYW5kbGVyIOS4uuWGhee9ruW8uuWItua4suafk++8m1xuXG5cbiAgICAgIHZhciAkZm9yY2VSZW5kZXIgPSAhIWhhbmRsZXIgfHwgZm9yY2VSZW5kZXI7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfUG9ydGFsV3JhcHBlci5kZWZhdWx0LCB7XG4gICAgICAgIHZpc2libGU6IG9wZW4sXG4gICAgICAgIGZvcmNlUmVuZGVyOiAkZm9yY2VSZW5kZXIsXG4gICAgICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyLFxuICAgICAgICB3cmFwcGVyQ2xhc3NOYW1lOiB3cmFwcGVyQ2xhc3NOYW1lXG4gICAgICB9LCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgdmlzaWJsZSA9IF9yZWYudmlzaWJsZSxcbiAgICAgICAgICAgIGFmdGVyQ2xvc2UgPSBfcmVmLmFmdGVyQ2xvc2UsXG4gICAgICAgICAgICByZXN0ID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3JlZiwgW1widmlzaWJsZVwiLCBcImFmdGVyQ2xvc2VcIl0pO1xuICAgICAgICByZXR1cm4gKC8vIHJlYWN0IDE177yMY29tcG9uZW50V2lsbFVubW91bnQg5pe2IFBvcnRhbCDov5Tlm54gYWZ0ZXJDbG9zZSwgdmlzaWJsZS5cbiAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KF9EcmF3ZXJDaGlsZC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgcmVzdCwge1xuICAgICAgICAgICAgb3BlbjogdmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gdmlzaWJsZSA6IG9wZW4sXG4gICAgICAgICAgICBhZnRlclZpc2libGVDaGFuZ2U6IGFmdGVyQ2xvc2UgIT09IHVuZGVmaW5lZCA/IGFmdGVyQ2xvc2UgOiBwcm9wcy5hZnRlclZpc2libGVDaGFuZ2UsXG4gICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgICAgICAgb25DbG9zZTogX3RoaXMyLm9uQ2xvc2UsXG4gICAgICAgICAgICBvbkhhbmRsZUNsaWNrOiBfdGhpczIub25IYW5kbGVDbGlja1xuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICAgIHZhciBwcmV2UHJvcHMgPSBfcmVmMi5wcmV2UHJvcHM7XG4gICAgICB2YXIgbmV3U3RhdGUgPSB7XG4gICAgICAgIHByZXZQcm9wczogcHJvcHNcbiAgICAgIH07XG5cbiAgICAgIGlmICh0eXBlb2YgcHJldlByb3BzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9wcy5vcGVuICE9PSBwcmV2UHJvcHMub3Blbikge1xuICAgICAgICBuZXdTdGF0ZS5vcGVuID0gcHJvcHMub3BlbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRHJhd2VyV3JhcHBlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuRHJhd2VyV3JhcHBlci5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZWZpeENsczogJ2RyYXdlcicsXG4gIHBsYWNlbWVudDogJ2xlZnQnLFxuICBnZXRDb250YWluZXI6ICdib2R5JyxcbiAgZGVmYXVsdE9wZW46IGZhbHNlLFxuICBsZXZlbDogJ2FsbCcsXG4gIGR1cmF0aW9uOiAnLjNzJyxcbiAgZWFzZTogJ2N1YmljLWJlemllcigwLjc4LCAwLjE0LCAwLjE1LCAwLjg2KScsXG4gIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZSgpIHt9LFxuICBhZnRlclZpc2libGVDaGFuZ2U6IGZ1bmN0aW9uIGFmdGVyVmlzaWJsZUNoYW5nZSgpIHt9LFxuICBoYW5kbGVyOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZHJhd2VyLWhhbmRsZVwiXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZHJhd2VyLWhhbmRsZS1pY29uXCJcbiAgfSkpLFxuICBzaG93TWFzazogdHJ1ZSxcbiAgbWFza0Nsb3NhYmxlOiB0cnVlLFxuICBtYXNrU3R5bGU6IHt9LFxuICB3cmFwcGVyQ2xhc3NOYW1lOiAnJyxcbiAgY2xhc3NOYW1lOiAnJyxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIGZvcmNlUmVuZGVyOiBmYWxzZVxufTtcbnZhciBfZGVmYXVsdCA9IERyYXdlcldyYXBwZXI7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfRHJhd2VyV3JhcHBlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRHJhd2VyV3JhcHBlclwiKSk7XG5cbi8vIGV4cG9ydCB0aGlzIHBhY2thZ2UncyBhcGlcbnZhciBfZGVmYXVsdCA9IF9EcmF3ZXJXcmFwcGVyLmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGF0YVRvQXJyYXkgPSBkYXRhVG9BcnJheTtcbmV4cG9ydHMuYWRkRXZlbnRMaXN0ZW5lciA9IGFkZEV2ZW50TGlzdGVuZXI7XG5leHBvcnRzLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSByZW1vdmVFdmVudExpc3RlbmVyO1xuZXhwb3J0cy50cmFuc2Zvcm1Bcmd1bWVudHMgPSB0cmFuc2Zvcm1Bcmd1bWVudHM7XG5leHBvcnRzLmdldFRvdWNoUGFyZW50U2Nyb2xsID0gZXhwb3J0cy53aW5kb3dJc1VuZGVmaW5lZCA9IGV4cG9ydHMuaXNOdW1lcmljID0gZXhwb3J0cy50cmFuc2l0aW9uRW5kID0gZXhwb3J0cy50cmFuc2l0aW9uU3RyID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBkYXRhVG9BcnJheSh2YXJzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhcnMpKSB7XG4gICAgcmV0dXJuIHZhcnM7XG4gIH1cblxuICByZXR1cm4gW3ZhcnNdO1xufVxuXG52YXIgdHJhbnNpdGlvbkVuZE9iamVjdCA9IHtcbiAgdHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnLFxuICBXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gIE1velRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJyxcbiAgT1RyYW5zaXRpb246ICdvVHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZCdcbn07XG52YXIgdHJhbnNpdGlvblN0ciA9IE9iamVjdC5rZXlzKHRyYW5zaXRpb25FbmRPYmplY3QpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGh0bWwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdO1xuICByZXR1cm4ga2V5IGluIChodG1sID8gaHRtbC5zdHlsZSA6IHt9KTtcbn0pWzBdO1xuZXhwb3J0cy50cmFuc2l0aW9uU3RyID0gdHJhbnNpdGlvblN0cjtcbnZhciB0cmFuc2l0aW9uRW5kID0gdHJhbnNpdGlvbkVuZE9iamVjdFt0cmFuc2l0aW9uU3RyXTtcbmV4cG9ydHMudHJhbnNpdGlvbkVuZCA9IHRyYW5zaXRpb25FbmQ7XG5cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIGlmICh0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKHRhcmdldC5hdHRhY2hFdmVudCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICB0YXJnZXQuYXR0YWNoRXZlbnQoXCJvblwiLmNvbmNhdChldmVudFR5cGUpLCBjYWxsYmFjayk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICBpZiAodGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrLCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmICh0YXJnZXQuYXR0YWNoRXZlbnQpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgdGFyZ2V0LmRldGFjaEV2ZW50KFwib25cIi5jb25jYXQoZXZlbnRUeXBlKSwgY2FsbGJhY2spOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtQXJndW1lbnRzKGFyZywgY2IpIHtcbiAgdmFyIHJlc3VsdCA9IHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicgPyBhcmcoY2IpIDogYXJnO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gW3Jlc3VsdFswXSwgcmVzdWx0WzFdXTtcbiAgfVxuXG4gIHJldHVybiBbcmVzdWx0XTtcbn1cblxudmFyIGlzTnVtZXJpYyA9IGZ1bmN0aW9uIGlzTnVtZXJpYyh2YWx1ZSkge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKSAmJiBpc0Zpbml0ZSh2YWx1ZSk7XG59O1xuXG5leHBvcnRzLmlzTnVtZXJpYyA9IGlzTnVtZXJpYztcbnZhciB3aW5kb3dJc1VuZGVmaW5lZCA9ICEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbmV4cG9ydHMud2luZG93SXNVbmRlZmluZWQgPSB3aW5kb3dJc1VuZGVmaW5lZDtcblxudmFyIGdldFRvdWNoUGFyZW50U2Nyb2xsID0gZnVuY3Rpb24gZ2V0VG91Y2hQYXJlbnRTY3JvbGwocm9vdCwgY3VycmVudFRhcmdldCwgZGlmZmVyWCwgZGlmZmVyWSkge1xuICBpZiAoIWN1cnJlbnRUYXJnZXQgfHwgY3VycmVudFRhcmdldCA9PT0gZG9jdW1lbnQgfHwgY3VycmVudFRhcmdldCBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIHJvb3Qg5Li6IGRyYXdlci1jb250ZW50IOiuvuWumuS6hiBvdmVyZmxvdywg5Yik5pat5Li6IHJvb3Qg55qEIHBhcmVudCDml7bnu5PmnZ/mu5rliqjvvJtcblxuXG4gIGlmIChjdXJyZW50VGFyZ2V0ID09PSByb290LnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBpc1kgPSBNYXRoLm1heChNYXRoLmFicyhkaWZmZXJYKSwgTWF0aC5hYnMoZGlmZmVyWSkpID09PSBNYXRoLmFicyhkaWZmZXJZKTtcbiAgdmFyIGlzWCA9IE1hdGgubWF4KE1hdGguYWJzKGRpZmZlclgpLCBNYXRoLmFicyhkaWZmZXJZKSkgPT09IE1hdGguYWJzKGRpZmZlclgpO1xuICB2YXIgc2Nyb2xsWSA9IGN1cnJlbnRUYXJnZXQuc2Nyb2xsSGVpZ2h0IC0gY3VycmVudFRhcmdldC5jbGllbnRIZWlnaHQ7XG4gIHZhciBzY3JvbGxYID0gY3VycmVudFRhcmdldC5zY3JvbGxXaWR0aCAtIGN1cnJlbnRUYXJnZXQuY2xpZW50V2lkdGg7XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoY3VycmVudFRhcmdldCk7XG4gIHZhciBvdmVyZmxvd1kgPSBzdHlsZS5vdmVyZmxvd1kgPT09ICdhdXRvJyB8fCBzdHlsZS5vdmVyZmxvd1kgPT09ICdzY3JvbGwnO1xuICB2YXIgb3ZlcmZsb3dYID0gc3R5bGUub3ZlcmZsb3dYID09PSAnYXV0bycgfHwgc3R5bGUub3ZlcmZsb3dYID09PSAnc2Nyb2xsJztcbiAgdmFyIHkgPSBzY3JvbGxZICYmIG92ZXJmbG93WTtcbiAgdmFyIHggPSBzY3JvbGxYICYmIG92ZXJmbG93WDtcblxuICBpZiAoaXNZICYmICgheSB8fCB5ICYmIChjdXJyZW50VGFyZ2V0LnNjcm9sbFRvcCA+PSBzY3JvbGxZICYmIGRpZmZlclkgPCAwIHx8IGN1cnJlbnRUYXJnZXQuc2Nyb2xsVG9wIDw9IDAgJiYgZGlmZmVyWSA+IDApKSB8fCBpc1ggJiYgKCF4IHx8IHggJiYgKGN1cnJlbnRUYXJnZXQuc2Nyb2xsTGVmdCA+PSBzY3JvbGxYICYmIGRpZmZlclggPCAwIHx8IGN1cnJlbnRUYXJnZXQuc2Nyb2xsTGVmdCA8PSAwICYmIGRpZmZlclggPiAwKSkpIHtcbiAgICByZXR1cm4gZ2V0VG91Y2hQYXJlbnRTY3JvbGwocm9vdCwgY3VycmVudFRhcmdldC5wYXJlbnROb2RlLCBkaWZmZXJYLCBkaWZmZXJZKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydHMuZ2V0VG91Y2hQYXJlbnRTY3JvbGwgPSBnZXRUb3VjaFBhcmVudFNjcm9sbDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjVHJpZ2dlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXRyaWdnZXJcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9wbGFjZW1lbnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wbGFjZW1lbnRzXCIpKTtcblxuZnVuY3Rpb24gRHJvcGRvd24ocHJvcHMsIHJlZikge1xuICB2YXIgX3Byb3BzJGFycm93ID0gcHJvcHMuYXJyb3csXG4gICAgICBhcnJvdyA9IF9wcm9wcyRhcnJvdyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkYXJyb3csXG4gICAgICBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWRyb3Bkb3duJyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgICAgYW5pbWF0aW9uID0gcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgYWxpZ24gPSBwcm9wcy5hbGlnbixcbiAgICAgIF9wcm9wcyRwbGFjZW1lbnQgPSBwcm9wcy5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcHJvcHMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyAnYm90dG9tTGVmdCcgOiBfcHJvcHMkcGxhY2VtZW50LFxuICAgICAgX3Byb3BzJHBsYWNlbWVudHMgPSBwcm9wcy5wbGFjZW1lbnRzLFxuICAgICAgcGxhY2VtZW50cyA9IF9wcm9wcyRwbGFjZW1lbnRzID09PSB2b2lkIDAgPyBfcGxhY2VtZW50cy5kZWZhdWx0IDogX3Byb3BzJHBsYWNlbWVudHMsXG4gICAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgc2hvd0FjdGlvbiA9IHByb3BzLnNob3dBY3Rpb24sXG4gICAgICBoaWRlQWN0aW9uID0gcHJvcHMuaGlkZUFjdGlvbixcbiAgICAgIG92ZXJsYXlDbGFzc05hbWUgPSBwcm9wcy5vdmVybGF5Q2xhc3NOYW1lLFxuICAgICAgb3ZlcmxheVN0eWxlID0gcHJvcHMub3ZlcmxheVN0eWxlLFxuICAgICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgICBfcHJvcHMkdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgICB0cmlnZ2VyID0gX3Byb3BzJHRyaWdnZXIgPT09IHZvaWQgMCA/IFsnaG92ZXInXSA6IF9wcm9wcyR0cmlnZ2VyLFxuICAgICAgb3RoZXJQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKHByb3BzLCBbXCJhcnJvd1wiLCBcInByZWZpeENsc1wiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwiYW5pbWF0aW9uXCIsIFwiYWxpZ25cIiwgXCJwbGFjZW1lbnRcIiwgXCJwbGFjZW1lbnRzXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJzaG93QWN0aW9uXCIsIFwiaGlkZUFjdGlvblwiLCBcIm92ZXJsYXlDbGFzc05hbWVcIiwgXCJvdmVybGF5U3R5bGVcIiwgXCJ2aXNpYmxlXCIsIFwidHJpZ2dlclwiXSk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgdHJpZ2dlclZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0VHJpZ2dlclZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBtZXJnZWRWaXNpYmxlID0gJ3Zpc2libGUnIGluIHByb3BzID8gdmlzaWJsZSA6IHRyaWdnZXJWaXNpYmxlO1xuICB2YXIgdHJpZ2dlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHJpZ2dlclJlZi5jdXJyZW50O1xuICB9KTtcblxuICB2YXIgZ2V0T3ZlcmxheUVsZW1lbnQgPSBmdW5jdGlvbiBnZXRPdmVybGF5RWxlbWVudCgpIHtcbiAgICB2YXIgb3ZlcmxheSA9IHByb3BzLm92ZXJsYXk7XG4gICAgdmFyIG92ZXJsYXlFbGVtZW50O1xuXG4gICAgaWYgKHR5cGVvZiBvdmVybGF5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvdmVybGF5RWxlbWVudCA9IG92ZXJsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3ZlcmxheUVsZW1lbnQgPSBvdmVybGF5O1xuICAgIH1cblxuICAgIHJldHVybiBvdmVybGF5RWxlbWVudDtcbiAgfTtcblxuICB2YXIgb25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgIHZhciBvbk92ZXJsYXlDbGljayA9IHByb3BzLm9uT3ZlcmxheUNsaWNrO1xuICAgIHZhciBvdmVybGF5UHJvcHMgPSBnZXRPdmVybGF5RWxlbWVudCgpLnByb3BzO1xuICAgIHNldFRyaWdnZXJWaXNpYmxlKGZhbHNlKTtcblxuICAgIGlmIChvbk92ZXJsYXlDbGljaykge1xuICAgICAgb25PdmVybGF5Q2xpY2soZSk7XG4gICAgfVxuXG4gICAgaWYgKG92ZXJsYXlQcm9wcy5vbkNsaWNrKSB7XG4gICAgICBvdmVybGF5UHJvcHMub25DbGljayhlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uVmlzaWJsZUNoYW5nZSA9IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZSh2aXNpYmxlKSB7XG4gICAgdmFyIG9uVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZTtcbiAgICBzZXRUcmlnZ2VyVmlzaWJsZSh2aXNpYmxlKTtcblxuICAgIGlmICh0eXBlb2Ygb25WaXNpYmxlQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvblZpc2libGVDaGFuZ2UodmlzaWJsZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBnZXRNZW51RWxlbWVudCA9IGZ1bmN0aW9uIGdldE1lbnVFbGVtZW50KCkge1xuICAgIHZhciBvdmVybGF5RWxlbWVudCA9IGdldE92ZXJsYXlFbGVtZW50KCk7XG4gICAgdmFyIGV4dHJhT3ZlcmxheVByb3BzID0ge1xuICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lbnVcIiksXG4gICAgICBvbkNsaWNrOiBvbkNsaWNrXG4gICAgfTtcblxuICAgIGlmICh0eXBlb2Ygb3ZlcmxheUVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRlbGV0ZSBleHRyYU92ZXJsYXlQcm9wcy5wcmVmaXhDbHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGFycm93ICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFycm93XCIpXG4gICAgfSksIFJlYWN0LmNsb25lRWxlbWVudChvdmVybGF5RWxlbWVudCwgZXh0cmFPdmVybGF5UHJvcHMpKTtcbiAgfTtcblxuICB2YXIgZ2V0TWVudUVsZW1lbnRPckxhbWJkYSA9IGZ1bmN0aW9uIGdldE1lbnVFbGVtZW50T3JMYW1iZGEoKSB7XG4gICAgdmFyIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuXG4gICAgaWYgKHR5cGVvZiBvdmVybGF5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZ2V0TWVudUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldE1lbnVFbGVtZW50KCk7XG4gIH07XG5cbiAgdmFyIGdldE1pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlciA9IGZ1bmN0aW9uIGdldE1pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlcigpIHtcbiAgICB2YXIgbWluT3ZlcmxheVdpZHRoTWF0Y2hUcmlnZ2VyID0gcHJvcHMubWluT3ZlcmxheVdpZHRoTWF0Y2hUcmlnZ2VyLFxuICAgICAgICBhbGlnblBvaW50ID0gcHJvcHMuYWxpZ25Qb2ludDtcblxuICAgIGlmICgnbWluT3ZlcmxheVdpZHRoTWF0Y2hUcmlnZ2VyJyBpbiBwcm9wcykge1xuICAgICAgcmV0dXJuIG1pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gIWFsaWduUG9pbnQ7XG4gIH07XG5cbiAgdmFyIGdldE9wZW5DbGFzc05hbWUgPSBmdW5jdGlvbiBnZXRPcGVuQ2xhc3NOYW1lKCkge1xuICAgIHZhciBvcGVuQ2xhc3NOYW1lID0gcHJvcHMub3BlbkNsYXNzTmFtZTtcblxuICAgIGlmIChvcGVuQ2xhc3NOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvcGVuQ2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9wZW5cIik7XG4gIH07XG5cbiAgdmFyIHJlbmRlckNoaWxkcmVuID0gZnVuY3Rpb24gcmVuZGVyQ2hpbGRyZW4oKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIGNoaWxkcmVuUHJvcHMgPSBjaGlsZHJlbi5wcm9wcyA/IGNoaWxkcmVuLnByb3BzIDoge307XG4gICAgdmFyIGNoaWxkQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGNoaWxkcmVuUHJvcHMuY2xhc3NOYW1lLCBnZXRPcGVuQ2xhc3NOYW1lKCkpO1xuICAgIHJldHVybiB0cmlnZ2VyVmlzaWJsZSAmJiBjaGlsZHJlbiA/IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgICAgY2xhc3NOYW1lOiBjaGlsZENsYXNzTmFtZVxuICAgIH0pIDogY2hpbGRyZW47XG4gIH07XG5cbiAgdmFyIHRyaWdnZXJIaWRlQWN0aW9uID0gaGlkZUFjdGlvbjtcblxuICBpZiAoIXRyaWdnZXJIaWRlQWN0aW9uICYmIHRyaWdnZXIuaW5kZXhPZignY29udGV4dE1lbnUnKSAhPT0gLTEpIHtcbiAgICB0cmlnZ2VySGlkZUFjdGlvbiA9IFsnY2xpY2snXTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY1RyaWdnZXIuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgb3RoZXJQcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHJlZjogdHJpZ2dlclJlZixcbiAgICBwb3B1cENsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKG92ZXJsYXlDbGFzc05hbWUsICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctYXJyb3dcIiksIGFycm93KSksXG4gICAgcG9wdXBTdHlsZTogb3ZlcmxheVN0eWxlLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBwbGFjZW1lbnRzLFxuICAgIGFjdGlvbjogdHJpZ2dlcixcbiAgICBzaG93QWN0aW9uOiBzaG93QWN0aW9uLFxuICAgIGhpZGVBY3Rpb246IHRyaWdnZXJIaWRlQWN0aW9uIHx8IFtdLFxuICAgIHBvcHVwUGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgcG9wdXBBbGlnbjogYWxpZ24sXG4gICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgcG9wdXBBbmltYXRpb246IGFuaW1hdGlvbixcbiAgICBwb3B1cFZpc2libGU6IG1lcmdlZFZpc2libGUsXG4gICAgc3RyZXRjaDogZ2V0TWluT3ZlcmxheVdpZHRoTWF0Y2hUcmlnZ2VyKCkgPyAnbWluV2lkdGgnIDogJycsXG4gICAgcG9wdXA6IGdldE1lbnVFbGVtZW50T3JMYW1iZGEoKSxcbiAgICBvblBvcHVwVmlzaWJsZUNoYW5nZTogb25WaXNpYmxlQ2hhbmdlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICB9KSwgcmVuZGVyQ2hpbGRyZW4oKSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoRHJvcGRvd24pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfRHJvcGRvd24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0Ryb3Bkb3duXCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX0Ryb3Bkb3duLmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBhdXRvQWRqdXN0T3ZlcmZsb3cgPSB7XG4gIGFkanVzdFg6IDEsXG4gIGFkanVzdFk6IDFcbn07XG52YXIgdGFyZ2V0T2Zmc2V0ID0gWzAsIDBdO1xudmFyIHBsYWNlbWVudHMgPSB7XG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3BDZW50ZXI6IHtcbiAgICBwb2ludHM6IFsnYmMnLCAndGMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3BSaWdodDoge1xuICAgIHBvaW50czogWydicicsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbUNlbnRlcjoge1xuICAgIHBvaW50czogWyd0YycsICdiYyddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYnInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSBwbGFjZW1lbnRzO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfRmllbGRDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vRmllbGRDb250ZXh0XCIpKTtcblxudmFyIF90eXBlVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL3R5cGVVdGlsXCIpO1xuXG52YXIgX3ZhbGlkYXRlVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL3ZhbGlkYXRlVXRpbFwiKTtcblxudmFyIF92YWx1ZVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy92YWx1ZVV0aWxcIik7XG5cbmZ1bmN0aW9uIHJlcXVpcmVVcGRhdGUoc2hvdWxkVXBkYXRlLCBwcmV2LCBuZXh0LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaW5mbykge1xuICBpZiAodHlwZW9mIHNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRVcGRhdGUocHJldiwgbmV4dCwgJ3NvdXJjZScgaW4gaW5mbyA/IHtcbiAgICAgIHNvdXJjZTogaW5mby5zb3VyY2VcbiAgICB9IDoge30pO1xuICB9XG5cbiAgcmV0dXJuIHByZXZWYWx1ZSAhPT0gbmV4dFZhbHVlO1xufSAvLyBXZSB1c2UgQ2xhc3MgaW5zdGVhZCBvZiBIb29rcyBoZXJlIHNpbmNlIGl0IHdpbGwgY29zdCBtdWNoIGNvZGUgYnkgdXNpbmcgSG9va3MuXG5cblxudmFyIEZpZWxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKEZpZWxkLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoRmllbGQpO1xuXG4gIGZ1bmN0aW9uIEZpZWxkKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIEZpZWxkKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgcmVzZXRDb3VudDogMFxuICAgIH07XG4gICAgX3RoaXMuY2FuY2VsUmVnaXN0ZXJGdW5jID0gbnVsbDtcbiAgICBfdGhpcy5kZXN0cm95ID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogRm9sbG93IHN0YXRlIHNob3VsZCBub3QgbWFuYWdlbWVudCBpbiBTdGF0ZSBzaW5jZSBpdCB3aWxsIGFzeW5jIHVwZGF0ZSBieSBSZWFjdC5cbiAgICAgKiBUaGlzIG1ha2VzIGZpcnN0IHJlbmRlciBvZiBmb3JtIGNhbiBub3QgZ2V0IGNvcnJlY3Qgc3RhdGUgdmFsdWUuXG4gICAgICovXG5cbiAgICBfdGhpcy50b3VjaGVkID0gZmFsc2U7XG4gICAgLyoqIE1hcmsgd2hlbiB0b3VjaGVkICYgdmFsaWRhdGVkLiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBgZGVwZW5kZW5jaWVzYCAqL1xuXG4gICAgX3RoaXMuZGlydHkgPSBmYWxzZTtcbiAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBudWxsO1xuICAgIF90aGlzLmVycm9ycyA9IFtdO1xuXG4gICAgX3RoaXMuY2FuY2VsUmVnaXN0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVzZXJ2ZSA9IF90aGlzJHByb3BzLnByZXNlcnZlLFxuICAgICAgICAgIGlzTGlzdEZpZWxkID0gX3RoaXMkcHJvcHMuaXNMaXN0RmllbGQ7XG5cbiAgICAgIGlmIChfdGhpcy5jYW5jZWxSZWdpc3RlckZ1bmMpIHtcbiAgICAgICAgX3RoaXMuY2FuY2VsUmVnaXN0ZXJGdW5jKGlzTGlzdEZpZWxkLCBwcmVzZXJ2ZSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmNhbmNlbFJlZ2lzdGVyRnVuYyA9IG51bGw7XG4gICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBVdGlscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgIF90aGlzLmdldE5hbWVQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG5hbWUgPSBfdGhpcy5wcm9wcy5uYW1lO1xuICAgICAgdmFyIF90aGlzJGNvbnRleHQkcHJlZml4TiA9IF90aGlzLmNvbnRleHQucHJlZml4TmFtZSxcbiAgICAgICAgICBwcmVmaXhOYW1lID0gX3RoaXMkY29udGV4dCRwcmVmaXhOID09PSB2b2lkIDAgPyBbXSA6IF90aGlzJGNvbnRleHQkcHJlZml4TjtcbiAgICAgIHJldHVybiBuYW1lICE9PSB1bmRlZmluZWQgPyBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkocHJlZml4TmFtZSksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG5hbWUpKSA6IFtdO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRSdWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyRydWxlcyA9IF90aGlzLnByb3BzLnJ1bGVzLFxuICAgICAgICAgIHJ1bGVzID0gX3RoaXMkcHJvcHMkcnVsZXMgPT09IHZvaWQgMCA/IFtdIDogX3RoaXMkcHJvcHMkcnVsZXM7XG4gICAgICByZXR1cm4gcnVsZXMubWFwKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBydWxlKF90aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5kZXN0cm95KSByZXR1cm47XG4gICAgICAvKipcbiAgICAgICAqIENsZWFuIHVwIGN1cnJlbnQgbm9kZS5cbiAgICAgICAqL1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgcmVzZXRDb3VudCA9IF9yZWYucmVzZXRDb3VudDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNldENvdW50OiByZXNldENvdW50ICsgMVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBGaWVsZCBFbnRpdHkgSW50ZXJmYWNlcyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVHJpZ2dlciBieSBzdG9yZSB1cGRhdGUuIENoZWNrIGlmIG5lZWQgdXBkYXRlIHRoZSBjb21wb25lbnRcblxuXG4gICAgX3RoaXMub25TdG9yZUNoYW5nZSA9IGZ1bmN0aW9uIChwcmV2U3RvcmUsIG5hbWVQYXRoTGlzdCwgaW5mbykge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IF90aGlzJHByb3BzMi5zaG91bGRVcGRhdGUsXG4gICAgICAgICAgX3RoaXMkcHJvcHMyJGRlcGVuZGVuID0gX3RoaXMkcHJvcHMyLmRlcGVuZGVuY2llcyxcbiAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBfdGhpcyRwcm9wczIkZGVwZW5kZW4gPT09IHZvaWQgMCA/IFtdIDogX3RoaXMkcHJvcHMyJGRlcGVuZGVuLFxuICAgICAgICAgIG9uUmVzZXQgPSBfdGhpcyRwcm9wczIub25SZXNldDtcbiAgICAgIHZhciBzdG9yZSA9IGluZm8uc3RvcmU7XG5cbiAgICAgIHZhciBuYW1lUGF0aCA9IF90aGlzLmdldE5hbWVQYXRoKCk7XG5cbiAgICAgIHZhciBwcmV2VmFsdWUgPSBfdGhpcy5nZXRWYWx1ZShwcmV2U3RvcmUpO1xuXG4gICAgICB2YXIgY3VyVmFsdWUgPSBfdGhpcy5nZXRWYWx1ZShzdG9yZSk7XG5cbiAgICAgIHZhciBuYW1lUGF0aE1hdGNoID0gbmFtZVBhdGhMaXN0ICYmICgwLCBfdmFsdWVVdGlsLmNvbnRhaW5zTmFtZVBhdGgpKG5hbWVQYXRoTGlzdCwgbmFtZVBhdGgpOyAvLyBgc2V0RmllbGRzVmFsdWVgIGlzIGEgcXVpY2sgYWNjZXNzIHRvIHVwZGF0ZSByZWxhdGVkIHN0YXR1c1xuXG4gICAgICBpZiAoaW5mby50eXBlID09PSAndmFsdWVVcGRhdGUnICYmIGluZm8uc291cmNlID09PSAnZXh0ZXJuYWwnICYmIHByZXZWYWx1ZSAhPT0gY3VyVmFsdWUpIHtcbiAgICAgICAgX3RoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgICAgIF90aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMudmFsaWRhdGVQcm9taXNlID0gbnVsbDtcbiAgICAgICAgX3RoaXMuZXJyb3JzID0gW107XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoaW5mby50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICAgICAgICBpZiAoIW5hbWVQYXRoTGlzdCB8fCBuYW1lUGF0aE1hdGNoKSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCBzdGF0ZVxuICAgICAgICAgICAgX3RoaXMudG91Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgX3RoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIF90aGlzLnZhbGlkYXRlUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICBfdGhpcy5lcnJvcnMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKG9uUmVzZXQpIHtcbiAgICAgICAgICAgICAgb25SZXNldCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoKCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzZXRGaWVsZCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5hbWVQYXRoTWF0Y2gpIHtcbiAgICAgICAgICAgICAgdmFyIGRhdGEgPSBpbmZvLmRhdGE7XG5cbiAgICAgICAgICAgICAgaWYgKCd0b3VjaGVkJyBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMudG91Y2hlZCA9IGRhdGEudG91Y2hlZDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICgndmFsaWRhdGluZycgaW4gZGF0YSAmJiAhKCdvcmlnaW5SQ0ZpZWxkJyBpbiBkYXRhKSkge1xuICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRlUHJvbWlzZSA9IGRhdGEudmFsaWRhdGluZyA/IFByb21pc2UucmVzb2x2ZShbXSkgOiBudWxsO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCdlcnJvcnMnIGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5lcnJvcnMgPSBkYXRhLmVycm9ycyB8fCBbXTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF90aGlzLmRpcnR5ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gLy8gSGFuZGxlIHVwZGF0ZSBieSBgc2V0RmllbGRgIHdpdGggYHNob3VsZFVwZGF0ZWBcblxuXG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlICYmICFuYW1lUGF0aC5sZW5ndGggJiYgcmVxdWlyZVVwZGF0ZShzaG91bGRVcGRhdGUsIHByZXZTdG9yZSwgc3RvcmUsIHByZXZWYWx1ZSwgY3VyVmFsdWUsIGluZm8pKSB7XG4gICAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZGVwZW5kZW5jaWVzVXBkYXRlJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRyaWdnZXIgd2hlbiBtYXJrZWQgYGRlcGVuZGVuY2llc2AgdXBkYXRlZC4gUmVsYXRlZCBmaWVsZHMgd2lsbCBhbGwgdXBkYXRlXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciBkZXBlbmRlbmN5TGlzdCA9IGRlcGVuZGVuY2llcy5tYXAoX3ZhbHVlVXRpbC5nZXROYW1lUGF0aCk7IC8vIE5vIG5lZWQgZm9yIGBuYW1lUGF0aE1hdGhgIGNoZWNrIGFuZCBgc2hvdWxkVXBkYXRlYCBjaGVjaywgc2luY2UgYHZhbHVlVXBkYXRlYCB3aWxsIGJlXG4gICAgICAgICAgICAvLyBlbWl0dGVkIGVhcmxpZXIgYW5kIHRoZXkgd2lsbCB3b3JrIHRoZXJlXG4gICAgICAgICAgICAvLyBJZiBzZXQgaXQgbWF5IGNhdXNlIHVubmVjZXNzYXJ5IHR3aWNlIHJlcmVuZGVyaW5nXG5cbiAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5TGlzdC5zb21lKGZ1bmN0aW9uIChkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgIHJldHVybiAoMCwgX3ZhbHVlVXRpbC5jb250YWluc05hbWVQYXRoKShpbmZvLnJlbGF0ZWRGaWVsZHMsIGRlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgX3RoaXMucmVSZW5kZXIoKTtcblxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIDEuIElmIGBuYW1lUGF0aGAgZXhpc3RzIGluIGBuYW1lUGF0aExpc3RgLCBtZWFucyBpdCdzIHJlbGF0ZWQgdmFsdWUgYW5kIHNob3VsZCB1cGRhdGVcbiAgICAgICAgICAvLyAgICAgIEZvciBleGFtcGxlIDxMaXN0IG5hbWU9XCJsaXN0XCI+PEZpZWxkIG5hbWU9e1snbGlzdCcsIDBdfT48L0xpc3Q+XG4gICAgICAgICAgLy8gICAgICBJZiBgbmFtZVBhdGhMaXN0YCBpcyBbWydsaXN0J11dIChMaXN0IHZhbHVlIHVwZGF0ZSksIEZpZWxkIHNob3VsZCBiZSB1cGRhdGVkXG4gICAgICAgICAgLy8gICAgICBJZiBgbmFtZVBhdGhMaXN0YCBpcyBbWydsaXN0JywgMF1dIChGaWVsZCB2YWx1ZSB1cGRhdGUpLCBMaXN0IHNob3VsZG4ndCBiZSB1cGRhdGVkXG4gICAgICAgICAgLy8gMi5cbiAgICAgICAgICAvLyAgIDIuMSBJZiBgZGVwZW5kZW5jaWVzYCBpcyBzZXQsIGBuYW1lYCBpcyBub3Qgc2V0IGFuZCBgc2hvdWxkVXBkYXRlYCBpcyBub3Qgc2V0LFxuICAgICAgICAgIC8vICAgICAgIGRvbid0IHVzZSBgc2hvdWxkVXBkYXRlYC4gYGRlcGVuZGVuY2llc2AgaXMgdmlldyBhcyBhIHNob3J0Y3V0IGlmIGBzaG91bGRVcGRhdGVgXG4gICAgICAgICAgLy8gICAgICAgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgLy8gICAyLjIgSWYgYHNob3VsZFVwZGF0ZWAgcHJvdmlkZWQsIHVzZSBjdXN0b21pemUgbG9naWMgdG8gdXBkYXRlIHRoZSBmaWVsZFxuICAgICAgICAgIC8vICAgICAgIGVsc2UgdG8gY2hlY2sgaWYgdmFsdWUgY2hhbmdlZFxuICAgICAgICAgIGlmIChuYW1lUGF0aE1hdGNoIHx8ICghZGVwZW5kZW5jaWVzLmxlbmd0aCB8fCBuYW1lUGF0aC5sZW5ndGggfHwgc2hvdWxkVXBkYXRlKSAmJiByZXF1aXJlVXBkYXRlKHNob3VsZFVwZGF0ZSwgcHJldlN0b3JlLCBzdG9yZSwgcHJldlZhbHVlLCBjdXJWYWx1ZSwgaW5mbykpIHtcbiAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy52YWxpZGF0ZVJ1bGVzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBfdGhpcyRwcm9wczMkdmFsaWRhdGUgPSBfdGhpcyRwcm9wczMudmFsaWRhdGVGaXJzdCxcbiAgICAgICAgICB2YWxpZGF0ZUZpcnN0ID0gX3RoaXMkcHJvcHMzJHZhbGlkYXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF90aGlzJHByb3BzMyR2YWxpZGF0ZSxcbiAgICAgICAgICBtZXNzYWdlVmFyaWFibGVzID0gX3RoaXMkcHJvcHMzLm1lc3NhZ2VWYXJpYWJsZXM7XG5cbiAgICAgIHZhciBfcmVmMiA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgICAgdHJpZ2dlck5hbWUgPSBfcmVmMi50cmlnZ2VyTmFtZTtcblxuICAgICAgdmFyIG5hbWVQYXRoID0gX3RoaXMuZ2V0TmFtZVBhdGgoKTtcblxuICAgICAgdmFyIGZpbHRlcmVkUnVsZXMgPSBfdGhpcy5nZXRSdWxlcygpO1xuXG4gICAgICBpZiAodHJpZ2dlck5hbWUpIHtcbiAgICAgICAgZmlsdGVyZWRSdWxlcyA9IGZpbHRlcmVkUnVsZXMuZmlsdGVyKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgICAgdmFyIHZhbGlkYXRlVHJpZ2dlciA9IHJ1bGUudmFsaWRhdGVUcmlnZ2VyO1xuXG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZVRyaWdnZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciB0cmlnZ2VyTGlzdCA9ICgwLCBfdHlwZVV0aWwudG9BcnJheSkodmFsaWRhdGVUcmlnZ2VyKTtcbiAgICAgICAgICByZXR1cm4gdHJpZ2dlckxpc3QuaW5jbHVkZXModHJpZ2dlck5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb21pc2UgPSAoMCwgX3ZhbGlkYXRlVXRpbC52YWxpZGF0ZVJ1bGVzKShuYW1lUGF0aCwgX3RoaXMuZ2V0VmFsdWUoKSwgZmlsdGVyZWRSdWxlcywgb3B0aW9ucywgdmFsaWRhdGVGaXJzdCwgbWVzc2FnZVZhcmlhYmxlcyk7XG4gICAgICBfdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBwcm9taXNlO1xuICAgICAgX3RoaXMuZXJyb3JzID0gW107XG4gICAgICBwcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlcnJvcnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuXG4gICAgICAgIGlmIChfdGhpcy52YWxpZGF0ZVByb21pc2UgPT09IHByb21pc2UpIHtcbiAgICAgICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBudWxsO1xuICAgICAgICAgIF90aGlzLmVycm9ycyA9IGVycm9ycztcblxuICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIF90aGlzLmlzRmllbGRWYWxpZGF0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhX3RoaXMudmFsaWRhdGVQcm9taXNlO1xuICAgIH07XG5cbiAgICBfdGhpcy5pc0ZpZWxkVG91Y2hlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy50b3VjaGVkO1xuICAgIH07XG5cbiAgICBfdGhpcy5pc0ZpZWxkRGlydHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuZGlydHk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldEVycm9ycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5lcnJvcnM7XG4gICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ2hpbGQgQ29tcG9uZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgIF90aGlzLmdldE1ldGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBNYWtlIGVycm9yICYgdmFsaWRhdGluZyBpbiBjYWNoZSB0byBzYXZlIHBlcmZcbiAgICAgIF90aGlzLnByZXZWYWxpZGF0aW5nID0gX3RoaXMuaXNGaWVsZFZhbGlkYXRpbmcoKTtcbiAgICAgIHZhciBtZXRhID0ge1xuICAgICAgICB0b3VjaGVkOiBfdGhpcy5pc0ZpZWxkVG91Y2hlZCgpLFxuICAgICAgICB2YWxpZGF0aW5nOiBfdGhpcy5wcmV2VmFsaWRhdGluZyxcbiAgICAgICAgZXJyb3JzOiBfdGhpcy5lcnJvcnMsXG4gICAgICAgIG5hbWU6IF90aGlzLmdldE5hbWVQYXRoKClcbiAgICAgIH07XG4gICAgICByZXR1cm4gbWV0YTtcbiAgICB9OyAvLyBPbmx5IHJldHVybiB2YWxpZGF0ZSBjaGlsZCBub2RlLiBJZiBpbnZhbGlkYXRlLCB3aWxsIGRvIG5vdGhpbmcgYWJvdXQgZmllbGQuXG5cblxuICAgIF90aGlzLmdldE9ubHlDaGlsZCA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgICAgLy8gU3VwcG9ydCByZW5kZXIgcHJvcHNcbiAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIG1ldGEgPSBfdGhpcy5nZXRNZXRhKCk7XG5cbiAgICAgICAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIF90aGlzLmdldE9ubHlDaGlsZChjaGlsZHJlbihfdGhpcy5nZXRDb250cm9sbGVkKCksIG1ldGEsIF90aGlzLmNvbnRleHQpKSksIHt9LCB7XG4gICAgICAgICAgaXNGdW5jdGlvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gLy8gRmlsZWQgZWxlbWVudCBvbmx5XG5cblxuICAgICAgdmFyIGNoaWxkTGlzdCA9ICgwLCBfdG9BcnJheS5kZWZhdWx0KShjaGlsZHJlbik7XG5cbiAgICAgIGlmIChjaGlsZExpc3QubGVuZ3RoICE9PSAxIHx8ICFSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZExpc3RbMF0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2hpbGQ6IGNoaWxkTGlzdCxcbiAgICAgICAgICBpc0Z1bmN0aW9uOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGlsZDogY2hpbGRMaXN0WzBdLFxuICAgICAgICBpc0Z1bmN0aW9uOiBmYWxzZVxuICAgICAgfTtcbiAgICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmllbGQgQ29udHJvbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gICAgX3RoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICAgIHZhciBnZXRGaWVsZHNWYWx1ZSA9IF90aGlzLmNvbnRleHQuZ2V0RmllbGRzVmFsdWU7XG5cbiAgICAgIHZhciBuYW1lUGF0aCA9IF90aGlzLmdldE5hbWVQYXRoKCk7XG5cbiAgICAgIHJldHVybiAoMCwgX3ZhbHVlVXRpbC5nZXRWYWx1ZSkoc3RvcmUgfHwgZ2V0RmllbGRzVmFsdWUodHJ1ZSksIG5hbWVQYXRoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0Q29udHJvbGxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjaGlsZFByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICB0cmlnZ2VyID0gX3RoaXMkcHJvcHM0LnRyaWdnZXIsXG4gICAgICAgICAgdmFsaWRhdGVUcmlnZ2VyID0gX3RoaXMkcHJvcHM0LnZhbGlkYXRlVHJpZ2dlcixcbiAgICAgICAgICBnZXRWYWx1ZUZyb21FdmVudCA9IF90aGlzJHByb3BzNC5nZXRWYWx1ZUZyb21FdmVudCxcbiAgICAgICAgICBub3JtYWxpemUgPSBfdGhpcyRwcm9wczQubm9ybWFsaXplLFxuICAgICAgICAgIHZhbHVlUHJvcE5hbWUgPSBfdGhpcyRwcm9wczQudmFsdWVQcm9wTmFtZSxcbiAgICAgICAgICBnZXRWYWx1ZVByb3BzID0gX3RoaXMkcHJvcHM0LmdldFZhbHVlUHJvcHM7XG4gICAgICB2YXIgbWVyZ2VkVmFsaWRhdGVUcmlnZ2VyID0gdmFsaWRhdGVUcmlnZ2VyICE9PSB1bmRlZmluZWQgPyB2YWxpZGF0ZVRyaWdnZXIgOiBfdGhpcy5jb250ZXh0LnZhbGlkYXRlVHJpZ2dlcjtcblxuICAgICAgdmFyIG5hbWVQYXRoID0gX3RoaXMuZ2V0TmFtZVBhdGgoKTtcblxuICAgICAgdmFyIF90aGlzJGNvbnRleHQgPSBfdGhpcy5jb250ZXh0LFxuICAgICAgICAgIGdldEludGVybmFsSG9va3MgPSBfdGhpcyRjb250ZXh0LmdldEludGVybmFsSG9va3MsXG4gICAgICAgICAgZ2V0RmllbGRzVmFsdWUgPSBfdGhpcyRjb250ZXh0LmdldEZpZWxkc1ZhbHVlO1xuXG4gICAgICB2YXIgX2dldEludGVybmFsSG9va3MgPSBnZXRJbnRlcm5hbEhvb2tzKF9GaWVsZENvbnRleHQuSE9PS19NQVJLKSxcbiAgICAgICAgICBkaXNwYXRjaCA9IF9nZXRJbnRlcm5hbEhvb2tzLmRpc3BhdGNoO1xuXG4gICAgICB2YXIgdmFsdWUgPSBfdGhpcy5nZXRWYWx1ZSgpO1xuXG4gICAgICB2YXIgbWVyZ2VkR2V0VmFsdWVQcm9wcyA9IGdldFZhbHVlUHJvcHMgfHwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIHZhbHVlUHJvcE5hbWUsIHZhbCk7XG4gICAgICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG5cbiAgICAgIHZhciBvcmlnaW5UcmlnZ2VyRnVuYyA9IGNoaWxkUHJvcHNbdHJpZ2dlcl07XG4gICAgICB2YXIgY29udHJvbCA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGNoaWxkUHJvcHMpLCBtZXJnZWRHZXRWYWx1ZVByb3BzKHZhbHVlKSk7IC8vIEFkZCB0cmlnZ2VyXG5cbiAgICAgIGNvbnRyb2xbdHJpZ2dlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIE1hcmsgYXMgdG91Y2hlZFxuICAgICAgICBfdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB2YXIgbmV3VmFsdWU7XG5cbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRWYWx1ZUZyb21FdmVudCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gZ2V0VmFsdWVGcm9tRXZlbnQuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IF92YWx1ZVV0aWwuZGVmYXVsdEdldFZhbHVlRnJvbUV2ZW50LmFwcGx5KHZvaWQgMCwgW3ZhbHVlUHJvcE5hbWVdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBub3JtYWxpemUobmV3VmFsdWUsIHZhbHVlLCBnZXRGaWVsZHNWYWx1ZSh0cnVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogJ3VwZGF0ZVZhbHVlJyxcbiAgICAgICAgICBuYW1lUGF0aDogbmFtZVBhdGgsXG4gICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChvcmlnaW5UcmlnZ2VyRnVuYykge1xuICAgICAgICAgIG9yaWdpblRyaWdnZXJGdW5jLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07IC8vIEFkZCB2YWxpZGF0ZVRyaWdnZXJcblxuXG4gICAgICB2YXIgdmFsaWRhdGVUcmlnZ2VyTGlzdCA9ICgwLCBfdHlwZVV0aWwudG9BcnJheSkobWVyZ2VkVmFsaWRhdGVUcmlnZ2VyIHx8IFtdKTtcbiAgICAgIHZhbGlkYXRlVHJpZ2dlckxpc3QuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlck5hbWUpIHtcbiAgICAgICAgLy8gV3JhcCBhZGRpdGlvbmFsIGZ1bmN0aW9uIG9mIGNvbXBvbmVudCwgc28gdGhhdCB3ZSBjYW4gZ2V0IGxhdGVzdCB2YWx1ZSBmcm9tIHN0b3JlXG4gICAgICAgIHZhciBvcmlnaW5UcmlnZ2VyID0gY29udHJvbFt0cmlnZ2VyTmFtZV07XG5cbiAgICAgICAgY29udHJvbFt0cmlnZ2VyTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG9yaWdpblRyaWdnZXIpIHtcbiAgICAgICAgICAgIG9yaWdpblRyaWdnZXIuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH0gLy8gQWx3YXlzIHVzZSBsYXRlc3QgcnVsZXNcblxuXG4gICAgICAgICAgdmFyIHJ1bGVzID0gX3RoaXMucHJvcHMucnVsZXM7XG5cbiAgICAgICAgICBpZiAocnVsZXMgJiYgcnVsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBXZSBkaXNwYXRjaCB2YWxpZGF0ZSB0byByb290LFxuICAgICAgICAgICAgLy8gc2luY2UgaXQgd2lsbCB1cGRhdGUgcmVsYXRlZCBkYXRhIHdpdGggb3RoZXIgZmllbGQgd2l0aCBzYW1lIG5hbWVcbiAgICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgdHlwZTogJ3ZhbGlkYXRlRmllbGQnLFxuICAgICAgICAgICAgICBuYW1lUGF0aDogbmFtZVBhdGgsXG4gICAgICAgICAgICAgIHRyaWdnZXJOYW1lOiB0cmlnZ2VyTmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29udHJvbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdWJzY3JpcHRpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoRmllbGQsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIHNob3VsZFVwZGF0ZSA9IHRoaXMucHJvcHMuc2hvdWxkVXBkYXRlO1xuICAgICAgdmFyIGdldEludGVybmFsSG9va3MgPSB0aGlzLmNvbnRleHQuZ2V0SW50ZXJuYWxIb29rcztcblxuICAgICAgdmFyIF9nZXRJbnRlcm5hbEhvb2tzMiA9IGdldEludGVybmFsSG9va3MoX0ZpZWxkQ29udGV4dC5IT09LX01BUkspLFxuICAgICAgICAgIHJlZ2lzdGVyRmllbGQgPSBfZ2V0SW50ZXJuYWxIb29rczIucmVnaXN0ZXJGaWVsZDtcblxuICAgICAgdGhpcy5jYW5jZWxSZWdpc3RlckZ1bmMgPSByZWdpc3RlckZpZWxkKHRoaXMpOyAvLyBPbmUgbW9yZSByZW5kZXIgZm9yIGNvbXBvbmVudCBpbiBjYXNlIGZpZWxkcyBub3QgcmVhZHlcblxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnJlUmVuZGVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5jYW5jZWxSZWdpc3RlcigpO1xuICAgICAgdGhpcy5kZXN0cm95ID0gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVSZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVSZW5kZXIoKSB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95KSByZXR1cm47XG4gICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgcmVzZXRDb3VudCA9IHRoaXMuc3RhdGUucmVzZXRDb3VudDtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW47XG5cbiAgICAgIHZhciBfdGhpcyRnZXRPbmx5Q2hpbGQgPSB0aGlzLmdldE9ubHlDaGlsZChjaGlsZHJlbiksXG4gICAgICAgICAgY2hpbGQgPSBfdGhpcyRnZXRPbmx5Q2hpbGQuY2hpbGQsXG4gICAgICAgICAgaXNGdW5jdGlvbiA9IF90aGlzJGdldE9ubHlDaGlsZC5pc0Z1bmN0aW9uOyAvLyBOb3QgbmVlZCB0byBgY2xvbmVFbGVtZW50YCBzaW5jZSB1c2VyIGNhbiBoYW5kbGUgdGhpcyBpbiByZW5kZXIgZnVuY3Rpb24gc2VsZlxuXG5cbiAgICAgIHZhciByZXR1cm5DaGlsZE5vZGU7XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybkNoaWxkTm9kZSA9IGNoaWxkO1xuICAgICAgfSBlbHNlIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuQ2hpbGROb2RlID0gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCB0aGlzLmdldENvbnRyb2xsZWQoY2hpbGQucHJvcHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KSghY2hpbGQsICdgY2hpbGRyZW5gIG9mIEZpZWxkIGlzIG5vdCB2YWxpZGF0ZSBSZWFjdEVsZW1lbnQuJyk7XG4gICAgICAgIHJldHVybkNoaWxkTm9kZSA9IGNoaWxkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwge1xuICAgICAgICBrZXk6IHJlc2V0Q291bnRcbiAgICAgIH0sIHJldHVybkNoaWxkTm9kZSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBGaWVsZDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuRmllbGQuY29udGV4dFR5cGUgPSBfRmllbGRDb250ZXh0LmRlZmF1bHQ7XG5GaWVsZC5kZWZhdWx0UHJvcHMgPSB7XG4gIHRyaWdnZXI6ICdvbkNoYW5nZScsXG4gIHZhbHVlUHJvcE5hbWU6ICd2YWx1ZSdcbn07XG5cbnZhciBXcmFwcGVyRmllbGQgPSBmdW5jdGlvbiBXcmFwcGVyRmllbGQoX3JlZjQpIHtcbiAgdmFyIG5hbWUgPSBfcmVmNC5uYW1lLFxuICAgICAgcmVzdFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3JlZjQsIFtcIm5hbWVcIl0pO1xuICB2YXIgbmFtZVBhdGggPSBuYW1lICE9PSB1bmRlZmluZWQgPyAoMCwgX3ZhbHVlVXRpbC5nZXROYW1lUGF0aCkobmFtZSkgOiB1bmRlZmluZWQ7XG4gIHZhciBrZXkgPSAna2VlcCc7XG5cbiAgaWYgKCFyZXN0UHJvcHMuaXNMaXN0RmllbGQpIHtcbiAgICBrZXkgPSBcIl9cIi5jb25jYXQoKG5hbWVQYXRoIHx8IFtdKS5qb2luKCdfJykpO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkocmVzdFByb3BzLnByZXNlcnZlICE9PSBmYWxzZSB8fCAhcmVzdFByb3BzLmlzTGlzdEZpZWxkLCAnYHByZXNlcnZlYCBzaG91bGQgbm90IGFwcGx5IG9uIEZvcm0uTGlzdCBmaWVsZHMuJyk7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZCwgT2JqZWN0LmFzc2lnbih7XG4gICAga2V5OiBrZXksXG4gICAgbmFtZTogbmFtZVBhdGhcbiAgfSwgcmVzdFByb3BzKSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBXcmFwcGVyRmllbGQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLkhPT0tfTUFSSyA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBIT09LX01BUksgPSAnUkNfRk9STV9JTlRFUk5BTF9IT09LUyc7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbmV4cG9ydHMuSE9PS19NQVJLID0gSE9PS19NQVJLO1xuXG52YXIgd2FybmluZ0Z1bmMgPSBmdW5jdGlvbiB3YXJuaW5nRnVuYygpIHtcbiAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCAnQ2FuIG5vdCBmaW5kIEZvcm1Db250ZXh0LiBQbGVhc2UgbWFrZSBzdXJlIHlvdSB3cmFwIEZpZWxkIHVuZGVyIEZvcm0uJyk7XG59O1xuXG52YXIgQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBnZXRGaWVsZFZhbHVlOiB3YXJuaW5nRnVuYyxcbiAgZ2V0RmllbGRzVmFsdWU6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZEVycm9yOiB3YXJuaW5nRnVuYyxcbiAgZ2V0RmllbGRzRXJyb3I6IHdhcm5pbmdGdW5jLFxuICBpc0ZpZWxkc1RvdWNoZWQ6IHdhcm5pbmdGdW5jLFxuICBpc0ZpZWxkVG91Y2hlZDogd2FybmluZ0Z1bmMsXG4gIGlzRmllbGRWYWxpZGF0aW5nOiB3YXJuaW5nRnVuYyxcbiAgaXNGaWVsZHNWYWxpZGF0aW5nOiB3YXJuaW5nRnVuYyxcbiAgcmVzZXRGaWVsZHM6IHdhcm5pbmdGdW5jLFxuICBzZXRGaWVsZHM6IHdhcm5pbmdGdW5jLFxuICBzZXRGaWVsZHNWYWx1ZTogd2FybmluZ0Z1bmMsXG4gIHZhbGlkYXRlRmllbGRzOiB3YXJuaW5nRnVuYyxcbiAgc3VibWl0OiB3YXJuaW5nRnVuYyxcbiAgZ2V0SW50ZXJuYWxIb29rczogZnVuY3Rpb24gZ2V0SW50ZXJuYWxIb29rcygpIHtcbiAgICB3YXJuaW5nRnVuYygpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwYXRjaDogd2FybmluZ0Z1bmMsXG4gICAgICByZWdpc3RlckZpZWxkOiB3YXJuaW5nRnVuYyxcbiAgICAgIHVzZVN1YnNjcmliZTogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRJbml0aWFsVmFsdWVzOiB3YXJuaW5nRnVuYyxcbiAgICAgIHNldENhbGxiYWNrczogd2FybmluZ0Z1bmMsXG4gICAgICBnZXRGaWVsZHM6IHdhcm5pbmdGdW5jLFxuICAgICAgc2V0VmFsaWRhdGVNZXNzYWdlczogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRQcmVzZXJ2ZTogd2FybmluZ0Z1bmNcbiAgICB9O1xuICB9XG59KTtcbnZhciBfZGVmYXVsdCA9IENvbnRleHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3VzZUZvcm0zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91c2VGb3JtXCIpKTtcblxudmFyIF9GaWVsZENvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9GaWVsZENvbnRleHRcIikpO1xuXG52YXIgX0Zvcm1Db250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Gb3JtQ29udGV4dFwiKSk7XG5cbnZhciBfdmFsdWVVdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvdmFsdWVVdGlsXCIpO1xuXG52YXIgRm9ybSA9IGZ1bmN0aW9uIEZvcm0oX3JlZiwgcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgaW5pdGlhbFZhbHVlcyA9IF9yZWYuaW5pdGlhbFZhbHVlcyxcbiAgICAgIGZpZWxkcyA9IF9yZWYuZmllbGRzLFxuICAgICAgZm9ybSA9IF9yZWYuZm9ybSxcbiAgICAgIHByZXNlcnZlID0gX3JlZi5wcmVzZXJ2ZSxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIF9yZWYkY29tcG9uZW50ID0gX3JlZi5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcmVmJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2Zvcm0nIDogX3JlZiRjb21wb25lbnQsXG4gICAgICB2YWxpZGF0ZU1lc3NhZ2VzID0gX3JlZi52YWxpZGF0ZU1lc3NhZ2VzLFxuICAgICAgX3JlZiR2YWxpZGF0ZVRyaWdnZXIgPSBfcmVmLnZhbGlkYXRlVHJpZ2dlcixcbiAgICAgIHZhbGlkYXRlVHJpZ2dlciA9IF9yZWYkdmFsaWRhdGVUcmlnZ2VyID09PSB2b2lkIDAgPyAnb25DaGFuZ2UnIDogX3JlZiR2YWxpZGF0ZVRyaWdnZXIsXG4gICAgICBvblZhbHVlc0NoYW5nZSA9IF9yZWYub25WYWx1ZXNDaGFuZ2UsXG4gICAgICBfb25GaWVsZHNDaGFuZ2UgPSBfcmVmLm9uRmllbGRzQ2hhbmdlLFxuICAgICAgX29uRmluaXNoID0gX3JlZi5vbkZpbmlzaCxcbiAgICAgIG9uRmluaXNoRmFpbGVkID0gX3JlZi5vbkZpbmlzaEZhaWxlZCxcbiAgICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF9yZWYsIFtcIm5hbWVcIiwgXCJpbml0aWFsVmFsdWVzXCIsIFwiZmllbGRzXCIsIFwiZm9ybVwiLCBcInByZXNlcnZlXCIsIFwiY2hpbGRyZW5cIiwgXCJjb21wb25lbnRcIiwgXCJ2YWxpZGF0ZU1lc3NhZ2VzXCIsIFwidmFsaWRhdGVUcmlnZ2VyXCIsIFwib25WYWx1ZXNDaGFuZ2VcIiwgXCJvbkZpZWxkc0NoYW5nZVwiLCBcIm9uRmluaXNoXCIsIFwib25GaW5pc2hGYWlsZWRcIl0pO1xuICB2YXIgZm9ybUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9Gb3JtQ29udGV4dC5kZWZhdWx0KTsgLy8gV2UgY3VzdG9taXplIGhhbmRsZSBldmVudCBzaW5jZSBDb250ZXh0IHdpbGwgbWFrZXMgYWxsIHRoZSBjb25zdW1lciByZS1yZW5kZXI6XG4gIC8vIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9jb250ZXh0Lmh0bWwjY29udGV4dHByb3ZpZGVyXG5cbiAgdmFyIF91c2VGb3JtID0gKDAsIF91c2VGb3JtMy5kZWZhdWx0KShmb3JtKSxcbiAgICAgIF91c2VGb3JtMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZUZvcm0sIDEpLFxuICAgICAgZm9ybUluc3RhbmNlID0gX3VzZUZvcm0yWzBdO1xuXG4gIHZhciBfZm9ybUluc3RhbmNlJGdldEludGUgPSBmb3JtSW5zdGFuY2UuZ2V0SW50ZXJuYWxIb29rcyhfRmllbGRDb250ZXh0LkhPT0tfTUFSSyksXG4gICAgICB1c2VTdWJzY3JpYmUgPSBfZm9ybUluc3RhbmNlJGdldEludGUudXNlU3Vic2NyaWJlLFxuICAgICAgc2V0SW5pdGlhbFZhbHVlcyA9IF9mb3JtSW5zdGFuY2UkZ2V0SW50ZS5zZXRJbml0aWFsVmFsdWVzLFxuICAgICAgc2V0Q2FsbGJhY2tzID0gX2Zvcm1JbnN0YW5jZSRnZXRJbnRlLnNldENhbGxiYWNrcyxcbiAgICAgIHNldFZhbGlkYXRlTWVzc2FnZXMgPSBfZm9ybUluc3RhbmNlJGdldEludGUuc2V0VmFsaWRhdGVNZXNzYWdlcyxcbiAgICAgIHNldFByZXNlcnZlID0gX2Zvcm1JbnN0YW5jZSRnZXRJbnRlLnNldFByZXNlcnZlOyAvLyBQYXNzIHJlZiB3aXRoIGZvcm0gaW5zdGFuY2VcblxuXG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZvcm1JbnN0YW5jZTtcbiAgfSk7IC8vIFJlZ2lzdGVyIGZvcm0gaW50byBDb250ZXh0XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmb3JtQ29udGV4dC5yZWdpc3RlckZvcm0obmFtZSwgZm9ybUluc3RhbmNlKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZm9ybUNvbnRleHQudW5yZWdpc3RlckZvcm0obmFtZSk7XG4gICAgfTtcbiAgfSwgW2Zvcm1Db250ZXh0LCBmb3JtSW5zdGFuY2UsIG5hbWVdKTsgLy8gUGFzcyBwcm9wcyB0byBzdG9yZVxuXG4gIHNldFZhbGlkYXRlTWVzc2FnZXMoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgZm9ybUNvbnRleHQudmFsaWRhdGVNZXNzYWdlcyksIHZhbGlkYXRlTWVzc2FnZXMpKTtcbiAgc2V0Q2FsbGJhY2tzKHtcbiAgICBvblZhbHVlc0NoYW5nZTogb25WYWx1ZXNDaGFuZ2UsXG4gICAgb25GaWVsZHNDaGFuZ2U6IGZ1bmN0aW9uIG9uRmllbGRzQ2hhbmdlKGNoYW5nZWRGaWVsZHMpIHtcbiAgICAgIGZvcm1Db250ZXh0LnRyaWdnZXJGb3JtQ2hhbmdlKG5hbWUsIGNoYW5nZWRGaWVsZHMpO1xuXG4gICAgICBpZiAoX29uRmllbGRzQ2hhbmdlKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICByZXN0W19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9vbkZpZWxkc0NoYW5nZS5hcHBseSh2b2lkIDAsIFtjaGFuZ2VkRmllbGRzXS5jb25jYXQocmVzdCkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25GaW5pc2g6IGZ1bmN0aW9uIG9uRmluaXNoKHZhbHVlcykge1xuICAgICAgZm9ybUNvbnRleHQudHJpZ2dlckZvcm1GaW5pc2gobmFtZSwgdmFsdWVzKTtcblxuICAgICAgaWYgKF9vbkZpbmlzaCkge1xuICAgICAgICBfb25GaW5pc2godmFsdWVzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRmluaXNoRmFpbGVkOiBvbkZpbmlzaEZhaWxlZFxuICB9KTtcbiAgc2V0UHJlc2VydmUocHJlc2VydmUpOyAvLyBTZXQgaW5pdGlhbCB2YWx1ZSwgaW5pdCBzdG9yZSB2YWx1ZSB3aGVuIGZpcnN0IG1vdW50XG5cbiAgdmFyIG1vdW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBzZXRJbml0aWFsVmFsdWVzKGluaXRpYWxWYWx1ZXMsICFtb3VudFJlZi5jdXJyZW50KTtcblxuICBpZiAoIW1vdW50UmVmLmN1cnJlbnQpIHtcbiAgICBtb3VudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfSAvLyBQcmVwYXJlIGNoaWxkcmVuIGJ5IGBjaGlsZHJlbmAgdHlwZVxuXG5cbiAgdmFyIGNoaWxkcmVuTm9kZSA9IGNoaWxkcmVuO1xuICB2YXIgY2hpbGRyZW5SZW5kZXJQcm9wcyA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJztcblxuICBpZiAoY2hpbGRyZW5SZW5kZXJQcm9wcykge1xuICAgIHZhciB2YWx1ZXMgPSBmb3JtSW5zdGFuY2UuZ2V0RmllbGRzVmFsdWUodHJ1ZSk7XG4gICAgY2hpbGRyZW5Ob2RlID0gY2hpbGRyZW4odmFsdWVzLCBmb3JtSW5zdGFuY2UpO1xuICB9IC8vIE5vdCB1c2Ugc3Vic2NyaWJlIHdoZW4gdXNpbmcgcmVuZGVyIHByb3BzXG5cblxuICB1c2VTdWJzY3JpYmUoIWNoaWxkcmVuUmVuZGVyUHJvcHMpOyAvLyBMaXN0ZW4gaWYgZmllbGRzIHByb3ZpZGVkLiBXZSB1c2UgcmVmIHRvIHNhdmUgcHJldiBkYXRhIGhlcmUgdG8gYXZvaWQgYWRkaXRpb25hbCByZW5kZXJcblxuICB2YXIgcHJldkZpZWxkc1JlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghKDAsIF92YWx1ZVV0aWwuaXNTaW1pbGFyKShwcmV2RmllbGRzUmVmLmN1cnJlbnQgfHwgW10sIGZpZWxkcyB8fCBbXSkpIHtcbiAgICAgIGZvcm1JbnN0YW5jZS5zZXRGaWVsZHMoZmllbGRzIHx8IFtdKTtcbiAgICB9XG5cbiAgICBwcmV2RmllbGRzUmVmLmN1cnJlbnQgPSBmaWVsZHM7XG4gIH0sIFtmaWVsZHMsIGZvcm1JbnN0YW5jZV0pO1xuICB2YXIgZm9ybUNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBmb3JtSW5zdGFuY2UpLCB7fSwge1xuICAgICAgdmFsaWRhdGVUcmlnZ2VyOiB2YWxpZGF0ZVRyaWdnZXJcbiAgICB9KTtcbiAgfSwgW2Zvcm1JbnN0YW5jZSwgdmFsaWRhdGVUcmlnZ2VyXSk7XG4gIHZhciB3cmFwcGVyTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZpZWxkQ29udGV4dC5kZWZhdWx0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGZvcm1Db250ZXh0VmFsdWVcbiAgfSwgY2hpbGRyZW5Ob2RlKTtcblxuICBpZiAoQ29tcG9uZW50ID09PSBmYWxzZSkge1xuICAgIHJldHVybiB3cmFwcGVyTm9kZTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgcmVzdFByb3BzLCB7XG4gICAgb25TdWJtaXQ6IGZ1bmN0aW9uIG9uU3VibWl0KGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBmb3JtSW5zdGFuY2Uuc3VibWl0KCk7XG4gICAgfVxuICB9KSwgd3JhcHBlck5vZGUpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gRm9ybTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuRm9ybVByb3ZpZGVyID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgRm9ybUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgdHJpZ2dlckZvcm1DaGFuZ2U6IGZ1bmN0aW9uIHRyaWdnZXJGb3JtQ2hhbmdlKCkge30sXG4gIHRyaWdnZXJGb3JtRmluaXNoOiBmdW5jdGlvbiB0cmlnZ2VyRm9ybUZpbmlzaCgpIHt9LFxuICByZWdpc3RlckZvcm06IGZ1bmN0aW9uIHJlZ2lzdGVyRm9ybSgpIHt9LFxuICB1bnJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gdW5yZWdpc3RlckZvcm0oKSB7fVxufSk7XG5cbnZhciBGb3JtUHJvdmlkZXIgPSBmdW5jdGlvbiBGb3JtUHJvdmlkZXIoX3JlZikge1xuICB2YXIgdmFsaWRhdGVNZXNzYWdlcyA9IF9yZWYudmFsaWRhdGVNZXNzYWdlcyxcbiAgICAgIG9uRm9ybUNoYW5nZSA9IF9yZWYub25Gb3JtQ2hhbmdlLFxuICAgICAgb25Gb3JtRmluaXNoID0gX3JlZi5vbkZvcm1GaW5pc2gsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciBmb3JtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICB2YXIgZm9ybXNSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiAoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQzLmRlZmF1bHQpKHt9LCBmb3JtQ29udGV4dCksIHt9LCB7XG4gICAgICB2YWxpZGF0ZU1lc3NhZ2VzOiAoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQzLmRlZmF1bHQpKHt9LCBmb3JtQ29udGV4dC52YWxpZGF0ZU1lc3NhZ2VzKSwgdmFsaWRhdGVNZXNzYWdlcyksXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vID0gICAgICAgICAgICAgICAgICBHbG9iYWwgRm9ybSBDb250cm9sICAgICAgICAgICAgICAgICAgPVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICB0cmlnZ2VyRm9ybUNoYW5nZTogZnVuY3Rpb24gdHJpZ2dlckZvcm1DaGFuZ2UobmFtZSwgY2hhbmdlZEZpZWxkcykge1xuICAgICAgICBpZiAob25Gb3JtQ2hhbmdlKSB7XG4gICAgICAgICAgb25Gb3JtQ2hhbmdlKG5hbWUsIHtcbiAgICAgICAgICAgIGNoYW5nZWRGaWVsZHM6IGNoYW5nZWRGaWVsZHMsXG4gICAgICAgICAgICBmb3JtczogZm9ybXNSZWYuY3VycmVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybUNvbnRleHQudHJpZ2dlckZvcm1DaGFuZ2UobmFtZSwgY2hhbmdlZEZpZWxkcyk7XG4gICAgICB9LFxuICAgICAgdHJpZ2dlckZvcm1GaW5pc2g6IGZ1bmN0aW9uIHRyaWdnZXJGb3JtRmluaXNoKG5hbWUsIHZhbHVlcykge1xuICAgICAgICBpZiAob25Gb3JtRmluaXNoKSB7XG4gICAgICAgICAgb25Gb3JtRmluaXNoKG5hbWUsIHtcbiAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgZm9ybXM6IGZvcm1zUmVmLmN1cnJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1Db250ZXh0LnRyaWdnZXJGb3JtRmluaXNoKG5hbWUsIHZhbHVlcyk7XG4gICAgICB9LFxuICAgICAgcmVnaXN0ZXJGb3JtOiBmdW5jdGlvbiByZWdpc3RlckZvcm0obmFtZSwgZm9ybSkge1xuICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgIGZvcm1zUmVmLmN1cnJlbnQgPSAoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQzLmRlZmF1bHQpKHt9LCBmb3Jtc1JlZi5jdXJyZW50KSwge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBuYW1lLCBmb3JtKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtQ29udGV4dC5yZWdpc3RlckZvcm0obmFtZSwgZm9ybSk7XG4gICAgICB9LFxuICAgICAgdW5yZWdpc3RlckZvcm06IGZ1bmN0aW9uIHVucmVnaXN0ZXJGb3JtKG5hbWUpIHtcbiAgICAgICAgdmFyIG5ld0Zvcm1zID0gKDAsIF9vYmplY3RTcHJlYWQzLmRlZmF1bHQpKHt9LCBmb3Jtc1JlZi5jdXJyZW50KTtcbiAgICAgICAgZGVsZXRlIG5ld0Zvcm1zW25hbWVdO1xuICAgICAgICBmb3Jtc1JlZi5jdXJyZW50ID0gbmV3Rm9ybXM7XG4gICAgICAgIGZvcm1Db250ZXh0LnVucmVnaXN0ZXJGb3JtKG5hbWUpO1xuICAgICAgfVxuICAgIH0pXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5cbmV4cG9ydHMuRm9ybVByb3ZpZGVyID0gRm9ybVByb3ZpZGVyO1xudmFyIF9kZWZhdWx0ID0gRm9ybUNvbnRleHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuXG52YXIgX0ZpZWxkQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRmllbGRDb250ZXh0XCIpKTtcblxudmFyIF9GaWVsZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRmllbGRcIikpO1xuXG52YXIgX3ZhbHVlVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL3ZhbHVlVXRpbFwiKTtcblxudmFyIExpc3QgPSBmdW5jdGlvbiBMaXN0KF9yZWYpIHtcbiAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfRmllbGRDb250ZXh0LmRlZmF1bHQpO1xuICB2YXIga2V5UmVmID0gUmVhY3QudXNlUmVmKHtcbiAgICBrZXlzOiBbXSxcbiAgICBpZDogMFxuICB9KTtcbiAgdmFyIGtleU1hbmFnZXIgPSBrZXlSZWYuY3VycmVudDsgLy8gVXNlciBzaG91bGQgbm90IHBhc3MgYGNoaWxkcmVuYCBhcyBvdGhlciB0eXBlLlxuXG4gIGlmICh0eXBlb2YgY2hpbGRyZW4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsICdGb3JtLkxpc3Qgb25seSBhY2NlcHRzIGZ1bmN0aW9uIGFzIGNoaWxkcmVuLicpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHBhcmVudFByZWZpeE5hbWUgPSAoMCwgX3ZhbHVlVXRpbC5nZXROYW1lUGF0aCkoY29udGV4dC5wcmVmaXhOYW1lKSB8fCBbXTtcbiAgdmFyIHByZWZpeE5hbWUgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkocGFyZW50UHJlZml4TmFtZSksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKCgwLCBfdmFsdWVVdGlsLmdldE5hbWVQYXRoKShuYW1lKSkpO1xuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRVcGRhdGUocHJldlZhbHVlLCBuZXh0VmFsdWUsIF9yZWYyKSB7XG4gICAgdmFyIHNvdXJjZSA9IF9yZWYyLnNvdXJjZTtcblxuICAgIGlmIChzb3VyY2UgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldlZhbHVlICE9PSBuZXh0VmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZpZWxkQ29udGV4dC5kZWZhdWx0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGNvbnRleHQpLCB7fSwge1xuICAgICAgcHJlZml4TmFtZTogcHJlZml4TmFtZVxuICAgIH0pXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZpZWxkLmRlZmF1bHQsIHtcbiAgICBuYW1lOiBbXSxcbiAgICBzaG91bGRVcGRhdGU6IHNob3VsZFVwZGF0ZVxuICB9LCBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICB2YXIgX3JlZjMkdmFsdWUgPSBfcmVmMy52YWx1ZSxcbiAgICAgICAgdmFsdWUgPSBfcmVmMyR2YWx1ZSA9PT0gdm9pZCAwID8gW10gOiBfcmVmMyR2YWx1ZSxcbiAgICAgICAgb25DaGFuZ2UgPSBfcmVmMy5vbkNoYW5nZTtcbiAgICB2YXIgZ2V0RmllbGRWYWx1ZSA9IGNvbnRleHQuZ2V0RmllbGRWYWx1ZTtcblxuICAgIHZhciBnZXROZXdWYWx1ZSA9IGZ1bmN0aW9uIGdldE5ld1ZhbHVlKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IGdldEZpZWxkVmFsdWUocHJlZml4TmFtZSB8fCBbXSk7XG4gICAgICByZXR1cm4gdmFsdWVzIHx8IFtdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWx3YXlzIGdldCBsYXRlc3QgdmFsdWUgaW4gY2FzZSB1c2VyIHVwZGF0ZSBmaWVsZHMgYnkgYGZvcm1gIGFwaS5cbiAgICAgKi9cblxuXG4gICAgdmFyIG9wZXJhdGlvbnMgPSB7XG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChkZWZhdWx0VmFsdWUsIGluZGV4KSB7XG4gICAgICAgIC8vIE1hcHBpbmcga2V5c1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBnZXROZXdWYWx1ZSgpO1xuXG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDw9IG5ld1ZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIGtleU1hbmFnZXIua2V5cyA9IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShrZXlNYW5hZ2VyLmtleXMuc2xpY2UoMCwgaW5kZXgpKSwgW2tleU1hbmFnZXIuaWRdLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShrZXlNYW5hZ2VyLmtleXMuc2xpY2UoaW5kZXgpKSk7XG4gICAgICAgICAgb25DaGFuZ2UoW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG5ld1ZhbHVlLnNsaWNlKDAsIGluZGV4KSksIFtkZWZhdWx0VmFsdWVdLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShuZXdWYWx1ZS5zbGljZShpbmRleCkpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG5ld1ZhbHVlLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ1RoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZSBhZGQgZnVuY3Rpb24gc2hvdWxkIGJlIGEgdmFsaWQgcG9zaXRpdmUgbnVtYmVyLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGtleU1hbmFnZXIua2V5cyA9IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShrZXlNYW5hZ2VyLmtleXMpLCBba2V5TWFuYWdlci5pZF0pO1xuICAgICAgICAgIG9uQ2hhbmdlKFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShuZXdWYWx1ZSksIFtkZWZhdWx0VmFsdWVdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBrZXlNYW5hZ2VyLmlkICs9IDE7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoaW5kZXgpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gZ2V0TmV3VmFsdWUoKTtcbiAgICAgICAgdmFyIGluZGV4U2V0ID0gbmV3IFNldChBcnJheS5pc0FycmF5KGluZGV4KSA/IGluZGV4IDogW2luZGV4XSk7XG5cbiAgICAgICAgaWYgKGluZGV4U2V0LnNpemUgPD0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGtleU1hbmFnZXIua2V5cyA9IGtleU1hbmFnZXIua2V5cy5maWx0ZXIoZnVuY3Rpb24gKF8sIGtleXNJbmRleCkge1xuICAgICAgICAgIHJldHVybiAhaW5kZXhTZXQuaGFzKGtleXNJbmRleCk7XG4gICAgICAgIH0pOyAvLyBUcmlnZ2VyIHN0b3JlIGNoYW5nZVxuXG4gICAgICAgIG9uQ2hhbmdlKG5ld1ZhbHVlLmZpbHRlcihmdW5jdGlvbiAoXywgdmFsdWVJbmRleCkge1xuICAgICAgICAgIHJldHVybiAhaW5kZXhTZXQuaGFzKHZhbHVlSW5kZXgpO1xuICAgICAgICB9KSk7XG4gICAgICB9LFxuICAgICAgbW92ZTogZnVuY3Rpb24gbW92ZShmcm9tLCB0bykge1xuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV3VmFsdWUgPSBnZXROZXdWYWx1ZSgpOyAvLyBEbyBub3QgaGFuZGxlIG91dCBvZiByYW5nZVxuXG4gICAgICAgIGlmIChmcm9tIDwgMCB8fCBmcm9tID49IG5ld1ZhbHVlLmxlbmd0aCB8fCB0byA8IDAgfHwgdG8gPj0gbmV3VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAga2V5TWFuYWdlci5rZXlzID0gKDAsIF92YWx1ZVV0aWwubW92ZSkoa2V5TWFuYWdlci5rZXlzLCBmcm9tLCB0byk7IC8vIFRyaWdnZXIgc3RvcmUgY2hhbmdlXG5cbiAgICAgICAgb25DaGFuZ2UoKDAsIF92YWx1ZVV0aWwubW92ZSkobmV3VmFsdWUsIGZyb20sIHRvKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbGlzdFZhbHVlID0gdmFsdWUgfHwgW107XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdFZhbHVlKSkge1xuICAgICAgbGlzdFZhbHVlID0gW107XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgXCJDdXJyZW50IHZhbHVlIG9mICdcIi5jb25jYXQocHJlZml4TmFtZS5qb2luKCcgPiAnKSwgXCInIGlzIG5vdCBhbiBhcnJheSB0eXBlLlwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkcmVuKGxpc3RWYWx1ZS5tYXAoZnVuY3Rpb24gKF9fLCBpbmRleCkge1xuICAgICAgdmFyIGtleSA9IGtleU1hbmFnZXIua2V5c1tpbmRleF07XG5cbiAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZXlNYW5hZ2VyLmtleXNbaW5kZXhdID0ga2V5TWFuYWdlci5pZDtcbiAgICAgICAga2V5ID0ga2V5TWFuYWdlci5rZXlzW2luZGV4XTtcbiAgICAgICAga2V5TWFuYWdlci5pZCArPSAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBpbmRleCxcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIGlzTGlzdEZpZWxkOiB0cnVlXG4gICAgICB9O1xuICAgIH0pLCBvcGVyYXRpb25zKTtcbiAgfSkpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gTGlzdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkZpZWxkXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9GaWVsZC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxpc3RcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX0xpc3QuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ1c2VGb3JtXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF91c2VGb3JtLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRm9ybVByb3ZpZGVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9Gb3JtQ29udGV4dC5Gb3JtUHJvdmlkZXI7XG4gIH1cbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0ZpZWxkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9GaWVsZFwiKSk7XG5cbnZhciBfTGlzdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTGlzdFwiKSk7XG5cbnZhciBfdXNlRm9ybSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXNlRm9ybVwiKSk7XG5cbnZhciBfRm9ybSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRm9ybVwiKSk7XG5cbnZhciBfRm9ybUNvbnRleHQgPSByZXF1aXJlKFwiLi9Gb3JtQ29udGV4dFwiKTtcblxudmFyIEludGVybmFsRm9ybSA9IFJlYWN0LmZvcndhcmRSZWYoX0Zvcm0uZGVmYXVsdCk7XG52YXIgUmVmRm9ybSA9IEludGVybmFsRm9ybTtcblJlZkZvcm0uRm9ybVByb3ZpZGVyID0gX0Zvcm1Db250ZXh0LkZvcm1Qcm92aWRlcjtcblJlZkZvcm0uRmllbGQgPSBfRmllbGQuZGVmYXVsdDtcblJlZkZvcm0uTGlzdCA9IF9MaXN0LmRlZmF1bHQ7XG5SZWZGb3JtLnVzZUZvcm0gPSBfdXNlRm9ybS5kZWZhdWx0O1xudmFyIF9kZWZhdWx0ID0gUmVmRm9ybTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuRm9ybVN0b3JlID0gdm9pZCAwO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfRmllbGRDb250ZXh0ID0gcmVxdWlyZShcIi4vRmllbGRDb250ZXh0XCIpO1xuXG52YXIgX2FzeW5jVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL2FzeW5jVXRpbFwiKTtcblxudmFyIF9OYW1lTWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dGlscy9OYW1lTWFwXCIpKTtcblxudmFyIF9tZXNzYWdlcyA9IHJlcXVpcmUoXCIuL3V0aWxzL21lc3NhZ2VzXCIpO1xuXG52YXIgX3ZhbHVlVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL3ZhbHVlVXRpbFwiKTtcblxudmFyIEZvcm1TdG9yZSA9IGZ1bmN0aW9uIEZvcm1TdG9yZShmb3JjZVJvb3RVcGRhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBGb3JtU3RvcmUpO1xuICB0aGlzLmZvcm1Ib29rZWQgPSBmYWxzZTtcbiAgdGhpcy5zdWJzY3JpYmFibGUgPSB0cnVlO1xuICB0aGlzLnN0b3JlID0ge307XG4gIHRoaXMuZmllbGRFbnRpdGllcyA9IFtdO1xuICB0aGlzLmluaXRpYWxWYWx1ZXMgPSB7fTtcbiAgdGhpcy5jYWxsYmFja3MgPSB7fTtcbiAgdGhpcy52YWxpZGF0ZU1lc3NhZ2VzID0gbnVsbDtcbiAgdGhpcy5wcmVzZXJ2ZSA9IG51bGw7XG4gIHRoaXMubGFzdFZhbGlkYXRlUHJvbWlzZSA9IG51bGw7XG5cbiAgdGhpcy5nZXRGb3JtID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRGaWVsZFZhbHVlOiBfdGhpcy5nZXRGaWVsZFZhbHVlLFxuICAgICAgZ2V0RmllbGRzVmFsdWU6IF90aGlzLmdldEZpZWxkc1ZhbHVlLFxuICAgICAgZ2V0RmllbGRFcnJvcjogX3RoaXMuZ2V0RmllbGRFcnJvcixcbiAgICAgIGdldEZpZWxkc0Vycm9yOiBfdGhpcy5nZXRGaWVsZHNFcnJvcixcbiAgICAgIGlzRmllbGRzVG91Y2hlZDogX3RoaXMuaXNGaWVsZHNUb3VjaGVkLFxuICAgICAgaXNGaWVsZFRvdWNoZWQ6IF90aGlzLmlzRmllbGRUb3VjaGVkLFxuICAgICAgaXNGaWVsZFZhbGlkYXRpbmc6IF90aGlzLmlzRmllbGRWYWxpZGF0aW5nLFxuICAgICAgaXNGaWVsZHNWYWxpZGF0aW5nOiBfdGhpcy5pc0ZpZWxkc1ZhbGlkYXRpbmcsXG4gICAgICByZXNldEZpZWxkczogX3RoaXMucmVzZXRGaWVsZHMsXG4gICAgICBzZXRGaWVsZHM6IF90aGlzLnNldEZpZWxkcyxcbiAgICAgIHNldEZpZWxkc1ZhbHVlOiBfdGhpcy5zZXRGaWVsZHNWYWx1ZSxcbiAgICAgIHZhbGlkYXRlRmllbGRzOiBfdGhpcy52YWxpZGF0ZUZpZWxkcyxcbiAgICAgIHN1Ym1pdDogX3RoaXMuc3VibWl0LFxuICAgICAgZ2V0SW50ZXJuYWxIb29rczogX3RoaXMuZ2V0SW50ZXJuYWxIb29rc1xuICAgIH07XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBJbnRlcm5hbCBIb29rcyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHRoaXMuZ2V0SW50ZXJuYWxIb29rcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoa2V5ID09PSBfRmllbGRDb250ZXh0LkhPT0tfTUFSSykge1xuICAgICAgX3RoaXMuZm9ybUhvb2tlZCA9IHRydWU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwYXRjaDogX3RoaXMuZGlzcGF0Y2gsXG4gICAgICAgIHJlZ2lzdGVyRmllbGQ6IF90aGlzLnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHVzZVN1YnNjcmliZTogX3RoaXMudXNlU3Vic2NyaWJlLFxuICAgICAgICBzZXRJbml0aWFsVmFsdWVzOiBfdGhpcy5zZXRJbml0aWFsVmFsdWVzLFxuICAgICAgICBzZXRDYWxsYmFja3M6IF90aGlzLnNldENhbGxiYWNrcyxcbiAgICAgICAgc2V0VmFsaWRhdGVNZXNzYWdlczogX3RoaXMuc2V0VmFsaWRhdGVNZXNzYWdlcyxcbiAgICAgICAgZ2V0RmllbGRzOiBfdGhpcy5nZXRGaWVsZHMsXG4gICAgICAgIHNldFByZXNlcnZlOiBfdGhpcy5zZXRQcmVzZXJ2ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsICdgZ2V0SW50ZXJuYWxIb29rc2AgaXMgaW50ZXJuYWwgdXNhZ2UuIFNob3VsZCBub3QgY2FsbCBkaXJlY3RseS4nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB0aGlzLnVzZVN1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmFibGUpIHtcbiAgICBfdGhpcy5zdWJzY3JpYmFibGUgPSBzdWJzY3JpYmFibGU7XG4gIH07XG4gIC8qKlxuICAgKiBGaXJzdCB0aW1lIGBzZXRJbml0aWFsVmFsdWVzYCBzaG91bGQgdXBkYXRlIHN0b3JlIHdpdGggaW5pdGlhbCB2YWx1ZVxuICAgKi9cblxuXG4gIHRoaXMuc2V0SW5pdGlhbFZhbHVlcyA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWVzLCBpbml0KSB7XG4gICAgX3RoaXMuaW5pdGlhbFZhbHVlcyA9IGluaXRpYWxWYWx1ZXMgfHwge307XG5cbiAgICBpZiAoaW5pdCkge1xuICAgICAgX3RoaXMuc3RvcmUgPSAoMCwgX3ZhbHVlVXRpbC5zZXRWYWx1ZXMpKHt9LCBpbml0aWFsVmFsdWVzLCBfdGhpcy5zdG9yZSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuZ2V0SW5pdGlhbFZhbHVlID0gZnVuY3Rpb24gKG5hbWVQYXRoKSB7XG4gICAgcmV0dXJuICgwLCBfdmFsdWVVdGlsLmdldFZhbHVlKShfdGhpcy5pbml0aWFsVmFsdWVzLCBuYW1lUGF0aCk7XG4gIH07XG5cbiAgdGhpcy5zZXRDYWxsYmFja3MgPSBmdW5jdGlvbiAoY2FsbGJhY2tzKSB7XG4gICAgX3RoaXMuY2FsbGJhY2tzID0gY2FsbGJhY2tzO1xuICB9O1xuXG4gIHRoaXMuc2V0VmFsaWRhdGVNZXNzYWdlcyA9IGZ1bmN0aW9uICh2YWxpZGF0ZU1lc3NhZ2VzKSB7XG4gICAgX3RoaXMudmFsaWRhdGVNZXNzYWdlcyA9IHZhbGlkYXRlTWVzc2FnZXM7XG4gIH07XG5cbiAgdGhpcy5zZXRQcmVzZXJ2ZSA9IGZ1bmN0aW9uIChwcmVzZXJ2ZSkge1xuICAgIF90aGlzLnByZXNlcnZlID0gcHJlc2VydmU7XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IERldiBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHRoaXMudGltZW91dElkID0gbnVsbDtcblxuICB0aGlzLndhcm5pbmdVbmhvb2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhX3RoaXMudGltZW91dElkICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBfdGhpcy50aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnRpbWVvdXRJZCA9IG51bGw7XG5cbiAgICAgICAgaWYgKCFfdGhpcy5mb3JtSG9va2VkKSB7XG4gICAgICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCAnSW5zdGFuY2UgY3JlYXRlZCBieSBgdXNlRm9ybWAgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgRm9ybSBlbGVtZW50LiBGb3JnZXQgdG8gcGFzcyBgZm9ybWAgcHJvcD8nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEZpZWxkcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCByZWdpc3RlcmVkIGZpZWxkIGVudGl0aWVzLlxuICAgKiBAcGFyYW0gcHVyZSBPbmx5IHJldHVybiBmaWVsZCB3aGljaCBoYXMgYSBgbmFtZWAuIERlZmF1bHQ6IGZhbHNlXG4gICAqL1xuXG5cbiAgdGhpcy5nZXRGaWVsZEVudGl0aWVzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwdXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIGlmICghcHVyZSkge1xuICAgICAgcmV0dXJuIF90aGlzLmZpZWxkRW50aXRpZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzLmZpZWxkRW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgcmV0dXJuIGZpZWxkLmdldE5hbWVQYXRoKCkubGVuZ3RoO1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuZ2V0RmllbGRzTWFwID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwdXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgY2FjaGUgPSBuZXcgX05hbWVNYXAuZGVmYXVsdCgpO1xuXG4gICAgX3RoaXMuZ2V0RmllbGRFbnRpdGllcyhwdXJlKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgdmFyIG5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIGNhY2hlLnNldChuYW1lUGF0aCwgZmllbGQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNhY2hlO1xuICB9O1xuXG4gIHRoaXMuZ2V0RmllbGRFbnRpdGllc0Zvck5hbWVQYXRoTGlzdCA9IGZ1bmN0aW9uIChuYW1lTGlzdCkge1xuICAgIGlmICghbmFtZUxpc3QpIHtcbiAgICAgIHJldHVybiBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpO1xuICAgIH1cblxuICAgIHZhciBjYWNoZSA9IF90aGlzLmdldEZpZWxkc01hcCh0cnVlKTtcblxuICAgIHJldHVybiBuYW1lTGlzdC5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBuYW1lUGF0aCA9ICgwLCBfdmFsdWVVdGlsLmdldE5hbWVQYXRoKShuYW1lKTtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQobmFtZVBhdGgpIHx8IHtcbiAgICAgICAgSU5WQUxJREFURV9OQU1FX1BBVEg6ICgwLCBfdmFsdWVVdGlsLmdldE5hbWVQYXRoKShuYW1lKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmdldEZpZWxkc1ZhbHVlID0gZnVuY3Rpb24gKG5hbWVMaXN0LCBmaWx0ZXJGdW5jKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG5cbiAgICBpZiAobmFtZUxpc3QgPT09IHRydWUgJiYgIWZpbHRlckZ1bmMpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zdG9yZTtcbiAgICB9XG5cbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXNGb3JOYW1lUGF0aExpc3QoQXJyYXkuaXNBcnJheShuYW1lTGlzdCkgPyBuYW1lTGlzdCA6IG51bGwpO1xuXG4gICAgdmFyIGZpbHRlcmVkTmFtZUxpc3QgPSBbXTtcbiAgICBmaWVsZEVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIG5hbWVQYXRoID0gJ0lOVkFMSURBVEVfTkFNRV9QQVRIJyBpbiBlbnRpdHkgPyBlbnRpdHkuSU5WQUxJREFURV9OQU1FX1BBVEggOiBlbnRpdHkuZ2V0TmFtZVBhdGgoKTtcblxuICAgICAgaWYgKCFmaWx0ZXJGdW5jKSB7XG4gICAgICAgIGZpbHRlcmVkTmFtZUxpc3QucHVzaChuYW1lUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWV0YSA9ICdnZXRNZXRhJyBpbiBlbnRpdHkgPyBlbnRpdHkuZ2V0TWV0YSgpIDogbnVsbDtcblxuICAgICAgICBpZiAoZmlsdGVyRnVuYyhtZXRhKSkge1xuICAgICAgICAgIGZpbHRlcmVkTmFtZUxpc3QucHVzaChuYW1lUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gKDAsIF92YWx1ZVV0aWwuY2xvbmVCeU5hbWVQYXRoTGlzdCkoX3RoaXMuc3RvcmUsIGZpbHRlcmVkTmFtZUxpc3QubWFwKF92YWx1ZVV0aWwuZ2V0TmFtZVBhdGgpKTtcbiAgfTtcblxuICB0aGlzLmdldEZpZWxkVmFsdWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuXG4gICAgdmFyIG5hbWVQYXRoID0gKDAsIF92YWx1ZVV0aWwuZ2V0TmFtZVBhdGgpKG5hbWUpO1xuICAgIHJldHVybiAoMCwgX3ZhbHVlVXRpbC5nZXRWYWx1ZSkoX3RoaXMuc3RvcmUsIG5hbWVQYXRoKTtcbiAgfTtcblxuICB0aGlzLmdldEZpZWxkc0Vycm9yID0gZnVuY3Rpb24gKG5hbWVMaXN0KSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG5cbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXNGb3JOYW1lUGF0aExpc3QobmFtZUxpc3QpO1xuXG4gICAgcmV0dXJuIGZpZWxkRW50aXRpZXMubWFwKGZ1bmN0aW9uIChlbnRpdHksIGluZGV4KSB7XG4gICAgICBpZiAoZW50aXR5ICYmICEoJ0lOVkFMSURBVEVfTkFNRV9QQVRIJyBpbiBlbnRpdHkpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogZW50aXR5LmdldE5hbWVQYXRoKCksXG4gICAgICAgICAgZXJyb3JzOiBlbnRpdHkuZ2V0RXJyb3JzKClcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogKDAsIF92YWx1ZVV0aWwuZ2V0TmFtZVBhdGgpKG5hbWVMaXN0W2luZGV4XSksXG4gICAgICAgIGVycm9yczogW11cbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5nZXRGaWVsZEVycm9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcblxuICAgIHZhciBuYW1lUGF0aCA9ICgwLCBfdmFsdWVVdGlsLmdldE5hbWVQYXRoKShuYW1lKTtcblxuICAgIHZhciBmaWVsZEVycm9yID0gX3RoaXMuZ2V0RmllbGRzRXJyb3IoW25hbWVQYXRoXSlbMF07XG5cbiAgICByZXR1cm4gZmllbGRFcnJvci5lcnJvcnM7XG4gIH07XG5cbiAgdGhpcy5pc0ZpZWxkc1RvdWNoZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIGFyZzAgPSBhcmdzWzBdLFxuICAgICAgICBhcmcxID0gYXJnc1sxXTtcbiAgICB2YXIgbmFtZVBhdGhMaXN0O1xuICAgIHZhciBpc0FsbEZpZWxkc1RvdWNoZWQgPSBmYWxzZTtcblxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbmFtZVBhdGhMaXN0ID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcwKSkge1xuICAgICAgICBuYW1lUGF0aExpc3QgPSBhcmcwLm1hcChfdmFsdWVVdGlsLmdldE5hbWVQYXRoKTtcbiAgICAgICAgaXNBbGxGaWVsZHNUb3VjaGVkID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYW1lUGF0aExpc3QgPSBudWxsO1xuICAgICAgICBpc0FsbEZpZWxkc1RvdWNoZWQgPSBhcmcwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lUGF0aExpc3QgPSBhcmcwLm1hcChfdmFsdWVVdGlsLmdldE5hbWVQYXRoKTtcbiAgICAgIGlzQWxsRmllbGRzVG91Y2hlZCA9IGFyZzE7XG4gICAgfVxuXG4gICAgdmFyIHRlc3RUb3VjaGVkID0gZnVuY3Rpb24gdGVzdFRvdWNoZWQoZmllbGQpIHtcbiAgICAgIC8vIE5vdCBwcm92aWRlIGBuYW1lTGlzdGAgd2lsbCBjaGVjayBhbGwgdGhlIGZpZWxkc1xuICAgICAgaWYgKCFuYW1lUGF0aExpc3QpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmlzRmllbGRUb3VjaGVkKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWVsZE5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcblxuICAgICAgaWYgKCgwLCBfdmFsdWVVdGlsLmNvbnRhaW5zTmFtZVBhdGgpKG5hbWVQYXRoTGlzdCwgZmllbGROYW1lUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmlzRmllbGRUb3VjaGVkKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0FsbEZpZWxkc1RvdWNoZWQ7XG4gICAgfTtcblxuICAgIHJldHVybiBpc0FsbEZpZWxkc1RvdWNoZWQgPyBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpLmV2ZXJ5KHRlc3RUb3VjaGVkKSA6IF90aGlzLmdldEZpZWxkRW50aXRpZXModHJ1ZSkuc29tZSh0ZXN0VG91Y2hlZCk7XG4gIH07XG5cbiAgdGhpcy5pc0ZpZWxkVG91Y2hlZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG5cbiAgICByZXR1cm4gX3RoaXMuaXNGaWVsZHNUb3VjaGVkKFtuYW1lXSk7XG4gIH07XG5cbiAgdGhpcy5pc0ZpZWxkc1ZhbGlkYXRpbmcgPSBmdW5jdGlvbiAobmFtZUxpc3QpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcblxuICAgIHZhciBmaWVsZEVudGl0aWVzID0gX3RoaXMuZ2V0RmllbGRFbnRpdGllcygpO1xuXG4gICAgaWYgKCFuYW1lTGlzdCkge1xuICAgICAgcmV0dXJuIGZpZWxkRW50aXRpZXMuc29tZShmdW5jdGlvbiAodGVzdEZpZWxkKSB7XG4gICAgICAgIHJldHVybiB0ZXN0RmllbGQuaXNGaWVsZFZhbGlkYXRpbmcoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBuYW1lUGF0aExpc3QgPSBuYW1lTGlzdC5tYXAoX3ZhbHVlVXRpbC5nZXROYW1lUGF0aCk7XG4gICAgcmV0dXJuIGZpZWxkRW50aXRpZXMuc29tZShmdW5jdGlvbiAodGVzdEZpZWxkKSB7XG4gICAgICB2YXIgZmllbGROYW1lUGF0aCA9IHRlc3RGaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgcmV0dXJuICgwLCBfdmFsdWVVdGlsLmNvbnRhaW5zTmFtZVBhdGgpKG5hbWVQYXRoTGlzdCwgZmllbGROYW1lUGF0aCkgJiYgdGVzdEZpZWxkLmlzRmllbGRWYWxpZGF0aW5nKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5pc0ZpZWxkVmFsaWRhdGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG5cbiAgICByZXR1cm4gX3RoaXMuaXNGaWVsZHNWYWxpZGF0aW5nKFtuYW1lXSk7XG4gIH07XG4gIC8qKlxuICAgKiBSZXNldCBGaWVsZCB3aXRoIGZpZWxkIGBpbml0aWFsVmFsdWVgIHByb3AuXG4gICAqIENhbiBwYXNzIGBlbnRpdGllc2Agb3IgYG5hbWVQYXRoTGlzdGAgb3IganVzdCBub3RoaW5nLlxuICAgKi9cblxuXG4gIHRoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGluZm8gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIC8vIENyZWF0ZSBjYWNoZVxuICAgIHZhciBjYWNoZSA9IG5ldyBfTmFtZU1hcC5kZWZhdWx0KCk7XG5cbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXModHJ1ZSk7XG5cbiAgICBmaWVsZEVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgaW5pdGlhbFZhbHVlID0gZmllbGQucHJvcHMuaW5pdGlhbFZhbHVlO1xuICAgICAgdmFyIG5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTsgLy8gUmVjb3JkIG9ubHkgaWYgaGFzIGBpbml0aWFsVmFsdWVgXG5cbiAgICAgIGlmIChpbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgcmVjb3JkcyA9IGNhY2hlLmdldChuYW1lUGF0aCkgfHwgbmV3IFNldCgpO1xuICAgICAgICByZWNvcmRzLmFkZCh7XG4gICAgICAgICAgZW50aXR5OiBmaWVsZCxcbiAgICAgICAgICB2YWx1ZTogaW5pdGlhbFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjYWNoZS5zZXQobmFtZVBhdGgsIHJlY29yZHMpO1xuICAgICAgfVxuICAgIH0pOyAvLyBSZXNldFxuXG4gICAgdmFyIHJlc2V0V2l0aEZpZWxkcyA9IGZ1bmN0aW9uIHJlc2V0V2l0aEZpZWxkcyhlbnRpdGllcykge1xuICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IGZpZWxkLnByb3BzLmluaXRpYWxWYWx1ZTtcblxuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YXIgbmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuXG4gICAgICAgICAgdmFyIGZvcm1Jbml0aWFsVmFsdWUgPSBfdGhpcy5nZXRJbml0aWFsVmFsdWUobmFtZVBhdGgpO1xuXG4gICAgICAgICAgaWYgKGZvcm1Jbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gV2FybmluZyBpZiBjb25mbGljdCB3aXRoIGZvcm0gaW5pdGlhbFZhbHVlcyBhbmQgZG8gbm90IG1vZGlmeSB2YWx1ZVxuICAgICAgICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCBcIkZvcm0gYWxyZWFkeSBzZXQgJ2luaXRpYWxWYWx1ZXMnIHdpdGggcGF0aCAnXCIuY29uY2F0KG5hbWVQYXRoLmpvaW4oJy4nKSwgXCInLiBGaWVsZCBjYW4gbm90IG92ZXJ3cml0ZSBpdC5cIikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcmVjb3JkcyA9IGNhY2hlLmdldChuYW1lUGF0aCk7XG5cbiAgICAgICAgICAgIGlmIChyZWNvcmRzICYmIHJlY29yZHMuc2l6ZSA+IDEpIHtcbiAgICAgICAgICAgICAgLy8gV2FybmluZyBpZiBtdWx0aXBsZSBmaWVsZCBzZXQgYGluaXRpYWxWYWx1ZWBhbmQgZG8gbm90IG1vZGlmeSB2YWx1ZVxuICAgICAgICAgICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsIFwiTXVsdGlwbGUgRmllbGQgd2l0aCBwYXRoICdcIi5jb25jYXQobmFtZVBhdGguam9pbignLicpLCBcIicgc2V0ICdpbml0aWFsVmFsdWUnLiBDYW4gbm90IGRlY2lkZSB3aGljaCBvbmUgdG8gcGljay5cIikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmRzKSB7XG4gICAgICAgICAgICAgIHZhciBvcmlnaW5WYWx1ZSA9IF90aGlzLmdldEZpZWxkVmFsdWUobmFtZVBhdGgpOyAvLyBTZXQgYGluaXRpYWxWYWx1ZWBcblxuXG4gICAgICAgICAgICAgIGlmICghaW5mby5za2lwRXhpc3QgfHwgb3JpZ2luVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnN0b3JlID0gKDAsIF92YWx1ZVV0aWwuc2V0VmFsdWUpKF90aGlzLnN0b3JlLCBuYW1lUGF0aCwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkocmVjb3JkcylbMF0udmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIHJlcXVpcmVkRmllbGRFbnRpdGllcztcblxuICAgIGlmIChpbmZvLmVudGl0aWVzKSB7XG4gICAgICByZXF1aXJlZEZpZWxkRW50aXRpZXMgPSBpbmZvLmVudGl0aWVzO1xuICAgIH0gZWxzZSBpZiAoaW5mby5uYW1lUGF0aExpc3QpIHtcbiAgICAgIHJlcXVpcmVkRmllbGRFbnRpdGllcyA9IFtdO1xuICAgICAgaW5mby5uYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgICAgICAgdmFyIHJlY29yZHMgPSBjYWNoZS5nZXQobmFtZVBhdGgpO1xuXG4gICAgICAgIGlmIChyZWNvcmRzKSB7XG4gICAgICAgICAgdmFyIF9yZXF1aXJlZEZpZWxkRW50aXRpZTtcblxuICAgICAgICAgIChfcmVxdWlyZWRGaWVsZEVudGl0aWUgPSByZXF1aXJlZEZpZWxkRW50aXRpZXMpLnB1c2guYXBwbHkoX3JlcXVpcmVkRmllbGRFbnRpdGllLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KSgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShyZWNvcmRzKS5tYXAoZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIHJldHVybiByLmVudGl0eTtcbiAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWlyZWRGaWVsZEVudGl0aWVzID0gZmllbGRFbnRpdGllcztcbiAgICB9XG5cbiAgICByZXNldFdpdGhGaWVsZHMocmVxdWlyZWRGaWVsZEVudGl0aWVzKTtcbiAgfTtcblxuICB0aGlzLnJlc2V0RmllbGRzID0gZnVuY3Rpb24gKG5hbWVMaXN0KSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG5cbiAgICB2YXIgcHJldlN0b3JlID0gX3RoaXMuc3RvcmU7XG5cbiAgICBpZiAoIW5hbWVMaXN0KSB7XG4gICAgICBfdGhpcy5zdG9yZSA9ICgwLCBfdmFsdWVVdGlsLnNldFZhbHVlcykoe30sIF90aGlzLmluaXRpYWxWYWx1ZXMpO1xuXG4gICAgICBfdGhpcy5yZXNldFdpdGhGaWVsZEluaXRpYWxWYWx1ZSgpO1xuXG4gICAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBudWxsLCB7XG4gICAgICAgIHR5cGU6ICdyZXNldCdcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBSZXNldCBieSBgbmFtZUxpc3RgXG5cblxuICAgIHZhciBuYW1lUGF0aExpc3QgPSBuYW1lTGlzdC5tYXAoX3ZhbHVlVXRpbC5nZXROYW1lUGF0aCk7XG4gICAgbmFtZVBhdGhMaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWVQYXRoKSB7XG4gICAgICB2YXIgaW5pdGlhbFZhbHVlID0gX3RoaXMuZ2V0SW5pdGlhbFZhbHVlKG5hbWVQYXRoKTtcblxuICAgICAgX3RoaXMuc3RvcmUgPSAoMCwgX3ZhbHVlVXRpbC5zZXRWYWx1ZSkoX3RoaXMuc3RvcmUsIG5hbWVQYXRoLCBpbml0aWFsVmFsdWUpO1xuICAgIH0pO1xuXG4gICAgX3RoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUoe1xuICAgICAgbmFtZVBhdGhMaXN0OiBuYW1lUGF0aExpc3RcbiAgICB9KTtcblxuICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIG5hbWVQYXRoTGlzdCwge1xuICAgICAgdHlwZTogJ3Jlc2V0J1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuc2V0RmllbGRzID0gZnVuY3Rpb24gKGZpZWxkcykge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuXG4gICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZERhdGEpIHtcbiAgICAgIHZhciBuYW1lID0gZmllbGREYXRhLm5hbWUsXG4gICAgICAgICAgZXJyb3JzID0gZmllbGREYXRhLmVycm9ycyxcbiAgICAgICAgICBkYXRhID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoZmllbGREYXRhLCBbXCJuYW1lXCIsIFwiZXJyb3JzXCJdKTtcbiAgICAgIHZhciBuYW1lUGF0aCA9ICgwLCBfdmFsdWVVdGlsLmdldE5hbWVQYXRoKShuYW1lKTsgLy8gVmFsdWVcblxuICAgICAgaWYgKCd2YWx1ZScgaW4gZGF0YSkge1xuICAgICAgICBfdGhpcy5zdG9yZSA9ICgwLCBfdmFsdWVVdGlsLnNldFZhbHVlKShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIGRhdGEudmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBbbmFtZVBhdGhdLCB7XG4gICAgICAgIHR5cGU6ICdzZXRGaWVsZCcsXG4gICAgICAgIGRhdGE6IGZpZWxkRGF0YVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5nZXRGaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVudGl0aWVzID0gX3RoaXMuZ2V0RmllbGRFbnRpdGllcyh0cnVlKTtcblxuICAgIHZhciBmaWVsZHMgPSBlbnRpdGllcy5tYXAoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgbmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFyIG1ldGEgPSBmaWVsZC5nZXRNZXRhKCk7XG4gICAgICB2YXIgZmllbGREYXRhID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgbWV0YSksIHt9LCB7XG4gICAgICAgIG5hbWU6IG5hbWVQYXRoLFxuICAgICAgICB2YWx1ZTogX3RoaXMuZ2V0RmllbGRWYWx1ZShuYW1lUGF0aClcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpZWxkRGF0YSwgJ29yaWdpblJDRmllbGQnLCB7XG4gICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmaWVsZERhdGE7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpZWxkcztcbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IE9ic2VydmVyID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdGhpcy5yZWdpc3RlckZpZWxkID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIF90aGlzLmZpZWxkRW50aXRpZXMucHVzaChlbnRpdHkpOyAvLyBTZXQgaW5pdGlhbCB2YWx1ZXNcblxuXG4gICAgaWYgKGVudGl0eS5wcm9wcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuXG4gICAgICBfdGhpcy5yZXNldFdpdGhGaWVsZEluaXRpYWxWYWx1ZSh7XG4gICAgICAgIGVudGl0aWVzOiBbZW50aXR5XSxcbiAgICAgICAgc2tpcEV4aXN0OiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgW2VudGl0eS5nZXROYW1lUGF0aCgpXSwge1xuICAgICAgICB0eXBlOiAndmFsdWVVcGRhdGUnLFxuICAgICAgICBzb3VyY2U6ICdpbnRlcm5hbCdcbiAgICAgIH0pO1xuICAgIH0gLy8gdW4tcmVnaXN0ZXIgZmllbGQgY2FsbGJhY2tcblxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpc0xpc3RGaWVsZCwgcHJlc2VydmUpIHtcbiAgICAgIF90aGlzLmZpZWxkRW50aXRpZXMgPSBfdGhpcy5maWVsZEVudGl0aWVzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbSAhPT0gZW50aXR5O1xuICAgICAgfSk7IC8vIENsZWFuIHVwIHN0b3JlIHZhbHVlIGlmIHByZXNlcnZlXG5cbiAgICAgIHZhciBtZXJnZWRQcmVzZXJ2ZSA9IHByZXNlcnZlICE9PSB1bmRlZmluZWQgPyBwcmVzZXJ2ZSA6IF90aGlzLnByZXNlcnZlO1xuXG4gICAgICBpZiAobWVyZ2VkUHJlc2VydmUgPT09IGZhbHNlICYmICFpc0xpc3RGaWVsZCkge1xuICAgICAgICB2YXIgbmFtZVBhdGggPSBlbnRpdHkuZ2V0TmFtZVBhdGgoKTtcblxuICAgICAgICBpZiAoX3RoaXMuZ2V0RmllbGRWYWx1ZShuYW1lUGF0aCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIF90aGlzLnN0b3JlID0gKDAsIF92YWx1ZVV0aWwuc2V0VmFsdWUpKF90aGlzLnN0b3JlLCBuYW1lUGF0aCwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgdGhpcy5kaXNwYXRjaCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICd1cGRhdGVWYWx1ZSc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbmFtZVBhdGggPSBhY3Rpb24ubmFtZVBhdGgsXG4gICAgICAgICAgICAgIHZhbHVlID0gYWN0aW9uLnZhbHVlO1xuXG4gICAgICAgICAgX3RoaXMudXBkYXRlVmFsdWUobmFtZVBhdGgsIHZhbHVlKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ3ZhbGlkYXRlRmllbGQnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9uYW1lUGF0aCA9IGFjdGlvbi5uYW1lUGF0aCxcbiAgICAgICAgICAgICAgdHJpZ2dlck5hbWUgPSBhY3Rpb24udHJpZ2dlck5hbWU7XG5cbiAgICAgICAgICBfdGhpcy52YWxpZGF0ZUZpZWxkcyhbX25hbWVQYXRoXSwge1xuICAgICAgICAgICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiAvLyBDdXJyZW50bHkgd2UgZG9uJ3QgaGF2ZSBvdGhlciBhY3Rpb24uIERvIG5vdGhpbmcuXG5cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5ub3RpZnlPYnNlcnZlcnMgPSBmdW5jdGlvbiAocHJldlN0b3JlLCBuYW1lUGF0aExpc3QsIGluZm8pIHtcbiAgICBpZiAoX3RoaXMuc3Vic2NyaWJhYmxlKSB7XG4gICAgICB2YXIgbWVyZ2VkSW5mbyA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGluZm8pLCB7fSwge1xuICAgICAgICBzdG9yZTogX3RoaXMuZ2V0RmllbGRzVmFsdWUodHJ1ZSlcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgb25TdG9yZUNoYW5nZSA9IF9yZWYub25TdG9yZUNoYW5nZTtcbiAgICAgICAgb25TdG9yZUNoYW5nZShwcmV2U3RvcmUsIG5hbWVQYXRoTGlzdCwgbWVyZ2VkSW5mbyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZm9yY2VSb290VXBkYXRlKCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMudXBkYXRlVmFsdWUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgbmFtZVBhdGggPSAoMCwgX3ZhbHVlVXRpbC5nZXROYW1lUGF0aCkobmFtZSk7XG4gICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgIF90aGlzLnN0b3JlID0gKDAsIF92YWx1ZVV0aWwuc2V0VmFsdWUpKF90aGlzLnN0b3JlLCBuYW1lUGF0aCwgdmFsdWUpO1xuXG4gICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgW25hbWVQYXRoXSwge1xuICAgICAgdHlwZTogJ3ZhbHVlVXBkYXRlJyxcbiAgICAgIHNvdXJjZTogJ2ludGVybmFsJ1xuICAgIH0pOyAvLyBOb3RpZnkgZGVwZW5kZW5jaWVzIGNoaWxkcmVuIHdpdGggcGFyZW50IHVwZGF0ZVxuXG5cbiAgICB2YXIgY2hpbGRyZW5GaWVsZHMgPSBfdGhpcy5nZXREZXBlbmRlbmN5Q2hpbGRyZW5GaWVsZHMobmFtZVBhdGgpO1xuXG4gICAgX3RoaXMudmFsaWRhdGVGaWVsZHMoY2hpbGRyZW5GaWVsZHMpO1xuXG4gICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgY2hpbGRyZW5GaWVsZHMsIHtcbiAgICAgIHR5cGU6ICdkZXBlbmRlbmNpZXNVcGRhdGUnLFxuICAgICAgcmVsYXRlZEZpZWxkczogW25hbWVQYXRoXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoY2hpbGRyZW5GaWVsZHMpKVxuICAgIH0pOyAvLyB0cmlnZ2VyIGNhbGxiYWNrIGZ1bmN0aW9uXG5cblxuICAgIHZhciBvblZhbHVlc0NoYW5nZSA9IF90aGlzLmNhbGxiYWNrcy5vblZhbHVlc0NoYW5nZTtcblxuICAgIGlmIChvblZhbHVlc0NoYW5nZSkge1xuICAgICAgdmFyIGNoYW5nZWRWYWx1ZXMgPSAoMCwgX3ZhbHVlVXRpbC5jbG9uZUJ5TmFtZVBhdGhMaXN0KShfdGhpcy5zdG9yZSwgW25hbWVQYXRoXSk7XG4gICAgICBvblZhbHVlc0NoYW5nZShjaGFuZ2VkVmFsdWVzLCBfdGhpcy5zdG9yZSk7XG4gICAgfVxuXG4gICAgX3RoaXMudHJpZ2dlck9uRmllbGRzQ2hhbmdlKFtuYW1lUGF0aF0uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGNoaWxkcmVuRmllbGRzKSkpO1xuICB9OyAvLyBMZXQgYWxsIGNoaWxkIEZpZWxkIGdldCB1cGRhdGUuXG5cblxuICB0aGlzLnNldEZpZWxkc1ZhbHVlID0gZnVuY3Rpb24gKHN0b3JlKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG5cbiAgICB2YXIgcHJldlN0b3JlID0gX3RoaXMuc3RvcmU7XG5cbiAgICBpZiAoc3RvcmUpIHtcbiAgICAgIF90aGlzLnN0b3JlID0gKDAsIF92YWx1ZVV0aWwuc2V0VmFsdWVzKShfdGhpcy5zdG9yZSwgc3RvcmUpO1xuICAgIH1cblxuICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIG51bGwsIHtcbiAgICAgIHR5cGU6ICd2YWx1ZVVwZGF0ZScsXG4gICAgICBzb3VyY2U6ICdleHRlcm5hbCdcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmdldERlcGVuZGVuY3lDaGlsZHJlbkZpZWxkcyA9IGZ1bmN0aW9uIChyb290TmFtZVBhdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBuZXcgU2V0KCk7XG4gICAgdmFyIGNoaWxkcmVuRmllbGRzID0gW107XG4gICAgdmFyIGRlcGVuZGVuY2llczJmaWVsZHMgPSBuZXcgX05hbWVNYXAuZGVmYXVsdCgpO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG1hcHNcbiAgICAgKiBDYW4gdXNlIGNhY2hlIHRvIHNhdmUgcGVyZiBpZiB1c2VyIHJlcG9ydCBwZXJmb3JtYW5jZSBpc3N1ZSB3aXRoIHRoaXNcbiAgICAgKi9cblxuICAgIF90aGlzLmdldEZpZWxkRW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgdmFyIGRlcGVuZGVuY2llcyA9IGZpZWxkLnByb3BzLmRlcGVuZGVuY2llcztcbiAgICAgIChkZXBlbmRlbmNpZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgdmFyIGRlcGVuZGVuY3lOYW1lUGF0aCA9ICgwLCBfdmFsdWVVdGlsLmdldE5hbWVQYXRoKShkZXBlbmRlbmN5KTtcbiAgICAgICAgZGVwZW5kZW5jaWVzMmZpZWxkcy51cGRhdGUoZGVwZW5kZW5jeU5hbWVQYXRoLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGZpZWxkcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IFNldCgpO1xuICAgICAgICAgIGZpZWxkcy5hZGQoZmllbGQpO1xuICAgICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgZmlsbENoaWxkcmVuID0gZnVuY3Rpb24gZmlsbENoaWxkcmVuKG5hbWVQYXRoKSB7XG4gICAgICB2YXIgZmllbGRzID0gZGVwZW5kZW5jaWVzMmZpZWxkcy5nZXQobmFtZVBhdGgpIHx8IG5ldyBTZXQoKTtcbiAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICBpZiAoIWNoaWxkcmVuLmhhcyhmaWVsZCkpIHtcbiAgICAgICAgICBjaGlsZHJlbi5hZGQoZmllbGQpO1xuICAgICAgICAgIHZhciBmaWVsZE5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcblxuICAgICAgICAgIGlmIChmaWVsZC5pc0ZpZWxkRGlydHkoKSAmJiBmaWVsZE5hbWVQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgY2hpbGRyZW5GaWVsZHMucHVzaChmaWVsZE5hbWVQYXRoKTtcbiAgICAgICAgICAgIGZpbGxDaGlsZHJlbihmaWVsZE5hbWVQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmaWxsQ2hpbGRyZW4ocm9vdE5hbWVQYXRoKTtcbiAgICByZXR1cm4gY2hpbGRyZW5GaWVsZHM7XG4gIH07XG5cbiAgdGhpcy50cmlnZ2VyT25GaWVsZHNDaGFuZ2UgPSBmdW5jdGlvbiAobmFtZVBhdGhMaXN0LCBmaWxlZEVycm9ycykge1xuICAgIHZhciBvbkZpZWxkc0NoYW5nZSA9IF90aGlzLmNhbGxiYWNrcy5vbkZpZWxkc0NoYW5nZTtcblxuICAgIGlmIChvbkZpZWxkc0NoYW5nZSkge1xuICAgICAgdmFyIGZpZWxkcyA9IF90aGlzLmdldEZpZWxkcygpO1xuICAgICAgLyoqXG4gICAgICAgKiBGaWxsIGVycm9ycyBzaW5jZSBgZmllbGRzYCBtYXkgYmUgcmVwbGFjZWQgYnkgY29udHJvbGxlZCBmaWVsZHNcbiAgICAgICAqL1xuXG5cbiAgICAgIGlmIChmaWxlZEVycm9ycykge1xuICAgICAgICB2YXIgY2FjaGUgPSBuZXcgX05hbWVNYXAuZGVmYXVsdCgpO1xuICAgICAgICBmaWxlZEVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgIHZhciBuYW1lID0gX3JlZjIubmFtZSxcbiAgICAgICAgICAgICAgZXJyb3JzID0gX3JlZjIuZXJyb3JzO1xuICAgICAgICAgIGNhY2hlLnNldChuYW1lLCBlcnJvcnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgZmllbGQuZXJyb3JzID0gY2FjaGUuZ2V0KGZpZWxkLm5hbWUpIHx8IGZpZWxkLmVycm9ycztcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjaGFuZ2VkRmllbGRzID0gZmllbGRzLmZpbHRlcihmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIGZpZWxkTmFtZSA9IF9yZWYzLm5hbWU7XG4gICAgICAgIHJldHVybiAoMCwgX3ZhbHVlVXRpbC5jb250YWluc05hbWVQYXRoKShuYW1lUGF0aExpc3QsIGZpZWxkTmFtZSk7XG4gICAgICB9KTtcbiAgICAgIG9uRmllbGRzQ2hhbmdlKGNoYW5nZWRGaWVsZHMsIGZpZWxkcyk7XG4gICAgfVxuICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsaWRhdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB0aGlzLnZhbGlkYXRlRmllbGRzID0gZnVuY3Rpb24gKG5hbWVMaXN0LCBvcHRpb25zKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG5cbiAgICB2YXIgcHJvdmlkZU5hbWVMaXN0ID0gISFuYW1lTGlzdDtcbiAgICB2YXIgbmFtZVBhdGhMaXN0ID0gcHJvdmlkZU5hbWVMaXN0ID8gbmFtZUxpc3QubWFwKF92YWx1ZVV0aWwuZ2V0TmFtZVBhdGgpIDogW107IC8vIENvbGxlY3QgcmVzdWx0IGluIHByb21pc2UgbGlzdFxuXG4gICAgdmFyIHByb21pc2VMaXN0ID0gW107XG5cbiAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAvLyBBZGQgZmllbGQgaWYgbm90IHByb3ZpZGUgYG5hbWVMaXN0YFxuICAgICAgaWYgKCFwcm92aWRlTmFtZUxpc3QpIHtcbiAgICAgICAgbmFtZVBhdGhMaXN0LnB1c2goZmllbGQuZ2V0TmFtZVBhdGgoKSk7XG4gICAgICB9IC8vIFNraXAgaWYgd2l0aG91dCBydWxlXG5cblxuICAgICAgaWYgKCFmaWVsZC5wcm9wcy5ydWxlcyB8fCAhZmllbGQucHJvcHMucnVsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpZWxkTmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpOyAvLyBBZGQgZmllbGQgdmFsaWRhdGUgcnVsZSBpbiB0byBwcm9taXNlIGxpc3RcblxuICAgICAgaWYgKCFwcm92aWRlTmFtZUxpc3QgfHwgKDAsIF92YWx1ZVV0aWwuY29udGFpbnNOYW1lUGF0aCkobmFtZVBhdGhMaXN0LCBmaWVsZE5hbWVQYXRoKSkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IGZpZWxkLnZhbGlkYXRlUnVsZXMoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHtcbiAgICAgICAgICB2YWxpZGF0ZU1lc3NhZ2VzOiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBfbWVzc2FnZXMuZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMpLCBfdGhpcy52YWxpZGF0ZU1lc3NhZ2VzKVxuICAgICAgICB9LCBvcHRpb25zKSk7IC8vIFdyYXAgcHJvbWlzZSB3aXRoIGZpZWxkXG5cbiAgICAgICAgcHJvbWlzZUxpc3QucHVzaChwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBmaWVsZE5hbWVQYXRoLFxuICAgICAgICAgICAgZXJyb3JzOiBbXVxuICAgICAgICAgIH07XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcnMpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoe1xuICAgICAgICAgICAgbmFtZTogZmllbGROYW1lUGF0aCxcbiAgICAgICAgICAgIGVycm9yczogZXJyb3JzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBzdW1tYXJ5UHJvbWlzZSA9ICgwLCBfYXN5bmNVdGlsLmFsbFByb21pc2VGaW5pc2gpKHByb21pc2VMaXN0KTtcbiAgICBfdGhpcy5sYXN0VmFsaWRhdGVQcm9taXNlID0gc3VtbWFyeVByb21pc2U7IC8vIE5vdGlmeSBmaWVsZHMgd2l0aCBydWxlIHRoYXQgdmFsaWRhdGUgaGFzIGZpbmlzaGVkIGFuZCBuZWVkIHVwZGF0ZVxuXG4gICAgc3VtbWFyeVByb21pc2UuY2F0Y2goZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIHZhciByZXN1bHROYW1lUGF0aExpc3QgPSByZXN1bHRzLm1hcChmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfcmVmNC5uYW1lO1xuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMoX3RoaXMuc3RvcmUsIHJlc3VsdE5hbWVQYXRoTGlzdCwge1xuICAgICAgICB0eXBlOiAndmFsaWRhdGVGaW5pc2gnXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMudHJpZ2dlck9uRmllbGRzQ2hhbmdlKHJlc3VsdE5hbWVQYXRoTGlzdCwgcmVzdWx0cyk7XG4gICAgfSk7XG4gICAgdmFyIHJldHVyblByb21pc2UgPSBzdW1tYXJ5UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5sYXN0VmFsaWRhdGVQcm9taXNlID09PSBzdW1tYXJ5UHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKF90aGlzLmdldEZpZWxkc1ZhbHVlKG5hbWVQYXRoTGlzdCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoW10pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICB2YXIgZXJyb3JMaXN0ID0gcmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoe1xuICAgICAgICB2YWx1ZXM6IF90aGlzLmdldEZpZWxkc1ZhbHVlKG5hbWVQYXRoTGlzdCksXG4gICAgICAgIGVycm9yRmllbGRzOiBlcnJvckxpc3QsXG4gICAgICAgIG91dE9mRGF0ZTogX3RoaXMubGFzdFZhbGlkYXRlUHJvbWlzZSAhPT0gc3VtbWFyeVByb21pc2VcbiAgICAgIH0pO1xuICAgIH0pOyAvLyBEbyBub3QgdGhyb3cgaW4gY29uc29sZVxuXG4gICAgcmV0dXJuUHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldHVyblByb21pc2U7XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3VibWl0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHRoaXMuc3VibWl0ID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuXG4gICAgX3RoaXMudmFsaWRhdGVGaWVsZHMoKS50aGVuKGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgIHZhciBvbkZpbmlzaCA9IF90aGlzLmNhbGxiYWNrcy5vbkZpbmlzaDtcblxuICAgICAgaWYgKG9uRmluaXNoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb25GaW5pc2godmFsdWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gU2hvdWxkIHByaW50IGVycm9yIGlmIHVzZXIgYG9uRmluaXNoYCBjYWxsYmFjayBmYWlsZWRcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uRmluaXNoRmFpbGVkID0gX3RoaXMuY2FsbGJhY2tzLm9uRmluaXNoRmFpbGVkO1xuXG4gICAgICBpZiAob25GaW5pc2hGYWlsZWQpIHtcbiAgICAgICAgb25GaW5pc2hGYWlsZWQoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5mb3JjZVJvb3RVcGRhdGUgPSBmb3JjZVJvb3RVcGRhdGU7XG59O1xuXG5leHBvcnRzLkZvcm1TdG9yZSA9IEZvcm1TdG9yZTtcblxuZnVuY3Rpb24gdXNlRm9ybShmb3JtKSB7XG4gIHZhciBmb3JtUmVmID0gUmVhY3QudXNlUmVmKCk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgZm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIGlmICghZm9ybVJlZi5jdXJyZW50KSB7XG4gICAgaWYgKGZvcm0pIHtcbiAgICAgIGZvcm1SZWYuY3VycmVudCA9IGZvcm07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBGb3JtU3RvcmUgaWYgbm90IHByb3ZpZGVkXG4gICAgICB2YXIgZm9yY2VSZVJlbmRlciA9IGZ1bmN0aW9uIGZvcmNlUmVSZW5kZXIoKSB7XG4gICAgICAgIGZvcmNlVXBkYXRlKHt9KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBmb3JtU3RvcmUgPSBuZXcgRm9ybVN0b3JlKGZvcmNlUmVSZW5kZXIpO1xuICAgICAgZm9ybVJlZi5jdXJyZW50ID0gZm9ybVN0b3JlLmdldEZvcm0oKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2Zvcm1SZWYuY3VycmVudF07XG59XG5cbnZhciBfZGVmYXVsdCA9IHVzZUZvcm07XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfdmFsdWVVdGlsID0gcmVxdWlyZShcIi4vdmFsdWVVdGlsXCIpO1xuXG4vKipcbiAqIE5hbWVNYXAgbGlrZSBhIGBNYXBgIGJ1dCBhY2NlcHRzIGBzdHJpbmdbXWAgYXMga2V5LlxuICovXG52YXIgTmFtZU1hcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5hbWVNYXAoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgTmFtZU1hcCk7XG4gICAgdGhpcy5saXN0ID0gW107XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShOYW1lTWFwLCBbe1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMubGlzdC5maW5kSW5kZXgoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICgwLCBfdmFsdWVVdGlsLm1hdGNoTmFtZVBhdGgpKGl0ZW0ua2V5LCBrZXkpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5saXN0W2luZGV4XS52YWx1ZSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5saXN0LnB1c2goe1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmxpc3QuZmluZChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gKDAsIF92YWx1ZVV0aWwubWF0Y2hOYW1lUGF0aCkoaXRlbS5rZXksIGtleSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGtleSwgdXBkYXRlcikge1xuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuZ2V0KGtleSk7XG4gICAgICB2YXIgbmV4dCA9IHVwZGF0ZXIob3JpZ2luKTtcblxuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldChrZXksIG5leHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZShrZXkpIHtcbiAgICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICEoMCwgX3ZhbHVlVXRpbC5tYXRjaE5hbWVQYXRoKShpdGVtLmtleSwga2V5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0Lm1hcChjYWxsYmFjayk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICB2YXIganNvbiA9IHt9O1xuICAgICAgdGhpcy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5LFxuICAgICAgICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgICAgICBqc29uW2tleS5qb2luKCcuJyldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE5hbWVNYXA7XG59KCk7XG5cbnZhciBfZGVmYXVsdCA9IE5hbWVNYXA7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYWxsUHJvbWlzZUZpbmlzaCA9IGFsbFByb21pc2VGaW5pc2g7XG5cbmZ1bmN0aW9uIGFsbFByb21pc2VGaW5pc2gocHJvbWlzZUxpc3QpIHtcbiAgdmFyIGhhc0Vycm9yID0gZmFsc2U7XG4gIHZhciBjb3VudCA9IHByb21pc2VMaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICBpZiAoIXByb21pc2VMaXN0Lmxlbmd0aCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBwcm9taXNlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChwcm9taXNlLCBpbmRleCkge1xuICAgICAgcHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGNvdW50IC09IDE7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gcmVzdWx0O1xuXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0VmFsaWRhdGVNZXNzYWdlcyA9IHZvaWQgMDtcbnZhciB0eXBlVGVtcGxhdGUgPSBcIicke25hbWV9JyBpcyBub3QgYSB2YWxpZCAke3R5cGV9XCI7XG52YXIgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMgPSB7XG4gIGRlZmF1bHQ6IFwiVmFsaWRhdGlvbiBlcnJvciBvbiBmaWVsZCAnJHtuYW1lfSdcIixcbiAgcmVxdWlyZWQ6IFwiJyR7bmFtZX0nIGlzIHJlcXVpcmVkXCIsXG4gIGVudW06IFwiJyR7bmFtZX0nIG11c3QgYmUgb25lIG9mIFske2VudW19XVwiLFxuICB3aGl0ZXNwYWNlOiBcIicke25hbWV9JyBjYW5ub3QgYmUgZW1wdHlcIixcbiAgZGF0ZToge1xuICAgIGZvcm1hdDogXCInJHtuYW1lfScgaXMgaW52YWxpZCBmb3IgZm9ybWF0IGRhdGVcIixcbiAgICBwYXJzZTogXCInJHtuYW1lfScgY291bGQgbm90IGJlIHBhcnNlZCBhcyBkYXRlXCIsXG4gICAgaW52YWxpZDogXCInJHtuYW1lfScgaXMgaW52YWxpZCBkYXRlXCJcbiAgfSxcbiAgdHlwZXM6IHtcbiAgICBzdHJpbmc6IHR5cGVUZW1wbGF0ZSxcbiAgICBtZXRob2Q6IHR5cGVUZW1wbGF0ZSxcbiAgICBhcnJheTogdHlwZVRlbXBsYXRlLFxuICAgIG9iamVjdDogdHlwZVRlbXBsYXRlLFxuICAgIG51bWJlcjogdHlwZVRlbXBsYXRlLFxuICAgIGRhdGU6IHR5cGVUZW1wbGF0ZSxcbiAgICBib29sZWFuOiB0eXBlVGVtcGxhdGUsXG4gICAgaW50ZWdlcjogdHlwZVRlbXBsYXRlLFxuICAgIGZsb2F0OiB0eXBlVGVtcGxhdGUsXG4gICAgcmVnZXhwOiB0eXBlVGVtcGxhdGUsXG4gICAgZW1haWw6IHR5cGVUZW1wbGF0ZSxcbiAgICB1cmw6IHR5cGVUZW1wbGF0ZSxcbiAgICBoZXg6IHR5cGVUZW1wbGF0ZVxuICB9LFxuICBzdHJpbmc6IHtcbiAgICBsZW46IFwiJyR7bmFtZX0nIG11c3QgYmUgZXhhY3RseSAke2xlbn0gY2hhcmFjdGVyc1wiLFxuICAgIG1pbjogXCInJHtuYW1lfScgbXVzdCBiZSBhdCBsZWFzdCAke21pbn0gY2hhcmFjdGVyc1wiLFxuICAgIG1heDogXCInJHtuYW1lfScgY2Fubm90IGJlIGxvbmdlciB0aGFuICR7bWF4fSBjaGFyYWN0ZXJzXCIsXG4gICAgcmFuZ2U6IFwiJyR7bmFtZX0nIG11c3QgYmUgYmV0d2VlbiAke21pbn0gYW5kICR7bWF4fSBjaGFyYWN0ZXJzXCJcbiAgfSxcbiAgbnVtYmVyOiB7XG4gICAgbGVuOiBcIicke25hbWV9JyBtdXN0IGVxdWFsICR7bGVufVwiLFxuICAgIG1pbjogXCInJHtuYW1lfScgY2Fubm90IGJlIGxlc3MgdGhhbiAke21pbn1cIixcbiAgICBtYXg6IFwiJyR7bmFtZX0nIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJHttYXh9XCIsXG4gICAgcmFuZ2U6IFwiJyR7bmFtZX0nIG11c3QgYmUgYmV0d2VlbiAke21pbn0gYW5kICR7bWF4fVwiXG4gIH0sXG4gIGFycmF5OiB7XG4gICAgbGVuOiBcIicke25hbWV9JyBtdXN0IGJlIGV4YWN0bHkgJHtsZW59IGluIGxlbmd0aFwiLFxuICAgIG1pbjogXCInJHtuYW1lfScgY2Fubm90IGJlIGxlc3MgdGhhbiAke21pbn0gaW4gbGVuZ3RoXCIsXG4gICAgbWF4OiBcIicke25hbWV9JyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICR7bWF4fSBpbiBsZW5ndGhcIixcbiAgICByYW5nZTogXCInJHtuYW1lfScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9IGluIGxlbmd0aFwiXG4gIH0sXG4gIHBhdHRlcm46IHtcbiAgICBtaXNtYXRjaDogXCInJHtuYW1lfScgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAke3BhdHRlcm59XCJcbiAgfVxufTtcbmV4cG9ydHMuZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMgPSBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7XG5cbmZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy52YWxpZGF0ZVJ1bGVzID0gdmFsaWRhdGVSdWxlcztcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9hc3luY1ZhbGlkYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImFzeW5jLXZhbGlkYXRvclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuXG52YXIgX3ZhbHVlVXRpbCA9IHJlcXVpcmUoXCIuL3ZhbHVlVXRpbFwiKTtcblxudmFyIF9tZXNzYWdlcyA9IHJlcXVpcmUoXCIuL21lc3NhZ2VzXCIpO1xuXG4vLyBSZW1vdmUgaW5jb3JyZWN0IG9yaWdpbmFsIHRzIGRlZmluZVxudmFyIEFzeW5jVmFsaWRhdG9yID0gX2FzeW5jVmFsaWRhdG9yLmRlZmF1bHQ7XG4vKipcbiAqIFJlcGxhY2Ugd2l0aCB0ZW1wbGF0ZS5cbiAqICAgYEknbSAke25hbWV9YCArIHsgbmFtZTogJ2JhbWJvbycgfSA9IEknbSBiYW1ib29cbiAqL1xuXG5mdW5jdGlvbiByZXBsYWNlTWVzc2FnZSh0ZW1wbGF0ZSwga3YpIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xcJFxce1xcdytcXH0vZywgZnVuY3Rpb24gKHN0cikge1xuICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoMiwgLTEpO1xuICAgIHJldHVybiBrdltrZXldO1xuICB9KTtcbn1cbi8qKlxuICogV2UgdXNlIGBhc3luYy12YWxpZGF0b3JgIHRvIHZhbGlkYXRlIHJ1bGVzLiBTbyBoYXZlIHRvIGhvdCByZXBsYWNlIHRoZSBtZXNzYWdlIHdpdGggdmFsaWRhdG9yLlxuICogeyByZXF1aXJlZDogJyR7bmFtZX0gaXMgcmVxdWlyZWQnIH0gPT4geyByZXF1aXJlZDogKCkgPT4gJ2ZpZWxkIGlzIHJlcXVpcmVkJyB9XG4gKi9cblxuXG5mdW5jdGlvbiBjb252ZXJ0TWVzc2FnZXMobWVzc2FnZXMsIG5hbWUsIHJ1bGUsIG1lc3NhZ2VWYXJpYWJsZXMpIHtcbiAgdmFyIGt2ID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgcnVsZSksIHt9LCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBlbnVtOiAocnVsZS5lbnVtIHx8IFtdKS5qb2luKCcsICcpXG4gIH0pO1xuXG4gIHZhciByZXBsYWNlRnVuYyA9IGZ1bmN0aW9uIHJlcGxhY2VGdW5jKHRlbXBsYXRlLCBhZGRpdGlvbmFsS1YpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlcGxhY2VNZXNzYWdlKHRlbXBsYXRlLCAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBrdiksIGFkZGl0aW9uYWxLVikpO1xuICAgIH07XG4gIH07XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5cblxuICBmdW5jdGlvbiBmaWxsVGVtcGxhdGUoc291cmNlKSB7XG4gICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlTmFtZSkge1xuICAgICAgdmFyIHZhbHVlID0gc291cmNlW3J1bGVOYW1lXTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGFyZ2V0W3J1bGVOYW1lXSA9IHJlcGxhY2VGdW5jKHZhbHVlLCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgKDAsIF90eXBlb2YyLmRlZmF1bHQpKHZhbHVlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGFyZ2V0W3J1bGVOYW1lXSA9IHt9O1xuICAgICAgICBmaWxsVGVtcGxhdGUodmFsdWUsIHRhcmdldFtydWxlTmFtZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W3J1bGVOYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG5cbiAgcmV0dXJuIGZpbGxUZW1wbGF0ZSgoMCwgX3ZhbHVlVXRpbC5zZXRWYWx1ZXMpKHt9LCBfbWVzc2FnZXMuZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMsIG1lc3NhZ2VzKSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUnVsZShfeCwgX3gyLCBfeDMsIF94NCwgX3g1KSB7XG4gIHJldHVybiBfdmFsaWRhdGVSdWxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4vKipcbiAqIFdlIHVzZSBgYXN5bmMtdmFsaWRhdG9yYCB0byB2YWxpZGF0ZSB0aGUgdmFsdWUuXG4gKiBCdXQgb25seSBjaGVjayBvbmUgdmFsdWUgaW4gYSB0aW1lIHRvIGF2b2lkIG5hbWVQYXRoIHZhbGlkYXRlIGlzc3VlLlxuICovXG5cblxuZnVuY3Rpb24gX3ZhbGlkYXRlUnVsZSgpIHtcbiAgX3ZhbGlkYXRlUnVsZSA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjIuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKSB7XG4gICAgdmFyIGNsb25lUnVsZSwgc3ViUnVsZUZpZWxkLCB2YWxpZGF0b3IsIG1lc3NhZ2VzLCByZXN1bHQsIHN1YlJlc3VsdHM7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvci5kZWZhdWx0LndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2xvbmVSdWxlID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBydWxlKTsgLy8gV2Ugc2hvdWxkIHNwZWNpYWwgaGFuZGxlIGFycmF5IHZhbGlkYXRlXG5cbiAgICAgICAgICAgIHN1YlJ1bGVGaWVsZCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChjbG9uZVJ1bGUgJiYgY2xvbmVSdWxlLnR5cGUgPT09ICdhcnJheScgJiYgY2xvbmVSdWxlLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgICBzdWJSdWxlRmllbGQgPSBjbG9uZVJ1bGUuZGVmYXVsdEZpZWxkO1xuICAgICAgICAgICAgICBkZWxldGUgY2xvbmVSdWxlLmRlZmF1bHRGaWVsZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsaWRhdG9yID0gbmV3IEFzeW5jVmFsaWRhdG9yKCgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBuYW1lLCBbY2xvbmVSdWxlXSkpO1xuICAgICAgICAgICAgbWVzc2FnZXMgPSBjb252ZXJ0TWVzc2FnZXMob3B0aW9ucy52YWxpZGF0ZU1lc3NhZ2VzLCBuYW1lLCBjbG9uZVJ1bGUsIG1lc3NhZ2VWYXJpYWJsZXMpO1xuICAgICAgICAgICAgdmFsaWRhdG9yLm1lc3NhZ2VzKG1lc3NhZ2VzKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSA3O1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMDtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsaWRhdG9yLnZhbGlkYXRlKCgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBuYW1lLCB2YWx1ZSksICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgb3B0aW9ucykpKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE1O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAxMjtcbiAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MltcImNhdGNoXCJdKDcpO1xuXG4gICAgICAgICAgICBpZiAoX2NvbnRleHQyLnQwLmVycm9ycykge1xuICAgICAgICAgICAgICByZXN1bHQgPSBfY29udGV4dDIudDAuZXJyb3JzLm1hcChmdW5jdGlvbiAoX3JlZjIsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBfcmVmMi5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJldHVybiAoLy8gV3JhcCBSZWFjdE5vZGUgd2l0aCBga2V5YFxuICAgICAgICAgICAgICAgICAgUmVhY3QuaXNWYWxpZEVsZW1lbnQobWVzc2FnZSkgPyBSZWFjdC5jbG9uZUVsZW1lbnQobWVzc2FnZSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZXJyb3JfXCIuY29uY2F0KGluZGV4KVxuICAgICAgICAgICAgICAgICAgfSkgOiBtZXNzYWdlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKF9jb250ZXh0Mi50MCk7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IFttZXNzYWdlcy5kZWZhdWx0KCldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIGlmICghKCFyZXN1bHQubGVuZ3RoICYmIHN1YlJ1bGVGaWVsZCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTg7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodmFsdWUubWFwKGZ1bmN0aW9uIChzdWJWYWx1ZSwgaSkge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVSdWxlKFwiXCIuY29uY2F0KG5hbWUsIFwiLlwiKS5jb25jYXQoaSksIHN1YlZhbHVlLCBzdWJSdWxlRmllbGQsIG9wdGlvbnMsIG1lc3NhZ2VWYXJpYWJsZXMpO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIHN1YlJlc3VsdHMgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHN1YlJlc3VsdHMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShwcmV2KSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoZXJyb3JzKSk7XG4gICAgICAgICAgICB9LCBbXSkpO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHJlc3VsdCk7XG5cbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIsIG51bGwsIFtbNywgMTJdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF92YWxpZGF0ZVJ1bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSdWxlcyhuYW1lUGF0aCwgdmFsdWUsIHJ1bGVzLCBvcHRpb25zLCB2YWxpZGF0ZUZpcnN0LCBtZXNzYWdlVmFyaWFibGVzKSB7XG4gIHZhciBuYW1lID0gbmFtZVBhdGguam9pbignLicpOyAvLyBGaWxsIHJ1bGUgd2l0aCBjb250ZXh0XG5cbiAgdmFyIGZpbGxlZFJ1bGVzID0gcnVsZXMubWFwKGZ1bmN0aW9uIChjdXJyZW50UnVsZSkge1xuICAgIHZhciBvcmlnaW5WYWxpZGF0b3JGdW5jID0gY3VycmVudFJ1bGUudmFsaWRhdG9yO1xuXG4gICAgaWYgKCFvcmlnaW5WYWxpZGF0b3JGdW5jKSB7XG4gICAgICByZXR1cm4gY3VycmVudFJ1bGU7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGN1cnJlbnRSdWxlKSwge30sIHtcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHJ1bGUsIHZhbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGhhc1Byb21pc2UgPSBmYWxzZTsgLy8gV3JhcCBjYWxsYmFjayBvbmx5IGFjY2VwdCB3aGVuIHByb21pc2Ugbm90IHByb3ZpZGVkXG5cbiAgICAgICAgdmFyIHdyYXBwZWRDYWxsYmFjayA9IGZ1bmN0aW9uIHdyYXBwZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gV2FpdCBhIHRpY2sgdG8gbWFrZSBzdXJlIHJldHVybiB0eXBlIGlzIGEgcHJvbWlzZVxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKCFoYXNQcm9taXNlLCAnWW91ciB2YWxpZGF0b3IgZnVuY3Rpb24gaGFzIGFscmVhZHkgcmV0dXJuIGEgcHJvbWlzZS4gYGNhbGxiYWNrYCB3aWxsIGJlIGlnbm9yZWQuJyk7XG5cbiAgICAgICAgICAgIGlmICghaGFzUHJvbWlzZSkge1xuICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9OyAvLyBHZXQgcHJvbWlzZVxuXG5cbiAgICAgICAgdmFyIHByb21pc2UgPSBvcmlnaW5WYWxpZGF0b3JGdW5jKHJ1bGUsIHZhbCwgd3JhcHBlZENhbGxiYWNrKTtcbiAgICAgICAgaGFzUHJvbWlzZSA9IHByb21pc2UgJiYgdHlwZW9mIHByb21pc2UudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcHJvbWlzZS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIDEuIFVzZSBwcm9taXNlIGFzIHRoZSBmaXJzdCBwcmlvcml0eS5cbiAgICAgICAgICogMi4gSWYgcHJvbWlzZSBub3QgZXhpc3QsIHVzZSBjYWxsYmFjayB3aXRoIHdhcm5pbmcgaW5zdGVhZFxuICAgICAgICAgKi9cblxuICAgICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoaGFzUHJvbWlzZSwgJ2BjYWxsYmFja2AgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHJldHVybiBhIHByb21pc2UgaW5zdGVhZC4nKTtcblxuICAgICAgICBpZiAoaGFzUHJvbWlzZSkge1xuICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHZhciBzdW1tYXJ5UHJvbWlzZTtcblxuICBpZiAodmFsaWRhdGVGaXJzdCA9PT0gdHJ1ZSkge1xuICAgIC8vID4+Pj4+IFZhbGlkYXRlIGJ5IHNlcmlhbGl6YXRpb25cbiAgICBzdW1tYXJ5UHJvbWlzZSA9IG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZWYgPSAoMCwgX2FzeW5jVG9HZW5lcmF0b3IyLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yLmRlZmF1bHQubWFyayhmdW5jdGlvbiBfY2FsbGVlKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgaSwgZXJyb3JzO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpID0gMDtcblxuICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgaWYgKCEoaSA8IGZpbGxlZFJ1bGVzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0O1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVJ1bGUobmFtZSwgdmFsdWUsIGZpbGxlZFJ1bGVzW2ldLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgZXJyb3JzID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgICAgIGlmICghZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIpO1xuXG4gICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYsIF94Nykge1xuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCkpO1xuICB9IGVsc2Uge1xuICAgIC8vID4+Pj4+IFZhbGlkYXRlIGJ5IHBhcmFsbGVsXG4gICAgdmFyIHJ1bGVQcm9taXNlcyA9IGZpbGxlZFJ1bGVzLm1hcChmdW5jdGlvbiAocnVsZSkge1xuICAgICAgcmV0dXJuIHZhbGlkYXRlUnVsZShuYW1lLCB2YWx1ZSwgcnVsZSwgb3B0aW9ucywgbWVzc2FnZVZhcmlhYmxlcyk7XG4gICAgfSk7XG4gICAgc3VtbWFyeVByb21pc2UgPSAodmFsaWRhdGVGaXJzdCA/IGZpbmlzaE9uRmlyc3RGYWlsZWQocnVsZVByb21pc2VzKSA6IGZpbmlzaE9uQWxsRmFpbGVkKHJ1bGVQcm9taXNlcykpLnRoZW4oZnVuY3Rpb24gKGVycm9ycykge1xuICAgICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9ycyk7XG4gICAgfSk7XG4gIH0gLy8gSW50ZXJuYWwgY2F0Y2ggZXJyb3IgdG8gYXZvaWQgY29uc29sZSBlcnJvciBsb2cuXG5cblxuICBzdW1tYXJ5UHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlO1xuICB9KTtcbiAgcmV0dXJuIHN1bW1hcnlQcm9taXNlO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hPbkFsbEZhaWxlZChfeDgpIHtcbiAgcmV0dXJuIF9maW5pc2hPbkFsbEZhaWxlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfZmluaXNoT25BbGxGYWlsZWQoKSB7XG4gIF9maW5pc2hPbkFsbEZhaWxlZCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjIuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKHJ1bGVQcm9taXNlcykge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3IuZGVmYXVsdC53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIFByb21pc2UuYWxsKHJ1bGVQcm9taXNlcykudGhlbihmdW5jdGlvbiAoZXJyb3JzTGlzdCkge1xuICAgICAgICAgICAgICB2YXIgX3JlZjM7XG5cbiAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IChfcmVmMyA9IFtdKS5jb25jYXQuYXBwbHkoX3JlZjMsICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGVycm9yc0xpc3QpKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTMpO1xuICB9KSk7XG4gIHJldHVybiBfZmluaXNoT25BbGxGYWlsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gZmluaXNoT25GaXJzdEZhaWxlZChfeDkpIHtcbiAgcmV0dXJuIF9maW5pc2hPbkZpcnN0RmFpbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9maW5pc2hPbkZpcnN0RmFpbGVkKCkge1xuICBfZmluaXNoT25GaXJzdEZhaWxlZCA9ICgwLCBfYXN5bmNUb0dlbmVyYXRvcjIuZGVmYXVsdCkoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IuZGVmYXVsdC5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KHJ1bGVQcm9taXNlcykge1xuICAgIHZhciBjb3VudDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdChcInJldHVyblwiLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICBydWxlUHJvbWlzZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGVycm9ycyk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gcnVsZVByb21pc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNCk7XG4gIH0pKTtcbiAgcmV0dXJuIF9maW5pc2hPbkZpcnN0RmFpbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXROYW1lUGF0aCA9IGdldE5hbWVQYXRoO1xuZXhwb3J0cy5nZXRWYWx1ZSA9IGdldFZhbHVlO1xuZXhwb3J0cy5zZXRWYWx1ZSA9IHNldFZhbHVlO1xuZXhwb3J0cy5jbG9uZUJ5TmFtZVBhdGhMaXN0ID0gY2xvbmVCeU5hbWVQYXRoTGlzdDtcbmV4cG9ydHMuY29udGFpbnNOYW1lUGF0aCA9IGNvbnRhaW5zTmFtZVBhdGg7XG5leHBvcnRzLnNldFZhbHVlcyA9IHNldFZhbHVlcztcbmV4cG9ydHMubWF0Y2hOYW1lUGF0aCA9IG1hdGNoTmFtZVBhdGg7XG5leHBvcnRzLmlzU2ltaWxhciA9IGlzU2ltaWxhcjtcbmV4cG9ydHMuZGVmYXVsdEdldFZhbHVlRnJvbUV2ZW50ID0gZGVmYXVsdEdldFZhbHVlRnJvbUV2ZW50O1xuZXhwb3J0cy5tb3ZlID0gbW92ZTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX2dldCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3V0aWxzL2dldFwiKSk7XG5cbnZhciBfc2V0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvdXRpbHMvc2V0XCIpKTtcblxudmFyIF90eXBlVXRpbCA9IHJlcXVpcmUoXCIuL3R5cGVVdGlsXCIpO1xuXG4vKipcbiAqIENvbnZlcnQgbmFtZSB0byBpbnRlcm5hbCBzdXBwb3J0ZWQgZm9ybWF0LlxuICogVGhpcyBmdW5jdGlvbiBzaG91bGQga2VlcCBzaW5jZSB3ZSBzdGlsbCB0aGlua2luZyBpZiBuZWVkIHN1cHBvcnQgbGlrZSBgYS5iLmNgIGZvcm1hdC5cbiAqICdhJyA9PiBbJ2EnXVxuICogMTIzID0+IFsxMjNdXG4gKiBbJ2EnLCAxMjNdID0+IFsnYScsIDEyM11cbiAqL1xuZnVuY3Rpb24gZ2V0TmFtZVBhdGgocGF0aCkge1xuICByZXR1cm4gKDAsIF90eXBlVXRpbC50b0FycmF5KShwYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUoc3RvcmUsIG5hbWVQYXRoKSB7XG4gIHZhciB2YWx1ZSA9ICgwLCBfZ2V0LmRlZmF1bHQpKHN0b3JlLCBuYW1lUGF0aCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gc2V0VmFsdWUoc3RvcmUsIG5hbWVQYXRoLCB2YWx1ZSkge1xuICB2YXIgbmV3U3RvcmUgPSAoMCwgX3NldC5kZWZhdWx0KShzdG9yZSwgbmFtZVBhdGgsIHZhbHVlKTtcbiAgcmV0dXJuIG5ld1N0b3JlO1xufVxuXG5mdW5jdGlvbiBjbG9uZUJ5TmFtZVBhdGhMaXN0KHN0b3JlLCBuYW1lUGF0aExpc3QpIHtcbiAgdmFyIG5ld1N0b3JlID0ge307XG4gIG5hbWVQYXRoTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lUGF0aCkge1xuICAgIHZhciB2YWx1ZSA9IGdldFZhbHVlKHN0b3JlLCBuYW1lUGF0aCk7XG4gICAgbmV3U3RvcmUgPSBzZXRWYWx1ZShuZXdTdG9yZSwgbmFtZVBhdGgsIHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBuZXdTdG9yZTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIG5hbWVQYXRoKSB7XG4gIHJldHVybiBuYW1lUGF0aExpc3QgJiYgbmFtZVBhdGhMaXN0LnNvbWUoZnVuY3Rpb24gKHBhdGgpIHtcbiAgICByZXR1cm4gbWF0Y2hOYW1lUGF0aChwYXRoLCBuYW1lUGF0aCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgcmV0dXJuICgwLCBfdHlwZW9mMi5kZWZhdWx0KShvYmopID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG4vKipcbiAqIENvcHkgdmFsdWVzIGludG8gc3RvcmUgYW5kIHJldHVybiBhIG5ldyB2YWx1ZXMgb2JqZWN0XG4gKiAoeyBhOiAxLCBiOiB7IGM6IDIgfSB9LCB7IGE6IDQsIGI6IHsgZDogNSB9IH0pID0+IHsgYTogNCwgYjogeyBjOiAyLCBkOiA1IH0gfVxuICovXG5cblxuZnVuY3Rpb24gaW50ZXJuYWxTZXRWYWx1ZXMoc3RvcmUsIHZhbHVlcykge1xuICB2YXIgbmV3U3RvcmUgPSBBcnJheS5pc0FycmF5KHN0b3JlKSA/ICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHN0b3JlKSA6ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc3RvcmUpO1xuXG4gIGlmICghdmFsdWVzKSB7XG4gICAgcmV0dXJuIG5ld1N0b3JlO1xuICB9XG5cbiAgT2JqZWN0LmtleXModmFsdWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcHJldlZhbHVlID0gbmV3U3RvcmVba2V5XTtcbiAgICB2YXIgdmFsdWUgPSB2YWx1ZXNba2V5XTsgLy8gSWYgYm90aCBhcmUgb2JqZWN0IChidXQgdGFyZ2V0IGlzIG5vdCBhcnJheSksIHdlIHVzZSByZWN1cnNpb24gdG8gc2V0IGRlZXAgdmFsdWVcblxuICAgIHZhciByZWN1cnNpdmUgPSBpc09iamVjdChwcmV2VmFsdWUpICYmIGlzT2JqZWN0KHZhbHVlKTtcbiAgICBuZXdTdG9yZVtrZXldID0gcmVjdXJzaXZlID8gaW50ZXJuYWxTZXRWYWx1ZXMocHJldlZhbHVlLCB2YWx1ZSB8fCB7fSkgOiB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiBuZXdTdG9yZTtcbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVzKHN0b3JlKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0VmFsdWVzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICByZXN0VmFsdWVzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiByZXN0VmFsdWVzLnJlZHVjZShmdW5jdGlvbiAoY3VycmVudCwgbmV3U3RvcmUpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxTZXRWYWx1ZXMoY3VycmVudCwgbmV3U3RvcmUpO1xuICB9LCBzdG9yZSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoTmFtZVBhdGgobmFtZVBhdGgsIGNoYW5nZWROYW1lUGF0aCkge1xuICBpZiAoIW5hbWVQYXRoIHx8ICFjaGFuZ2VkTmFtZVBhdGggfHwgbmFtZVBhdGgubGVuZ3RoICE9PSBjaGFuZ2VkTmFtZVBhdGgubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVQYXRoLmV2ZXJ5KGZ1bmN0aW9uIChuYW1lVW5pdCwgaSkge1xuICAgIHJldHVybiBjaGFuZ2VkTmFtZVBhdGhbaV0gPT09IG5hbWVVbml0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNTaW1pbGFyKHNvdXJjZSwgdGFyZ2V0KSB7XG4gIGlmIChzb3VyY2UgPT09IHRhcmdldCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFzb3VyY2UgJiYgdGFyZ2V0IHx8IHNvdXJjZSAmJiAhdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFzb3VyY2UgfHwgIXRhcmdldCB8fCAoMCwgX3R5cGVvZjIuZGVmYXVsdCkoc291cmNlKSAhPT0gJ29iamVjdCcgfHwgKDAsIF90eXBlb2YyLmRlZmF1bHQpKHRhcmdldCkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIgdGFyZ2V0S2V5cyA9IE9iamVjdC5rZXlzKHRhcmdldCk7XG4gIHZhciBrZXlzID0gbmV3IFNldChbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoc291cmNlS2V5cyksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHRhcmdldEtleXMpKSk7XG4gIHJldHVybiAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShrZXlzKS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHNvdXJjZVZhbHVlID0gc291cmNlW2tleV07XG4gICAgdmFyIHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleV07XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZVZhbHVlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0YXJnZXRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZVZhbHVlID09PSB0YXJnZXRWYWx1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRHZXRWYWx1ZUZyb21FdmVudCh2YWx1ZVByb3BOYW1lKSB7XG4gIHZhciBldmVudCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTtcblxuICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIHZhbHVlUHJvcE5hbWUgaW4gZXZlbnQudGFyZ2V0KSB7XG4gICAgcmV0dXJuIGV2ZW50LnRhcmdldFt2YWx1ZVByb3BOYW1lXTtcbiAgfVxuXG4gIHJldHVybiBldmVudDtcbn1cbi8qKlxuICogTW92ZXMgYW4gYXJyYXkgaXRlbSBmcm9tIG9uZSBwb3NpdGlvbiBpbiBhbiBhcnJheSB0byBhbm90aGVyLlxuICpcbiAqIE5vdGU6IFRoaXMgaXMgYSBwdXJlIGZ1bmN0aW9uIHNvIGEgbmV3IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQsIGluc3RlYWRcbiAqIG9mIGFsdGVyaW5nIHRoZSBhcnJheSBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgICAgICAgICBBcnJheSBpbiB3aGljaCB0byBtb3ZlIGFuIGl0ZW0uICAgICAgICAgKHJlcXVpcmVkKVxuICogQHBhcmFtIG1vdmVJbmRleCAgICAgVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIG1vdmUuICAgICAgICAgIChyZXF1aXJlZClcbiAqIEBwYXJhbSB0b0luZGV4ICAgICAgIFRoZSBpbmRleCB0byBtb3ZlIGl0ZW0gYXQgbW92ZUluZGV4IHRvLiAocmVxdWlyZWQpXG4gKi9cblxuXG5mdW5jdGlvbiBtb3ZlKGFycmF5LCBtb3ZlSW5kZXgsIHRvSW5kZXgpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBpZiAobW92ZUluZGV4IDwgMCB8fCBtb3ZlSW5kZXggPj0gbGVuZ3RoIHx8IHRvSW5kZXggPCAwIHx8IHRvSW5kZXggPj0gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgdmFyIGl0ZW0gPSBhcnJheVttb3ZlSW5kZXhdO1xuICB2YXIgZGlmZiA9IG1vdmVJbmRleCAtIHRvSW5kZXg7XG5cbiAgaWYgKGRpZmYgPiAwKSB7XG4gICAgLy8gbW92ZSBsZWZ0XG4gICAgcmV0dXJuIFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShhcnJheS5zbGljZSgwLCB0b0luZGV4KSksIFtpdGVtXSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoYXJyYXkuc2xpY2UodG9JbmRleCwgbW92ZUluZGV4KSksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGFycmF5LnNsaWNlKG1vdmVJbmRleCArIDEsIGxlbmd0aCkpKTtcbiAgfVxuXG4gIGlmIChkaWZmIDwgMCkge1xuICAgIC8vIG1vdmUgcmlnaHRcbiAgICByZXR1cm4gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGFycmF5LnNsaWNlKDAsIG1vdmVJbmRleCkpLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShhcnJheS5zbGljZShtb3ZlSW5kZXggKyAxLCB0b0luZGV4ICsgMSkpLCBbaXRlbV0sICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGFycmF5LnNsaWNlKHRvSW5kZXggKyAxLCBsZW5ndGgpKSk7XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfY3NzID0gcmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9jc3NcIik7XG5cbnZhciBfUHJldmlldyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUHJldmlld1wiKSk7XG5cbnZhciBJbWFnZUludGVybmFsID0gZnVuY3Rpb24gSW1hZ2VJbnRlcm5hbChfcmVmKSB7XG4gIHZhciBzcmMgPSBfcmVmLnNyYyxcbiAgICAgIGFsdCA9IF9yZWYuYWx0LFxuICAgICAgb25Jbml0aWFsUHJldmlld0Nsb3NlID0gX3JlZi5vblByZXZpZXdDbG9zZSxcbiAgICAgIF9yZWYkcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICBwcmVmaXhDbHMgPSBfcmVmJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWltYWdlJyA6IF9yZWYkcHJlZml4Q2xzLFxuICAgICAgX3JlZiRwcmV2aWV3UHJlZml4Q2xzID0gX3JlZi5wcmV2aWV3UHJlZml4Q2xzLFxuICAgICAgcHJldmlld1ByZWZpeENscyA9IF9yZWYkcHJldmlld1ByZWZpeENscyA9PT0gdm9pZCAwID8gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wcmV2aWV3XCIpIDogX3JlZiRwcmV2aWV3UHJlZml4Q2xzLFxuICAgICAgcGxhY2Vob2xkZXIgPSBfcmVmLnBsYWNlaG9sZGVyLFxuICAgICAgZmFsbGJhY2sgPSBfcmVmLmZhbGxiYWNrLFxuICAgICAgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgICBfcmVmJHByZXZpZXcgPSBfcmVmLnByZXZpZXcsXG4gICAgICBwcmV2aWV3ID0gX3JlZiRwcmV2aWV3ID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRwcmV2aWV3LFxuICAgICAgb3JpZ2luYWxDbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgICBjcm9zc09yaWdpbiA9IF9yZWYuY3Jvc3NPcmlnaW4sXG4gICAgICBkZWNvZGluZyA9IF9yZWYuZGVjb2RpbmcsXG4gICAgICBsb2FkaW5nID0gX3JlZi5sb2FkaW5nLFxuICAgICAgcmVmZXJyZXJQb2xpY3kgPSBfcmVmLnJlZmVycmVyUG9saWN5LFxuICAgICAgc2l6ZXMgPSBfcmVmLnNpemVzLFxuICAgICAgc3JjU2V0ID0gX3JlZi5zcmNTZXQsXG4gICAgICB1c2VNYXAgPSBfcmVmLnVzZU1hcCxcbiAgICAgIG90aGVyUHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfcmVmLCBbXCJzcmNcIiwgXCJhbHRcIiwgXCJvblByZXZpZXdDbG9zZVwiLCBcInByZWZpeENsc1wiLCBcInByZXZpZXdQcmVmaXhDbHNcIiwgXCJwbGFjZWhvbGRlclwiLCBcImZhbGxiYWNrXCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJzdHlsZVwiLCBcInByZXZpZXdcIiwgXCJjbGFzc05hbWVcIiwgXCJvbkNsaWNrXCIsIFwiY3Jvc3NPcmlnaW5cIiwgXCJkZWNvZGluZ1wiLCBcImxvYWRpbmdcIiwgXCJyZWZlcnJlclBvbGljeVwiLCBcInNpemVzXCIsIFwic3JjU2V0XCIsIFwidXNlTWFwXCJdKTtcbiAgdmFyIGlzQ3VzdG9tUGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlciAmJiBwbGFjZWhvbGRlciAhPT0gdHJ1ZTtcblxuICB2YXIgX3VzZVN0YXRlID0gKDAsIFJlYWN0LnVzZVN0YXRlKShmYWxzZSksXG4gICAgICBfdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUsIDIpLFxuICAgICAgaXNTaG93UHJldmlldyA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTaG93UHJldmlldyA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSAoMCwgUmVhY3QudXNlU3RhdGUpKGlzQ3VzdG9tUGxhY2Vob2xkZXIgPyAnbG9hZGluZycgOiAnbm9ybWFsJyksXG4gICAgICBfdXNlU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUzLCAyKSxcbiAgICAgIHN0YXR1cyA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRTdGF0dXMgPSBfdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBfdXNlU3RhdGU1ID0gKDAsIFJlYWN0LnVzZVN0YXRlKShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTYgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTUsIDIpLFxuICAgICAgbW91c2VQb3NpdGlvbiA9IF91c2VTdGF0ZTZbMF0sXG4gICAgICBzZXRNb3VzZVBvc2l0aW9uID0gX3VzZVN0YXRlNlsxXTtcblxuICB2YXIgaXNFcnJvciA9IHN0YXR1cyA9PT0gJ2Vycm9yJztcblxuICB2YXIgb25Mb2FkID0gZnVuY3Rpb24gb25Mb2FkKCkge1xuICAgIHNldFN0YXR1cygnbm9ybWFsJyk7XG4gIH07XG5cbiAgdmFyIG9uRXJyb3IgPSBmdW5jdGlvbiBvbkVycm9yKCkge1xuICAgIHNldFN0YXR1cygnZXJyb3InKTtcbiAgfTtcblxuICB2YXIgb25QcmV2aWV3ID0gZnVuY3Rpb24gb25QcmV2aWV3KGUpIHtcbiAgICB2YXIgX2dldE9mZnNldCA9ICgwLCBfY3NzLmdldE9mZnNldCkoZS50YXJnZXQpLFxuICAgICAgICBsZWZ0ID0gX2dldE9mZnNldC5sZWZ0LFxuICAgICAgICB0b3AgPSBfZ2V0T2Zmc2V0LnRvcDtcblxuICAgIHNldFNob3dQcmV2aWV3KHRydWUpO1xuICAgIHNldE1vdXNlUG9zaXRpb24oe1xuICAgICAgeDogbGVmdCxcbiAgICAgIHk6IHRvcFxuICAgIH0pO1xuICAgIGlmIChvbkNsaWNrKSBvbkNsaWNrKGUpO1xuICB9O1xuXG4gIHZhciBvblByZXZpZXdDbG9zZSA9IGZ1bmN0aW9uIG9uUHJldmlld0Nsb3NlKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNldFNob3dQcmV2aWV3KGZhbHNlKTtcbiAgICBzZXRNb3VzZVBvc2l0aW9uKG51bGwpO1xuICAgIGlmIChvbkluaXRpYWxQcmV2aWV3Q2xvc2UpIG9uSW5pdGlhbFByZXZpZXdDbG9zZShlKTtcbiAgfTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0N1c3RvbVBsYWNlaG9sZGVyKSB7XG4gICAgICBzZXRTdGF0dXMoJ2xvYWRpbmcnKTtcbiAgICB9XG4gIH0sIFtzcmNdKTtcbiAgdmFyIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIG9yaWdpbmFsQ2xhc3NOYW1lLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lcnJvclwiKSwgaXNFcnJvcikpO1xuICB2YXIgbWVyZ2VkU3JjID0gaXNFcnJvciAmJiBmYWxsYmFjayA/IGZhbGxiYWNrIDogc3JjO1xuICB2YXIgaW1nQ29tbW9uUHJvcHMgPSB7XG4gICAgY3Jvc3NPcmlnaW46IGNyb3NzT3JpZ2luLFxuICAgIGRlY29kaW5nOiBkZWNvZGluZyxcbiAgICBsb2FkaW5nOiBsb2FkaW5nLFxuICAgIHJlZmVycmVyUG9saWN5OiByZWZlcnJlclBvbGljeSxcbiAgICBzaXplczogc2l6ZXMsXG4gICAgc3JjU2V0OiBzcmNTZXQsXG4gICAgdXNlTWFwOiB1c2VNYXAsXG4gICAgYWx0OiBhbHQsXG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWdcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWltZy1wbGFjZWhvbGRlclwiKSwgcGxhY2Vob2xkZXIgPT09IHRydWUpKSxcbiAgICBzdHlsZTogaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyB7XG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0gOiB1bmRlZmluZWRcbiAgfTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7fSwgb3RoZXJQcm9wcywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2s6IHByZXZpZXcgJiYgIWlzRXJyb3IgPyBvblByZXZpZXcgOiBvbkNsaWNrLFxuICAgIHN0eWxlOiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0pXG4gIH0pLCBpc0Vycm9yICYmIGZhbGxiYWNrID8gUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCBPYmplY3QuYXNzaWduKHt9LCBpbWdDb21tb25Qcm9wcywge1xuICAgIHNyYzogZmFsbGJhY2tcbiAgfSkpIDogUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCBPYmplY3QuYXNzaWduKHt9LCBpbWdDb21tb25Qcm9wcywge1xuICAgIG9uTG9hZDogb25Mb2FkLFxuICAgIG9uRXJyb3I6IG9uRXJyb3IsXG4gICAgc3JjOiBzcmNcbiAgfSkpLCBzdGF0dXMgPT09ICdsb2FkaW5nJyAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wbGFjZWhvbGRlclwiKVxuICB9LCBwbGFjZWhvbGRlcikpLCBwcmV2aWV3ICYmICFpc0Vycm9yICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1ByZXZpZXcuZGVmYXVsdCwge1xuICAgIFwiYXJpYS1oaWRkZW5cIjogIWlzU2hvd1ByZXZpZXcsXG4gICAgdmlzaWJsZTogaXNTaG93UHJldmlldyxcbiAgICBwcmVmaXhDbHM6IHByZXZpZXdQcmVmaXhDbHMsXG4gICAgb25DbG9zZTogb25QcmV2aWV3Q2xvc2UsXG4gICAgbW91c2VQb3NpdGlvbjogbW91c2VQb3NpdGlvbixcbiAgICBzcmM6IG1lcmdlZFNyYyxcbiAgICBhbHQ6IGFsdFxuICB9KSk7XG59O1xuXG5JbWFnZUludGVybmFsLmRpc3BsYXlOYW1lID0gJ0ltYWdlJztcbnZhciBfZGVmYXVsdCA9IEltYWdlSW50ZXJuYWw7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjRGlhbG9nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtZGlhbG9nXCIpKTtcblxudmFyIF9Sb3RhdGVMZWZ0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Sb3RhdGVMZWZ0T3V0bGluZWRcIikpO1xuXG52YXIgX1JvdGF0ZVJpZ2h0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9Sb3RhdGVSaWdodE91dGxpbmVkXCIpKTtcblxudmFyIF9ab29tSW5PdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1pvb21Jbk91dGxpbmVkXCIpKTtcblxudmFyIF9ab29tT3V0T3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9ab29tT3V0T3V0bGluZWRcIikpO1xuXG52YXIgX0Nsb3NlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DbG9zZU91dGxpbmVkXCIpKTtcblxudmFyIF9jbGFzc25hbWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiKSk7XG5cbnZhciBfY3NzID0gcmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9jc3NcIik7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi93YXJuaW5nXCIpO1xuXG52YXIgX3VzZUZyYW1lU2V0U3RhdGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VGcmFtZVNldFN0YXRlXCIpKTtcblxudmFyIF9nZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2dldEZpeFNjYWxlRWxlVHJhbnNQb3NpdGlvblwiKSk7XG5cbnZhciB1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlO1xudmFyIGluaXRpYWxQb3NpdGlvbiA9IHtcbiAgeDogMCxcbiAgeTogMFxufTtcblxudmFyIFByZXZpZXcgPSBmdW5jdGlvbiBQcmV2aWV3KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBzcmMgPSBwcm9wcy5zcmMsXG4gICAgICBhbHQgPSBwcm9wcy5hbHQsXG4gICAgICBvbkNsb3NlID0gcHJvcHMub25DbG9zZSxcbiAgICAgIGFmdGVyQ2xvc2UgPSBwcm9wcy5hZnRlckNsb3NlLFxuICAgICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwic3JjXCIsIFwiYWx0XCIsIFwib25DbG9zZVwiLCBcImFmdGVyQ2xvc2VcIiwgXCJ2aXNpYmxlXCJdKTtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoMSksXG4gICAgICBfdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUsIDIpLFxuICAgICAgc2NhbGUgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0U2NhbGUgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoMCksXG4gICAgICBfdXNlU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUzLCAyKSxcbiAgICAgIHJvdGF0ZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRSb3RhdGUgPSBfdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBfdXNlRnJhbWVTZXRTdGF0ZSA9ICgwLCBfdXNlRnJhbWVTZXRTdGF0ZTMuZGVmYXVsdCkoaW5pdGlhbFBvc2l0aW9uKSxcbiAgICAgIF91c2VGcmFtZVNldFN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZUZyYW1lU2V0U3RhdGUsIDIpLFxuICAgICAgcG9zaXRpb24gPSBfdXNlRnJhbWVTZXRTdGF0ZTJbMF0sXG4gICAgICBzZXRQb3NpdGlvbiA9IF91c2VGcmFtZVNldFN0YXRlMlsxXTtcblxuICB2YXIgaW1nUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBvcmlnaW5Qb3NpdGlvblJlZiA9IFJlYWN0LnVzZVJlZih7XG4gICAgb3JpZ2luWDogMCxcbiAgICBvcmlnaW5ZOiAwLFxuICAgIGRlbHRhWDogMCxcbiAgICBkZWx0YVk6IDBcbiAgfSk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBpc01vdmluZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRNb3ZpbmcgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBvbkFmdGVyQ2xvc2UgPSBmdW5jdGlvbiBvbkFmdGVyQ2xvc2UoKSB7XG4gICAgc2V0U2NhbGUoMSk7XG4gICAgc2V0Um90YXRlKDApO1xuICAgIHNldFBvc2l0aW9uKGluaXRpYWxQb3NpdGlvbik7XG4gIH07XG5cbiAgdmFyIG9uWm9vbUluID0gZnVuY3Rpb24gb25ab29tSW4oKSB7XG4gICAgc2V0U2NhbGUoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgKyAxO1xuICAgIH0pO1xuICAgIHNldFBvc2l0aW9uKGluaXRpYWxQb3NpdGlvbik7XG4gIH07XG5cbiAgdmFyIG9uWm9vbU91dCA9IGZ1bmN0aW9uIG9uWm9vbU91dCgpIHtcbiAgICBpZiAoc2NhbGUgPiAxKSB7XG4gICAgICBzZXRTY2FsZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIC0gMTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFBvc2l0aW9uKGluaXRpYWxQb3NpdGlvbik7XG4gIH07XG5cbiAgdmFyIG9uUm90YXRlUmlnaHQgPSBmdW5jdGlvbiBvblJvdGF0ZVJpZ2h0KCkge1xuICAgIHNldFJvdGF0ZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSArIDkwO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBvblJvdGF0ZUxlZnQgPSBmdW5jdGlvbiBvblJvdGF0ZUxlZnQoKSB7XG4gICAgc2V0Um90YXRlKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlIC0gOTA7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdyYXBDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXMzLmRlZmF1bHQpKCgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1vdmluZ1wiKSwgaXNNb3ZpbmcpKTtcbiAgdmFyIHRvb2xDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9wZXJhdGlvbnMtb3BlcmF0aW9uXCIpO1xuICB2YXIgaWNvbkNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlcmF0aW9ucy1pY29uXCIpO1xuICB2YXIgdG9vbHMgPSBbe1xuICAgIEljb246IF9DbG9zZU91dGxpbmVkLmRlZmF1bHQsXG4gICAgb25DbGljazogb25DbG9zZSxcbiAgICB0eXBlOiAnY2xvc2UnXG4gIH0sIHtcbiAgICBJY29uOiBfWm9vbUluT3V0bGluZWQuZGVmYXVsdCxcbiAgICBvbkNsaWNrOiBvblpvb21JbixcbiAgICB0eXBlOiAnem9vbUluJ1xuICB9LCB7XG4gICAgSWNvbjogX1pvb21PdXRPdXRsaW5lZC5kZWZhdWx0LFxuICAgIG9uQ2xpY2s6IG9uWm9vbU91dCxcbiAgICB0eXBlOiAnem9vbU91dCcsXG4gICAgZGlzYWJsZWQ6IHNjYWxlID09PSAxXG4gIH0sIHtcbiAgICBJY29uOiBfUm90YXRlUmlnaHRPdXRsaW5lZC5kZWZhdWx0LFxuICAgIG9uQ2xpY2s6IG9uUm90YXRlUmlnaHQsXG4gICAgdHlwZTogJ3JvdGF0ZVJpZ2h0J1xuICB9LCB7XG4gICAgSWNvbjogX1JvdGF0ZUxlZnRPdXRsaW5lZC5kZWZhdWx0LFxuICAgIG9uQ2xpY2s6IG9uUm90YXRlTGVmdCxcbiAgICB0eXBlOiAncm90YXRlTGVmdCdcbiAgfV07XG5cbiAgdmFyIG9uTW91c2VVcCA9IGZ1bmN0aW9uIG9uTW91c2VVcCgpIHtcbiAgICBpZiAodmlzaWJsZSAmJiBpc01vdmluZykge1xuICAgICAgdmFyIHdpZHRoID0gaW1nUmVmLmN1cnJlbnQub2Zmc2V0V2lkdGggKiBzY2FsZTtcbiAgICAgIHZhciBoZWlnaHQgPSBpbWdSZWYuY3VycmVudC5vZmZzZXRIZWlnaHQgKiBzY2FsZTtcblxuICAgICAgdmFyIF9nZXRPZmZzZXQgPSAoMCwgX2Nzcy5nZXRPZmZzZXQpKGltZ1JlZi5jdXJyZW50KSxcbiAgICAgICAgICBsZWZ0ID0gX2dldE9mZnNldC5sZWZ0LFxuICAgICAgICAgIHRvcCA9IF9nZXRPZmZzZXQudG9wO1xuXG4gICAgICB2YXIgaXNSb3RhdGUgPSByb3RhdGUgJSAxODAgIT09IDA7XG4gICAgICBzZXRNb3ZpbmcoZmFsc2UpO1xuICAgICAgdmFyIGZpeFN0YXRlID0gKDAsIF9nZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24uZGVmYXVsdCkoaXNSb3RhdGUgPyBoZWlnaHQgOiB3aWR0aCwgaXNSb3RhdGUgPyB3aWR0aCA6IGhlaWdodCwgbGVmdCwgdG9wKTtcblxuICAgICAgaWYgKGZpeFN0YXRlKSB7XG4gICAgICAgIHNldFBvc2l0aW9uKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgZml4U3RhdGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBXaXRob3V0IHRoaXMgbWFzayBjbG9zZSB3aWxsIGFibm9ybWFsXG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBvcmlnaW5Qb3NpdGlvblJlZi5jdXJyZW50LmRlbHRhWCA9IGV2ZW50LnBhZ2VYIC0gcG9zaXRpb24ueDtcbiAgICBvcmlnaW5Qb3NpdGlvblJlZi5jdXJyZW50LmRlbHRhWSA9IGV2ZW50LnBhZ2VZIC0gcG9zaXRpb24ueTtcbiAgICBvcmlnaW5Qb3NpdGlvblJlZi5jdXJyZW50Lm9yaWdpblggPSBwb3NpdGlvbi54O1xuICAgIG9yaWdpblBvc2l0aW9uUmVmLmN1cnJlbnQub3JpZ2luWSA9IHBvc2l0aW9uLnk7XG4gICAgc2V0TW92aW5nKHRydWUpO1xuICB9O1xuXG4gIHZhciBvbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgaWYgKHZpc2libGUgJiYgaXNNb3ZpbmcpIHtcbiAgICAgIHNldFBvc2l0aW9uKHtcbiAgICAgICAgeDogZXZlbnQucGFnZVggLSBvcmlnaW5Qb3NpdGlvblJlZi5jdXJyZW50LmRlbHRhWCxcbiAgICAgICAgeTogZXZlbnQucGFnZVkgLSBvcmlnaW5Qb3NpdGlvblJlZi5jdXJyZW50LmRlbHRhWVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9uVG9wTW91c2VVcExpc3RlbmVyO1xuICAgIHZhciBvblRvcE1vdXNlTW92ZUxpc3RlbmVyO1xuICAgIHZhciBvbk1vdXNlVXBMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lci5kZWZhdWx0KSh3aW5kb3csICdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG4gICAgdmFyIG9uTW91c2VNb3ZlTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIuZGVmYXVsdCkod2luZG93LCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNvbHZlIGlmIGluIGlmcmFtZSBsb3N0IGV2ZW50XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAod2luZG93LnRvcCAhPT0gd2luZG93LnNlbGYpIHtcbiAgICAgICAgb25Ub3BNb3VzZVVwTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIuZGVmYXVsdCkod2luZG93LnRvcCwgJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlKTtcbiAgICAgICAgb25Ub3BNb3VzZU1vdmVMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lci5kZWZhdWx0KSh3aW5kb3cudG9wLCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICgwLCBfd2FybmluZy53YXJuaW5nKShmYWxzZSwgXCJbcmMtaW1hZ2VdIFwiLmNvbmNhdChlcnJvcikpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBvbk1vdXNlVXBMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgIG9uTW91c2VNb3ZlTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gICAgICBpZiAob25Ub3BNb3VzZVVwTGlzdGVuZXIpIG9uVG9wTW91c2VVcExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgICAgaWYgKG9uVG9wTW91c2VNb3ZlTGlzdGVuZXIpIG9uVG9wTW91c2VNb3ZlTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgfTtcbiAgfSwgW3Zpc2libGUsIGlzTW92aW5nXSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY0RpYWxvZy5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCByZXN0UHJvcHMsIHtcbiAgICB0cmFuc2l0aW9uTmFtZTogXCJ6b29tXCIsXG4gICAgbWFza1RyYW5zaXRpb25OYW1lOiBcImZhZGVcIixcbiAgICBjbG9zYWJsZTogZmFsc2UsXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25DbG9zZTogb25DbG9zZSxcbiAgICBhZnRlckNsb3NlOiBvbkFmdGVyQ2xvc2UsXG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICB3cmFwQ2xhc3NOYW1lOiB3cmFwQ2xhc3NOYW1lXG4gIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVyYXRpb25zXCIpXG4gIH0sIHRvb2xzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBJY29uID0gX3JlZi5JY29uLFxuICAgICAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgICAgICB0eXBlID0gX3JlZi50eXBlLFxuICAgICAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQ7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczMuZGVmYXVsdCkodG9vbENsYXNzTmFtZSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlcmF0aW9ucy1vcGVyYXRpb24tZGlzYWJsZWRcIiksICEhZGlzYWJsZWQpKSxcbiAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICBrZXk6IHR5cGVcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KEljb24sIHtcbiAgICAgIGNsYXNzTmFtZTogaWNvbkNsYXNzTmFtZVxuICAgIH0pKTtcbiAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1nLXdyYXBwZXJcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUzZChcIi5jb25jYXQocG9zaXRpb24ueCwgXCJweCwgXCIpLmNvbmNhdChwb3NpdGlvbi55LCBcInB4LCAwKVwiKVxuICAgIH1cbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgIHJlZjogaW1nUmVmLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWdcIiksXG4gICAgc3JjOiBzcmMsXG4gICAgYWx0OiBhbHQsXG4gICAgc3R5bGU6IHtcbiAgICAgIHRyYW5zZm9ybTogXCJzY2FsZTNkKFwiLmNvbmNhdChzY2FsZSwgXCIsIFwiKS5jb25jYXQoc2NhbGUsIFwiLCAxKSByb3RhdGUoXCIpLmNvbmNhdChyb3RhdGUsIFwiZGVnKVwiKVxuICAgIH1cbiAgfSkpKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IFByZXZpZXc7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBnZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb247XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfY3NzID0gcmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9jc3NcIik7XG5cbmZ1bmN0aW9uIGZpeFBvaW50KGtleSwgc3RhcnQsIHdpZHRoLCBjbGllbnRXaWR0aCkge1xuICB2YXIgc3RhcnRBZGRXaWR0aCA9IHN0YXJ0ICsgd2lkdGg7XG4gIHZhciBvZmZzZXRTdGFydCA9ICh3aWR0aCAtIGNsaWVudFdpZHRoKSAvIDI7XG5cbiAgaWYgKHdpZHRoID4gY2xpZW50V2lkdGgpIHtcbiAgICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgICByZXR1cm4gKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIGtleSwgb2Zmc2V0U3RhcnQpO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IDAgJiYgc3RhcnRBZGRXaWR0aCA8IGNsaWVudFdpZHRoKSB7XG4gICAgICByZXR1cm4gKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIGtleSwgLW9mZnNldFN0YXJ0KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0QWRkV2lkdGggPiBjbGllbnRXaWR0aCkge1xuICAgIHJldHVybiAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwga2V5LCBzdGFydCA8IDAgPyBvZmZzZXRTdGFydCA6IC1vZmZzZXRTdGFydCk7XG4gIH1cblxuICByZXR1cm4ge307XG59XG4vKipcbiAqIEZpeCBwb3NpdG9uIHgseSBwb2ludCB3aGVuXG4gKlxuICogRWxlIHdpZHRoICYmIGhlaWdodCA8IGNsaWVudFxuICogLSBCYWNrIG9yaWdpblxuICpcbiAqIC0gRWxlIHdpZHRoIHwgaGVpZ2h0ID4gY2xpZW50V2lkdGggfCBjbGllbnRIZWlnaHRcbiAqIC0gbGVmdCB8IHRvcCA+IDAgLT4gQmFjayAwXG4gKiAtIGxlZnQgfCB0b3AgKyB3aWR0aCB8IGhlaWdodCA8IGNsaWVudFdpZHRoIHwgY2xpZW50SGVpZ2h0IC0+IEJhY2sgbGVmdCB8IHRvcCArIHdpZHRoIHwgaGVpZ2h0ID09PSBjbGllbnRXaWR0aCB8IGNsaWVudEhlaWdodFxuICpcbiAqIFJlZ2FyZGxlc3Mgb2Ygb3RoZXJcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEZpeFNjYWxlRWxlVHJhbnNQb3NpdGlvbih3aWR0aCwgaGVpZ2h0LCBsZWZ0LCB0b3ApIHtcbiAgdmFyIF9nZXRDbGllbnRTaXplID0gKDAsIF9jc3MuZ2V0Q2xpZW50U2l6ZSkoKSxcbiAgICAgIGNsaWVudFdpZHRoID0gX2dldENsaWVudFNpemUud2lkdGgsXG4gICAgICBjbGllbnRIZWlnaHQgPSBfZ2V0Q2xpZW50U2l6ZS5oZWlnaHQ7XG5cbiAgdmFyIGZpeFBvcyA9IG51bGw7XG5cbiAgaWYgKHdpZHRoIDw9IGNsaWVudFdpZHRoICYmIGhlaWdodCA8PSBjbGllbnRIZWlnaHQpIHtcbiAgICBmaXhQb3MgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH0gZWxzZSBpZiAod2lkdGggPiBjbGllbnRXaWR0aCB8fCBoZWlnaHQgPiBjbGllbnRIZWlnaHQpIHtcbiAgICBmaXhQb3MgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBmaXhQb2ludCgneCcsIGxlZnQsIHdpZHRoLCBjbGllbnRXaWR0aCkpLCBmaXhQb2ludCgneScsIHRvcCwgaGVpZ2h0LCBjbGllbnRIZWlnaHQpKTtcbiAgfVxuXG4gIHJldHVybiBmaXhQb3M7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlRnJhbWVTZXRTdGF0ZTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmFmID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvcmFmXCIpKTtcblxuZnVuY3Rpb24gdXNlRnJhbWVTZXRTdGF0ZShpbml0aWFsKSB7XG4gIHZhciBmcmFtZSA9IFJlYWN0LnVzZVJlZihudWxsKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoaW5pdGlhbCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgc3RhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0U3RhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBxdWV1ZSA9IFJlYWN0LnVzZVJlZihbXSk7XG5cbiAgdmFyIHNldEZyYW1lU3RhdGUgPSBmdW5jdGlvbiBzZXRGcmFtZVN0YXRlKG5ld1N0YXRlKSB7XG4gICAgaWYgKGZyYW1lLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHF1ZXVlLmN1cnJlbnQgPSBbXTtcbiAgICAgIGZyYW1lLmN1cnJlbnQgPSAoMCwgX3JhZi5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldFN0YXRlKGZ1bmN0aW9uIChwcmVTdGF0ZSkge1xuICAgICAgICAgIHZhciBtZW1vU3RhdGUgPSBwcmVTdGF0ZTtcbiAgICAgICAgICBxdWV1ZS5jdXJyZW50LmZvckVhY2goZnVuY3Rpb24gKHF1ZXVlU3RhdGUpIHtcbiAgICAgICAgICAgIG1lbW9TdGF0ZSA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIG1lbW9TdGF0ZSksIHF1ZXVlU3RhdGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZyYW1lLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgIHJldHVybiBtZW1vU3RhdGU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcXVldWUuY3VycmVudC5wdXNoKG5ld1N0YXRlKTtcbiAgfTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZnJhbWUuY3VycmVudCAmJiBfcmFmLmRlZmF1bHQuY2FuY2VsKGZyYW1lLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFtzdGF0ZSwgc2V0RnJhbWVTdGF0ZV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG52YXIgX2V4cG9ydE5hbWVzID0ge307XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfSW1hZ2UgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9JbWFnZVwiKSk7XG5cbk9iamVjdC5rZXlzKF9JbWFnZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGlmIChrZXkgPT09IFwiZGVmYXVsdFwiIHx8IGtleSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybjtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfZXhwb3J0TmFtZXMsIGtleSkpIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gX0ltYWdlW2tleV07XG4gICAgfVxuICB9KTtcbn0pO1xudmFyIF9kZWZhdWx0ID0gX0ltYWdlLmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIikpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvS2V5Q29kZVwiKSk7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7ICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMi5kZWZhdWx0KSh0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG52YXIgZGVmYXVsdFBhcnNlciA9IGZ1bmN0aW9uIGRlZmF1bHRQYXJzZXIoaW5wdXQpIHtcbiAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1teXFx3Li1dKy9nLCAnJyk7XG59O1xuLyoqXG4gKiBXaGVuIGNsaWNrIGFuZCBob2xkIG9uIGEgYnV0dG9uIC0gdGhlIHNwZWVkIG9mIGF1dG8gY2hhbmdpbiB0aGUgdmFsdWUuXG4gKi9cblxuXG52YXIgU1BFRUQgPSAyMDA7XG4vKipcbiAqIFdoZW4gY2xpY2sgYW5kIGhvbGQgb24gYSBidXR0b24gLSB0aGUgZGVsYXkgYmVmb3JlIGF1dG8gY2hhbmdpbiB0aGUgdmFsdWUuXG4gKi9cblxudmFyIERFTEFZID0gNjAwO1xuLyoqXG4gKiBNYXggU2FmZSBJbnRlZ2VyIC0tIG9uIElFIHRoaXMgaXMgbm90IGF2YWlsYWJsZSwgc28gbWFudWFsbHkgc2V0IHRoZSBudW1iZXIgaW4gdGhhdCBjYXNlLlxuICogVGhlIHJlYXNvbiB0aGlzIGlzIHVzZWQsIGluc3RlYWQgb2YgSW5maW5pdHkgaXMgYmVjYXVzZSBudW1iZXJzIGFib3ZlIHRoZSBNU0kgYXJlIHVuc3RhYmxlXG4gKi9cblxudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCBNYXRoLnBvdygyLCA1MykgLSAxO1xuXG52YXIgaXNWYWxpZFByb3BzID0gZnVuY3Rpb24gaXNWYWxpZFByb3BzKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsO1xufTtcblxudmFyIGlzRXF1YWwgPSBmdW5jdGlvbiBpc0VxdWFsKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlIHx8IHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG9sZFZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTihuZXdWYWx1ZSkgJiYgaXNOYU4ob2xkVmFsdWUpO1xufTtcblxudmFyIElucHV0TnVtYmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKElucHV0TnVtYmVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKElucHV0TnVtYmVyKTtcblxuICBmdW5jdGlvbiBJbnB1dE51bWJlcihwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIElucHV0TnVtYmVyKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbktleURvd24gPSBfdGhpcyRwcm9wcy5vbktleURvd24sXG4gICAgICAgICAgb25QcmVzc0VudGVyID0gX3RoaXMkcHJvcHMub25QcmVzc0VudGVyO1xuXG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LlVQKSB7XG4gICAgICAgIHZhciByYXRpbyA9IF90aGlzLmdldFJhdGlvKGUpO1xuXG4gICAgICAgIF90aGlzLnVwKGUsIHJhdGlvLCBudWxsKTtcblxuICAgICAgICBfdGhpcy5zdG9wKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5ET1dOKSB7XG4gICAgICAgIHZhciBfcmF0aW8gPSBfdGhpcy5nZXRSYXRpbyhlKTtcblxuICAgICAgICBfdGhpcy5kb3duKGUsIF9yYXRpbywgbnVsbCk7XG5cbiAgICAgICAgX3RoaXMuc3RvcCgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuRU5URVIgJiYgb25QcmVzc0VudGVyKSB7XG4gICAgICAgIG9uUHJlc3NFbnRlcihlKTtcbiAgICAgIH0gLy8gVHJpZ2dlciB1c2VyIGtleSBkb3duXG5cblxuICAgICAgX3RoaXMucmVjb3JkQ3Vyc29yUG9zaXRpb24oKTtcblxuICAgICAgX3RoaXMubGFzdEtleUNvZGUgPSBlLmtleUNvZGU7XG5cbiAgICAgIGlmIChvbktleURvd24pIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgb25LZXlEb3duLmFwcGx5KHZvaWQgMCwgW2VdLmNvbmNhdChhcmdzKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uS2V5VXAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uS2V5VXAgPSBfdGhpcy5wcm9wcy5vbktleVVwO1xuXG4gICAgICBfdGhpcy5zdG9wKCk7XG5cbiAgICAgIF90aGlzLnJlY29yZEN1cnNvclBvc2l0aW9uKCk7IC8vIFRyaWdnZXIgdXNlciBrZXkgdXBcblxuXG4gICAgICBpZiAob25LZXlVcCkge1xuICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgIH1cblxuICAgICAgICBvbktleVVwLmFwcGx5KHZvaWQgMCwgW2VdLmNvbmNhdChhcmdzKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbkNoYW5nZSA9IF90aGlzLnByb3BzLm9uQ2hhbmdlO1xuXG4gICAgICBpZiAoX3RoaXMuc3RhdGUuZm9jdXNlZCkge1xuICAgICAgICBfdGhpcy5pbnB1dHRpbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5yYXdJbnB1dCA9IF90aGlzLnByb3BzLnBhcnNlcihfdGhpcy5nZXRWYWx1ZUZyb21FdmVudChlKSk7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaW5wdXRWYWx1ZTogX3RoaXMucmF3SW5wdXRcbiAgICAgIH0pO1xuXG4gICAgICBvbkNoYW5nZShfdGhpcy50b051bWJlcihfdGhpcy5yYXdJbnB1dCkpOyAvLyB2YWxpZCBudW1iZXIgb3IgaW52YWxpZCBzdHJpbmdcbiAgICB9O1xuXG4gICAgX3RoaXMub25Nb3VzZVVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uTW91c2VVcCA9IF90aGlzLnByb3BzLm9uTW91c2VVcDtcblxuICAgICAgX3RoaXMucmVjb3JkQ3Vyc29yUG9zaXRpb24oKTtcblxuICAgICAgaWYgKG9uTW91c2VVcCkge1xuICAgICAgICBvbk1vdXNlVXAuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbkZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMjtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmb2N1c2VkOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgKF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzKS5vbkZvY3VzLmFwcGx5KF90aGlzJHByb3BzMiwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25CbHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uQmx1ciA9IF90aGlzLnByb3BzLm9uQmx1cjtcbiAgICAgIF90aGlzLmlucHV0dGluZyA9IGZhbHNlO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgdmFyIHZhbHVlID0gX3RoaXMuZ2V0Q3VycmVudFZhbGlkVmFsdWUoX3RoaXMuc3RhdGUuaW5wdXRWYWx1ZSk7XG5cbiAgICAgIHZhciBuZXdWYWx1ZSA9IF90aGlzLnNldFZhbHVlKHZhbHVlLCBub29wKTtcblxuICAgICAgaWYgKG9uQmx1cikge1xuICAgICAgICB2YXIgb3JpZ2luVmFsdWUgPSBfdGhpcy5pbnB1dC52YWx1ZTtcblxuICAgICAgICB2YXIgZGlzcGxheVZhbHVlID0gX3RoaXMuZ2V0SW5wdXREaXNwbGF5VmFsdWUoe1xuICAgICAgICAgIGZvY3VzOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMuaW5wdXQudmFsdWUgPSBkaXNwbGF5VmFsdWUgPyBOdW1iZXIoZGlzcGxheVZhbHVlKSA6IGRpc3BsYXlWYWx1ZTtcbiAgICAgICAgb25CbHVyLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgX3RoaXMuaW5wdXQudmFsdWUgPSBvcmlnaW5WYWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0UmF0aW8gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHJhdGlvID0gMTtcblxuICAgICAgaWYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHtcbiAgICAgICAgcmF0aW8gPSAwLjE7XG4gICAgICB9IGVsc2UgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgcmF0aW8gPSAxMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJhdGlvO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRGdWxsTnVtID0gZnVuY3Rpb24gKG51bSkge1xuICAgICAgaWYgKGlzTmFOKG51bSkpIHtcbiAgICAgICAgcmV0dXJuIG51bTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEvZS9pLnRlc3QoU3RyaW5nKG51bSkpKSB7XG4gICAgICAgIHJldHVybiBudW07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOdW1iZXIobnVtKS50b0ZpeGVkKDE4KS5yZXBsYWNlKC9cXC4/MCskLywgJycpO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRQcmVjaXNpb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChpc1ZhbGlkUHJvcHMoX3RoaXMucHJvcHMucHJlY2lzaW9uKSkge1xuICAgICAgICByZXR1cm4gX3RoaXMucHJvcHMucHJlY2lzaW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVTdHJpbmcgPSBTdHJpbmcodmFsdWUpO1xuXG4gICAgICBpZiAodmFsdWVTdHJpbmcuaW5kZXhPZignZS0nKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludCh2YWx1ZVN0cmluZy5zbGljZSh2YWx1ZVN0cmluZy5pbmRleE9mKCdlLScpICsgMiksIDEwKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByZWNpc2lvbiA9IDA7XG5cbiAgICAgIGlmICh2YWx1ZVN0cmluZy5pbmRleE9mKCcuJykgPj0gMCkge1xuICAgICAgICBwcmVjaXNpb24gPSB2YWx1ZVN0cmluZy5sZW5ndGggLSB2YWx1ZVN0cmluZy5pbmRleE9mKCcuJykgLSAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJlY2lzaW9uO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRJbnB1dERpc3BsYXlWYWx1ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgdmFyIF9yZWYgPSBzdGF0ZSB8fCBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICBmb2N1c2VkID0gX3JlZi5mb2N1c2VkLFxuICAgICAgICAgIGlucHV0VmFsdWUgPSBfcmVmLmlucHV0VmFsdWUsXG4gICAgICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlO1xuXG4gICAgICB2YXIgaW5wdXREaXNwbGF5VmFsdWU7XG5cbiAgICAgIGlmIChmb2N1c2VkKSB7XG4gICAgICAgIGlucHV0RGlzcGxheVZhbHVlID0gaW5wdXRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0RGlzcGxheVZhbHVlID0gX3RoaXMudG9QcmVjaXNpb25Bc1N0ZXAodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXREaXNwbGF5VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBpbnB1dERpc3BsYXlWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBpbnB1dERpc3BsYXlWYWx1ZSA9ICcnO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5wdXREaXNwbGF5VmFsdWVGb3JtYXQgPSBfdGhpcy5mb3JtYXRXcmFwcGVyKGlucHV0RGlzcGxheVZhbHVlKTtcblxuICAgICAgaWYgKGlzVmFsaWRQcm9wcyhfdGhpcy5wcm9wcy5kZWNpbWFsU2VwYXJhdG9yKSkge1xuICAgICAgICBpbnB1dERpc3BsYXlWYWx1ZUZvcm1hdCA9IGlucHV0RGlzcGxheVZhbHVlRm9ybWF0LnRvU3RyaW5nKCkucmVwbGFjZSgnLicsIF90aGlzLnByb3BzLmRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5wdXREaXNwbGF5VmFsdWVGb3JtYXQ7XG4gICAgfTtcblxuICAgIF90aGlzLnJlY29yZEN1cnNvclBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gUmVjb3JkIHBvc2l0aW9uXG4gICAgICB0cnkge1xuICAgICAgICBfdGhpcy5jdXJzb3JTdGFydCA9IF90aGlzLmlucHV0LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICBfdGhpcy5jdXJzb3JFbmQgPSBfdGhpcy5pbnB1dC5zZWxlY3Rpb25FbmQ7XG4gICAgICAgIF90aGlzLmN1cnJlbnRWYWx1ZSA9IF90aGlzLmlucHV0LnZhbHVlO1xuICAgICAgICBfdGhpcy5jdXJzb3JCZWZvcmUgPSBfdGhpcy5pbnB1dC52YWx1ZS5zdWJzdHJpbmcoMCwgX3RoaXMuY3Vyc29yU3RhcnQpO1xuICAgICAgICBfdGhpcy5jdXJzb3JBZnRlciA9IF90aGlzLmlucHV0LnZhbHVlLnN1YnN0cmluZyhfdGhpcy5jdXJzb3JFbmQpO1xuICAgICAgfSBjYXRjaCAoZSkgey8vIEZpeCBlcnJvciBpbiBDaHJvbWU6XG4gICAgICAgIC8vIEZhaWxlZCB0byByZWFkIHRoZSAnc2VsZWN0aW9uU3RhcnQnIHByb3BlcnR5IGZyb20gJ0hUTUxJbnB1dEVsZW1lbnQnXG4gICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzIxMTc3NDg5LzMwNDA2MDVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMucmVzdG9yZUJ5QWZ0ZXIgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciBmdWxsU3RyID0gX3RoaXMuaW5wdXQudmFsdWU7XG4gICAgICB2YXIgaW5kZXggPSBmdWxsU3RyLmxhc3RJbmRleE9mKHN0cik7XG4gICAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgcHJldkN1cnNvclBvcyA9IF90aGlzLmN1cnNvckJlZm9yZS5sZW5ndGg7XG5cbiAgICAgIGlmIChfdGhpcy5sYXN0S2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5ERUxFVEUgJiYgX3RoaXMuY3Vyc29yQmVmb3JlLmNoYXJBdChwcmV2Q3Vyc29yUG9zIC0gMSkgPT09IHN0clswXSkge1xuICAgICAgICBfdGhpcy5maXhDYXJldChwcmV2Q3Vyc29yUG9zLCBwcmV2Q3Vyc29yUG9zKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4ICsgc3RyLmxlbmd0aCA9PT0gZnVsbFN0ci5sZW5ndGgpIHtcbiAgICAgICAgX3RoaXMuZml4Q2FyZXQoaW5kZXgsIGluZGV4KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBfdGhpcy5wYXJ0UmVzdG9yZUJ5QWZ0ZXIgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTsgLy8gRm9yIGxvb3AgZnJvbSBmdWxsIHN0ciB0byB0aGUgc3RyIHdpdGggbGFzdCBjaGFyIHRvIG1hcC4gZS5nLiAxMjNcbiAgICAgIC8vIC0+IDEyM1xuICAgICAgLy8gLT4gMjNcbiAgICAgIC8vIC0+IDNcblxuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwoc3RyLCBmdW5jdGlvbiAoXywgc3RhcnQpIHtcbiAgICAgICAgdmFyIHBhcnRTdHIgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIF90aGlzLnJlc3RvcmVCeUFmdGVyKHBhcnRTdHIpO1xuICAgICAgfSk7XG4gICAgfTsgLy8gJzEuJyAnMXgnICd4eCcgJycgPT4gYXJlIG5vdCBjb21wbGV0ZSBudW1iZXJzXG5cblxuICAgIF90aGlzLmlzTm90Q29tcGxldGVOdW1iZXIgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgICByZXR1cm4gaXNOYU4obnVtKSB8fCBudW0gPT09ICcnIHx8IG51bSA9PT0gbnVsbCB8fCBudW0gJiYgbnVtLnRvU3RyaW5nKCkuaW5kZXhPZignLicpID09PSBudW0udG9TdHJpbmcoKS5sZW5ndGggLSAxO1xuICAgIH07XG5cbiAgICBfdGhpcy5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmF1dG9TdGVwVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLmF1dG9TdGVwVGltZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5kb3duID0gZnVuY3Rpb24gKGUsIHJhdGlvLCByZWN1cnNpdmUpIHtcbiAgICAgIF90aGlzLnByZXNzaW5nVXBPckRvd24gPSB0cnVlO1xuXG4gICAgICBfdGhpcy5zdGVwKCdkb3duJywgZSwgcmF0aW8sIHJlY3Vyc2l2ZSk7XG4gICAgfTtcblxuICAgIF90aGlzLnVwID0gZnVuY3Rpb24gKGUsIHJhdGlvLCByZWN1cnNpdmUpIHtcbiAgICAgIF90aGlzLnByZXNzaW5nVXBPckRvd24gPSB0cnVlO1xuXG4gICAgICBfdGhpcy5zdGVwKCd1cCcsIGUsIHJhdGlvLCByZWN1cnNpdmUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlSW5wdXQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMuaW5wdXQgPSBub2RlO1xuICAgIH07XG5cbiAgICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGZvY3VzZWQ6IHByb3BzLmF1dG9Gb2N1c1xuICAgIH07XG5cbiAgICB2YXIgdmFsaWRWYWx1ZSA9IF90aGlzLmdldFZhbGlkVmFsdWUoX3RoaXMudG9OdW1iZXIodmFsdWUpKTtcblxuICAgIF90aGlzLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpcy5zdGF0ZSksIHt9LCB7XG4gICAgICBpbnB1dFZhbHVlOiBfdGhpcy50b1ByZWNpc2lvbkFzU3RlcCh2YWxpZFZhbHVlKSxcbiAgICAgIHZhbHVlOiB2YWxpZFZhbHVlXG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoSW5wdXROdW1iZXIsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5jb21wb25lbnREaWRVcGRhdGUobnVsbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHByb3BzMy52YWx1ZSxcbiAgICAgICAgICBvbkNoYW5nZSA9IF90aGlzJHByb3BzMy5vbkNoYW5nZSxcbiAgICAgICAgICBtYXggPSBfdGhpcyRwcm9wczMubWF4LFxuICAgICAgICAgIG1pbiA9IF90aGlzJHByb3BzMy5taW47XG4gICAgICB2YXIgZm9jdXNlZCA9IHRoaXMuc3RhdGUuZm9jdXNlZDsgLy8gRG9uJ3QgdHJpZ2dlciBpbiBjb21wb25lbnREaWRNb3VudFxuXG4gICAgICBpZiAocHJldlByb3BzKSB7XG4gICAgICAgIGlmICghaXNFcXVhbChwcmV2UHJvcHMudmFsdWUsIHZhbHVlKSB8fCAhaXNFcXVhbChwcmV2UHJvcHMubWF4LCBtYXgpIHx8ICFpc0VxdWFsKHByZXZQcm9wcy5taW4sIG1pbikpIHtcbiAgICAgICAgICB2YXIgdmFsaWRWYWx1ZSA9IGZvY3VzZWQgPyB2YWx1ZSA6IHRoaXMuZ2V0VmFsaWRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgdmFyIG5leHRJbnB1dFZhbHVlO1xuXG4gICAgICAgICAgaWYgKHRoaXMucHJlc3NpbmdVcE9yRG93bikge1xuICAgICAgICAgICAgbmV4dElucHV0VmFsdWUgPSB2YWxpZFZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnB1dHRpbmcpIHtcbiAgICAgICAgICAgIG5leHRJbnB1dFZhbHVlID0gdGhpcy5yYXdJbnB1dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dElucHV0VmFsdWUgPSB0aGlzLnRvUHJlY2lzaW9uQXNTdGVwKHZhbGlkVmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgdmFsdWU6IHZhbGlkVmFsdWUsXG4gICAgICAgICAgICBpbnB1dFZhbHVlOiBuZXh0SW5wdXRWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIFRyaWdnZXIgb25DaGFuZ2Ugd2hlbiBtYXggb3IgbWluIGNoYW5nZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xMTU3NFxuXG5cbiAgICAgICAgdmFyIG5leHRWYWx1ZSA9ICd2YWx1ZScgaW4gdGhpcy5wcm9wcyA/IHZhbHVlIDogdGhpcy5zdGF0ZS52YWx1ZTsgLy8gcmVmOiBudWxsIDwgMjAgPT09IHRydWVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTQyNzdcblxuICAgICAgICBpZiAoJ21heCcgaW4gdGhpcy5wcm9wcyAmJiBwcmV2UHJvcHMubWF4ICE9PSBtYXggJiYgdHlwZW9mIG5leHRWYWx1ZSA9PT0gJ251bWJlcicgJiYgbmV4dFZhbHVlID4gbWF4ICYmIG9uQ2hhbmdlKSB7XG4gICAgICAgICAgb25DaGFuZ2UobWF4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnbWluJyBpbiB0aGlzLnByb3BzICYmIHByZXZQcm9wcy5taW4gIT09IG1pbiAmJiB0eXBlb2YgbmV4dFZhbHVlID09PSAnbnVtYmVyJyAmJiBuZXh0VmFsdWUgPCBtaW4gJiYgb25DaGFuZ2UpIHtcbiAgICAgICAgICBvbkNoYW5nZShtaW4pO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlc3RvcmUgY3Vyc29yXG5cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRmlyZWZveCBzZXQgdGhlIGlucHV0IGN1cnNvciBhZnRlciBpdCBnZXQgZm9jdXNlZC5cbiAgICAgICAgLy8gVGhpcyBjYXVzZWQgdGhhdCBpZiBhbiBpbnB1dCBkaWRuJ3QgaW5pdCB3aXRoIHRoZSBzZWxlY3Rpb24sXG4gICAgICAgIC8vIHNldCB3aWxsIGNhdXNlIGN1cnNvciBub3QgY29ycmVjdCB3aGVuIGZpcnN0IGZvY3VzLlxuICAgICAgICAvLyBTYWZhcmkgd2lsbCBmb2N1cyBpbnB1dCBpZiBzZXQgc2VsZWN0aW9uLiBXZSBuZWVkIHNraXAgdGhpcy5cbiAgICAgICAgaWYgKHRoaXMuY3Vyc29yU3RhcnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnN0YXRlLmZvY3VzZWQpIHtcbiAgICAgICAgICAvLyBJbiBtb3N0IGNhc2VzLCB0aGUgc3RyaW5nIGFmdGVyIGN1cnNvciBpcyBzdGFibGUuXG4gICAgICAgICAgLy8gV2UgY2FuIG1vdmUgdGhlIGN1cnNvciBiZWZvcmUgaXRcbiAgICAgICAgICBpZiAoIC8vIElmIG5vdCBtYXRjaCBmdWxsIHN0ciwgdHJ5IHRvIG1hdGNoIHBhcnQgb2Ygc3RyXG4gICAgICAgICAgIXRoaXMucGFydFJlc3RvcmVCeUFmdGVyKHRoaXMuY3Vyc29yQWZ0ZXIpICYmIHRoaXMuc3RhdGUudmFsdWUgIT09IHRoaXMucHJvcHMudmFsdWUpIHtcbiAgICAgICAgICAgIC8vIElmIG5vdCBtYXRjaCBhbnkgb2YgdGhlbiwgbGV0J3MganVzdCBrZWVwIHRoZSBwb3NpdGlvblxuICAgICAgICAgICAgLy8gVE9ETzogTG9naWMgc2hvdWxkIG5vdCByZWFjaCBoZXJlLCBuZWVkIGNoZWNrIGlmIGhhcHBlbnNcbiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmN1cnNvclN0YXJ0ICsgMTsgLy8gSWYgbm90IGhhdmUgbGFzdCBzdHJpbmcsIGp1c3QgcG9zaXRpb24gdG8gdGhlIGVuZFxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY3Vyc29yQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgcG9zID0gdGhpcy5pbnB1dC52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFzdEtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuQkFDS1NQQUNFKSB7XG4gICAgICAgICAgICAgIHBvcyA9IHRoaXMuY3Vyc29yU3RhcnQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RLZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkRFTEVURSkge1xuICAgICAgICAgICAgICBwb3MgPSB0aGlzLmN1cnNvclN0YXJ0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpeENhcmV0KHBvcywgcG9zKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZhbHVlID09PSB0aGlzLmlucHV0LnZhbHVlKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgc29tZSBzcGVjaWFsIGtleSBjb2RlXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMubGFzdEtleUNvZGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LkJBQ0tTUEFDRTpcbiAgICAgICAgICAgICAgICB0aGlzLmZpeENhcmV0KHRoaXMuY3Vyc29yU3RhcnQgLSAxLCB0aGlzLmN1cnNvclN0YXJ0IC0gMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LkRFTEVURTpcbiAgICAgICAgICAgICAgICB0aGlzLmZpeENhcmV0KHRoaXMuY3Vyc29yU3RhcnQgKyAxLCB0aGlzLmN1cnNvclN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDogLy8gRG8gbm90aGluZ1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7Ly8gRG8gbm90aGluZ1xuICAgICAgfSAvLyBSZXNldCBsYXN0IGtleVxuXG5cbiAgICAgIHRoaXMubGFzdEtleUNvZGUgPSBudWxsOyAvLyBwcmVzc2luZ1VwT3JEb3duIGlzIHRydWUgbWVhbnMgdGhhdCBzb21lb25lIGp1c3QgY2xpY2sgdXAgb3IgZG93biBidXR0b25cblxuICAgICAgaWYgKCF0aGlzLnByZXNzaW5nVXBPckRvd24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcm9wcy5mb2N1c09uVXBEb3duICYmIHRoaXMuc3RhdGUuZm9jdXNlZCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGhpcy5pbnB1dCkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VmFsaWRWYWx1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VmFsaWRWYWx1ZSh2YWx1ZSkge1xuICAgICAgdmFyIHZhbCA9IHZhbHVlO1xuXG4gICAgICBpZiAodmFsID09PSAnJykge1xuICAgICAgICB2YWwgPSAnJztcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNOb3RDb21wbGV0ZU51bWJlcihwYXJzZUZsb2F0KHZhbCkpKSB7XG4gICAgICAgIHZhbCA9IHRoaXMuZ2V0VmFsaWRWYWx1ZSh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMudG9OdW1iZXIodmFsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmFsdWVGcm9tRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVGcm9tRXZlbnQoZSkge1xuICAgICAgLy8gb3B0aW1pemUgZm9yIGNoaW5lc2UgaW5wdXQgZXhwaWVyZW5jZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvODE5NlxuICAgICAgdmFyIHZhbHVlID0gZS50YXJnZXQudmFsdWUudHJpbSgpLnJlcGxhY2UoL+OAgi9nLCAnLicpO1xuXG4gICAgICBpZiAoaXNWYWxpZFByb3BzKHRoaXMucHJvcHMuZGVjaW1hbFNlcGFyYXRvcikpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHRoaXMucHJvcHMuZGVjaW1hbFNlcGFyYXRvciwgJy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRWYWxpZFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZhbGlkVmFsdWUodmFsdWUpIHtcbiAgICAgIHZhciBtaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRoaXMucHJvcHMubWluO1xuICAgICAgdmFyIG1heCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdGhpcy5wcm9wcy5tYXg7XG4gICAgICB2YXIgdmFsID0gcGFyc2VGbG9hdCh2YWx1ZSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzczNThcblxuICAgICAgaWYgKGlzTmFOKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsIDwgbWluKSB7XG4gICAgICAgIHZhbCA9IG1pbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbCA+IG1heCkge1xuICAgICAgICB2YWwgPSBtYXg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZhbHVlKHYsIGNhbGxiYWNrKSB7XG4gICAgICAvLyB0cmlnZ2VyIG9uQ2hhbmdlXG4gICAgICB2YXIgcHJlY2lzaW9uID0gdGhpcy5wcm9wcy5wcmVjaXNpb247XG4gICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLmlzTm90Q29tcGxldGVOdW1iZXIocGFyc2VGbG9hdCh2KSkgPyBudWxsIDogcGFyc2VGbG9hdCh2KTtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSR2YWx1ZSA9IHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRzdGF0ZSR2YWx1ZSA9PT0gdm9pZCAwID8gbnVsbCA6IF90aGlzJHN0YXRlJHZhbHVlO1xuICAgICAgdmFyIF90aGlzJHN0YXRlJGlucHV0VmFsdSA9IHRoaXMuc3RhdGUuaW5wdXRWYWx1ZSxcbiAgICAgICAgICBpbnB1dFZhbHVlID0gX3RoaXMkc3RhdGUkaW5wdXRWYWx1ID09PSB2b2lkIDAgPyBudWxsIDogX3RoaXMkc3RhdGUkaW5wdXRWYWx1OyAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy83MzYzXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xNjYyMlxuXG4gICAgICB2YXIgbmV3VmFsdWVJblN0cmluZyA9IHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ251bWJlcicgPyBuZXdWYWx1ZS50b0ZpeGVkKHByZWNpc2lvbikgOiBcIlwiLmNvbmNhdChuZXdWYWx1ZSk7XG4gICAgICB2YXIgY2hhbmdlZCA9IG5ld1ZhbHVlICE9PSB2YWx1ZSB8fCBuZXdWYWx1ZUluU3RyaW5nICE9PSBcIlwiLmNvbmNhdChpbnB1dFZhbHVlKTtcblxuICAgICAgaWYgKCEoJ3ZhbHVlJyBpbiB0aGlzLnByb3BzKSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgICAgaW5wdXRWYWx1ZTogdGhpcy50b1ByZWNpc2lvbkFzU3RlcCh2KVxuICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhbHdheXMgc2V0IGlucHV0IHZhbHVlIHNhbWUgYXMgdmFsdWVcbiAgICAgICAgaW5wdXRWYWx1ZSA9IHRoaXMudG9QcmVjaXNpb25Bc1N0ZXAodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlucHV0VmFsdWU6IGlucHV0VmFsdWVcbiAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKG5ld1ZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIH0gLy8gc3RlcD17MS4wfSB2YWx1ZT17MS41MX1cbiAgICAvLyBwcmVzcyArXG4gICAgLy8gdGhlbiB2YWx1ZSBzaG91bGQgYmUgMi41MSwgcmF0aGVyIHRoYW4gMi41XG4gICAgLy8gaWYgdGhpcy5wcm9wcy5wcmVjaXNpb24gaXMgdW5kZWZpbmVkXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC9pbnB1dC1udW1iZXIvaXNzdWVzLzM5XG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRNYXhQcmVjaXNpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWF4UHJlY2lzaW9uKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgdmFyIHJhdGlvID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxO1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcHJlY2lzaW9uID0gX3RoaXMkcHJvcHM0LnByZWNpc2lvbixcbiAgICAgICAgICBzdGVwID0gX3RoaXMkcHJvcHM0LnN0ZXA7XG5cbiAgICAgIGlmIChpc1ZhbGlkUHJvcHMocHJlY2lzaW9uKSkge1xuICAgICAgICByZXR1cm4gcHJlY2lzaW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmF0aW9QcmVjaXNpb24gPSB0aGlzLmdldFByZWNpc2lvbihyYXRpbyk7XG4gICAgICB2YXIgc3RlcFByZWNpc2lvbiA9IHRoaXMuZ2V0UHJlY2lzaW9uKHN0ZXApO1xuICAgICAgdmFyIGN1cnJlbnRWYWx1ZVByZWNpc2lvbiA9IHRoaXMuZ2V0UHJlY2lzaW9uKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgIGlmICghY3VycmVudFZhbHVlKSB7XG4gICAgICAgIHJldHVybiByYXRpb1ByZWNpc2lvbiArIHN0ZXBQcmVjaXNpb247XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBNYXRoLm1heChjdXJyZW50VmFsdWVQcmVjaXNpb24sIHJhdGlvUHJlY2lzaW9uICsgc3RlcFByZWNpc2lvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFByZWNpc2lvbkZhY3RvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQcmVjaXNpb25GYWN0b3IoY3VycmVudFZhbHVlKSB7XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gICAgICB2YXIgcHJlY2lzaW9uID0gdGhpcy5nZXRNYXhQcmVjaXNpb24oY3VycmVudFZhbHVlLCByYXRpbyk7XG4gICAgICByZXR1cm4gTWF0aC5wb3coMTAsIHByZWNpc2lvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgICAgdGhpcy5yZWNvcmRDdXJzb3JQb3NpdGlvbigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJibHVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlbGVjdCgpIHtcbiAgICAgIHRoaXMuaW5wdXQuc2VsZWN0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvcm1hdFdyYXBwZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0V3JhcHBlcihudW0pIHtcbiAgICAgIC8vIGh0dHA6Ly8yYWxpdHkuY29tLzIwMTIvMDMvc2lnbmVkemVyby5odG1sXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy85NDM5XG4gICAgICBpZiAodGhpcy5wcm9wcy5mb3JtYXR0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuZm9ybWF0dGVyKG51bSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudW07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvUHJlY2lzaW9uQXNTdGVwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvUHJlY2lzaW9uQXNTdGVwKG51bSkge1xuICAgICAgaWYgKHRoaXMuaXNOb3RDb21wbGV0ZU51bWJlcihudW0pIHx8IG51bSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIG51bTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByZWNpc2lvbiA9IE1hdGguYWJzKHRoaXMuZ2V0TWF4UHJlY2lzaW9uKG51bSkpO1xuXG4gICAgICBpZiAoIWlzTmFOKHByZWNpc2lvbikpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcihudW0pLnRvRml4ZWQocHJlY2lzaW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bS50b1N0cmluZygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b051bWJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b051bWJlcihudW0pIHtcbiAgICAgIHZhciBwcmVjaXNpb24gPSB0aGlzLnByb3BzLnByZWNpc2lvbjtcbiAgICAgIHZhciBmb2N1c2VkID0gdGhpcy5zdGF0ZS5mb2N1c2VkOyAvLyBudW0ubGVuZ3RoID4gMTYgPT4gVGhpcyBpcyB0byBwcmV2ZW50IGlucHV0IG9mIGxhcmdlIG51bWJlcnNcblxuICAgICAgdmFyIG51bWJlcklzVG9vTGFyZ2UgPSBudW0gJiYgbnVtLmxlbmd0aCA+IDE2ICYmIGZvY3VzZWQ7XG5cbiAgICAgIGlmICh0aGlzLmlzTm90Q29tcGxldGVOdW1iZXIobnVtKSB8fCBudW1iZXJJc1Rvb0xhcmdlKSB7XG4gICAgICAgIHJldHVybiBudW07XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1ZhbGlkUHJvcHMocHJlY2lzaW9uKSkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChudW0gKiBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKSkgLyBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE51bWJlcihudW0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cFN0ZXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBTdGVwKHZhbCwgcmF0KSB7XG4gICAgICB2YXIgc3RlcCA9IHRoaXMucHJvcHMuc3RlcDtcbiAgICAgIHZhciBwcmVjaXNpb25GYWN0b3IgPSB0aGlzLmdldFByZWNpc2lvbkZhY3Rvcih2YWwsIHJhdCk7XG4gICAgICB2YXIgcHJlY2lzaW9uID0gTWF0aC5hYnModGhpcy5nZXRNYXhQcmVjaXNpb24odmFsLCByYXQpKTtcbiAgICAgIHZhciByZXN1bHQgPSAoKHByZWNpc2lvbkZhY3RvciAqIHZhbCArIHByZWNpc2lvbkZhY3RvciAqIHN0ZXAgKiByYXQpIC8gcHJlY2lzaW9uRmFjdG9yKS50b0ZpeGVkKHByZWNpc2lvbik7XG4gICAgICByZXR1cm4gdGhpcy50b051bWJlcihyZXN1bHQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb3duU3RlcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkb3duU3RlcCh2YWwsIHJhdCkge1xuICAgICAgdmFyIHN0ZXAgPSB0aGlzLnByb3BzLnN0ZXA7XG4gICAgICB2YXIgcHJlY2lzaW9uRmFjdG9yID0gdGhpcy5nZXRQcmVjaXNpb25GYWN0b3IodmFsLCByYXQpO1xuICAgICAgdmFyIHByZWNpc2lvbiA9IE1hdGguYWJzKHRoaXMuZ2V0TWF4UHJlY2lzaW9uKHZhbCwgcmF0KSk7XG4gICAgICB2YXIgcmVzdWx0ID0gKChwcmVjaXNpb25GYWN0b3IgKiB2YWwgLSBwcmVjaXNpb25GYWN0b3IgKiBzdGVwICogcmF0KSAvIHByZWNpc2lvbkZhY3RvcikudG9GaXhlZChwcmVjaXNpb24pO1xuICAgICAgcmV0dXJuIHRoaXMudG9OdW1iZXIocmVzdWx0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RlcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGVwKHR5cGUsIGUpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDE7XG4gICAgICB2YXIgcmVjdXJzaXZlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgaWYgKGUpIHtcbiAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsaWRWYWx1ZSh0aGlzLnN0YXRlLmlucHV0VmFsdWUpIHx8IDA7XG5cbiAgICAgIGlmICh0aGlzLmlzTm90Q29tcGxldGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbCA9IHRoaXNbXCJcIi5jb25jYXQodHlwZSwgXCJTdGVwXCIpXSh2YWx1ZSwgcmF0aW8pO1xuICAgICAgdmFyIG91dE9mUmFuZ2UgPSB2YWwgPiBwcm9wcy5tYXggfHwgdmFsIDwgcHJvcHMubWluO1xuXG4gICAgICBpZiAodmFsID4gcHJvcHMubWF4KSB7XG4gICAgICAgIHZhbCA9IHByb3BzLm1heDtcbiAgICAgIH0gZWxzZSBpZiAodmFsIDwgcHJvcHMubWluKSB7XG4gICAgICAgIHZhbCA9IHByb3BzLm1pbjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRWYWx1ZSh2YWwsIG51bGwpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzZWQ6IHRydWVcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnByZXNzaW5nVXBPckRvd24gPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3V0T2ZSYW5nZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXV0b1N0ZXBUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczJbdHlwZV0oZSwgcmF0aW8sIHRydWUpO1xuICAgICAgfSwgcmVjdXJzaXZlID8gU1BFRUQgOiBERUxBWSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpeENhcmV0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpeENhcmV0KHN0YXJ0LCBlbmQpIHtcbiAgICAgIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLmlucHV0IHx8ICF0aGlzLmlucHV0LnZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGN1cnJlbnRTdGFydCA9IHRoaXMuaW5wdXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgIHZhciBjdXJyZW50RW5kID0gdGhpcy5pbnB1dC5zZWxlY3Rpb25FbmQ7XG5cbiAgICAgICAgaWYgKHN0YXJ0ICE9PSBjdXJyZW50U3RhcnQgfHwgZW5kICE9PSBjdXJyZW50RW5kKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkgey8vIEZpeCBlcnJvciBpbiBDaHJvbWU6XG4gICAgICAgIC8vIEZhaWxlZCB0byByZWFkIHRoZSAnc2VsZWN0aW9uU3RhcnQnIHByb3BlcnR5IGZyb20gJ0hUTUxJbnB1dEVsZW1lbnQnXG4gICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzIxMTc3NDg5LzMwNDA2MDVcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHM1LnByZWZpeENscyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzNS5kaXNhYmxlZCxcbiAgICAgICAgICByZWFkT25seSA9IF90aGlzJHByb3BzNS5yZWFkT25seSxcbiAgICAgICAgICB1c2VUb3VjaCA9IF90aGlzJHByb3BzNS51c2VUb3VjaCxcbiAgICAgICAgICBhdXRvQ29tcGxldGUgPSBfdGhpcyRwcm9wczUuYXV0b0NvbXBsZXRlLFxuICAgICAgICAgIHVwSGFuZGxlciA9IF90aGlzJHByb3BzNS51cEhhbmRsZXIsXG4gICAgICAgICAgZG93bkhhbmRsZXIgPSBfdGhpcyRwcm9wczUuZG93bkhhbmRsZXIsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM1LmNsYXNzTmFtZSxcbiAgICAgICAgICBtYXggPSBfdGhpcyRwcm9wczUubWF4LFxuICAgICAgICAgIG1pbiA9IF90aGlzJHByb3BzNS5taW4sXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczUuc3R5bGUsXG4gICAgICAgICAgdGl0bGUgPSBfdGhpcyRwcm9wczUudGl0bGUsXG4gICAgICAgICAgb25Nb3VzZUVudGVyID0gX3RoaXMkcHJvcHM1Lm9uTW91c2VFbnRlcixcbiAgICAgICAgICBvbk1vdXNlTGVhdmUgPSBfdGhpcyRwcm9wczUub25Nb3VzZUxlYXZlLFxuICAgICAgICAgIG9uTW91c2VPdmVyID0gX3RoaXMkcHJvcHM1Lm9uTW91c2VPdmVyLFxuICAgICAgICAgIG9uTW91c2VPdXQgPSBfdGhpcyRwcm9wczUub25Nb3VzZU91dCxcbiAgICAgICAgICByZXF1aXJlZCA9IF90aGlzJHByb3BzNS5yZXF1aXJlZCxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHM1Lm9uQ2xpY2ssXG4gICAgICAgICAgdGFiSW5kZXggPSBfdGhpcyRwcm9wczUudGFiSW5kZXgsXG4gICAgICAgICAgdHlwZSA9IF90aGlzJHByb3BzNS50eXBlLFxuICAgICAgICAgIHBsYWNlaG9sZGVyID0gX3RoaXMkcHJvcHM1LnBsYWNlaG9sZGVyLFxuICAgICAgICAgIGlkID0gX3RoaXMkcHJvcHM1LmlkLFxuICAgICAgICAgIGlucHV0TW9kZSA9IF90aGlzJHByb3BzNS5pbnB1dE1vZGUsXG4gICAgICAgICAgcGF0dGVybiA9IF90aGlzJHByb3BzNS5wYXR0ZXJuLFxuICAgICAgICAgIHN0ZXAgPSBfdGhpcyRwcm9wczUuc3RlcCxcbiAgICAgICAgICBtYXhMZW5ndGggPSBfdGhpcyRwcm9wczUubWF4TGVuZ3RoLFxuICAgICAgICAgIGF1dG9Gb2N1cyA9IF90aGlzJHByb3BzNS5hdXRvRm9jdXMsXG4gICAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzNS5uYW1lLFxuICAgICAgICAgIG9uUGFzdGUgPSBfdGhpcyRwcm9wczUub25QYXN0ZSxcbiAgICAgICAgICBvbklucHV0ID0gX3RoaXMkcHJvcHM1Lm9uSW5wdXQsXG4gICAgICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF90aGlzJHByb3BzNSwgW1wicHJlZml4Q2xzXCIsIFwiZGlzYWJsZWRcIiwgXCJyZWFkT25seVwiLCBcInVzZVRvdWNoXCIsIFwiYXV0b0NvbXBsZXRlXCIsIFwidXBIYW5kbGVyXCIsIFwiZG93bkhhbmRsZXJcIiwgXCJjbGFzc05hbWVcIiwgXCJtYXhcIiwgXCJtaW5cIiwgXCJzdHlsZVwiLCBcInRpdGxlXCIsIFwib25Nb3VzZUVudGVyXCIsIFwib25Nb3VzZUxlYXZlXCIsIFwib25Nb3VzZU92ZXJcIiwgXCJvbk1vdXNlT3V0XCIsIFwicmVxdWlyZWRcIiwgXCJvbkNsaWNrXCIsIFwidGFiSW5kZXhcIiwgXCJ0eXBlXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJpZFwiLCBcImlucHV0TW9kZVwiLCBcInBhdHRlcm5cIiwgXCJzdGVwXCIsIFwibWF4TGVuZ3RoXCIsIFwiYXV0b0ZvY3VzXCIsIFwibmFtZVwiLCBcIm9uUGFzdGVcIiwgXCJvbklucHV0XCJdKTtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRzdGF0ZS52YWx1ZSxcbiAgICAgICAgICBmb2N1c2VkID0gX3RoaXMkc3RhdGUuZm9jdXNlZDtcbiAgICAgIHZhciBjbGFzc2VzID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBjbGFzc05hbWUsICEhY2xhc3NOYW1lKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9jdXNlZFwiKSwgZm9jdXNlZCksIF9jbGFzc05hbWVzKSk7XG4gICAgICB2YXIgZGF0YU9yQXJpYUF0dHJpYnV0ZVByb3BzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhyZXN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJyB8fCBrZXkgPT09ICdyb2xlJykge1xuICAgICAgICAgIGRhdGFPckFyaWFBdHRyaWJ1dGVQcm9wc1trZXldID0gcmVzdFtrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhciBlZGl0YWJsZSA9ICFyZWFkT25seSAmJiAhZGlzYWJsZWQ7IC8vIGZvY3VzIHN0YXRlLCBzaG93IGlucHV0IHZhbHVlXG4gICAgICAvLyB1bmZvY3VzIHN0YXRlLCBzaG93IHZhbGlkIHZhbHVlXG5cbiAgICAgIHZhciBpbnB1dERpc3BsYXlWYWx1ZSA9IHRoaXMuZ2V0SW5wdXREaXNwbGF5VmFsdWUobnVsbCk7XG4gICAgICB2YXIgdXBEaXNhYmxlZCA9ICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkgJiYgKGlzTmFOKHZhbHVlKSB8fCBOdW1iZXIodmFsdWUpID49IG1heCk7XG4gICAgICB2YXIgZG93bkRpc2FibGVkID0gKHZhbHVlIHx8IHZhbHVlID09PSAwKSAmJiAoaXNOYU4odmFsdWUpIHx8IE51bWJlcih2YWx1ZSkgPD0gbWluKTtcbiAgICAgIHZhciBpc1VwRGlzYWJsZWQgPSB1cERpc2FibGVkIHx8IGRpc2FibGVkIHx8IHJlYWRPbmx5O1xuICAgICAgdmFyIGlzRG93bkRpc2FibGVkID0gZG93bkRpc2FibGVkIHx8IGRpc2FibGVkIHx8IHJlYWRPbmx5O1xuICAgICAgdmFyIHVwQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlclwiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGVyLXVwXCIpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGVyLXVwLWRpc2FibGVkXCIpLCBpc1VwRGlzYWJsZWQpKTtcbiAgICAgIHZhciBkb3duQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlclwiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGVyLWRvd25cIiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZXItZG93bi1kaXNhYmxlZFwiKSwgaXNEb3duRGlzYWJsZWQpKTtcbiAgICAgIHZhciB1cEV2ZW50cyA9IHVzZVRvdWNoID8ge1xuICAgICAgICBvblRvdWNoU3RhcnQ6IGlzVXBEaXNhYmxlZCA/IG5vb3AgOiB0aGlzLnVwLFxuICAgICAgICBvblRvdWNoRW5kOiB0aGlzLnN0b3BcbiAgICAgIH0gOiB7XG4gICAgICAgIG9uTW91c2VEb3duOiBpc1VwRGlzYWJsZWQgPyBub29wIDogdGhpcy51cCxcbiAgICAgICAgb25Nb3VzZVVwOiB0aGlzLnN0b3AsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogdGhpcy5zdG9wXG4gICAgICB9O1xuICAgICAgdmFyIGRvd25FdmVudHMgPSB1c2VUb3VjaCA/IHtcbiAgICAgICAgb25Ub3VjaFN0YXJ0OiBpc0Rvd25EaXNhYmxlZCA/IG5vb3AgOiB0aGlzLmRvd24sXG4gICAgICAgIG9uVG91Y2hFbmQ6IHRoaXMuc3RvcFxuICAgICAgfSA6IHtcbiAgICAgICAgb25Nb3VzZURvd246IGlzRG93bkRpc2FibGVkID8gbm9vcCA6IHRoaXMuZG93bixcbiAgICAgICAgb25Nb3VzZVVwOiB0aGlzLnN0b3AsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogdGhpcy5zdG9wXG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgICAgIG9uTW91c2VPdmVyOiBvbk1vdXNlT3ZlcixcbiAgICAgICAgb25Nb3VzZU91dDogb25Nb3VzZU91dCxcbiAgICAgICAgb25Gb2N1czogZnVuY3Rpb24gb25Gb2N1cygpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlci13cmFwXCIpXG4gICAgICB9LCBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgdW5zZWxlY3RhYmxlOiBcIm9uXCJcbiAgICAgIH0sIHVwRXZlbnRzLCB7XG4gICAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIkluY3JlYXNlIFZhbHVlXCIsXG4gICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBpc1VwRGlzYWJsZWQsXG4gICAgICAgIGNsYXNzTmFtZTogdXBDbGFzc05hbWVcbiAgICAgIH0pLCB1cEhhbmRsZXIgfHwgX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICB1bnNlbGVjdGFibGU6IFwib25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZXItdXAtaW5uZXJcIiksXG4gICAgICAgIG9uQ2xpY2s6IHByZXZlbnREZWZhdWx0XG4gICAgICB9KSksIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICB1bnNlbGVjdGFibGU6IFwib25cIlxuICAgICAgfSwgZG93bkV2ZW50cywge1xuICAgICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJEZWNyZWFzZSBWYWx1ZVwiLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogaXNEb3duRGlzYWJsZWQsXG4gICAgICAgIGNsYXNzTmFtZTogZG93bkNsYXNzTmFtZVxuICAgICAgfSksIGRvd25IYW5kbGVyIHx8IF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgdW5zZWxlY3RhYmxlOiBcIm9uXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGVyLWRvd24taW5uZXJcIiksXG4gICAgICAgIG9uQ2xpY2s6IHByZXZlbnREZWZhdWx0XG4gICAgICB9KSkpLCBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0LXdyYXBcIilcbiAgICAgIH0sIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcm9sZTogXCJzcGluYnV0dG9uXCIsXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBtaW4sXG4gICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBtYXgsXG4gICAgICAgIFwiYXJpYS12YWx1ZW5vd1wiOiB2YWx1ZSxcbiAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXIsXG4gICAgICAgIG9uUGFzdGU6IG9uUGFzdGUsXG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICAgIG9uTW91c2VVcDogdGhpcy5vbk1vdXNlVXAsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dFwiKSxcbiAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZSxcbiAgICAgICAgb25Gb2N1czogdGhpcy5vbkZvY3VzLFxuICAgICAgICBvbkJsdXI6IHRoaXMub25CbHVyLFxuICAgICAgICBvbktleURvd246IGVkaXRhYmxlID8gdGhpcy5vbktleURvd24gOiBub29wLFxuICAgICAgICBvbktleVVwOiBlZGl0YWJsZSA/IHRoaXMub25LZXlVcCA6IG5vb3AsXG4gICAgICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgICAgICBtYXhMZW5ndGg6IG1heExlbmd0aCxcbiAgICAgICAgcmVhZE9ubHk6IHJlYWRPbmx5LFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIG1heDogbWF4LFxuICAgICAgICBtaW46IG1pbixcbiAgICAgICAgc3RlcDogc3RlcCxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZUlucHV0LFxuICAgICAgICB2YWx1ZTogdGhpcy5nZXRGdWxsTnVtKGlucHV0RGlzcGxheVZhbHVlKSxcbiAgICAgICAgcGF0dGVybjogcGF0dGVybixcbiAgICAgICAgaW5wdXRNb2RlOiBpbnB1dE1vZGUsXG4gICAgICAgIG9uSW5wdXQ6IG9uSW5wdXRcbiAgICAgIH0sIGRhdGFPckFyaWFBdHRyaWJ1dGVQcm9wcykpKSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbnB1dE51bWJlcjtcbn0oX3JlYWN0LmRlZmF1bHQuQ29tcG9uZW50KTtcblxuSW5wdXROdW1iZXIuZGVmYXVsdFByb3BzID0ge1xuICBmb2N1c09uVXBEb3duOiB0cnVlLFxuICB1c2VUb3VjaDogZmFsc2UsXG4gIHByZWZpeENsczogJ3JjLWlucHV0LW51bWJlcicsXG4gIG1heDogTUFYX1NBRkVfSU5URUdFUixcbiAgbWluOiAtTUFYX1NBRkVfSU5URUdFUixcbiAgc3RlcDogMSxcbiAgc3R5bGU6IHt9LFxuICBvbkNoYW5nZTogbm9vcCxcbiAgb25LZXlEb3duOiBub29wLFxuICBvblByZXNzRW50ZXI6IG5vb3AsXG4gIG9uRm9jdXM6IG5vb3AsXG4gIG9uQmx1cjogbm9vcCxcbiAgcGFyc2VyOiBkZWZhdWx0UGFyc2VyLFxuICByZXF1aXJlZDogZmFsc2UsXG4gIGF1dG9Db21wbGV0ZTogJ29mZidcbn07XG52YXIgX2RlZmF1bHQgPSBJbnB1dE51bWJlcjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9JbnB1dE51bWJlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSW5wdXROdW1iZXJcIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfSW5wdXROdW1iZXIuZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIF9yY01lbnUgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmMtbWVudVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfTWVudGlvbnNDb250ZXh0ID0gcmVxdWlyZShcIi4vTWVudGlvbnNDb250ZXh0XCIpO1xuXG4vKipcbiAqIFdlIG9ubHkgdXNlIE1lbnUgdG8gZGlzcGxheSB0aGUgY2FuZGlkYXRlLlxuICogVGhlIGZvY3VzIGlzIGNvbnRyb2xsZWQgYnkgdGV4dGFyZWEgdG8gbWFrZSBhY2Nlc3NpYmlsaXR5IGVhc3kuXG4gKi9cbnZhciBEcm9wZG93bk1lbnUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoRHJvcGRvd25NZW51LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoRHJvcGRvd25NZW51KTtcblxuICBmdW5jdGlvbiBEcm9wZG93bk1lbnUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgRHJvcGRvd25NZW51KTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgX3RoaXMucmVuZGVyRHJvcGRvd24gPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIG5vdEZvdW5kQ29udGVudCA9IF9yZWYubm90Rm91bmRDb250ZW50LFxuICAgICAgICAgIGFjdGl2ZUluZGV4ID0gX3JlZi5hY3RpdmVJbmRleCxcbiAgICAgICAgICBzZXRBY3RpdmVJbmRleCA9IF9yZWYuc2V0QWN0aXZlSW5kZXgsXG4gICAgICAgICAgc2VsZWN0T3B0aW9uID0gX3JlZi5zZWxlY3RPcHRpb24sXG4gICAgICAgICAgb25Gb2N1cyA9IF9yZWYub25Gb2N1cyxcbiAgICAgICAgICBvbkJsdXIgPSBfcmVmLm9uQmx1cjtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzLnByZWZpeENscyxcbiAgICAgICAgICBvcHRpb25zID0gX3RoaXMkcHJvcHMub3B0aW9ucztcbiAgICAgIHZhciBhY3RpdmVPcHRpb24gPSBvcHRpb25zW2FjdGl2ZUluZGV4XSB8fCB7fTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY01lbnUuZGVmYXVsdCwge1xuICAgICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVudVwiKSxcbiAgICAgICAgYWN0aXZlS2V5OiBhY3RpdmVPcHRpb24ua2V5LFxuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoX3JlZjIpIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3JlZjIua2V5O1xuICAgICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25zLmZpbmQoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgICAgICB2YXIgb3B0aW9uS2V5ID0gX3JlZjMua2V5O1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbktleSA9PT0ga2V5O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGVjdE9wdGlvbihvcHRpb24pO1xuICAgICAgICB9LFxuICAgICAgICBvbkZvY3VzOiBvbkZvY3VzLFxuICAgICAgICBvbkJsdXI6IG9uQmx1clxuICAgICAgfSwgb3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbiwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGtleSA9IG9wdGlvbi5rZXksXG4gICAgICAgICAgICBkaXNhYmxlZCA9IG9wdGlvbi5kaXNhYmxlZCxcbiAgICAgICAgICAgIGNoaWxkcmVuID0gb3B0aW9uLmNoaWxkcmVuLFxuICAgICAgICAgICAgY2xhc3NOYW1lID0gb3B0aW9uLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHN0eWxlID0gb3B0aW9uLnN0eWxlO1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfcmNNZW51Lk1lbnVJdGVtLCB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcigpIHtcbiAgICAgICAgICAgIHNldEFjdGl2ZUluZGV4KGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGNoaWxkcmVuKTtcbiAgICAgIH0pLCAhb3B0aW9ucy5sZW5ndGggJiYgUmVhY3QuY3JlYXRlRWxlbWVudChfcmNNZW51Lk1lbnVJdGVtLCB7XG4gICAgICAgIGRpc2FibGVkOiB0cnVlXG4gICAgICB9LCBub3RGb3VuZENvbnRlbnQpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoRHJvcGRvd25NZW51LCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX01lbnRpb25zQ29udGV4dC5NZW50aW9uc0NvbnRleHRDb25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJEcm9wZG93bik7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBEcm9wZG93bk1lbnU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBfZGVmYXVsdCA9IERyb3Bkb3duTWVudTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIF9yY1RyaWdnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy10cmlnZ2VyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Ecm9wZG93bk1lbnUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0Ryb3Bkb3duTWVudVwiKSk7XG5cbnZhciBCVUlMVF9JTl9QTEFDRU1FTlRTID0ge1xuICBib3R0b21SaWdodDoge1xuICAgIHBvaW50czogWyd0bCcsICdiciddLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIG92ZXJmbG93OiB7XG4gICAgICBhZGp1c3RYOiAwLFxuICAgICAgYWRqdXN0WTogMVxuICAgIH1cbiAgfSxcbiAgYm90dG9tTGVmdDoge1xuICAgIHBvaW50czogWyd0cicsICdibCddLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIG92ZXJmbG93OiB7XG4gICAgICBhZGp1c3RYOiAwLFxuICAgICAgYWRqdXN0WTogMVxuICAgIH1cbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndHInXSxcbiAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIGFkanVzdFg6IDAsXG4gICAgICBhZGp1c3RZOiAxXG4gICAgfVxuICB9LFxuICB0b3BMZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ3RsJ10sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIG92ZXJmbG93OiB7XG4gICAgICBhZGp1c3RYOiAwLFxuICAgICAgYWRqdXN0WTogMVxuICAgIH1cbiAgfVxufTtcblxudmFyIEtleXdvcmRUcmlnZ2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKEtleXdvcmRUcmlnZ2VyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoS2V5d29yZFRyaWdnZXIpO1xuXG4gIGZ1bmN0aW9uIEtleXdvcmRUcmlnZ2VyKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIEtleXdvcmRUcmlnZ2VyKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgX3RoaXMuZ2V0RHJvcGRvd25QcmVmaXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQoX3RoaXMucHJvcHMucHJlZml4Q2xzLCBcIi1kcm9wZG93blwiKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0RHJvcGRvd25FbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBfdGhpcy5wcm9wcy5vcHRpb25zO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0Ryb3Bkb3duTWVudS5kZWZhdWx0LCB7XG4gICAgICAgIHByZWZpeENsczogX3RoaXMuZ2V0RHJvcGRvd25QcmVmaXgoKSxcbiAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldERyb3BEb3duUGxhY2VtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgcGxhY2VtZW50ID0gX3RoaXMkcHJvcHMucGxhY2VtZW50LFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzLmRpcmVjdGlvbjtcbiAgICAgIHZhciBwb3B1cFBsYWNlbWVudCA9ICd0b3BSaWdodCc7XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICAgIHBvcHVwUGxhY2VtZW50ID0gcGxhY2VtZW50ID09PSAndG9wJyA/ICd0b3BMZWZ0JyA6ICdib3R0b21MZWZ0JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvcHVwUGxhY2VtZW50ID0gcGxhY2VtZW50ID09PSAndG9wJyA/ICd0b3BSaWdodCcgOiAnYm90dG9tUmlnaHQnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcG9wdXBQbGFjZW1lbnQ7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKEtleXdvcmRUcmlnZ2VyLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczIuY2hpbGRyZW4sXG4gICAgICAgICAgdmlzaWJsZSA9IF90aGlzJHByb3BzMi52aXNpYmxlLFxuICAgICAgICAgIHRyYW5zaXRpb25OYW1lID0gX3RoaXMkcHJvcHMyLnRyYW5zaXRpb25OYW1lLFxuICAgICAgICAgIGdldFBvcHVwQ29udGFpbmVyID0gX3RoaXMkcHJvcHMyLmdldFBvcHVwQ29udGFpbmVyO1xuICAgICAgdmFyIHBvcHVwRWxlbWVudCA9IHRoaXMuZ2V0RHJvcGRvd25FbGVtZW50KCk7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfcmNUcmlnZ2VyLmRlZmF1bHQsIHtcbiAgICAgICAgcHJlZml4Q2xzOiB0aGlzLmdldERyb3Bkb3duUHJlZml4KCksXG4gICAgICAgIHBvcHVwVmlzaWJsZTogdmlzaWJsZSxcbiAgICAgICAgcG9wdXA6IHBvcHVwRWxlbWVudCxcbiAgICAgICAgcG9wdXBQbGFjZW1lbnQ6IHRoaXMuZ2V0RHJvcERvd25QbGFjZW1lbnQoKSxcbiAgICAgICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBCVUlMVF9JTl9QTEFDRU1FTlRTLFxuICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJcbiAgICAgIH0sIGNoaWxkcmVuKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEtleXdvcmRUcmlnZ2VyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG52YXIgX2RlZmF1bHQgPSBLZXl3b3JkVHJpZ2dlcjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfdG9BcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0NoaWxkcmVuL3RvQXJyYXlcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY1RleHRhcmVhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdGV4dGFyZWFcIikpO1xuXG52YXIgX0tleXdvcmRUcmlnZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9LZXl3b3JkVHJpZ2dlclwiKSk7XG5cbnZhciBfTWVudGlvbnNDb250ZXh0ID0gcmVxdWlyZShcIi4vTWVudGlvbnNDb250ZXh0XCIpO1xuXG52YXIgX09wdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vT3B0aW9uXCIpKTtcblxudmFyIF91dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxudmFyIE1lbnRpb25zID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKE1lbnRpb25zLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoTWVudGlvbnMpO1xuXG4gIGZ1bmN0aW9uIE1lbnRpb25zKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgTWVudGlvbnMpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgIF90aGlzLmZvY3VzSWQgPSB1bmRlZmluZWQ7XG5cbiAgICBfdGhpcy50cmlnZ2VyQ2hhbmdlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB2YXIgb25DaGFuZ2UgPSBfdGhpcy5wcm9wcy5vbkNoYW5nZTtcblxuICAgICAgaWYgKCEoJ3ZhbHVlJyBpbiBfdGhpcy5wcm9wcykpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25DaGFuZ2UgPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIHZhbHVlID0gX3JlZi50YXJnZXQudmFsdWU7XG5cbiAgICAgIF90aGlzLnRyaWdnZXJDaGFuZ2UodmFsdWUpO1xuICAgIH07IC8vIENoZWNrIGlmIGhpdCB0aGUgbWVhc3VyZSBrZXl3b3JkXG5cblxuICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2g7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICBhY3RpdmVJbmRleCA9IF90aGlzJHN0YXRlLmFjdGl2ZUluZGV4LFxuICAgICAgICAgIG1lYXN1cmluZyA9IF90aGlzJHN0YXRlLm1lYXN1cmluZzsgLy8gU2tpcCBpZiBub3QgbWVhc3VyaW5nXG5cbiAgICAgIGlmICghbWVhc3VyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHdoaWNoID09PSBfS2V5Q29kZS5kZWZhdWx0LlVQIHx8IHdoaWNoID09PSBfS2V5Q29kZS5kZWZhdWx0LkRPV04pIHtcbiAgICAgICAgLy8gQ29udHJvbCBhcnJvdyBmdW5jdGlvblxuICAgICAgICB2YXIgb3B0aW9uTGVuID0gX3RoaXMuZ2V0T3B0aW9ucygpLmxlbmd0aDtcblxuICAgICAgICB2YXIgb2Zmc2V0ID0gd2hpY2ggPT09IF9LZXlDb2RlLmRlZmF1bHQuVVAgPyAtMSA6IDE7XG4gICAgICAgIHZhciBuZXdBY3RpdmVJbmRleCA9IChhY3RpdmVJbmRleCArIG9mZnNldCArIG9wdGlvbkxlbikgJSBvcHRpb25MZW47XG5cbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGFjdGl2ZUluZGV4OiBuZXdBY3RpdmVJbmRleFxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmICh3aGljaCA9PT0gX0tleUNvZGUuZGVmYXVsdC5FU0MpIHtcbiAgICAgICAgX3RoaXMuc3RvcE1lYXN1cmUoKTtcbiAgICAgIH0gZWxzZSBpZiAod2hpY2ggPT09IF9LZXlDb2RlLmRlZmF1bHQuRU5URVIpIHtcbiAgICAgICAgLy8gTWVhc3VyZSBoaXRcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB2YXIgb3B0aW9ucyA9IF90aGlzLmdldE9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgX3RoaXMuc3RvcE1lYXN1cmUoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25zW2FjdGl2ZUluZGV4XTtcblxuICAgICAgICBfdGhpcy5zZWxlY3RPcHRpb24ob3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdoZW4gdG8gc3RhcnQgbWVhc3VyZTpcbiAgICAgKiAxLiBXaGVuIHVzZXIgcHJlc3MgYHByZWZpeGBcbiAgICAgKiAyLiBXaGVuIG1lYXN1cmVUZXh0ICE9PSBwcmV2TWVhc3VyZVRleHRcbiAgICAgKiAgLSBJZiBtZWFzdXJlIGhpdFxuICAgICAqICAtIElmIG1lYXN1cmluZ1xuICAgICAqXG4gICAgICogV2hlbiB0byBzdG9wIG1lYXN1cmU6XG4gICAgICogMS4gU2VsZWN0aW9uIGlzIG91dCBvZiByYW5nZVxuICAgICAqIDIuIENvbnRhaW5zIGBzcGFjZWBcbiAgICAgKiAzLiBFU0Mgb3Igc2VsZWN0IG9uZVxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5vbktleVVwID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIga2V5ID0gZXZlbnQua2V5LFxuICAgICAgICAgIHdoaWNoID0gZXZlbnQud2hpY2g7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgcHJldk1lYXN1cmVUZXh0ID0gX3RoaXMkc3RhdGUyLm1lYXN1cmVUZXh0LFxuICAgICAgICAgIG1lYXN1cmluZyA9IF90aGlzJHN0YXRlMi5tZWFzdXJpbmc7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBfdGhpcyRwcm9wcyRwcmVmaXggPSBfdGhpcyRwcm9wcy5wcmVmaXgsXG4gICAgICAgICAgcHJlZml4ID0gX3RoaXMkcHJvcHMkcHJlZml4ID09PSB2b2lkIDAgPyAnJyA6IF90aGlzJHByb3BzJHByZWZpeCxcbiAgICAgICAgICBvblNlYXJjaCA9IF90aGlzJHByb3BzLm9uU2VhcmNoLFxuICAgICAgICAgIHZhbGlkYXRlU2VhcmNoID0gX3RoaXMkcHJvcHMudmFsaWRhdGVTZWFyY2g7XG4gICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgdmFyIHNlbGVjdGlvblN0YXJ0VGV4dCA9ICgwLCBfdXRpbC5nZXRCZWZvcmVTZWxlY3Rpb25UZXh0KSh0YXJnZXQpO1xuXG4gICAgICB2YXIgX2dldExhc3RNZWFzdXJlSW5kZXggPSAoMCwgX3V0aWwuZ2V0TGFzdE1lYXN1cmVJbmRleCkoc2VsZWN0aW9uU3RhcnRUZXh0LCBwcmVmaXgpLFxuICAgICAgICAgIG1lYXN1cmVJbmRleCA9IF9nZXRMYXN0TWVhc3VyZUluZGV4LmxvY2F0aW9uLFxuICAgICAgICAgIG1lYXN1cmVQcmVmaXggPSBfZ2V0TGFzdE1lYXN1cmVJbmRleC5wcmVmaXg7IC8vIFNraXAgaWYgbWF0Y2ggdGhlIHdoaXRlIGtleSBsaXN0XG5cblxuICAgICAgaWYgKFtfS2V5Q29kZS5kZWZhdWx0LkVTQywgX0tleUNvZGUuZGVmYXVsdC5VUCwgX0tleUNvZGUuZGVmYXVsdC5ET1dOLCBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSXS5pbmRleE9mKHdoaWNoKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVhc3VyZUluZGV4ICE9PSAtMSkge1xuICAgICAgICB2YXIgbWVhc3VyZVRleHQgPSBzZWxlY3Rpb25TdGFydFRleHQuc2xpY2UobWVhc3VyZUluZGV4ICsgbWVhc3VyZVByZWZpeC5sZW5ndGgpO1xuICAgICAgICB2YXIgdmFsaWRhdGVNZWFzdXJlID0gdmFsaWRhdGVTZWFyY2gobWVhc3VyZVRleHQsIF90aGlzLnByb3BzKTtcbiAgICAgICAgdmFyIG1hdGNoT3B0aW9uID0gISFfdGhpcy5nZXRPcHRpb25zKG1lYXN1cmVUZXh0KS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHZhbGlkYXRlTWVhc3VyZSkge1xuICAgICAgICAgIGlmIChrZXkgPT09IG1lYXN1cmVQcmVmaXggfHwga2V5ID09PSAnU2hpZnQnIHx8IG1lYXN1cmluZyB8fCBtZWFzdXJlVGV4dCAhPT0gcHJldk1lYXN1cmVUZXh0ICYmIG1hdGNoT3B0aW9uKSB7XG4gICAgICAgICAgICBfdGhpcy5zdGFydE1lYXN1cmUobWVhc3VyZVRleHQsIG1lYXN1cmVQcmVmaXgsIG1lYXN1cmVJbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG1lYXN1cmluZykge1xuICAgICAgICAgIC8vIFN0b3AgaWYgbWVhc3VyZVRleHQgaXMgaW52YWxpZGF0ZVxuICAgICAgICAgIF90aGlzLnN0b3BNZWFzdXJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdlIHdpbGwgdHJpZ2dlciBgb25TZWFyY2hgIHRvIGRldmVsb3BlciBzaW5jZSB0aGV5IG1heSB1c2UgZm9yIGFzeW5jIHVwZGF0ZS5cbiAgICAgICAgICogSWYgbWV0IGBzcGFjZWAgbWVhbnMgdXNlciBmaW5pc2hlZCBzZWFyY2hpbmcuXG4gICAgICAgICAqL1xuXG5cbiAgICAgICAgaWYgKG9uU2VhcmNoICYmIHZhbGlkYXRlTWVhc3VyZSkge1xuICAgICAgICAgIG9uU2VhcmNoKG1lYXN1cmVUZXh0LCBtZWFzdXJlUHJlZml4KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChtZWFzdXJpbmcpIHtcbiAgICAgICAgX3RoaXMuc3RvcE1lYXN1cmUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25QcmVzc0VudGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgbWVhc3VyaW5nID0gX3RoaXMuc3RhdGUubWVhc3VyaW5nO1xuICAgICAgdmFyIG9uUHJlc3NFbnRlciA9IF90aGlzLnByb3BzLm9uUHJlc3NFbnRlcjtcblxuICAgICAgaWYgKCFtZWFzdXJpbmcgJiYgb25QcmVzc0VudGVyKSB7XG4gICAgICAgIG9uUHJlc3NFbnRlcihldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uSW5wdXRGb2N1cyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgX3RoaXMub25Gb2N1cyhldmVudCk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uSW5wdXRCbHVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBfdGhpcy5vbkJsdXIoZXZlbnQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkRyb3Bkb3duRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5vbkZvY3VzKCk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uRHJvcGRvd25CbHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMub25CbHVyKCk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uRm9jdXMgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoX3RoaXMuZm9jdXNJZCk7XG4gICAgICB2YXIgaXNGb2N1cyA9IF90aGlzLnN0YXRlLmlzRm9jdXM7XG4gICAgICB2YXIgb25Gb2N1cyA9IF90aGlzLnByb3BzLm9uRm9jdXM7XG5cbiAgICAgIGlmICghaXNGb2N1cyAmJiBldmVudCAmJiBvbkZvY3VzKSB7XG4gICAgICAgIG9uRm9jdXMoZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzRm9jdXM6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkJsdXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIF90aGlzLmZvY3VzSWQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvbkJsdXIgPSBfdGhpcy5wcm9wcy5vbkJsdXI7XG5cbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlzRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzLnN0b3BNZWFzdXJlKCk7XG5cbiAgICAgICAgaWYgKG9uQmx1cikge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZWxlY3RPcHRpb24gPSBmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUzID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRzdGF0ZTMudmFsdWUsXG4gICAgICAgICAgbWVhc3VyZUxvY2F0aW9uID0gX3RoaXMkc3RhdGUzLm1lYXN1cmVMb2NhdGlvbixcbiAgICAgICAgICBtZWFzdXJlUHJlZml4ID0gX3RoaXMkc3RhdGUzLm1lYXN1cmVQcmVmaXg7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgc3BsaXQgPSBfdGhpcyRwcm9wczIuc3BsaXQsXG4gICAgICAgICAgb25TZWxlY3QgPSBfdGhpcyRwcm9wczIub25TZWxlY3Q7XG4gICAgICB2YXIgX29wdGlvbiR2YWx1ZSA9IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICBtZW50aW9uVmFsdWUgPSBfb3B0aW9uJHZhbHVlID09PSB2b2lkIDAgPyAnJyA6IF9vcHRpb24kdmFsdWU7XG5cbiAgICAgIHZhciBfcmVwbGFjZVdpdGhNZWFzdXJlID0gKDAsIF91dGlsLnJlcGxhY2VXaXRoTWVhc3VyZSkodmFsdWUsIHtcbiAgICAgICAgbWVhc3VyZUxvY2F0aW9uOiBtZWFzdXJlTG9jYXRpb24sXG4gICAgICAgIHRhcmdldFRleHQ6IG1lbnRpb25WYWx1ZSxcbiAgICAgICAgcHJlZml4OiBtZWFzdXJlUHJlZml4LFxuICAgICAgICBzZWxlY3Rpb25TdGFydDogX3RoaXMudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIHNwbGl0OiBzcGxpdFxuICAgICAgfSksXG4gICAgICAgICAgdGV4dCA9IF9yZXBsYWNlV2l0aE1lYXN1cmUudGV4dCxcbiAgICAgICAgICBzZWxlY3Rpb25Mb2NhdGlvbiA9IF9yZXBsYWNlV2l0aE1lYXN1cmUuc2VsZWN0aW9uTG9jYXRpb247XG5cbiAgICAgIF90aGlzLnRyaWdnZXJDaGFuZ2UodGV4dCk7XG5cbiAgICAgIF90aGlzLnN0b3BNZWFzdXJlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gV2UgbmVlZCByZXN0b3JlIHRoZSBzZWxlY3Rpb24gcG9zaXRpb25cbiAgICAgICAgKDAsIF91dGlsLnNldElucHV0U2VsZWN0aW9uKShfdGhpcy50ZXh0YXJlYSwgc2VsZWN0aW9uTG9jYXRpb24pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgICBvblNlbGVjdChvcHRpb24sIG1lYXN1cmVQcmVmaXgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zZXRBY3RpdmVJbmRleCA9IGZ1bmN0aW9uIChhY3RpdmVJbmRleCkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVJbmRleDogYWN0aXZlSW5kZXhcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXRUZXh0QXJlYVJlZiA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICB2YXIgX2VsZW1lbnQkcmVzaXphYmxlVGV4O1xuXG4gICAgICBfdGhpcy50ZXh0YXJlYSA9IGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9lbGVtZW50JHJlc2l6YWJsZVRleCA9IGVsZW1lbnQucmVzaXphYmxlVGV4dEFyZWEpID09PSBudWxsIHx8IF9lbGVtZW50JHJlc2l6YWJsZVRleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZW1lbnQkcmVzaXphYmxlVGV4LnRleHRBcmVhO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXRNZWFzdXJlUmVmID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIF90aGlzLm1lYXN1cmUgPSBlbGVtZW50O1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKG1lYXN1cmVUZXh0KSB7XG4gICAgICB2YXIgdGFyZ2V0TWVhc3VyZVRleHQgPSBtZWFzdXJlVGV4dCB8fCBfdGhpcy5zdGF0ZS5tZWFzdXJlVGV4dCB8fCAnJztcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMy5jaGlsZHJlbixcbiAgICAgICAgICBmaWx0ZXJPcHRpb24gPSBfdGhpcyRwcm9wczMuZmlsdGVyT3B0aW9uO1xuICAgICAgdmFyIGxpc3QgPSAoMCwgX3RvQXJyYXkuZGVmYXVsdCkoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIHByb3BzID0gX3JlZjIucHJvcHMsXG4gICAgICAgICAgICBrZXkgPSBfcmVmMi5rZXk7XG4gICAgICAgIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICAgICAga2V5OiBrZXkgfHwgcHJvcHMudmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICAvKiogUmV0dXJuIGFsbCByZXN1bHQgaWYgYGZpbHRlck9wdGlvbmAgaXMgZmFsc2UuICovXG4gICAgICAgIGlmIChmaWx0ZXJPcHRpb24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsdGVyT3B0aW9uKHRhcmdldE1lYXN1cmVUZXh0LCBvcHRpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICB2YWx1ZTogcHJvcHMuZGVmYXVsdFZhbHVlIHx8IHByb3BzLnZhbHVlIHx8ICcnLFxuICAgICAgbWVhc3VyaW5nOiBmYWxzZSxcbiAgICAgIG1lYXN1cmVMb2NhdGlvbjogMCxcbiAgICAgIG1lYXN1cmVUZXh0OiBudWxsLFxuICAgICAgbWVhc3VyZVByZWZpeDogJycsXG4gICAgICBhY3RpdmVJbmRleDogMCxcbiAgICAgIGlzRm9jdXM6IGZhbHNlXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShNZW50aW9ucywgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHZhciBtZWFzdXJpbmcgPSB0aGlzLnN0YXRlLm1lYXN1cmluZzsgLy8gU3luYyBtZWFzdXJlIGRpdiB0b3Agd2l0aCB0ZXh0YXJlYSBmb3IgcmMtdHJpZ2dlciB1c2FnZVxuXG4gICAgICBpZiAobWVhc3VyaW5nKSB7XG4gICAgICAgIHRoaXMubWVhc3VyZS5zY3JvbGxUb3AgPSB0aGlzLnRleHRhcmVhLnNjcm9sbFRvcDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRNZWFzdXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0TWVhc3VyZShtZWFzdXJlVGV4dCwgbWVhc3VyZVByZWZpeCwgbWVhc3VyZUxvY2F0aW9uKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbWVhc3VyaW5nOiB0cnVlLFxuICAgICAgICBtZWFzdXJlVGV4dDogbWVhc3VyZVRleHQsXG4gICAgICAgIG1lYXN1cmVQcmVmaXg6IG1lYXN1cmVQcmVmaXgsXG4gICAgICAgIG1lYXN1cmVMb2NhdGlvbjogbWVhc3VyZUxvY2F0aW9uLFxuICAgICAgICBhY3RpdmVJbmRleDogMFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BNZWFzdXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3BNZWFzdXJlKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbWVhc3VyaW5nOiBmYWxzZSxcbiAgICAgICAgbWVhc3VyZUxvY2F0aW9uOiAwLFxuICAgICAgICBtZWFzdXJlVGV4dDogbnVsbFxuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb2N1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgIHRoaXMudGV4dGFyZWEuZm9jdXMoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmx1clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdGhpcy50ZXh0YXJlYS5ibHVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU0ID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHN0YXRlNC52YWx1ZSxcbiAgICAgICAgICBtZWFzdXJlTG9jYXRpb24gPSBfdGhpcyRzdGF0ZTQubWVhc3VyZUxvY2F0aW9uLFxuICAgICAgICAgIG1lYXN1cmVQcmVmaXggPSBfdGhpcyRzdGF0ZTQubWVhc3VyZVByZWZpeCxcbiAgICAgICAgICBtZWFzdXJpbmcgPSBfdGhpcyRzdGF0ZTQubWVhc3VyaW5nLFxuICAgICAgICAgIGFjdGl2ZUluZGV4ID0gX3RoaXMkc3RhdGU0LmFjdGl2ZUluZGV4O1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHM0LnByZWZpeENscyxcbiAgICAgICAgICBwbGFjZW1lbnQgPSBfdGhpcyRwcm9wczQucGxhY2VtZW50LFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzNC5kaXJlY3Rpb24sXG4gICAgICAgICAgdHJhbnNpdGlvbk5hbWUgPSBfdGhpcyRwcm9wczQudHJhbnNpdGlvbk5hbWUsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM0LmNsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzNC5zdHlsZSxcbiAgICAgICAgICBhdXRvRm9jdXMgPSBfdGhpcyRwcm9wczQuYXV0b0ZvY3VzLFxuICAgICAgICAgIG5vdEZvdW5kQ29udGVudCA9IF90aGlzJHByb3BzNC5ub3RGb3VuZENvbnRlbnQsXG4gICAgICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBfdGhpcyRwcm9wczQuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgcmVzdFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3RoaXMkcHJvcHM0LCBbXCJwcmVmaXhDbHNcIiwgXCJwbGFjZW1lbnRcIiwgXCJkaXJlY3Rpb25cIiwgXCJ0cmFuc2l0aW9uTmFtZVwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiYXV0b0ZvY3VzXCIsIFwibm90Rm91bmRDb250ZW50XCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIl0pO1xuICAgICAgdmFyIGlucHV0UHJvcHMgPSAoMCwgX3V0aWwub21pdCkocmVzdFByb3BzLCAndmFsdWUnLCAnZGVmYXVsdFZhbHVlJywgJ3ByZWZpeCcsICdzcGxpdCcsICdjaGlsZHJlbicsICd2YWxpZGF0ZVNlYXJjaCcsICdmaWx0ZXJPcHRpb24nLCAnb25TZWxlY3QnLCAnb25TZWFyY2gnKTtcbiAgICAgIHZhciBvcHRpb25zID0gbWVhc3VyaW5nID8gdGhpcy5nZXRPcHRpb25zKCkgOiBbXTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjVGV4dGFyZWEuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgICAgICByZWY6IHRoaXMuc2V0VGV4dEFyZWFSZWYsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSwgaW5wdXRQcm9wcywge1xuICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSxcbiAgICAgICAgb25LZXlEb3duOiB0aGlzLm9uS2V5RG93bixcbiAgICAgICAgb25LZXlVcDogdGhpcy5vbktleVVwLFxuICAgICAgICBvblByZXNzRW50ZXI6IHRoaXMub25QcmVzc0VudGVyLFxuICAgICAgICBvbkZvY3VzOiB0aGlzLm9uSW5wdXRGb2N1cyxcbiAgICAgICAgb25CbHVyOiB0aGlzLm9uSW5wdXRCbHVyXG4gICAgICB9KSksIG1lYXN1cmluZyAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiB0aGlzLnNldE1lYXN1cmVSZWYsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZWFzdXJlXCIpXG4gICAgICB9LCB2YWx1ZS5zbGljZSgwLCBtZWFzdXJlTG9jYXRpb24pLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9NZW50aW9uc0NvbnRleHQuTWVudGlvbnNDb250ZXh0UHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBub3RGb3VuZENvbnRlbnQ6IG5vdEZvdW5kQ29udGVudCxcbiAgICAgICAgICBhY3RpdmVJbmRleDogYWN0aXZlSW5kZXgsXG4gICAgICAgICAgc2V0QWN0aXZlSW5kZXg6IHRoaXMuc2V0QWN0aXZlSW5kZXgsXG4gICAgICAgICAgc2VsZWN0T3B0aW9uOiB0aGlzLnNlbGVjdE9wdGlvbixcbiAgICAgICAgICBvbkZvY3VzOiB0aGlzLm9uRHJvcGRvd25Gb2N1cyxcbiAgICAgICAgICBvbkJsdXI6IHRoaXMub25Ecm9wZG93bkJsdXJcbiAgICAgICAgfVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChfS2V5d29yZFRyaWdnZXIuZGVmYXVsdCwge1xuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgbWVhc3VyZVByZWZpeCkpKSwgdmFsdWUuc2xpY2UobWVhc3VyZUxvY2F0aW9uICsgbWVhc3VyZVByZWZpeC5sZW5ndGgpKSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSB7fTtcblxuICAgICAgaWYgKCd2YWx1ZScgaW4gcHJvcHMgJiYgcHJvcHMudmFsdWUgIT09IHByZXZTdGF0ZS52YWx1ZSkge1xuICAgICAgICBuZXdTdGF0ZS52YWx1ZSA9IHByb3BzLnZhbHVlIHx8ICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBNZW50aW9ucztcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuTWVudGlvbnMuT3B0aW9uID0gX09wdGlvbi5kZWZhdWx0O1xuTWVudGlvbnMuZGVmYXVsdFByb3BzID0ge1xuICBwcmVmaXhDbHM6ICdyYy1tZW50aW9ucycsXG4gIHByZWZpeDogJ0AnLFxuICBzcGxpdDogJyAnLFxuICB2YWxpZGF0ZVNlYXJjaDogX3V0aWwudmFsaWRhdGVTZWFyY2gsXG4gIGZpbHRlck9wdGlvbjogX3V0aWwuZmlsdGVyT3B0aW9uLFxuICBub3RGb3VuZENvbnRlbnQ6ICdOb3QgRm91bmQnLFxuICByb3dzOiAxXG59O1xudmFyIF9kZWZhdWx0ID0gTWVudGlvbnM7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuTWVudGlvbnNDb250ZXh0Q29uc3VtZXIgPSBleHBvcnRzLk1lbnRpb25zQ29udGV4dFByb3ZpZGVyID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTogbm8tb2JqZWN0LWxpdGVyYWwtdHlwZS1hc3NlcnRpb24gKi9cbi8vIFdlIHdpbGwgbmV2ZXIgdXNlIGRlZmF1bHQsIGhlcmUgb25seSB0byBmaXggVHlwZVNjcmlwdCB3YXJuaW5nXG52YXIgTWVudGlvbnNDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbnZhciBNZW50aW9uc0NvbnRleHRQcm92aWRlciA9IE1lbnRpb25zQ29udGV4dC5Qcm92aWRlcjtcbmV4cG9ydHMuTWVudGlvbnNDb250ZXh0UHJvdmlkZXIgPSBNZW50aW9uc0NvbnRleHRQcm92aWRlcjtcbnZhciBNZW50aW9uc0NvbnRleHRDb25zdW1lciA9IE1lbnRpb25zQ29udGV4dC5Db25zdW1lcjtcbmV4cG9ydHMuTWVudGlvbnNDb250ZXh0Q29uc3VtZXIgPSBNZW50aW9uc0NvbnRleHRDb25zdW1lcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIE9wdGlvbiA9IGZ1bmN0aW9uIE9wdGlvbigpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBPcHRpb247XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfTWVudGlvbnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL01lbnRpb25zXCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX01lbnRpb25zLmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldEJlZm9yZVNlbGVjdGlvblRleHQgPSBnZXRCZWZvcmVTZWxlY3Rpb25UZXh0O1xuZXhwb3J0cy5nZXRMYXN0TWVhc3VyZUluZGV4ID0gZ2V0TGFzdE1lYXN1cmVJbmRleDtcbmV4cG9ydHMucmVwbGFjZVdpdGhNZWFzdXJlID0gcmVwbGFjZVdpdGhNZWFzdXJlO1xuZXhwb3J0cy5zZXRJbnB1dFNlbGVjdGlvbiA9IHNldElucHV0U2VsZWN0aW9uO1xuZXhwb3J0cy52YWxpZGF0ZVNlYXJjaCA9IHZhbGlkYXRlU2VhcmNoO1xuZXhwb3J0cy5maWx0ZXJPcHRpb24gPSBmaWx0ZXJPcHRpb247XG5leHBvcnRzLm9taXQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBvbWl0ID0gZnVuY3Rpb24gb21pdChvYmopIHtcbiAgdmFyIGNsb25lID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBvYmopO1xuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBrZXlzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgZGVsZXRlIGNsb25lW2tleV07XG4gIH0pO1xuICByZXR1cm4gY2xvbmU7XG59O1xuLyoqXG4gKiBDdXQgaW5wdXQgc2VsZWN0aW9uIGludG8gMiBwYXJ0IGFuZCByZXR1cm4gdGV4dCBiZWZvcmUgc2VsZWN0aW9uIHN0YXJ0XG4gKi9cblxuXG5leHBvcnRzLm9taXQgPSBvbWl0O1xuXG5mdW5jdGlvbiBnZXRCZWZvcmVTZWxlY3Rpb25UZXh0KGlucHV0KSB7XG4gIHZhciBzZWxlY3Rpb25TdGFydCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0O1xuICByZXR1cm4gaW5wdXQudmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpO1xufVxuLyoqXG4gKiBGaW5kIHRoZSBsYXN0IG1hdGNoIHByZWZpeCBpbmRleFxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGFzdE1lYXN1cmVJbmRleCh0ZXh0KSB7XG4gIHZhciBwcmVmaXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuICB2YXIgcHJlZml4TGlzdCA9IEFycmF5LmlzQXJyYXkocHJlZml4KSA/IHByZWZpeCA6IFtwcmVmaXhdO1xuICByZXR1cm4gcHJlZml4TGlzdC5yZWR1Y2UoZnVuY3Rpb24gKGxhc3RNYXRjaCwgcHJlZml4U3RyKSB7XG4gICAgdmFyIGxhc3RJbmRleCA9IHRleHQubGFzdEluZGV4T2YocHJlZml4U3RyKTtcblxuICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TWF0Y2gubG9jYXRpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2F0aW9uOiBsYXN0SW5kZXgsXG4gICAgICAgIHByZWZpeDogcHJlZml4U3RyXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0TWF0Y2g7XG4gIH0sIHtcbiAgICBsb2NhdGlvbjogLTEsXG4gICAgcHJlZml4OiAnJ1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbG93ZXIoY2hhcikge1xuICByZXR1cm4gKGNoYXIgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZVRleHQodGV4dCwgdGFyZ2V0VGV4dCwgc3BsaXQpIHtcbiAgdmFyIGZpcnN0Q2hhciA9IHRleHRbMF07XG5cbiAgaWYgKCFmaXJzdENoYXIgfHwgZmlyc3RDaGFyID09PSBzcGxpdCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9IC8vIFJldXNlIHJlc3QgdGV4dCBhcyBpdCBjYW5cblxuXG4gIHZhciByZXN0VGV4dCA9IHRleHQ7XG4gIHZhciB0YXJnZXRUZXh0TGVuID0gdGFyZ2V0VGV4dC5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YXJnZXRUZXh0TGVuOyBpICs9IDEpIHtcbiAgICBpZiAobG93ZXIocmVzdFRleHRbaV0pICE9PSBsb3dlcih0YXJnZXRUZXh0W2ldKSkge1xuICAgICAgcmVzdFRleHQgPSByZXN0VGV4dC5zbGljZShpKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoaSA9PT0gdGFyZ2V0VGV4dExlbiAtIDEpIHtcbiAgICAgIHJlc3RUZXh0ID0gcmVzdFRleHQuc2xpY2UodGFyZ2V0VGV4dExlbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3RUZXh0O1xufVxuLyoqXG4gKiBQYWludCB0YXJnZXRUZXh0IGludG8gY3VycmVudCB0ZXh0OlxuICogIHRleHQ6IGxpdHRsZUBsaXRlc3RcbiAqICB0YXJnZXRUZXh0OiBsaWdodFxuICogID0+IGxpdHRsZSBAbGlnaHQgdGVzdFxuICovXG5cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhNZWFzdXJlKHRleHQsIG1lYXN1cmVDb25maWcpIHtcbiAgdmFyIG1lYXN1cmVMb2NhdGlvbiA9IG1lYXN1cmVDb25maWcubWVhc3VyZUxvY2F0aW9uLFxuICAgICAgcHJlZml4ID0gbWVhc3VyZUNvbmZpZy5wcmVmaXgsXG4gICAgICB0YXJnZXRUZXh0ID0gbWVhc3VyZUNvbmZpZy50YXJnZXRUZXh0LFxuICAgICAgc2VsZWN0aW9uU3RhcnQgPSBtZWFzdXJlQ29uZmlnLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgc3BsaXQgPSBtZWFzdXJlQ29uZmlnLnNwbGl0OyAvLyBCZWZvcmUgdGV4dCB3aWxsIGFwcGVuZCBvbmUgc3BhY2UgaWYgaGF2ZSBvdGhlciB0ZXh0XG5cbiAgdmFyIGJlZm9yZU1lYXN1cmVUZXh0ID0gdGV4dC5zbGljZSgwLCBtZWFzdXJlTG9jYXRpb24pO1xuXG4gIGlmIChiZWZvcmVNZWFzdXJlVGV4dFtiZWZvcmVNZWFzdXJlVGV4dC5sZW5ndGggLSBzcGxpdC5sZW5ndGhdID09PSBzcGxpdCkge1xuICAgIGJlZm9yZU1lYXN1cmVUZXh0ID0gYmVmb3JlTWVhc3VyZVRleHQuc2xpY2UoMCwgYmVmb3JlTWVhc3VyZVRleHQubGVuZ3RoIC0gc3BsaXQubGVuZ3RoKTtcbiAgfVxuXG4gIGlmIChiZWZvcmVNZWFzdXJlVGV4dCkge1xuICAgIGJlZm9yZU1lYXN1cmVUZXh0ID0gXCJcIi5jb25jYXQoYmVmb3JlTWVhc3VyZVRleHQpLmNvbmNhdChzcGxpdCk7XG4gIH0gLy8gQ3V0IGR1cGxpY2F0ZSBzdHJpbmcgd2l0aCBjdXJyZW50IHRhcmdldFRleHRcblxuXG4gIHZhciByZXN0VGV4dCA9IHJlZHVjZVRleHQodGV4dC5zbGljZShzZWxlY3Rpb25TdGFydCksIHRhcmdldFRleHQuc2xpY2Uoc2VsZWN0aW9uU3RhcnQgLSBtZWFzdXJlTG9jYXRpb24gLSBwcmVmaXgubGVuZ3RoKSwgc3BsaXQpO1xuXG4gIGlmIChyZXN0VGV4dC5zbGljZSgwLCBzcGxpdC5sZW5ndGgpID09PSBzcGxpdCkge1xuICAgIHJlc3RUZXh0ID0gcmVzdFRleHQuc2xpY2Uoc3BsaXQubGVuZ3RoKTtcbiAgfVxuXG4gIHZhciBjb25uZWN0ZWRTdGFydFRleHQgPSBcIlwiLmNvbmNhdChiZWZvcmVNZWFzdXJlVGV4dCkuY29uY2F0KHByZWZpeCkuY29uY2F0KHRhcmdldFRleHQpLmNvbmNhdChzcGxpdCk7XG4gIHJldHVybiB7XG4gICAgdGV4dDogXCJcIi5jb25jYXQoY29ubmVjdGVkU3RhcnRUZXh0KS5jb25jYXQocmVzdFRleHQpLFxuICAgIHNlbGVjdGlvbkxvY2F0aW9uOiBjb25uZWN0ZWRTdGFydFRleHQubGVuZ3RoXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNldElucHV0U2VsZWN0aW9uKGlucHV0LCBsb2NhdGlvbikge1xuICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShsb2NhdGlvbiwgbG9jYXRpb24pO1xuICAvKipcbiAgICogUmVzZXQgY2FyZXQgaW50byB2aWV3LlxuICAgKiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGFsd2F5cyBjYWxsZWQgYnkgdXNlciBjb250cm9sLCBpdCdzIHNhZmUgdG8gZm9jdXMgZWxlbWVudC5cbiAgICovXG5cbiAgaW5wdXQuYmx1cigpO1xuICBpbnB1dC5mb2N1cygpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNlYXJjaCh0ZXh0LCBwcm9wcykge1xuICB2YXIgc3BsaXQgPSBwcm9wcy5zcGxpdDtcbiAgcmV0dXJuICFzcGxpdCB8fCB0ZXh0LmluZGV4T2Yoc3BsaXQpID09PSAtMTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyT3B0aW9uKGlucHV0LCBfcmVmKSB7XG4gIHZhciBfcmVmJHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIHZhbHVlID0gX3JlZiR2YWx1ZSA9PT0gdm9pZCAwID8gJycgOiBfcmVmJHZhbHVlO1xuICB2YXIgbG93ZXJDYXNlID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihsb3dlckNhc2UpICE9PSAtMTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIFJlYWN0RE9NID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0LWRvbVwiKSk7XG5cbnZhciBfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbFwiKSk7XG5cbnZhciBfU3ViTWVudSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3ViTWVudVwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbnZhciBNRU5VSVRFTV9PVkVSRkxPV0VEX0NMQVNTTkFNRSA9ICdtZW51aXRlbS1vdmVyZmxvd2VkJztcbnZhciBGTE9BVF9QUkVDSVNJT05fQURKVVNUID0gMC41O1xuXG52YXIgRE9NV3JhcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShET01XcmFwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoRE9NV3JhcCk7XG5cbiAgZnVuY3Rpb24gRE9NV3JhcCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBET01XcmFwKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICBfdGhpcy5tdXRhdGlvbk9ic2VydmVyID0gbnVsbDsgLy8gb3JpZ2luYWwgc2Nyb2xsIHNpemUgb2YgdGhlIGxpc3RcblxuICAgIF90aGlzLm9yaWdpbmFsVG90YWxXaWR0aCA9IDA7IC8vIGNvcHkgb2Ygb3ZlcmZsb3dlZCBpdGVtc1xuXG4gICAgX3RoaXMub3ZlcmZsb3dlZEl0ZW1zID0gW107IC8vIGNhY2hlIGl0ZW0gb2YgdGhlIG9yaWdpbmFsIGl0ZW1zIChzbyB3ZSBjYW4gdHJhY2sgdGhlIHNpemUgYW5kIG9yZGVyKVxuXG4gICAgX3RoaXMubWVudUl0ZW1TaXplcyA9IFtdO1xuICAgIF90aGlzLmNhbmNlbEZyYW1lSWQgPSBudWxsO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgbGFzdFZpc2libGVJbmRleDogdW5kZWZpbmVkXG4gICAgfTsgLy8gZ2V0IGFsbCB2YWxpZCBtZW51SXRlbSBub2Rlc1xuXG4gICAgX3RoaXMuZ2V0TWVudUl0ZW1Ob2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBfdGhpcy5wcm9wcy5wcmVmaXhDbHM7XG4gICAgICB2YXIgdWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpKTtcblxuICAgICAgaWYgKCF1bCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9IC8vIGZpbHRlciBvdXQgYWxsIG92ZXJmbG93ZWQgaW5kaWNhdG9yIHBsYWNlaG9sZGVyXG5cblxuICAgICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwodWwuY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5jbGFzc05hbWUuc3BsaXQoJyAnKS5pbmRleE9mKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3ZlcmZsb3dlZC1zdWJtZW51XCIpKSA8IDA7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0T3ZlcmZsb3dlZFN1Yk1lbnVJdGVtID0gZnVuY3Rpb24gKGtleVByZWZpeCwgb3ZlcmZsb3dlZEl0ZW1zLCByZW5kZXJQbGFjZWhvbGRlcikge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb3ZlcmZsb3dlZEluZGljYXRvciA9IF90aGlzJHByb3BzLm92ZXJmbG93ZWRJbmRpY2F0b3IsXG4gICAgICAgICAgbGV2ZWwgPSBfdGhpcyRwcm9wcy5sZXZlbCxcbiAgICAgICAgICBtb2RlID0gX3RoaXMkcHJvcHMubW9kZSxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgICAgdGhlbWUgPSBfdGhpcyRwcm9wcy50aGVtZTtcblxuICAgICAgaWYgKGxldmVsICE9PSAxIHx8IG1vZGUgIT09ICdob3Jpem9udGFsJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gLy8gcHV0IGFsbCB0aGUgb3ZlcmZsb3dlZCBpdGVtIGluc2lkZSBhIHN1Ym1lbnVcbiAgICAgIC8vIHdpdGggYSB0aXRsZSBvZiBvdmVyZmxvdyBpbmRpY2F0b3IgKCcuLi4nKVxuXG5cbiAgICAgIHZhciBjb3B5ID0gX3RoaXMucHJvcHMuY2hpbGRyZW5bMF07XG4gICAgICB2YXIgX2NvcHkkcHJvcHMgPSBjb3B5LnByb3BzLFxuICAgICAgICAgIHRocm93QXdheSA9IF9jb3B5JHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIHRpdGxlID0gX2NvcHkkcHJvcHMudGl0bGUsXG4gICAgICAgICAgcHJvcFN0eWxlID0gX2NvcHkkcHJvcHMuc3R5bGUsXG4gICAgICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF9jb3B5JHByb3BzLCBbXCJjaGlsZHJlblwiLCBcInRpdGxlXCIsIFwic3R5bGVcIl0pO1xuICAgICAgdmFyIHN0eWxlID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwcm9wU3R5bGUpO1xuICAgICAgdmFyIGtleSA9IFwiXCIuY29uY2F0KGtleVByZWZpeCwgXCItb3ZlcmZsb3dlZC1pbmRpY2F0b3JcIik7XG4gICAgICB2YXIgZXZlbnRLZXkgPSBcIlwiLmNvbmNhdChrZXlQcmVmaXgsIFwiLW92ZXJmbG93ZWQtaW5kaWNhdG9yXCIpO1xuXG4gICAgICBpZiAob3ZlcmZsb3dlZEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiByZW5kZXJQbGFjZWhvbGRlciAhPT0gdHJ1ZSkge1xuICAgICAgICBzdHlsZSA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHJlbmRlclBsYWNlaG9sZGVyKSB7XG4gICAgICAgIHN0eWxlID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgICAgIC8vIHByZXZlbnQgZnJvbSB0YWtpbmcgbm9ybWFsIGRvbSBzcGFjZVxuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgICAgIH0pO1xuICAgICAgICBrZXkgPSBcIlwiLmNvbmNhdChrZXksIFwiLXBsYWNlaG9sZGVyXCIpO1xuICAgICAgICBldmVudEtleSA9IFwiXCIuY29uY2F0KGV2ZW50S2V5LCBcIi1wbGFjZWhvbGRlclwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcHVwQ2xhc3NOYW1lID0gdGhlbWUgPyBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodGhlbWUpIDogJyc7XG4gICAgICB2YXIgcHJvcHMgPSB7fTtcblxuICAgICAgX3V0aWwubWVudUFsbFByb3BzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgaWYgKHJlc3Rba10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHByb3BzW2tdID0gcmVzdFtrXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9TdWJNZW51LmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICB0aXRsZTogb3ZlcmZsb3dlZEluZGljYXRvcixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW92ZXJmbG93ZWQtc3VibWVudVwiKSxcbiAgICAgICAgcG9wdXBDbGFzc05hbWU6IHBvcHVwQ2xhc3NOYW1lXG4gICAgICB9LCBwcm9wcywge1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgZXZlbnRLZXk6IGV2ZW50S2V5LFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSksIG92ZXJmbG93ZWRJdGVtcyk7XG4gICAgfTsgLy8gbWVtb3JpemUgcmVuZGVyZWQgbWVudVNpemVcblxuXG4gICAgX3RoaXMuc2V0Q2hpbGRyZW5XaWR0aEFuZFJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5tb2RlICE9PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpKTtcblxuICAgICAgaWYgKCF1bCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB1bENoaWxkcmVuTm9kZXMgPSB1bC5jaGlsZHJlbjtcblxuICAgICAgaWYgKCF1bENoaWxkcmVuTm9kZXMgfHwgdWxDaGlsZHJlbk5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBsYXN0T3ZlcmZsb3dlZEluZGljYXRvclBsYWNlaG9sZGVyID0gdWwuY2hpbGRyZW5bdWxDaGlsZHJlbk5vZGVzLmxlbmd0aCAtIDFdOyAvLyBuZWVkIGxhc3Qgb3ZlcmZsb3dlZCBpbmRpY2F0b3IgZm9yIGNhbGN1bGF0aW5nIGxlbmd0aDtcblxuICAgICAgKDAsIF91dGlsLnNldFN0eWxlKShsYXN0T3ZlcmZsb3dlZEluZGljYXRvclBsYWNlaG9sZGVyLCAnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTtcblxuICAgICAgdmFyIG1lbnVJdGVtTm9kZXMgPSBfdGhpcy5nZXRNZW51SXRlbU5vZGVzKCk7IC8vIHJlc2V0IGRpc3BsYXkgYXR0cmlidXRlIGZvciBhbGwgaGlkZGVuIGVsZW1lbnRzIGNhdXNlZCBieSBvdmVyZmxvdyB0byBjYWxjdWxhdGUgdXBkYXRlZCB3aWR0aFxuICAgICAgLy8gYW5kIHRoZW4gcmVzZXQgdG8gb3JpZ2luYWwgc3RhdGUgYWZ0ZXIgd2lkdGggY2FsY3VsYXRpb25cblxuXG4gICAgICB2YXIgb3ZlcmZsb3dlZEl0ZW1zID0gbWVudUl0ZW1Ob2Rlcy5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGMuY2xhc3NOYW1lLnNwbGl0KCcgJykuaW5kZXhPZihNRU5VSVRFTV9PVkVSRkxPV0VEX0NMQVNTTkFNRSkgPj0gMDtcbiAgICAgIH0pO1xuICAgICAgb3ZlcmZsb3dlZEl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgKDAsIF91dGlsLnNldFN0eWxlKShjLCAnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTtcbiAgICAgIH0pO1xuICAgICAgX3RoaXMubWVudUl0ZW1TaXplcyA9IG1lbnVJdGVtTm9kZXMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWwuZ2V0V2lkdGgpKGMsIHRydWUpO1xuICAgICAgfSk7XG4gICAgICBvdmVyZmxvd2VkSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICAoMCwgX3V0aWwuc2V0U3R5bGUpKGMsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH0pO1xuICAgICAgX3RoaXMub3ZlcmZsb3dlZEluZGljYXRvcldpZHRoID0gKDAsIF91dGlsLmdldFdpZHRoKSh1bC5jaGlsZHJlblt1bC5jaGlsZHJlbi5sZW5ndGggLSAxXSwgdHJ1ZSk7XG4gICAgICBfdGhpcy5vcmlnaW5hbFRvdGFsV2lkdGggPSBfdGhpcy5tZW51SXRlbVNpemVzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjdXIpIHtcbiAgICAgICAgcmV0dXJuIGFjYyArIGN1cjtcbiAgICAgIH0sIDApO1xuXG4gICAgICBfdGhpcy5oYW5kbGVSZXNpemUoKTsgLy8gcHJldmVudCB0aGUgb3ZlcmZsb3dlZCBpbmRpY2F0b3IgZnJvbSB0YWtpbmcgc3BhY2U7XG5cblxuICAgICAgKDAsIF91dGlsLnNldFN0eWxlKShsYXN0T3ZlcmZsb3dlZEluZGljYXRvclBsYWNlaG9sZGVyLCAnZGlzcGxheScsICdub25lJyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5tb2RlICE9PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpKTtcblxuICAgICAgaWYgKCF1bCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB3aWR0aCA9ICgwLCBfdXRpbC5nZXRXaWR0aCkodWwpO1xuICAgICAgX3RoaXMub3ZlcmZsb3dlZEl0ZW1zID0gW107XG4gICAgICB2YXIgY3VycmVudFN1bVdpZHRoID0gMDsgLy8gaW5kZXggZm9yIGxhc3QgdmlzaWJsZSBjaGlsZCBpbiBob3Jpem9udGFsIG1vZGVcblxuICAgICAgdmFyIGxhc3RWaXNpYmxlSW5kZXg7IC8vIGZsb2F0IG51bWJlciBjb21wYXJpc29uIGNvdWxkIGJlIHByb2JsZW1hdGljXG4gICAgICAvLyBlLmcuIDAuMSArIDAuMiA+IDAuMyA9PT09PT4gdHJ1ZVxuICAgICAgLy8gdGh1cyB1c2luZyBGTE9BVF9QUkVDSVNJT05fQURKVVNUIGFzIGJ1ZmZlciB0byBoZWxwIHRoZSBzaXR1YXRpb25cblxuICAgICAgaWYgKF90aGlzLm9yaWdpbmFsVG90YWxXaWR0aCA+IHdpZHRoICsgRkxPQVRfUFJFQ0lTSU9OX0FESlVTVCkge1xuICAgICAgICBsYXN0VmlzaWJsZUluZGV4ID0gLTE7XG5cbiAgICAgICAgX3RoaXMubWVudUl0ZW1TaXplcy5mb3JFYWNoKGZ1bmN0aW9uIChsaVdpZHRoKSB7XG4gICAgICAgICAgY3VycmVudFN1bVdpZHRoICs9IGxpV2lkdGg7XG5cbiAgICAgICAgICBpZiAoY3VycmVudFN1bVdpZHRoICsgX3RoaXMub3ZlcmZsb3dlZEluZGljYXRvcldpZHRoIDw9IHdpZHRoKSB7XG4gICAgICAgICAgICBsYXN0VmlzaWJsZUluZGV4ICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBsYXN0VmlzaWJsZUluZGV4OiBsYXN0VmlzaWJsZUluZGV4XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoRE9NV3JhcCwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5zZXRDaGlsZHJlbldpZHRoQW5kUmVzaXplKCk7XG5cbiAgICAgIGlmICh0aGlzLnByb3BzLmxldmVsID09PSAxICYmIHRoaXMucHJvcHMubW9kZSA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgIHZhciBtZW51VWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzKTtcblxuICAgICAgICBpZiAoIW1lbnVVbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgX3Jlc2l6ZU9ic2VydmVyUG9seWZpbGwuZGVmYXVsdChmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY2FuY2VsRnJhbWVJZCA9IF90aGlzMi5jYW5jZWxGcmFtZUlkO1xuICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoY2FuY2VsRnJhbWVJZCk7XG4gICAgICAgICAgICBfdGhpczIuY2FuY2VsRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShfdGhpczIuc2V0Q2hpbGRyZW5XaWR0aEFuZFJlc2l6ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5zbGljZS5jYWxsKG1lbnVVbC5jaGlsZHJlbikuY29uY2F0KG1lbnVVbCkuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICBfdGhpczIucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpczIucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXG4gICAgICAgICAgICBbXS5zbGljZS5jYWxsKG1lbnVVbC5jaGlsZHJlbikuY29uY2F0KG1lbnVVbCkuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWwpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIF90aGlzMi5zZXRDaGlsZHJlbldpZHRoQW5kUmVzaXplKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUobWVudVVsLCB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBmYWxzZSxcbiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YlRyZWU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmNhbmNlbEZyYW1lSWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJDaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJDaGlsZHJlbihjaGlsZHJlbikge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIC8vIG5lZWQgdG8gdGFrZSBjYXJlIG9mIG92ZXJmbG93ZWQgaXRlbXMgaW4gaG9yaXpvbnRhbCBtb2RlXG4gICAgICB2YXIgbGFzdFZpc2libGVJbmRleCA9IHRoaXMuc3RhdGUubGFzdFZpc2libGVJbmRleDtcbiAgICAgIHJldHVybiAoY2hpbGRyZW4gfHwgW10pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjaGlsZE5vZGUsIGluZGV4KSB7XG4gICAgICAgIHZhciBpdGVtID0gY2hpbGROb2RlO1xuXG4gICAgICAgIGlmIChfdGhpczMucHJvcHMubW9kZSA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgdmFyIG92ZXJmbG93ZWQgPSBfdGhpczMuZ2V0T3ZlcmZsb3dlZFN1Yk1lbnVJdGVtKGNoaWxkTm9kZS5wcm9wcy5ldmVudEtleSwgW10pO1xuXG4gICAgICAgICAgaWYgKGxhc3RWaXNpYmxlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBfdGhpczMucHJvcHMuY2xhc3NOYW1lLmluZGV4T2YoXCJcIi5jb25jYXQoX3RoaXMzLnByb3BzLnByZWZpeENscywgXCItcm9vdFwiKSkgIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiBsYXN0VmlzaWJsZUluZGV4KSB7XG4gICAgICAgICAgICAgIGl0ZW0gPSBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGROb2RlLCAvLyDov5nph4zkv67mlLkgZXZlbnRLZXkg5piv5Li65LqG6Ziy5q2i6ZqQ6JeP54q25oCB5LiL6L+Y5Lya6Kem5Y+RIG9wZW5rZXlzIOS6i+S7tlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXZlbnRLZXk6IFwiXCIuY29uY2F0KGNoaWxkTm9kZS5wcm9wcy5ldmVudEtleSwgXCItaGlkZGVuXCIpLFxuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogTGVnYWN5IGNvZGUuIEhlcmUgYGNsYXNzTmFtZWAgbmV2ZXIgdXNlZDpcbiAgICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L21lbnUvY29tbWl0LzRjZDZiNDlmY2U5ZDExNjcyNmY0ZWEwMGRkYTg1MzI1ZDZmMjY1MDAjZGlmZi1lMmZhNDhmNzVjMmRkMjMxODI5NWNkZTQyODU1NmE3NlIyNDBcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KE1FTlVJVEVNX09WRVJGTE9XRURfQ0xBU1NOQU1FKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBsYXN0VmlzaWJsZUluZGV4ICsgMSkge1xuICAgICAgICAgICAgICBfdGhpczMub3ZlcmZsb3dlZEl0ZW1zID0gY2hpbGRyZW4uc2xpY2UobGFzdFZpc2libGVJbmRleCArIDEpLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoYywgLy8gY2hpbGRyZW5baW5kZXhdLmtleSB3aWxsIGJlY29tZSAnLiRrZXknIGluIGNsb25lIGJ5IGRlZmF1bHQsXG4gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBvdmVyd3JpdGUgd2l0aCB0aGUgY29ycmVjdCBrZXkgZXhwbGljaXRseVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogYy5wcm9wcy5ldmVudEtleSxcbiAgICAgICAgICAgICAgICAgIG1vZGU6ICd2ZXJ0aWNhbC1sZWZ0J1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgb3ZlcmZsb3dlZCA9IF90aGlzMy5nZXRPdmVyZmxvd2VkU3ViTWVudUl0ZW0oY2hpbGROb2RlLnByb3BzLmV2ZW50S2V5LCBfdGhpczMub3ZlcmZsb3dlZEl0ZW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcmV0ID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGFjYyksIFtvdmVyZmxvd2VkLCBpdGVtXSk7XG5cbiAgICAgICAgICBpZiAoaW5kZXggPT09IGNoaWxkcmVuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIC8vIG5lZWQgYSBwbGFjZWhvbGRlciBmb3IgY2FsY3VsYXRpbmcgb3ZlcmZsb3dlZCBpbmRpY2F0b3Igd2lkdGhcbiAgICAgICAgICAgIHJldC5wdXNoKF90aGlzMy5nZXRPdmVyZmxvd2VkU3ViTWVudUl0ZW0oY2hpbGROb2RlLnByb3BzLmV2ZW50S2V5LCBbXSwgdHJ1ZSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGFjYyksIFtpdGVtXSk7XG4gICAgICB9LCBbXSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB2aXNpYmxlID0gX3RoaXMkcHJvcHMyLnZpc2libGUsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgICBvdmVyZmxvd2VkSW5kaWNhdG9yID0gX3RoaXMkcHJvcHMyLm92ZXJmbG93ZWRJbmRpY2F0b3IsXG4gICAgICAgICAgbW9kZSA9IF90aGlzJHByb3BzMi5tb2RlLFxuICAgICAgICAgIGxldmVsID0gX3RoaXMkcHJvcHMyLmxldmVsLFxuICAgICAgICAgIHRhZyA9IF90aGlzJHByb3BzMi50YWcsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczIuY2hpbGRyZW4sXG4gICAgICAgICAgdGhlbWUgPSBfdGhpcyRwcm9wczIudGhlbWUsXG4gICAgICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF90aGlzJHByb3BzMiwgW1widmlzaWJsZVwiLCBcInByZWZpeENsc1wiLCBcIm92ZXJmbG93ZWRJbmRpY2F0b3JcIiwgXCJtb2RlXCIsIFwibGV2ZWxcIiwgXCJ0YWdcIiwgXCJjaGlsZHJlblwiLCBcInRoZW1lXCJdKTtcbiAgICAgIHZhciBUYWcgPSB0YWc7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChUYWcsIE9iamVjdC5hc3NpZ24oe30sIHJlc3QpLCB0aGlzLnJlbmRlckNoaWxkcmVuKGNoaWxkcmVuKSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBET01XcmFwO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5ET01XcmFwLmRlZmF1bHRQcm9wcyA9IHtcbiAgdGFnOiAnZGl2JyxcbiAgY2xhc3NOYW1lOiAnJ1xufTtcbnZhciBfZGVmYXVsdCA9IERPTVdyYXA7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIERpdmlkZXIgPSBmdW5jdGlvbiBEaXZpZGVyKF9yZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgcm9vdFByZWZpeENscyA9IF9yZWYucm9vdFByZWZpeENscyxcbiAgICAgIHN0eWxlID0gX3JlZi5zdHlsZTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjbGFzc05hbWUsIFwiIFwiKS5jb25jYXQocm9vdFByZWZpeENscywgXCItaXRlbS1kaXZpZGVyXCIpLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9KTtcbn07XG5cbkRpdmlkZXIuZGVmYXVsdFByb3BzID0ge1xuICAvLyBUbyBmaXgga2V5Ym9hcmQgVVguXG4gIGRpc2FibGVkOiB0cnVlLFxuICBjbGFzc05hbWU6ICcnLFxuICBzdHlsZToge31cbn07XG52YXIgX2RlZmF1bHQgPSBEaXZpZGVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfbWluaVN0b3JlID0gcmVxdWlyZShcIm1pbmktc3RvcmVcIik7XG5cbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm9taXQuanNcIikpO1xuXG52YXIgX1N1YlBvcHVwTWVudSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1N1YlBvcHVwTWVudVwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbnZhciBfbGVnYWN5VXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL2xlZ2FjeVV0aWxcIik7XG5cbnZhciBNZW51ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKE1lbnUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShNZW51KTtcblxuICBmdW5jdGlvbiBNZW51KHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgTWVudSk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgX3RoaXMuaW5saW5lT3BlbktleXMgPSBbXTtcblxuICAgIF90aGlzLm9uU2VsZWN0ID0gZnVuY3Rpb24gKHNlbGVjdEluZm8pIHtcbiAgICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemUgPSAoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpLFxuICAgICAgICAgIHByb3BzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMuc2VsZWN0YWJsZSkge1xuICAgICAgICAvLyByb290IG1lbnVcbiAgICAgICAgdmFyIF90aGlzJHN0b3JlJGdldFN0YXRlID0gX3RoaXMuc3RvcmUuZ2V0U3RhdGUoKSxcbiAgICAgICAgICAgIF9zZWxlY3RlZEtleXMgPSBfdGhpcyRzdG9yZSRnZXRTdGF0ZS5zZWxlY3RlZEtleXM7XG5cbiAgICAgICAgdmFyIHNlbGVjdGVkS2V5ID0gc2VsZWN0SW5mby5rZXk7XG5cbiAgICAgICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgICAgX3NlbGVjdGVkS2V5cyA9IF9zZWxlY3RlZEtleXMuY29uY2F0KFtzZWxlY3RlZEtleV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9zZWxlY3RlZEtleXMgPSBbc2VsZWN0ZWRLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEoJ3NlbGVjdGVkS2V5cycgaW4gcHJvcHMpKSB7XG4gICAgICAgICAgX3RoaXMuc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRLZXlzOiBfc2VsZWN0ZWRLZXlzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9wcy5vblNlbGVjdCgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzZWxlY3RJbmZvKSwge30sIHtcbiAgICAgICAgICBzZWxlY3RlZEtleXM6IF9zZWxlY3RlZEtleXNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbkNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBtb2RlID0gX3RoaXMuZ2V0UmVhbE1lbnVNb2RlKCk7XG5cbiAgICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemUyID0gKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKSxcbiAgICAgICAgICBzdG9yZSA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZTIuc3RvcmUsXG4gICAgICAgICAgb25PcGVuQ2hhbmdlID0gX2Fzc2VydFRoaXNJbml0aWFsaXplMi5wcm9wcy5vbk9wZW5DaGFuZ2U7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnaW5saW5lJyAmJiAhKCdvcGVuS2V5cycgaW4gX3RoaXMucHJvcHMpKSB7XG4gICAgICAgIC8vIGNsb3NpbmcgdmVydGljYWwgcG9wdXAgc3VibWVudSBhZnRlciBjbGljayBpdFxuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlbktleXM6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICBvbk9wZW5DaGFuZ2UoW10pO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5wcm9wcy5vbkNsaWNrKGUpO1xuICAgIH07IC8vIG9uS2V5RG93biBuZWVkcyB0byBiZSBleHBvc2VkIGFzIGEgaW5zdGFuY2UgbWV0aG9kXG4gICAgLy8gZS5nLiwgaW4gcmMtc2VsZWN0LCB3ZSBuZWVkIHRvIG5hdmlnYXRlIG1lbnUgaXRlbSB3aGlsZVxuICAgIC8vIGN1cnJlbnQgYWN0aXZlIGl0ZW0gaXMgcmMtc2VsZWN0IGlucHV0IGJveCByYXRoZXIgdGhhbiB0aGUgbWVudSBpdHNlbGZcblxuXG4gICAgX3RoaXMub25LZXlEb3duID0gZnVuY3Rpb24gKGUsIGNhbGxiYWNrKSB7XG4gICAgICBfdGhpcy5pbm5lck1lbnUuZ2V0V3JhcHBlZEluc3RhbmNlKCkub25LZXlEb3duKGUsIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25PcGVuQ2hhbmdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplMyA9ICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcyksXG4gICAgICAgICAgcHJvcHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUzLnByb3BzO1xuXG4gICAgICB2YXIgb3BlbktleXMgPSBfdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLm9wZW5LZXlzLmNvbmNhdCgpO1xuXG4gICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICB2YXIgcHJvY2Vzc1NpbmdsZSA9IGZ1bmN0aW9uIHByb2Nlc3NTaW5nbGUoZSkge1xuICAgICAgICB2YXIgb25lQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChlLm9wZW4pIHtcbiAgICAgICAgICBvbmVDaGFuZ2VkID0gb3BlbktleXMuaW5kZXhPZihlLmtleSkgPT09IC0xO1xuXG4gICAgICAgICAgaWYgKG9uZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIG9wZW5LZXlzLnB1c2goZS5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgaW5kZXggPSBvcGVuS2V5cy5pbmRleE9mKGUua2V5KTtcbiAgICAgICAgICBvbmVDaGFuZ2VkID0gaW5kZXggIT09IC0xO1xuXG4gICAgICAgICAgaWYgKG9uZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIG9wZW5LZXlzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgb25lQ2hhbmdlZDtcbiAgICAgIH07XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuICAgICAgICAvLyBiYXRjaCBjaGFuZ2UgY2FsbFxuICAgICAgICBldmVudC5mb3JFYWNoKHByb2Nlc3NTaW5nbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc1NpbmdsZShldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGlmICghKCdvcGVuS2V5cycgaW4gX3RoaXMucHJvcHMpKSB7XG4gICAgICAgICAgX3RoaXMuc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgb3BlbktleXM6IG9wZW5LZXlzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9wcy5vbk9wZW5DaGFuZ2Uob3BlbktleXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbkRlc2VsZWN0ID0gZnVuY3Rpb24gKHNlbGVjdEluZm8pIHtcbiAgICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemU0ID0gKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKSxcbiAgICAgICAgICBwcm9wcyA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZTQucHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgIHZhciBfc2VsZWN0ZWRLZXlzMiA9IF90aGlzLnN0b3JlLmdldFN0YXRlKCkuc2VsZWN0ZWRLZXlzLmNvbmNhdCgpO1xuXG4gICAgICAgIHZhciBzZWxlY3RlZEtleSA9IHNlbGVjdEluZm8ua2V5O1xuXG4gICAgICAgIHZhciBpbmRleCA9IF9zZWxlY3RlZEtleXMyLmluZGV4T2Yoc2VsZWN0ZWRLZXkpO1xuXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBfc2VsZWN0ZWRLZXlzMi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEoJ3NlbGVjdGVkS2V5cycgaW4gcHJvcHMpKSB7XG4gICAgICAgICAgX3RoaXMuc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRLZXlzOiBfc2VsZWN0ZWRLZXlzMlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvcHMub25EZXNlbGVjdCgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzZWxlY3RJbmZvKSwge30sIHtcbiAgICAgICAgICBzZWxlY3RlZEtleXM6IF9zZWxlY3RlZEtleXMyXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9OyAvLyBSZXN0b3JlIHZlcnRpY2FsIG1vZGUgd2hlbiBtZW51IGlzIGNvbGxhcHNlZCByZXNwb25zaXZlbHkgd2hlbiBtb3VudGVkXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTMxMDRcbiAgICAvLyBUT0RPOiBub3QgYSBwZXJmZWN0IHNvbHV0aW9uLFxuICAgIC8vIGxvb2tpbmcgYSBuZXcgd2F5IHRvIGF2b2lkIHNldHRpbmcgc3dpdGNoaW5nTW9kZUZyb21JbmxpbmUgaW4gdGhpcyBzaXR1YXRpb25cblxuXG4gICAgX3RoaXMub25Nb3VzZUVudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLnJlc3RvcmVNb2RlVmVydGljYWxGcm9tSW5saW5lKCk7XG5cbiAgICAgIHZhciBvbk1vdXNlRW50ZXIgPSBfdGhpcy5wcm9wcy5vbk1vdXNlRW50ZXI7XG5cbiAgICAgIGlmIChvbk1vdXNlRW50ZXIpIHtcbiAgICAgICAgb25Nb3VzZUVudGVyKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vblRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gd2hlbiBpbmxpbmVDb2xsYXBzZWQgbWVudSB3aWR0aCBhbmltYXRpb24gZmluaXNoZWRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzEyODY0XG4gICAgICB2YXIgd2lkdGhDb2xsYXBzZWQgPSBlLnByb3BlcnR5TmFtZSA9PT0gJ3dpZHRoJyAmJiBlLnRhcmdldCA9PT0gZS5jdXJyZW50VGFyZ2V0OyAvLyBGaXggU1ZHRWxlbWVudCBlLnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZiBpcyBub3QgYSBmdW5jdGlvblxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTU2OTlcblxuICAgICAgdmFyIGNsYXNzTmFtZSA9IGUudGFyZ2V0LmNsYXNzTmFtZTsgLy8gU1ZHQW5pbWF0ZWRTdHJpbmcuYW5pbVZhbCBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIFNWR0FuaW1hdGVkU3RyaW5nLmJhc2VWYWwsXG4gICAgICAvLyB1bmxlc3MgZHVyaW5nIGFuIGFuaW1hdGlvbi5cblxuICAgICAgdmFyIGNsYXNzTmFtZVZhbHVlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNsYXNzTmFtZSkgPT09ICdbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXScgPyBjbGFzc05hbWUuYW5pbVZhbCA6IGNsYXNzTmFtZTsgLy8gRml4IGZvciA8TWVudSBzdHlsZT17eyB3aWR0aDogJzEwMCUnIH19IC8+LFxuICAgICAgLy8gdGhlIHdpZHRoIHRyYW5zaXRpb24gd29uJ3QgdHJpZ2dlciB3aGVuIG1lbnUgaXMgY29sbGFwc2VkXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduLXByby9pc3N1ZXMvMjc4M1xuXG4gICAgICB2YXIgaWNvblNjYWxlZCA9IGUucHJvcGVydHlOYW1lID09PSAnZm9udC1zaXplJyAmJiBjbGFzc05hbWVWYWx1ZS5pbmRleE9mKCdhbnRpY29uJykgPj0gMDtcblxuICAgICAgaWYgKHdpZHRoQ29sbGFwc2VkIHx8IGljb25TY2FsZWQpIHtcbiAgICAgICAgX3RoaXMucmVzdG9yZU1vZGVWZXJ0aWNhbEZyb21JbmxpbmUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuc2V0SW5uZXJNZW51ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLmlubmVyTWVudSA9IG5vZGU7XG4gICAgfTtcblxuICAgIF90aGlzLmlzUm9vdE1lbnUgPSB0cnVlO1xuICAgIHZhciBzZWxlY3RlZEtleXMgPSBwcm9wcy5kZWZhdWx0U2VsZWN0ZWRLZXlzO1xuICAgIHZhciBvcGVuS2V5cyA9IHByb3BzLmRlZmF1bHRPcGVuS2V5cztcblxuICAgIGlmICgnc2VsZWN0ZWRLZXlzJyBpbiBwcm9wcykge1xuICAgICAgc2VsZWN0ZWRLZXlzID0gcHJvcHMuc2VsZWN0ZWRLZXlzIHx8IFtdO1xuICAgIH1cblxuICAgIGlmICgnb3BlbktleXMnIGluIHByb3BzKSB7XG4gICAgICBvcGVuS2V5cyA9IHByb3BzLm9wZW5LZXlzIHx8IFtdO1xuICAgIH1cblxuICAgIF90aGlzLnN0b3JlID0gKDAsIF9taW5pU3RvcmUuY3JlYXRlKSh7XG4gICAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5cyxcbiAgICAgIG9wZW5LZXlzOiBvcGVuS2V5cyxcbiAgICAgIGFjdGl2ZUtleToge1xuICAgICAgICAnMC1tZW51LSc6ICgwLCBfU3ViUG9wdXBNZW51LmdldEFjdGl2ZUtleSkocHJvcHMsIHByb3BzLmFjdGl2ZUtleSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHN3aXRjaGluZ01vZGVGcm9tSW5saW5lOiBmYWxzZVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoTWVudSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1pbmlTdG9yZSgpO1xuICAgICAgdGhpcy51cGRhdGVNZW51RGlzcGxheSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdGhpcy51cGRhdGVPcGVudEtleXNXaGVuU3dpdGNoTW9kZShwcmV2UHJvcHMpO1xuICAgICAgdGhpcy51cGRhdGVNaW5pU3RvcmUoKTtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgc2lkZXJDb2xsYXBzZWQgPSBfdGhpcyRwcm9wcy5zaWRlckNvbGxhcHNlZCxcbiAgICAgICAgICBpbmxpbmVDb2xsYXBzZWQgPSBfdGhpcyRwcm9wcy5pbmxpbmVDb2xsYXBzZWQsXG4gICAgICAgICAgb25PcGVuQ2hhbmdlID0gX3RoaXMkcHJvcHMub25PcGVuQ2hhbmdlO1xuXG4gICAgICBpZiAoIXByZXZQcm9wcy5pbmxpbmVDb2xsYXBzZWQgJiYgaW5saW5lQ29sbGFwc2VkIHx8ICFwcmV2UHJvcHMuc2lkZXJDb2xsYXBzZWQgJiYgc2lkZXJDb2xsYXBzZWQpIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKFtdKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVNZW51RGlzcGxheSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVPcGVudEtleXNXaGVuU3dpdGNoTW9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVPcGVudEtleXNXaGVuU3dpdGNoTW9kZShwcmV2UHJvcHMpIHtcbiAgICAgIHZhciBuZXh0UHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHN0b3JlID0gdGhpcy5zdG9yZSxcbiAgICAgICAgICBpbmxpbmVPcGVuS2V5cyA9IHRoaXMuaW5saW5lT3BlbktleXM7XG4gICAgICB2YXIgcHJldlN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IHt9O1xuXG4gICAgICBpZiAocHJldlByb3BzLm1vZGUgPT09ICdpbmxpbmUnICYmIG5leHRQcm9wcy5tb2RlICE9PSAnaW5saW5lJykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzd2l0Y2hpbmdNb2RlRnJvbUlubGluZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoJ29wZW5LZXlzJyBpbiBuZXh0UHJvcHMpKSB7XG4gICAgICAgIC8vIFtMZWdhY3ldIE9sZCBjb2RlIHdpbGwgcmV0dXJuIGFmdGVyIGBvcGVuS2V5c2AgY2hhbmdlZC5cbiAgICAgICAgLy8gTm90IHN1cmUgdGhlIHJlYXNvbiwgd2Ugc2hvdWxkIGtlZXAgdGhpcyBsb2dpYyBzdGlsbC5cbiAgICAgICAgaWYgKG5leHRQcm9wcy5pbmxpbmVDb2xsYXBzZWQgJiYgIXByZXZQcm9wcy5pbmxpbmVDb2xsYXBzZWQgfHwgbmV4dFByb3BzLnNpZGVyQ29sbGFwc2VkICYmICFwcmV2UHJvcHMuc2lkZXJDb2xsYXBzZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHN3aXRjaGluZ01vZGVGcm9tSW5saW5lOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5pbmxpbmVPcGVuS2V5cyA9IHByZXZTdGF0ZS5vcGVuS2V5cy5jb25jYXQoKTtcbiAgICAgICAgICBuZXdTdGF0ZS5vcGVuS2V5cyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXh0UHJvcHMuaW5saW5lQ29sbGFwc2VkICYmIHByZXZQcm9wcy5pbmxpbmVDb2xsYXBzZWQgfHwgIW5leHRQcm9wcy5zaWRlckNvbGxhcHNlZCAmJiBwcmV2UHJvcHMuc2lkZXJDb2xsYXBzZWQpIHtcbiAgICAgICAgICBuZXdTdGF0ZS5vcGVuS2V5cyA9IGlubGluZU9wZW5LZXlzO1xuICAgICAgICAgIHRoaXMuaW5saW5lT3BlbktleXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmtleXMobmV3U3RhdGUpLmxlbmd0aCkge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZU1lbnVEaXNwbGF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZU1lbnVEaXNwbGF5KCkge1xuICAgICAgdmFyIGNvbGxhcHNlZFdpZHRoID0gdGhpcy5wcm9wcy5jb2xsYXBzZWRXaWR0aCxcbiAgICAgICAgICBzdG9yZSA9IHRoaXMuc3RvcmUsXG4gICAgICAgICAgcHJldk9wZW5LZXlzID0gdGhpcy5wcmV2T3BlbktleXM7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzg1ODdcblxuICAgICAgdmFyIGhpZGVNZW51ID0gdGhpcy5nZXRJbmxpbmVDb2xsYXBzZWQoKSAmJiAoY29sbGFwc2VkV2lkdGggPT09IDAgfHwgY29sbGFwc2VkV2lkdGggPT09ICcwJyB8fCBjb2xsYXBzZWRXaWR0aCA9PT0gJzBweCcpO1xuXG4gICAgICBpZiAoaGlkZU1lbnUpIHtcbiAgICAgICAgdGhpcy5wcmV2T3BlbktleXMgPSBzdG9yZS5nZXRTdGF0ZSgpLm9wZW5LZXlzLmNvbmNhdCgpO1xuICAgICAgICB0aGlzLnN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICBvcGVuS2V5czogW11cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByZXZPcGVuS2V5cykge1xuICAgICAgICB0aGlzLnN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICBvcGVuS2V5czogcHJldk9wZW5LZXlzXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByZXZPcGVuS2V5cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFJlYWxNZW51TW9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZWFsTWVudU1vZGUoKSB7XG4gICAgICB2YXIgbW9kZSA9IHRoaXMucHJvcHMubW9kZTtcbiAgICAgIHZhciBzd2l0Y2hpbmdNb2RlRnJvbUlubGluZSA9IHRoaXMuc3RhdGUuc3dpdGNoaW5nTW9kZUZyb21JbmxpbmU7XG4gICAgICB2YXIgaW5saW5lQ29sbGFwc2VkID0gdGhpcy5nZXRJbmxpbmVDb2xsYXBzZWQoKTtcblxuICAgICAgaWYgKHN3aXRjaGluZ01vZGVGcm9tSW5saW5lICYmIGlubGluZUNvbGxhcHNlZCkge1xuICAgICAgICByZXR1cm4gJ2lubGluZSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbmxpbmVDb2xsYXBzZWQgPyAndmVydGljYWwnIDogbW9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SW5saW5lQ29sbGFwc2VkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldElubGluZUNvbGxhcHNlZCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGlubGluZUNvbGxhcHNlZCA9IF90aGlzJHByb3BzMi5pbmxpbmVDb2xsYXBzZWQsXG4gICAgICAgICAgc2lkZXJDb2xsYXBzZWQgPSBfdGhpcyRwcm9wczIuc2lkZXJDb2xsYXBzZWQ7XG5cbiAgICAgIGlmIChzaWRlckNvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzaWRlckNvbGxhcHNlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlubGluZUNvbGxhcHNlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzdG9yZU1vZGVWZXJ0aWNhbEZyb21JbmxpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzdG9yZU1vZGVWZXJ0aWNhbEZyb21JbmxpbmUoKSB7XG4gICAgICB2YXIgc3dpdGNoaW5nTW9kZUZyb21JbmxpbmUgPSB0aGlzLnN0YXRlLnN3aXRjaGluZ01vZGVGcm9tSW5saW5lO1xuXG4gICAgICBpZiAoc3dpdGNoaW5nTW9kZUZyb21JbmxpbmUpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc3dpdGNoaW5nTW9kZUZyb21JbmxpbmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVNaW5pU3RvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlTWluaVN0b3JlKCkge1xuICAgICAgaWYgKCdzZWxlY3RlZEtleXMnIGluIHRoaXMucHJvcHMpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRLZXlzOiB0aGlzLnByb3BzLnNlbGVjdGVkS2V5cyB8fCBbXVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCdvcGVuS2V5cycgaW4gdGhpcy5wcm9wcykge1xuICAgICAgICB0aGlzLnN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICBvcGVuS2V5czogdGhpcy5wcm9wcy5vcGVuS2V5cyB8fCBbXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBwcm9wcyA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgKDAsIF9vbWl0LmRlZmF1bHQpKHRoaXMucHJvcHMsIFsnY29sbGFwc2VkV2lkdGgnLCAnc2lkZXJDb2xsYXBzZWQnLCAnZGVmYXVsdE1vdGlvbnMnXSkpO1xuICAgICAgdmFyIG1vZGUgPSB0aGlzLmdldFJlYWxNZW51TW9kZSgpO1xuICAgICAgcHJvcHMuY2xhc3NOYW1lICs9IFwiIFwiLmNvbmNhdChwcm9wcy5wcmVmaXhDbHMsIFwiLXJvb3RcIik7XG5cbiAgICAgIGlmIChwcm9wcy5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICAgIHByb3BzLmNsYXNzTmFtZSArPSBcIiBcIi5jb25jYXQocHJvcHMucHJlZml4Q2xzLCBcIi1ydGxcIik7XG4gICAgICB9XG5cbiAgICAgIHByb3BzID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgcHJvcHMpLCB7fSwge1xuICAgICAgICBtb2RlOiBtb2RlLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLm9uQ2xpY2ssXG4gICAgICAgIG9uT3BlbkNoYW5nZTogdGhpcy5vbk9wZW5DaGFuZ2UsXG4gICAgICAgIG9uRGVzZWxlY3Q6IHRoaXMub25EZXNlbGVjdCxcbiAgICAgICAgb25TZWxlY3Q6IHRoaXMub25TZWxlY3QsXG4gICAgICAgIG9uTW91c2VFbnRlcjogdGhpcy5vbk1vdXNlRW50ZXIsXG4gICAgICAgIG9uVHJhbnNpdGlvbkVuZDogdGhpcy5vblRyYW5zaXRpb25FbmQsXG4gICAgICAgIHBhcmVudE1lbnU6IHRoaXMsXG4gICAgICAgIG1vdGlvbjogKDAsIF9sZWdhY3lVdGlsLmdldE1vdGlvbikodGhpcy5wcm9wcywgdGhpcy5zdGF0ZSwgbW9kZSlcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIHByb3BzLm9wZW5BbmltYXRpb247XG4gICAgICBkZWxldGUgcHJvcHMub3BlblRyYW5zaXRpb25OYW1lO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX21pbmlTdG9yZS5Qcm92aWRlciwge1xuICAgICAgICBzdG9yZTogdGhpcy5zdG9yZVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChfU3ViUG9wdXBNZW51LmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIHJlZjogdGhpcy5zZXRJbm5lck1lbnVcbiAgICAgIH0pLCB0aGlzLnByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBNZW51O1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5NZW51LmRlZmF1bHRQcm9wcyA9IHtcbiAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgb25DbGljazogX3V0aWwubm9vcCxcbiAgb25TZWxlY3Q6IF91dGlsLm5vb3AsXG4gIG9uT3BlbkNoYW5nZTogX3V0aWwubm9vcCxcbiAgb25EZXNlbGVjdDogX3V0aWwubm9vcCxcbiAgZGVmYXVsdFNlbGVjdGVkS2V5czogW10sXG4gIGRlZmF1bHRPcGVuS2V5czogW10sXG4gIHN1Yk1lbnVPcGVuRGVsYXk6IDAuMSxcbiAgc3ViTWVudUNsb3NlRGVsYXk6IDAuMSxcbiAgdHJpZ2dlclN1Yk1lbnVBY3Rpb246ICdob3ZlcicsXG4gIHByZWZpeENsczogJ3JjLW1lbnUnLFxuICBjbGFzc05hbWU6ICcnLFxuICBtb2RlOiAndmVydGljYWwnLFxuICBzdHlsZToge30sXG4gIGJ1aWx0aW5QbGFjZW1lbnRzOiB7fSxcbiAgb3ZlcmZsb3dlZEluZGljYXRvcjogUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgXCJcXHhCN1xceEI3XFx4QjdcIilcbn07XG52YXIgX2RlZmF1bHQgPSBNZW51O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5NZW51SXRlbSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm9taXQuanNcIikpO1xuXG52YXIgX21pbmlTdG9yZSA9IHJlcXVpcmUoXCJtaW5pLXN0b3JlXCIpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG52YXIgTWVudUl0ZW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoTWVudUl0ZW0sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShNZW51SXRlbSk7XG5cbiAgZnVuY3Rpb24gTWVudUl0ZW0oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgTWVudUl0ZW0pO1xuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBfdGhpcy5vbktleURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGtleUNvZGUgPSBlLmtleUNvZGU7XG5cbiAgICAgIGlmIChrZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSKSB7XG4gICAgICAgIF90aGlzLm9uQ2xpY2soZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIF90aGlzLm9uTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBldmVudEtleSA9IF90aGlzJHByb3BzLmV2ZW50S2V5LFxuICAgICAgICAgIG9uSXRlbUhvdmVyID0gX3RoaXMkcHJvcHMub25JdGVtSG92ZXIsXG4gICAgICAgICAgb25Nb3VzZUxlYXZlID0gX3RoaXMkcHJvcHMub25Nb3VzZUxlYXZlO1xuICAgICAgb25JdGVtSG92ZXIoe1xuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICBob3ZlcjogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgb25Nb3VzZUxlYXZlKHtcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgZG9tRXZlbnQ6IGVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbk1vdXNlRW50ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGV2ZW50S2V5ID0gX3RoaXMkcHJvcHMyLmV2ZW50S2V5LFxuICAgICAgICAgIG9uSXRlbUhvdmVyID0gX3RoaXMkcHJvcHMyLm9uSXRlbUhvdmVyLFxuICAgICAgICAgIG9uTW91c2VFbnRlciA9IF90aGlzJHByb3BzMi5vbk1vdXNlRW50ZXI7XG4gICAgICBvbkl0ZW1Ib3Zlcih7XG4gICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgIGhvdmVyOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIG9uTW91c2VFbnRlcih7XG4gICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgIGRvbUV2ZW50OiBlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25DbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgZXZlbnRLZXkgPSBfdGhpcyRwcm9wczMuZXZlbnRLZXksXG4gICAgICAgICAgbXVsdGlwbGUgPSBfdGhpcyRwcm9wczMubXVsdGlwbGUsXG4gICAgICAgICAgb25DbGljayA9IF90aGlzJHByb3BzMy5vbkNsaWNrLFxuICAgICAgICAgIG9uU2VsZWN0ID0gX3RoaXMkcHJvcHMzLm9uU2VsZWN0LFxuICAgICAgICAgIG9uRGVzZWxlY3QgPSBfdGhpcyRwcm9wczMub25EZXNlbGVjdCxcbiAgICAgICAgICBpc1NlbGVjdGVkID0gX3RoaXMkcHJvcHMzLmlzU2VsZWN0ZWQ7XG4gICAgICB2YXIgaW5mbyA9IHtcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAga2V5UGF0aDogW2V2ZW50S2V5XSxcbiAgICAgICAgaXRlbTogKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKSxcbiAgICAgICAgZG9tRXZlbnQ6IGVcbiAgICAgIH07XG4gICAgICBvbkNsaWNrKGluZm8pO1xuXG4gICAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICBvbkRlc2VsZWN0KGluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uU2VsZWN0KGluZm8pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkKSB7XG4gICAgICAgIG9uU2VsZWN0KGluZm8pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBfdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoTWVudUl0ZW0sIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgLy8gaW52b2tlIGN1c3RvbWl6ZWQgcmVmIHRvIGV4cG9zZSBjb21wb25lbnQgdG8gbWl4aW5cbiAgICAgIHRoaXMuY2FsbFJlZigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy5jYWxsUmVmKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLm9uRGVzdHJveSkge1xuICAgICAgICBwcm9wcy5vbkRlc3Ryb3kocHJvcHMuZXZlbnRLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQcmVmaXhDbHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHJlZml4Q2xzKCkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHRoaXMucHJvcHMucm9vdFByZWZpeENscywgXCItaXRlbVwiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QWN0aXZlQ2xhc3NOYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFjdGl2ZUNsYXNzTmFtZSgpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdCh0aGlzLmdldFByZWZpeENscygpLCBcIi1hY3RpdmVcIik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNlbGVjdGVkQ2xhc3NOYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlbGVjdGVkQ2xhc3NOYW1lKCkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHRoaXMuZ2V0UHJlZml4Q2xzKCksIFwiLXNlbGVjdGVkXCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREaXNhYmxlZENsYXNzTmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREaXNhYmxlZENsYXNzTmFtZSgpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdCh0aGlzLmdldFByZWZpeENscygpLCBcIi1kaXNhYmxlZFwiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FsbFJlZlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxsUmVmKCkge1xuICAgICAgaWYgKHRoaXMucHJvcHMubWFudWFsUmVmKSB7XG4gICAgICAgIHRoaXMucHJvcHMubWFudWFsUmVmKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgcHJvcHMgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHRoaXMucHJvcHMpO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KSh0aGlzLmdldFByZWZpeENscygpLCBwcm9wcy5jbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgdGhpcy5nZXRBY3RpdmVDbGFzc05hbWUoKSwgIXByb3BzLmRpc2FibGVkICYmIHByb3BzLmFjdGl2ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCB0aGlzLmdldFNlbGVjdGVkQ2xhc3NOYW1lKCksIHByb3BzLmlzU2VsZWN0ZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgdGhpcy5nZXREaXNhYmxlZENsYXNzTmFtZSgpLCBwcm9wcy5kaXNhYmxlZCksIF9jbGFzc05hbWVzKSk7XG4gICAgICB2YXIgYXR0cnMgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwcm9wcy5hdHRyaWJ1dGUpLCB7fSwge1xuICAgICAgICB0aXRsZTogdHlwZW9mIHByb3BzLnRpdGxlID09PSAnc3RyaW5nJyA/IHByb3BzLnRpdGxlIDogdW5kZWZpbmVkLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgLy8gc2V0IHRvIG1lbnVpdGVtIGJ5IGRlZmF1bHRcbiAgICAgICAgcm9sZTogcHJvcHMucm9sZSB8fCAnbWVudWl0ZW0nLFxuICAgICAgICAnYXJpYS1kaXNhYmxlZCc6IHByb3BzLmRpc2FibGVkXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLnJvbGUgPT09ICdvcHRpb24nKSB7XG4gICAgICAgIC8vIG92ZXJ3cml0ZSB0byBvcHRpb25cbiAgICAgICAgYXR0cnMgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBhdHRycyksIHt9LCB7XG4gICAgICAgICAgcm9sZTogJ29wdGlvbicsXG4gICAgICAgICAgJ2FyaWEtc2VsZWN0ZWQnOiBwcm9wcy5pc1NlbGVjdGVkXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wcy5yb2xlID09PSBudWxsIHx8IHByb3BzLnJvbGUgPT09ICdub25lJykge1xuICAgICAgICAvLyBzb21ldGltZXMgd2Ugd2FudCB0byBzcGVjaWZ5IHJvbGUgaW5zaWRlIDxsaS8+IGVsZW1lbnRcbiAgICAgICAgLy8gPGxpPjxhIHJvbGU9J21lbnVpdGVtJz5MaW5rPC9hPjwvbGk+IHdvdWxkIGJlIGEgZ29vZCBleGFtcGxlXG4gICAgICAgIC8vIGluIHRoaXMgY2FzZSB0aGUgcm9sZSBvbiA8bGkvPiBzaG91bGQgYmUgXCJub25lXCIgdG9cbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBpbXBsaWVkIGxpc3RpdGVtIHJvbGUuXG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1wcmFjdGljZXMtMS4xL2V4YW1wbGVzL21lbnViYXIvbWVudWJhci0xL21lbnViYXItMS5odG1sXG4gICAgICAgIGF0dHJzLnJvbGUgPSAnbm9uZSc7XG4gICAgICB9IC8vIEluIGNhc2UgdGhhdCBvbkNsaWNrL29uTW91c2VMZWF2ZS9vbk1vdXNlRW50ZXIgaXMgcGFzc2VkIGRvd24gZnJvbSBvd25lclxuXG5cbiAgICAgIHZhciBtb3VzZUV2ZW50ID0ge1xuICAgICAgICBvbkNsaWNrOiBwcm9wcy5kaXNhYmxlZCA/IG51bGwgOiB0aGlzLm9uQ2xpY2ssXG4gICAgICAgIG9uTW91c2VMZWF2ZTogcHJvcHMuZGlzYWJsZWQgPyBudWxsIDogdGhpcy5vbk1vdXNlTGVhdmUsXG4gICAgICAgIG9uTW91c2VFbnRlcjogcHJvcHMuZGlzYWJsZWQgPyBudWxsIDogdGhpcy5vbk1vdXNlRW50ZXJcbiAgICAgIH07XG4gICAgICB2YXIgc3R5bGUgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHByb3BzLnN0eWxlKTtcblxuICAgICAgaWYgKHByb3BzLm1vZGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgIGlmIChwcm9wcy5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICAgICAgc3R5bGUucGFkZGluZ1JpZ2h0ID0gcHJvcHMuaW5saW5lSW5kZW50ICogcHJvcHMubGV2ZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3R5bGUucGFkZGluZ0xlZnQgPSBwcm9wcy5pbmxpbmVJbmRlbnQgKiBwcm9wcy5sZXZlbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfdXRpbC5tZW51QWxsUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBkZWxldGUgcHJvcHNba2V5XTtcbiAgICAgIH0pO1xuXG4gICAgICBkZWxldGUgcHJvcHMuZGlyZWN0aW9uO1xuICAgICAgdmFyIGljb24gPSB0aGlzLnByb3BzLml0ZW1JY29uO1xuXG4gICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuaXRlbUljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBpcyBhIGJ1ZyB3aGljaCBzaG91bGQgZml4ZWQgYWZ0ZXIgVFMgcmVmYWN0b3JcbiAgICAgICAgaWNvbiA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy5pdGVtSWNvbiwgdGhpcy5wcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgT2JqZWN0LmFzc2lnbih7fSwgKDAsIF9vbWl0LmRlZmF1bHQpKHByb3BzLCBbJ29uQ2xpY2snLCAnb25Nb3VzZUVudGVyJywgJ29uTW91c2VMZWF2ZScsICdvblNlbGVjdCddKSwgYXR0cnMsIG1vdXNlRXZlbnQsIHtcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZU5vZGVcbiAgICAgIH0pLCBwcm9wcy5jaGlsZHJlbiwgaWNvbik7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBNZW51SXRlbTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0cy5NZW51SXRlbSA9IE1lbnVJdGVtO1xuTWVudUl0ZW0uaXNNZW51SXRlbSA9IHRydWU7XG5NZW51SXRlbS5kZWZhdWx0UHJvcHMgPSB7XG4gIG9uU2VsZWN0OiBfdXRpbC5ub29wLFxuICBvbk1vdXNlRW50ZXI6IF91dGlsLm5vb3AsXG4gIG9uTW91c2VMZWF2ZTogX3V0aWwubm9vcCxcbiAgbWFudWFsUmVmOiBfdXRpbC5ub29wXG59O1xudmFyIGNvbm5lY3RlZCA9ICgwLCBfbWluaVN0b3JlLmNvbm5lY3QpKGZ1bmN0aW9uIChfcmVmLCBfcmVmMikge1xuICB2YXIgYWN0aXZlS2V5ID0gX3JlZi5hY3RpdmVLZXksXG4gICAgICBzZWxlY3RlZEtleXMgPSBfcmVmLnNlbGVjdGVkS2V5cztcbiAgdmFyIGV2ZW50S2V5ID0gX3JlZjIuZXZlbnRLZXksXG4gICAgICBzdWJNZW51S2V5ID0gX3JlZjIuc3ViTWVudUtleTtcbiAgcmV0dXJuIHtcbiAgICBhY3RpdmU6IGFjdGl2ZUtleVtzdWJNZW51S2V5XSA9PT0gZXZlbnRLZXksXG4gICAgaXNTZWxlY3RlZDogc2VsZWN0ZWRLZXlzLmluZGV4T2YoZXZlbnRLZXkpICE9PSAtMVxuICB9O1xufSkoTWVudUl0ZW0pO1xudmFyIF9kZWZhdWx0ID0gY29ubmVjdGVkO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxudmFyIE1lbnVJdGVtR3JvdXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoTWVudUl0ZW1Hcm91cCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyLmRlZmF1bHQpKE1lbnVJdGVtR3JvdXApO1xuXG4gIGZ1bmN0aW9uIE1lbnVJdGVtR3JvdXAoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgTWVudUl0ZW1Hcm91cCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIF90aGlzLnJlbmRlcklubmVyTWVudUl0ZW0gPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgcmVuZGVyTWVudUl0ZW0gPSBfdGhpcyRwcm9wcy5yZW5kZXJNZW51SXRlbSxcbiAgICAgICAgICBpbmRleCA9IF90aGlzJHByb3BzLmluZGV4O1xuICAgICAgcmV0dXJuIHJlbmRlck1lbnVJdGVtKGl0ZW0sIGluZGV4LCBfdGhpcy5wcm9wcy5zdWJNZW51S2V5KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoTWVudUl0ZW1Hcm91cCwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBwcm9wcyA9ICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe30sIHRoaXMucHJvcHMpO1xuICAgICAgdmFyIF9wcm9wcyRjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzJGNsYXNzTmFtZSA9PT0gdm9pZCAwID8gJycgOiBfcHJvcHMkY2xhc3NOYW1lLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHMgPSBwcm9wcy5yb290UHJlZml4Q2xzO1xuICAgICAgdmFyIHRpdGxlQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItaXRlbS1ncm91cC10aXRsZVwiKTtcbiAgICAgIHZhciBsaXN0Q2xhc3NOYW1lID0gXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItaXRlbS1ncm91cC1saXN0XCIpO1xuICAgICAgdmFyIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcblxuICAgICAgX3V0aWwubWVudUFsbFByb3BzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gZGVsZXRlIHByb3BzW2tleV07XG4gICAgICB9KTsgLy8gU2V0IG9uQ2xpY2sgdG8gbnVsbCwgdG8gaWdub3JlIHByb3BhZ2F0ZWQgb25DbGljayBldmVudFxuXG5cbiAgICAgIGRlbGV0ZSBwcm9wcy5vbkNsaWNrO1xuICAgICAgZGVsZXRlIHByb3BzLmRpcmVjdGlvbjtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjbGFzc05hbWUsIFwiIFwiKS5jb25jYXQocm9vdFByZWZpeENscywgXCItaXRlbS1ncm91cFwiKVxuICAgICAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHRpdGxlQ2xhc3NOYW1lLFxuICAgICAgICB0aXRsZTogdHlwZW9mIHRpdGxlID09PSAnc3RyaW5nJyA/IHRpdGxlIDogdW5kZWZpbmVkXG4gICAgICB9LCB0aXRsZSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogbGlzdENsYXNzTmFtZVxuICAgICAgfSwgUmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkcmVuLCB0aGlzLnJlbmRlcklubmVyTWVudUl0ZW0pKSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBNZW51SXRlbUdyb3VwO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5NZW51SXRlbUdyb3VwLmlzTWVudUl0ZW1Hcm91cCA9IHRydWU7XG5NZW51SXRlbUdyb3VwLmRlZmF1bHRQcm9wcyA9IHtcbiAgZGlzYWJsZWQ6IHRydWVcbn07XG52YXIgX2RlZmF1bHQgPSBNZW51SXRlbUdyb3VwO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5TdWJNZW51ID0gdm9pZCAwO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBSZWFjdERPTSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xuXG52YXIgX3JjVHJpZ2dlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXRyaWdnZXJcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF9yY01vdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLW1vdGlvblwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX21pbmlTdG9yZSA9IHJlcXVpcmUoXCJtaW5pLXN0b3JlXCIpO1xuXG52YXIgX1N1YlBvcHVwTWVudSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3ViUG9wdXBNZW51XCIpKTtcblxudmFyIF9wbGFjZW1lbnRzID0gcmVxdWlyZShcIi4vcGxhY2VtZW50c1wiKTtcblxudmFyIF91dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxudmFyIGd1aWQgPSAwO1xudmFyIHBvcHVwUGxhY2VtZW50TWFwID0ge1xuICBob3Jpem9udGFsOiAnYm90dG9tTGVmdCcsXG4gIHZlcnRpY2FsOiAncmlnaHRUb3AnLFxuICAndmVydGljYWwtbGVmdCc6ICdyaWdodFRvcCcsXG4gICd2ZXJ0aWNhbC1yaWdodCc6ICdsZWZ0VG9wJ1xufTtcblxudmFyIHVwZGF0ZURlZmF1bHRBY3RpdmVGaXJzdCA9IGZ1bmN0aW9uIHVwZGF0ZURlZmF1bHRBY3RpdmVGaXJzdChzdG9yZSwgZXZlbnRLZXksIGRlZmF1bHRBY3RpdmVGaXJzdCkge1xuICB2YXIgbWVudUlkID0gKDAsIF91dGlsLmdldE1lbnVJZEZyb21TdWJNZW51RXZlbnRLZXkpKGV2ZW50S2V5KTtcbiAgdmFyIHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgc3RvcmUuc2V0U3RhdGUoe1xuICAgIGRlZmF1bHRBY3RpdmVGaXJzdDogKDAsIF9vYmplY3RTcHJlYWQzLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMy5kZWZhdWx0KSh7fSwgc3RhdGUuZGVmYXVsdEFjdGl2ZUZpcnN0KSwge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBtZW51SWQsIGRlZmF1bHRBY3RpdmVGaXJzdCkpXG4gIH0pO1xufTtcblxudmFyIFN1Yk1lbnUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoU3ViTWVudSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyLmRlZmF1bHQpKFN1Yk1lbnUpO1xuXG4gIGZ1bmN0aW9uIFN1Yk1lbnUocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBTdWJNZW51KTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF90aGlzLm9uRGVzdHJveSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIF90aGlzLnByb3BzLm9uRGVzdHJveShrZXkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogbm90ZTpcbiAgICAgKiAgVGhpcyBsZWdhY3kgY29kZSB0aGF0IGBvbktleURvd25gIGlzIGNhbGxlZCBieSBwYXJlbnQgaW5zdGVhZCBvZiBkb20gc2VsZi5cbiAgICAgKiAgd2hpY2ggbmVlZCByZXR1cm4gY29kZSB0byBjaGVjayBpZiB0aGlzIGV2ZW50IGlzIGhhbmRsZWRcbiAgICAgKi9cblxuXG4gICAgX3RoaXMub25LZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlO1xuICAgICAgdmFyIG1lbnUgPSBfdGhpcy5tZW51SW5zdGFuY2U7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBpc09wZW4gPSBfdGhpcyRwcm9wcy5pc09wZW4sXG4gICAgICAgICAgc3RvcmUgPSBfdGhpcyRwcm9wcy5zdG9yZTtcblxuICAgICAgaWYgKGtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuRU5URVIpIHtcbiAgICAgICAgX3RoaXMub25UaXRsZUNsaWNrKGUpO1xuXG4gICAgICAgIHVwZGF0ZURlZmF1bHRBY3RpdmVGaXJzdChzdG9yZSwgX3RoaXMucHJvcHMuZXZlbnRLZXksIHRydWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuUklHSFQpIHtcbiAgICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICAgIG1lbnUub25LZXlEb3duKGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLnRyaWdnZXJPcGVuQ2hhbmdlKHRydWUpOyAvLyBuZWVkIHRvIHVwZGF0ZSBjdXJyZW50IG1lbnUncyBkZWZhdWx0QWN0aXZlRmlyc3QgdmFsdWVcblxuXG4gICAgICAgICAgdXBkYXRlRGVmYXVsdEFjdGl2ZUZpcnN0KHN0b3JlLCBfdGhpcy5wcm9wcy5ldmVudEtleSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuTEVGVCkge1xuICAgICAgICB2YXIgaGFuZGxlZDtcblxuICAgICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgICAgaGFuZGxlZCA9IG1lbnUub25LZXlEb3duKGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhbmRsZWQpIHtcbiAgICAgICAgICBfdGhpcy50cmlnZ2VyT3BlbkNoYW5nZShmYWxzZSk7XG5cbiAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNPcGVuICYmIChrZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LlVQIHx8IGtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuRE9XTikpIHtcbiAgICAgICAgcmV0dXJuIG1lbnUub25LZXlEb3duKGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbk9wZW5DaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMucHJvcHMub25PcGVuQ2hhbmdlKGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vblBvcHVwVmlzaWJsZUNoYW5nZSA9IGZ1bmN0aW9uICh2aXNpYmxlKSB7XG4gICAgICBfdGhpcy50cmlnZ2VyT3BlbkNoYW5nZSh2aXNpYmxlLCB2aXNpYmxlID8gJ21vdXNlZW50ZXInIDogJ21vdXNlbGVhdmUnKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25Nb3VzZUVudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBrZXkgPSBfdGhpcyRwcm9wczIuZXZlbnRLZXksXG4gICAgICAgICAgb25Nb3VzZUVudGVyID0gX3RoaXMkcHJvcHMyLm9uTW91c2VFbnRlcixcbiAgICAgICAgICBzdG9yZSA9IF90aGlzJHByb3BzMi5zdG9yZTtcbiAgICAgIHVwZGF0ZURlZmF1bHRBY3RpdmVGaXJzdChzdG9yZSwgX3RoaXMucHJvcHMuZXZlbnRLZXksIGZhbHNlKTtcbiAgICAgIG9uTW91c2VFbnRlcih7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBkb21FdmVudDogZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgcGFyZW50TWVudSA9IF90aGlzJHByb3BzMy5wYXJlbnRNZW51LFxuICAgICAgICAgIGV2ZW50S2V5ID0gX3RoaXMkcHJvcHMzLmV2ZW50S2V5LFxuICAgICAgICAgIG9uTW91c2VMZWF2ZSA9IF90aGlzJHByb3BzMy5vbk1vdXNlTGVhdmU7XG4gICAgICBwYXJlbnRNZW51LnN1Yk1lbnVJbnN0YW5jZSA9ICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcyk7XG4gICAgICBvbk1vdXNlTGVhdmUoe1xuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICBkb21FdmVudDogZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uVGl0bGVNb3VzZUVudGVyID0gZnVuY3Rpb24gKGRvbUV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAga2V5ID0gX3RoaXMkcHJvcHM0LmV2ZW50S2V5LFxuICAgICAgICAgIG9uSXRlbUhvdmVyID0gX3RoaXMkcHJvcHM0Lm9uSXRlbUhvdmVyLFxuICAgICAgICAgIG9uVGl0bGVNb3VzZUVudGVyID0gX3RoaXMkcHJvcHM0Lm9uVGl0bGVNb3VzZUVudGVyO1xuICAgICAgb25JdGVtSG92ZXIoe1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgaG92ZXI6IHRydWVcbiAgICAgIH0pO1xuICAgICAgb25UaXRsZU1vdXNlRW50ZXIoe1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgZG9tRXZlbnQ6IGRvbUV2ZW50XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25UaXRsZU1vdXNlTGVhdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHBhcmVudE1lbnUgPSBfdGhpcyRwcm9wczUucGFyZW50TWVudSxcbiAgICAgICAgICBldmVudEtleSA9IF90aGlzJHByb3BzNS5ldmVudEtleSxcbiAgICAgICAgICBvbkl0ZW1Ib3ZlciA9IF90aGlzJHByb3BzNS5vbkl0ZW1Ib3ZlcixcbiAgICAgICAgICBvblRpdGxlTW91c2VMZWF2ZSA9IF90aGlzJHByb3BzNS5vblRpdGxlTW91c2VMZWF2ZTtcbiAgICAgIHBhcmVudE1lbnUuc3ViTWVudUluc3RhbmNlID0gKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKTtcbiAgICAgIG9uSXRlbUhvdmVyKHtcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgaG92ZXI6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIG9uVGl0bGVNb3VzZUxlYXZlKHtcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgZG9tRXZlbnQ6IGVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5vblRpdGxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZSA9ICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcyksXG4gICAgICAgICAgcHJvcHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUucHJvcHM7XG5cbiAgICAgIHByb3BzLm9uVGl0bGVDbGljayh7XG4gICAgICAgIGtleTogcHJvcHMuZXZlbnRLZXksXG4gICAgICAgIGRvbUV2ZW50OiBlXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLnRyaWdnZXJTdWJNZW51QWN0aW9uID09PSAnaG92ZXInKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMudHJpZ2dlck9wZW5DaGFuZ2UoIXByb3BzLmlzT3BlbiwgJ2NsaWNrJyk7XG5cbiAgICAgIHVwZGF0ZURlZmF1bHRBY3RpdmVGaXJzdChwcm9wcy5zdG9yZSwgX3RoaXMucHJvcHMuZXZlbnRLZXksIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25TdWJNZW51Q2xpY2sgPSBmdW5jdGlvbiAoaW5mbykge1xuICAgICAgLy8gaW4gdGhlIGNhc2Ugb2Ygb3ZlcmZsb3dlZCBzdWJtZW51XG4gICAgICAvLyBvbkNsaWNrIGlzIG5vdCBjb3BpZWQgb3ZlclxuICAgICAgaWYgKHR5cGVvZiBfdGhpcy5wcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uQ2xpY2soX3RoaXMuYWRkS2V5UGF0aChpbmZvKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uU2VsZWN0ID0gZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgIF90aGlzLnByb3BzLm9uU2VsZWN0KGluZm8pO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkRlc2VsZWN0ID0gZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgIF90aGlzLnByb3BzLm9uRGVzZWxlY3QoaW5mbyk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldFByZWZpeENscyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChfdGhpcy5wcm9wcy5yb290UHJlZml4Q2xzLCBcIi1zdWJtZW51XCIpO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRBY3RpdmVDbGFzc05hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQoX3RoaXMuZ2V0UHJlZml4Q2xzKCksIFwiLWFjdGl2ZVwiKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0RGlzYWJsZWRDbGFzc05hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQoX3RoaXMuZ2V0UHJlZml4Q2xzKCksIFwiLWRpc2FibGVkXCIpO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRTZWxlY3RlZENsYXNzTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChfdGhpcy5nZXRQcmVmaXhDbHMoKSwgXCItc2VsZWN0ZWRcIik7XG4gICAgfTtcblxuICAgIF90aGlzLmdldE9wZW5DbGFzc05hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQoX3RoaXMucHJvcHMucm9vdFByZWZpeENscywgXCItc3VibWVudS1vcGVuXCIpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlTWVudUluc3RhbmNlID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgIC8vIGNoaWxkcmVuIG1lbnUgaW5zdGFuY2VcbiAgICAgIF90aGlzLm1lbnVJbnN0YW5jZSA9IGM7XG4gICAgfTtcblxuICAgIF90aGlzLmFkZEtleVBhdGggPSBmdW5jdGlvbiAoaW5mbykge1xuICAgICAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMy5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoe30sIGluZm8pLCB7fSwge1xuICAgICAgICBrZXlQYXRoOiAoaW5mby5rZXlQYXRoIHx8IFtdKS5jb25jYXQoX3RoaXMucHJvcHMuZXZlbnRLZXkpXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMudHJpZ2dlck9wZW5DaGFuZ2UgPSBmdW5jdGlvbiAob3BlbiwgdHlwZSkge1xuICAgICAgdmFyIGtleSA9IF90aGlzLnByb3BzLmV2ZW50S2V5O1xuXG4gICAgICB2YXIgb3BlbkNoYW5nZSA9IGZ1bmN0aW9uIG9wZW5DaGFuZ2UoKSB7XG4gICAgICAgIF90aGlzLm9uT3BlbkNoYW5nZSh7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgaXRlbTogKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKSxcbiAgICAgICAgICB0cmlnZ2VyOiB0eXBlLFxuICAgICAgICAgIG9wZW46IG9wZW5cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ21vdXNlZW50ZXInKSB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSBtb3VzZWVudGVyIGhhcHBlbiBhZnRlciBvdGhlciBtZW51IGl0ZW0ncyBtb3VzZWxlYXZlXG4gICAgICAgIF90aGlzLm1vdXNlZW50ZXJUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgb3BlbkNoYW5nZSgpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wZW5DaGFuZ2UoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaXNDaGlsZHJlblNlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgZmluZDogZmFsc2VcbiAgICAgIH07XG4gICAgICAoMCwgX3V0aWwubG9vcE1lbnVJdGVtUmVjdXJzaXZlbHkpKF90aGlzLnByb3BzLmNoaWxkcmVuLCBfdGhpcy5wcm9wcy5zZWxlY3RlZEtleXMsIHJldCk7XG4gICAgICByZXR1cm4gcmV0LmZpbmQ7XG4gICAgfTtcblxuICAgIF90aGlzLmlzT3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5vcGVuS2V5cy5pbmRleE9mKF90aGlzLnByb3BzLmV2ZW50S2V5KSAhPT0gLTE7XG4gICAgfTtcblxuICAgIF90aGlzLmFkanVzdFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoIV90aGlzLnN1Yk1lbnVUaXRsZSB8fCAhX3RoaXMubWVudUluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcHVwTWVudSA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKF90aGlzLm1lbnVJbnN0YW5jZSk7XG5cbiAgICAgIGlmIChwb3B1cE1lbnUub2Zmc2V0V2lkdGggPj0gX3RoaXMuc3ViTWVudVRpdGxlLm9mZnNldFdpZHRoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAgcG9wdXBNZW51LnN0eWxlLm1pbldpZHRoID0gXCJcIi5jb25jYXQoX3RoaXMuc3ViTWVudVRpdGxlLm9mZnNldFdpZHRoLCBcInB4XCIpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlU3ViTWVudVRpdGxlID0gZnVuY3Rpb24gKHN1Yk1lbnVUaXRsZSkge1xuICAgICAgX3RoaXMuc3ViTWVudVRpdGxlID0gc3ViTWVudVRpdGxlO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRCYXNlUHJvcHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplMiA9ICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcyksXG4gICAgICAgICAgcHJvcHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUyLnByb3BzO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2RlOiBwcm9wcy5tb2RlID09PSAnaG9yaXpvbnRhbCcgPyAndmVydGljYWwnIDogcHJvcHMubW9kZSxcbiAgICAgICAgdmlzaWJsZTogX3RoaXMucHJvcHMuaXNPcGVuLFxuICAgICAgICBsZXZlbDogcHJvcHMubGV2ZWwgKyAxLFxuICAgICAgICBpbmxpbmVJbmRlbnQ6IHByb3BzLmlubGluZUluZGVudCxcbiAgICAgICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICAgICAgb25DbGljazogX3RoaXMub25TdWJNZW51Q2xpY2ssXG4gICAgICAgIG9uU2VsZWN0OiBfdGhpcy5vblNlbGVjdCxcbiAgICAgICAgb25EZXNlbGVjdDogX3RoaXMub25EZXNlbGVjdCxcbiAgICAgICAgb25EZXN0cm95OiBfdGhpcy5vbkRlc3Ryb3ksXG4gICAgICAgIHNlbGVjdGVkS2V5czogcHJvcHMuc2VsZWN0ZWRLZXlzLFxuICAgICAgICBldmVudEtleTogXCJcIi5jb25jYXQocHJvcHMuZXZlbnRLZXksIFwiLW1lbnUtXCIpLFxuICAgICAgICBvcGVuS2V5czogcHJvcHMub3BlbktleXMsXG4gICAgICAgIG1vdGlvbjogcHJvcHMubW90aW9uLFxuICAgICAgICBvbk9wZW5DaGFuZ2U6IF90aGlzLm9uT3BlbkNoYW5nZSxcbiAgICAgICAgc3ViTWVudU9wZW5EZWxheTogcHJvcHMuc3ViTWVudU9wZW5EZWxheSxcbiAgICAgICAgcGFyZW50TWVudTogKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKSxcbiAgICAgICAgc3ViTWVudUNsb3NlRGVsYXk6IHByb3BzLnN1Yk1lbnVDbG9zZURlbGF5LFxuICAgICAgICBmb3JjZVN1Yk1lbnVSZW5kZXI6IHByb3BzLmZvcmNlU3ViTWVudVJlbmRlcixcbiAgICAgICAgdHJpZ2dlclN1Yk1lbnVBY3Rpb246IHByb3BzLnRyaWdnZXJTdWJNZW51QWN0aW9uLFxuICAgICAgICBidWlsdGluUGxhY2VtZW50czogcHJvcHMuYnVpbHRpblBsYWNlbWVudHMsXG4gICAgICAgIGRlZmF1bHRBY3RpdmVGaXJzdDogcHJvcHMuc3RvcmUuZ2V0U3RhdGUoKS5kZWZhdWx0QWN0aXZlRmlyc3RbKDAsIF91dGlsLmdldE1lbnVJZEZyb21TdWJNZW51RXZlbnRLZXkpKHByb3BzLmV2ZW50S2V5KV0sXG4gICAgICAgIG11bHRpcGxlOiBwcm9wcy5tdWx0aXBsZSxcbiAgICAgICAgcHJlZml4Q2xzOiBwcm9wcy5yb290UHJlZml4Q2xzLFxuICAgICAgICBpZDogX3RoaXMuaW50ZXJuYWxNZW51SWQsXG4gICAgICAgIG1hbnVhbFJlZjogX3RoaXMuc2F2ZU1lbnVJbnN0YW5jZSxcbiAgICAgICAgaXRlbUljb246IHByb3BzLml0ZW1JY29uLFxuICAgICAgICBleHBhbmRJY29uOiBwcm9wcy5leHBhbmRJY29uLFxuICAgICAgICBkaXJlY3Rpb246IHByb3BzLmRpcmVjdGlvblxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0TW90aW9uID0gZnVuY3Rpb24gKG1vZGUsIHZpc2libGUpIHtcbiAgICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemUzID0gKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKSxcbiAgICAgICAgICBoYXZlUmVuZGVyZWQgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUzLmhhdmVSZW5kZXJlZDtcblxuICAgICAgdmFyIF90aGlzJHByb3BzNiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG1vdGlvbiA9IF90aGlzJHByb3BzNi5tb3Rpb24sXG4gICAgICAgICAgcm9vdFByZWZpeENscyA9IF90aGlzJHByb3BzNi5yb290UHJlZml4Q2xzOyAvLyBkb24ndCBzaG93IHRyYW5zaXRpb24gb24gZmlyc3QgcmVuZGVyaW5nIChubyBhbmltYXRpb24gZm9yIG9wZW5lZCBtZW51KVxuICAgICAgLy8gc2hvdyBhcHBlYXIgdHJhbnNpdGlvbiBpZiBpdCdzIG5vdCB2aXNpYmxlIChub3Qgc3VyZSB3aHkpXG4gICAgICAvLyBzaG93IGFwcGVhciB0cmFuc2l0aW9uIGlmIGl0J3Mgbm90IGlubGluZSBtb2RlXG5cbiAgICAgIHZhciBtZXJnZWRNb3Rpb24gPSAoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQzLmRlZmF1bHQpKHt9LCBtb3Rpb24pLCB7fSwge1xuICAgICAgICBsZWF2ZWRDbGFzc05hbWU6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLWhpZGRlblwiKSxcbiAgICAgICAgcmVtb3ZlT25MZWF2ZTogZmFsc2UsXG4gICAgICAgIG1vdGlvbkFwcGVhcjogaGF2ZVJlbmRlcmVkIHx8ICF2aXNpYmxlIHx8IG1vZGUgIT09ICdpbmxpbmUnXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtZXJnZWRNb3Rpb247XG4gICAgfTtcblxuICAgIHZhciBzdG9yZSA9IHByb3BzLnN0b3JlLFxuICAgICAgICBldmVudEtleSA9IHByb3BzLmV2ZW50S2V5O1xuXG4gICAgdmFyIF9zdG9yZSRnZXRTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCksXG4gICAgICAgIGRlZmF1bHRBY3RpdmVGaXJzdCA9IF9zdG9yZSRnZXRTdGF0ZS5kZWZhdWx0QWN0aXZlRmlyc3Q7XG5cbiAgICBfdGhpcy5pc1Jvb3RNZW51ID0gZmFsc2U7XG4gICAgdmFyIHZhbHVlID0gZmFsc2U7XG5cbiAgICBpZiAoZGVmYXVsdEFjdGl2ZUZpcnN0KSB7XG4gICAgICB2YWx1ZSA9IGRlZmF1bHRBY3RpdmVGaXJzdFtldmVudEtleV07XG4gICAgfVxuXG4gICAgdXBkYXRlRGVmYXVsdEFjdGl2ZUZpcnN0KHN0b3JlLCBldmVudEtleSwgdmFsdWUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFN1Yk1lbnUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5jb21wb25lbnREaWRVcGRhdGUoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBtb2RlID0gX3RoaXMkcHJvcHM3Lm1vZGUsXG4gICAgICAgICAgcGFyZW50TWVudSA9IF90aGlzJHByb3BzNy5wYXJlbnRNZW51LFxuICAgICAgICAgIG1hbnVhbFJlZiA9IF90aGlzJHByb3BzNy5tYW51YWxSZWYsXG4gICAgICAgICAgaXNPcGVuID0gX3RoaXMkcHJvcHM3LmlzT3BlbjsgLy8gaW52b2tlIGN1c3RvbWl6ZWQgcmVmIHRvIGV4cG9zZSBjb21wb25lbnQgdG8gbWl4aW5cblxuICAgICAgaWYgKG1hbnVhbFJlZikge1xuICAgICAgICBtYW51YWxSZWYodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlICE9PSAnaG9yaXpvbnRhbCcgfHwgIShwYXJlbnRNZW51ID09PSBudWxsIHx8IHBhcmVudE1lbnUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmVudE1lbnUuaXNSb290TWVudSkgfHwgIWlzT3Blbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWluV2lkdGhUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuYWRqdXN0V2lkdGgoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczggPSB0aGlzLnByb3BzLFxuICAgICAgICAgIG9uRGVzdHJveSA9IF90aGlzJHByb3BzOC5vbkRlc3Ryb3ksXG4gICAgICAgICAgZXZlbnRLZXkgPSBfdGhpcyRwcm9wczguZXZlbnRLZXk7XG5cbiAgICAgIGlmIChvbkRlc3Ryb3kpIHtcbiAgICAgICAgb25EZXN0cm95KGV2ZW50S2V5KTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuXG5cbiAgICAgIGlmICh0aGlzLm1pbldpZHRoVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5taW5XaWR0aFRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cblxuICAgICAgaWYgKHRoaXMubW91c2VlbnRlclRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VlbnRlclRpbWVvdXQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJDaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJDaGlsZHJlbihjaGlsZHJlbikge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBiYXNlUHJvcHMgPSB0aGlzLmdldEJhc2VQcm9wcygpOyAvLyBbTGVnYWN5XSBnZXRNb3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBoYXZlUmVuZGVyZWRgXG5cbiAgICAgIHZhciBtZXJnZWRNb3Rpb24gPSB0aGlzLmdldE1vdGlvbihiYXNlUHJvcHMubW9kZSwgYmFzZVByb3BzLnZpc2libGUpO1xuICAgICAgdGhpcy5oYXZlUmVuZGVyZWQgPSB0cnVlO1xuICAgICAgdGhpcy5oYXZlT3BlbmVkID0gdGhpcy5oYXZlT3BlbmVkIHx8IGJhc2VQcm9wcy52aXNpYmxlIHx8IGJhc2VQcm9wcy5mb3JjZVN1Yk1lbnVSZW5kZXI7IC8vIG5ldmVyIHJlbmRlcmVkIG5vdCBwbGFubmluZyB0bywgZG9uJ3QgcmVuZGVyXG5cbiAgICAgIGlmICghdGhpcy5oYXZlT3BlbmVkKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlyZWN0aW9uID0gYmFzZVByb3BzLmRpcmVjdGlvbjtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY01vdGlvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgdmlzaWJsZTogYmFzZVByb3BzLnZpc2libGVcbiAgICAgIH0sIG1lcmdlZE1vdGlvbiksIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHN0eWxlID0gX3JlZi5zdHlsZTtcbiAgICAgICAgdmFyIG1lcmdlZENsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChiYXNlUHJvcHMucHJlZml4Q2xzLCBcIi1zdWJcIiksIGNsYXNzTmFtZSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KGJhc2VQcm9wcy5wcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJykpO1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfU3ViUG9wdXBNZW51LmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIGJhc2VQcm9wcywge1xuICAgICAgICAgIGlkOiBfdGhpczMuaW50ZXJuYWxNZW51SWQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICAgIH0pLCBjaGlsZHJlbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfY2xhc3NOYW1lczIsIF9wcm9wcyRwYXJlbnRNZW51O1xuXG4gICAgICB2YXIgcHJvcHMgPSAoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoe30sIHRoaXMucHJvcHMpO1xuICAgICAgdmFyIGlzT3BlbiA9IHByb3BzLmlzT3BlbjtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSB0aGlzLmdldFByZWZpeENscygpO1xuICAgICAgdmFyIGlzSW5saW5lTW9kZSA9IHByb3BzLm1vZGUgPT09ICdpbmxpbmUnO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChwcm9wcy5tb2RlKSwgKF9jbGFzc05hbWVzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIHByb3BzLmNsYXNzTmFtZSwgISFwcm9wcy5jbGFzc05hbWUpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIHRoaXMuZ2V0T3BlbkNsYXNzTmFtZSgpLCBpc09wZW4pLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIHRoaXMuZ2V0QWN0aXZlQ2xhc3NOYW1lKCksIHByb3BzLmFjdGl2ZSB8fCBpc09wZW4gJiYgIWlzSW5saW5lTW9kZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgdGhpcy5nZXREaXNhYmxlZENsYXNzTmFtZSgpLCBwcm9wcy5kaXNhYmxlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgdGhpcy5nZXRTZWxlY3RlZENsYXNzTmFtZSgpLCB0aGlzLmlzQ2hpbGRyZW5TZWxlY3RlZCgpKSwgX2NsYXNzTmFtZXMyKSk7XG5cbiAgICAgIGlmICghdGhpcy5pbnRlcm5hbE1lbnVJZCkge1xuICAgICAgICBpZiAocHJvcHMuZXZlbnRLZXkpIHtcbiAgICAgICAgICB0aGlzLmludGVybmFsTWVudUlkID0gXCJcIi5jb25jYXQocHJvcHMuZXZlbnRLZXksIFwiJE1lbnVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3VpZCArPSAxO1xuICAgICAgICAgIHRoaXMuaW50ZXJuYWxNZW51SWQgPSBcIiRfXyRcIi5jb25jYXQoZ3VpZCwgXCIkTWVudVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgbW91c2VFdmVudHMgPSB7fTtcbiAgICAgIHZhciB0aXRsZUNsaWNrRXZlbnRzID0ge307XG4gICAgICB2YXIgdGl0bGVNb3VzZUV2ZW50cyA9IHt9O1xuXG4gICAgICBpZiAoIXByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgIG1vdXNlRXZlbnRzID0ge1xuICAgICAgICAgIG9uTW91c2VMZWF2ZTogdGhpcy5vbk1vdXNlTGVhdmUsXG4gICAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLm9uTW91c2VFbnRlclxuICAgICAgICB9OyAvLyBvbmx5IHdvcmtzIGluIHRpdGxlLCBub3Qgb3V0ZXIgbGlcblxuICAgICAgICB0aXRsZUNsaWNrRXZlbnRzID0ge1xuICAgICAgICAgIG9uQ2xpY2s6IHRoaXMub25UaXRsZUNsaWNrXG4gICAgICAgIH07XG4gICAgICAgIHRpdGxlTW91c2VFdmVudHMgPSB7XG4gICAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLm9uVGl0bGVNb3VzZUVudGVyLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZTogdGhpcy5vblRpdGxlTW91c2VMZWF2ZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGUgPSB7fTtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb247XG5cbiAgICAgIGlmIChpc0lubGluZU1vZGUpIHtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICBzdHlsZS5wYWRkaW5nUmlnaHQgPSBwcm9wcy5pbmxpbmVJbmRlbnQgKiBwcm9wcy5sZXZlbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHlsZS5wYWRkaW5nTGVmdCA9IHByb3BzLmlubGluZUluZGVudCAqIHByb3BzLmxldmVsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBhcmlhT3ducyA9IHt9OyAvLyBvbmx5IHNldCBhcmlhLW93bnMgd2hlbiBtZW51IGlzIG9wZW5cbiAgICAgIC8vIG90aGVyd2lzZSBpdCB3b3VsZCBiZSBhbiBpbnZhbGlkIGFyaWEtb3ducyB2YWx1ZVxuICAgICAgLy8gc2luY2UgY29ycmVzcG9uZGluZyBub2RlIGNhbm5vdCBiZSBmb3VuZFxuXG4gICAgICBpZiAodGhpcy5wcm9wcy5pc09wZW4pIHtcbiAgICAgICAgYXJpYU93bnMgPSB7XG4gICAgICAgICAgJ2FyaWEtb3ducyc6IHRoaXMuaW50ZXJuYWxNZW51SWRcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gZXhwYW5kIGN1c3RvbSBpY29uIHNob3VsZCBOT1QgYmUgZGlzcGxheWVkIGluIG1lbnUgd2l0aCBob3Jpem9udGFsIG1vZGUuXG5cblxuICAgICAgdmFyIGljb24gPSBudWxsO1xuXG4gICAgICBpZiAocHJvcHMubW9kZSAhPT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgIGljb24gPSB0aGlzLnByb3BzLmV4cGFuZEljb247IC8vIFJlYWN0Tm9kZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5leHBhbmRJY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWNvbiA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy5leHBhbmRJY29uLCAoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoe30sIHRoaXMucHJvcHMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdGl0bGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICByZWY6IHRoaXMuc2F2ZVN1Yk1lbnVUaXRsZSxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGl0bGVcIiksXG4gICAgICAgIHJvbGU6IFwiYnV0dG9uXCJcbiAgICAgIH0sIHRpdGxlTW91c2VFdmVudHMsIHRpdGxlQ2xpY2tFdmVudHMsIHtcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGlzT3BlblxuICAgICAgfSwgYXJpYU93bnMsIHtcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwidHJ1ZVwiLFxuICAgICAgICB0aXRsZTogdHlwZW9mIHByb3BzLnRpdGxlID09PSAnc3RyaW5nJyA/IHByb3BzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICB9KSwgcHJvcHMudGl0bGUsIGljb24gfHwgUmVhY3QuY3JlYXRlRWxlbWVudChcImlcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3dcIilcbiAgICAgIH0pKTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucmVuZGVyQ2hpbGRyZW4ocHJvcHMuY2hpbGRyZW4pO1xuICAgICAgdmFyIGdldFBvcHVwQ29udGFpbmVyID0gKChfcHJvcHMkcGFyZW50TWVudSA9IHByb3BzLnBhcmVudE1lbnUpID09PSBudWxsIHx8IF9wcm9wcyRwYXJlbnRNZW51ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcHJvcHMkcGFyZW50TWVudS5pc1Jvb3RNZW51KSA/IHByb3BzLnBhcmVudE1lbnUucHJvcHMuZ2V0UG9wdXBDb250YWluZXIgOiBmdW5jdGlvbiAodHJpZ2dlck5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRyaWdnZXJOb2RlLnBhcmVudE5vZGU7XG4gICAgICB9O1xuICAgICAgdmFyIHBvcHVwUGxhY2VtZW50ID0gcG9wdXBQbGFjZW1lbnRNYXBbcHJvcHMubW9kZV07XG4gICAgICB2YXIgcG9wdXBBbGlnbiA9IHByb3BzLnBvcHVwT2Zmc2V0ID8ge1xuICAgICAgICBvZmZzZXQ6IHByb3BzLnBvcHVwT2Zmc2V0XG4gICAgICB9IDoge307XG4gICAgICB2YXIgcG9wdXBDbGFzc05hbWUgPSBwcm9wcy5tb2RlID09PSAnaW5saW5lJyA/ICcnIDogcHJvcHMucG9wdXBDbGFzc05hbWU7XG4gICAgICBwb3B1cENsYXNzTmFtZSArPSBkaXJlY3Rpb24gPT09ICdydGwnID8gXCIgXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpIDogJyc7XG4gICAgICB2YXIgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgICB0cmlnZ2VyU3ViTWVudUFjdGlvbiA9IHByb3BzLnRyaWdnZXJTdWJNZW51QWN0aW9uLFxuICAgICAgICAgIHN1Yk1lbnVPcGVuRGVsYXkgPSBwcm9wcy5zdWJNZW51T3BlbkRlbGF5LFxuICAgICAgICAgIGZvcmNlU3ViTWVudVJlbmRlciA9IHByb3BzLmZvcmNlU3ViTWVudVJlbmRlcixcbiAgICAgICAgICBzdWJNZW51Q2xvc2VEZWxheSA9IHByb3BzLnN1Yk1lbnVDbG9zZURlbGF5LFxuICAgICAgICAgIGJ1aWx0aW5QbGFjZW1lbnRzID0gcHJvcHMuYnVpbHRpblBsYWNlbWVudHM7XG5cbiAgICAgIF91dGlsLm1lbnVBbGxQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgfSk7IC8vIFNldCBvbkNsaWNrIHRvIG51bGwsIHRvIGlnbm9yZSBwcm9wYWdhdGVkIG9uQ2xpY2sgZXZlbnRcblxuXG4gICAgICBkZWxldGUgcHJvcHMub25DbGljaztcbiAgICAgIHZhciBwbGFjZW1lbnQgPSBkaXJlY3Rpb24gPT09ICdydGwnID8gT2JqZWN0LmFzc2lnbih7fSwgX3BsYWNlbWVudHMucGxhY2VtZW50c1J0bCwgYnVpbHRpblBsYWNlbWVudHMpIDogT2JqZWN0LmFzc2lnbih7fSwgX3BsYWNlbWVudHMucGxhY2VtZW50cywgYnVpbHRpblBsYWNlbWVudHMpO1xuICAgICAgZGVsZXRlIHByb3BzLmRpcmVjdGlvbjtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIG1vdXNlRXZlbnRzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICByb2xlOiBcIm1lbnVpdGVtXCJcbiAgICAgIH0pLCBpc0lubGluZU1vZGUgJiYgdGl0bGUsIGlzSW5saW5lTW9kZSAmJiBjaGlsZHJlbiwgIWlzSW5saW5lTW9kZSAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY1RyaWdnZXIuZGVmYXVsdCwge1xuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgcG9wdXBDbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBvcHVwXCIpLCBwb3B1cENsYXNzTmFtZSksXG4gICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgYnVpbHRpblBsYWNlbWVudHM6IHBsYWNlbWVudCxcbiAgICAgICAgcG9wdXBQbGFjZW1lbnQ6IHBvcHVwUGxhY2VtZW50LFxuICAgICAgICBwb3B1cFZpc2libGU6IGlzT3BlbixcbiAgICAgICAgcG9wdXBBbGlnbjogcG9wdXBBbGlnbixcbiAgICAgICAgcG9wdXA6IGNoaWxkcmVuLFxuICAgICAgICBhY3Rpb246IGRpc2FibGVkID8gW10gOiBbdHJpZ2dlclN1Yk1lbnVBY3Rpb25dLFxuICAgICAgICBtb3VzZUVudGVyRGVsYXk6IHN1Yk1lbnVPcGVuRGVsYXksXG4gICAgICAgIG1vdXNlTGVhdmVEZWxheTogc3ViTWVudUNsb3NlRGVsYXksXG4gICAgICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiB0aGlzLm9uUG9wdXBWaXNpYmxlQ2hhbmdlLFxuICAgICAgICBmb3JjZVJlbmRlcjogZm9yY2VTdWJNZW51UmVuZGVyXG4gICAgICB9LCB0aXRsZSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gU3ViTWVudTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0cy5TdWJNZW51ID0gU3ViTWVudTtcblN1Yk1lbnUuZGVmYXVsdFByb3BzID0ge1xuICBvbk1vdXNlRW50ZXI6IF91dGlsLm5vb3AsXG4gIG9uTW91c2VMZWF2ZTogX3V0aWwubm9vcCxcbiAgb25UaXRsZU1vdXNlRW50ZXI6IF91dGlsLm5vb3AsXG4gIG9uVGl0bGVNb3VzZUxlYXZlOiBfdXRpbC5ub29wLFxuICBvblRpdGxlQ2xpY2s6IF91dGlsLm5vb3AsXG4gIG1hbnVhbFJlZjogX3V0aWwubm9vcCxcbiAgbW9kZTogJ3ZlcnRpY2FsJyxcbiAgdGl0bGU6ICcnXG59O1xudmFyIGNvbm5lY3RlZCA9ICgwLCBfbWluaVN0b3JlLmNvbm5lY3QpKGZ1bmN0aW9uIChfcmVmMiwgX3JlZjMpIHtcbiAgdmFyIG9wZW5LZXlzID0gX3JlZjIub3BlbktleXMsXG4gICAgICBhY3RpdmVLZXkgPSBfcmVmMi5hY3RpdmVLZXksXG4gICAgICBzZWxlY3RlZEtleXMgPSBfcmVmMi5zZWxlY3RlZEtleXM7XG4gIHZhciBldmVudEtleSA9IF9yZWYzLmV2ZW50S2V5LFxuICAgICAgc3ViTWVudUtleSA9IF9yZWYzLnN1Yk1lbnVLZXk7XG4gIHJldHVybiB7XG4gICAgaXNPcGVuOiBvcGVuS2V5cy5pbmRleE9mKGV2ZW50S2V5KSA+IC0xLFxuICAgIGFjdGl2ZTogYWN0aXZlS2V5W3N1Yk1lbnVLZXldID09PSBldmVudEtleSxcbiAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5c1xuICB9O1xufSkoU3ViTWVudSk7XG5jb25uZWN0ZWQuaXNTdWJNZW51ID0gdHJ1ZTtcbnZhciBfZGVmYXVsdCA9IGNvbm5lY3RlZDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0QWN0aXZlS2V5ID0gZ2V0QWN0aXZlS2V5O1xuZXhwb3J0cy5zYXZlUmVmID0gc2F2ZVJlZjtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuU3ViUG9wdXBNZW51ID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX21pbmlTdG9yZSA9IHJlcXVpcmUoXCJtaW5pLXN0b3JlXCIpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9jcmVhdGVDaGFpbmVkRnVuY3Rpb25cIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxudmFyIF9zaGFsbG93ZXF1YWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJzaGFsbG93ZXF1YWxcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF91dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxudmFyIF9ET01XcmFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ET01XcmFwXCIpKTtcblxuZnVuY3Rpb24gYWxsRGlzYWJsZWQoYXJyKSB7XG4gIGlmICghYXJyLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGFyci5ldmVyeShmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiAhIWMucHJvcHMuZGlzYWJsZWQ7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBY3RpdmVLZXkoc3RvcmUsIG1lbnVJZCwgYWN0aXZlS2V5KSB7XG4gIHZhciBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gIHN0b3JlLnNldFN0YXRlKHtcbiAgICBhY3RpdmVLZXk6ICgwLCBfb2JqZWN0U3ByZWFkNC5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDQuZGVmYXVsdCkoe30sIHN0YXRlLmFjdGl2ZUtleSksIHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgbWVudUlkLCBhY3RpdmVLZXkpKVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkocHJvcHMpIHtcbiAgLy8gd2hlbiBldmVudEtleSBub3QgYXZhaWxhYmxlICxpdCdzIG1lbnUgYW5kIHJldHVybiBtZW51IGlkICcwLW1lbnUtJ1xuICByZXR1cm4gcHJvcHMuZXZlbnRLZXkgfHwgJzAtbWVudS0nO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVLZXkocHJvcHMsIG9yaWdpbmFsQWN0aXZlS2V5KSB7XG4gIHZhciBhY3RpdmVLZXkgPSBvcmlnaW5hbEFjdGl2ZUtleTtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBldmVudEtleSA9IHByb3BzLmV2ZW50S2V5O1xuXG4gIGlmIChhY3RpdmVLZXkpIHtcbiAgICB2YXIgZm91bmQ7XG4gICAgKDAsIF91dGlsLmxvb3BNZW51SXRlbSkoY2hpbGRyZW4sIGZ1bmN0aW9uIChjLCBpKSB7XG4gICAgICBpZiAoYyAmJiBjLnByb3BzICYmICFjLnByb3BzLmRpc2FibGVkICYmIGFjdGl2ZUtleSA9PT0gKDAsIF91dGlsLmdldEtleUZyb21DaGlsZHJlbkluZGV4KShjLCBldmVudEtleSwgaSkpIHtcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXR1cm4gYWN0aXZlS2V5O1xuICAgIH1cbiAgfVxuXG4gIGFjdGl2ZUtleSA9IG51bGw7XG5cbiAgaWYgKHByb3BzLmRlZmF1bHRBY3RpdmVGaXJzdCkge1xuICAgICgwLCBfdXRpbC5sb29wTWVudUl0ZW0pKGNoaWxkcmVuLCBmdW5jdGlvbiAoYywgaSkge1xuICAgICAgaWYgKCFhY3RpdmVLZXkgJiYgYyAmJiAhYy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgICBhY3RpdmVLZXkgPSAoMCwgX3V0aWwuZ2V0S2V5RnJvbUNoaWxkcmVuSW5kZXgpKGMsIGV2ZW50S2V5LCBpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aXZlS2V5O1xuICB9XG5cbiAgcmV0dXJuIGFjdGl2ZUtleTtcbn1cblxuZnVuY3Rpb24gc2F2ZVJlZihjKSB7XG4gIGlmIChjKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5pbnN0YW5jZUFycmF5LmluZGV4T2YoYyk7XG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAvLyB1cGRhdGUgY29tcG9uZW50IGlmIGl0J3MgYWxyZWFkeSBpbnNpZGUgaW5zdGFuY2VBcnJheVxuICAgICAgdGhpcy5pbnN0YW5jZUFycmF5W2luZGV4XSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkZCBjb21wb25lbnQgaWYgaXQncyBub3QgaW4gaW5zdGFuY2VBcnJheSB5ZXQ7XG4gICAgICB0aGlzLmluc3RhbmNlQXJyYXkucHVzaChjKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFN1YlBvcHVwTWVudSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShTdWJQb3B1cE1lbnUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShTdWJQb3B1cE1lbnUpO1xuXG4gIGZ1bmN0aW9uIFN1YlBvcHVwTWVudShwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIFN1YlBvcHVwTWVudSk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgLyoqXG4gICAgICogYWxsIGtleWJvYXJkIGV2ZW50cyBjYWxsYmFja3MgcnVuIGZyb20gaGVyZSBhdCBmaXJzdFxuICAgICAqXG4gICAgICogbm90ZTpcbiAgICAgKiAgVGhpcyBsZWdhY3kgY29kZSB0aGF0IGBvbktleURvd25gIGlzIGNhbGxlZCBieSBwYXJlbnQgaW5zdGVhZCBvZiBkb20gc2VsZi5cbiAgICAgKiAgd2hpY2ggbmVlZCByZXR1cm4gY29kZSB0byBjaGVjayBpZiB0aGlzIGV2ZW50IGlzIGhhbmRsZWRcbiAgICAgKi9cblxuICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChlLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGtleUNvZGUgPSBlLmtleUNvZGU7XG4gICAgICB2YXIgaGFuZGxlZDtcblxuICAgICAgX3RoaXMuZ2V0RmxhdEluc3RhbmNlQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKG9iaiAmJiBvYmoucHJvcHMuYWN0aXZlICYmIG9iai5vbktleURvd24pIHtcbiAgICAgICAgICBoYW5kbGVkID0gb2JqLm9uS2V5RG93bihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWN0aXZlSXRlbSA9IG51bGw7XG5cbiAgICAgIGlmIChrZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LlVQIHx8IGtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuRE9XTikge1xuICAgICAgICBhY3RpdmVJdGVtID0gX3RoaXMuc3RlcChrZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LlVQID8gLTEgOiAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB1cGRhdGVBY3RpdmVLZXkoX3RoaXMucHJvcHMuc3RvcmUsIGdldEV2ZW50S2V5KF90aGlzLnByb3BzKSwgYWN0aXZlSXRlbS5wcm9wcy5ldmVudEtleSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNhbGxiYWNrKGFjdGl2ZUl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIF90aGlzLm9uSXRlbUhvdmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBrZXkgPSBlLmtleSxcbiAgICAgICAgICBob3ZlciA9IGUuaG92ZXI7XG4gICAgICB1cGRhdGVBY3RpdmVLZXkoX3RoaXMucHJvcHMuc3RvcmUsIGdldEV2ZW50S2V5KF90aGlzLnByb3BzKSwgaG92ZXIgPyBrZXkgOiBudWxsKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25EZXNlbGVjdCA9IGZ1bmN0aW9uIChzZWxlY3RJbmZvKSB7XG4gICAgICBfdGhpcy5wcm9wcy5vbkRlc2VsZWN0KHNlbGVjdEluZm8pO1xuICAgIH07XG5cbiAgICBfdGhpcy5vblNlbGVjdCA9IGZ1bmN0aW9uIChzZWxlY3RJbmZvKSB7XG4gICAgICBfdGhpcy5wcm9wcy5vblNlbGVjdChzZWxlY3RJbmZvKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25DbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5wcm9wcy5vbkNsaWNrKGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbk9wZW5DaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMucHJvcHMub25PcGVuQ2hhbmdlKGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkRlc3Ryb3kgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgX3RoaXMucHJvcHMub25EZXN0cm95KGtleSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldEZsYXRJbnN0YW5jZUFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmluc3RhbmNlQXJyYXk7XG4gICAgfTtcblxuICAgIF90aGlzLnN0ZXAgPSBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBfdGhpcy5nZXRGbGF0SW5zdGFuY2VBcnJheSgpO1xuXG4gICAgICB2YXIgYWN0aXZlS2V5ID0gX3RoaXMucHJvcHMuc3RvcmUuZ2V0U3RhdGUoKS5hY3RpdmVLZXlbZ2V0RXZlbnRLZXkoX3RoaXMucHJvcHMpXTtcblxuICAgICAgdmFyIGxlbiA9IGNoaWxkcmVuLmxlbmd0aDtcblxuICAgICAgaWYgKCFsZW4pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7XG4gICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uY29uY2F0KCkucmV2ZXJzZSgpO1xuICAgICAgfSAvLyBmaW5kIGN1cnJlbnQgYWN0aXZlSW5kZXhcblxuXG4gICAgICB2YXIgYWN0aXZlSW5kZXggPSAtMTtcbiAgICAgIGNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uIChjLCBjaSkge1xuICAgICAgICBpZiAoYyAmJiBjLnByb3BzLmV2ZW50S2V5ID09PSBhY3RpdmVLZXkpIHtcbiAgICAgICAgICBhY3RpdmVJbmRleCA9IGNpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghX3RoaXMucHJvcHMuZGVmYXVsdEFjdGl2ZUZpcnN0ICYmIGFjdGl2ZUluZGV4ICE9PSAtMSAmJiBhbGxEaXNhYmxlZChjaGlsZHJlbi5zbGljZShhY3RpdmVJbmRleCwgbGVuIC0gMSkpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydCA9IChhY3RpdmVJbmRleCArIDEpICUgbGVuO1xuICAgICAgdmFyIGkgPSBzdGFydDtcblxuICAgICAgZG8ge1xuICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgICAgICBpZiAoIWNoaWxkIHx8IGNoaWxkLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgICAgaSA9IChpICsgMSkgJSBsZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlIChpICE9PSBzdGFydCk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJDb21tb25NZW51SXRlbSA9IGZ1bmN0aW9uIChjaGlsZCwgaSwgZXh0cmFQcm9wcykge1xuICAgICAgdmFyIHN0YXRlID0gX3RoaXMucHJvcHMuc3RvcmUuZ2V0U3RhdGUoKTtcblxuICAgICAgdmFyIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZSA9ICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcyksXG4gICAgICAgICAgcHJvcHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUucHJvcHM7XG5cbiAgICAgIHZhciBrZXkgPSAoMCwgX3V0aWwuZ2V0S2V5RnJvbUNoaWxkcmVuSW5kZXgpKGNoaWxkLCBwcm9wcy5ldmVudEtleSwgaSk7XG4gICAgICB2YXIgY2hpbGRQcm9wcyA9IGNoaWxkLnByb3BzOyAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xMTUxNyNpc3N1ZWNvbW1lbnQtNDc3NDAzMDU1XG5cbiAgICAgIGlmICghY2hpbGRQcm9wcyB8fCB0eXBlb2YgY2hpbGQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNBY3RpdmUgPSBrZXkgPT09IHN0YXRlLmFjdGl2ZUtleTtcbiAgICAgIHZhciBuZXdDaGlsZFByb3BzID0gKDAsIF9vYmplY3RTcHJlYWQ0LmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkNC5kZWZhdWx0KSh7XG4gICAgICAgIG1vZGU6IGNoaWxkUHJvcHMubW9kZSB8fCBwcm9wcy5tb2RlLFxuICAgICAgICBsZXZlbDogcHJvcHMubGV2ZWwsXG4gICAgICAgIGlubGluZUluZGVudDogcHJvcHMuaW5saW5lSW5kZW50LFxuICAgICAgICByZW5kZXJNZW51SXRlbTogX3RoaXMucmVuZGVyTWVudUl0ZW0sXG4gICAgICAgIHJvb3RQcmVmaXhDbHM6IHByb3BzLnByZWZpeENscyxcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIHBhcmVudE1lbnU6IHByb3BzLnBhcmVudE1lbnUsXG4gICAgICAgIC8vIGN1c3RvbWl6ZWQgcmVmIGZ1bmN0aW9uLCBuZWVkIHRvIGJlIGludm9rZWQgbWFudWFsbHkgaW4gY2hpbGQncyBjb21wb25lbnREaWRNb3VudFxuICAgICAgICBtYW51YWxSZWY6IGNoaWxkUHJvcHMuZGlzYWJsZWQgPyB1bmRlZmluZWQgOiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbi5kZWZhdWx0KShjaGlsZC5yZWYsIHNhdmVSZWYuYmluZCgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpKSksXG4gICAgICAgIGV2ZW50S2V5OiBrZXksXG4gICAgICAgIGFjdGl2ZTogIWNoaWxkUHJvcHMuZGlzYWJsZWQgJiYgaXNBY3RpdmUsXG4gICAgICAgIG11bHRpcGxlOiBwcm9wcy5tdWx0aXBsZSxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgICAgKGNoaWxkUHJvcHMub25DbGljayB8fCBfdXRpbC5ub29wKShlKTtcblxuICAgICAgICAgIF90aGlzLm9uQ2xpY2soZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uSXRlbUhvdmVyOiBfdGhpcy5vbkl0ZW1Ib3ZlcixcbiAgICAgICAgbW90aW9uOiBwcm9wcy5tb3Rpb24sXG4gICAgICAgIHN1Yk1lbnVPcGVuRGVsYXk6IHByb3BzLnN1Yk1lbnVPcGVuRGVsYXksXG4gICAgICAgIHN1Yk1lbnVDbG9zZURlbGF5OiBwcm9wcy5zdWJNZW51Q2xvc2VEZWxheSxcbiAgICAgICAgZm9yY2VTdWJNZW51UmVuZGVyOiBwcm9wcy5mb3JjZVN1Yk1lbnVSZW5kZXIsXG4gICAgICAgIG9uT3BlbkNoYW5nZTogX3RoaXMub25PcGVuQ2hhbmdlLFxuICAgICAgICBvbkRlc2VsZWN0OiBfdGhpcy5vbkRlc2VsZWN0LFxuICAgICAgICBvblNlbGVjdDogX3RoaXMub25TZWxlY3QsXG4gICAgICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBwcm9wcy5idWlsdGluUGxhY2VtZW50cyxcbiAgICAgICAgaXRlbUljb246IGNoaWxkUHJvcHMuaXRlbUljb24gfHwgX3RoaXMucHJvcHMuaXRlbUljb24sXG4gICAgICAgIGV4cGFuZEljb246IGNoaWxkUHJvcHMuZXhwYW5kSWNvbiB8fCBfdGhpcy5wcm9wcy5leHBhbmRJY29uXG4gICAgICB9LCBleHRyYVByb3BzKSwge30sIHtcbiAgICAgICAgZGlyZWN0aW9uOiBwcm9wcy5kaXJlY3Rpb25cbiAgICAgIH0pOyAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzEzOTQzXG5cbiAgICAgIGlmIChwcm9wcy5tb2RlID09PSAnaW5saW5lJyB8fCAoMCwgX3V0aWwuaXNNb2JpbGVEZXZpY2UpKCkpIHtcbiAgICAgICAgbmV3Q2hpbGRQcm9wcy50cmlnZ2VyU3ViTWVudUFjdGlvbiA9ICdjbGljayc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsICgwLCBfb2JqZWN0U3ByZWFkNC5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDQuZGVmYXVsdCkoe30sIG5ld0NoaWxkUHJvcHMpLCB7fSwge1xuICAgICAgICBrZXk6IGtleSB8fCBpXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlck1lbnVJdGVtID0gZnVuY3Rpb24gKGMsIGksIHN1Yk1lbnVLZXkpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFjKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RhdGUgPSBfdGhpcy5wcm9wcy5zdG9yZS5nZXRTdGF0ZSgpO1xuXG4gICAgICB2YXIgZXh0cmFQcm9wcyA9IHtcbiAgICAgICAgb3BlbktleXM6IHN0YXRlLm9wZW5LZXlzLFxuICAgICAgICBzZWxlY3RlZEtleXM6IHN0YXRlLnNlbGVjdGVkS2V5cyxcbiAgICAgICAgdHJpZ2dlclN1Yk1lbnVBY3Rpb246IF90aGlzLnByb3BzLnRyaWdnZXJTdWJNZW51QWN0aW9uLFxuICAgICAgICBzdWJNZW51S2V5OiBzdWJNZW51S2V5XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF90aGlzLnJlbmRlckNvbW1vbk1lbnVJdGVtKGMsIGksIGV4dHJhUHJvcHMpO1xuICAgIH07XG5cbiAgICBwcm9wcy5zdG9yZS5zZXRTdGF0ZSh7XG4gICAgICBhY3RpdmVLZXk6ICgwLCBfb2JqZWN0U3ByZWFkNC5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDQuZGVmYXVsdCkoe30sIHByb3BzLnN0b3JlLmdldFN0YXRlKCkuYWN0aXZlS2V5KSwge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBwcm9wcy5ldmVudEtleSwgZ2V0QWN0aXZlS2V5KHByb3BzLCBwcm9wcy5hY3RpdmVLZXkpKSlcbiAgICB9KTtcbiAgICBfdGhpcy5pbnN0YW5jZUFycmF5ID0gW107XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoU3ViUG9wdXBNZW51LCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIC8vIGludm9rZSBjdXN0b21pemVkIHJlZiB0byBleHBvc2UgY29tcG9uZW50IHRvIG1peGluXG4gICAgICBpZiAodGhpcy5wcm9wcy5tYW51YWxSZWYpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5tYW51YWxSZWYodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy52aXNpYmxlIHx8IG5leHRQcm9wcy52aXNpYmxlIHx8IHRoaXMucHJvcHMuY2xhc3NOYW1lICE9PSBuZXh0UHJvcHMuY2xhc3NOYW1lIHx8ICEoMCwgX3NoYWxsb3dlcXVhbC5kZWZhdWx0KSh0aGlzLnByb3BzLnN0eWxlLCBuZXh0UHJvcHMuc3R5bGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBvcmlnaW5hbEFjdGl2ZUtleSA9ICdhY3RpdmVLZXknIGluIHByb3BzID8gcHJvcHMuYWN0aXZlS2V5IDogcHJvcHMuc3RvcmUuZ2V0U3RhdGUoKS5hY3RpdmVLZXlbZ2V0RXZlbnRLZXkocHJvcHMpXTtcbiAgICAgIHZhciBhY3RpdmVLZXkgPSBnZXRBY3RpdmVLZXkocHJvcHMsIG9yaWdpbmFsQWN0aXZlS2V5KTtcblxuICAgICAgaWYgKGFjdGl2ZUtleSAhPT0gb3JpZ2luYWxBY3RpdmVLZXkpIHtcbiAgICAgICAgdXBkYXRlQWN0aXZlS2V5KHByb3BzLnN0b3JlLCBnZXRFdmVudEtleShwcm9wcyksIGFjdGl2ZUtleSk7XG4gICAgICB9IGVsc2UgaWYgKCdhY3RpdmVLZXknIGluIHByZXZQcm9wcykge1xuICAgICAgICAvLyBJZiBwcmV2IGFjdGl2ZUtleSBpcyBub3Qgc2FtZSBhcyBjdXJyZW50IGFjdGl2ZUtleSxcbiAgICAgICAgLy8gd2Ugc2hvdWxkIHNldCBpdC5cbiAgICAgICAgdmFyIHByZXZBY3RpdmVLZXkgPSBnZXRBY3RpdmVLZXkocHJldlByb3BzLCBwcmV2UHJvcHMuYWN0aXZlS2V5KTtcblxuICAgICAgICBpZiAoYWN0aXZlS2V5ICE9PSBwcmV2QWN0aXZlS2V5KSB7XG4gICAgICAgICAgdXBkYXRlQWN0aXZlS2V5KHByb3BzLnN0b3JlLCBnZXRFdmVudEtleShwcm9wcyksIGFjdGl2ZUtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgcHJvcHMgPSAoMCwgX2V4dGVuZHMyLmRlZmF1bHQpKHt9LCB0aGlzLnByb3BzKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VBcnJheSA9IFtdO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcm9wcy5wcmVmaXhDbHMsIHByb3BzLmNsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJvcHMucHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHByb3BzLm1vZGUpKTtcbiAgICAgIHZhciBkb21Qcm9wcyA9IHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgIC8vIHJvbGUgY291bGQgYmUgJ3NlbGVjdCcgYW5kIGJ5IGRlZmF1bHQgc2V0IHRvIG1lbnVcbiAgICAgICAgcm9sZTogcHJvcHMucm9sZSB8fCAnbWVudSdcbiAgICAgIH07XG5cbiAgICAgIGlmIChwcm9wcy5pZCkge1xuICAgICAgICBkb21Qcm9wcy5pZCA9IHByb3BzLmlkO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZm9jdXNhYmxlKSB7XG4gICAgICAgIGRvbVByb3BzLnRhYkluZGV4ID0gMDtcbiAgICAgICAgZG9tUHJvcHMub25LZXlEb3duID0gdGhpcy5vbktleURvd247XG4gICAgICB9XG5cbiAgICAgIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgICAgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleSxcbiAgICAgICAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgICAgICBsZXZlbCA9IHByb3BzLmxldmVsLFxuICAgICAgICAgIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgICAgICAgIG92ZXJmbG93ZWRJbmRpY2F0b3IgPSBwcm9wcy5vdmVyZmxvd2VkSW5kaWNhdG9yLFxuICAgICAgICAgIHRoZW1lID0gcHJvcHMudGhlbWU7XG5cbiAgICAgIF91dGlsLm1lbnVBbGxQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgfSk7IC8vIE90aGVyd2lzZSwgdGhlIHByb3BhZ2F0ZWQgY2xpY2sgZXZlbnQgd2lsbCB0cmlnZ2VyIGFub3RoZXIgb25DbGlja1xuXG5cbiAgICAgIGRlbGV0ZSBwcm9wcy5vbkNsaWNrO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0RPTVdyYXAuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgIHRhZzogXCJ1bFwiLFxuICAgICAgICBsZXZlbDogbGV2ZWwsXG4gICAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICAgICAgb3ZlcmZsb3dlZEluZGljYXRvcjogb3ZlcmZsb3dlZEluZGljYXRvclxuICAgICAgfSwgZG9tUHJvcHMpLCAoMCwgX3RvQXJyYXkuZGVmYXVsdCkocHJvcHMuY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoYywgaSkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLnJlbmRlck1lbnVJdGVtKGMsIGksIGV2ZW50S2V5IHx8ICcwLW1lbnUtJyk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTdWJQb3B1cE1lbnU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHMuU3ViUG9wdXBNZW51ID0gU3ViUG9wdXBNZW51O1xuU3ViUG9wdXBNZW51LmRlZmF1bHRQcm9wcyA9IHtcbiAgcHJlZml4Q2xzOiAncmMtbWVudScsXG4gIGNsYXNzTmFtZTogJycsXG4gIG1vZGU6ICd2ZXJ0aWNhbCcsXG4gIGxldmVsOiAxLFxuICBpbmxpbmVJbmRlbnQ6IDI0LFxuICB2aXNpYmxlOiB0cnVlLFxuICBmb2N1c2FibGU6IHRydWUsXG4gIHN0eWxlOiB7fSxcbiAgbWFudWFsUmVmOiBfdXRpbC5ub29wXG59O1xudmFyIGNvbm5lY3RlZCA9ICgwLCBfbWluaVN0b3JlLmNvbm5lY3QpKCkoU3ViUG9wdXBNZW51KTtcbnZhciBfZGVmYXVsdCA9IGNvbm5lY3RlZDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlN1Yk1lbnVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX1N1Yk1lbnUuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJJdGVtXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9NZW51SXRlbS5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1lbnVJdGVtXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9NZW51SXRlbS5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1lbnVJdGVtR3JvdXBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX01lbnVJdGVtR3JvdXAuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJJdGVtR3JvdXBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX01lbnVJdGVtR3JvdXAuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEaXZpZGVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9EaXZpZGVyLmRlZmF1bHQ7XG4gIH1cbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX01lbnUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL01lbnVcIikpO1xuXG52YXIgX1N1Yk1lbnUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N1Yk1lbnVcIikpO1xuXG52YXIgX01lbnVJdGVtID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9NZW51SXRlbVwiKSk7XG5cbnZhciBfTWVudUl0ZW1Hcm91cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTWVudUl0ZW1Hcm91cFwiKSk7XG5cbnZhciBfRGl2aWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRGl2aWRlclwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9NZW51LmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMucGxhY2VtZW50c1J0bCA9IGV4cG9ydHMucGxhY2VtZW50cyA9IHZvaWQgMDtcbnZhciBhdXRvQWRqdXN0T3ZlcmZsb3cgPSB7XG4gIGFkanVzdFg6IDEsXG4gIGFkanVzdFk6IDFcbn07XG52YXIgcGxhY2VtZW50cyA9IHtcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDddXG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWy00LCAwXVxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbNCwgMF1cbiAgfVxufTtcbmV4cG9ydHMucGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG52YXIgcGxhY2VtZW50c1J0bCA9IHtcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDddXG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFstNCwgMF1cbiAgfSxcbiAgbGVmdFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbNCwgMF1cbiAgfVxufTtcbmV4cG9ydHMucGxhY2VtZW50c1J0bCA9IHBsYWNlbWVudHNSdGw7XG52YXIgX2RlZmF1bHQgPSBwbGFjZW1lbnRzO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5ub29wID0gbm9vcDtcbmV4cG9ydHMuZ2V0S2V5RnJvbUNoaWxkcmVuSW5kZXggPSBnZXRLZXlGcm9tQ2hpbGRyZW5JbmRleDtcbmV4cG9ydHMuZ2V0TWVudUlkRnJvbVN1Yk1lbnVFdmVudEtleSA9IGdldE1lbnVJZEZyb21TdWJNZW51RXZlbnRLZXk7XG5leHBvcnRzLmxvb3BNZW51SXRlbSA9IGxvb3BNZW51SXRlbTtcbmV4cG9ydHMubG9vcE1lbnVJdGVtUmVjdXJzaXZlbHkgPSBsb29wTWVudUl0ZW1SZWN1cnNpdmVseTtcbmV4cG9ydHMuaXNNb2JpbGVEZXZpY2UgPSBleHBvcnRzLnNldFN0eWxlID0gZXhwb3J0cy5nZXRXaWR0aCA9IGV4cG9ydHMubWVudUFsbFByb3BzID0gdm9pZCAwO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfaXNNb2JpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V0aWxzL2lzTW9iaWxlXCIpKTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIGdldEtleUZyb21DaGlsZHJlbkluZGV4KGNoaWxkLCBtZW51RXZlbnRLZXksIGluZGV4KSB7XG4gIHZhciBwcmVmaXggPSBtZW51RXZlbnRLZXkgfHwgJyc7XG4gIHJldHVybiBjaGlsZC5rZXkgfHwgXCJcIi5jb25jYXQocHJlZml4LCBcIml0ZW1fXCIpLmNvbmNhdChpbmRleCk7XG59XG5cbmZ1bmN0aW9uIGdldE1lbnVJZEZyb21TdWJNZW51RXZlbnRLZXkoZXZlbnRLZXkpIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KGV2ZW50S2V5LCBcIi1tZW51LVwiKTtcbn1cblxuZnVuY3Rpb24gbG9vcE1lbnVJdGVtKGNoaWxkcmVuLCBjYikge1xuICB2YXIgaW5kZXggPSAtMTtcbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGMpIHtcbiAgICBpbmRleCArPSAxO1xuXG4gICAgaWYgKGMgJiYgYy50eXBlICYmIGMudHlwZS5pc01lbnVJdGVtR3JvdXApIHtcbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goYy5wcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGMyKSB7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgIGNiKGMyLCBpbmRleCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2IoYywgaW5kZXgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGxvb3BNZW51SXRlbVJlY3Vyc2l2ZWx5KGNoaWxkcmVuLCBrZXlzLCByZXQpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghY2hpbGRyZW4gfHwgcmV0LmZpbmQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoYykge1xuICAgIGlmIChjKSB7XG4gICAgICB2YXIgY29uc3RydWN0ID0gYy50eXBlO1xuXG4gICAgICBpZiAoIWNvbnN0cnVjdCB8fCAhKGNvbnN0cnVjdC5pc1N1Yk1lbnUgfHwgY29uc3RydWN0LmlzTWVudUl0ZW0gfHwgY29uc3RydWN0LmlzTWVudUl0ZW1Hcm91cCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5cy5pbmRleE9mKGMua2V5KSAhPT0gLTEpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHJldC5maW5kID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoYy5wcm9wcy5jaGlsZHJlbikge1xuICAgICAgICBsb29wTWVudUl0ZW1SZWN1cnNpdmVseShjLnByb3BzLmNoaWxkcmVuLCBrZXlzLCByZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbnZhciBtZW51QWxsUHJvcHMgPSBbJ2RlZmF1bHRTZWxlY3RlZEtleXMnLCAnc2VsZWN0ZWRLZXlzJywgJ2RlZmF1bHRPcGVuS2V5cycsICdvcGVuS2V5cycsICdtb2RlJywgJ2dldFBvcHVwQ29udGFpbmVyJywgJ29uU2VsZWN0JywgJ29uRGVzZWxlY3QnLCAnb25EZXN0cm95JywgJ29wZW5UcmFuc2l0aW9uTmFtZScsICdvcGVuQW5pbWF0aW9uJywgJ3N1Yk1lbnVPcGVuRGVsYXknLCAnc3ViTWVudUNsb3NlRGVsYXknLCAnZm9yY2VTdWJNZW51UmVuZGVyJywgJ3RyaWdnZXJTdWJNZW51QWN0aW9uJywgJ2xldmVsJywgJ3NlbGVjdGFibGUnLCAnbXVsdGlwbGUnLCAnb25PcGVuQ2hhbmdlJywgJ3Zpc2libGUnLCAnZm9jdXNhYmxlJywgJ2RlZmF1bHRBY3RpdmVGaXJzdCcsICdwcmVmaXhDbHMnLCAnaW5saW5lSW5kZW50JywgJ3BhcmVudE1lbnUnLCAndGl0bGUnLCAncm9vdFByZWZpeENscycsICdldmVudEtleScsICdhY3RpdmUnLCAnb25JdGVtSG92ZXInLCAnb25UaXRsZU1vdXNlRW50ZXInLCAnb25UaXRsZU1vdXNlTGVhdmUnLCAnb25UaXRsZUNsaWNrJywgJ3BvcHVwQWxpZ24nLCAncG9wdXBPZmZzZXQnLCAnaXNPcGVuJywgJ3JlbmRlck1lbnVJdGVtJywgJ21hbnVhbFJlZicsICdzdWJNZW51S2V5JywgJ2Rpc2FibGVkJywgJ2luZGV4JywgJ2lzU2VsZWN0ZWQnLCAnc3RvcmUnLCAnYWN0aXZlS2V5JywgJ2J1aWx0aW5QbGFjZW1lbnRzJywgJ292ZXJmbG93ZWRJbmRpY2F0b3InLCAnbW90aW9uJywgLy8gdGhlIGZvbGxvd2luZyBrZXlzIGZvdW5kIG5lZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRlc3QgcmVncmVzc2lvblxuJ2F0dHJpYnV0ZScsICd2YWx1ZScsICdwb3B1cENsYXNzTmFtZScsICdpbmxpbmVDb2xsYXBzZWQnLCAnbWVudScsICd0aGVtZScsICdpdGVtSWNvbicsICdleHBhbmRJY29uJ107IC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTQwMDdcbi8vIHJlZjogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzYwODg5XG4vLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QgcmV0dXJuIHRoZSBmdWxsIHByZWNpc2lvbiB2YWx1ZSwgd2hpY2ggaXNcbi8vIG5vdCB0aGUgc2FtZSBiZWhhdmlvciBhcyBvbiBjaHJvbWUuIFNldCB0aGUgcHJlY2lzaW9uIHRvIDYgdG9cbi8vIHVuaWZ5IHRoZWlyIGJlaGF2aW9yXG5cbmV4cG9ydHMubWVudUFsbFByb3BzID0gbWVudUFsbFByb3BzO1xuXG52YXIgZ2V0V2lkdGggPSBmdW5jdGlvbiBnZXRXaWR0aChlbGVtKSB7XG4gIHZhciBpbmNsdWRlTWFyZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgdmFyIHdpZHRoID0gZWxlbSAmJiB0eXBlb2YgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicgJiYgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICBpZiAod2lkdGgpIHtcbiAgICBpZiAoaW5jbHVkZU1hcmdpbikge1xuICAgICAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKSxcbiAgICAgICAgICBtYXJnaW5MZWZ0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luTGVmdCxcbiAgICAgICAgICBtYXJnaW5SaWdodCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblJpZ2h0O1xuXG4gICAgICB3aWR0aCArPSArbWFyZ2luTGVmdC5yZXBsYWNlKCdweCcsICcnKSArICttYXJnaW5SaWdodC5yZXBsYWNlKCdweCcsICcnKTtcbiAgICB9XG5cbiAgICB3aWR0aCA9ICt3aWR0aC50b0ZpeGVkKDYpO1xuICB9XG5cbiAgcmV0dXJuIHdpZHRoIHx8IDA7XG59O1xuXG5leHBvcnRzLmdldFdpZHRoID0gZ2V0V2lkdGg7XG5cbnZhciBzZXRTdHlsZSA9IGZ1bmN0aW9uIHNldFN0eWxlKGVsZW0sIHN0eWxlUHJvcGVydHksIHZhbHVlKSB7XG4gIGlmIChlbGVtICYmICgwLCBfdHlwZW9mMi5kZWZhdWx0KShlbGVtLnN0eWxlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBlbGVtLnN0eWxlW3N0eWxlUHJvcGVydHldID0gdmFsdWU7XG4gIH1cbn07XG5cbmV4cG9ydHMuc2V0U3R5bGUgPSBzZXRTdHlsZTtcblxudmFyIGlzTW9iaWxlRGV2aWNlID0gZnVuY3Rpb24gaXNNb2JpbGVEZXZpY2UoKSB7XG4gIHJldHVybiBfaXNNb2JpbGUuZGVmYXVsdC5hbnk7XG59O1xuXG5leHBvcnRzLmlzTW9iaWxlRGV2aWNlID0gaXNNb2JpbGVEZXZpY2U7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxuLy8gTUlUIExpY2Vuc2UgZnJvbSBodHRwczovL2dpdGh1Yi5jb20va2FpbWFsbGVhL2lzTW9iaWxlXG52YXIgYXBwbGVQaG9uZSA9IC9pUGhvbmUvaTtcbnZhciBhcHBsZUlwb2QgPSAvaVBvZC9pO1xudmFyIGFwcGxlVGFibGV0ID0gL2lQYWQvaTtcbnZhciBhbmRyb2lkUGhvbmUgPSAvXFxiQW5kcm9pZCg/Oi4rKU1vYmlsZVxcYi9pOyAvLyBNYXRjaCAnQW5kcm9pZCcgQU5EICdNb2JpbGUnXG5cbnZhciBhbmRyb2lkVGFibGV0ID0gL0FuZHJvaWQvaTtcbnZhciBhbWF6b25QaG9uZSA9IC9cXGJBbmRyb2lkKD86LispU0Q0OTMwVVJcXGIvaTtcbnZhciBhbWF6b25UYWJsZXQgPSAvXFxiQW5kcm9pZCg/Oi4rKSg/OktGW0EtWl17Miw0fSlcXGIvaTtcbnZhciB3aW5kb3dzUGhvbmUgPSAvV2luZG93cyBQaG9uZS9pO1xudmFyIHdpbmRvd3NUYWJsZXQgPSAvXFxiV2luZG93cyg/Oi4rKUFSTVxcYi9pOyAvLyBNYXRjaCAnV2luZG93cycgQU5EICdBUk0nXG5cbnZhciBvdGhlckJsYWNrYmVycnkgPSAvQmxhY2tCZXJyeS9pO1xudmFyIG90aGVyQmxhY2tiZXJyeTEwID0gL0JCMTAvaTtcbnZhciBvdGhlck9wZXJhID0gL09wZXJhIE1pbmkvaTtcbnZhciBvdGhlckNocm9tZSA9IC9cXGIoQ3JpT1N8Q2hyb21lKSg/Oi4rKU1vYmlsZS9pO1xudmFyIG90aGVyRmlyZWZveCA9IC9Nb2JpbGUoPzouKylGaXJlZm94XFxiL2k7IC8vIE1hdGNoICdNb2JpbGUnIEFORCAnRmlyZWZveCdcblxuZnVuY3Rpb24gbWF0Y2gocmVnZXgsIHVzZXJBZ2VudCkge1xuICByZXR1cm4gcmVnZXgudGVzdCh1c2VyQWdlbnQpO1xufVxuXG5mdW5jdGlvbiBpc01vYmlsZSh1c2VyQWdlbnQpIHtcbiAgdmFyIHVhID0gdXNlckFnZW50IHx8ICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAnJyk7IC8vIEZhY2Vib29rIG1vYmlsZSBhcHAncyBpbnRlZ3JhdGVkIGJyb3dzZXIgYWRkcyBhIGJ1bmNoIG9mIHN0cmluZ3MgdGhhdFxuICAvLyBtYXRjaCBldmVyeXRoaW5nLiBTdHJpcCBpdCBvdXQgaWYgaXQgZXhpc3RzLlxuXG4gIHZhciB0bXAgPSB1YS5zcGxpdCgnW0ZCQU4nKTtcblxuICBpZiAodHlwZW9mIHRtcFsxXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgX3RtcCA9IHRtcDtcblxuICAgIHZhciBfdG1wMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3RtcCwgMSk7XG5cbiAgICB1YSA9IF90bXAyWzBdO1xuICB9IC8vIFR3aXR0ZXIgbW9iaWxlIGFwcCdzIGludGVncmF0ZWQgYnJvd3NlciBvbiBpUGFkIGFkZHMgYSBcIlR3aXR0ZXIgZm9yXG4gIC8vIGlQaG9uZVwiIHN0cmluZy4gU2FtZSBwcm9iYWJseSBoYXBwZW5zIG9uIG90aGVyIHRhYmxldCBwbGF0Zm9ybXMuXG4gIC8vIFRoaXMgd2lsbCBjb25mdXNlIGRldGVjdGlvbiBzbyBzdHJpcCBpdCBvdXQgaWYgaXQgZXhpc3RzLlxuXG5cbiAgdG1wID0gdWEuc3BsaXQoJ1R3aXR0ZXInKTtcblxuICBpZiAodHlwZW9mIHRtcFsxXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgX3RtcDMgPSB0bXA7XG5cbiAgICB2YXIgX3RtcDQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF90bXAzLCAxKTtcblxuICAgIHVhID0gX3RtcDRbMF07XG4gIH1cblxuICB2YXIgcmVzdWx0ID0ge1xuICAgIGFwcGxlOiB7XG4gICAgICBwaG9uZTogbWF0Y2goYXBwbGVQaG9uZSwgdWEpICYmICFtYXRjaCh3aW5kb3dzUGhvbmUsIHVhKSxcbiAgICAgIGlwb2Q6IG1hdGNoKGFwcGxlSXBvZCwgdWEpLFxuICAgICAgdGFibGV0OiAhbWF0Y2goYXBwbGVQaG9uZSwgdWEpICYmIG1hdGNoKGFwcGxlVGFibGV0LCB1YSkgJiYgIW1hdGNoKHdpbmRvd3NQaG9uZSwgdWEpLFxuICAgICAgZGV2aWNlOiAobWF0Y2goYXBwbGVQaG9uZSwgdWEpIHx8IG1hdGNoKGFwcGxlSXBvZCwgdWEpIHx8IG1hdGNoKGFwcGxlVGFibGV0LCB1YSkpICYmICFtYXRjaCh3aW5kb3dzUGhvbmUsIHVhKVxuICAgIH0sXG4gICAgYW1hem9uOiB7XG4gICAgICBwaG9uZTogbWF0Y2goYW1hem9uUGhvbmUsIHVhKSxcbiAgICAgIHRhYmxldDogIW1hdGNoKGFtYXpvblBob25lLCB1YSkgJiYgbWF0Y2goYW1hem9uVGFibGV0LCB1YSksXG4gICAgICBkZXZpY2U6IG1hdGNoKGFtYXpvblBob25lLCB1YSkgfHwgbWF0Y2goYW1hem9uVGFibGV0LCB1YSlcbiAgICB9LFxuICAgIGFuZHJvaWQ6IHtcbiAgICAgIHBob25lOiAhbWF0Y2god2luZG93c1Bob25lLCB1YSkgJiYgbWF0Y2goYW1hem9uUGhvbmUsIHVhKSB8fCAhbWF0Y2god2luZG93c1Bob25lLCB1YSkgJiYgbWF0Y2goYW5kcm9pZFBob25lLCB1YSksXG4gICAgICB0YWJsZXQ6ICFtYXRjaCh3aW5kb3dzUGhvbmUsIHVhKSAmJiAhbWF0Y2goYW1hem9uUGhvbmUsIHVhKSAmJiAhbWF0Y2goYW5kcm9pZFBob25lLCB1YSkgJiYgKG1hdGNoKGFtYXpvblRhYmxldCwgdWEpIHx8IG1hdGNoKGFuZHJvaWRUYWJsZXQsIHVhKSksXG4gICAgICBkZXZpY2U6ICFtYXRjaCh3aW5kb3dzUGhvbmUsIHVhKSAmJiAobWF0Y2goYW1hem9uUGhvbmUsIHVhKSB8fCBtYXRjaChhbWF6b25UYWJsZXQsIHVhKSB8fCBtYXRjaChhbmRyb2lkUGhvbmUsIHVhKSB8fCBtYXRjaChhbmRyb2lkVGFibGV0LCB1YSkpIHx8IG1hdGNoKC9cXGJva2h0dHBcXGIvaSwgdWEpXG4gICAgfSxcbiAgICB3aW5kb3dzOiB7XG4gICAgICBwaG9uZTogbWF0Y2god2luZG93c1Bob25lLCB1YSksXG4gICAgICB0YWJsZXQ6IG1hdGNoKHdpbmRvd3NUYWJsZXQsIHVhKSxcbiAgICAgIGRldmljZTogbWF0Y2god2luZG93c1Bob25lLCB1YSkgfHwgbWF0Y2god2luZG93c1RhYmxldCwgdWEpXG4gICAgfSxcbiAgICBvdGhlcjoge1xuICAgICAgYmxhY2tiZXJyeTogbWF0Y2gob3RoZXJCbGFja2JlcnJ5LCB1YSksXG4gICAgICBibGFja2JlcnJ5MTA6IG1hdGNoKG90aGVyQmxhY2tiZXJyeTEwLCB1YSksXG4gICAgICBvcGVyYTogbWF0Y2gob3RoZXJPcGVyYSwgdWEpLFxuICAgICAgZmlyZWZveDogbWF0Y2gob3RoZXJGaXJlZm94LCB1YSksXG4gICAgICBjaHJvbWU6IG1hdGNoKG90aGVyQ2hyb21lLCB1YSksXG4gICAgICBkZXZpY2U6IG1hdGNoKG90aGVyQmxhY2tiZXJyeSwgdWEpIHx8IG1hdGNoKG90aGVyQmxhY2tiZXJyeTEwLCB1YSkgfHwgbWF0Y2gob3RoZXJPcGVyYSwgdWEpIHx8IG1hdGNoKG90aGVyRmlyZWZveCwgdWEpIHx8IG1hdGNoKG90aGVyQ2hyb21lLCB1YSlcbiAgICB9LFxuICAgIC8vIEFkZGl0aW9uYWxcbiAgICBhbnk6IG51bGwsXG4gICAgcGhvbmU6IG51bGwsXG4gICAgdGFibGV0OiBudWxsXG4gIH07XG4gIHJlc3VsdC5hbnkgPSByZXN1bHQuYXBwbGUuZGV2aWNlIHx8IHJlc3VsdC5hbmRyb2lkLmRldmljZSB8fCByZXN1bHQud2luZG93cy5kZXZpY2UgfHwgcmVzdWx0Lm90aGVyLmRldmljZTsgLy8gZXhjbHVkZXMgJ290aGVyJyBkZXZpY2VzIGFuZCBpcG9kcywgdGFyZ2V0aW5nIHRvdWNoc2NyZWVuIHBob25lc1xuXG4gIHJlc3VsdC5waG9uZSA9IHJlc3VsdC5hcHBsZS5waG9uZSB8fCByZXN1bHQuYW5kcm9pZC5waG9uZSB8fCByZXN1bHQud2luZG93cy5waG9uZTtcbiAgcmVzdWx0LnRhYmxldCA9IHJlc3VsdC5hcHBsZS50YWJsZXQgfHwgcmVzdWx0LmFuZHJvaWQudGFibGV0IHx8IHJlc3VsdC53aW5kb3dzLnRhYmxldDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIGRlZmF1bHRSZXN1bHQgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBpc01vYmlsZSgpKSwge30sIHtcbiAgaXNNb2JpbGU6IGlzTW9iaWxlXG59KTtcbnZhciBfZGVmYXVsdCA9IGRlZmF1bHRSZXN1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldE1vdGlvbiA9IGdldE1vdGlvbjtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX3dhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi93YXJuaW5nXCIpKTtcblxuZnVuY3Rpb24gZ2V0TW90aW9uKF9yZWYsIF9yZWYyLCBtZW51TW9kZSkge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICBtb3Rpb24gPSBfcmVmLm1vdGlvbixcbiAgICAgIF9yZWYkZGVmYXVsdE1vdGlvbnMgPSBfcmVmLmRlZmF1bHRNb3Rpb25zLFxuICAgICAgZGVmYXVsdE1vdGlvbnMgPSBfcmVmJGRlZmF1bHRNb3Rpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkZGVmYXVsdE1vdGlvbnMsXG4gICAgICBvcGVuQW5pbWF0aW9uID0gX3JlZi5vcGVuQW5pbWF0aW9uLFxuICAgICAgb3BlblRyYW5zaXRpb25OYW1lID0gX3JlZi5vcGVuVHJhbnNpdGlvbk5hbWU7XG4gIHZhciBzd2l0Y2hpbmdNb2RlRnJvbUlubGluZSA9IF9yZWYyLnN3aXRjaGluZ01vZGVGcm9tSW5saW5lO1xuXG4gIGlmIChtb3Rpb24pIHtcbiAgICByZXR1cm4gbW90aW9uO1xuICB9XG5cbiAgaWYgKCgwLCBfdHlwZW9mMi5kZWZhdWx0KShvcGVuQW5pbWF0aW9uKSA9PT0gJ29iamVjdCcgJiYgb3BlbkFuaW1hdGlvbikge1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ09iamVjdCB0eXBlIG9mIGBvcGVuQW5pbWF0aW9uYCBpcyByZW1vdmVkLiBQbGVhc2UgdXNlIGBtb3Rpb25gIGluc3RlYWQuJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wZW5BbmltYXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vdGlvbk5hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3Blbi1cIikuY29uY2F0KG9wZW5BbmltYXRpb24pXG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcGVuVHJhbnNpdGlvbk5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW90aW9uTmFtZTogb3BlblRyYW5zaXRpb25OYW1lXG4gICAgfTtcbiAgfSAvLyBEZWZhdWx0IGxvZ2ljXG5cblxuICB2YXIgZGVmYXVsdE1vdGlvbiA9IGRlZmF1bHRNb3Rpb25zW21lbnVNb2RlXTtcblxuICBpZiAoZGVmYXVsdE1vdGlvbikge1xuICAgIHJldHVybiBkZWZhdWx0TW90aW9uO1xuICB9IC8vIFdoZW4gbW9kZSBzd2l0Y2ggZnJvbSBpbmxpbmVcbiAgLy8gc3VibWVudSBzaG91bGQgaGlkZSB3aXRob3V0IGFuaW1hdGlvblxuXG5cbiAgcmV0dXJuIHN3aXRjaGluZ01vZGVGcm9tSW5saW5lID8gbnVsbCA6IGRlZmF1bHRNb3Rpb25zLm90aGVyO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2VuQ1NTTW90aW9uID0gZ2VuQ1NTTW90aW9uO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2ZpbmRET01Ob2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2ZpbmRET01Ob2RlXCIpKTtcblxudmFyIF9yZWYgPSByZXF1aXJlKFwicmMtdXRpbC9saWIvcmVmXCIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9tb3Rpb24gPSByZXF1aXJlKFwiLi91dGlsL21vdGlvblwiKTtcblxudmFyIF9pbnRlcmZhY2UgPSByZXF1aXJlKFwiLi9pbnRlcmZhY2VcIik7XG5cbnZhciBfdXNlU3RhdHVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlU3RhdHVzXCIpKTtcblxudmFyIF9Eb21XcmFwcGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Eb21XcmFwcGVyXCIpKTtcblxudmFyIF91c2VTdGVwUXVldWUgPSByZXF1aXJlKFwiLi9ob29rcy91c2VTdGVwUXVldWVcIik7XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2RlZmF1bHQtcHJvcHMtbWF0Y2gtcHJvcC10eXBlcywgcmVhY3Qvbm8tbXVsdGktY29tcCwgcmVhY3QvcHJvcC10eXBlcyAqL1xuXG4vKipcbiAqIGB0cmFuc2l0aW9uU3VwcG9ydGAgaXMgdXNlZCBmb3Igbm9uZSB0cmFuc2l0aW9uIHRlc3QgY2FzZS5cbiAqIERlZmF1bHQgd2UgdXNlIGJyb3dzZXIgdHJhbnNpdGlvbiBldmVudCBzdXBwb3J0IGNoZWNrLlxuICovXG5mdW5jdGlvbiBnZW5DU1NNb3Rpb24oY29uZmlnKSB7XG4gIHZhciB0cmFuc2l0aW9uU3VwcG9ydCA9IGNvbmZpZztcblxuICBpZiAoKDAsIF90eXBlb2YyLmRlZmF1bHQpKGNvbmZpZykgPT09ICdvYmplY3QnKSB7XG4gICAgdHJhbnNpdGlvblN1cHBvcnQgPSBjb25maWcudHJhbnNpdGlvblN1cHBvcnQ7XG4gIH1cblxuICBmdW5jdGlvbiBpc1N1cHBvcnRUcmFuc2l0aW9uKHByb3BzKSB7XG4gICAgcmV0dXJuICEhKHByb3BzLm1vdGlvbk5hbWUgJiYgdHJhbnNpdGlvblN1cHBvcnQpO1xuICB9XG5cbiAgdmFyIENTU01vdGlvbiA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICB2YXIgX3Byb3BzJHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgICB2aXNpYmxlID0gX3Byb3BzJHZpc2libGUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkdmlzaWJsZSxcbiAgICAgICAgX3Byb3BzJHJlbW92ZU9uTGVhdmUgPSBwcm9wcy5yZW1vdmVPbkxlYXZlLFxuICAgICAgICByZW1vdmVPbkxlYXZlID0gX3Byb3BzJHJlbW92ZU9uTGVhdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkcmVtb3ZlT25MZWF2ZSxcbiAgICAgICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgbW90aW9uTmFtZSA9IHByb3BzLm1vdGlvbk5hbWUsXG4gICAgICAgIGxlYXZlZENsYXNzTmFtZSA9IHByb3BzLmxlYXZlZENsYXNzTmFtZSxcbiAgICAgICAgZXZlbnRQcm9wcyA9IHByb3BzLmV2ZW50UHJvcHM7XG4gICAgdmFyIHN1cHBvcnRNb3Rpb24gPSBpc1N1cHBvcnRUcmFuc2l0aW9uKHByb3BzKTsgLy8gUmVmIHRvIHRoZSByZWFjdCBub2RlLCBpdCBtYXkgYmUgYSBIVE1MRWxlbWVudFxuXG4gICAgdmFyIG5vZGVSZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgpOyAvLyBSZWYgdG8gdGhlIGRvbSB3cmFwcGVyIGluIGNhc2UgcmVmIGNhbiBub3QgcGFzcyB0byBIVE1MRWxlbWVudFxuXG4gICAgdmFyIHdyYXBwZXJOb2RlUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoKTtcblxuICAgIGZ1bmN0aW9uIGdldERvbUVsZW1lbnQoKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKDAsIF9maW5kRE9NTm9kZS5kZWZhdWx0KShub2RlUmVmLmN1cnJlbnQgfHwgd3JhcHBlck5vZGVSZWYuY3VycmVudCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIE9ubHkgaGFwcGVuIHdoZW4gYG1vdGlvbkRlYWRsaW5lYCB0cmlnZ2VyIGJ1dCBlbGVtZW50IHJlbW92ZWQuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfdXNlU3RhdHVzID0gKDAsIF91c2VTdGF0dXMzLmRlZmF1bHQpKHN1cHBvcnRNb3Rpb24sIHZpc2libGUsIGdldERvbUVsZW1lbnQsIHByb3BzKSxcbiAgICAgICAgX3VzZVN0YXR1czIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0dXMsIDQpLFxuICAgICAgICBzdGF0dXMgPSBfdXNlU3RhdHVzMlswXSxcbiAgICAgICAgc3RhdHVzU3RlcCA9IF91c2VTdGF0dXMyWzFdLFxuICAgICAgICBzdGF0dXNTdHlsZSA9IF91c2VTdGF0dXMyWzJdLFxuICAgICAgICBtZXJnZWRWaXNpYmxlID0gX3VzZVN0YXR1czJbM107IC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgIHZhciBvcmlnaW5SZWYgPSAoMCwgUmVhY3QudXNlUmVmKShyZWYpO1xuICAgIG9yaWdpblJlZi5jdXJyZW50ID0gcmVmO1xuICAgIHZhciBzZXROb2RlUmVmID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIG5vZGVSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICAoMCwgX3JlZi5maWxsUmVmKShvcmlnaW5SZWYuY3VycmVudCwgbm9kZSk7XG4gICAgfSwgW10pOyAvLyA9PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgdmFyIG1vdGlvbkNoaWxkcmVuO1xuXG4gICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgLy8gTm8gY2hpbGRyZW5cbiAgICAgIG1vdGlvbkNoaWxkcmVuID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gX2ludGVyZmFjZS5TVEFUVVNfTk9ORSB8fCAhaXNTdXBwb3J0VHJhbnNpdGlvbihwcm9wcykpIHtcbiAgICAgIC8vIFN0YWJsZSBjaGlsZHJlblxuICAgICAgaWYgKG1lcmdlZFZpc2libGUpIHtcbiAgICAgICAgbW90aW9uQ2hpbGRyZW4gPSBjaGlsZHJlbigoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGV2ZW50UHJvcHMpLCBzZXROb2RlUmVmKTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlbW92ZU9uTGVhdmUpIHtcbiAgICAgICAgbW90aW9uQ2hpbGRyZW4gPSBjaGlsZHJlbigoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBldmVudFByb3BzKSwge30sIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGxlYXZlZENsYXNzTmFtZVxuICAgICAgICB9KSwgc2V0Tm9kZVJlZik7XG4gICAgICB9IGVsc2UgaWYgKGZvcmNlUmVuZGVyKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4oKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgZXZlbnRQcm9wcyksIHt9LCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW90aW9uQ2hpbGRyZW4gPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgIC8vIEluIG1vdGlvblxuICAgICAgdmFyIHN0YXR1c1N1ZmZpeDtcblxuICAgICAgaWYgKHN0YXR1c1N0ZXAgPT09IF9pbnRlcmZhY2UuU1RFUF9QUkVQQVJFKSB7XG4gICAgICAgIHN0YXR1c1N1ZmZpeCA9ICdwcmVwYXJlJztcbiAgICAgIH0gZWxzZSBpZiAoKDAsIF91c2VTdGVwUXVldWUuaXNBY3RpdmUpKHN0YXR1c1N0ZXApKSB7XG4gICAgICAgIHN0YXR1c1N1ZmZpeCA9ICdhY3RpdmUnO1xuICAgICAgfSBlbHNlIGlmIChzdGF0dXNTdGVwID09PSBfaW50ZXJmYWNlLlNURVBfU1RBUlQpIHtcbiAgICAgICAgc3RhdHVzU3VmZml4ID0gJ3N0YXJ0JztcbiAgICAgIH1cblxuICAgICAgbW90aW9uQ2hpbGRyZW4gPSBjaGlsZHJlbigoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBldmVudFByb3BzKSwge30sIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoKDAsIF9tb3Rpb24uZ2V0VHJhbnNpdGlvbk5hbWUpKG1vdGlvbk5hbWUsIHN0YXR1cyksIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgKDAsIF9tb3Rpb24uZ2V0VHJhbnNpdGlvbk5hbWUpKG1vdGlvbk5hbWUsIFwiXCIuY29uY2F0KHN0YXR1cywgXCItXCIpLmNvbmNhdChzdGF0dXNTdWZmaXgpKSwgc3RhdHVzU3VmZml4KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIG1vdGlvbk5hbWUsIHR5cGVvZiBtb3Rpb25OYW1lID09PSAnc3RyaW5nJyksIF9jbGFzc05hbWVzKSksXG4gICAgICAgIHN0eWxlOiBzdGF0dXNTdHlsZVxuICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgIH1cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9Eb21XcmFwcGVyLmRlZmF1bHQsIHtcbiAgICAgIHJlZjogd3JhcHBlck5vZGVSZWZcbiAgICB9LCBtb3Rpb25DaGlsZHJlbik7XG4gIH0pO1xuICBDU1NNb3Rpb24uZGlzcGxheU5hbWUgPSAnQ1NTTW90aW9uJztcbiAgcmV0dXJuIENTU01vdGlvbjtcbn1cblxudmFyIF9kZWZhdWx0ID0gZ2VuQ1NTTW90aW9uKF9tb3Rpb24uc3VwcG9ydFRyYW5zaXRpb24pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdlbkNTU01vdGlvbkxpc3QgPSBnZW5DU1NNb3Rpb25MaXN0O1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0NTU01vdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ1NTTW90aW9uXCIpKTtcblxudmFyIF9tb3Rpb24gPSByZXF1aXJlKFwiLi91dGlsL21vdGlvblwiKTtcblxudmFyIF9kaWZmID0gcmVxdWlyZShcIi4vdXRpbC9kaWZmXCIpO1xuXG4vKiBlc2xpbnQgcmVhY3QvcHJvcC10eXBlczogMCAqL1xudmFyIE1PVElPTl9QUk9QX05BTUVTID0gWydldmVudFByb3BzJywgJ3Zpc2libGUnLCAnY2hpbGRyZW4nLCAnbW90aW9uTmFtZScsICdtb3Rpb25BcHBlYXInLCAnbW90aW9uRW50ZXInLCAnbW90aW9uTGVhdmUnLCAnbW90aW9uTGVhdmVJbW1lZGlhdGVseScsICdtb3Rpb25EZWFkbGluZScsICdyZW1vdmVPbkxlYXZlJywgJ2xlYXZlZENsYXNzTmFtZScsICdvbkFwcGVhclN0YXJ0JywgJ29uQXBwZWFyQWN0aXZlJywgJ29uQXBwZWFyRW5kJywgJ29uRW50ZXJTdGFydCcsICdvbkVudGVyQWN0aXZlJywgJ29uRW50ZXJFbmQnLCAnb25MZWF2ZVN0YXJ0JywgJ29uTGVhdmVBY3RpdmUnLCAnb25MZWF2ZUVuZCddO1xuLyoqXG4gKiBHZW5lcmF0ZSBhIENTU01vdGlvbkxpc3QgY29tcG9uZW50IHdpdGggY29uZmlnXG4gKiBAcGFyYW0gdHJhbnNpdGlvblN1cHBvcnQgTm8gbmVlZCBzaW5jZSBDU1NNb3Rpb25MaXN0IG5vIGxvbmdlciBkZXBlbmRzIG9uIHRyYW5zaXRpb24gc3VwcG9ydFxuICogQHBhcmFtIENTU01vdGlvbiBDU1NNb3Rpb24gY29tcG9uZW50XG4gKi9cblxuZnVuY3Rpb24gZ2VuQ1NTTW90aW9uTGlzdCh0cmFuc2l0aW9uU3VwcG9ydCkge1xuICB2YXIgQ1NTTW90aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBfQ1NTTW90aW9uLmRlZmF1bHQ7XG5cbiAgdmFyIENTU01vdGlvbkxpc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShDU1NNb3Rpb25MaXN0LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShDU1NNb3Rpb25MaXN0KTtcblxuICAgIGZ1bmN0aW9uIENTU01vdGlvbkxpc3QoKSB7XG4gICAgICB2YXIgX3RoaXM7XG5cbiAgICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIENTU01vdGlvbkxpc3QpO1xuICAgICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICBrZXlFbnRpdGllczogW11cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLnJlbW92ZUtleSA9IGZ1bmN0aW9uIChyZW1vdmVLZXkpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICB2YXIga2V5RW50aXRpZXMgPSBfcmVmLmtleUVudGl0aWVzO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXlFbnRpdGllczoga2V5RW50aXRpZXMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICAgICAgaWYgKGVudGl0eS5rZXkgIT09IHJlbW92ZUtleSkgcmV0dXJuIGVudGl0eTtcbiAgICAgICAgICAgICAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGVudGl0eSksIHt9LCB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBfZGlmZi5TVEFUVVNfUkVNT1ZFRFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoQ1NTTW90aW9uTGlzdCwgW3tcbiAgICAgIGtleTogXCJyZW5kZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgIHZhciBrZXlFbnRpdGllcyA9IHRoaXMuc3RhdGUua2V5RW50aXRpZXM7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBjb21wb25lbnQgPSBfdGhpcyRwcm9wcy5jb21wb25lbnQsXG4gICAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgX29uVmlzaWJsZUNoYW5nZWQgPSBfdGhpcyRwcm9wcy5vblZpc2libGVDaGFuZ2VkLFxuICAgICAgICAgICAgcmVzdFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3RoaXMkcHJvcHMsIFtcImNvbXBvbmVudFwiLCBcImNoaWxkcmVuXCIsIFwib25WaXNpYmxlQ2hhbmdlZFwiXSk7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSBjb21wb25lbnQgfHwgUmVhY3QuRnJhZ21lbnQ7XG4gICAgICAgIHZhciBtb3Rpb25Qcm9wcyA9IHt9O1xuICAgICAgICBNT1RJT05fUFJPUF9OQU1FUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgbW90aW9uUHJvcHNbcHJvcF0gPSByZXN0UHJvcHNbcHJvcF07XG4gICAgICAgICAgZGVsZXRlIHJlc3RQcm9wc1twcm9wXTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbGV0ZSByZXN0UHJvcHMua2V5cztcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCByZXN0UHJvcHMpLCBrZXlFbnRpdGllcy5tYXAoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIHN0YXR1cyA9IF9yZWYyLnN0YXR1cyxcbiAgICAgICAgICAgICAgZXZlbnRQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF9yZWYyLCBbXCJzdGF0dXNcIl0pO1xuICAgICAgICAgIHZhciB2aXNpYmxlID0gc3RhdHVzID09PSBfZGlmZi5TVEFUVVNfQUREIHx8IHN0YXR1cyA9PT0gX2RpZmYuU1RBVFVTX0tFRVA7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBPYmplY3QuYXNzaWduKHt9LCBtb3Rpb25Qcm9wcywge1xuICAgICAgICAgICAga2V5OiBldmVudFByb3BzLmtleSxcbiAgICAgICAgICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgICAgICAgICBldmVudFByb3BzOiBldmVudFByb3BzLFxuICAgICAgICAgICAgb25WaXNpYmxlQ2hhbmdlZDogZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlZChjaGFuZ2VkVmlzaWJsZSkge1xuICAgICAgICAgICAgICBfb25WaXNpYmxlQ2hhbmdlZCA9PT0gbnVsbCB8fCBfb25WaXNpYmxlQ2hhbmdlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29uVmlzaWJsZUNoYW5nZWQoY2hhbmdlZFZpc2libGUsIHtcbiAgICAgICAgICAgICAgICBrZXk6IGV2ZW50UHJvcHMua2V5XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmICghY2hhbmdlZFZpc2libGUpIHtcbiAgICAgICAgICAgICAgICBfdGhpczIucmVtb3ZlS2V5KGV2ZW50UHJvcHMua2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLCBjaGlsZHJlbik7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XSwgW3tcbiAgICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoX3JlZjMsIF9yZWY0KSB7XG4gICAgICAgIHZhciBrZXlzID0gX3JlZjMua2V5cztcbiAgICAgICAgdmFyIGtleUVudGl0aWVzID0gX3JlZjQua2V5RW50aXRpZXM7XG4gICAgICAgIHZhciBwYXJzZWRLZXlPYmplY3RzID0gKDAsIF9kaWZmLnBhcnNlS2V5cykoa2V5cyk7XG4gICAgICAgIHZhciBtaXhlZEtleUVudGl0aWVzID0gKDAsIF9kaWZmLmRpZmZLZXlzKShrZXlFbnRpdGllcywgcGFyc2VkS2V5T2JqZWN0cyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5RW50aXRpZXM6IG1peGVkS2V5RW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICAgIHZhciBwcmV2RW50aXR5ID0ga2V5RW50aXRpZXMuZmluZChmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgICAgICAgICAgdmFyIGtleSA9IF9yZWY1LmtleTtcbiAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5rZXkgPT09IGtleTtcbiAgICAgICAgICAgIH0pOyAvLyBSZW1vdmUgaWYgYWxyZWFkeSBtYXJrIGFzIHJlbW92ZWRcblxuICAgICAgICAgICAgaWYgKHByZXZFbnRpdHkgJiYgcHJldkVudGl0eS5zdGF0dXMgPT09IF9kaWZmLlNUQVRVU19SRU1PVkVEICYmIGVudGl0eS5zdGF0dXMgPT09IF9kaWZmLlNUQVRVU19SRU1PVkUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gQ1NTTW90aW9uTGlzdDtcbiAgfShSZWFjdC5Db21wb25lbnQpO1xuXG4gIENTU01vdGlvbkxpc3QuZGVmYXVsdFByb3BzID0ge1xuICAgIGNvbXBvbmVudDogJ2RpdidcbiAgfTtcbiAgcmV0dXJuIENTU01vdGlvbkxpc3Q7XG59XG5cbnZhciBfZGVmYXVsdCA9IGdlbkNTU01vdGlvbkxpc3QoX21vdGlvbi5zdXBwb3J0VHJhbnNpdGlvbik7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIERvbVdyYXBwZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoRG9tV3JhcHBlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyLmRlZmF1bHQpKERvbVdyYXBwZXIpO1xuXG4gIGZ1bmN0aW9uIERvbVdyYXBwZXIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgRG9tV3JhcHBlcik7XG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoRG9tV3JhcHBlciwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRG9tV3JhcHBlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIF9kZWZhdWx0ID0gRG9tV3JhcHBlcjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX21vdGlvbiA9IHJlcXVpcmUoXCIuLi91dGlsL21vdGlvblwiKTtcblxudmFyIF9kZWZhdWx0ID0gZnVuY3Rpb24gX2RlZmF1bHQoY2FsbGJhY2spIHtcbiAgdmFyIGNhY2hlRWxlbWVudFJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKCk7IC8vIENhY2hlIGNhbGxiYWNrXG5cbiAgdmFyIGNhbGxiYWNrUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoY2FsbGJhY2spO1xuICBjYWxsYmFja1JlZi5jdXJyZW50ID0gY2FsbGJhY2s7IC8vIEludGVybmFsIG1vdGlvbiBldmVudCBoYW5kbGVyXG5cbiAgdmFyIG9uSW50ZXJuYWxNb3Rpb25FbmQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjYWxsYmFja1JlZi5jdXJyZW50KGV2ZW50KTtcbiAgfSwgW10pOyAvLyBSZW1vdmUgZXZlbnRzXG5cbiAgZnVuY3Rpb24gcmVtb3ZlTW90aW9uRXZlbnRzKGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKF9tb3Rpb24udHJhbnNpdGlvbkVuZE5hbWUsIG9uSW50ZXJuYWxNb3Rpb25FbmQpO1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKF9tb3Rpb24uYW5pbWF0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7XG4gICAgfVxuICB9IC8vIFBhdGNoIGV2ZW50c1xuXG5cbiAgZnVuY3Rpb24gcGF0Y2hNb3Rpb25FdmVudHMoZWxlbWVudCkge1xuICAgIGlmIChjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAmJiBjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAhPT0gZWxlbWVudCkge1xuICAgICAgcmVtb3ZlTW90aW9uRXZlbnRzKGNhY2hlRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50ICE9PSBjYWNoZUVsZW1lbnRSZWYuY3VycmVudCkge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKF9tb3Rpb24udHJhbnNpdGlvbkVuZE5hbWUsIG9uSW50ZXJuYWxNb3Rpb25FbmQpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKF9tb3Rpb24uYW5pbWF0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7IC8vIFNhdmUgYXMgY2FjaGUgaW4gY2FzZSBkb20gcmVtb3ZlZCB0cmlnZ2VyIGJ5IGBtb3Rpb25EZWFkbGluZWBcblxuICAgICAgY2FjaGVFbGVtZW50UmVmLmN1cnJlbnQgPSBlbGVtZW50O1xuICAgIH1cbiAgfSAvLyBDbGVhbiB1cCB3aGVuIHJlbW92ZWRcblxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW92ZU1vdGlvbkV2ZW50cyhjYWNoZUVsZW1lbnRSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW3BhdGNoTW90aW9uRXZlbnRzLCByZW1vdmVNb3Rpb25FdmVudHNdO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX2NhblVzZURvbSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9jYW5Vc2VEb21cIikpO1xuXG4vLyBJdCdzIHNhZmUgdG8gdXNlIGB1c2VMYXlvdXRFZmZlY3RgIGJ1dCB0aGUgd2FybmluZyBpcyBhbm5veWluZ1xudmFyIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSAoMCwgX2NhblVzZURvbS5kZWZhdWx0KSgpID8gX3JlYWN0LnVzZUxheW91dEVmZmVjdCA6IF9yZWFjdC51c2VFZmZlY3Q7XG52YXIgX2RlZmF1bHQgPSB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3JhZlwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICB2YXIgbmV4dEZyYW1lUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuXG4gIGZ1bmN0aW9uIGNhbmNlbE5leHRGcmFtZSgpIHtcbiAgICBfcmFmLmRlZmF1bHQuY2FuY2VsKG5leHRGcmFtZVJlZi5jdXJyZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHRGcmFtZShjYWxsYmFjaykge1xuICAgIHZhciBkZWxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMjtcbiAgICBjYW5jZWxOZXh0RnJhbWUoKTtcbiAgICB2YXIgbmV4dEZyYW1lSWQgPSAoMCwgX3JhZi5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZGVsYXkgPD0gMSkge1xuICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgaXNDYW5jZWxlZDogZnVuY3Rpb24gaXNDYW5jZWxlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0RnJhbWVJZCAhPT0gbmV4dEZyYW1lUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRGcmFtZShjYWxsYmFjaywgZGVsYXkgLSAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZXh0RnJhbWVSZWYuY3VycmVudCA9IG5leHRGcmFtZUlkO1xuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2FuY2VsTmV4dEZyYW1lKCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW25leHRGcmFtZSwgY2FuY2VsTmV4dEZyYW1lXTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZU1vdW50U3RhdHVzO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuZnVuY3Rpb24gdXNlTW91bnRTdGF0dXMoZGVmYXVsdFZhbHVlKSB7XG4gIHZhciBkZXN0cm95UmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKGZhbHNlKTtcblxuICB2YXIgX3VzZVN0YXRlID0gKDAsIF9yZWFjdC51c2VTdGF0ZSkoZGVmYXVsdFZhbHVlKSxcbiAgICAgIF91c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZSwgMiksXG4gICAgICB2YWwgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0VmFsID0gX3VzZVN0YXRlMlsxXTtcblxuICBmdW5jdGlvbiBzZXRWYWx1ZShuZXh0KSB7XG4gICAgaWYgKCFkZXN0cm95UmVmLmN1cnJlbnQpIHtcbiAgICAgIHNldFZhbChuZXh0KTtcbiAgICB9XG4gIH1cblxuICAoMCwgX3JlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXN0cm95UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFt2YWwsIHNldFZhbHVlXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VTdGF0dXM7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2ludGVyZmFjZSA9IHJlcXVpcmUoXCIuLi9pbnRlcmZhY2VcIik7XG5cbnZhciBfdXNlU3RhdGU3ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91c2VTdGF0ZVwiKSk7XG5cbnZhciBfdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFwiKSk7XG5cbnZhciBfdXNlU3RlcFF1ZXVlMyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL3VzZVN0ZXBRdWV1ZVwiKSk7XG5cbnZhciBfdXNlRG9tTW90aW9uRXZlbnRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXNlRG9tTW90aW9uRXZlbnRzXCIpKTtcblxuZnVuY3Rpb24gdXNlU3RhdHVzKHN1cHBvcnRNb3Rpb24sIHZpc2libGUsIGdldEVsZW1lbnQsIF9yZWYpIHtcbiAgdmFyIF9yZWYkbW90aW9uRW50ZXIgPSBfcmVmLm1vdGlvbkVudGVyLFxuICAgICAgbW90aW9uRW50ZXIgPSBfcmVmJG1vdGlvbkVudGVyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25FbnRlcixcbiAgICAgIF9yZWYkbW90aW9uQXBwZWFyID0gX3JlZi5tb3Rpb25BcHBlYXIsXG4gICAgICBtb3Rpb25BcHBlYXIgPSBfcmVmJG1vdGlvbkFwcGVhciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkbW90aW9uQXBwZWFyLFxuICAgICAgX3JlZiRtb3Rpb25MZWF2ZSA9IF9yZWYubW90aW9uTGVhdmUsXG4gICAgICBtb3Rpb25MZWF2ZSA9IF9yZWYkbW90aW9uTGVhdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmJG1vdGlvbkxlYXZlLFxuICAgICAgbW90aW9uRGVhZGxpbmUgPSBfcmVmLm1vdGlvbkRlYWRsaW5lLFxuICAgICAgbW90aW9uTGVhdmVJbW1lZGlhdGVseSA9IF9yZWYubW90aW9uTGVhdmVJbW1lZGlhdGVseSxcbiAgICAgIG9uQXBwZWFyUHJlcGFyZSA9IF9yZWYub25BcHBlYXJQcmVwYXJlLFxuICAgICAgb25FbnRlclByZXBhcmUgPSBfcmVmLm9uRW50ZXJQcmVwYXJlLFxuICAgICAgb25MZWF2ZVByZXBhcmUgPSBfcmVmLm9uTGVhdmVQcmVwYXJlLFxuICAgICAgb25BcHBlYXJTdGFydCA9IF9yZWYub25BcHBlYXJTdGFydCxcbiAgICAgIG9uRW50ZXJTdGFydCA9IF9yZWYub25FbnRlclN0YXJ0LFxuICAgICAgb25MZWF2ZVN0YXJ0ID0gX3JlZi5vbkxlYXZlU3RhcnQsXG4gICAgICBvbkFwcGVhckFjdGl2ZSA9IF9yZWYub25BcHBlYXJBY3RpdmUsXG4gICAgICBvbkVudGVyQWN0aXZlID0gX3JlZi5vbkVudGVyQWN0aXZlLFxuICAgICAgb25MZWF2ZUFjdGl2ZSA9IF9yZWYub25MZWF2ZUFjdGl2ZSxcbiAgICAgIG9uQXBwZWFyRW5kID0gX3JlZi5vbkFwcGVhckVuZCxcbiAgICAgIG9uRW50ZXJFbmQgPSBfcmVmLm9uRW50ZXJFbmQsXG4gICAgICBvbkxlYXZlRW5kID0gX3JlZi5vbkxlYXZlRW5kLFxuICAgICAgb25WaXNpYmxlQ2hhbmdlZCA9IF9yZWYub25WaXNpYmxlQ2hhbmdlZDtcblxuICAvLyBVc2VkIGZvciBvdXRlciByZW5kZXIgdXNhZ2UgdG8gYXZvaWQgYHZpc2libGU6IGZhbHNlICYgc3RhdHVzOiBub25lYCB0byByZW5kZXIgbm90aGluZ1xuICB2YXIgX3VzZVN0YXRlID0gKDAsIF91c2VTdGF0ZTcuZGVmYXVsdCkoKSxcbiAgICAgIF91c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZSwgMiksXG4gICAgICBhc3luY1Zpc2libGUgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0QXN5bmNWaXNpYmxlID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlMyA9ICgwLCBfdXNlU3RhdGU3LmRlZmF1bHQpKF9pbnRlcmZhY2UuU1RBVFVTX05PTkUpLFxuICAgICAgX3VzZVN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlMywgMiksXG4gICAgICBzdGF0dXMgPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0U3RhdHVzID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgX3VzZVN0YXRlNSA9ICgwLCBfdXNlU3RhdGU3LmRlZmF1bHQpKG51bGwpLFxuICAgICAgX3VzZVN0YXRlNiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlNSwgMiksXG4gICAgICBzdHlsZSA9IF91c2VTdGF0ZTZbMF0sXG4gICAgICBzZXRTdHlsZSA9IF91c2VTdGF0ZTZbMV07XG5cbiAgdmFyIG1vdW50ZWRSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShmYWxzZSk7XG4gIHZhciBkZWFkbGluZVJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKG51bGwpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gRG9tIE5vZGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGNhY2hlRWxlbWVudFJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKG51bGwpO1xuXG4gIGZ1bmN0aW9uIGdldERvbUVsZW1lbnQoKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7XG4gICAgcmV0dXJuIGVsZW1lbnQgfHwgY2FjaGVFbGVtZW50UmVmLmN1cnJlbnQ7XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uIEVuZCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIGFjdGl2ZVJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKGZhbHNlKTtcblxuICBmdW5jdGlvbiBvbkludGVybmFsTW90aW9uRW5kKGV2ZW50KSB7XG4gICAgdmFyIGVsZW1lbnQgPSBnZXREb21FbGVtZW50KCk7XG5cbiAgICBpZiAoZXZlbnQgJiYgIWV2ZW50LmRlYWRsaW5lICYmIGV2ZW50LnRhcmdldCAhPT0gZWxlbWVudCkge1xuICAgICAgLy8gZXZlbnQgZXhpc3RzXG4gICAgICAvLyBub3QgaW5pdGlhdGVkIGJ5IGRlYWRsaW5lXG4gICAgICAvLyB0cmFuc2l0aW9uRW5kIG5vdCBmaXJlZCBieSBpbm5lciBlbGVtZW50c1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjYW5FbmQ7XG5cbiAgICBpZiAoc3RhdHVzID09PSBfaW50ZXJmYWNlLlNUQVRVU19BUFBFQVIgJiYgYWN0aXZlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNhbkVuZCA9IG9uQXBwZWFyRW5kID09PSBudWxsIHx8IG9uQXBwZWFyRW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFwcGVhckVuZChlbGVtZW50LCBldmVudCk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IF9pbnRlcmZhY2UuU1RBVFVTX0VOVEVSICYmIGFjdGl2ZVJlZi5jdXJyZW50KSB7XG4gICAgICBjYW5FbmQgPSBvbkVudGVyRW5kID09PSBudWxsIHx8IG9uRW50ZXJFbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRW50ZXJFbmQoZWxlbWVudCwgZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBfaW50ZXJmYWNlLlNUQVRVU19MRUFWRSAmJiBhY3RpdmVSZWYuY3VycmVudCkge1xuICAgICAgY2FuRW5kID0gb25MZWF2ZUVuZCA9PT0gbnVsbCB8fCBvbkxlYXZlRW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkxlYXZlRW5kKGVsZW1lbnQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoY2FuRW5kICE9PSBmYWxzZSkge1xuICAgICAgc2V0U3RhdHVzKF9pbnRlcmZhY2UuU1RBVFVTX05PTkUpO1xuICAgICAgc2V0U3R5bGUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIF91c2VEb21Nb3Rpb25FdmVudHMgPSAoMCwgX3VzZURvbU1vdGlvbkV2ZW50czMuZGVmYXVsdCkob25JbnRlcm5hbE1vdGlvbkVuZCksXG4gICAgICBfdXNlRG9tTW90aW9uRXZlbnRzMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZURvbU1vdGlvbkV2ZW50cywgMSksXG4gICAgICBwYXRjaE1vdGlvbkV2ZW50cyA9IF91c2VEb21Nb3Rpb25FdmVudHMyWzBdOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdGVwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgZXZlbnRIYW5kbGVycyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMiwgX3JlZjMsIF9yZWY0O1xuXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ2FwcGVhcic6XG4gICAgICAgIHJldHVybiBfcmVmMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgX2ludGVyZmFjZS5TVEVQX1BSRVBBUkUsIG9uQXBwZWFyUHJlcGFyZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYyLCBfaW50ZXJmYWNlLlNURVBfU1RBUlQsIG9uQXBwZWFyU3RhcnQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgX2ludGVyZmFjZS5TVEVQX0FDVElWRSwgb25BcHBlYXJBY3RpdmUpLCBfcmVmMjtcblxuICAgICAgY2FzZSAnZW50ZXInOlxuICAgICAgICByZXR1cm4gX3JlZjMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX3JlZjMsIF9pbnRlcmZhY2UuU1RFUF9QUkVQQVJFLCBvbkVudGVyUHJlcGFyZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYzLCBfaW50ZXJmYWNlLlNURVBfU1RBUlQsIG9uRW50ZXJTdGFydCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYzLCBfaW50ZXJmYWNlLlNURVBfQUNUSVZFLCBvbkVudGVyQWN0aXZlKSwgX3JlZjM7XG5cbiAgICAgIGNhc2UgJ2xlYXZlJzpcbiAgICAgICAgcmV0dXJuIF9yZWY0ID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWY0LCBfaW50ZXJmYWNlLlNURVBfUFJFUEFSRSwgb25MZWF2ZVByZXBhcmUpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmNCwgX2ludGVyZmFjZS5TVEVQX1NUQVJULCBvbkxlYXZlU3RhcnQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmNCwgX2ludGVyZmFjZS5TVEVQX0FDVElWRSwgb25MZWF2ZUFjdGl2ZSksIF9yZWY0O1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICB9LCBbc3RhdHVzXSk7XG5cbiAgdmFyIF91c2VTdGVwUXVldWUgPSAoMCwgX3VzZVN0ZXBRdWV1ZTMuZGVmYXVsdCkoZnVuY3Rpb24gKG5ld1N0ZXApIHtcbiAgICAvLyBPbmx5IHByZXBhcmUgc3RlcCBjYW4gYmUgc2tpcFxuICAgIGlmIChuZXdTdGVwID09PSBfaW50ZXJmYWNlLlNURVBfUFJFUEFSRSkge1xuICAgICAgdmFyIG9uUHJlcGFyZSA9IGV2ZW50SGFuZGxlcnNbX2ludGVyZmFjZS5TVEVQX1BSRVBBUkVdO1xuXG4gICAgICBpZiAoIW9uUHJlcGFyZSkge1xuICAgICAgICByZXR1cm4gX3VzZVN0ZXBRdWV1ZTMuU2tpcFN0ZXA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvblByZXBhcmUoZ2V0RG9tRWxlbWVudCgpKTtcbiAgICB9IC8vIFJlc3Qgc3RlcCBpcyBzeW5jIHVwZGF0ZVxuXG5cbiAgICBpZiAoc3RlcCBpbiBldmVudEhhbmRsZXJzKSB7XG4gICAgICB2YXIgX2V2ZW50SGFuZGxlcnMkc3RlcDtcblxuICAgICAgc2V0U3R5bGUoKChfZXZlbnRIYW5kbGVycyRzdGVwID0gZXZlbnRIYW5kbGVyc1tzdGVwXSkgPT09IG51bGwgfHwgX2V2ZW50SGFuZGxlcnMkc3RlcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50SGFuZGxlcnMkc3RlcC5jYWxsKGV2ZW50SGFuZGxlcnMsIGdldERvbUVsZW1lbnQoKSwgbnVsbCkpIHx8IG51bGwpO1xuICAgIH1cblxuICAgIGlmIChzdGVwID09PSBfaW50ZXJmYWNlLlNURVBfQUNUSVZFKSB7XG4gICAgICAvLyBQYXRjaCBldmVudHMgd2hlbiBtb3Rpb24gbmVlZGVkXG4gICAgICBwYXRjaE1vdGlvbkV2ZW50cyhnZXREb21FbGVtZW50KCkpO1xuXG4gICAgICBpZiAobW90aW9uRGVhZGxpbmUgPiAwKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChkZWFkbGluZVJlZi5jdXJyZW50KTtcbiAgICAgICAgZGVhZGxpbmVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG9uSW50ZXJuYWxNb3Rpb25FbmQoe1xuICAgICAgICAgICAgZGVhZGxpbmU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgbW90aW9uRGVhZGxpbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBfdXNlU3RlcFF1ZXVlMy5Eb1N0ZXA7XG4gIH0pLFxuICAgICAgX3VzZVN0ZXBRdWV1ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGVwUXVldWUsIDIpLFxuICAgICAgc3RhcnRTdGVwID0gX3VzZVN0ZXBRdWV1ZTJbMF0sXG4gICAgICBzdGVwID0gX3VzZVN0ZXBRdWV1ZTJbMV07XG5cbiAgdmFyIGFjdGl2ZSA9ICgwLCBfdXNlU3RlcFF1ZXVlMy5pc0FjdGl2ZSkoc3RlcCk7XG4gIGFjdGl2ZVJlZi5jdXJyZW50ID0gYWN0aXZlOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0YXR1cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVwZGF0ZSB3aXRoIG5ldyBzdGF0dXNcblxuICAoMCwgX3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QuZGVmYXVsdCkoZnVuY3Rpb24gKCkge1xuICAgIHNldEFzeW5jVmlzaWJsZSh2aXNpYmxlKTtcblxuICAgIGlmICghc3VwcG9ydE1vdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpc01vdW50ZWQgPSBtb3VudGVkUmVmLmN1cnJlbnQ7XG4gICAgbW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB2YXIgbmV4dFN0YXR1czsgLy8gQXBwZWFyXG5cbiAgICBpZiAoIWlzTW91bnRlZCAmJiB2aXNpYmxlICYmIG1vdGlvbkFwcGVhcikge1xuICAgICAgbmV4dFN0YXR1cyA9IF9pbnRlcmZhY2UuU1RBVFVTX0FQUEVBUjtcbiAgICB9IC8vIEVudGVyXG5cblxuICAgIGlmIChpc01vdW50ZWQgJiYgdmlzaWJsZSAmJiBtb3Rpb25FbnRlcikge1xuICAgICAgbmV4dFN0YXR1cyA9IF9pbnRlcmZhY2UuU1RBVFVTX0VOVEVSO1xuICAgIH0gLy8gTGVhdmVcblxuXG4gICAgaWYgKGlzTW91bnRlZCAmJiAhdmlzaWJsZSAmJiBtb3Rpb25MZWF2ZSB8fCAhaXNNb3VudGVkICYmIG1vdGlvbkxlYXZlSW1tZWRpYXRlbHkgJiYgIXZpc2libGUgJiYgbW90aW9uTGVhdmUpIHtcbiAgICAgIG5leHRTdGF0dXMgPSBfaW50ZXJmYWNlLlNUQVRVU19MRUFWRTtcbiAgICB9IC8vIFVwZGF0ZSB0byBuZXh0IHN0YXR1c1xuXG5cbiAgICBpZiAobmV4dFN0YXR1cykge1xuICAgICAgc2V0U3RhdHVzKG5leHRTdGF0dXMpO1xuICAgICAgc3RhcnRTdGVwKCk7XG4gICAgfVxuICB9LCBbdmlzaWJsZV0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc2V0IHdoZW4gbW90aW9uIGNoYW5nZWRcblxuICAoMCwgUmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCAvLyBDYW5jZWwgYXBwZWFyXG4gICAgc3RhdHVzID09PSBfaW50ZXJmYWNlLlNUQVRVU19BUFBFQVIgJiYgIW1vdGlvbkFwcGVhciB8fCAvLyBDYW5jZWwgZW50ZXJcbiAgICBzdGF0dXMgPT09IF9pbnRlcmZhY2UuU1RBVFVTX0VOVEVSICYmICFtb3Rpb25FbnRlciB8fCAvLyBDYW5jZWwgbGVhdmVcbiAgICBzdGF0dXMgPT09IF9pbnRlcmZhY2UuU1RBVFVTX0xFQVZFICYmICFtb3Rpb25MZWF2ZSkge1xuICAgICAgc2V0U3RhdHVzKF9pbnRlcmZhY2UuU1RBVFVTX05PTkUpO1xuICAgIH1cbiAgfSwgW21vdGlvbkFwcGVhciwgbW90aW9uRW50ZXIsIG1vdGlvbkxlYXZlXSk7XG4gICgwLCBSZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGRlYWRsaW5lUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTsgLy8gVHJpZ2dlciBgb25WaXNpYmxlQ2hhbmdlZGBcblxuICAoMCwgUmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFzeW5jVmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmIHN0YXR1cyA9PT0gX2ludGVyZmFjZS5TVEFUVVNfTk9ORSkge1xuICAgICAgb25WaXNpYmxlQ2hhbmdlZCA9PT0gbnVsbCB8fCBvblZpc2libGVDaGFuZ2VkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblZpc2libGVDaGFuZ2VkKGFzeW5jVmlzaWJsZSk7XG4gICAgfVxuICB9LCBbYXN5bmNWaXNpYmxlLCBzdGF0dXNdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBtZXJnZWRTdHlsZSA9IHN0eWxlO1xuXG4gIGlmIChldmVudEhhbmRsZXJzW19pbnRlcmZhY2UuU1RFUF9QUkVQQVJFXSAmJiBzdGVwID09PSBfaW50ZXJmYWNlLlNURVBfU1RBUlQpIHtcbiAgICBtZXJnZWRTdHlsZSA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAgICB0cmFuc2l0aW9uOiAnbm9uZSdcbiAgICB9LCBtZXJnZWRTdHlsZSk7XG4gIH1cblxuICByZXR1cm4gW3N0YXR1cywgc3RlcCwgbWVyZ2VkU3R5bGUsIGFzeW5jVmlzaWJsZSAhPT0gbnVsbCAmJiBhc3luY1Zpc2libGUgIT09IHZvaWQgMCA/IGFzeW5jVmlzaWJsZSA6IHZpc2libGVdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNBY3RpdmUgPSBpc0FjdGl2ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuRG9TdGVwID0gZXhwb3J0cy5Ta2lwU3RlcCA9IHZvaWQgMDtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfaW50ZXJmYWNlID0gcmVxdWlyZShcIi4uL2ludGVyZmFjZVwiKTtcblxudmFyIF91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0XCIpKTtcblxudmFyIF91c2VOZXh0RnJhbWUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91c2VOZXh0RnJhbWVcIikpO1xuXG52YXIgU1RFUF9RVUVVRSA9IFtfaW50ZXJmYWNlLlNURVBfUFJFUEFSRSwgX2ludGVyZmFjZS5TVEVQX1NUQVJULCBfaW50ZXJmYWNlLlNURVBfQUNUSVZFLCBfaW50ZXJmYWNlLlNURVBfQUNUSVZBVEVEXTtcbi8qKiBTa2lwIGN1cnJlbnQgc3RlcCAqL1xuXG52YXIgU2tpcFN0ZXAgPSBmYWxzZTtcbi8qKiBDdXJyZW50IHN0ZXAgc2hvdWxkIGJlIHVwZGF0ZSBpbiAqL1xuXG5leHBvcnRzLlNraXBTdGVwID0gU2tpcFN0ZXA7XG52YXIgRG9TdGVwID0gdHJ1ZTtcbmV4cG9ydHMuRG9TdGVwID0gRG9TdGVwO1xuXG5mdW5jdGlvbiBpc0FjdGl2ZShzdGVwKSB7XG4gIHJldHVybiBzdGVwID09PSBfaW50ZXJmYWNlLlNURVBfQUNUSVZFIHx8IHN0ZXAgPT09IF9pbnRlcmZhY2UuU1RFUF9BQ1RJVkFURUQ7XG59XG5cbnZhciBfZGVmYXVsdCA9IGZ1bmN0aW9uIF9kZWZhdWx0KGNhbGxiYWNrKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShfaW50ZXJmYWNlLlNURVBfTk9ORSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgc3RlcCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTdGVwID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgX3VzZU5leHRGcmFtZSA9ICgwLCBfdXNlTmV4dEZyYW1lMy5kZWZhdWx0KSgpLFxuICAgICAgX3VzZU5leHRGcmFtZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VOZXh0RnJhbWUsIDIpLFxuICAgICAgbmV4dEZyYW1lID0gX3VzZU5leHRGcmFtZTJbMF0sXG4gICAgICBjYW5jZWxOZXh0RnJhbWUgPSBfdXNlTmV4dEZyYW1lMlsxXTtcblxuICBmdW5jdGlvbiBzdGFydFF1ZXVlKCkge1xuICAgIHNldFN0ZXAoX2ludGVyZmFjZS5TVEVQX1BSRVBBUkUpO1xuICB9XG5cbiAgKDAsIF91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmRlZmF1bHQpKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RlcCAhPT0gX2ludGVyZmFjZS5TVEVQX05PTkUgJiYgc3RlcCAhPT0gX2ludGVyZmFjZS5TVEVQX0FDVElWQVRFRCkge1xuICAgICAgdmFyIGluZGV4ID0gU1RFUF9RVUVVRS5pbmRleE9mKHN0ZXApO1xuICAgICAgdmFyIG5leHRTdGVwID0gU1RFUF9RVUVVRVtpbmRleCArIDFdO1xuICAgICAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrKHN0ZXApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSBTa2lwU3RlcCkge1xuICAgICAgICAvLyBTa2lwIHdoZW4gbm8gbmVlZGVkXG4gICAgICAgIHNldFN0ZXAobmV4dFN0ZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG8gYXMgZnJhbWUgZm9yIHN0ZXAgdXBkYXRlXG4gICAgICAgIG5leHRGcmFtZShmdW5jdGlvbiAoaW5mbykge1xuICAgICAgICAgIGZ1bmN0aW9uIGRvTmV4dCgpIHtcbiAgICAgICAgICAgIC8vIFNraXAgc2luY2UgY3VycmVudCBxdWV1ZSBpcyBvb2RcbiAgICAgICAgICAgIGlmIChpbmZvLmlzQ2FuY2VsZWQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgc2V0U3RlcChuZXh0U3RlcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgZG9OZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvbWlzZSBzaG91bGQgYmUgYXN5bmNcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oZG9OZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3N0ZXBdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2FuY2VsTmV4dEZyYW1lKCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW3N0YXJ0UXVldWUsIHN0ZXBdO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ1NTTW90aW9uTGlzdFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfQ1NTTW90aW9uTGlzdC5kZWZhdWx0O1xuICB9XG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9DU1NNb3Rpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NTU01vdGlvblwiKSk7XG5cbnZhciBfQ1NTTW90aW9uTGlzdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ1NTTW90aW9uTGlzdFwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9DU1NNb3Rpb24uZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5TVEVQX0FDVElWQVRFRCA9IGV4cG9ydHMuU1RFUF9BQ1RJVkUgPSBleHBvcnRzLlNURVBfU1RBUlQgPSBleHBvcnRzLlNURVBfUFJFUEFSRSA9IGV4cG9ydHMuU1RFUF9OT05FID0gZXhwb3J0cy5TVEFUVVNfTEVBVkUgPSBleHBvcnRzLlNUQVRVU19FTlRFUiA9IGV4cG9ydHMuU1RBVFVTX0FQUEVBUiA9IGV4cG9ydHMuU1RBVFVTX05PTkUgPSB2b2lkIDA7XG52YXIgU1RBVFVTX05PTkUgPSAnbm9uZSc7XG5leHBvcnRzLlNUQVRVU19OT05FID0gU1RBVFVTX05PTkU7XG52YXIgU1RBVFVTX0FQUEVBUiA9ICdhcHBlYXInO1xuZXhwb3J0cy5TVEFUVVNfQVBQRUFSID0gU1RBVFVTX0FQUEVBUjtcbnZhciBTVEFUVVNfRU5URVIgPSAnZW50ZXInO1xuZXhwb3J0cy5TVEFUVVNfRU5URVIgPSBTVEFUVVNfRU5URVI7XG52YXIgU1RBVFVTX0xFQVZFID0gJ2xlYXZlJztcbmV4cG9ydHMuU1RBVFVTX0xFQVZFID0gU1RBVFVTX0xFQVZFO1xudmFyIFNURVBfTk9ORSA9ICdub25lJztcbmV4cG9ydHMuU1RFUF9OT05FID0gU1RFUF9OT05FO1xudmFyIFNURVBfUFJFUEFSRSA9ICdwcmVwYXJlJztcbmV4cG9ydHMuU1RFUF9QUkVQQVJFID0gU1RFUF9QUkVQQVJFO1xudmFyIFNURVBfU1RBUlQgPSAnc3RhcnQnO1xuZXhwb3J0cy5TVEVQX1NUQVJUID0gU1RFUF9TVEFSVDtcbnZhciBTVEVQX0FDVElWRSA9ICdhY3RpdmUnO1xuZXhwb3J0cy5TVEVQX0FDVElWRSA9IFNURVBfQUNUSVZFO1xudmFyIFNURVBfQUNUSVZBVEVEID0gJ2VuZCc7XG5leHBvcnRzLlNURVBfQUNUSVZBVEVEID0gU1RFUF9BQ1RJVkFURUQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy53cmFwS2V5VG9PYmplY3QgPSB3cmFwS2V5VG9PYmplY3Q7XG5leHBvcnRzLnBhcnNlS2V5cyA9IHBhcnNlS2V5cztcbmV4cG9ydHMuZGlmZktleXMgPSBkaWZmS2V5cztcbmV4cG9ydHMuU1RBVFVTX1JFTU9WRUQgPSBleHBvcnRzLlNUQVRVU19SRU1PVkUgPSBleHBvcnRzLlNUQVRVU19LRUVQID0gZXhwb3J0cy5TVEFUVVNfQUREID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBTVEFUVVNfQUREID0gJ2FkZCc7XG5leHBvcnRzLlNUQVRVU19BREQgPSBTVEFUVVNfQUREO1xudmFyIFNUQVRVU19LRUVQID0gJ2tlZXAnO1xuZXhwb3J0cy5TVEFUVVNfS0VFUCA9IFNUQVRVU19LRUVQO1xudmFyIFNUQVRVU19SRU1PVkUgPSAncmVtb3ZlJztcbmV4cG9ydHMuU1RBVFVTX1JFTU9WRSA9IFNUQVRVU19SRU1PVkU7XG52YXIgU1RBVFVTX1JFTU9WRUQgPSAncmVtb3ZlZCc7XG5leHBvcnRzLlNUQVRVU19SRU1PVkVEID0gU1RBVFVTX1JFTU9WRUQ7XG5cbmZ1bmN0aW9uIHdyYXBLZXlUb09iamVjdChrZXkpIHtcbiAgdmFyIGtleU9iajtcblxuICBpZiAoa2V5ICYmICgwLCBfdHlwZW9mMi5kZWZhdWx0KShrZXkpID09PSAnb2JqZWN0JyAmJiAna2V5JyBpbiBrZXkpIHtcbiAgICBrZXlPYmogPSBrZXk7XG4gIH0gZWxzZSB7XG4gICAga2V5T2JqID0ge1xuICAgICAga2V5OiBrZXlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGtleU9iaiksIHt9LCB7XG4gICAga2V5OiBTdHJpbmcoa2V5T2JqLmtleSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlS2V5cygpIHtcbiAgdmFyIGtleXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICByZXR1cm4ga2V5cy5tYXAod3JhcEtleVRvT2JqZWN0KTtcbn1cblxuZnVuY3Rpb24gZGlmZktleXMoKSB7XG4gIHZhciBwcmV2S2V5cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gIHZhciBjdXJyZW50S2V5cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107XG4gIHZhciBsaXN0ID0gW107XG4gIHZhciBjdXJyZW50SW5kZXggPSAwO1xuICB2YXIgY3VycmVudExlbiA9IGN1cnJlbnRLZXlzLmxlbmd0aDtcbiAgdmFyIHByZXZLZXlPYmplY3RzID0gcGFyc2VLZXlzKHByZXZLZXlzKTtcbiAgdmFyIGN1cnJlbnRLZXlPYmplY3RzID0gcGFyc2VLZXlzKGN1cnJlbnRLZXlzKTsgLy8gQ2hlY2sgcHJldiBrZXlzIHRvIGluc2VydCBvciBrZWVwXG5cbiAgcHJldktleU9iamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5T2JqKSB7XG4gICAgdmFyIGhpdCA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IGN1cnJlbnRJbmRleDsgaSA8IGN1cnJlbnRMZW47IGkgKz0gMSkge1xuICAgICAgdmFyIGN1cnJlbnRLZXlPYmogPSBjdXJyZW50S2V5T2JqZWN0c1tpXTtcblxuICAgICAgaWYgKGN1cnJlbnRLZXlPYmoua2V5ID09PSBrZXlPYmoua2V5KSB7XG4gICAgICAgIC8vIE5ldyBhZGRlZCBrZXlzIHNob3VsZCBhZGQgYmVmb3JlIGN1cnJlbnQga2V5XG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPCBpKSB7XG4gICAgICAgICAgbGlzdCA9IGxpc3QuY29uY2F0KGN1cnJlbnRLZXlPYmplY3RzLnNsaWNlKGN1cnJlbnRJbmRleCwgaSkubWFwKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBvYmopLCB7fSwge1xuICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVU19BRERcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjdXJyZW50SW5kZXggPSBpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdC5wdXNoKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGN1cnJlbnRLZXlPYmopLCB7fSwge1xuICAgICAgICAgIHN0YXR1czogU1RBVFVTX0tFRVBcbiAgICAgICAgfSkpO1xuICAgICAgICBjdXJyZW50SW5kZXggKz0gMTtcbiAgICAgICAgaGl0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBJZiBub3QgaGl0LCBpdCBtZWFucyBrZXkgaXMgcmVtb3ZlZFxuXG5cbiAgICBpZiAoIWhpdCkge1xuICAgICAgbGlzdC5wdXNoKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGtleU9iaiksIHt9LCB7XG4gICAgICAgIHN0YXR1czogU1RBVFVTX1JFTU9WRVxuICAgICAgfSkpO1xuICAgIH1cbiAgfSk7IC8vIEFkZCByZXN0IHRvIHRoZSBsaXN0XG5cbiAgaWYgKGN1cnJlbnRJbmRleCA8IGN1cnJlbnRMZW4pIHtcbiAgICBsaXN0ID0gbGlzdC5jb25jYXQoY3VycmVudEtleU9iamVjdHMuc2xpY2UoY3VycmVudEluZGV4KS5tYXAoZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIG9iaiksIHt9LCB7XG4gICAgICAgIHN0YXR1czogU1RBVFVTX0FERFxuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBNZXJnZSBzYW1lIGtleSB3aGVuIGl0IHJlbW92ZSBhbmQgYWRkIGFnYWluOlxuICAgKiAgICBbMSAtIGFkZCwgMiAtIGtlZXAsIDEgLSByZW1vdmVdIC0+IFsxIC0ga2VlcCwgMiAtIGtlZXBdXG4gICAqL1xuXG5cbiAgdmFyIGtleXMgPSB7fTtcbiAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGtleSA9IF9yZWYua2V5O1xuICAgIGtleXNba2V5XSA9IChrZXlzW2tleV0gfHwgMCkgKyAxO1xuICB9KTtcbiAgdmFyIGR1cGxpY2F0ZWRLZXlzID0gT2JqZWN0LmtleXMoa2V5cykuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4ga2V5c1trZXldID4gMTtcbiAgfSk7XG4gIGR1cGxpY2F0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKG1hdGNoS2V5KSB7XG4gICAgLy8gUmVtb3ZlIGBTVEFUVVNfUkVNT1ZFYCBub2RlLlxuICAgIGxpc3QgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciBrZXkgPSBfcmVmMi5rZXksXG4gICAgICAgICAgc3RhdHVzID0gX3JlZjIuc3RhdHVzO1xuICAgICAgcmV0dXJuIGtleSAhPT0gbWF0Y2hLZXkgfHwgc3RhdHVzICE9PSBTVEFUVVNfUkVNT1ZFO1xuICAgIH0pOyAvLyBVcGRhdGUgYFNUQVRVU19BRERgIHRvIGBTVEFUVVNfS0VFUGBcblxuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKG5vZGUua2V5ID09PSBtYXRjaEtleSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgbm9kZS5zdGF0dXMgPSBTVEFUVVNfS0VFUDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBsaXN0O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0VmVuZG9yUHJlZml4ZXMgPSBnZXRWZW5kb3JQcmVmaXhlcztcbmV4cG9ydHMuZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZTtcbmV4cG9ydHMuZ2V0VHJhbnNpdGlvbk5hbWUgPSBnZXRUcmFuc2l0aW9uTmFtZTtcbmV4cG9ydHMudHJhbnNpdGlvbkVuZE5hbWUgPSBleHBvcnRzLmFuaW1hdGlvbkVuZE5hbWUgPSBleHBvcnRzLnN1cHBvcnRUcmFuc2l0aW9uID0gdm9pZCAwO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBfY2FuVXNlRG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2NhblVzZURvbVwiKSk7XG5cbi8vID09PT09PT09PT09PT09PT09IFRyYW5zaXRpb24gPT09PT09PT09PT09PT09PT1cbi8vIEV2ZW50IHdyYXBwZXIuIENvcHkgZnJvbSByZWFjdCBzb3VyY2UgY29kZVxuZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHlsZVByb3AsIGV2ZW50TmFtZSkge1xuICB2YXIgcHJlZml4ZXMgPSB7fTtcbiAgcHJlZml4ZXNbc3R5bGVQcm9wLnRvTG93ZXJDYXNlKCldID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHByZWZpeGVzW1wiV2Via2l0XCIuY29uY2F0KHN0eWxlUHJvcCldID0gXCJ3ZWJraXRcIi5jb25jYXQoZXZlbnROYW1lKTtcbiAgcHJlZml4ZXNbXCJNb3pcIi5jb25jYXQoc3R5bGVQcm9wKV0gPSBcIm1velwiLmNvbmNhdChldmVudE5hbWUpO1xuICBwcmVmaXhlc1tcIm1zXCIuY29uY2F0KHN0eWxlUHJvcCldID0gXCJNU1wiLmNvbmNhdChldmVudE5hbWUpO1xuICBwcmVmaXhlc1tcIk9cIi5jb25jYXQoc3R5bGVQcm9wKV0gPSBcIm9cIi5jb25jYXQoZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVzKGRvbVN1cHBvcnQsIHdpbikge1xuICB2YXIgcHJlZml4ZXMgPSB7XG4gICAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gICAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdUcmFuc2l0aW9uRW5kJylcbiAgfTtcblxuICBpZiAoZG9tU3VwcG9ydCkge1xuICAgIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luKSkge1xuICAgICAgZGVsZXRlIHByZWZpeGVzLmFuaW1hdGlvbmVuZC5hbmltYXRpb247XG4gICAgfVxuXG4gICAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luKSkge1xuICAgICAgZGVsZXRlIHByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJlZml4ZXM7XG59XG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IGdldFZlbmRvclByZWZpeGVzKCgwLCBfY2FuVXNlRG9tLmRlZmF1bHQpKCksIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDoge30pO1xudmFyIHN0eWxlID0ge307XG5cbmlmICgoMCwgX2NhblVzZURvbS5kZWZhdWx0KSgpKSB7XG4gIHZhciBfZG9jdW1lbnQkY3JlYXRlRWxlbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICBzdHlsZSA9IF9kb2N1bWVudCRjcmVhdGVFbGVtZS5zdHlsZTtcbn1cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9XG5cbiAgdmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV07XG5cbiAgaWYgKHByZWZpeE1hcCkge1xuICAgIHZhciBzdHlsZVByb3BMaXN0ID0gT2JqZWN0LmtleXMocHJlZml4TWFwKTtcbiAgICB2YXIgbGVuID0gc3R5bGVQcm9wTGlzdC5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICB2YXIgc3R5bGVQcm9wID0gc3R5bGVQcm9wTGlzdFtpXTtcblxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcmVmaXhNYXAsIHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICAgIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciBpbnRlcm5hbEFuaW1hdGlvbkVuZE5hbWUgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgaW50ZXJuYWxUcmFuc2l0aW9uRW5kTmFtZSA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG52YXIgc3VwcG9ydFRyYW5zaXRpb24gPSAhIShpbnRlcm5hbEFuaW1hdGlvbkVuZE5hbWUgJiYgaW50ZXJuYWxUcmFuc2l0aW9uRW5kTmFtZSk7XG5leHBvcnRzLnN1cHBvcnRUcmFuc2l0aW9uID0gc3VwcG9ydFRyYW5zaXRpb247XG52YXIgYW5pbWF0aW9uRW5kTmFtZSA9IGludGVybmFsQW5pbWF0aW9uRW5kTmFtZSB8fCAnYW5pbWF0aW9uZW5kJztcbmV4cG9ydHMuYW5pbWF0aW9uRW5kTmFtZSA9IGFuaW1hdGlvbkVuZE5hbWU7XG52YXIgdHJhbnNpdGlvbkVuZE5hbWUgPSBpbnRlcm5hbFRyYW5zaXRpb25FbmROYW1lIHx8ICd0cmFuc2l0aW9uZW5kJztcbmV4cG9ydHMudHJhbnNpdGlvbkVuZE5hbWUgPSB0cmFuc2l0aW9uRW5kTmFtZTtcblxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUodHJhbnNpdGlvbk5hbWUsIHRyYW5zaXRpb25UeXBlKSB7XG4gIGlmICghdHJhbnNpdGlvbk5hbWUpIHJldHVybiBudWxsO1xuXG4gIGlmICgoMCwgX3R5cGVvZjIuZGVmYXVsdCkodHJhbnNpdGlvbk5hbWUpID09PSAnb2JqZWN0Jykge1xuICAgIHZhciB0eXBlID0gdHJhbnNpdGlvblR5cGUucmVwbGFjZSgvLVxcdy9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2l0aW9uTmFtZVt0eXBlXTtcbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdCh0cmFuc2l0aW9uTmFtZSwgXCItXCIpLmNvbmNhdCh0cmFuc2l0aW9uVHlwZSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCIpKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMi5kZWZhdWx0KSh0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIE5vdGljZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShOb3RpY2UsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTm90aWNlKTtcblxuICBmdW5jdGlvbiBOb3RpY2UoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgTm90aWNlKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLmNsb3NlVGltZXIgPSBudWxsO1xuXG4gICAgX3RoaXMuY2xvc2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuY2xlYXJDbG9zZVRpbWVyKCk7XG5cbiAgICAgIHZhciBvbkNsb3NlID0gX3RoaXMucHJvcHMub25DbG9zZTtcblxuICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgb25DbG9zZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zdGFydENsb3NlVGltZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMuZHVyYXRpb24pIHtcbiAgICAgICAgX3RoaXMuY2xvc2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICB9LCBfdGhpcy5wcm9wcy5kdXJhdGlvbiAqIDEwMDApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5jbGVhckNsb3NlVGltZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuY2xvc2VUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMuY2xvc2VUaW1lcik7XG4gICAgICAgIF90aGlzLmNsb3NlVGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShOb3RpY2UsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zdGFydENsb3NlVGltZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmR1cmF0aW9uICE9PSBwcmV2UHJvcHMuZHVyYXRpb24gfHwgdGhpcy5wcm9wcy51cGRhdGUpIHtcbiAgICAgICAgdGhpcy5yZXN0YXJ0Q2xvc2VUaW1lcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuY2xlYXJDbG9zZVRpbWVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc3RhcnRDbG9zZVRpbWVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc3RhcnRDbG9zZVRpbWVyKCkge1xuICAgICAgdGhpcy5jbGVhckNsb3NlVGltZXIoKTtcbiAgICAgIHRoaXMuc3RhcnRDbG9zZVRpbWVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgIGNsb3NhYmxlID0gX3RoaXMkcHJvcHMuY2xvc2FibGUsXG4gICAgICAgICAgY2xvc2VJY29uID0gX3RoaXMkcHJvcHMuY2xvc2VJY29uLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMuc3R5bGUsXG4gICAgICAgICAgb25DbGljayA9IF90aGlzJHByb3BzLm9uQ2xpY2ssXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBob2xkZXIgPSBfdGhpcyRwcm9wcy5ob2xkZXI7XG4gICAgICB2YXIgY29tcG9uZW50Q2xhc3MgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vdGljZVwiKTtcbiAgICAgIHZhciBkYXRhT3JBcmlhQXR0cmlidXRlUHJvcHMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDUpID09PSAnZGF0YS0nIHx8IGtleS5zdWJzdHIoMCwgNSkgPT09ICdhcmlhLScgfHwga2V5ID09PSAncm9sZScpIHtcbiAgICAgICAgICBhY2Nba2V5XSA9IF90aGlzMi5wcm9wc1trZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcblxuICAgICAgdmFyIG5vZGUgPSBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShjb21wb25lbnRDbGFzcywgY2xhc3NOYW1lLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQoY29tcG9uZW50Q2xhc3MsIFwiLWNsb3NhYmxlXCIpLCBjbG9zYWJsZSkpLFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIG9uTW91c2VFbnRlcjogdGhpcy5jbGVhckNsb3NlVGltZXIsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogdGhpcy5zdGFydENsb3NlVGltZXIsXG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2tcbiAgICAgIH0sIGRhdGFPckFyaWFBdHRyaWJ1dGVQcm9wcyksIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGNvbXBvbmVudENsYXNzLCBcIi1jb250ZW50XCIpXG4gICAgICB9LCBjaGlsZHJlbiksIGNsb3NhYmxlID8gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgICAgICB0YWJJbmRleDogMCxcbiAgICAgICAgb25DbGljazogdGhpcy5jbG9zZSxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjb21wb25lbnRDbGFzcywgXCItY2xvc2VcIilcbiAgICAgIH0sIGNsb3NlSWNvbiB8fCBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY29tcG9uZW50Q2xhc3MsIFwiLWNsb3NlLXhcIilcbiAgICAgIH0pKSA6IG51bGwpO1xuXG4gICAgICBpZiAoaG9sZGVyKSB7XG4gICAgICAgIHJldHVybiBfcmVhY3REb20uZGVmYXVsdC5jcmVhdGVQb3J0YWwobm9kZSwgaG9sZGVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBOb3RpY2U7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBOb3RpY2U7XG5Ob3RpY2UuZGVmYXVsdFByb3BzID0ge1xuICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKCkge30sXG4gIGR1cmF0aW9uOiAxLjUsXG4gIHN0eWxlOiB7XG4gICAgcmlnaHQ6ICc1MCUnXG4gIH1cbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCIpKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xuXG52YXIgX3JjQW5pbWF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLWFuaW1hdGVcIikpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL2NyZWF0ZUNoYWluZWRGdW5jdGlvblwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX05vdGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTm90aWNlXCIpKTtcblxudmFyIF91c2VOb3RpZmljYXRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91c2VOb3RpZmljYXRpb25cIikpO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yLmRlZmF1bHQpKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgc2VlZCA9IDA7XG52YXIgbm93ID0gRGF0ZS5ub3coKTtcblxuZnVuY3Rpb24gZ2V0VXVpZCgpIHtcbiAgdmFyIGlkID0gc2VlZDtcbiAgc2VlZCArPSAxO1xuICByZXR1cm4gXCJyY05vdGlmaWNhdGlvbl9cIi5jb25jYXQobm93LCBcIl9cIikuY29uY2F0KGlkKTtcbn1cblxudmFyIE5vdGlmaWNhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShOb3RpZmljYXRpb24sIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTm90aWZpY2F0aW9uKTtcblxuICBmdW5jdGlvbiBOb3RpZmljYXRpb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgTm90aWZpY2F0aW9uKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgbm90aWNlczogW11cbiAgICB9O1xuICAgIF90aGlzLmhvb2tSZWZzID0gbmV3IE1hcCgpO1xuXG4gICAgX3RoaXMuYWRkID0gZnVuY3Rpb24gKG5vdGljZSwgaG9sZGVyQ2FsbGJhY2spIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgbm90aWNlLmtleSA9IG5vdGljZS5rZXkgfHwgZ2V0VXVpZCgpO1xuICAgICAgdmFyIGtleSA9IG5vdGljZS5rZXk7XG4gICAgICB2YXIgbWF4Q291bnQgPSBfdGhpcy5wcm9wcy5tYXhDb3VudDtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZpb3VzU3RhdGUpIHtcbiAgICAgICAgdmFyIG5vdGljZXMgPSBwcmV2aW91c1N0YXRlLm5vdGljZXM7XG4gICAgICAgIHZhciBub3RpY2VJbmRleCA9IG5vdGljZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgcmV0dXJuIHYubm90aWNlLmtleTtcbiAgICAgICAgfSkuaW5kZXhPZihrZXkpO1xuICAgICAgICB2YXIgdXBkYXRlZE5vdGljZXMgPSBub3RpY2VzLmNvbmNhdCgpO1xuXG4gICAgICAgIGlmIChub3RpY2VJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB1cGRhdGVkTm90aWNlcy5zcGxpY2Uobm90aWNlSW5kZXgsIDEsIHtcbiAgICAgICAgICAgIG5vdGljZTogbm90aWNlLFxuICAgICAgICAgICAgaG9sZGVyQ2FsbGJhY2s6IGhvbGRlckNhbGxiYWNrXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG1heENvdW50ICYmIG5vdGljZXMubGVuZ3RoID49IG1heENvdW50KSB7XG4gICAgICAgICAgICAvLyBYWFgsIHVzZSBrZXkgb2YgZmlyc3QgaXRlbSB0byB1cGRhdGUgbmV3IGFkZGVkIChsZXQgUmVhY3QgdG8gbW92ZSBleHNpdGluZ1xuICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiByZW1vdmUgYW5kIG1vdW50KS4gU2FtZSBrZXkgd2FzIHVzZWQgYmVmb3JlIGZvciBib3RoIGEpIGV4dGVybmFsXG4gICAgICAgICAgICAvLyBtYW51YWwgY29udHJvbCBhbmQgYikgaW50ZXJuYWwgcmVhY3QgJ2tleScgcHJvcCAsIHdoaWNoIGlzIG5vdCB0aGF0IGdvb2QuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIG5vdGljZS51cGRhdGVLZXkgPSB1cGRhdGVkTm90aWNlc1swXS5ub3RpY2UudXBkYXRlS2V5IHx8IHVwZGF0ZWROb3RpY2VzWzBdLm5vdGljZS5rZXk7XG4gICAgICAgICAgICB1cGRhdGVkTm90aWNlcy5zaGlmdCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZWROb3RpY2VzLnB1c2goe1xuICAgICAgICAgICAgbm90aWNlOiBub3RpY2UsXG4gICAgICAgICAgICBob2xkZXJDYWxsYmFjazogaG9sZGVyQ2FsbGJhY2tcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm90aWNlczogdXBkYXRlZE5vdGljZXNcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldmlvdXNTdGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vdGljZXM6IHByZXZpb3VzU3RhdGUubm90aWNlcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBub3RpY2UgPSBfcmVmLm5vdGljZTtcbiAgICAgICAgICAgIHJldHVybiBub3RpY2Uua2V5ICE9PSBrZXk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShOb3RpZmljYXRpb24sIFt7XG4gICAga2V5OiBcImdldFRyYW5zaXRpb25OYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25OYW1lKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgICAgYW5pbWF0aW9uID0gX3RoaXMkcHJvcHMuYW5pbWF0aW9uO1xuICAgICAgdmFyIHRyYW5zaXRpb25OYW1lID0gdGhpcy5wcm9wcy50cmFuc2l0aW9uTmFtZTtcblxuICAgICAgaWYgKCF0cmFuc2l0aW9uTmFtZSAmJiBhbmltYXRpb24pIHtcbiAgICAgICAgdHJhbnNpdGlvbk5hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYW5pbWF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBub3RpY2VzID0gdGhpcy5zdGF0ZS5ub3RpY2VzO1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICAgIGNsb3NlSWNvbiA9IF90aGlzJHByb3BzMi5jbG9zZUljb24sXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczIuc3R5bGU7XG4gICAgICB2YXIgbm90aWNlTm9kZXMgPSBub3RpY2VzLm1hcChmdW5jdGlvbiAoX3JlZjIsIGluZGV4KSB7XG4gICAgICAgIHZhciBub3RpY2UgPSBfcmVmMi5ub3RpY2UsXG4gICAgICAgICAgICBob2xkZXJDYWxsYmFjayA9IF9yZWYyLmhvbGRlckNhbGxiYWNrO1xuICAgICAgICB2YXIgdXBkYXRlID0gQm9vbGVhbihpbmRleCA9PT0gbm90aWNlcy5sZW5ndGggLSAxICYmIG5vdGljZS51cGRhdGVLZXkpO1xuICAgICAgICB2YXIga2V5ID0gbm90aWNlLnVwZGF0ZUtleSA/IG5vdGljZS51cGRhdGVLZXkgOiBub3RpY2Uua2V5O1xuICAgICAgICB2YXIgb25DbG9zZSA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uLmRlZmF1bHQpKF90aGlzMi5yZW1vdmUuYmluZChfdGhpczIsIG5vdGljZS5rZXkpLCBub3RpY2Uub25DbG9zZSk7XG5cbiAgICAgICAgdmFyIG5vdGljZVByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIGNsb3NlSWNvbjogY2xvc2VJY29uXG4gICAgICAgIH0sIG5vdGljZSksIG5vdGljZS5wcm9wcyksIHt9LCB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdXBkYXRlOiB1cGRhdGUsXG4gICAgICAgICAgb25DbG9zZTogb25DbG9zZSxcbiAgICAgICAgICBvbkNsaWNrOiBub3RpY2Uub25DbGljayxcbiAgICAgICAgICBjaGlsZHJlbjogbm90aWNlLmNvbnRlbnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGhvbGRlckNhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaG9vay1ob2xkZXJcIiksXG4gICAgICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihkaXYpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGRpdikge1xuICAgICAgICAgICAgICAgIF90aGlzMi5ob29rUmVmcy5zZXQoa2V5LCBkaXYpO1xuXG4gICAgICAgICAgICAgICAgaG9sZGVyQ2FsbGJhY2soZGl2LCBub3RpY2VQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLmhvb2tSZWZzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfTm90aWNlLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIG5vdGljZVByb3BzKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX3JjQW5pbWF0ZS5kZWZhdWx0LCB7XG4gICAgICAgIHRyYW5zaXRpb25OYW1lOiB0aGlzLmdldFRyYW5zaXRpb25OYW1lKClcbiAgICAgIH0sIG5vdGljZU5vZGVzKSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBOb3RpZmljYXRpb247XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5Ob3RpZmljYXRpb24uZGVmYXVsdFByb3BzID0ge1xuICBwcmVmaXhDbHM6ICdyYy1ub3RpZmljYXRpb24nLFxuICBhbmltYXRpb246ICdmYWRlJyxcbiAgc3R5bGU6IHtcbiAgICB0b3A6IDY1LFxuICAgIGxlZnQ6ICc1MCUnXG4gIH1cbn07XG5cbk5vdGlmaWNhdGlvbi5uZXdJbnN0YW5jZSA9IGZ1bmN0aW9uIG5ld05vdGlmaWNhdGlvbkluc3RhbmNlKHByb3BlcnRpZXMsIGNhbGxiYWNrKSB7XG4gIHZhciBfcmVmMyA9IHByb3BlcnRpZXMgfHwge30sXG4gICAgICBnZXRDb250YWluZXIgPSBfcmVmMy5nZXRDb250YWluZXIsXG4gICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF9yZWYzLCBbXCJnZXRDb250YWluZXJcIl0pO1xuXG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICBpZiAoZ2V0Q29udGFpbmVyKSB7XG4gICAgdmFyIHJvb3QgPSBnZXRDb250YWluZXIoKTtcbiAgICByb290LmFwcGVuZENoaWxkKGRpdik7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICB9XG5cbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHJlZihub3RpZmljYXRpb24pIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICBjYWxsYmFjayh7XG4gICAgICBub3RpY2U6IGZ1bmN0aW9uIG5vdGljZShub3RpY2VQcm9wcykge1xuICAgICAgICBub3RpZmljYXRpb24uYWRkKG5vdGljZVByb3BzKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmVOb3RpY2U6IGZ1bmN0aW9uIHJlbW92ZU5vdGljZShrZXkpIHtcbiAgICAgICAgbm90aWZpY2F0aW9uLnJlbW92ZShrZXkpO1xuICAgICAgfSxcbiAgICAgIGNvbXBvbmVudDogbm90aWZpY2F0aW9uLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgX3JlYWN0RG9tLmRlZmF1bHQudW5tb3VudENvbXBvbmVudEF0Tm9kZShkaXYpO1xuXG4gICAgICAgIGlmIChkaXYucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpdik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBIb29rc1xuICAgICAgdXNlTm90aWZpY2F0aW9uOiBmdW5jdGlvbiB1c2VOb3RpZmljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiAoMCwgX3VzZU5vdGlmaWNhdGlvbjIuZGVmYXVsdCkobm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSAvLyBPbmx5IHVzZWQgZm9yIHRlc3QgY2FzZSB1c2FnZVxuXG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcgJiYgcHJvcGVydGllcy5URVNUX1JFTkRFUikge1xuICAgIHByb3BlcnRpZXMuVEVTVF9SRU5ERVIoX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChOb3RpZmljYXRpb24sIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICByZWY6IHJlZlxuICAgIH0pKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3JlYWN0RG9tLmRlZmF1bHQucmVuZGVyKF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTm90aWZpY2F0aW9uLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pKSwgZGl2KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IE5vdGlmaWNhdGlvbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9Ob3RpZmljYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL05vdGlmaWNhdGlvblwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9Ob3RpZmljYXRpb24uZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZU5vdGlmaWNhdGlvbjtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfTm90aWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Ob3RpY2VcIikpO1xuXG5mdW5jdGlvbiB1c2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uSW5zdGFuY2UpIHtcbiAgdmFyIGNyZWF0ZWRSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShbXSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgZWxlbWVudHMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0RWxlbWVudHMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIGZ1bmN0aW9uIG5vdGlmeShub3RpY2VQcm9wcykge1xuICAgIG5vdGlmaWNhdGlvbkluc3RhbmNlLmFkZChub3RpY2VQcm9wcywgZnVuY3Rpb24gKGRpdiwgcHJvcHMpIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wcy5rZXk7XG5cbiAgICAgIGlmIChkaXYgJiYgIWNyZWF0ZWRSZWYuY3VycmVudFtrZXldKSB7XG4gICAgICAgIHZhciBub3RpY2VFbGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9Ob3RpY2UuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICBob2xkZXI6IGRpdlxuICAgICAgICB9KSk7XG4gICAgICAgIGNyZWF0ZWRSZWYuY3VycmVudFtrZXldID0gbm90aWNlRWxlO1xuICAgICAgICBzZXRFbGVtZW50cyhmdW5jdGlvbiAob3JpZ2luRWxlbWVudHMpIHtcbiAgICAgICAgICByZXR1cm4gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG9yaWdpbkVsZW1lbnRzKSwgW25vdGljZUVsZV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBbbm90aWZ5LCBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBlbGVtZW50cyldO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZhdWx0ID0ge1xuICBaRVJPOiA0OCxcbiAgTklORTogNTcsXG4gIE5VTVBBRF9aRVJPOiA5NixcbiAgTlVNUEFEX05JTkU6IDEwNSxcbiAgQkFDS1NQQUNFOiA4LFxuICBERUxFVEU6IDQ2LFxuICBFTlRFUjogMTMsXG4gIEFSUk9XX1VQOiAzOCxcbiAgQVJST1dfRE9XTjogNDBcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfS2V5Q29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vS2V5Q29kZVwiKSk7XG5cbi8qIGVzbGludCByZWFjdC9wcm9wLXR5cGVzOiAwICovXG52YXIgT3B0aW9ucyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShPcHRpb25zLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoT3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gT3B0aW9ucygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBPcHRpb25zKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBnb0lucHV0VGV4dDogJydcbiAgICB9O1xuXG4gICAgX3RoaXMuYnVpbGRPcHRpb25UZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQodmFsdWUsIFwiIFwiKS5jb25jYXQoX3RoaXMucHJvcHMubG9jYWxlLml0ZW1zX3Blcl9wYWdlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuY2hhbmdlU2l6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgX3RoaXMucHJvcHMuY2hhbmdlU2l6ZShOdW1iZXIodmFsdWUpKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZ29JbnB1dFRleHQ6IGUudGFyZ2V0LnZhbHVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQmx1ciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBnb0J1dHRvbiA9IF90aGlzJHByb3BzLmdvQnV0dG9uLFxuICAgICAgICAgIHF1aWNrR28gPSBfdGhpcyRwcm9wcy5xdWlja0dvLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5yb290UHJlZml4Q2xzO1xuICAgICAgdmFyIGdvSW5wdXRUZXh0ID0gX3RoaXMuc3RhdGUuZ29JbnB1dFRleHQ7XG5cbiAgICAgIGlmIChnb0J1dHRvbiB8fCBnb0lucHV0VGV4dCA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZS5yZWxhdGVkVGFyZ2V0ICYmIChlLnJlbGF0ZWRUYXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItcHJldlwiKSkgPj0gMCB8fCBlLnJlbGF0ZWRUYXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItbmV4dFwiKSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGdvSW5wdXRUZXh0OiAnJ1xuICAgICAgfSk7XG5cbiAgICAgIHF1aWNrR28oX3RoaXMuZ2V0VmFsaWRWYWx1ZSgpKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ28gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGdvSW5wdXRUZXh0ID0gX3RoaXMuc3RhdGUuZ29JbnB1dFRleHQ7XG5cbiAgICAgIGlmIChnb0lucHV0VGV4dCA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSIHx8IGUudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZ29JbnB1dFRleHQ6ICcnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzLnByb3BzLnF1aWNrR28oX3RoaXMuZ2V0VmFsaWRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoT3B0aW9ucywgW3tcbiAgICBrZXk6IFwiZ2V0VmFsaWRWYWx1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWYWxpZFZhbHVlKCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBnb0lucHV0VGV4dCA9IF90aGlzJHN0YXRlLmdvSW5wdXRUZXh0LFxuICAgICAgICAgIGN1cnJlbnQgPSBfdGhpcyRzdGF0ZS5jdXJyZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG5cbiAgICAgIHJldHVybiAhZ29JbnB1dFRleHQgfHwgaXNOYU4oZ29JbnB1dFRleHQpID8gY3VycmVudCA6IE51bWJlcihnb0lucHV0VGV4dCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBhZ2VTaXplT3B0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlU2l6ZU9wdGlvbnMoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwYWdlU2l6ZSA9IF90aGlzJHByb3BzMi5wYWdlU2l6ZSxcbiAgICAgICAgICBwYWdlU2l6ZU9wdGlvbnMgPSBfdGhpcyRwcm9wczIucGFnZVNpemVPcHRpb25zO1xuXG4gICAgICBpZiAocGFnZVNpemVPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICByZXR1cm4gb3B0aW9uLnRvU3RyaW5nKCkgPT09IHBhZ2VTaXplLnRvU3RyaW5nKCk7XG4gICAgICB9KSkge1xuICAgICAgICByZXR1cm4gcGFnZVNpemVPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFnZVNpemVPcHRpb25zLmNvbmNhdChbcGFnZVNpemUudG9TdHJpbmcoKV0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgICAgICB2YXIgbnVtYmVyQSA9IGlzTmFOKE51bWJlcihhKSkgPyAwIDogTnVtYmVyKGEpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG5cbiAgICAgICAgdmFyIG51bWJlckIgPSBpc05hTihOdW1iZXIoYikpID8gMCA6IE51bWJlcihiKTtcbiAgICAgICAgcmV0dXJuIG51bWJlckEgLSBudW1iZXJCO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcGFnZVNpemUgPSBfdGhpcyRwcm9wczMucGFnZVNpemUsXG4gICAgICAgICAgbG9jYWxlID0gX3RoaXMkcHJvcHMzLmxvY2FsZSxcbiAgICAgICAgICByb290UHJlZml4Q2xzID0gX3RoaXMkcHJvcHMzLnJvb3RQcmVmaXhDbHMsXG4gICAgICAgICAgY2hhbmdlU2l6ZSA9IF90aGlzJHByb3BzMy5jaGFuZ2VTaXplLFxuICAgICAgICAgIHF1aWNrR28gPSBfdGhpcyRwcm9wczMucXVpY2tHbyxcbiAgICAgICAgICBnb0J1dHRvbiA9IF90aGlzJHByb3BzMy5nb0J1dHRvbixcbiAgICAgICAgICBzZWxlY3RDb21wb25lbnRDbGFzcyA9IF90aGlzJHByb3BzMy5zZWxlY3RDb21wb25lbnRDbGFzcyxcbiAgICAgICAgICBidWlsZE9wdGlvblRleHQgPSBfdGhpcyRwcm9wczMuYnVpbGRPcHRpb25UZXh0LFxuICAgICAgICAgIHNlbGVjdFByZWZpeENscyA9IF90aGlzJHByb3BzMy5zZWxlY3RQcmVmaXhDbHMsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczMuZGlzYWJsZWQ7XG4gICAgICB2YXIgZ29JbnB1dFRleHQgPSB0aGlzLnN0YXRlLmdvSW5wdXRUZXh0O1xuICAgICAgdmFyIHByZWZpeENscyA9IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLW9wdGlvbnNcIik7XG4gICAgICB2YXIgU2VsZWN0ID0gc2VsZWN0Q29tcG9uZW50Q2xhc3M7XG4gICAgICB2YXIgY2hhbmdlU2VsZWN0ID0gbnVsbDtcbiAgICAgIHZhciBnb0lucHV0ID0gbnVsbDtcbiAgICAgIHZhciBnb3RvQnV0dG9uID0gbnVsbDtcblxuICAgICAgaWYgKCFjaGFuZ2VTaXplICYmICFxdWlja0dvKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFnZVNpemVPcHRpb25zID0gdGhpcy5nZXRQYWdlU2l6ZU9wdGlvbnMoKTtcblxuICAgICAgaWYgKGNoYW5nZVNpemUgJiYgU2VsZWN0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gcGFnZVNpemVPcHRpb25zLm1hcChmdW5jdGlvbiAob3B0LCBpKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFNlbGVjdC5PcHRpb24sIHtcbiAgICAgICAgICAgIGtleTogaSxcbiAgICAgICAgICAgIHZhbHVlOiBvcHQudG9TdHJpbmcoKVxuICAgICAgICAgIH0sIChidWlsZE9wdGlvblRleHQgfHwgX3RoaXMyLmJ1aWxkT3B0aW9uVGV4dCkob3B0KSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjaGFuZ2VTZWxlY3QgPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChTZWxlY3QsIHtcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgcHJlZml4Q2xzOiBzZWxlY3RQcmVmaXhDbHMsXG4gICAgICAgICAgc2hvd1NlYXJjaDogZmFsc2UsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNpemUtY2hhbmdlclwiKSxcbiAgICAgICAgICBvcHRpb25MYWJlbFByb3A6IFwiY2hpbGRyZW5cIixcbiAgICAgICAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGg6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiAocGFnZVNpemUgfHwgcGFnZVNpemVPcHRpb25zWzBdKS50b1N0cmluZygpLFxuICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLmNoYW5nZVNpemUsXG4gICAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGZ1bmN0aW9uIGdldFBvcHVwQ29udGFpbmVyKHRyaWdnZXJOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJpZ2dlck5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVpY2tHbykge1xuICAgICAgICBpZiAoZ29CdXR0b24pIHtcbiAgICAgICAgICBnb3RvQnV0dG9uID0gdHlwZW9mIGdvQnV0dG9uID09PSAnYm9vbGVhbicgPyAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgb25DbGljazogdGhpcy5nbyxcbiAgICAgICAgICAgIG9uS2V5VXA6IHRoaXMuZ28sXG4gICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcXVpY2stanVtcGVyLWJ1dHRvblwiKVxuICAgICAgICAgIH0sIGxvY2FsZS5qdW1wX3RvX2NvbmZpcm0pIDogLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMuZ28sXG4gICAgICAgICAgICBvbktleVVwOiB0aGlzLmdvXG4gICAgICAgICAgfSwgZ29CdXR0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgZ29JbnB1dCA9IC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcXVpY2stanVtcGVyXCIpXG4gICAgICAgIH0sIGxvY2FsZS5qdW1wX3RvLCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdmFsdWU6IGdvSW5wdXRUZXh0LFxuICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICBvbktleVVwOiB0aGlzLmdvLFxuICAgICAgICAgIG9uQmx1cjogdGhpcy5oYW5kbGVCbHVyXG4gICAgICAgIH0pLCBsb2NhbGUucGFnZSwgZ290b0J1dHRvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMpXG4gICAgICB9LCBjaGFuZ2VTZWxlY3QsIGdvSW5wdXQpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gT3B0aW9ucztcbn0oX3JlYWN0LmRlZmF1bHQuQ29tcG9uZW50KTtcblxuT3B0aW9ucy5kZWZhdWx0UHJvcHMgPSB7XG4gIHBhZ2VTaXplT3B0aW9uczogWycxMCcsICcyMCcsICc1MCcsICcxMDAnXVxufTtcbnZhciBfZGVmYXVsdCA9IE9wdGlvbnM7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG4vKiBlc2xpbnQgcmVhY3QvcHJvcC10eXBlczogMCAqL1xudmFyIFBhZ2VyID0gZnVuY3Rpb24gUGFnZXIocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBwcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcm9wcy5yb290UHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICB2YXIgY2xzID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHByZWZpeENscywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHByb3BzLnBhZ2UpLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWN0aXZlXCIpLCBwcm9wcy5hY3RpdmUpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgcHJvcHMuY2xhc3NOYW1lLCAhIXByb3BzLmNsYXNzTmFtZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCAhcHJvcHMucGFnZSksIF9jbGFzc05hbWVzKSk7XG5cbiAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soKSB7XG4gICAgcHJvcHMub25DbGljayhwcm9wcy5wYWdlKTtcbiAgfTtcblxuICB2YXIgaGFuZGxlS2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVLZXlQcmVzcyhlKSB7XG4gICAgcHJvcHMub25LZXlQcmVzcyhlLCBwcm9wcy5vbkNsaWNrLCBwcm9wcy5wYWdlKTtcbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgdGl0bGU6IHByb3BzLnNob3dUaXRsZSA/IHByb3BzLnBhZ2UgOiBudWxsLFxuICAgIGNsYXNzTmFtZTogY2xzLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgIG9uS2V5UHJlc3M6IGhhbmRsZUtleVByZXNzLFxuICAgIHRhYkluZGV4OiBcIjBcIlxuICB9LCBwcm9wcy5pdGVtUmVuZGVyKHByb3BzLnBhZ2UsICdwYWdlJywgLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICByZWw6IFwibm9mb2xsb3dcIlxuICB9LCBwcm9wcy5wYWdlKSkpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gUGFnZXI7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfUGFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhZ2VyXCIpKTtcblxudmFyIF9PcHRpb25zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9PcHRpb25zXCIpKTtcblxudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9LZXlDb2RlXCIpKTtcblxudmFyIF96aF9DTiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbG9jYWxlL3poX0NOXCIpKTtcblxuLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgcmV0dXJuICgvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSkgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRJdGVtUmVuZGVyKHBhZ2UsIHR5cGUsIGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVBhZ2UocCwgc3RhdGUsIHByb3BzKSB7XG4gIHZhciBwYWdlU2l6ZSA9IHR5cGVvZiBwID09PSAndW5kZWZpbmVkJyA/IHN0YXRlLnBhZ2VTaXplIDogcDtcbiAgcmV0dXJuIE1hdGguZmxvb3IoKHByb3BzLnRvdGFsIC0gMSkgLyBwYWdlU2l6ZSkgKyAxO1xufVxuXG52YXIgUGFnaW5hdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShQYWdpbmF0aW9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoUGFnaW5hdGlvbik7XG5cbiAgZnVuY3Rpb24gUGFnaW5hdGlvbihwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIFBhZ2luYXRpb24pO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgX3RoaXMuZ2V0SnVtcFByZXZQYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDEsIF90aGlzLnN0YXRlLmN1cnJlbnQgLSAoX3RoaXMucHJvcHMuc2hvd0xlc3NJdGVtcyA/IDMgOiA1KSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldEp1bXBOZXh0UGFnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihjYWxjdWxhdGVQYWdlKHVuZGVmaW5lZCwgX3RoaXMuc3RhdGUsIF90aGlzLnByb3BzKSwgX3RoaXMuc3RhdGUuY3VycmVudCArIChfdGhpcy5wcm9wcy5zaG93TGVzc0l0ZW1zID8gMyA6IDUpKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0SXRlbUljb24gPSBmdW5jdGlvbiAoaWNvbiwgbGFiZWwpIHtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBfdGhpcy5wcm9wcy5wcmVmaXhDbHM7XG5cbiAgICAgIHZhciBpY29uTm9kZSA9IGljb24gfHwgLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogbGFiZWwsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWxpbmtcIilcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIGljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWNvbk5vZGUgPSBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGljb24sICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgX3RoaXMucHJvcHMpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGljb25Ob2RlO1xuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlUGFnaW5hdGlvbk5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMucGFnaW5hdGlvbk5vZGUgPSBub2RlO1xuICAgIH07XG5cbiAgICBfdGhpcy5pc1ZhbGlkID0gZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgIHJldHVybiBpc0ludGVnZXIocGFnZSkgJiYgcGFnZSAhPT0gX3RoaXMuc3RhdGUuY3VycmVudDtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2hvdWxkRGlzcGxheVF1aWNrSnVtcGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgc2hvd1F1aWNrSnVtcGVyID0gX3RoaXMkcHJvcHMuc2hvd1F1aWNrSnVtcGVyLFxuICAgICAgICAgIHBhZ2VTaXplID0gX3RoaXMkcHJvcHMucGFnZVNpemUsXG4gICAgICAgICAgdG90YWwgPSBfdGhpcyRwcm9wcy50b3RhbDtcblxuICAgICAgaWYgKHRvdGFsIDw9IHBhZ2VTaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNob3dRdWlja0p1bXBlcjtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkFSUk9XX1VQIHx8IGUua2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5BUlJPV19ET1dOKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlS2V5VXAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHZhbHVlID0gX3RoaXMuZ2V0VmFsaWRWYWx1ZShlKTtcblxuICAgICAgdmFyIGN1cnJlbnRJbnB1dFZhbHVlID0gX3RoaXMuc3RhdGUuY3VycmVudElucHV0VmFsdWU7XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gY3VycmVudElucHV0VmFsdWUpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGN1cnJlbnRJbnB1dFZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5FTlRFUikge1xuICAgICAgICBfdGhpcy5oYW5kbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuQVJST1dfVVApIHtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlKHZhbHVlIC0gMSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5BUlJPV19ET1dOKSB7XG4gICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZSh2YWx1ZSArIDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5jaGFuZ2VQYWdlU2l6ZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICB2YXIgY3VycmVudCA9IF90aGlzLnN0YXRlLmN1cnJlbnQ7XG4gICAgICB2YXIgbmV3Q3VycmVudCA9IGNhbGN1bGF0ZVBhZ2Uoc2l6ZSwgX3RoaXMuc3RhdGUsIF90aGlzLnByb3BzKTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50ID4gbmV3Q3VycmVudCA/IG5ld0N1cnJlbnQgOiBjdXJyZW50OyAvLyBmaXggdGhlIGlzc3VlOlxuICAgICAgLy8gT25jZSAndG90YWwnIGlzIDAsICdjdXJyZW50JyBpbiAnb25TaG93U2l6ZUNoYW5nZScgaXMgMCwgd2hpY2ggaXMgbm90IGNvcnJlY3QuXG5cbiAgICAgIGlmIChuZXdDdXJyZW50ID09PSAwKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuICAgICAgICBjdXJyZW50ID0gX3RoaXMuc3RhdGUuY3VycmVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoISgncGFnZVNpemUnIGluIF90aGlzLnByb3BzKSkge1xuICAgICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHBhZ2VTaXplOiBzaXplXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISgnY3VycmVudCcgaW4gX3RoaXMucHJvcHMpKSB7XG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgICAgIGN1cnJlbnRJbnB1dFZhbHVlOiBjdXJyZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMucHJvcHMub25TaG93U2l6ZUNoYW5nZShjdXJyZW50LCBzaXplKTtcblxuICAgICAgaWYgKCdvbkNoYW5nZScgaW4gX3RoaXMucHJvcHMgJiYgX3RoaXMucHJvcHMub25DaGFuZ2UpIHtcbiAgICAgICAgX3RoaXMucHJvcHMub25DaGFuZ2UoY3VycmVudCwgc2l6ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICB2YXIgZGlzYWJsZWQgPSBfdGhpcy5wcm9wcy5kaXNhYmxlZDtcbiAgICAgIHZhciBwYWdlID0gcDtcblxuICAgICAgaWYgKF90aGlzLmlzVmFsaWQocGFnZSkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIHZhciBjdXJyZW50UGFnZSA9IGNhbGN1bGF0ZVBhZ2UodW5kZWZpbmVkLCBfdGhpcy5zdGF0ZSwgX3RoaXMucHJvcHMpO1xuXG4gICAgICAgIGlmIChwYWdlID4gY3VycmVudFBhZ2UpIHtcbiAgICAgICAgICBwYWdlID0gY3VycmVudFBhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAocGFnZSA8IDEpIHtcbiAgICAgICAgICBwYWdlID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKCdjdXJyZW50JyBpbiBfdGhpcy5wcm9wcykpIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBjdXJyZW50OiBwYWdlLFxuICAgICAgICAgICAgY3VycmVudElucHV0VmFsdWU6IHBhZ2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYWdlU2l6ZSA9IF90aGlzLnN0YXRlLnBhZ2VTaXplO1xuXG4gICAgICAgIF90aGlzLnByb3BzLm9uQ2hhbmdlKHBhZ2UsIHBhZ2VTaXplKTtcblxuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzLnN0YXRlLmN1cnJlbnQ7XG4gICAgfTtcblxuICAgIF90aGlzLnByZXYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuaGFzUHJldigpKSB7XG4gICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShfdGhpcy5zdGF0ZS5jdXJyZW50IC0gMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuaGFzTmV4dCgpKSB7XG4gICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShfdGhpcy5zdGF0ZS5jdXJyZW50ICsgMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmp1bXBQcmV2ID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlKF90aGlzLmdldEp1bXBQcmV2UGFnZSgpKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuanVtcE5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5oYW5kbGVDaGFuZ2UoX3RoaXMuZ2V0SnVtcE5leHRQYWdlKCkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYXNQcmV2ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnN0YXRlLmN1cnJlbnQgPiAxO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYXNOZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnN0YXRlLmN1cnJlbnQgPCBjYWxjdWxhdGVQYWdlKHVuZGVmaW5lZCwgX3RoaXMuc3RhdGUsIF90aGlzLnByb3BzKTtcbiAgICB9O1xuXG4gICAgX3RoaXMucnVuSWZFbnRlciA9IGZ1bmN0aW9uIChldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQuY2hhckNvZGUgPT09IDEzKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0UGFyYW1zID0gbmV3IEFycmF5KF9sZW4gPiAyID8gX2xlbiAtIDIgOiAwKSwgX2tleSA9IDI7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICByZXN0UGFyYW1zW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCwgcmVzdFBhcmFtcyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnJ1bklmRW50ZXJQcmV2ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLnJ1bklmRW50ZXIoZSwgX3RoaXMucHJldik7XG4gICAgfTtcblxuICAgIF90aGlzLnJ1bklmRW50ZXJOZXh0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLnJ1bklmRW50ZXIoZSwgX3RoaXMubmV4dCk7XG4gICAgfTtcblxuICAgIF90aGlzLnJ1bklmRW50ZXJKdW1wUHJldiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5ydW5JZkVudGVyKGUsIF90aGlzLmp1bXBQcmV2KTtcbiAgICB9O1xuXG4gICAgX3RoaXMucnVuSWZFbnRlckp1bXBOZXh0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLnJ1bklmRW50ZXIoZSwgX3RoaXMuanVtcE5leHQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVHb1RPID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuRU5URVIgfHwgZS50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShfdGhpcy5zdGF0ZS5jdXJyZW50SW5wdXRWYWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBoYXNPbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlICE9PSBub29wO1xuICAgIHZhciBoYXNDdXJyZW50ID0gKCdjdXJyZW50JyBpbiBwcm9wcyk7XG5cbiAgICBpZiAoaGFzQ3VycmVudCAmJiAhaGFzT25DaGFuZ2UpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ1dhcm5pbmc6IFlvdSBwcm92aWRlZCBhIGBjdXJyZW50YCBwcm9wIHRvIGEgUGFnaW5hdGlvbiBjb21wb25lbnQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIHZhciBfY3VycmVudCA9IHByb3BzLmRlZmF1bHRDdXJyZW50O1xuXG4gICAgaWYgKCdjdXJyZW50JyBpbiBwcm9wcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICBfY3VycmVudCA9IHByb3BzLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgdmFyIF9wYWdlU2l6ZSA9IHByb3BzLmRlZmF1bHRQYWdlU2l6ZTtcblxuICAgIGlmICgncGFnZVNpemUnIGluIHByb3BzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgIF9wYWdlU2l6ZSA9IHByb3BzLnBhZ2VTaXplO1xuICAgIH1cblxuICAgIF9jdXJyZW50ID0gTWF0aC5taW4oX2N1cnJlbnQsIGNhbGN1bGF0ZVBhZ2UoX3BhZ2VTaXplLCB1bmRlZmluZWQsIHByb3BzKSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBjdXJyZW50OiBfY3VycmVudCxcbiAgICAgIGN1cnJlbnRJbnB1dFZhbHVlOiBfY3VycmVudCxcbiAgICAgIHBhZ2VTaXplOiBfcGFnZVNpemVcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFBhZ2luYXRpb24sIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgIC8vIFdoZW4gY3VycmVudCBwYWdlIGNoYW5nZSwgZml4IGZvY3VzZWQgc3R5bGUgb2YgcHJldiBpdGVtXG4gICAgICAvLyBBIGhhY2t5IHNvbHV0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzg5NDhcbiAgICAgIHZhciBwcmVmaXhDbHMgPSB0aGlzLnByb3BzLnByZWZpeENscztcblxuICAgICAgaWYgKHByZXZTdGF0ZS5jdXJyZW50ICE9PSB0aGlzLnN0YXRlLmN1cnJlbnQgJiYgdGhpcy5wYWdpbmF0aW9uTm9kZSkge1xuICAgICAgICB2YXIgbGFzdEN1cnJlbnROb2RlID0gdGhpcy5wYWdpbmF0aW9uTm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tXCIpLmNvbmNhdChwcmV2U3RhdGUuY3VycmVudCkpO1xuXG4gICAgICAgIGlmIChsYXN0Q3VycmVudE5vZGUgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gbGFzdEN1cnJlbnROb2RlKSB7XG4gICAgICAgICAgbGFzdEN1cnJlbnROb2RlLmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRWYWxpZFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZhbGlkVmFsdWUoZSkge1xuICAgICAgdmFyIGlucHV0VmFsdWUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgIHZhciBhbGxQYWdlcyA9IGNhbGN1bGF0ZVBhZ2UodW5kZWZpbmVkLCB0aGlzLnN0YXRlLCB0aGlzLnByb3BzKTtcbiAgICAgIHZhciBjdXJyZW50SW5wdXRWYWx1ZSA9IHRoaXMuc3RhdGUuY3VycmVudElucHV0VmFsdWU7XG4gICAgICB2YXIgdmFsdWU7XG5cbiAgICAgIGlmIChpbnB1dFZhbHVlID09PSAnJykge1xuICAgICAgICB2YWx1ZSA9IGlucHV0VmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICAgIH0gZWxzZSBpZiAoaXNOYU4oTnVtYmVyKGlucHV0VmFsdWUpKSkge1xuICAgICAgICB2YWx1ZSA9IGN1cnJlbnRJbnB1dFZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChpbnB1dFZhbHVlID49IGFsbFBhZ2VzKSB7XG4gICAgICAgIHZhbHVlID0gYWxsUGFnZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IE51bWJlcihpbnB1dFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTaG93U2l6ZUNoYW5nZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2hvd1NpemVDaGFuZ2VyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgc2hvd1NpemVDaGFuZ2VyID0gX3RoaXMkcHJvcHMyLnNob3dTaXplQ2hhbmdlcixcbiAgICAgICAgICB0b3RhbCA9IF90aGlzJHByb3BzMi50b3RhbCxcbiAgICAgICAgICB0b3RhbEJvdW5kYXJ5U2hvd1NpemVDaGFuZ2VyID0gX3RoaXMkcHJvcHMyLnRvdGFsQm91bmRhcnlTaG93U2l6ZUNoYW5nZXI7XG5cbiAgICAgIGlmICh0eXBlb2Ygc2hvd1NpemVDaGFuZ2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gc2hvd1NpemVDaGFuZ2VyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG90YWwgPiB0b3RhbEJvdW5kYXJ5U2hvd1NpemVDaGFuZ2VyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJQcmV2XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclByZXYocHJldlBhZ2UpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHByZXZJY29uID0gX3RoaXMkcHJvcHMzLnByZXZJY29uLFxuICAgICAgICAgIGl0ZW1SZW5kZXIgPSBfdGhpcyRwcm9wczMuaXRlbVJlbmRlcjtcbiAgICAgIHZhciBwcmV2QnV0dG9uID0gaXRlbVJlbmRlcihwcmV2UGFnZSwgJ3ByZXYnLCB0aGlzLmdldEl0ZW1JY29uKHByZXZJY29uLCAncHJldiBwYWdlJykpO1xuICAgICAgdmFyIGRpc2FibGVkID0gIXRoaXMuaGFzUHJldigpO1xuICAgICAgcmV0dXJuICgwLCBfcmVhY3QuaXNWYWxpZEVsZW1lbnQpKHByZXZCdXR0b24pID8gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKHByZXZCdXR0b24sIHtcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgICB9KSA6IHByZXZCdXR0b247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlck5leHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyTmV4dChuZXh0UGFnZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgbmV4dEljb24gPSBfdGhpcyRwcm9wczQubmV4dEljb24sXG4gICAgICAgICAgaXRlbVJlbmRlciA9IF90aGlzJHByb3BzNC5pdGVtUmVuZGVyO1xuICAgICAgdmFyIG5leHRCdXR0b24gPSBpdGVtUmVuZGVyKG5leHRQYWdlLCAnbmV4dCcsIHRoaXMuZ2V0SXRlbUljb24obmV4dEljb24sICduZXh0IHBhZ2UnKSk7XG4gICAgICB2YXIgZGlzYWJsZWQgPSAhdGhpcy5oYXNOZXh0KCk7XG4gICAgICByZXR1cm4gKDAsIF9yZWFjdC5pc1ZhbGlkRWxlbWVudCkobmV4dEJ1dHRvbikgPyAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkobmV4dEJ1dHRvbiwge1xuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgICAgIH0pIDogbmV4dEJ1dHRvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczUucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzNS5jbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczUuc3R5bGUsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczUuZGlzYWJsZWQsXG4gICAgICAgICAgaGlkZU9uU2luZ2xlUGFnZSA9IF90aGlzJHByb3BzNS5oaWRlT25TaW5nbGVQYWdlLFxuICAgICAgICAgIHRvdGFsID0gX3RoaXMkcHJvcHM1LnRvdGFsLFxuICAgICAgICAgIGxvY2FsZSA9IF90aGlzJHByb3BzNS5sb2NhbGUsXG4gICAgICAgICAgc2hvd1F1aWNrSnVtcGVyID0gX3RoaXMkcHJvcHM1LnNob3dRdWlja0p1bXBlcixcbiAgICAgICAgICBzaG93TGVzc0l0ZW1zID0gX3RoaXMkcHJvcHM1LnNob3dMZXNzSXRlbXMsXG4gICAgICAgICAgc2hvd1RpdGxlID0gX3RoaXMkcHJvcHM1LnNob3dUaXRsZSxcbiAgICAgICAgICBzaG93VG90YWwgPSBfdGhpcyRwcm9wczUuc2hvd1RvdGFsLFxuICAgICAgICAgIHNpbXBsZSA9IF90aGlzJHByb3BzNS5zaW1wbGUsXG4gICAgICAgICAgaXRlbVJlbmRlciA9IF90aGlzJHByb3BzNS5pdGVtUmVuZGVyLFxuICAgICAgICAgIHNob3dQcmV2TmV4dEp1bXBlcnMgPSBfdGhpcyRwcm9wczUuc2hvd1ByZXZOZXh0SnVtcGVycyxcbiAgICAgICAgICBqdW1wUHJldkljb24gPSBfdGhpcyRwcm9wczUuanVtcFByZXZJY29uLFxuICAgICAgICAgIGp1bXBOZXh0SWNvbiA9IF90aGlzJHByb3BzNS5qdW1wTmV4dEljb24sXG4gICAgICAgICAgc2VsZWN0Q29tcG9uZW50Q2xhc3MgPSBfdGhpcyRwcm9wczUuc2VsZWN0Q29tcG9uZW50Q2xhc3MsXG4gICAgICAgICAgc2VsZWN0UHJlZml4Q2xzID0gX3RoaXMkcHJvcHM1LnNlbGVjdFByZWZpeENscyxcbiAgICAgICAgICBwYWdlU2l6ZU9wdGlvbnMgPSBfdGhpcyRwcm9wczUucGFnZVNpemVPcHRpb25zO1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBjdXJyZW50ID0gX3RoaXMkc3RhdGUuY3VycmVudCxcbiAgICAgICAgICBwYWdlU2l6ZSA9IF90aGlzJHN0YXRlLnBhZ2VTaXplLFxuICAgICAgICAgIGN1cnJlbnRJbnB1dFZhbHVlID0gX3RoaXMkc3RhdGUuY3VycmVudElucHV0VmFsdWU7IC8vIFdoZW4gaGlkZU9uU2luZ2xlUGFnZSBpcyB0cnVlIGFuZCB0aGVyZSBpcyBvbmx5IDEgcGFnZSwgaGlkZSB0aGUgcGFnZXJcblxuICAgICAgaWYgKGhpZGVPblNpbmdsZVBhZ2UgPT09IHRydWUgJiYgdG90YWwgPD0gcGFnZVNpemUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBhbGxQYWdlcyA9IGNhbGN1bGF0ZVBhZ2UodW5kZWZpbmVkLCB0aGlzLnN0YXRlLCB0aGlzLnByb3BzKTtcbiAgICAgIHZhciBwYWdlckxpc3QgPSBbXTtcbiAgICAgIHZhciBqdW1wUHJldiA9IG51bGw7XG4gICAgICB2YXIganVtcE5leHQgPSBudWxsO1xuICAgICAgdmFyIGZpcnN0UGFnZXIgPSBudWxsO1xuICAgICAgdmFyIGxhc3RQYWdlciA9IG51bGw7XG4gICAgICB2YXIgZ290b0J1dHRvbiA9IG51bGw7XG4gICAgICB2YXIgZ29CdXR0b24gPSBzaG93UXVpY2tKdW1wZXIgJiYgc2hvd1F1aWNrSnVtcGVyLmdvQnV0dG9uO1xuICAgICAgdmFyIHBhZ2VCdWZmZXJTaXplID0gc2hvd0xlc3NJdGVtcyA/IDEgOiAyO1xuICAgICAgdmFyIHByZXZQYWdlID0gY3VycmVudCAtIDEgPiAwID8gY3VycmVudCAtIDEgOiAwO1xuICAgICAgdmFyIG5leHRQYWdlID0gY3VycmVudCArIDEgPCBhbGxQYWdlcyA/IGN1cnJlbnQgKyAxIDogYWxsUGFnZXM7XG4gICAgICB2YXIgZGF0YU9yQXJpYUF0dHJpYnV0ZVByb3BzID0gT2JqZWN0LmtleXModGhpcy5wcm9wcykucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBrZXkpIHtcbiAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJyB8fCBrZXkgPT09ICdyb2xlJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgIHByZXZba2V5XSA9IF90aGlzMi5wcm9wc1trZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGlmIChzaW1wbGUpIHtcbiAgICAgICAgaWYgKGdvQnV0dG9uKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBnb0J1dHRvbiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBnb3RvQnV0dG9uID0gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUdvVE8sXG4gICAgICAgICAgICAgIG9uS2V5VXA6IHRoaXMuaGFuZGxlR29UT1xuICAgICAgICAgICAgfSwgbG9jYWxlLmp1bXBfdG9fY29uZmlybSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdvdG9CdXR0b24gPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUdvVE8sXG4gICAgICAgICAgICAgIG9uS2V5VXA6IHRoaXMuaGFuZGxlR29UT1xuICAgICAgICAgICAgfSwgZ29CdXR0b24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGdvdG9CdXR0b24gPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICAgIHRpdGxlOiBzaG93VGl0bGUgPyBcIlwiLmNvbmNhdChsb2NhbGUuanVtcF90bykuY29uY2F0KGN1cnJlbnQsIFwiL1wiKS5jb25jYXQoYWxsUGFnZXMpIDogbnVsbCxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaW1wbGUtcGFnZXJcIilcbiAgICAgICAgICB9LCBnb3RvQnV0dG9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe1xuICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHByZWZpeENscywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaW1wbGVcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIGNsYXNzTmFtZSksXG4gICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgIHJlZjogdGhpcy5zYXZlUGFnaW5hdGlvbk5vZGVcbiAgICAgICAgfSwgZGF0YU9yQXJpYUF0dHJpYnV0ZVByb3BzKSwgLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAgdGl0bGU6IHNob3dUaXRsZSA/IGxvY2FsZS5wcmV2X3BhZ2UgOiBudWxsLFxuICAgICAgICAgIG9uQ2xpY2s6IHRoaXMucHJldixcbiAgICAgICAgICB0YWJJbmRleDogdGhpcy5oYXNQcmV2KCkgPyAwIDogbnVsbCxcbiAgICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXJQcmV2LFxuICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJldlwiKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksICF0aGlzLmhhc1ByZXYoKSkpLFxuICAgICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiAhdGhpcy5oYXNQcmV2KClcbiAgICAgICAgfSwgdGhpcy5yZW5kZXJQcmV2KHByZXZQYWdlKSksIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICAgIHRpdGxlOiBzaG93VGl0bGUgPyBcIlwiLmNvbmNhdChjdXJyZW50LCBcIi9cIikuY29uY2F0KGFsbFBhZ2VzKSA6IG51bGwsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNpbXBsZS1wYWdlclwiKVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB2YWx1ZTogY3VycmVudElucHV0VmFsdWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgIG9uS2V5RG93bjogdGhpcy5oYW5kbGVLZXlEb3duLFxuICAgICAgICAgIG9uS2V5VXA6IHRoaXMuaGFuZGxlS2V5VXAsXG4gICAgICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlS2V5VXAsXG4gICAgICAgICAgc2l6ZTogXCIzXCJcbiAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNsYXNoXCIpXG4gICAgICAgIH0sIFwiL1wiKSwgYWxsUGFnZXMpLCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICB0aXRsZTogc2hvd1RpdGxlID8gbG9jYWxlLm5leHRfcGFnZSA6IG51bGwsXG4gICAgICAgICAgb25DbGljazogdGhpcy5uZXh0LFxuICAgICAgICAgIHRhYkluZGV4OiB0aGlzLmhhc1ByZXYoKSA/IDAgOiBudWxsLFxuICAgICAgICAgIG9uS2V5UHJlc3M6IHRoaXMucnVuSWZFbnRlck5leHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uZXh0XCIpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgIXRoaXMuaGFzTmV4dCgpKSksXG4gICAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6ICF0aGlzLmhhc05leHQoKVxuICAgICAgICB9LCB0aGlzLnJlbmRlck5leHQobmV4dFBhZ2UpKSwgZ290b0J1dHRvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChhbGxQYWdlcyA8PSAzICsgcGFnZUJ1ZmZlclNpemUgKiAyKSB7XG4gICAgICAgIHZhciBwYWdlclByb3BzID0ge1xuICAgICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXIsXG4gICAgICAgICAgc2hvd1RpdGxlOiBzaG93VGl0bGUsXG4gICAgICAgICAgaXRlbVJlbmRlcjogaXRlbVJlbmRlclxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghYWxsUGFnZXMpIHtcbiAgICAgICAgICBwYWdlckxpc3QucHVzaCggLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX1BhZ2VyLmRlZmF1bHQsICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe30sIHBhZ2VyUHJvcHMsIHtcbiAgICAgICAgICAgIGtleTogXCJub1BhZ2VyXCIsXG4gICAgICAgICAgICBwYWdlOiBhbGxQYWdlcyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKVxuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBhbGxQYWdlczsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIGFjdGl2ZSA9IGN1cnJlbnQgPT09IGk7XG4gICAgICAgICAgcGFnZXJMaXN0LnB1c2goIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9QYWdlci5kZWZhdWx0LCAoMCwgX2V4dGVuZHMyLmRlZmF1bHQpKHt9LCBwYWdlclByb3BzLCB7XG4gICAgICAgICAgICBrZXk6IGksXG4gICAgICAgICAgICBwYWdlOiBpLFxuICAgICAgICAgICAgYWN0aXZlOiBhY3RpdmVcbiAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcHJldkl0ZW1UaXRsZSA9IHNob3dMZXNzSXRlbXMgPyBsb2NhbGUucHJldl8zIDogbG9jYWxlLnByZXZfNTtcbiAgICAgICAgdmFyIG5leHRJdGVtVGl0bGUgPSBzaG93TGVzc0l0ZW1zID8gbG9jYWxlLm5leHRfMyA6IGxvY2FsZS5uZXh0XzU7XG5cbiAgICAgICAgaWYgKHNob3dQcmV2TmV4dEp1bXBlcnMpIHtcbiAgICAgICAgICBqdW1wUHJldiA9IC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICAgICAgdGl0bGU6IHNob3dUaXRsZSA/IHByZXZJdGVtVGl0bGUgOiBudWxsLFxuICAgICAgICAgICAga2V5OiBcInByZXZcIixcbiAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMuanVtcFByZXYsXG4gICAgICAgICAgICB0YWJJbmRleDogXCIwXCIsXG4gICAgICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXJKdW1wUHJldixcbiAgICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItanVtcC1wcmV2XCIpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1qdW1wLXByZXYtY3VzdG9tLWljb25cIiksICEhanVtcFByZXZJY29uKSlcbiAgICAgICAgICB9LCBpdGVtUmVuZGVyKHRoaXMuZ2V0SnVtcFByZXZQYWdlKCksICdqdW1wLXByZXYnLCB0aGlzLmdldEl0ZW1JY29uKGp1bXBQcmV2SWNvbiwgJ3ByZXYgcGFnZScpKSk7XG4gICAgICAgICAganVtcE5leHQgPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICAgIHRpdGxlOiBzaG93VGl0bGUgPyBuZXh0SXRlbVRpdGxlIDogbnVsbCxcbiAgICAgICAgICAgIGtleTogXCJuZXh0XCIsXG4gICAgICAgICAgICB0YWJJbmRleDogXCIwXCIsXG4gICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmp1bXBOZXh0LFxuICAgICAgICAgICAgb25LZXlQcmVzczogdGhpcy5ydW5JZkVudGVySnVtcE5leHQsXG4gICAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWp1bXAtbmV4dFwiKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItanVtcC1uZXh0LWN1c3RvbS1pY29uXCIpLCAhIWp1bXBOZXh0SWNvbikpXG4gICAgICAgICAgfSwgaXRlbVJlbmRlcih0aGlzLmdldEp1bXBOZXh0UGFnZSgpLCAnanVtcC1uZXh0JywgdGhpcy5nZXRJdGVtSWNvbihqdW1wTmV4dEljb24sICduZXh0IHBhZ2UnKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBhZ2VyID0gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX1BhZ2VyLmRlZmF1bHQsIHtcbiAgICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgICBsYXN0OiB0cnVlLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXIsXG4gICAgICAgICAga2V5OiBhbGxQYWdlcyxcbiAgICAgICAgICBwYWdlOiBhbGxQYWdlcyxcbiAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICAgIHNob3dUaXRsZTogc2hvd1RpdGxlLFxuICAgICAgICAgIGl0ZW1SZW5kZXI6IGl0ZW1SZW5kZXJcbiAgICAgICAgfSk7XG4gICAgICAgIGZpcnN0UGFnZXIgPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfUGFnZXIuZGVmYXVsdCwge1xuICAgICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXIsXG4gICAgICAgICAga2V5OiAxLFxuICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICBzaG93VGl0bGU6IHNob3dUaXRsZSxcbiAgICAgICAgICBpdGVtUmVuZGVyOiBpdGVtUmVuZGVyXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgbGVmdCA9IE1hdGgubWF4KDEsIGN1cnJlbnQgLSBwYWdlQnVmZmVyU2l6ZSk7XG4gICAgICAgIHZhciByaWdodCA9IE1hdGgubWluKGN1cnJlbnQgKyBwYWdlQnVmZmVyU2l6ZSwgYWxsUGFnZXMpO1xuXG4gICAgICAgIGlmIChjdXJyZW50IC0gMSA8PSBwYWdlQnVmZmVyU2l6ZSkge1xuICAgICAgICAgIHJpZ2h0ID0gMSArIHBhZ2VCdWZmZXJTaXplICogMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbGxQYWdlcyAtIGN1cnJlbnQgPD0gcGFnZUJ1ZmZlclNpemUpIHtcbiAgICAgICAgICBsZWZ0ID0gYWxsUGFnZXMgLSBwYWdlQnVmZmVyU2l6ZSAqIDI7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBfaSA9IGxlZnQ7IF9pIDw9IHJpZ2h0OyBfaSArPSAxKSB7XG4gICAgICAgICAgdmFyIF9hY3RpdmUgPSBjdXJyZW50ID09PSBfaTtcblxuICAgICAgICAgIHBhZ2VyTGlzdC5wdXNoKCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfUGFnZXIuZGVmYXVsdCwge1xuICAgICAgICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICAgICAgICByb290UHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICAgIG9uS2V5UHJlc3M6IHRoaXMucnVuSWZFbnRlcixcbiAgICAgICAgICAgIGtleTogX2ksXG4gICAgICAgICAgICBwYWdlOiBfaSxcbiAgICAgICAgICAgIGFjdGl2ZTogX2FjdGl2ZSxcbiAgICAgICAgICAgIHNob3dUaXRsZTogc2hvd1RpdGxlLFxuICAgICAgICAgICAgaXRlbVJlbmRlcjogaXRlbVJlbmRlclxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50IC0gMSA+PSBwYWdlQnVmZmVyU2l6ZSAqIDIgJiYgY3VycmVudCAhPT0gMSArIDIpIHtcbiAgICAgICAgICBwYWdlckxpc3RbMF0gPSAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkocGFnZXJMaXN0WzBdLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1hZnRlci1qdW1wLXByZXZcIilcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYWdlckxpc3QudW5zaGlmdChqdW1wUHJldik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsUGFnZXMgLSBjdXJyZW50ID49IHBhZ2VCdWZmZXJTaXplICogMiAmJiBjdXJyZW50ICE9PSBhbGxQYWdlcyAtIDIpIHtcbiAgICAgICAgICBwYWdlckxpc3RbcGFnZXJMaXN0Lmxlbmd0aCAtIDFdID0gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKHBhZ2VyTGlzdFtwYWdlckxpc3QubGVuZ3RoIC0gMV0sIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWJlZm9yZS1qdW1wLW5leHRcIilcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYWdlckxpc3QucHVzaChqdW1wTmV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGVmdCAhPT0gMSkge1xuICAgICAgICAgIHBhZ2VyTGlzdC51bnNoaWZ0KGZpcnN0UGFnZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJpZ2h0ICE9PSBhbGxQYWdlcykge1xuICAgICAgICAgIHBhZ2VyTGlzdC5wdXNoKGxhc3RQYWdlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHRvdGFsVGV4dCA9IG51bGw7XG5cbiAgICAgIGlmIChzaG93VG90YWwpIHtcbiAgICAgICAgdG90YWxUZXh0ID0gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRvdGFsLXRleHRcIilcbiAgICAgICAgfSwgc2hvd1RvdGFsKHRvdGFsLCBbdG90YWwgPT09IDAgPyAwIDogKGN1cnJlbnQgLSAxKSAqIHBhZ2VTaXplICsgMSwgY3VycmVudCAqIHBhZ2VTaXplID4gdG90YWwgPyB0b3RhbCA6IGN1cnJlbnQgKiBwYWdlU2l6ZV0pKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByZXZEaXNhYmxlZCA9ICF0aGlzLmhhc1ByZXYoKSB8fCAhYWxsUGFnZXM7XG4gICAgICB2YXIgbmV4dERpc2FibGVkID0gIXRoaXMuaGFzTmV4dCgpIHx8ICFhbGxQYWdlcztcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIGNsYXNzTmFtZSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSksXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgdW5zZWxlY3RhYmxlOiBcInVuc2VsZWN0YWJsZVwiLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZVBhZ2luYXRpb25Ob2RlXG4gICAgICB9LCBkYXRhT3JBcmlhQXR0cmlidXRlUHJvcHMpLCB0b3RhbFRleHQsIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICB0aXRsZTogc2hvd1RpdGxlID8gbG9jYWxlLnByZXZfcGFnZSA6IG51bGwsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMucHJldixcbiAgICAgICAgdGFiSW5kZXg6IHByZXZEaXNhYmxlZCA/IG51bGwgOiAwLFxuICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXJQcmV2LFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXByZXZcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBwcmV2RGlzYWJsZWQpKSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHByZXZEaXNhYmxlZFxuICAgICAgfSwgdGhpcy5yZW5kZXJQcmV2KHByZXZQYWdlKSksIHBhZ2VyTGlzdCwgLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIHRpdGxlOiBzaG93VGl0bGUgPyBsb2NhbGUubmV4dF9wYWdlIDogbnVsbCxcbiAgICAgICAgb25DbGljazogdGhpcy5uZXh0LFxuICAgICAgICB0YWJJbmRleDogbmV4dERpc2FibGVkID8gbnVsbCA6IDAsXG4gICAgICAgIG9uS2V5UHJlc3M6IHRoaXMucnVuSWZFbnRlck5leHQsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmV4dFwiKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIG5leHREaXNhYmxlZCkpLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogbmV4dERpc2FibGVkXG4gICAgICB9LCB0aGlzLnJlbmRlck5leHQobmV4dFBhZ2UpKSwgLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX09wdGlvbnMuZGVmYXVsdCwge1xuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICByb290UHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIHNlbGVjdENvbXBvbmVudENsYXNzOiBzZWxlY3RDb21wb25lbnRDbGFzcyxcbiAgICAgICAgc2VsZWN0UHJlZml4Q2xzOiBzZWxlY3RQcmVmaXhDbHMsXG4gICAgICAgIGNoYW5nZVNpemU6IHRoaXMuZ2V0U2hvd1NpemVDaGFuZ2VyKCkgPyB0aGlzLmNoYW5nZVBhZ2VTaXplIDogbnVsbCxcbiAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgcGFnZVNpemU6IHBhZ2VTaXplLFxuICAgICAgICBwYWdlU2l6ZU9wdGlvbnM6IHBhZ2VTaXplT3B0aW9ucyxcbiAgICAgICAgcXVpY2tHbzogdGhpcy5zaG91bGREaXNwbGF5UXVpY2tKdW1wZXIoKSA/IHRoaXMuaGFuZGxlQ2hhbmdlIDogbnVsbCxcbiAgICAgICAgZ29CdXR0b246IGdvQnV0dG9uXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSB7fTtcblxuICAgICAgaWYgKCdjdXJyZW50JyBpbiBwcm9wcykge1xuICAgICAgICBuZXdTdGF0ZS5jdXJyZW50ID0gcHJvcHMuY3VycmVudDtcblxuICAgICAgICBpZiAocHJvcHMuY3VycmVudCAhPT0gcHJldlN0YXRlLmN1cnJlbnQpIHtcbiAgICAgICAgICBuZXdTdGF0ZS5jdXJyZW50SW5wdXRWYWx1ZSA9IG5ld1N0YXRlLmN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCdwYWdlU2l6ZScgaW4gcHJvcHMgJiYgcHJvcHMucGFnZVNpemUgIT09IHByZXZTdGF0ZS5wYWdlU2l6ZSkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHByZXZTdGF0ZS5jdXJyZW50O1xuICAgICAgICB2YXIgbmV3Q3VycmVudCA9IGNhbGN1bGF0ZVBhZ2UocHJvcHMucGFnZVNpemUsIHByZXZTdGF0ZSwgcHJvcHMpO1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudCA+IG5ld0N1cnJlbnQgPyBuZXdDdXJyZW50IDogY3VycmVudDtcblxuICAgICAgICBpZiAoISgnY3VycmVudCcgaW4gcHJvcHMpKSB7XG4gICAgICAgICAgbmV3U3RhdGUuY3VycmVudCA9IGN1cnJlbnQ7XG4gICAgICAgICAgbmV3U3RhdGUuY3VycmVudElucHV0VmFsdWUgPSBjdXJyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3U3RhdGUucGFnZVNpemUgPSBwcm9wcy5wYWdlU2l6ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gUGFnaW5hdGlvbjtcbn0oX3JlYWN0LmRlZmF1bHQuQ29tcG9uZW50KTtcblxuUGFnaW5hdGlvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGRlZmF1bHRDdXJyZW50OiAxLFxuICB0b3RhbDogMCxcbiAgZGVmYXVsdFBhZ2VTaXplOiAxMCxcbiAgb25DaGFuZ2U6IG5vb3AsXG4gIGNsYXNzTmFtZTogJycsXG4gIHNlbGVjdFByZWZpeENsczogJ3JjLXNlbGVjdCcsXG4gIHByZWZpeENsczogJ3JjLXBhZ2luYXRpb24nLFxuICBzZWxlY3RDb21wb25lbnRDbGFzczogbnVsbCxcbiAgaGlkZU9uU2luZ2xlUGFnZTogZmFsc2UsXG4gIHNob3dQcmV2TmV4dEp1bXBlcnM6IHRydWUsXG4gIHNob3dRdWlja0p1bXBlcjogZmFsc2UsXG4gIHNob3dMZXNzSXRlbXM6IGZhbHNlLFxuICBzaG93VGl0bGU6IHRydWUsXG4gIG9uU2hvd1NpemVDaGFuZ2U6IG5vb3AsXG4gIGxvY2FsZTogX3poX0NOLmRlZmF1bHQsXG4gIHN0eWxlOiB7fSxcbiAgaXRlbVJlbmRlcjogZGVmYXVsdEl0ZW1SZW5kZXIsXG4gIHRvdGFsQm91bmRhcnlTaG93U2l6ZUNoYW5nZXI6IDUwXG59O1xudmFyIF9kZWZhdWx0ID0gUGFnaW5hdGlvbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmF1bHRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX1BhZ2luYXRpb24uZGVmYXVsdDtcbiAgfVxufSk7XG5cbnZhciBfUGFnaW5hdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFnaW5hdGlvblwiKSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmF1bHQgPSB7XG4gIC8vIE9wdGlvbnMuanN4XG4gIGl0ZW1zX3Blcl9wYWdlOiAnLyBwYWdlJyxcbiAganVtcF90bzogJ0dvIHRvJyxcbiAganVtcF90b19jb25maXJtOiAnY29uZmlybScsXG4gIHBhZ2U6ICcnLFxuICAvLyBQYWdpbmF0aW9uLmpzeFxuICBwcmV2X3BhZ2U6ICdQcmV2aW91cyBQYWdlJyxcbiAgbmV4dF9wYWdlOiAnTmV4dCBQYWdlJyxcbiAgcHJldl81OiAnUHJldmlvdXMgNSBQYWdlcycsXG4gIG5leHRfNTogJ05leHQgNSBQYWdlcycsXG4gIHByZXZfMzogJ1ByZXZpb3VzIDMgUGFnZXMnLFxuICBuZXh0XzM6ICdOZXh0IDMgUGFnZXMnXG59O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmF1bHQgPSB7XG4gIC8vIE9wdGlvbnMuanN4XG4gIGl0ZW1zX3Blcl9wYWdlOiAn5p2hL+mhtScsXG4gIGp1bXBfdG86ICfot7Poh7MnLFxuICBqdW1wX3RvX2NvbmZpcm06ICfnoa7lrponLFxuICBwYWdlOiAn6aG1JyxcbiAgLy8gUGFnaW5hdGlvbi5qc3hcbiAgcHJldl9wYWdlOiAn5LiK5LiA6aG1JyxcbiAgbmV4dF9wYWdlOiAn5LiL5LiA6aG1JyxcbiAgcHJldl81OiAn5ZCR5YmNIDUg6aG1JyxcbiAgbmV4dF81OiAn5ZCR5ZCOIDUg6aG1JyxcbiAgcHJldl8zOiAn5ZCR5YmNIDMg6aG1JyxcbiAgbmV4dF8zOiAn5ZCR5ZCOIDMg6aG1J1xufTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgUGFuZWxDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG52YXIgX2RlZmF1bHQgPSBQYW5lbENvbnRleHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfdXNlTWVyZ2VkU3RhdGU1ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIikpO1xuXG52YXIgX1BpY2tlclBhbmVsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QaWNrZXJQYW5lbFwiKSk7XG5cbnZhciBfUGlja2VyVHJpZ2dlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGlja2VyVHJpZ2dlclwiKSk7XG5cbnZhciBfZGF0ZVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy9kYXRlVXRpbFwiKTtcblxudmFyIF9taXNjVXRpbCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL3V0aWxzL21pc2NVdGlsXCIpKTtcblxudmFyIF9QYW5lbENvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhbmVsQ29udGV4dFwiKSk7XG5cbnZhciBfdWlVdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvdWlVdGlsXCIpO1xuXG52YXIgX3VzZVBpY2tlcklucHV0MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlUGlja2VySW5wdXRcIikpO1xuXG52YXIgX3VzZVRleHRWYWx1ZU1hcHBpbmczID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VUZXh0VmFsdWVNYXBwaW5nXCIpKTtcblxudmFyIF91c2VWYWx1ZVRleHRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlVmFsdWVUZXh0c1wiKSk7XG5cbnZhciBfdXNlSG92ZXJWYWx1ZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZUhvdmVyVmFsdWVcIikpO1xuXG4vKipcbiAqIFJlbW92ZWQ6XG4gKiAgLSBnZXRDYWxlbmRhckNvbnRhaW5lcjogdXNlIGBnZXRQb3B1cENvbnRhaW5lcmAgaW5zdGVhZFxuICogIC0gb25Pa1xuICpcbiAqIE5ldyBGZWF0dXJlOlxuICogIC0gcGlja2VyXG4gKiAgLSBhbGxvd0VtcHR5XG4gKiAgLSBzZWxlY3RhYmxlXG4gKlxuICogVGlwczogU2hvdWxkIGFkZCBmYXEgYWJvdXQgYGRhdGV0aW1lYCBtb2RlIHdpdGggYGRlZmF1bHRWYWx1ZWBcbiAqL1xuZnVuY3Rpb24gSW5uZXJQaWNrZXIocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzMjtcblxuICB2YXIgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1waWNrZXInIDogX3Byb3BzJHByZWZpeENscyxcbiAgICAgIGlkID0gcHJvcHMuaWQsXG4gICAgICB0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGRyb3Bkb3duQ2xhc3NOYW1lID0gcHJvcHMuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgICBkcm9wZG93bkFsaWduID0gcHJvcHMuZHJvcGRvd25BbGlnbixcbiAgICAgIHBvcHVwU3R5bGUgPSBwcm9wcy5wb3B1cFN0eWxlLFxuICAgICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICBpbnB1dFJlYWRPbmx5ID0gcHJvcHMuaW5wdXRSZWFkT25seSxcbiAgICAgIGFsbG93Q2xlYXIgPSBwcm9wcy5hbGxvd0NsZWFyLFxuICAgICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgICAgc2hvd1RpbWUgPSBwcm9wcy5zaG93VGltZSxcbiAgICAgIF9wcm9wcyRwaWNrZXIgPSBwcm9wcy5waWNrZXIsXG4gICAgICBwaWNrZXIgPSBfcHJvcHMkcGlja2VyID09PSB2b2lkIDAgPyAnZGF0ZScgOiBfcHJvcHMkcGlja2VyLFxuICAgICAgZm9ybWF0ID0gcHJvcHMuZm9ybWF0LFxuICAgICAgdXNlMTJIb3VycyA9IHByb3BzLnVzZTEySG91cnMsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgICBkZWZhdWx0T3BlbiA9IHByb3BzLmRlZmF1bHRPcGVuLFxuICAgICAgZGVmYXVsdE9wZW5WYWx1ZSA9IHByb3BzLmRlZmF1bHRPcGVuVmFsdWUsXG4gICAgICBzdWZmaXhJY29uID0gcHJvcHMuc3VmZml4SWNvbixcbiAgICAgIGNsZWFySWNvbiA9IHByb3BzLmNsZWFySWNvbixcbiAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZERhdGUgPSBwcm9wcy5kaXNhYmxlZERhdGUsXG4gICAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIHBpY2tlclJlZiA9IHByb3BzLnBpY2tlclJlZixcbiAgICAgIHBhbmVsUmVuZGVyID0gcHJvcHMucGFuZWxSZW5kZXIsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgb25PcGVuQ2hhbmdlID0gcHJvcHMub25PcGVuQ2hhbmdlLFxuICAgICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgICBvbk1vdXNlRG93biA9IHByb3BzLm9uTW91c2VEb3duLFxuICAgICAgb25Nb3VzZVVwID0gcHJvcHMub25Nb3VzZVVwLFxuICAgICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgb25Nb3VzZUxlYXZlID0gcHJvcHMub25Nb3VzZUxlYXZlLFxuICAgICAgb25Db250ZXh0TWVudSA9IHByb3BzLm9uQ29udGV4dE1lbnUsXG4gICAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICAgIF9wcm9wcyRhdXRvQ29tcGxldGUgPSBwcm9wcy5hdXRvQ29tcGxldGUsXG4gICAgICBhdXRvQ29tcGxldGUgPSBfcHJvcHMkYXV0b0NvbXBsZXRlID09PSB2b2lkIDAgPyAnb2ZmJyA6IF9wcm9wcyRhdXRvQ29tcGxldGU7XG4gIHZhciBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIG5lZWRDb25maXJtQnV0dG9uID0gcGlja2VyID09PSAnZGF0ZScgJiYgISFzaG93VGltZSB8fCBwaWNrZXIgPT09ICd0aW1lJzsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgZm9ybWF0TGlzdCA9ICgwLCBfbWlzY1V0aWwudG9BcnJheSkoKDAsIF91aVV0aWwuZ2V0RGVmYXVsdEZvcm1hdCkoZm9ybWF0LCBwaWNrZXIsIHNob3dUaW1lLCB1c2UxMkhvdXJzKSk7IC8vIFBhbmVsIHJlZlxuXG4gIHZhciBwYW5lbERpdlJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGlucHV0RGl2UmVmID0gUmVhY3QudXNlUmVmKG51bGwpOyAvLyBSZWFsIHZhbHVlXG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9ICgwLCBfdXNlTWVyZ2VkU3RhdGU1LmRlZmF1bHQpKG51bGwsIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVcbiAgfSksXG4gICAgICBfdXNlTWVyZ2VkU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgICAgc2V0SW5uZXJWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07IC8vIFNlbGVjdGVkIHZhbHVlXG5cblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUobWVyZ2VkVmFsdWUpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHNlbGVjdGVkVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07IC8vIE9wZXJhdGlvbiByZWZcblxuXG4gIHZhciBvcGVyYXRpb25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7IC8vIE9wZW5cblxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9ICgwLCBfdXNlTWVyZ2VkU3RhdGU1LmRlZmF1bHQpKGZhbHNlLCB7XG4gICAgdmFsdWU6IG9wZW4sXG4gICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0T3BlbixcbiAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZShwb3N0T3Blbikge1xuICAgICAgcmV0dXJuIGRpc2FibGVkID8gZmFsc2UgOiBwb3N0T3BlbjtcbiAgICB9LFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShuZXdPcGVuKSB7XG4gICAgICBpZiAob25PcGVuQ2hhbmdlKSB7XG4gICAgICAgIG9uT3BlbkNoYW5nZShuZXdPcGVuKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFuZXdPcGVuICYmIG9wZXJhdGlvblJlZi5jdXJyZW50ICYmIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uQ2xvc2UpIHtcbiAgICAgICAgb3BlcmF0aW9uUmVmLmN1cnJlbnQub25DbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSksXG4gICAgICBfdXNlTWVyZ2VkU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlTWVyZ2VkU3RhdGUzLCAyKSxcbiAgICAgIG1lcmdlZE9wZW4gPSBfdXNlTWVyZ2VkU3RhdGU0WzBdLFxuICAgICAgdHJpZ2dlcklubmVyT3BlbiA9IF91c2VNZXJnZWRTdGF0ZTRbMV07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgX3VzZVZhbHVlVGV4dHMgPSAoMCwgX3VzZVZhbHVlVGV4dHMzLmRlZmF1bHQpKHNlbGVjdGVkVmFsdWUsIHtcbiAgICBmb3JtYXRMaXN0OiBmb3JtYXRMaXN0LFxuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICBsb2NhbGU6IGxvY2FsZVxuICB9KSxcbiAgICAgIF91c2VWYWx1ZVRleHRzMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVZhbHVlVGV4dHMsIDIpLFxuICAgICAgdmFsdWVUZXh0cyA9IF91c2VWYWx1ZVRleHRzMlswXSxcbiAgICAgIGZpcnN0VmFsdWVUZXh0ID0gX3VzZVZhbHVlVGV4dHMyWzFdO1xuXG4gIHZhciBfdXNlVGV4dFZhbHVlTWFwcGluZyA9ICgwLCBfdXNlVGV4dFZhbHVlTWFwcGluZzMuZGVmYXVsdCkoe1xuICAgIHZhbHVlVGV4dHM6IHZhbHVlVGV4dHMsXG4gICAgb25UZXh0Q2hhbmdlOiBmdW5jdGlvbiBvblRleHRDaGFuZ2UobmV3VGV4dCkge1xuICAgICAgdmFyIGlucHV0RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5wYXJzZShsb2NhbGUubG9jYWxlLCBuZXdUZXh0LCBmb3JtYXRMaXN0KTtcblxuICAgICAgaWYgKGlucHV0RGF0ZSAmJiAoIWRpc2FibGVkRGF0ZSB8fCAhZGlzYWJsZWREYXRlKGlucHV0RGF0ZSkpKSB7XG4gICAgICAgIHNldFNlbGVjdGVkVmFsdWUoaW5wdXREYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLFxuICAgICAgX3VzZVRleHRWYWx1ZU1hcHBpbmcyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlVGV4dFZhbHVlTWFwcGluZywgMyksXG4gICAgICB0ZXh0ID0gX3VzZVRleHRWYWx1ZU1hcHBpbmcyWzBdLFxuICAgICAgdHJpZ2dlclRleHRDaGFuZ2UgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMV0sXG4gICAgICByZXNldFRleHQgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMl07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVHJpZ2dlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgdHJpZ2dlckNoYW5nZSA9IGZ1bmN0aW9uIHRyaWdnZXJDaGFuZ2UobmV3VmFsdWUpIHtcbiAgICBzZXRTZWxlY3RlZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICBzZXRJbm5lclZhbHVlKG5ld1ZhbHVlKTtcblxuICAgIGlmIChvbkNoYW5nZSAmJiAhKDAsIF9kYXRlVXRpbC5pc0VxdWFsKShnZW5lcmF0ZUNvbmZpZywgbWVyZ2VkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgb25DaGFuZ2UobmV3VmFsdWUsIG5ld1ZhbHVlID8gZ2VuZXJhdGVDb25maWcubG9jYWxlLmZvcm1hdChsb2NhbGUubG9jYWxlLCBuZXdWYWx1ZSwgZm9ybWF0TGlzdFswXSkgOiAnJyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB0cmlnZ2VyT3BlbiA9IGZ1bmN0aW9uIHRyaWdnZXJPcGVuKG5ld09wZW4pIHtcbiAgICBpZiAoZGlzYWJsZWQgJiYgbmV3T3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyaWdnZXJJbm5lck9wZW4obmV3T3Blbik7XG4gIH07XG5cbiAgdmFyIGZvcndhcmRLZXlEb3duID0gZnVuY3Rpb24gZm9yd2FyZEtleURvd24oZSkge1xuICAgIGlmIChtZXJnZWRPcGVuICYmIG9wZXJhdGlvblJlZi5jdXJyZW50ICYmIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bikge1xuICAgICAgLy8gTGV0IHBvcHVwIHBhbmVsIGhhbmRsZSBrZXlib2FyZFxuICAgICAgcmV0dXJuIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bihlKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvbmUtYmxvY2tzICovXG5cblxuICAgIHtcbiAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ1BpY2tlciBub3QgY29ycmVjdCBmb3J3YXJkIEtleURvd24gb3BlcmF0aW9uLiBQbGVhc2UgaGVscCB0byBmaXJlIGlzc3VlIGFib3V0IHRoaXMuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvbkludGVybmFsTW91c2VVcCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxNb3VzZVVwKCkge1xuICAgIGlmIChvbk1vdXNlVXApIHtcbiAgICAgIG9uTW91c2VVcC5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIHRyaWdnZXJPcGVuKHRydWUpO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5wdXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfdXNlUGlja2VySW5wdXQgPSAoMCwgX3VzZVBpY2tlcklucHV0My5kZWZhdWx0KSh7XG4gICAgYmx1clRvQ2FuY2VsOiBuZWVkQ29uZmlybUJ1dHRvbixcbiAgICBvcGVuOiBtZXJnZWRPcGVuLFxuICAgIHZhbHVlOiB0ZXh0LFxuICAgIHRyaWdnZXJPcGVuOiB0cmlnZ2VyT3BlbixcbiAgICBmb3J3YXJkS2V5RG93bjogZm9yd2FyZEtleURvd24sXG4gICAgaXNDbGlja091dHNpZGU6IGZ1bmN0aW9uIGlzQ2xpY2tPdXRzaWRlKHRhcmdldCkge1xuICAgICAgcmV0dXJuICEoMCwgX3VpVXRpbC5lbGVtZW50c0NvbnRhaW5zKShbcGFuZWxEaXZSZWYuY3VycmVudCwgaW5wdXREaXZSZWYuY3VycmVudF0sIHRhcmdldCk7XG4gICAgfSxcbiAgICBvblN1Ym1pdDogZnVuY3Rpb24gb25TdWJtaXQoKSB7XG4gICAgICBpZiAoZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShzZWxlY3RlZFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJDaGFuZ2Uoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICB0cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICByZXNldFRleHQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb25DYW5jZWw6IGZ1bmN0aW9uIG9uQ2FuY2VsKCkge1xuICAgICAgdHJpZ2dlck9wZW4oZmFsc2UpO1xuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZShtZXJnZWRWYWx1ZSk7XG4gICAgICByZXNldFRleHQoKTtcbiAgICB9LFxuICAgIG9uRm9jdXM6IG9uRm9jdXMsXG4gICAgb25CbHVyOiBvbkJsdXJcbiAgfSksXG4gICAgICBfdXNlUGlja2VySW5wdXQyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlUGlja2VySW5wdXQsIDIpLFxuICAgICAgaW5wdXRQcm9wcyA9IF91c2VQaWNrZXJJbnB1dDJbMF0sXG4gICAgICBfdXNlUGlja2VySW5wdXQyJCA9IF91c2VQaWNrZXJJbnB1dDJbMV0sXG4gICAgICBmb2N1c2VkID0gX3VzZVBpY2tlcklucHV0MiQuZm9jdXNlZCxcbiAgICAgIHR5cGluZyA9IF91c2VQaWNrZXJJbnB1dDIkLnR5cGluZzsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3luYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2xvc2Ugc2hvdWxkIHN5bmMgYmFjayB3aXRoIHRleHQgdmFsdWVcblxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFtZXJnZWRPcGVuKSB7XG4gICAgICBzZXRTZWxlY3RlZFZhbHVlKG1lcmdlZFZhbHVlKTtcblxuICAgICAgaWYgKCF2YWx1ZVRleHRzLmxlbmd0aCB8fCB2YWx1ZVRleHRzWzBdID09PSAnJykge1xuICAgICAgICB0cmlnZ2VyVGV4dENoYW5nZSgnJyk7XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWVUZXh0ICE9PSB0ZXh0KSB7XG4gICAgICAgIHJlc2V0VGV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW21lcmdlZE9wZW4sIHZhbHVlVGV4dHNdKTsgLy8gQ2hhbmdlIHBpY2tlciBzaG91bGQgc3luYyBiYWNrIHdpdGggdGV4dCB2YWx1ZVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFtZXJnZWRPcGVuKSB7XG4gICAgICByZXNldFRleHQoKTtcbiAgICB9XG4gIH0sIFtwaWNrZXJdKTsgLy8gU3luYyBpbm5lclZhbHVlIHdpdGggY29udHJvbCBtb2RlXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTeW5jIHNlbGVjdCB2YWx1ZVxuICAgIHNldFNlbGVjdGVkVmFsdWUobWVyZ2VkVmFsdWUpO1xuICB9LCBbbWVyZ2VkVmFsdWVdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQcml2YXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBpZiAocGlja2VyUmVmKSB7XG4gICAgcGlja2VyUmVmLmN1cnJlbnQgPSB7XG4gICAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFuZWwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBwYW5lbFByb3BzID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgcHJvcHMpLCB7fSwge1xuICAgIGNsYXNzTmFtZTogdW5kZWZpbmVkLFxuICAgIHN0eWxlOiB1bmRlZmluZWQsXG4gICAgcGlja2VyVmFsdWU6IHVuZGVmaW5lZCxcbiAgICBvblBpY2tlclZhbHVlQ2hhbmdlOiB1bmRlZmluZWRcbiAgfSk7XG4gIHZhciBwYW5lbE5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9QaWNrZXJQYW5lbC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwYW5lbFByb3BzLCB7XG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKCgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsLWZvY3VzZWRcIiksICF0eXBpbmcpKSxcbiAgICB2YWx1ZTogc2VsZWN0ZWRWYWx1ZSxcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICB0YWJJbmRleDogLTEsXG4gICAgb25DaGFuZ2U6IHNldFNlbGVjdGVkVmFsdWUsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgfSkpO1xuXG4gIGlmIChwYW5lbFJlbmRlcikge1xuICAgIHBhbmVsTm9kZSA9IHBhbmVsUmVuZGVyKHBhbmVsTm9kZSk7XG4gIH1cblxuICB2YXIgcGFuZWwgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWwtY29udGFpbmVyXCIpLFxuICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCBwYW5lbE5vZGUpO1xuICB2YXIgc3VmZml4Tm9kZTtcblxuICBpZiAoc3VmZml4SWNvbikge1xuICAgIHN1ZmZpeE5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VmZml4XCIpXG4gICAgfSwgc3VmZml4SWNvbik7XG4gIH1cblxuICB2YXIgY2xlYXJOb2RlO1xuXG4gIGlmIChhbGxvd0NsZWFyICYmIG1lcmdlZFZhbHVlICYmICFkaXNhYmxlZCkge1xuICAgIGNsZWFyTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdHJpZ2dlckNoYW5nZShudWxsKTtcbiAgICAgICAgdHJpZ2dlck9wZW4oZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbGVhclwiKVxuICAgIH0sIGNsZWFySWNvbiB8fCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xlYXItYnRuXCIpXG4gICAgfSkpO1xuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KSghZGVmYXVsdE9wZW5WYWx1ZSwgJ2BkZWZhdWx0T3BlblZhbHVlYCBtYXkgY29uZnVzZSB1c2VyIGZvciB0aGUgY3VycmVudCB2YWx1ZSBzdGF0dXMuIFBsZWFzZSB1c2UgYGRlZmF1bHRWYWx1ZWAgaW5zdGVhZC4nKTtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJldHVybiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIG9uQ29udGV4dFNlbGVjdCA9IGZ1bmN0aW9uIG9uQ29udGV4dFNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgIT09ICdrZXknICYmICFuZWVkQ29uZmlybUJ1dHRvbikge1xuICAgICAgLy8gdHJpZ2dlckNoYW5nZSB3aWxsIGFsc28gdXBkYXRlIHNlbGVjdGVkIHZhbHVlc1xuICAgICAgdHJpZ2dlckNoYW5nZShkYXRlKTtcbiAgICAgIHRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBvcHVwUGxhY2VtZW50ID0gZGlyZWN0aW9uID09PSAncnRsJyA/ICdib3R0b21SaWdodCcgOiAnYm90dG9tTGVmdCc7XG5cbiAgdmFyIF91c2VIb3ZlclZhbHVlID0gKDAsIF91c2VIb3ZlclZhbHVlMy5kZWZhdWx0KSh0ZXh0LCB7XG4gICAgZm9ybWF0TGlzdDogZm9ybWF0TGlzdCxcbiAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlOiBsb2NhbGVcbiAgfSksXG4gICAgICBfdXNlSG92ZXJWYWx1ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VIb3ZlclZhbHVlLCAzKSxcbiAgICAgIGhvdmVyVmFsdWUgPSBfdXNlSG92ZXJWYWx1ZTJbMF0sXG4gICAgICBvbkVudGVyID0gX3VzZUhvdmVyVmFsdWUyWzFdLFxuICAgICAgb25MZWF2ZSA9IF91c2VIb3ZlclZhbHVlMlsyXTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfUGFuZWxDb250ZXh0LmRlZmF1bHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgb3BlcmF0aW9uUmVmOiBvcGVyYXRpb25SZWYsXG4gICAgICBoaWRlSGVhZGVyOiBwaWNrZXIgPT09ICd0aW1lJyxcbiAgICAgIHBhbmVsUmVmOiBwYW5lbERpdlJlZixcbiAgICAgIG9uU2VsZWN0OiBvbkNvbnRleHRTZWxlY3QsXG4gICAgICBvcGVuOiBtZXJnZWRPcGVuLFxuICAgICAgZGVmYXVsdE9wZW5WYWx1ZTogZGVmYXVsdE9wZW5WYWx1ZSxcbiAgICAgIG9uRGF0ZU1vdXNlRW50ZXI6IG9uRW50ZXIsXG4gICAgICBvbkRhdGVNb3VzZUxlYXZlOiBvbkxlYXZlXG4gICAgfVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9QaWNrZXJUcmlnZ2VyLmRlZmF1bHQsIHtcbiAgICB2aXNpYmxlOiBtZXJnZWRPcGVuLFxuICAgIHBvcHVwRWxlbWVudDogcGFuZWwsXG4gICAgcG9wdXBTdHlsZTogcG9wdXBTdHlsZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBkcm9wZG93bkNsYXNzTmFtZTogZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZHJvcGRvd25BbGlnbjogZHJvcGRvd25BbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwUGxhY2VtZW50OiBwb3B1cFBsYWNlbWVudCxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvY3VzZWRcIiksIGZvY3VzZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMyKSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93bixcbiAgICBvbk1vdXNlVXA6IG9uSW50ZXJuYWxNb3VzZVVwLFxuICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlLFxuICAgIG9uQ29udGV4dE1lbnU6IG9uQ29udGV4dE1lbnUsXG4gICAgb25DbGljazogb25DbGlja1xuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dC1wbGFjZWhvbGRlclwiKSwgISFob3ZlclZhbHVlKSksXG4gICAgcmVmOiBpbnB1dERpdlJlZlxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgaWQ6IGlkLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcmVhZE9ubHk6IGlucHV0UmVhZE9ubHkgfHwgIXR5cGluZyxcbiAgICB2YWx1ZTogaG92ZXJWYWx1ZSB8fCB0ZXh0LFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICB0cmlnZ2VyVGV4dENoYW5nZShlLnRhcmdldC52YWx1ZSk7XG4gICAgfSxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXIsXG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICB0aXRsZTogdGV4dFxuICB9LCBpbnB1dFByb3BzLCB7XG4gICAgc2l6ZTogKDAsIF91aVV0aWwuZ2V0SW5wdXRTaXplKShwaWNrZXIsIGZvcm1hdExpc3RbMF0pXG4gIH0sICgwLCBfbWlzY1V0aWwuZGVmYXVsdCkocHJvcHMpLCB7XG4gICAgYXV0b0NvbXBsZXRlOiBhdXRvQ29tcGxldGVcbiAgfSkpLCBzdWZmaXhOb2RlLCBjbGVhck5vZGUpKSkpO1xufSAvLyBXcmFwIHdpdGggY2xhc3MgY29tcG9uZW50IHRvIGVuYWJsZSBwYXNzIGdlbmVyaWMgd2l0aCBpbnN0YW5jZSBtZXRob2RcblxuXG52YXIgUGlja2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKFBpY2tlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyLmRlZmF1bHQpKFBpY2tlcik7XG5cbiAgZnVuY3Rpb24gUGlja2VyKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIFBpY2tlcik7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy5waWNrZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcblxuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMucGlja2VyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgX3RoaXMucGlja2VyUmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShQaWNrZXIsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChJbm5lclBpY2tlciwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICBwaWNrZXJSZWY6IHRoaXMucGlja2VyUmVmXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBQaWNrZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBfZGVmYXVsdCA9IFBpY2tlcjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfS2V5Q29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0tleUNvZGVcIikpO1xuXG52YXIgX3dhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi93YXJuaW5nXCIpKTtcblxudmFyIF91c2VNZXJnZWRTdGF0ZTcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9ob29rcy91c2VNZXJnZWRTdGF0ZVwiKSk7XG5cbnZhciBfVGltZVBhbmVsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYW5lbHMvVGltZVBhbmVsXCIpKTtcblxudmFyIF9EYXRldGltZVBhbmVsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYW5lbHMvRGF0ZXRpbWVQYW5lbFwiKSk7XG5cbnZhciBfRGF0ZVBhbmVsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYW5lbHMvRGF0ZVBhbmVsXCIpKTtcblxudmFyIF9XZWVrUGFuZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhbmVscy9XZWVrUGFuZWxcIikpO1xuXG52YXIgX01vbnRoUGFuZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhbmVscy9Nb250aFBhbmVsXCIpKTtcblxudmFyIF9RdWFydGVyUGFuZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhbmVscy9RdWFydGVyUGFuZWxcIikpO1xuXG52YXIgX1llYXJQYW5lbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFuZWxzL1llYXJQYW5lbFwiKSk7XG5cbnZhciBfRGVjYWRlUGFuZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhbmVscy9EZWNhZGVQYW5lbFwiKSk7XG5cbnZhciBfZGF0ZVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy9kYXRlVXRpbFwiKTtcblxudmFyIF9QYW5lbENvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhbmVsQ29udGV4dFwiKSk7XG5cbnZhciBfdWlVdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvdWlVdGlsXCIpO1xuXG52YXIgX1JhbmdlQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUmFuZ2VDb250ZXh0XCIpKTtcblxudmFyIF9nZXRFeHRyYUZvb3RlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXRpbHMvZ2V0RXh0cmFGb290ZXJcIikpO1xuXG52YXIgX2dldFJhbmdlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXRpbHMvZ2V0UmFuZ2VzXCIpKTtcblxudmFyIF90aW1lVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL3RpbWVVdGlsXCIpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9uby1ub25pbnRlcmFjdGl2ZS10YWJpbmRleCAqL1xuXG4vKipcbiAqIExvZ2ljOlxuICogIFdoZW4gYG1vZGVgID09PSBgcGlja2VyYCxcbiAqICBjbGljayB3aWxsIHRyaWdnZXIgYG9uU2VsZWN0YCAoaWYgdmFsdWUgY2hhbmdlZCB0cmlnZ2VyIGBvbkNoYW5nZWAgYWxzbykuXG4gKiAgUGFuZWwgY2hhbmdlIHdpbGwgbm90IHRyaWdnZXIgYG9uU2VsZWN0YCBidXQgdHJpZ2dlciBgb25QYW5lbENoYW5nZWBcbiAqL1xuZnVuY3Rpb24gUGlja2VyUGFuZWwocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXBpY2tlcicgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgcGlja2VyVmFsdWUgPSBwcm9wcy5waWNrZXJWYWx1ZSxcbiAgICAgIGRlZmF1bHRQaWNrZXJWYWx1ZSA9IHByb3BzLmRlZmF1bHRQaWNrZXJWYWx1ZSxcbiAgICAgIGRpc2FibGVkRGF0ZSA9IHByb3BzLmRpc2FibGVkRGF0ZSxcbiAgICAgIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgICAgX3Byb3BzJHBpY2tlciA9IHByb3BzLnBpY2tlcixcbiAgICAgIHBpY2tlciA9IF9wcm9wcyRwaWNrZXIgPT09IHZvaWQgMCA/ICdkYXRlJyA6IF9wcm9wcyRwaWNrZXIsXG4gICAgICBfcHJvcHMkdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleCxcbiAgICAgIHRhYkluZGV4ID0gX3Byb3BzJHRhYkluZGV4ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHRhYkluZGV4LFxuICAgICAgc2hvd05vdyA9IHByb3BzLnNob3dOb3csXG4gICAgICBzaG93VGltZSA9IHByb3BzLnNob3dUaW1lLFxuICAgICAgc2hvd1RvZGF5ID0gcHJvcHMuc2hvd1RvZGF5LFxuICAgICAgcmVuZGVyRXh0cmFGb290ZXIgPSBwcm9wcy5yZW5kZXJFeHRyYUZvb3RlcixcbiAgICAgIGhpZGVIZWFkZXIgPSBwcm9wcy5oaWRlSGVhZGVyLFxuICAgICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZSxcbiAgICAgIG9uTW91c2VEb3duID0gcHJvcHMub25Nb3VzZURvd24sXG4gICAgICBvblBpY2tlclZhbHVlQ2hhbmdlID0gcHJvcHMub25QaWNrZXJWYWx1ZUNoYW5nZSxcbiAgICAgIF9vbk9rID0gcHJvcHMub25PayxcbiAgICAgIGNvbXBvbmVudHMgPSBwcm9wcy5jb21wb25lbnRzLFxuICAgICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgICAgX3Byb3BzJGhvdXJTdGVwID0gcHJvcHMuaG91clN0ZXAsXG4gICAgICBob3VyU3RlcCA9IF9wcm9wcyRob3VyU3RlcCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRob3VyU3RlcCxcbiAgICAgIF9wcm9wcyRtaW51dGVTdGVwID0gcHJvcHMubWludXRlU3RlcCxcbiAgICAgIG1pbnV0ZVN0ZXAgPSBfcHJvcHMkbWludXRlU3RlcCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRtaW51dGVTdGVwLFxuICAgICAgX3Byb3BzJHNlY29uZFN0ZXAgPSBwcm9wcy5zZWNvbmRTdGVwLFxuICAgICAgc2Vjb25kU3RlcCA9IF9wcm9wcyRzZWNvbmRTdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJHNlY29uZFN0ZXA7XG4gIHZhciBuZWVkQ29uZmlybUJ1dHRvbiA9IHBpY2tlciA9PT0gJ2RhdGUnICYmICEhc2hvd1RpbWUgfHwgcGlja2VyID09PSAndGltZSc7XG4gIHZhciBpc0hvdXJTdGVwVmFsaWQgPSAyNCAlIGhvdXJTdGVwID09PSAwO1xuICB2YXIgaXNNaW51dGVTdGVwVmFsaWQgPSA2MCAlIG1pbnV0ZVN0ZXAgPT09IDA7XG4gIHZhciBpc1NlY29uZFN0ZXBWYWxpZCA9IDYwICUgc2Vjb25kU3RlcCA9PT0gMDtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KSghdmFsdWUgfHwgZ2VuZXJhdGVDb25maWcuaXNWYWxpZGF0ZSh2YWx1ZSksICdJbnZhbGlkYXRlIGRhdGUgcGFzcyB0byBgdmFsdWVgLicpO1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KSghdmFsdWUgfHwgZ2VuZXJhdGVDb25maWcuaXNWYWxpZGF0ZSh2YWx1ZSksICdJbnZhbGlkYXRlIGRhdGUgcGFzcyB0byBgZGVmYXVsdFZhbHVlYC4nKTtcbiAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoaXNIb3VyU3RlcFZhbGlkLCBcImBob3VyU3RlcGAgXCIuY29uY2F0KGhvdXJTdGVwLCBcIiBpcyBpbnZhbGlkLiBJdCBzaG91bGQgYmUgYSBmYWN0b3Igb2YgMjQuXCIpKTtcbiAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoaXNNaW51dGVTdGVwVmFsaWQsIFwiYG1pbnV0ZVN0ZXBgIFwiLmNvbmNhdChtaW51dGVTdGVwLCBcIiBpcyBpbnZhbGlkLiBJdCBzaG91bGQgYmUgYSBmYWN0b3Igb2YgNjAuXCIpKTtcbiAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoaXNTZWNvbmRTdGVwVmFsaWQsIFwiYHNlY29uZFN0ZXBgIFwiLmNvbmNhdChzZWNvbmRTdGVwLCBcIiBpcyBpbnZhbGlkLiBJdCBzaG91bGQgYmUgYSBmYWN0b3Igb2YgNjAuXCIpKTtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0YXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgcGFuZWxDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfUGFuZWxDb250ZXh0LmRlZmF1bHQpO1xuICB2YXIgb3BlcmF0aW9uUmVmID0gcGFuZWxDb250ZXh0Lm9wZXJhdGlvblJlZixcbiAgICAgIHBhbmVsRGl2UmVmID0gcGFuZWxDb250ZXh0LnBhbmVsUmVmLFxuICAgICAgb25Db250ZXh0U2VsZWN0ID0gcGFuZWxDb250ZXh0Lm9uU2VsZWN0LFxuICAgICAgaGlkZVJhbmdlcyA9IHBhbmVsQ29udGV4dC5oaWRlUmFuZ2VzLFxuICAgICAgZGVmYXVsdE9wZW5WYWx1ZSA9IHBhbmVsQ29udGV4dC5kZWZhdWx0T3BlblZhbHVlO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1JhbmdlQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIGluUmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5pblJhbmdlLFxuICAgICAgcGFuZWxQb3NpdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LnBhbmVsUG9zaXRpb24sXG4gICAgICByYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LnJhbmdlZFZhbHVlLFxuICAgICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LmhvdmVyUmFuZ2VkVmFsdWU7XG5cbiAgdmFyIHBhbmVsUmVmID0gUmVhY3QudXNlUmVmKHt9KTsgLy8gSGFuZGxlIGluaXQgbG9naWNcblxuICB2YXIgaW5pdFJlZiA9IFJlYWN0LnVzZVJlZih0cnVlKTsgLy8gVmFsdWVcblxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gKDAsIF91c2VNZXJnZWRTdGF0ZTcuZGVmYXVsdCkobnVsbCwge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZSh2YWwpIHtcbiAgICAgIGlmICghdmFsICYmIGRlZmF1bHRPcGVuVmFsdWUgJiYgcGlja2VyID09PSAndGltZScpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRPcGVuVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICB9KSxcbiAgICAgIF91c2VNZXJnZWRTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgICBtZXJnZWRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgICBzZXRJbm5lclZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTsgLy8gVmlldyBkYXRlIGNvbnRyb2xcblxuXG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUzID0gKDAsIF91c2VNZXJnZWRTdGF0ZTcuZGVmYXVsdCkobnVsbCwge1xuICAgIHZhbHVlOiBwaWNrZXJWYWx1ZSxcbiAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRQaWNrZXJWYWx1ZSB8fCBtZXJnZWRWYWx1ZSxcbiAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZShkYXRlKSB7XG4gICAgICByZXR1cm4gZGF0ZSB8fCBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKTtcbiAgICB9XG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZU1lcmdlZFN0YXRlMywgMiksXG4gICAgICB2aWV3RGF0ZSA9IF91c2VNZXJnZWRTdGF0ZTRbMF0sXG4gICAgICBzZXRJbm5lclZpZXdEYXRlID0gX3VzZU1lcmdlZFN0YXRlNFsxXTtcblxuICB2YXIgc2V0Vmlld0RhdGUgPSBmdW5jdGlvbiBzZXRWaWV3RGF0ZShkYXRlKSB7XG4gICAgc2V0SW5uZXJWaWV3RGF0ZShkYXRlKTtcblxuICAgIGlmIChvblBpY2tlclZhbHVlQ2hhbmdlKSB7XG4gICAgICBvblBpY2tlclZhbHVlQ2hhbmdlKGRhdGUpO1xuICAgIH1cbiAgfTsgLy8gUGFuZWwgY29udHJvbFxuXG5cbiAgdmFyIGdldEludGVybmFsTmV4dE1vZGUgPSBmdW5jdGlvbiBnZXRJbnRlcm5hbE5leHRNb2RlKG5leHRNb2RlKSB7XG4gICAgdmFyIGdldE5leHRNb2RlID0gX3VpVXRpbC5QaWNrZXJNb2RlTWFwW3BpY2tlcl07XG5cbiAgICBpZiAoZ2V0TmV4dE1vZGUpIHtcbiAgICAgIHJldHVybiBnZXROZXh0TW9kZShuZXh0TW9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRNb2RlO1xuICB9OyAvLyBTYXZlIHBhbmVsIGlzIGNoYW5nZWQgZnJvbSB3aGljaCBwYW5lbFxuXG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTUgPSAoMCwgX3VzZU1lcmdlZFN0YXRlNy5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHBpY2tlciA9PT0gJ3RpbWUnKSB7XG4gICAgICByZXR1cm4gJ3RpbWUnO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRJbnRlcm5hbE5leHRNb2RlKCdkYXRlJyk7XG4gIH0sIHtcbiAgICB2YWx1ZTogbW9kZVxuICB9KSxcbiAgICAgIF91c2VNZXJnZWRTdGF0ZTYgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VNZXJnZWRTdGF0ZTUsIDIpLFxuICAgICAgbWVyZ2VkTW9kZSA9IF91c2VNZXJnZWRTdGF0ZTZbMF0sXG4gICAgICBzZXRJbm5lck1vZGUgPSBfdXNlTWVyZ2VkU3RhdGU2WzFdO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW5uZXJNb2RlKHBpY2tlcik7XG4gIH0sIFtwaWNrZXJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtZXJnZWRNb2RlO1xuICB9KSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBzb3VyY2VNb2RlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFNvdXJjZU1vZGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBvbkludGVybmFsUGFuZWxDaGFuZ2UgPSBmdW5jdGlvbiBvbkludGVybmFsUGFuZWxDaGFuZ2UobmV3TW9kZSwgdmlld1ZhbHVlKSB7XG4gICAgdmFyIG5leHRNb2RlID0gZ2V0SW50ZXJuYWxOZXh0TW9kZShuZXdNb2RlIHx8IG1lcmdlZE1vZGUpO1xuICAgIHNldFNvdXJjZU1vZGUobWVyZ2VkTW9kZSk7XG4gICAgc2V0SW5uZXJNb2RlKG5leHRNb2RlKTtcblxuICAgIGlmIChvblBhbmVsQ2hhbmdlICYmIChtZXJnZWRNb2RlICE9PSBuZXh0TW9kZSB8fCAoMCwgX2RhdGVVdGlsLmlzRXF1YWwpKGdlbmVyYXRlQ29uZmlnLCB2aWV3RGF0ZSwgdmlld0RhdGUpKSkge1xuICAgICAgb25QYW5lbENoYW5nZSh2aWV3VmFsdWUsIG5leHRNb2RlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHRyaWdnZXJTZWxlY3QgPSBmdW5jdGlvbiB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpIHtcbiAgICB2YXIgZm9yY2VUcmlnZ2VyU2VsZWN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICAgIGlmIChtZXJnZWRNb2RlID09PSBwaWNrZXIgfHwgZm9yY2VUcmlnZ2VyU2VsZWN0KSB7XG4gICAgICBzZXRJbm5lclZhbHVlKGRhdGUpO1xuXG4gICAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgICAgb25TZWxlY3QoZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbkNvbnRleHRTZWxlY3QpIHtcbiAgICAgICAgb25Db250ZXh0U2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25DaGFuZ2UgJiYgISgwLCBfZGF0ZVV0aWwuaXNFcXVhbCkoZ2VuZXJhdGVDb25maWcsIGRhdGUsIG1lcmdlZFZhbHVlKSkge1xuICAgICAgICBvbkNoYW5nZShkYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gSW50ZXJhY3RpdmUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBvbkludGVybmFsS2V5RG93biA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxLZXlEb3duKGUpIHtcbiAgICBpZiAocGFuZWxSZWYuY3VycmVudCAmJiBwYW5lbFJlZi5jdXJyZW50Lm9uS2V5RG93bikge1xuICAgICAgaWYgKFtfS2V5Q29kZS5kZWZhdWx0LkxFRlQsIF9LZXlDb2RlLmRlZmF1bHQuUklHSFQsIF9LZXlDb2RlLmRlZmF1bHQuVVAsIF9LZXlDb2RlLmRlZmF1bHQuRE9XTiwgX0tleUNvZGUuZGVmYXVsdC5QQUdFX1VQLCBfS2V5Q29kZS5kZWZhdWx0LlBBR0VfRE9XTiwgX0tleUNvZGUuZGVmYXVsdC5FTlRFUl0uaW5jbHVkZXMoZS53aGljaCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFuZWxSZWYuY3VycmVudC5vbktleURvd24oZSk7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb25lLWJsb2NrcyAqL1xuXG5cbiAgICB7XG4gICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsICdQYW5lbCBub3QgY29ycmVjdCBoYW5kbGUga2V5RG93biBldmVudC4gUGxlYXNlIGhlbHAgdG8gZmlyZSBpc3N1ZSBhYm91dCB0aGlzLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvbmUtYmxvY2tzICovXG4gIH07XG5cbiAgdmFyIG9uSW50ZXJuYWxCbHVyID0gZnVuY3Rpb24gb25JbnRlcm5hbEJsdXIoZSkge1xuICAgIGlmIChwYW5lbFJlZi5jdXJyZW50ICYmIHBhbmVsUmVmLmN1cnJlbnQub25CbHVyKSB7XG4gICAgICBwYW5lbFJlZi5jdXJyZW50Lm9uQmx1cihlKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKG9wZXJhdGlvblJlZiAmJiBwYW5lbFBvc2l0aW9uICE9PSAncmlnaHQnKSB7XG4gICAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgICBvbktleURvd246IG9uSW50ZXJuYWxLZXlEb3duLFxuICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHtcbiAgICAgICAgaWYgKHBhbmVsUmVmLmN1cnJlbnQgJiYgcGFuZWxSZWYuY3VycmVudC5vbkNsb3NlKSB7XG4gICAgICAgICAgcGFuZWxSZWYuY3VycmVudC5vbkNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZhbHVlICYmICFpbml0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHNldElubmVyVmlld0RhdGUodmFsdWUpO1xuICAgIH1cbiAgfSwgW3ZhbHVlXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaW5pdFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gIH0sIFtdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQYW5lbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBwYW5lbE5vZGU7XG4gIHZhciBwaWNrZXJQcm9wcyA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHByb3BzKSwge30sIHtcbiAgICBvcGVyYXRpb25SZWY6IHBhbmVsUmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHZpZXdEYXRlOiB2aWV3RGF0ZSxcbiAgICB2YWx1ZTogbWVyZ2VkVmFsdWUsXG4gICAgb25WaWV3RGF0ZUNoYW5nZTogc2V0Vmlld0RhdGUsXG4gICAgc291cmNlTW9kZTogc291cmNlTW9kZSxcbiAgICBvblBhbmVsQ2hhbmdlOiBvbkludGVybmFsUGFuZWxDaGFuZ2UsXG4gICAgZGlzYWJsZWREYXRlOiBtZXJnZWRNb2RlICE9PSAnZGVjYWRlJyA/IGRpc2FibGVkRGF0ZSA6IHVuZGVmaW5lZFxuICB9KTtcbiAgZGVsZXRlIHBpY2tlclByb3BzLm9uQ2hhbmdlO1xuICBkZWxldGUgcGlja2VyUHJvcHMub25TZWxlY3Q7XG5cbiAgc3dpdGNoIChtZXJnZWRNb2RlKSB7XG4gICAgY2FzZSAnZGVjYWRlJzpcbiAgICAgIHBhbmVsTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0RlY2FkZVBhbmVsLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHBpY2tlclByb3BzLCB7XG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChkYXRlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIHBhbmVsTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1llYXJQYW5lbC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwaWNrZXJQcm9wcywge1xuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgIHNldFZpZXdEYXRlKGRhdGUpO1xuICAgICAgICAgIHRyaWdnZXJTZWxlY3QoZGF0ZSwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcGFuZWxOb2RlID0gUmVhY3QuY3JlYXRlRWxlbWVudChfTW9udGhQYW5lbC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwaWNrZXJQcm9wcywge1xuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgIHNldFZpZXdEYXRlKGRhdGUpO1xuICAgICAgICAgIHRyaWdnZXJTZWxlY3QoZGF0ZSwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICBwYW5lbE5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9RdWFydGVyUGFuZWwuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcGlja2VyUHJvcHMsIHtcbiAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUsIHR5cGUpIHtcbiAgICAgICAgICBzZXRWaWV3RGF0ZShkYXRlKTtcbiAgICAgICAgICB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgcGFuZWxOb2RlID0gUmVhY3QuY3JlYXRlRWxlbWVudChfV2Vla1BhbmVsLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHBpY2tlclByb3BzLCB7XG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChkYXRlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0aW1lJzpcbiAgICAgIGRlbGV0ZSBwaWNrZXJQcm9wcy5zaG93VGltZTtcbiAgICAgIHBhbmVsTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1RpbWVQYW5lbC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwaWNrZXJQcm9wcywgKDAsIF90eXBlb2YyLmRlZmF1bHQpKHNob3dUaW1lKSA9PT0gJ29iamVjdCcgPyBzaG93VGltZSA6IG51bGwsIHtcbiAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUsIHR5cGUpIHtcbiAgICAgICAgICBzZXRWaWV3RGF0ZShkYXRlKTtcbiAgICAgICAgICB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoc2hvd1RpbWUpIHtcbiAgICAgICAgcGFuZWxOb2RlID0gUmVhY3QuY3JlYXRlRWxlbWVudChfRGF0ZXRpbWVQYW5lbC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwaWNrZXJQcm9wcywge1xuICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgICAgICAgICBzZXRWaWV3RGF0ZShkYXRlKTtcbiAgICAgICAgICAgIHRyaWdnZXJTZWxlY3QoZGF0ZSwgdHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYW5lbE5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9EYXRlUGFuZWwuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcGlja2VyUHJvcHMsIHtcbiAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGb290ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIGV4dHJhRm9vdGVyO1xuICB2YXIgcmFuZ2VzTm9kZTtcblxuICB2YXIgb25Ob3cgPSBmdW5jdGlvbiBvbk5vdygpIHtcbiAgICB2YXIgbm93ID0gZ2VuZXJhdGVDb25maWcuZ2V0Tm93KCk7XG4gICAgdmFyIGxvd2VyQm91bmRUaW1lID0gKDAsIF90aW1lVXRpbC5nZXRMb3dlckJvdW5kVGltZSkoZ2VuZXJhdGVDb25maWcuZ2V0SG91cihub3cpLCBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUobm93KSwgZ2VuZXJhdGVDb25maWcuZ2V0U2Vjb25kKG5vdyksIGlzSG91clN0ZXBWYWxpZCA/IGhvdXJTdGVwIDogMSwgaXNNaW51dGVTdGVwVmFsaWQgPyBtaW51dGVTdGVwIDogMSwgaXNTZWNvbmRTdGVwVmFsaWQgPyBzZWNvbmRTdGVwIDogMSk7XG4gICAgdmFyIGFkanVzdGVkTm93ID0gKDAsIF90aW1lVXRpbC5zZXRUaW1lKShnZW5lcmF0ZUNvbmZpZywgbm93LCBsb3dlckJvdW5kVGltZVswXSwgLy8gaG91clxuICAgIGxvd2VyQm91bmRUaW1lWzFdLCAvLyBtaW51dGVcbiAgICBsb3dlckJvdW5kVGltZVsyXSk7XG4gICAgdHJpZ2dlclNlbGVjdChhZGp1c3RlZE5vdywgJ3N1Ym1pdCcpO1xuICB9O1xuXG4gIGlmICghaGlkZVJhbmdlcykge1xuICAgIGV4dHJhRm9vdGVyID0gKDAsIF9nZXRFeHRyYUZvb3Rlci5kZWZhdWx0KShwcmVmaXhDbHMsIG1lcmdlZE1vZGUsIHJlbmRlckV4dHJhRm9vdGVyKTtcbiAgICByYW5nZXNOb2RlID0gKDAsIF9nZXRSYW5nZXMuZGVmYXVsdCkoe1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBjb21wb25lbnRzOiBjb21wb25lbnRzLFxuICAgICAgbmVlZENvbmZpcm1CdXR0b246IG5lZWRDb25maXJtQnV0dG9uLFxuICAgICAgb2tEaXNhYmxlZDogIW1lcmdlZFZhbHVlIHx8IGRpc2FibGVkRGF0ZSAmJiBkaXNhYmxlZERhdGUobWVyZ2VkVmFsdWUpLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBzaG93Tm93OiBzaG93Tm93LFxuICAgICAgb25Ob3c6IG5lZWRDb25maXJtQnV0dG9uICYmIG9uTm93LFxuICAgICAgb25PazogZnVuY3Rpb24gb25PaygpIHtcbiAgICAgICAgaWYgKG1lcmdlZFZhbHVlKSB7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChtZXJnZWRWYWx1ZSwgJ3N1Ym1pdCcsIHRydWUpO1xuXG4gICAgICAgICAgaWYgKF9vbk9rKSB7XG4gICAgICAgICAgICBfb25PayhtZXJnZWRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgdG9kYXlOb2RlO1xuXG4gIGlmIChzaG93VG9kYXkgJiYgbWVyZ2VkTW9kZSA9PT0gJ2RhdGUnICYmIHBpY2tlciA9PT0gJ2RhdGUnICYmICFzaG93VGltZSkge1xuICAgIHZhciBub3cgPSBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKTtcbiAgICB2YXIgdG9kYXlDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRvZGF5LWJ0blwiKTtcbiAgICB2YXIgZGlzYWJsZWQgPSBkaXNhYmxlZERhdGUgJiYgZGlzYWJsZWREYXRlKG5vdyk7XG4gICAgdG9kYXlOb2RlID0gUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkodG9kYXlDbHMsIGRpc2FibGVkICYmIFwiXCIuY29uY2F0KHRvZGF5Q2xzLCBcIi1kaXNhYmxlZFwiKSksXG4gICAgICBcImFyaWEtZGlzYWJsZWRcIjogZGlzYWJsZWQsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChub3csICdtb3VzZScsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgbG9jYWxlLnRvZGF5KTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9QYW5lbENvbnRleHQuZGVmYXVsdC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwYW5lbENvbnRleHQpLCB7fSwge1xuICAgICAgaGlkZUhlYWRlcjogJ2hpZGVIZWFkZXInIGluIHByb3BzID8gaGlkZUhlYWRlciA6IHBhbmVsQ29udGV4dC5oaWRlSGVhZGVyLFxuICAgICAgaGlkZVByZXZCdG46IGluUmFuZ2UgJiYgcGFuZWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyxcbiAgICAgIGhpZGVOZXh0QnRuOiBpblJhbmdlICYmIHBhbmVsUG9zaXRpb24gPT09ICdsZWZ0J1xuICAgIH0pXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsXCIpLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYW5lbC1oYXMtcmFuZ2VcIiksIHJhbmdlZFZhbHVlICYmIHJhbmdlZFZhbHVlWzBdICYmIHJhbmdlZFZhbHVlWzFdKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWwtaGFzLXJhbmdlLWhvdmVyXCIpLCBob3ZlclJhbmdlZFZhbHVlICYmIGhvdmVyUmFuZ2VkVmFsdWVbMF0gJiYgaG92ZXJSYW5nZWRWYWx1ZVsxXSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd24sXG4gICAgb25CbHVyOiBvbkludGVybmFsQmx1cixcbiAgICBvbk1vdXNlRG93bjogb25Nb3VzZURvd24sXG4gICAgcmVmOiBwYW5lbERpdlJlZlxuICB9LCBwYW5lbE5vZGUsIGV4dHJhRm9vdGVyIHx8IHJhbmdlc05vZGUgfHwgdG9kYXlOb2RlID8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvb3RlclwiKVxuICB9LCBleHRyYUZvb3RlciwgcmFuZ2VzTm9kZSwgdG9kYXlOb2RlKSA6IG51bGwpKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gUGlja2VyUGFuZWw7XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcmNUcmlnZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdHJpZ2dlclwiKSk7XG5cbnZhciBCVUlMVF9JTl9QTEFDRU1FTlRTID0ge1xuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIGFkanVzdFg6IDEsXG4gICAgICBhZGp1c3RZOiAxXG4gICAgfVxuICB9LFxuICBib3R0b21SaWdodDoge1xuICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIG92ZXJmbG93OiB7XG4gICAgICBhZGp1c3RYOiAxLFxuICAgICAgYWRqdXN0WTogMVxuICAgIH1cbiAgfSxcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICBvdmVyZmxvdzoge1xuICAgICAgYWRqdXN0WDogMCxcbiAgICAgIGFkanVzdFk6IDFcbiAgICB9XG4gIH0sXG4gIHRvcFJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ3RyJ10sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIG92ZXJmbG93OiB7XG4gICAgICBhZGp1c3RYOiAwLFxuICAgICAgYWRqdXN0WTogMVxuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gUGlja2VyVHJpZ2dlcihfcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcblxuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICBwb3B1cEVsZW1lbnQgPSBfcmVmLnBvcHVwRWxlbWVudCxcbiAgICAgIHBvcHVwU3R5bGUgPSBfcmVmLnBvcHVwU3R5bGUsXG4gICAgICB2aXNpYmxlID0gX3JlZi52aXNpYmxlLFxuICAgICAgZHJvcGRvd25DbGFzc05hbWUgPSBfcmVmLmRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgICAgZHJvcGRvd25BbGlnbiA9IF9yZWYuZHJvcGRvd25BbGlnbixcbiAgICAgIHRyYW5zaXRpb25OYW1lID0gX3JlZi50cmFuc2l0aW9uTmFtZSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyID0gX3JlZi5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIHJhbmdlID0gX3JlZi5yYW5nZSxcbiAgICAgIHBvcHVwUGxhY2VtZW50ID0gX3JlZi5wb3B1cFBsYWNlbWVudCxcbiAgICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uO1xuICB2YXIgZHJvcGRvd25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyb3Bkb3duXCIpO1xuXG4gIHZhciBnZXRQb3B1cFBsYWNlbWVudCA9IGZ1bmN0aW9uIGdldFBvcHVwUGxhY2VtZW50KCkge1xuICAgIGlmIChwb3B1cFBsYWNlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcG9wdXBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnYm90dG9tUmlnaHQnIDogJ2JvdHRvbUxlZnQnO1xuICB9O1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY1RyaWdnZXIuZGVmYXVsdCwge1xuICAgIHNob3dBY3Rpb246IFtdLFxuICAgIGhpZGVBY3Rpb246IFtdLFxuICAgIHBvcHVwUGxhY2VtZW50OiBnZXRQb3B1cFBsYWNlbWVudCgpLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBCVUlMVF9JTl9QTEFDRU1FTlRTLFxuICAgIHByZWZpeENsczogZHJvcGRvd25QcmVmaXhDbHMsXG4gICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgcG9wdXA6IHBvcHVwRWxlbWVudCxcbiAgICBwb3B1cEFsaWduOiBkcm9wZG93bkFsaWduLFxuICAgIHBvcHVwVmlzaWJsZTogdmlzaWJsZSxcbiAgICBwb3B1cENsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGRyb3Bkb3duQ2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGRyb3Bkb3duUHJlZml4Q2xzLCBcIi1yYW5nZVwiKSwgcmFuZ2UpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSksXG4gICAgcG9wdXBTdHlsZTogcG9wdXBTdHlsZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJcbiAgfSwgY2hpbGRyZW4pO1xufVxuXG52YXIgX2RlZmF1bHQgPSBQaWNrZXJUcmlnZ2VyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBSYW5nZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbnZhciBfZGVmYXVsdCA9IFJhbmdlQ29udGV4dDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuXG52YXIgX3VzZU1lcmdlZFN0YXRlMTEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9ob29rcy91c2VNZXJnZWRTdGF0ZVwiKSk7XG5cbnZhciBfUGlja2VyVHJpZ2dlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGlja2VyVHJpZ2dlclwiKSk7XG5cbnZhciBfUGlja2VyUGFuZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BpY2tlclBhbmVsXCIpKTtcblxudmFyIF91c2VQaWNrZXJJbnB1dDUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZVBpY2tlcklucHV0XCIpKTtcblxudmFyIF9taXNjVXRpbCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL3V0aWxzL21pc2NVdGlsXCIpKTtcblxudmFyIF91aVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy91aVV0aWxcIik7XG5cbnZhciBfUGFuZWxDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYW5lbENvbnRleHRcIikpO1xuXG52YXIgX2RhdGVVdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvZGF0ZVV0aWxcIik7XG5cbnZhciBfdXNlVmFsdWVUZXh0czUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZVZhbHVlVGV4dHNcIikpO1xuXG52YXIgX3VzZVRleHRWYWx1ZU1hcHBpbmc1ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VUZXh0VmFsdWVNYXBwaW5nXCIpKTtcblxudmFyIF9SYW5nZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1JhbmdlQ29udGV4dFwiKSk7XG5cbnZhciBfdXNlUmFuZ2VEaXNhYmxlZDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZVJhbmdlRGlzYWJsZWRcIikpO1xuXG52YXIgX2dldEV4dHJhRm9vdGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dGlscy9nZXRFeHRyYUZvb3RlclwiKSk7XG5cbnZhciBfZ2V0UmFuZ2VzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dGlscy9nZXRSYW5nZXNcIikpO1xuXG52YXIgX3VzZVJhbmdlVmlld0RhdGVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlUmFuZ2VWaWV3RGF0ZXNcIikpO1xuXG52YXIgX3VzZUhvdmVyVmFsdWU1ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VIb3ZlclZhbHVlXCIpKTtcblxuZnVuY3Rpb24gcmVvcmRlclZhbHVlcyh2YWx1ZXMsIGdlbmVyYXRlQ29uZmlnKSB7XG4gIGlmICh2YWx1ZXMgJiYgdmFsdWVzWzBdICYmIHZhbHVlc1sxXSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKHZhbHVlc1swXSwgdmFsdWVzWzFdKSkge1xuICAgIHJldHVybiBbdmFsdWVzWzFdLCB2YWx1ZXNbMF1dO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gY2FuVmFsdWVUcmlnZ2VyKHZhbHVlLCBpbmRleCwgZGlzYWJsZWQsIGFsbG93RW1wdHkpIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYWxsb3dFbXB0eSAmJiBhbGxvd0VtcHR5W2luZGV4XSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRpc2FibGVkWyhpbmRleCArIDEpICUgMl0pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gSW5uZXJSYW5nZVBpY2tlcihwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXMyLCBfY2xhc3NOYW1lczMsIF9jbGFzc05hbWVzNDtcblxuICB2YXIgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1waWNrZXInIDogX3Byb3BzJHByZWZpeENscyxcbiAgICAgIGlkID0gcHJvcHMuaWQsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgcG9wdXBTdHlsZSA9IHByb3BzLnBvcHVwU3R5bGUsXG4gICAgICBkcm9wZG93bkNsYXNzTmFtZSA9IHByb3BzLmRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICAgIGRyb3Bkb3duQWxpZ24gPSBwcm9wcy5kcm9wZG93bkFsaWduLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIGZvcm1hdCA9IHByb3BzLmZvcm1hdCxcbiAgICAgIF9wcm9wcyRwaWNrZXIgPSBwcm9wcy5waWNrZXIsXG4gICAgICBwaWNrZXIgPSBfcHJvcHMkcGlja2VyID09PSB2b2lkIDAgPyAnZGF0ZScgOiBfcHJvcHMkcGlja2VyLFxuICAgICAgc2hvd1RpbWUgPSBwcm9wcy5zaG93VGltZSxcbiAgICAgIHVzZTEySG91cnMgPSBwcm9wcy51c2UxMkhvdXJzLFxuICAgICAgX3Byb3BzJHNlcGFyYXRvciA9IHByb3BzLnNlcGFyYXRvcixcbiAgICAgIHNlcGFyYXRvciA9IF9wcm9wcyRzZXBhcmF0b3IgPT09IHZvaWQgMCA/ICd+JyA6IF9wcm9wcyRzZXBhcmF0b3IsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgZGVmYXVsdFBpY2tlclZhbHVlID0gcHJvcHMuZGVmYXVsdFBpY2tlclZhbHVlLFxuICAgICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgICBkZWZhdWx0T3BlbiA9IHByb3BzLmRlZmF1bHRPcGVuLFxuICAgICAgZGlzYWJsZWREYXRlID0gcHJvcHMuZGlzYWJsZWREYXRlLFxuICAgICAgX2Rpc2FibGVkVGltZSA9IHByb3BzLmRpc2FibGVkVGltZSxcbiAgICAgIGRhdGVSZW5kZXIgPSBwcm9wcy5kYXRlUmVuZGVyLFxuICAgICAgcGFuZWxSZW5kZXIgPSBwcm9wcy5wYW5lbFJlbmRlcixcbiAgICAgIHJhbmdlcyA9IHByb3BzLnJhbmdlcyxcbiAgICAgIGFsbG93RW1wdHkgPSBwcm9wcy5hbGxvd0VtcHR5LFxuICAgICAgYWxsb3dDbGVhciA9IHByb3BzLmFsbG93Q2xlYXIsXG4gICAgICBzdWZmaXhJY29uID0gcHJvcHMuc3VmZml4SWNvbixcbiAgICAgIGNsZWFySWNvbiA9IHByb3BzLmNsZWFySWNvbixcbiAgICAgIHBpY2tlclJlZiA9IHByb3BzLnBpY2tlclJlZixcbiAgICAgIGlucHV0UmVhZE9ubHkgPSBwcm9wcy5pbnB1dFJlYWRPbmx5LFxuICAgICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgICByZW5kZXJFeHRyYUZvb3RlciA9IHByb3BzLnJlbmRlckV4dHJhRm9vdGVyLFxuICAgICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICAgIG9uT3BlbkNoYW5nZSA9IHByb3BzLm9uT3BlbkNoYW5nZSxcbiAgICAgIG9uUGFuZWxDaGFuZ2UgPSBwcm9wcy5vblBhbmVsQ2hhbmdlLFxuICAgICAgb25DYWxlbmRhckNoYW5nZSA9IHByb3BzLm9uQ2FsZW5kYXJDaGFuZ2UsXG4gICAgICBfb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgICBfb25PayA9IHByb3BzLm9uT2ssXG4gICAgICBjb21wb25lbnRzID0gcHJvcHMuY29tcG9uZW50cyxcbiAgICAgIG9yZGVyID0gcHJvcHMub3JkZXIsXG4gICAgICBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgICBhY3RpdmVQaWNrZXJJbmRleCA9IHByb3BzLmFjdGl2ZVBpY2tlckluZGV4LFxuICAgICAgX3Byb3BzJGF1dG9Db21wbGV0ZSA9IHByb3BzLmF1dG9Db21wbGV0ZSxcbiAgICAgIGF1dG9Db21wbGV0ZSA9IF9wcm9wcyRhdXRvQ29tcGxldGUgPT09IHZvaWQgMCA/ICdvZmYnIDogX3Byb3BzJGF1dG9Db21wbGV0ZTtcbiAgdmFyIG5lZWRDb25maXJtQnV0dG9uID0gcGlja2VyID09PSAnZGF0ZScgJiYgISFzaG93VGltZSB8fCBwaWNrZXIgPT09ICd0aW1lJzsgLy8gV2UgcmVjb3JkIG9wZW5lZCBzdGF0dXMgaGVyZSBpbiBjYXNlIHJlcGVhdCBvcGVuIHdpdGggcGlja2VyXG5cbiAgdmFyIG9wZW5SZWNvcmRzUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoe30pO1xuICB2YXIgY29udGFpbmVyUmVmID0gKDAsIFJlYWN0LnVzZVJlZikobnVsbCk7XG4gIHZhciBwYW5lbERpdlJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKG51bGwpO1xuICB2YXIgc3RhcnRJbnB1dERpdlJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKG51bGwpO1xuICB2YXIgZW5kSW5wdXREaXZSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShudWxsKTtcbiAgdmFyIHNlcGFyYXRvclJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKG51bGwpO1xuICB2YXIgc3RhcnRJbnB1dFJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKG51bGwpO1xuICB2YXIgZW5kSW5wdXRSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShudWxsKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTWlzYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgZm9ybWF0TGlzdCA9ICgwLCBfbWlzY1V0aWwudG9BcnJheSkoKDAsIF91aVV0aWwuZ2V0RGVmYXVsdEZvcm1hdCkoZm9ybWF0LCBwaWNrZXIsIHNob3dUaW1lLCB1c2UxMkhvdXJzKSk7IC8vIEFjdGl2ZSBwaWNrZXJcblxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gKDAsIF91c2VNZXJnZWRTdGF0ZTExLmRlZmF1bHQpKDAsIHtcbiAgICB2YWx1ZTogYWN0aXZlUGlja2VySW5kZXhcbiAgfSksXG4gICAgICBfdXNlTWVyZ2VkU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgICAgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgICAgc2V0TWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPSBfdXNlTWVyZ2VkU3RhdGUyWzFdOyAvLyBPcGVyYXRpb24gcmVmXG5cblxuICB2YXIgb3BlcmF0aW9uUmVmID0gKDAsIFJlYWN0LnVzZVJlZikobnVsbCk7XG4gIHZhciBtZXJnZWREaXNhYmxlZCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRpc2FibGVkKSkge1xuICAgICAgcmV0dXJuIGRpc2FibGVkO1xuICAgIH1cblxuICAgIHJldHVybiBbZGlzYWJsZWQgfHwgZmFsc2UsIGRpc2FibGVkIHx8IGZhbHNlXTtcbiAgfSwgW2Rpc2FibGVkXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTMgPSAoMCwgX3VzZU1lcmdlZFN0YXRlMTEuZGVmYXVsdCkobnVsbCwge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZSh2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBwaWNrZXIgPT09ICd0aW1lJyAmJiAhb3JkZXIgPyB2YWx1ZXMgOiByZW9yZGVyVmFsdWVzKHZhbHVlcywgZ2VuZXJhdGVDb25maWcpO1xuICAgIH1cbiAgfSksXG4gICAgICBfdXNlTWVyZ2VkU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlTWVyZ2VkU3RhdGUzLCAyKSxcbiAgICAgIG1lcmdlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNFswXSxcbiAgICAgIHNldElubmVyVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU0WzFdOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmlldyBEYXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb25maWcgdmlldyBwYW5lbFxuXG5cbiAgdmFyIF91c2VSYW5nZVZpZXdEYXRlcyA9ICgwLCBfdXNlUmFuZ2VWaWV3RGF0ZXMzLmRlZmF1bHQpKHtcbiAgICB2YWx1ZXM6IG1lcmdlZFZhbHVlLFxuICAgIHBpY2tlcjogcGlja2VyLFxuICAgIGRlZmF1bHREYXRlczogZGVmYXVsdFBpY2tlclZhbHVlLFxuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICB9KSxcbiAgICAgIF91c2VSYW5nZVZpZXdEYXRlczIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VSYW5nZVZpZXdEYXRlcywgMiksXG4gICAgICBnZXRWaWV3RGF0ZSA9IF91c2VSYW5nZVZpZXdEYXRlczJbMF0sXG4gICAgICBzZXRWaWV3RGF0ZSA9IF91c2VSYW5nZVZpZXdEYXRlczJbMV07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgX3VzZU1lcmdlZFN0YXRlNSA9ICgwLCBfdXNlTWVyZ2VkU3RhdGUxMS5kZWZhdWx0KShtZXJnZWRWYWx1ZSwge1xuICAgIHBvc3RTdGF0ZTogZnVuY3Rpb24gcG9zdFN0YXRlKHZhbHVlcykge1xuICAgICAgdmFyIHBvc3RWYWx1ZXMgPSB2YWx1ZXM7XG5cbiAgICAgIGlmIChtZXJnZWREaXNhYmxlZFswXSAmJiBtZXJnZWREaXNhYmxlZFsxXSkge1xuICAgICAgICByZXR1cm4gcG9zdFZhbHVlcztcbiAgICAgIH0gLy8gRmlsbCBkaXNhYmxlZCB1bml0XG5cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKG1lcmdlZERpc2FibGVkW2ldICYmICEoMCwgX21pc2NVdGlsLmdldFZhbHVlKShwb3N0VmFsdWVzLCBpKSAmJiAhKDAsIF9taXNjVXRpbC5nZXRWYWx1ZSkoYWxsb3dFbXB0eSwgaSkpIHtcbiAgICAgICAgICBwb3N0VmFsdWVzID0gKDAsIF9taXNjVXRpbC51cGRhdGVWYWx1ZXMpKHBvc3RWYWx1ZXMsIGdlbmVyYXRlQ29uZmlnLmdldE5vdygpLCBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcG9zdFZhbHVlcztcbiAgICB9XG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlNiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZU1lcmdlZFN0YXRlNSwgMiksXG4gICAgICBzZWxlY3RlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNlswXSxcbiAgICAgIHNldFNlbGVjdGVkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU2WzFdOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNb2RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTcgPSAoMCwgX3VzZU1lcmdlZFN0YXRlMTEuZGVmYXVsdCkoW3BpY2tlciwgcGlja2VyXSwge1xuICAgIHZhbHVlOiBtb2RlXG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlOCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZU1lcmdlZFN0YXRlNywgMiksXG4gICAgICBtZXJnZWRNb2RlcyA9IF91c2VNZXJnZWRTdGF0ZThbMF0sXG4gICAgICBzZXRJbm5lck1vZGVzID0gX3VzZU1lcmdlZFN0YXRlOFsxXTtcblxuICAoMCwgUmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW5uZXJNb2RlcyhbcGlja2VyLCBwaWNrZXJdKTtcbiAgfSwgW3BpY2tlcl0pO1xuXG4gIHZhciB0cmlnZ2VyTW9kZXNDaGFuZ2UgPSBmdW5jdGlvbiB0cmlnZ2VyTW9kZXNDaGFuZ2UobW9kZXMsIHZhbHVlcykge1xuICAgIHNldElubmVyTW9kZXMobW9kZXMpO1xuXG4gICAgaWYgKG9uUGFuZWxDaGFuZ2UpIHtcbiAgICAgIG9uUGFuZWxDaGFuZ2UodmFsdWVzLCBtb2Rlcyk7XG4gICAgfVxuICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IERpc2FibGUgRGF0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIF91c2VSYW5nZURpc2FibGVkID0gKDAsIF91c2VSYW5nZURpc2FibGVkMy5kZWZhdWx0KSh7XG4gICAgcGlja2VyOiBwaWNrZXIsXG4gICAgc2VsZWN0ZWRWYWx1ZTogc2VsZWN0ZWRWYWx1ZSxcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgZGlzYWJsZWREYXRlOiBkaXNhYmxlZERhdGUsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gIH0sIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnRbMV0sIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnRbMF0pLFxuICAgICAgX3VzZVJhbmdlRGlzYWJsZWQyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlUmFuZ2VEaXNhYmxlZCwgMiksXG4gICAgICBkaXNhYmxlZFN0YXJ0RGF0ZSA9IF91c2VSYW5nZURpc2FibGVkMlswXSxcbiAgICAgIGRpc2FibGVkRW5kRGF0ZSA9IF91c2VSYW5nZURpc2FibGVkMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfdXNlTWVyZ2VkU3RhdGU5ID0gKDAsIF91c2VNZXJnZWRTdGF0ZTExLmRlZmF1bHQpKGZhbHNlLCB7XG4gICAgdmFsdWU6IG9wZW4sXG4gICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0T3BlbixcbiAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZShwb3N0T3Blbikge1xuICAgICAgcmV0dXJuIG1lcmdlZERpc2FibGVkW21lcmdlZEFjdGl2ZVBpY2tlckluZGV4XSA/IGZhbHNlIDogcG9zdE9wZW47XG4gICAgfSxcbiAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UobmV3T3Blbikge1xuICAgICAgaWYgKG9uT3BlbkNoYW5nZSkge1xuICAgICAgICBvbk9wZW5DaGFuZ2UobmV3T3Blbik7XG4gICAgICB9XG5cbiAgICAgIGlmICghbmV3T3BlbiAmJiBvcGVyYXRpb25SZWYuY3VycmVudCAmJiBvcGVyYXRpb25SZWYuY3VycmVudC5vbkNsb3NlKSB7XG4gICAgICAgIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlMTAgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VNZXJnZWRTdGF0ZTksIDIpLFxuICAgICAgbWVyZ2VkT3BlbiA9IF91c2VNZXJnZWRTdGF0ZTEwWzBdLFxuICAgICAgdHJpZ2dlcklubmVyT3BlbiA9IF91c2VNZXJnZWRTdGF0ZTEwWzFdO1xuXG4gIHZhciBzdGFydE9wZW4gPSBtZXJnZWRPcGVuICYmIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwO1xuICB2YXIgZW5kT3BlbiA9IG1lcmdlZE9wZW4gJiYgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDE7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBvcHVwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBvcHVwIG1pbiB3aWR0aFxuXG4gIHZhciBfdXNlU3RhdGUgPSAoMCwgUmVhY3QudXNlU3RhdGUpKDApLFxuICAgICAgX3VzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIHBvcHVwTWluV2lkdGggPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0UG9wdXBNaW5XaWR0aCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgKDAsIFJlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIGlmICghbWVyZ2VkT3BlbiAmJiBjb250YWluZXJSZWYuY3VycmVudCkge1xuICAgICAgc2V0UG9wdXBNaW5XaWR0aChjb250YWluZXJSZWYuY3VycmVudC5vZmZzZXRXaWR0aCk7XG4gICAgfVxuICB9LCBbbWVyZ2VkT3Blbl0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRyaWdnZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciB0cmlnZ2VyUmVmID0gUmVhY3QudXNlUmVmKCk7XG5cbiAgZnVuY3Rpb24gX3RyaWdnZXJPcGVuKG5ld09wZW4sIGluZGV4KSB7XG4gICAgaWYgKG5ld09wZW4pIHtcbiAgICAgIGNsZWFyVGltZW91dCh0cmlnZ2VyUmVmLmN1cnJlbnQpO1xuICAgICAgb3BlblJlY29yZHNSZWYuY3VycmVudFtpbmRleF0gPSB0cnVlO1xuICAgICAgc2V0TWVyZ2VkQWN0aXZlUGlja2VySW5kZXgoaW5kZXgpO1xuICAgICAgdHJpZ2dlcklubmVyT3BlbihuZXdPcGVuKTsgLy8gT3BlbiB0byByZXNldCB2aWV3IGRhdGVcblxuICAgICAgaWYgKCFtZXJnZWRPcGVuKSB7XG4gICAgICAgIHNldFZpZXdEYXRlKG51bGwsIGluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSBpbmRleCkge1xuICAgICAgdHJpZ2dlcklubmVyT3BlbihuZXdPcGVuKTsgLy8gQ2xlYW4gdXAgYXN5bmNcbiAgICAgIC8vIFRoaXMgbWFrZXMgcmVmIG5vdCBxdWljayByZWZyZXNoIGluIGNhc2UgdXNlciBvcGVuIGFub3RoZXIgaW5wdXQgd2l0aCBibHVyIHRyaWdnZXJcblxuICAgICAgdmFyIG9wZW5SZWNvcmRzID0gb3BlblJlY29yZHNSZWYuY3VycmVudDtcbiAgICAgIHRyaWdnZXJSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAob3BlblJlY29yZHMgPT09IG9wZW5SZWNvcmRzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvcGVuUmVjb3Jkc1JlZi5jdXJyZW50ID0ge307XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaWdnZXJPcGVuQW5kRm9jdXMoaW5kZXgpIHtcbiAgICBfdHJpZ2dlck9wZW4odHJ1ZSwgaW5kZXgpOyAvLyBVc2Ugc2V0VGltZW91dCB0byBtYWtlIHN1cmUgcGFuZWwgRE9NIGV4aXN0c1xuXG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbnB1dFJlZiA9IFtzdGFydElucHV0UmVmLCBlbmRJbnB1dFJlZl1baW5kZXhdO1xuXG4gICAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlKG5ld1ZhbHVlLCBzb3VyY2VJbmRleCkge1xuICAgIHZhciB2YWx1ZXMgPSBuZXdWYWx1ZTtcbiAgICB2YXIgc3RhcnRWYWx1ZSA9ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHZhbHVlcywgMCk7XG4gICAgdmFyIGVuZFZhbHVlID0gKDAsIF9taXNjVXRpbC5nZXRWYWx1ZSkodmFsdWVzLCAxKTsgLy8gPj4+Pj4gRm9ybWF0IHN0YXJ0ICYgZW5kIHZhbHVlc1xuXG4gICAgaWYgKHN0YXJ0VmFsdWUgJiYgZW5kVmFsdWUgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihzdGFydFZhbHVlLCBlbmRWYWx1ZSkpIHtcbiAgICAgIGlmICggLy8gV2Vla1BpY2tlciBvbmx5IGNvbXBhcmUgd2Vla1xuICAgICAgcGlja2VyID09PSAnd2VlaycgJiYgISgwLCBfZGF0ZVV0aWwuaXNTYW1lV2VlaykoZ2VuZXJhdGVDb25maWcsIGxvY2FsZS5sb2NhbGUsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlKSB8fCAvLyBRdW90YVBpY2tlciBvbmx5IGNvbXBhcmUgd2Vla1xuICAgICAgcGlja2VyID09PSAncXVhcnRlcicgJiYgISgwLCBfZGF0ZVV0aWwuaXNTYW1lUXVhcnRlcikoZ2VuZXJhdGVDb25maWcsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlKSB8fCAvLyBPdGhlciBub24tVGltZVBpY2tlciBjb21wYXJlIGRhdGVcbiAgICAgIHBpY2tlciAhPT0gJ3dlZWsnICYmIHBpY2tlciAhPT0gJ3F1YXJ0ZXInICYmIHBpY2tlciAhPT0gJ3RpbWUnICYmICEoMCwgX2RhdGVVdGlsLmlzU2FtZURhdGUpKGdlbmVyYXRlQ29uZmlnLCBzdGFydFZhbHVlLCBlbmRWYWx1ZSkpIHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZW5kIGRhdGUgd2hlbiBzdGFydCBkYXRlIGlzIGFmdGVyIGVuZCBkYXRlXG4gICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCkge1xuICAgICAgICAgIHZhbHVlcyA9IFtzdGFydFZhbHVlLCBudWxsXTtcbiAgICAgICAgICBlbmRWYWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhcnRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgdmFsdWVzID0gW251bGwsIGVuZFZhbHVlXTtcbiAgICAgICAgfSAvLyBDbGVhbiB1cCBjYWNoZSBzaW5jZSBpbnZhbGlkYXRlXG5cblxuICAgICAgICBvcGVuUmVjb3Jkc1JlZi5jdXJyZW50ID0gKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIHNvdXJjZUluZGV4LCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAocGlja2VyICE9PSAndGltZScgfHwgb3JkZXIgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vIFJlb3JkZXIgd2hlbiBpbiBzYW1lIGRhdGVcbiAgICAgICAgdmFsdWVzID0gcmVvcmRlclZhbHVlcyh2YWx1ZXMsIGdlbmVyYXRlQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTZWxlY3RlZFZhbHVlKHZhbHVlcyk7XG4gICAgdmFyIHN0YXJ0U3RyID0gdmFsdWVzICYmIHZhbHVlc1swXSA/IGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5mb3JtYXQobG9jYWxlLmxvY2FsZSwgdmFsdWVzWzBdLCBmb3JtYXRMaXN0WzBdKSA6ICcnO1xuICAgIHZhciBlbmRTdHIgPSB2YWx1ZXMgJiYgdmFsdWVzWzFdID8gZ2VuZXJhdGVDb25maWcubG9jYWxlLmZvcm1hdChsb2NhbGUubG9jYWxlLCB2YWx1ZXNbMV0sIGZvcm1hdExpc3RbMF0pIDogJyc7XG5cbiAgICBpZiAob25DYWxlbmRhckNoYW5nZSkge1xuICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgIHJhbmdlOiBzb3VyY2VJbmRleCA9PT0gMCA/ICdzdGFydCcgOiAnZW5kJ1xuICAgICAgfTtcbiAgICAgIG9uQ2FsZW5kYXJDaGFuZ2UodmFsdWVzLCBbc3RhcnRTdHIsIGVuZFN0cl0sIGluZm8pO1xuICAgIH0gLy8gPj4+Pj4gVHJpZ2dlciBgb25DaGFuZ2VgIGV2ZW50XG5cblxuICAgIHZhciBjYW5TdGFydFZhbHVlVHJpZ2dlciA9IGNhblZhbHVlVHJpZ2dlcihzdGFydFZhbHVlLCAwLCBtZXJnZWREaXNhYmxlZCwgYWxsb3dFbXB0eSk7XG4gICAgdmFyIGNhbkVuZFZhbHVlVHJpZ2dlciA9IGNhblZhbHVlVHJpZ2dlcihlbmRWYWx1ZSwgMSwgbWVyZ2VkRGlzYWJsZWQsIGFsbG93RW1wdHkpO1xuICAgIHZhciBjYW5UcmlnZ2VyID0gdmFsdWVzID09PSBudWxsIHx8IGNhblN0YXJ0VmFsdWVUcmlnZ2VyICYmIGNhbkVuZFZhbHVlVHJpZ2dlcjtcblxuICAgIGlmIChjYW5UcmlnZ2VyKSB7XG4gICAgICAvLyBUcmlnZ2VyIG9uQ2hhbmdlIG9ubHkgd2hlbiB2YWx1ZSBpcyB2YWxpZGF0ZVxuICAgICAgc2V0SW5uZXJWYWx1ZSh2YWx1ZXMpO1xuXG4gICAgICBpZiAob25DaGFuZ2UgJiYgKCEoMCwgX2RhdGVVdGlsLmlzRXF1YWwpKGdlbmVyYXRlQ29uZmlnLCAoMCwgX21pc2NVdGlsLmdldFZhbHVlKShtZXJnZWRWYWx1ZSwgMCksIHN0YXJ0VmFsdWUpIHx8ICEoMCwgX2RhdGVVdGlsLmlzRXF1YWwpKGdlbmVyYXRlQ29uZmlnLCAoMCwgX21pc2NVdGlsLmdldFZhbHVlKShtZXJnZWRWYWx1ZSwgMSksIGVuZFZhbHVlKSkpIHtcbiAgICAgICAgb25DaGFuZ2UodmFsdWVzLCBbc3RhcnRTdHIsIGVuZFN0cl0pO1xuICAgICAgfVxuICAgIH0gLy8gPj4+Pj4gT3BlbiBwaWNrZXIgd2hlblxuICAgIC8vIEFsd2F5cyBvcGVuIGFub3RoZXIgcGlja2VyIGlmIHBvc3NpYmxlXG5cblxuICAgIHZhciBuZXh0T3BlbkluZGV4ID0gbnVsbDtcblxuICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCAmJiAhbWVyZ2VkRGlzYWJsZWRbMV0pIHtcbiAgICAgIG5leHRPcGVuSW5kZXggPSAxO1xuICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPT09IDEgJiYgIW1lcmdlZERpc2FibGVkWzBdKSB7XG4gICAgICBuZXh0T3BlbkluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBpZiAobmV4dE9wZW5JbmRleCAhPT0gbnVsbCAmJiBuZXh0T3BlbkluZGV4ICE9PSBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCAmJiAoIW9wZW5SZWNvcmRzUmVmLmN1cnJlbnRbbmV4dE9wZW5JbmRleF0gfHwgISgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHZhbHVlcywgbmV4dE9wZW5JbmRleCkpICYmICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHZhbHVlcywgc291cmNlSW5kZXgpKSB7XG4gICAgICAvLyBEZWxheSB0byBmb2N1cyB0byBhdm9pZCBpbnB1dCBibHVyIHRyaWdnZXIgZXhwaXJlZCBzZWxlY3RlZFZhbHVlc1xuICAgICAgdHJpZ2dlck9wZW5BbmRGb2N1cyhuZXh0T3BlbkluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RyaWdnZXJPcGVuKGZhbHNlLCBzb3VyY2VJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZvcndhcmRLZXlEb3duID0gZnVuY3Rpb24gZm9yd2FyZEtleURvd24oZSkge1xuICAgIGlmIChtZXJnZWRPcGVuICYmIG9wZXJhdGlvblJlZi5jdXJyZW50ICYmIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bikge1xuICAgICAgLy8gTGV0IHBvcHVwIHBhbmVsIGhhbmRsZSBrZXlib2FyZFxuICAgICAgcmV0dXJuIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bihlKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvbmUtYmxvY2tzICovXG5cblxuICAgIHtcbiAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ1BpY2tlciBub3QgY29ycmVjdCBmb3J3YXJkIEtleURvd24gb3BlcmF0aW9uLiBQbGVhc2UgaGVscCB0byBmaXJlIGlzc3VlIGFib3V0IHRoaXMuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIHNoYXJlZFRleHRIb29rc1Byb3BzID0ge1xuICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZTogbG9jYWxlXG4gIH07XG5cbiAgdmFyIF91c2VWYWx1ZVRleHRzID0gKDAsIF91c2VWYWx1ZVRleHRzNS5kZWZhdWx0KSgoMCwgX21pc2NVdGlsLmdldFZhbHVlKShzZWxlY3RlZFZhbHVlLCAwKSwgc2hhcmVkVGV4dEhvb2tzUHJvcHMpLFxuICAgICAgX3VzZVZhbHVlVGV4dHMyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlVmFsdWVUZXh0cywgMiksXG4gICAgICBzdGFydFZhbHVlVGV4dHMgPSBfdXNlVmFsdWVUZXh0czJbMF0sXG4gICAgICBmaXJzdFN0YXJ0VmFsdWVUZXh0ID0gX3VzZVZhbHVlVGV4dHMyWzFdO1xuXG4gIHZhciBfdXNlVmFsdWVUZXh0czMgPSAoMCwgX3VzZVZhbHVlVGV4dHM1LmRlZmF1bHQpKCgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHNlbGVjdGVkVmFsdWUsIDEpLCBzaGFyZWRUZXh0SG9va3NQcm9wcyksXG4gICAgICBfdXNlVmFsdWVUZXh0czQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VWYWx1ZVRleHRzMywgMiksXG4gICAgICBlbmRWYWx1ZVRleHRzID0gX3VzZVZhbHVlVGV4dHM0WzBdLFxuICAgICAgZmlyc3RFbmRWYWx1ZVRleHQgPSBfdXNlVmFsdWVUZXh0czRbMV07XG5cbiAgdmFyIF9vblRleHRDaGFuZ2UgPSBmdW5jdGlvbiBvblRleHRDaGFuZ2UobmV3VGV4dCwgaW5kZXgpIHtcbiAgICB2YXIgaW5wdXREYXRlID0gZ2VuZXJhdGVDb25maWcubG9jYWxlLnBhcnNlKGxvY2FsZS5sb2NhbGUsIG5ld1RleHQsIGZvcm1hdExpc3QpO1xuICAgIHZhciBkaXNhYmxlZEZ1bmMgPSBpbmRleCA9PT0gMCA/IGRpc2FibGVkU3RhcnREYXRlIDogZGlzYWJsZWRFbmREYXRlO1xuXG4gICAgaWYgKGlucHV0RGF0ZSAmJiAhZGlzYWJsZWRGdW5jKGlucHV0RGF0ZSkpIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWUoKDAsIF9taXNjVXRpbC51cGRhdGVWYWx1ZXMpKHNlbGVjdGVkVmFsdWUsIGlucHV0RGF0ZSwgaW5kZXgpKTtcbiAgICAgIHNldFZpZXdEYXRlKGlucHV0RGF0ZSwgaW5kZXgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgX3VzZVRleHRWYWx1ZU1hcHBpbmcgPSAoMCwgX3VzZVRleHRWYWx1ZU1hcHBpbmc1LmRlZmF1bHQpKHtcbiAgICB2YWx1ZVRleHRzOiBzdGFydFZhbHVlVGV4dHMsXG4gICAgb25UZXh0Q2hhbmdlOiBmdW5jdGlvbiBvblRleHRDaGFuZ2UobmV3VGV4dCkge1xuICAgICAgcmV0dXJuIF9vblRleHRDaGFuZ2UobmV3VGV4dCwgMCk7XG4gICAgfVxuICB9KSxcbiAgICAgIF91c2VUZXh0VmFsdWVNYXBwaW5nMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVRleHRWYWx1ZU1hcHBpbmcsIDMpLFxuICAgICAgc3RhcnRUZXh0ID0gX3VzZVRleHRWYWx1ZU1hcHBpbmcyWzBdLFxuICAgICAgdHJpZ2dlclN0YXJ0VGV4dENoYW5nZSA9IF91c2VUZXh0VmFsdWVNYXBwaW5nMlsxXSxcbiAgICAgIHJlc2V0U3RhcnRUZXh0ID0gX3VzZVRleHRWYWx1ZU1hcHBpbmcyWzJdO1xuXG4gIHZhciBfdXNlVGV4dFZhbHVlTWFwcGluZzMgPSAoMCwgX3VzZVRleHRWYWx1ZU1hcHBpbmc1LmRlZmF1bHQpKHtcbiAgICB2YWx1ZVRleHRzOiBlbmRWYWx1ZVRleHRzLFxuICAgIG9uVGV4dENoYW5nZTogZnVuY3Rpb24gb25UZXh0Q2hhbmdlKG5ld1RleHQpIHtcbiAgICAgIHJldHVybiBfb25UZXh0Q2hhbmdlKG5ld1RleHQsIDEpO1xuICAgIH1cbiAgfSksXG4gICAgICBfdXNlVGV4dFZhbHVlTWFwcGluZzQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VUZXh0VmFsdWVNYXBwaW5nMywgMyksXG4gICAgICBlbmRUZXh0ID0gX3VzZVRleHRWYWx1ZU1hcHBpbmc0WzBdLFxuICAgICAgdHJpZ2dlckVuZFRleHRDaGFuZ2UgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzRbMV0sXG4gICAgICByZXNldEVuZFRleHQgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzRbMl07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSAoMCwgUmVhY3QudXNlU3RhdGUpKG51bGwpLFxuICAgICAgX3VzZVN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlMywgMiksXG4gICAgICByYW5nZUhvdmVyVmFsdWUgPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0UmFuZ2VIb3ZlclZhbHVlID0gX3VzZVN0YXRlNFsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gSG92ZXIgUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfdXNlU3RhdGU1ID0gKDAsIFJlYWN0LnVzZVN0YXRlKShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTYgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTUsIDIpLFxuICAgICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF91c2VTdGF0ZTZbMF0sXG4gICAgICBzZXRIb3ZlclJhbmdlZFZhbHVlID0gX3VzZVN0YXRlNlsxXTtcblxuICB2YXIgX3VzZUhvdmVyVmFsdWUgPSAoMCwgX3VzZUhvdmVyVmFsdWU1LmRlZmF1bHQpKHN0YXJ0VGV4dCwge1xuICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZTogbG9jYWxlXG4gIH0pLFxuICAgICAgX3VzZUhvdmVyVmFsdWUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlSG92ZXJWYWx1ZSwgMyksXG4gICAgICBzdGFydEhvdmVyVmFsdWUgPSBfdXNlSG92ZXJWYWx1ZTJbMF0sXG4gICAgICBvblN0YXJ0RW50ZXIgPSBfdXNlSG92ZXJWYWx1ZTJbMV0sXG4gICAgICBvblN0YXJ0TGVhdmUgPSBfdXNlSG92ZXJWYWx1ZTJbMl07XG5cbiAgdmFyIF91c2VIb3ZlclZhbHVlMyA9ICgwLCBfdXNlSG92ZXJWYWx1ZTUuZGVmYXVsdCkoZW5kVGV4dCwge1xuICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZTogbG9jYWxlXG4gIH0pLFxuICAgICAgX3VzZUhvdmVyVmFsdWU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlSG92ZXJWYWx1ZTMsIDMpLFxuICAgICAgZW5kSG92ZXJWYWx1ZSA9IF91c2VIb3ZlclZhbHVlNFswXSxcbiAgICAgIG9uRW5kRW50ZXIgPSBfdXNlSG92ZXJWYWx1ZTRbMV0sXG4gICAgICBvbkVuZExlYXZlID0gX3VzZUhvdmVyVmFsdWU0WzJdO1xuXG4gIHZhciBvbkRhdGVNb3VzZUVudGVyID0gZnVuY3Rpb24gb25EYXRlTW91c2VFbnRlcihkYXRlKSB7XG4gICAgc2V0SG92ZXJSYW5nZWRWYWx1ZSgoMCwgX21pc2NVdGlsLnVwZGF0ZVZhbHVlcykoc2VsZWN0ZWRWYWx1ZSwgZGF0ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpKTtcblxuICAgIGlmIChtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCkge1xuICAgICAgb25TdGFydEVudGVyKGRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbkVuZEVudGVyKGRhdGUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25EYXRlTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIG9uRGF0ZU1vdXNlTGVhdmUoKSB7XG4gICAgc2V0SG92ZXJSYW5nZWRWYWx1ZSgoMCwgX21pc2NVdGlsLnVwZGF0ZVZhbHVlcykoc2VsZWN0ZWRWYWx1ZSwgbnVsbCwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpKTtcblxuICAgIGlmIChtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCkge1xuICAgICAgb25TdGFydExlYXZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uRW5kTGVhdmUoKTtcbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgZ2V0U2hhcmVkSW5wdXRIb29rUHJvcHMgPSBmdW5jdGlvbiBnZXRTaGFyZWRJbnB1dEhvb2tQcm9wcyhpbmRleCwgcmVzZXRUZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJsdXJUb0NhbmNlbDogbmVlZENvbmZpcm1CdXR0b24sXG4gICAgICBmb3J3YXJkS2V5RG93bjogZm9yd2FyZEtleURvd24sXG4gICAgICBvbkJsdXI6IG9uQmx1cixcbiAgICAgIGlzQ2xpY2tPdXRzaWRlOiBmdW5jdGlvbiBpc0NsaWNrT3V0c2lkZSh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuICEoMCwgX3VpVXRpbC5lbGVtZW50c0NvbnRhaW5zKShbcGFuZWxEaXZSZWYuY3VycmVudCwgc3RhcnRJbnB1dERpdlJlZi5jdXJyZW50LCBlbmRJbnB1dERpdlJlZi5jdXJyZW50XSwgdGFyZ2V0KTtcbiAgICAgIH0sXG4gICAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKGUpIHtcbiAgICAgICAgc2V0TWVyZ2VkQWN0aXZlUGlja2VySW5kZXgoaW5kZXgpO1xuXG4gICAgICAgIGlmIChfb25Gb2N1cykge1xuICAgICAgICAgIF9vbkZvY3VzKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJpZ2dlck9wZW46IGZ1bmN0aW9uIHRyaWdnZXJPcGVuKG5ld09wZW4pIHtcbiAgICAgICAgX3RyaWdnZXJPcGVuKG5ld09wZW4sIGluZGV4KTtcbiAgICAgIH0sXG4gICAgICBvblN1Ym1pdDogZnVuY3Rpb24gb25TdWJtaXQoKSB7XG4gICAgICAgIHRyaWdnZXJDaGFuZ2Uoc2VsZWN0ZWRWYWx1ZSwgaW5kZXgpO1xuICAgICAgICByZXNldFRleHQoKTtcbiAgICAgIH0sXG4gICAgICBvbkNhbmNlbDogZnVuY3Rpb24gb25DYW5jZWwoKSB7XG4gICAgICAgIF90cmlnZ2VyT3BlbihmYWxzZSwgaW5kZXgpO1xuXG4gICAgICAgIHNldFNlbGVjdGVkVmFsdWUobWVyZ2VkVmFsdWUpO1xuICAgICAgICByZXNldFRleHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHZhciBfdXNlUGlja2VySW5wdXQgPSAoMCwgX3VzZVBpY2tlcklucHV0NS5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBnZXRTaGFyZWRJbnB1dEhvb2tQcm9wcygwLCByZXNldFN0YXJ0VGV4dCkpLCB7fSwge1xuICAgIG9wZW46IHN0YXJ0T3BlbixcbiAgICB2YWx1ZTogc3RhcnRUZXh0XG4gIH0pKSxcbiAgICAgIF91c2VQaWNrZXJJbnB1dDIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VQaWNrZXJJbnB1dCwgMiksXG4gICAgICBzdGFydElucHV0UHJvcHMgPSBfdXNlUGlja2VySW5wdXQyWzBdLFxuICAgICAgX3VzZVBpY2tlcklucHV0MiQgPSBfdXNlUGlja2VySW5wdXQyWzFdLFxuICAgICAgc3RhcnRGb2N1c2VkID0gX3VzZVBpY2tlcklucHV0MiQuZm9jdXNlZCxcbiAgICAgIHN0YXJ0VHlwaW5nID0gX3VzZVBpY2tlcklucHV0MiQudHlwaW5nO1xuXG4gIHZhciBfdXNlUGlja2VySW5wdXQzID0gKDAsIF91c2VQaWNrZXJJbnB1dDUuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgZ2V0U2hhcmVkSW5wdXRIb29rUHJvcHMoMSwgcmVzZXRFbmRUZXh0KSksIHt9LCB7XG4gICAgb3BlbjogZW5kT3BlbixcbiAgICB2YWx1ZTogZW5kVGV4dFxuICB9KSksXG4gICAgICBfdXNlUGlja2VySW5wdXQ0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlUGlja2VySW5wdXQzLCAyKSxcbiAgICAgIGVuZElucHV0UHJvcHMgPSBfdXNlUGlja2VySW5wdXQ0WzBdLFxuICAgICAgX3VzZVBpY2tlcklucHV0NCQgPSBfdXNlUGlja2VySW5wdXQ0WzFdLFxuICAgICAgZW5kRm9jdXNlZCA9IF91c2VQaWNrZXJJbnB1dDQkLmZvY3VzZWQsXG4gICAgICBlbmRUeXBpbmcgPSBfdXNlUGlja2VySW5wdXQ0JC50eXBpbmc7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENsaWNrIFBpY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIG9uUGlja2VyQ2xpY2sgPSBmdW5jdGlvbiBvblBpY2tlckNsaWNrKGUpIHtcbiAgICAvLyBXaGVuIGNsaWNrIGluc2lkZSB0aGUgcGlja2VyICYgb3V0c2lkZSB0aGUgcGlja2VyJ3MgaW5wdXQgZWxlbWVudHNcbiAgICAvLyB0aGUgcGFuZWwgc2hvdWxkIHN0aWxsIGJlIG9wZW5lZFxuICAgIGlmICghbWVyZ2VkT3BlbiAmJiAhc3RhcnRJbnB1dFJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSAmJiAhZW5kSW5wdXRSZWYuY3VycmVudC5jb250YWlucyhlLnRhcmdldCkpIHtcbiAgICAgIGlmICghbWVyZ2VkRGlzYWJsZWRbMF0pIHtcbiAgICAgICAgdHJpZ2dlck9wZW5BbmRGb2N1cygwKTtcbiAgICAgIH0gZWxzZSBpZiAoIW1lcmdlZERpc2FibGVkWzFdKSB7XG4gICAgICAgIHRyaWdnZXJPcGVuQW5kRm9jdXMoMSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBvblBpY2tlck1vdXNlRG93biA9IGZ1bmN0aW9uIG9uUGlja2VyTW91c2VEb3duKGUpIHtcbiAgICAvLyBzaG91bGRuJ3QgYWZmZWN0IGlucHV0IGVsZW1lbnRzIGlmIHBpY2tlciBpcyBhY3RpdmVcbiAgICBpZiAobWVyZ2VkT3BlbiAmJiAoc3RhcnRGb2N1c2VkIHx8IGVuZEZvY3VzZWQpICYmICFzdGFydElucHV0UmVmLmN1cnJlbnQuY29udGFpbnMoZS50YXJnZXQpICYmICFlbmRJbnB1dFJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3luYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2xvc2Ugc2hvdWxkIHN5bmMgYmFjayB3aXRoIHRleHQgdmFsdWVcblxuXG4gIHZhciBzdGFydFN0ciA9IG1lcmdlZFZhbHVlICYmIG1lcmdlZFZhbHVlWzBdID8gZ2VuZXJhdGVDb25maWcubG9jYWxlLmZvcm1hdChsb2NhbGUubG9jYWxlLCBtZXJnZWRWYWx1ZVswXSwgJ1lZWVlNTURESEhtbXNzJykgOiAnJztcbiAgdmFyIGVuZFN0ciA9IG1lcmdlZFZhbHVlICYmIG1lcmdlZFZhbHVlWzFdID8gZ2VuZXJhdGVDb25maWcubG9jYWxlLmZvcm1hdChsb2NhbGUubG9jYWxlLCBtZXJnZWRWYWx1ZVsxXSwgJ1lZWVlNTURESEhtbXNzJykgOiAnJztcbiAgKDAsIFJlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIGlmICghbWVyZ2VkT3Blbikge1xuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZShtZXJnZWRWYWx1ZSk7XG5cbiAgICAgIGlmICghc3RhcnRWYWx1ZVRleHRzLmxlbmd0aCB8fCBzdGFydFZhbHVlVGV4dHNbMF0gPT09ICcnKSB7XG4gICAgICAgIHRyaWdnZXJTdGFydFRleHRDaGFuZ2UoJycpO1xuICAgICAgfSBlbHNlIGlmIChmaXJzdFN0YXJ0VmFsdWVUZXh0ICE9PSBzdGFydFRleHQpIHtcbiAgICAgICAgcmVzZXRTdGFydFRleHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbmRWYWx1ZVRleHRzLmxlbmd0aCB8fCBlbmRWYWx1ZVRleHRzWzBdID09PSAnJykge1xuICAgICAgICB0cmlnZ2VyRW5kVGV4dENoYW5nZSgnJyk7XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0RW5kVmFsdWVUZXh0ICE9PSBlbmRUZXh0KSB7XG4gICAgICAgIHJlc2V0RW5kVGV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW21lcmdlZE9wZW4sIHN0YXJ0VmFsdWVUZXh0cywgZW5kVmFsdWVUZXh0c10pOyAvLyBTeW5jIGlubmVyVmFsdWUgd2l0aCBjb250cm9sIG1vZGVcblxuICAoMCwgUmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgc2V0U2VsZWN0ZWRWYWx1ZShtZXJnZWRWYWx1ZSk7XG4gIH0sIFtzdGFydFN0ciwgZW5kU3RyXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAodmFsdWUgJiYgQXJyYXkuaXNBcnJheShkaXNhYmxlZCkgJiYgKCgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKGRpc2FibGVkLCAwKSAmJiAhKDAsIF9taXNjVXRpbC5nZXRWYWx1ZSkodmFsdWUsIDApIHx8ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKGRpc2FibGVkLCAxKSAmJiAhKDAsIF9taXNjVXRpbC5nZXRWYWx1ZSkodmFsdWUsIDEpKSkge1xuICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCAnYGRpc2FibGVkYCBzaG91bGQgbm90IHNldCB3aXRoIGVtcHR5IGB2YWx1ZWAuIFlvdSBzaG91bGQgc2V0IGBhbGxvd0VtcHR5YCBvciBgdmFsdWVgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUHJpdmF0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICBpZiAocGlja2VyUmVmKSB7XG4gICAgcGlja2VyUmVmLmN1cnJlbnQgPSB7XG4gICAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICAgIGlmIChzdGFydElucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBzdGFydElucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgIGlmIChzdGFydElucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBzdGFydElucHV0UmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZElucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBlbmRJbnB1dFJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSYW5nZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciByYW5nZUxhYmVscyA9IE9iamVjdC5rZXlzKHJhbmdlcyB8fCB7fSk7XG4gIHZhciByYW5nZUxpc3QgPSByYW5nZUxhYmVscy5tYXAoZnVuY3Rpb24gKGxhYmVsKSB7XG4gICAgdmFyIHJhbmdlID0gcmFuZ2VzW2xhYmVsXTtcbiAgICB2YXIgbmV3VmFsdWVzID0gdHlwZW9mIHJhbmdlID09PSAnZnVuY3Rpb24nID8gcmFuZ2UoKSA6IHJhbmdlO1xuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogbGFiZWwsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICB0cmlnZ2VyQ2hhbmdlKG5ld1ZhbHVlcywgbnVsbCk7XG5cbiAgICAgICAgX3RyaWdnZXJPcGVuKGZhbHNlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCk7XG4gICAgICB9LFxuICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgIHNldFJhbmdlSG92ZXJWYWx1ZShuZXdWYWx1ZXMpO1xuICAgICAgfSxcbiAgICAgIG9uTW91c2VMZWF2ZTogZnVuY3Rpb24gb25Nb3VzZUxlYXZlKCkge1xuICAgICAgICBzZXRSYW5nZUhvdmVyVmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBhbmVsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gcmVuZGVyUGFuZWwoKSB7XG4gICAgdmFyIHBhbmVsUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHZhciBwYW5lbFByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgcGFuZWxIb3ZlclJhbmdlZFZhbHVlID0gbnVsbDtcblxuICAgIGlmIChtZXJnZWRPcGVuICYmIGhvdmVyUmFuZ2VkVmFsdWUgJiYgaG92ZXJSYW5nZWRWYWx1ZVswXSAmJiBob3ZlclJhbmdlZFZhbHVlWzFdICYmIGdlbmVyYXRlQ29uZmlnLmlzQWZ0ZXIoaG92ZXJSYW5nZWRWYWx1ZVsxXSwgaG92ZXJSYW5nZWRWYWx1ZVswXSkpIHtcbiAgICAgIHBhbmVsSG92ZXJSYW5nZWRWYWx1ZSA9IGhvdmVyUmFuZ2VkVmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIHBhbmVsU2hvd1RpbWUgPSBzaG93VGltZTtcblxuICAgIGlmIChzaG93VGltZSAmJiAoMCwgX3R5cGVvZjIuZGVmYXVsdCkoc2hvd1RpbWUpID09PSAnb2JqZWN0JyAmJiBzaG93VGltZS5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciB0aW1lRGVmYXVsdFZhbHVlcyA9IHNob3dUaW1lLmRlZmF1bHRWYWx1ZTtcbiAgICAgIHBhbmVsU2hvd1RpbWUgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzaG93VGltZSksIHt9LCB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogKDAsIF9taXNjVXRpbC5nZXRWYWx1ZSkodGltZURlZmF1bHRWYWx1ZXMsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KSB8fCB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBwYW5lbERhdGVSZW5kZXIgPSBudWxsO1xuXG4gICAgaWYgKGRhdGVSZW5kZXIpIHtcbiAgICAgIHBhbmVsRGF0ZVJlbmRlciA9IGZ1bmN0aW9uIHBhbmVsRGF0ZVJlbmRlcihkYXRlLCB0b2RheSkge1xuICAgICAgICByZXR1cm4gZGF0ZVJlbmRlcihkYXRlLCB0b2RheSwge1xuICAgICAgICAgIHJhbmdlOiBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA/ICdlbmQnIDogJ3N0YXJ0J1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1JhbmdlQ29udGV4dC5kZWZhdWx0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZToge1xuICAgICAgICBpblJhbmdlOiB0cnVlLFxuICAgICAgICBwYW5lbFBvc2l0aW9uOiBwYW5lbFBvc2l0aW9uLFxuICAgICAgICByYW5nZWRWYWx1ZTogcmFuZ2VIb3ZlclZhbHVlIHx8IHNlbGVjdGVkVmFsdWUsXG4gICAgICAgIGhvdmVyUmFuZ2VkVmFsdWU6IHBhbmVsSG92ZXJSYW5nZWRWYWx1ZVxuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1BpY2tlclBhbmVsLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCBwYW5lbFByb3BzLCB7XG4gICAgICBkYXRlUmVuZGVyOiBwYW5lbERhdGVSZW5kZXIsXG4gICAgICBzaG93VGltZTogcGFuZWxTaG93VGltZSxcbiAgICAgIG1vZGU6IG1lcmdlZE1vZGVzW21lcmdlZEFjdGl2ZVBpY2tlckluZGV4XSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgIHN0eWxlOiB1bmRlZmluZWQsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGRpc2FibGVkRGF0ZTogbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDAgPyBkaXNhYmxlZFN0YXJ0RGF0ZSA6IGRpc2FibGVkRW5kRGF0ZSxcbiAgICAgIGRpc2FibGVkVGltZTogZnVuY3Rpb24gZGlzYWJsZWRUaW1lKGRhdGUpIHtcbiAgICAgICAgaWYgKF9kaXNhYmxlZFRpbWUpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc2FibGVkVGltZShkYXRlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCA/ICdzdGFydCcgOiAnZW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWwtZm9jdXNlZFwiKSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDAgPyAhc3RhcnRUeXBpbmcgOiAhZW5kVHlwaW5nKSksXG4gICAgICB2YWx1ZTogKDAsIF9taXNjVXRpbC5nZXRWYWx1ZSkoc2VsZWN0ZWRWYWx1ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICB0YWJJbmRleDogLTEsXG4gICAgICBvblBhbmVsQ2hhbmdlOiBmdW5jdGlvbiBvblBhbmVsQ2hhbmdlKGRhdGUsIG5ld01vZGUpIHtcbiAgICAgICAgdHJpZ2dlck1vZGVzQ2hhbmdlKCgwLCBfbWlzY1V0aWwudXBkYXRlVmFsdWVzKShtZXJnZWRNb2RlcywgbmV3TW9kZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpLCAoMCwgX21pc2NVdGlsLnVwZGF0ZVZhbHVlcykoc2VsZWN0ZWRWYWx1ZSwgZGF0ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpKTtcbiAgICAgICAgdmFyIHZpZXdEYXRlID0gZGF0ZTtcblxuICAgICAgICBpZiAocGFuZWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyAmJiBtZXJnZWRNb2Rlc1ttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF0gPT09IG5ld01vZGUpIHtcbiAgICAgICAgICB2aWV3RGF0ZSA9ICgwLCBfZGF0ZVV0aWwuZ2V0Q2xvc2luZ1ZpZXdEYXRlKSh2aWV3RGF0ZSwgbmV3TW9kZSwgZ2VuZXJhdGVDb25maWcsIC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFZpZXdEYXRlKHZpZXdEYXRlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCk7XG4gICAgICB9LFxuICAgICAgb25PazogbnVsbCxcbiAgICAgIG9uU2VsZWN0OiB1bmRlZmluZWQsXG4gICAgICBvbkNoYW5nZTogdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBkZWZhdWx0UGlja2VyVmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pKSk7XG4gIH1cblxuICB2YXIgYXJyb3dMZWZ0ID0gMDtcbiAgdmFyIHBhbmVsTGVmdCA9IDA7XG5cbiAgaWYgKG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ICYmIHN0YXJ0SW5wdXREaXZSZWYuY3VycmVudCAmJiBzZXBhcmF0b3JSZWYuY3VycmVudCAmJiBwYW5lbERpdlJlZi5jdXJyZW50KSB7XG4gICAgLy8gQXJyb3cgb2Zmc2V0XG4gICAgYXJyb3dMZWZ0ID0gc3RhcnRJbnB1dERpdlJlZi5jdXJyZW50Lm9mZnNldFdpZHRoICsgc2VwYXJhdG9yUmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG5cbiAgICBpZiAocGFuZWxEaXZSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAmJiBhcnJvd0xlZnQgPiBwYW5lbERpdlJlZi5jdXJyZW50Lm9mZnNldFdpZHRoKSB7XG4gICAgICBwYW5lbExlZnQgPSBhcnJvd0xlZnQ7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFycm93UG9zaXRpb25TdHlsZSA9IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyB7XG4gICAgcmlnaHQ6IGFycm93TGVmdFxuICB9IDoge1xuICAgIGxlZnQ6IGFycm93TGVmdFxuICB9O1xuXG4gIGZ1bmN0aW9uIHJlbmRlclBhbmVscygpIHtcbiAgICB2YXIgcGFuZWxzO1xuICAgIHZhciBleHRyYU5vZGUgPSAoMCwgX2dldEV4dHJhRm9vdGVyLmRlZmF1bHQpKHByZWZpeENscywgbWVyZ2VkTW9kZXNbbWVyZ2VkQWN0aXZlUGlja2VySW5kZXhdLCByZW5kZXJFeHRyYUZvb3Rlcik7XG4gICAgdmFyIHJhbmdlc05vZGUgPSAoMCwgX2dldFJhbmdlcy5kZWZhdWx0KSh7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsXG4gICAgICBuZWVkQ29uZmlybUJ1dHRvbjogbmVlZENvbmZpcm1CdXR0b24sXG4gICAgICBva0Rpc2FibGVkOiAhKDAsIF9taXNjVXRpbC5nZXRWYWx1ZSkoc2VsZWN0ZWRWYWx1ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpIHx8IGRpc2FibGVkRGF0ZSAmJiBkaXNhYmxlZERhdGUoc2VsZWN0ZWRWYWx1ZVttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF0pLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICByYW5nZUxpc3Q6IHJhbmdlTGlzdCxcbiAgICAgIG9uT2s6IGZ1bmN0aW9uIG9uT2soKSB7XG4gICAgICAgIGlmICgoMCwgX21pc2NVdGlsLmdldFZhbHVlKShzZWxlY3RlZFZhbHVlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCkpIHtcbiAgICAgICAgICAvLyB0cmlnZ2VyQ2hhbmdlT2xkKHNlbGVjdGVkVmFsdWUpO1xuICAgICAgICAgIHRyaWdnZXJDaGFuZ2Uoc2VsZWN0ZWRWYWx1ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpO1xuXG4gICAgICAgICAgaWYgKF9vbk9rKSB7XG4gICAgICAgICAgICBfb25PayhzZWxlY3RlZFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwaWNrZXIgIT09ICd0aW1lJyAmJiAhc2hvd1RpbWUpIHtcbiAgICAgIHZhciB2aWV3RGF0ZSA9IGdldFZpZXdEYXRlKG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgIHZhciBuZXh0Vmlld0RhdGUgPSAoMCwgX2RhdGVVdGlsLmdldENsb3NpbmdWaWV3RGF0ZSkodmlld0RhdGUsIHBpY2tlciwgZ2VuZXJhdGVDb25maWcpO1xuICAgICAgdmFyIGN1cnJlbnRNb2RlID0gbWVyZ2VkTW9kZXNbbWVyZ2VkQWN0aXZlUGlja2VySW5kZXhdO1xuICAgICAgdmFyIHNob3dEb3VibGVQYW5lbCA9IGN1cnJlbnRNb2RlID09PSBwaWNrZXI7XG4gICAgICB2YXIgbGVmdFBhbmVsID0gcmVuZGVyUGFuZWwoc2hvd0RvdWJsZVBhbmVsID8gJ2xlZnQnIDogZmFsc2UsIHtcbiAgICAgICAgcGlja2VyVmFsdWU6IHZpZXdEYXRlLFxuICAgICAgICBvblBpY2tlclZhbHVlQ2hhbmdlOiBmdW5jdGlvbiBvblBpY2tlclZhbHVlQ2hhbmdlKG5ld1ZpZXdEYXRlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUobmV3Vmlld0RhdGUsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB2YXIgcmlnaHRQYW5lbCA9IHJlbmRlclBhbmVsKCdyaWdodCcsIHtcbiAgICAgICAgcGlja2VyVmFsdWU6IG5leHRWaWV3RGF0ZSxcbiAgICAgICAgb25QaWNrZXJWYWx1ZUNoYW5nZTogZnVuY3Rpb24gb25QaWNrZXJWYWx1ZUNoYW5nZShuZXdWaWV3RGF0ZSkge1xuICAgICAgICAgIHNldFZpZXdEYXRlKCgwLCBfZGF0ZVV0aWwuZ2V0Q2xvc2luZ1ZpZXdEYXRlKShuZXdWaWV3RGF0ZSwgcGlja2VyLCBnZW5lcmF0ZUNvbmZpZywgLTEpLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgICAgICBwYW5lbHMgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCByaWdodFBhbmVsLCBzaG93RG91YmxlUGFuZWwgJiYgbGVmdFBhbmVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhbmVscyA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGxlZnRQYW5lbCwgc2hvd0RvdWJsZVBhbmVsICYmIHJpZ2h0UGFuZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYW5lbHMgPSByZW5kZXJQYW5lbCgpO1xuICAgIH1cblxuICAgIHZhciBtZXJnZWROb2RlcyA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsc1wiKVxuICAgIH0sIHBhbmVscyksIChleHRyYU5vZGUgfHwgcmFuZ2VzTm9kZSkgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9vdGVyXCIpXG4gICAgfSwgZXh0cmFOb2RlLCByYW5nZXNOb2RlKSk7XG5cbiAgICBpZiAocGFuZWxSZW5kZXIpIHtcbiAgICAgIG1lcmdlZE5vZGVzID0gcGFuZWxSZW5kZXIobWVyZ2VkTm9kZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYW5lbC1jb250YWluZXJcIiksXG4gICAgICBzdHlsZToge1xuICAgICAgICBtYXJnaW5MZWZ0OiBwYW5lbExlZnRcbiAgICAgIH0sXG4gICAgICByZWY6IHBhbmVsRGl2UmVmLFxuICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0sIG1lcmdlZE5vZGVzKTtcbiAgfVxuXG4gIHZhciByYW5nZVBhbmVsID0gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yYW5nZS13cmFwcGVyXCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQocGlja2VyLCBcIi1yYW5nZS13cmFwcGVyXCIpKSxcbiAgICBzdHlsZToge1xuICAgICAgbWluV2lkdGg6IHBvcHVwTWluV2lkdGhcbiAgICB9XG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yYW5nZS1hcnJvd1wiKSxcbiAgICBzdHlsZTogYXJyb3dQb3NpdGlvblN0eWxlXG4gIH0pLCByZW5kZXJQYW5lbHMoKSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEljb25zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIHN1ZmZpeE5vZGU7XG5cbiAgaWYgKHN1ZmZpeEljb24pIHtcbiAgICBzdWZmaXhOb2RlID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1ZmZpeFwiKVxuICAgIH0sIHN1ZmZpeEljb24pO1xuICB9XG5cbiAgdmFyIGNsZWFyTm9kZTtcblxuICBpZiAoYWxsb3dDbGVhciAmJiAoKDAsIF9taXNjVXRpbC5nZXRWYWx1ZSkobWVyZ2VkVmFsdWUsIDApICYmICFtZXJnZWREaXNhYmxlZFswXSB8fCAoMCwgX21pc2NVdGlsLmdldFZhbHVlKShtZXJnZWRWYWx1ZSwgMSkgJiYgIW1lcmdlZERpc2FibGVkWzFdKSkge1xuICAgIGNsZWFyTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdmFyIHZhbHVlcyA9IG1lcmdlZFZhbHVlO1xuXG4gICAgICAgIGlmICghbWVyZ2VkRGlzYWJsZWRbMF0pIHtcbiAgICAgICAgICB2YWx1ZXMgPSAoMCwgX21pc2NVdGlsLnVwZGF0ZVZhbHVlcykodmFsdWVzLCBudWxsLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWVyZ2VkRGlzYWJsZWRbMV0pIHtcbiAgICAgICAgICB2YWx1ZXMgPSAoMCwgX21pc2NVdGlsLnVwZGF0ZVZhbHVlcykodmFsdWVzLCBudWxsLCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyaWdnZXJDaGFuZ2UodmFsdWVzLCBudWxsKTtcblxuICAgICAgICBfdHJpZ2dlck9wZW4oZmFsc2UsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgIH0sXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xlYXJcIilcbiAgICB9LCBjbGVhckljb24gfHwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsZWFyLWJ0blwiKVxuICAgIH0pKTtcbiAgfVxuXG4gIHZhciBpbnB1dFNoYXJlZFByb3BzID0ge1xuICAgIHNpemU6ICgwLCBfdWlVdGlsLmdldElucHV0U2l6ZSkocGlja2VyLCBmb3JtYXRMaXN0WzBdKVxuICB9O1xuICB2YXIgYWN0aXZlQmFyTGVmdCA9IDA7XG4gIHZhciBhY3RpdmVCYXJXaWR0aCA9IDA7XG5cbiAgaWYgKHN0YXJ0SW5wdXREaXZSZWYuY3VycmVudCAmJiBlbmRJbnB1dERpdlJlZi5jdXJyZW50ICYmIHNlcGFyYXRvclJlZi5jdXJyZW50KSB7XG4gICAgaWYgKG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwKSB7XG4gICAgICBhY3RpdmVCYXJXaWR0aCA9IHN0YXJ0SW5wdXREaXZSZWYuY3VycmVudC5vZmZzZXRXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZlQmFyTGVmdCA9IGFycm93TGVmdDtcbiAgICAgIGFjdGl2ZUJhcldpZHRoID0gZW5kSW5wdXREaXZSZWYuY3VycmVudC5vZmZzZXRXaWR0aDtcbiAgICB9XG4gIH1cblxuICB2YXIgYWN0aXZlQmFyUG9zaXRpb25TdHlsZSA9IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyB7XG4gICAgcmlnaHQ6IGFjdGl2ZUJhckxlZnRcbiAgfSA6IHtcbiAgICBsZWZ0OiBhY3RpdmVCYXJMZWZ0XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmV0dXJuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG9uQ29udGV4dFNlbGVjdCA9IGZ1bmN0aW9uIG9uQ29udGV4dFNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgdmFyIHZhbHVlcyA9ICgwLCBfbWlzY1V0aWwudXBkYXRlVmFsdWVzKShzZWxlY3RlZFZhbHVlLCBkYXRlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSAhPT0gJ2tleScgJiYgIW5lZWRDb25maXJtQnV0dG9uKSB7XG4gICAgICAvLyB0cmlnZ2VyQ2hhbmdlIHdpbGwgYWxzbyB1cGRhdGUgc2VsZWN0ZWQgdmFsdWVzXG4gICAgICB0cmlnZ2VyQ2hhbmdlKHZhbHVlcywgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpOyAvLyBjbGVhciBob3ZlciB2YWx1ZSBzdHlsZVxuXG4gICAgICBpZiAobWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDApIHtcbiAgICAgICAgb25TdGFydExlYXZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbkVuZExlYXZlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWUodmFsdWVzKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1BhbmVsQ29udGV4dC5kZWZhdWx0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHtcbiAgICAgIG9wZXJhdGlvblJlZjogb3BlcmF0aW9uUmVmLFxuICAgICAgaGlkZUhlYWRlcjogcGlja2VyID09PSAndGltZScsXG4gICAgICBvbkRhdGVNb3VzZUVudGVyOiBvbkRhdGVNb3VzZUVudGVyLFxuICAgICAgb25EYXRlTW91c2VMZWF2ZTogb25EYXRlTW91c2VMZWF2ZSxcbiAgICAgIGhpZGVSYW5nZXM6IHRydWUsXG4gICAgICBvblNlbGVjdDogb25Db250ZXh0U2VsZWN0LFxuICAgICAgb3BlbjogbWVyZ2VkT3BlblxuICAgIH1cbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChfUGlja2VyVHJpZ2dlci5kZWZhdWx0LCB7XG4gICAgdmlzaWJsZTogbWVyZ2VkT3BlbixcbiAgICBwb3B1cEVsZW1lbnQ6IHJhbmdlUGFuZWwsXG4gICAgcG9wdXBTdHlsZTogcG9wdXBTdHlsZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBkcm9wZG93bkNsYXNzTmFtZTogZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZHJvcGRvd25BbGlnbjogZHJvcGRvd25BbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHJhbmdlOiB0cnVlLFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJhbmdlXCIpLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lczIgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBtZXJnZWREaXNhYmxlZFswXSAmJiBtZXJnZWREaXNhYmxlZFsxXSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCA/IHN0YXJ0Rm9jdXNlZCA6IGVuZEZvY3VzZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMyKSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uQ2xpY2s6IG9uUGlja2VyQ2xpY2ssXG4gICAgb25Nb3VzZURvd246IG9uUGlja2VyTW91c2VEb3duXG4gIH0sICgwLCBfbWlzY1V0aWwuZGVmYXVsdCkocHJvcHMpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dFwiKSwgKF9jbGFzc05hbWVzMyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXQtYWN0aXZlXCIpLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dC1wbGFjZWhvbGRlclwiKSwgISFzdGFydEhvdmVyVmFsdWUpLCBfY2xhc3NOYW1lczMpKSxcbiAgICByZWY6IHN0YXJ0SW5wdXREaXZSZWZcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgIGlkOiBpZCxcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWRbMF0sXG4gICAgcmVhZE9ubHk6IGlucHV0UmVhZE9ubHkgfHwgIXN0YXJ0VHlwaW5nLFxuICAgIHZhbHVlOiBzdGFydEhvdmVyVmFsdWUgfHwgc3RhcnRUZXh0LFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICB0cmlnZ2VyU3RhcnRUZXh0Q2hhbmdlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIHBsYWNlaG9sZGVyOiAoMCwgX21pc2NVdGlsLmdldFZhbHVlKShwbGFjZWhvbGRlciwgMCkgfHwgJycsXG4gICAgcmVmOiBzdGFydElucHV0UmVmXG4gIH0sIHN0YXJ0SW5wdXRQcm9wcywgaW5wdXRTaGFyZWRQcm9wcywge1xuICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlXG4gIH0pKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yYW5nZS1zZXBhcmF0b3JcIiksXG4gICAgcmVmOiBzZXBhcmF0b3JSZWZcbiAgfSwgc2VwYXJhdG9yKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dFwiKSwgKF9jbGFzc05hbWVzNCA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXQtYWN0aXZlXCIpLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzNCwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dC1wbGFjZWhvbGRlclwiKSwgISFlbmRIb3ZlclZhbHVlKSwgX2NsYXNzTmFtZXM0KSksXG4gICAgcmVmOiBlbmRJbnB1dERpdlJlZlxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkWzFdLFxuICAgIHJlYWRPbmx5OiBpbnB1dFJlYWRPbmx5IHx8ICFlbmRUeXBpbmcsXG4gICAgdmFsdWU6IGVuZEhvdmVyVmFsdWUgfHwgZW5kVGV4dCxcbiAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgdHJpZ2dlckVuZFRleHRDaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgIH0sXG4gICAgcGxhY2Vob2xkZXI6ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHBsYWNlaG9sZGVyLCAxKSB8fCAnJyxcbiAgICByZWY6IGVuZElucHV0UmVmXG4gIH0sIGVuZElucHV0UHJvcHMsIGlucHV0U2hhcmVkUHJvcHMsIHtcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZVxuICB9KSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWN0aXZlLWJhclwiKSxcbiAgICBzdHlsZTogKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgYWN0aXZlQmFyUG9zaXRpb25TdHlsZSksIHt9LCB7XG4gICAgICB3aWR0aDogYWN0aXZlQmFyV2lkdGgsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0pXG4gIH0pLCBzdWZmaXhOb2RlLCBjbGVhck5vZGUpKSk7XG59IC8vIFdyYXAgd2l0aCBjbGFzcyBjb21wb25lbnQgdG8gZW5hYmxlIHBhc3MgZ2VuZXJpYyB3aXRoIGluc3RhbmNlIG1ldGhvZFxuXG5cbnZhciBSYW5nZVBpY2tlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShSYW5nZVBpY2tlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyLmRlZmF1bHQpKFJhbmdlUGlja2VyKTtcblxuICBmdW5jdGlvbiBSYW5nZVBpY2tlcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBSYW5nZVBpY2tlcik7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy5waWNrZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcblxuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMucGlja2VyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgX3RoaXMucGlja2VyUmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShSYW5nZVBpY2tlciwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KElubmVyUmFuZ2VQaWNrZXIsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIHtcbiAgICAgICAgcGlja2VyUmVmOiB0aGlzLnBpY2tlclJlZlxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gUmFuZ2VQaWNrZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBfZGVmYXVsdCA9IFJhbmdlUGlja2VyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX21vbWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm1vbWVudFwiKSk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi93YXJuaW5nXCIpO1xuXG52YXIgZ2VuZXJhdGVDb25maWcgPSB7XG4gIC8vIGdldFxuICBnZXROb3c6IGZ1bmN0aW9uIGdldE5vdygpIHtcbiAgICByZXR1cm4gKDAsIF9tb21lbnQuZGVmYXVsdCkoKTtcbiAgfSxcbiAgZ2V0V2Vla0RheTogZnVuY3Rpb24gZ2V0V2Vla0RheShkYXRlKSB7XG4gICAgdmFyIGNsb25lID0gZGF0ZS5jbG9uZSgpLmxvY2FsZSgnZW5fVVMnKTtcbiAgICByZXR1cm4gY2xvbmUud2Vla2RheSgpICsgY2xvbmUubG9jYWxlRGF0YSgpLmZpcnN0RGF5T2ZXZWVrKCk7XG4gIH0sXG4gIGdldFllYXI6IGZ1bmN0aW9uIGdldFllYXIoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLnllYXIoKTtcbiAgfSxcbiAgZ2V0TW9udGg6IGZ1bmN0aW9uIGdldE1vbnRoKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS5tb250aCgpO1xuICB9LFxuICBnZXREYXRlOiBmdW5jdGlvbiBnZXREYXRlKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS5kYXRlKCk7XG4gIH0sXG4gIGdldEhvdXI6IGZ1bmN0aW9uIGdldEhvdXIoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLmhvdXIoKTtcbiAgfSxcbiAgZ2V0TWludXRlOiBmdW5jdGlvbiBnZXRNaW51dGUoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLm1pbnV0ZSgpO1xuICB9LFxuICBnZXRTZWNvbmQ6IGZ1bmN0aW9uIGdldFNlY29uZChkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGUuc2Vjb25kKCk7XG4gIH0sXG4gIC8vIHNldFxuICBhZGRZZWFyOiBmdW5jdGlvbiBhZGRZZWFyKGRhdGUsIGRpZmYpIHtcbiAgICB2YXIgY2xvbmUgPSBkYXRlLmNsb25lKCk7XG4gICAgcmV0dXJuIGNsb25lLmFkZChkaWZmLCAneWVhcicpO1xuICB9LFxuICBhZGRNb250aDogZnVuY3Rpb24gYWRkTW9udGgoZGF0ZSwgZGlmZikge1xuICAgIHZhciBjbG9uZSA9IGRhdGUuY2xvbmUoKTtcbiAgICByZXR1cm4gY2xvbmUuYWRkKGRpZmYsICdtb250aCcpO1xuICB9LFxuICBhZGREYXRlOiBmdW5jdGlvbiBhZGREYXRlKGRhdGUsIGRpZmYpIHtcbiAgICB2YXIgY2xvbmUgPSBkYXRlLmNsb25lKCk7XG4gICAgcmV0dXJuIGNsb25lLmFkZChkaWZmLCAnZGF5Jyk7XG4gIH0sXG4gIHNldFllYXI6IGZ1bmN0aW9uIHNldFllYXIoZGF0ZSwgeWVhcikge1xuICAgIHZhciBjbG9uZSA9IGRhdGUuY2xvbmUoKTtcbiAgICByZXR1cm4gY2xvbmUueWVhcih5ZWFyKTtcbiAgfSxcbiAgc2V0TW9udGg6IGZ1bmN0aW9uIHNldE1vbnRoKGRhdGUsIG1vbnRoKSB7XG4gICAgdmFyIGNsb25lID0gZGF0ZS5jbG9uZSgpO1xuICAgIHJldHVybiBjbG9uZS5tb250aChtb250aCk7XG4gIH0sXG4gIHNldERhdGU6IGZ1bmN0aW9uIHNldERhdGUoZGF0ZSwgbnVtKSB7XG4gICAgdmFyIGNsb25lID0gZGF0ZS5jbG9uZSgpO1xuICAgIHJldHVybiBjbG9uZS5kYXRlKG51bSk7XG4gIH0sXG4gIHNldEhvdXI6IGZ1bmN0aW9uIHNldEhvdXIoZGF0ZSwgaG91cikge1xuICAgIHZhciBjbG9uZSA9IGRhdGUuY2xvbmUoKTtcbiAgICByZXR1cm4gY2xvbmUuaG91cihob3VyKTtcbiAgfSxcbiAgc2V0TWludXRlOiBmdW5jdGlvbiBzZXRNaW51dGUoZGF0ZSwgbWludXRlKSB7XG4gICAgdmFyIGNsb25lID0gZGF0ZS5jbG9uZSgpO1xuICAgIHJldHVybiBjbG9uZS5taW51dGUobWludXRlKTtcbiAgfSxcbiAgc2V0U2Vjb25kOiBmdW5jdGlvbiBzZXRTZWNvbmQoZGF0ZSwgc2Vjb25kKSB7XG4gICAgdmFyIGNsb25lID0gZGF0ZS5jbG9uZSgpO1xuICAgIHJldHVybiBjbG9uZS5zZWNvbmQoc2Vjb25kKTtcbiAgfSxcbiAgLy8gQ29tcGFyZVxuICBpc0FmdGVyOiBmdW5jdGlvbiBpc0FmdGVyKGRhdGUxLCBkYXRlMikge1xuICAgIHJldHVybiBkYXRlMS5pc0FmdGVyKGRhdGUyKTtcbiAgfSxcbiAgaXNWYWxpZGF0ZTogZnVuY3Rpb24gaXNWYWxpZGF0ZShkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGUuaXNWYWxpZCgpO1xuICB9LFxuICBsb2NhbGU6IHtcbiAgICBnZXRXZWVrRmlyc3REYXk6IGZ1bmN0aW9uIGdldFdlZWtGaXJzdERheShsb2NhbGUpIHtcbiAgICAgIHZhciBkYXRlID0gKDAsIF9tb21lbnQuZGVmYXVsdCkoKS5sb2NhbGUobG9jYWxlKTtcbiAgICAgIHJldHVybiBkYXRlLmxvY2FsZURhdGEoKS5maXJzdERheU9mV2VlaygpO1xuICAgIH0sXG4gICAgZ2V0V2VlazogZnVuY3Rpb24gZ2V0V2Vlayhsb2NhbGUsIGRhdGUpIHtcbiAgICAgIHZhciBjbG9uZSA9IGRhdGUuY2xvbmUoKTtcbiAgICAgIHZhciByZXN1bHQgPSBjbG9uZS5sb2NhbGUobG9jYWxlKTtcbiAgICAgIHJldHVybiByZXN1bHQud2VlaygpO1xuICAgIH0sXG4gICAgZ2V0U2hvcnRXZWVrRGF5czogZnVuY3Rpb24gZ2V0U2hvcnRXZWVrRGF5cyhsb2NhbGUpIHtcbiAgICAgIHZhciBkYXRlID0gKDAsIF9tb21lbnQuZGVmYXVsdCkoKS5sb2NhbGUobG9jYWxlKTtcbiAgICAgIHJldHVybiBkYXRlLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbigpO1xuICAgIH0sXG4gICAgZ2V0U2hvcnRNb250aHM6IGZ1bmN0aW9uIGdldFNob3J0TW9udGhzKGxvY2FsZSkge1xuICAgICAgdmFyIGRhdGUgPSAoMCwgX21vbWVudC5kZWZhdWx0KSgpLmxvY2FsZShsb2NhbGUpO1xuICAgICAgcmV0dXJuIGRhdGUubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KCk7XG4gICAgfSxcbiAgICBmb3JtYXQ6IGZ1bmN0aW9uIGZvcm1hdChsb2NhbGUsIGRhdGUsIF9mb3JtYXQpIHtcbiAgICAgIHZhciBjbG9uZSA9IGRhdGUuY2xvbmUoKTtcbiAgICAgIHZhciByZXN1bHQgPSBjbG9uZS5sb2NhbGUobG9jYWxlKTtcbiAgICAgIHJldHVybiByZXN1bHQuZm9ybWF0KF9mb3JtYXQpO1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGxvY2FsZSwgdGV4dCwgZm9ybWF0cykge1xuICAgICAgdmFyIGZhbGxiYWNrRm9ybWF0TGlzdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IGZvcm1hdHNbaV07XG4gICAgICAgIHZhciBmb3JtYXRUZXh0ID0gdGV4dDtcblxuICAgICAgICBpZiAoZm9ybWF0LmluY2x1ZGVzKCd3bycpIHx8IGZvcm1hdC5pbmNsdWRlcygnV28nKSkge1xuICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC93by9nLCAndycpLnJlcGxhY2UoL1dvL2csICdXJyk7XG4gICAgICAgICAgdmFyIG1hdGNoRm9ybWF0ID0gZm9ybWF0Lm1hdGNoKC9bLVl5TW1EZEhoU3NXd0dnXSsvZyk7XG4gICAgICAgICAgdmFyIG1hdGNoVGV4dCA9IGZvcm1hdFRleHQubWF0Y2goL1stXFxkXSsvZyk7XG5cbiAgICAgICAgICBpZiAobWF0Y2hGb3JtYXQgJiYgbWF0Y2hUZXh0KSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBtYXRjaEZvcm1hdC5qb2luKCcnKTtcbiAgICAgICAgICAgIGZvcm1hdFRleHQgPSBtYXRjaFRleHQuam9pbignJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZhbGxiYWNrRm9ybWF0TGlzdC5wdXNoKGZvcm1hdC5yZXBsYWNlKC9vL2csICcnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRhdGUgPSAoMCwgX21vbWVudC5kZWZhdWx0KShmb3JtYXRUZXh0LCBmb3JtYXQsIGxvY2FsZSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gRmFsbGJhY2sgdG8gZnV6enkgbWF0Y2hpbmcsIHRoaXMgc2hvdWxkIGFsd2F5cyBub3QgcmVhY2ggbWF0Y2ggb3IgbmVlZCBmaXJlIGEgaXNzdWVcblxuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmFsbGJhY2tGb3JtYXRMaXN0Lmxlbmd0aDsgX2kgKz0gMSkge1xuICAgICAgICB2YXIgX2RhdGUgPSAoMCwgX21vbWVudC5kZWZhdWx0KSh0ZXh0LCBmYWxsYmFja0Zvcm1hdExpc3RbX2ldLCBsb2NhbGUsIGZhbHNlKTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG4gICAgICAgIGlmIChfZGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAoMCwgX3dhcm5pbmcubm90ZU9uY2UpKGZhbHNlLCAnTm90IG1hdGNoIGFueSBmb3JtYXQgc3RyaWN0bHkgYW5kIGZhbGxiYWNrIHRvIGZ1enp5IG1hdGNoLiBQbGVhc2UgaGVscCB0byBmaXJlIGEgaXNzdWUgYWJvdXQgdGhpcy4nKTtcbiAgICAgICAgICByZXR1cm4gX2RhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59O1xudmFyIF9kZWZhdWx0ID0gZ2VuZXJhdGVDb25maWc7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VDZWxsQ2xhc3NOYW1lO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2RhdGVVdGlsID0gcmVxdWlyZShcIi4uL3V0aWxzL2RhdGVVdGlsXCIpO1xuXG52YXIgX21pc2NVdGlsID0gcmVxdWlyZShcIi4uL3V0aWxzL21pc2NVdGlsXCIpO1xuXG5mdW5jdGlvbiB1c2VDZWxsQ2xhc3NOYW1lKF9yZWYpIHtcbiAgdmFyIGNlbGxQcmVmaXhDbHMgPSBfcmVmLmNlbGxQcmVmaXhDbHMsXG4gICAgICBnZW5lcmF0ZUNvbmZpZyA9IF9yZWYuZ2VuZXJhdGVDb25maWcsXG4gICAgICByYW5nZWRWYWx1ZSA9IF9yZWYucmFuZ2VkVmFsdWUsXG4gICAgICBob3ZlclJhbmdlZFZhbHVlID0gX3JlZi5ob3ZlclJhbmdlZFZhbHVlLFxuICAgICAgaXNJblZpZXcgPSBfcmVmLmlzSW5WaWV3LFxuICAgICAgaXNTYW1lQ2VsbCA9IF9yZWYuaXNTYW1lQ2VsbCxcbiAgICAgIG9mZnNldENlbGwgPSBfcmVmLm9mZnNldENlbGwsXG4gICAgICB0b2RheSA9IF9yZWYudG9kYXksXG4gICAgICB2YWx1ZSA9IF9yZWYudmFsdWU7XG5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKGN1cnJlbnREYXRlKSB7XG4gICAgdmFyIF9yZWYyO1xuXG4gICAgdmFyIHByZXZEYXRlID0gb2Zmc2V0Q2VsbChjdXJyZW50RGF0ZSwgLTEpO1xuICAgIHZhciBuZXh0RGF0ZSA9IG9mZnNldENlbGwoY3VycmVudERhdGUsIDEpO1xuICAgIHZhciByYW5nZVN0YXJ0ID0gKDAsIF9taXNjVXRpbC5nZXRWYWx1ZSkocmFuZ2VkVmFsdWUsIDApO1xuICAgIHZhciByYW5nZUVuZCA9ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHJhbmdlZFZhbHVlLCAxKTtcbiAgICB2YXIgaG92ZXJTdGFydCA9ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKGhvdmVyUmFuZ2VkVmFsdWUsIDApO1xuICAgIHZhciBob3ZlckVuZCA9ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKGhvdmVyUmFuZ2VkVmFsdWUsIDEpO1xuICAgIHZhciBpc1JhbmdlSG92ZXJlZCA9ICgwLCBfZGF0ZVV0aWwuaXNJblJhbmdlKShnZW5lcmF0ZUNvbmZpZywgaG92ZXJTdGFydCwgaG92ZXJFbmQsIGN1cnJlbnREYXRlKTtcblxuICAgIGZ1bmN0aW9uIGlzUmFuZ2VTdGFydChkYXRlKSB7XG4gICAgICByZXR1cm4gaXNTYW1lQ2VsbChyYW5nZVN0YXJ0LCBkYXRlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1JhbmdlRW5kKGRhdGUpIHtcbiAgICAgIHJldHVybiBpc1NhbWVDZWxsKHJhbmdlRW5kLCBkYXRlKTtcbiAgICB9XG5cbiAgICB2YXIgaXNIb3ZlclN0YXJ0ID0gaXNTYW1lQ2VsbChob3ZlclN0YXJ0LCBjdXJyZW50RGF0ZSk7XG4gICAgdmFyIGlzSG92ZXJFbmQgPSBpc1NhbWVDZWxsKGhvdmVyRW5kLCBjdXJyZW50RGF0ZSk7XG4gICAgdmFyIGlzSG92ZXJFZGdlU3RhcnQgPSAoaXNSYW5nZUhvdmVyZWQgfHwgaXNIb3ZlckVuZCkgJiYgKCFpc0luVmlldyhwcmV2RGF0ZSkgfHwgaXNSYW5nZUVuZChwcmV2RGF0ZSkpO1xuICAgIHZhciBpc0hvdmVyRWRnZUVuZCA9IChpc1JhbmdlSG92ZXJlZCB8fCBpc0hvdmVyU3RhcnQpICYmICghaXNJblZpZXcobmV4dERhdGUpIHx8IGlzUmFuZ2VTdGFydChuZXh0RGF0ZSkpO1xuICAgIHJldHVybiBfcmVmMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItaW4tdmlld1wiKSwgaXNJblZpZXcoY3VycmVudERhdGUpKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWluLXJhbmdlXCIpLCAoMCwgX2RhdGVVdGlsLmlzSW5SYW5nZSkoZ2VuZXJhdGVDb25maWcsIHJhbmdlU3RhcnQsIHJhbmdlRW5kLCBjdXJyZW50RGF0ZSkpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2Utc3RhcnRcIiksIGlzUmFuZ2VTdGFydChjdXJyZW50RGF0ZSkpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2UtZW5kXCIpLCBpc1JhbmdlRW5kKGN1cnJlbnREYXRlKSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1zdGFydC1zaW5nbGVcIiksIGlzUmFuZ2VTdGFydChjdXJyZW50RGF0ZSkgJiYgIXJhbmdlRW5kKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLWVuZC1zaW5nbGVcIiksIGlzUmFuZ2VFbmQoY3VycmVudERhdGUpICYmICFyYW5nZVN0YXJ0KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLXN0YXJ0LW5lYXItaG92ZXJcIiksIGlzUmFuZ2VTdGFydChjdXJyZW50RGF0ZSkgJiYgKGlzU2FtZUNlbGwocHJldkRhdGUsIGhvdmVyU3RhcnQpIHx8ICgwLCBfZGF0ZVV0aWwuaXNJblJhbmdlKShnZW5lcmF0ZUNvbmZpZywgaG92ZXJTdGFydCwgaG92ZXJFbmQsIHByZXZEYXRlKSkpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2UtZW5kLW5lYXItaG92ZXJcIiksIGlzUmFuZ2VFbmQoY3VycmVudERhdGUpICYmIChpc1NhbWVDZWxsKG5leHREYXRlLCBob3ZlckVuZCkgfHwgKDAsIF9kYXRlVXRpbC5pc0luUmFuZ2UpKGdlbmVyYXRlQ29uZmlnLCBob3ZlclN0YXJ0LCBob3ZlckVuZCwgbmV4dERhdGUpKSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3ZlclwiKSwgaXNSYW5nZUhvdmVyZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2UtaG92ZXItc3RhcnRcIiksIGlzSG92ZXJTdGFydCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3Zlci1lbmRcIiksIGlzSG92ZXJFbmQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2UtaG92ZXItZWRnZS1zdGFydFwiKSwgaXNIb3ZlckVkZ2VTdGFydCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3Zlci1lZGdlLWVuZFwiKSwgaXNIb3ZlckVkZ2VFbmQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2UtaG92ZXItZWRnZS1zdGFydC1uZWFyLXJhbmdlXCIpLCBpc0hvdmVyRWRnZVN0YXJ0ICYmIGlzU2FtZUNlbGwocHJldkRhdGUsIHJhbmdlRW5kKSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3Zlci1lZGdlLWVuZC1uZWFyLXJhbmdlXCIpLCBpc0hvdmVyRWRnZUVuZCAmJiBpc1NhbWVDZWxsKG5leHREYXRlLCByYW5nZVN0YXJ0KSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi10b2RheVwiKSwgaXNTYW1lQ2VsbCh0b2RheSwgY3VycmVudERhdGUpKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXNlbGVjdGVkXCIpLCBpc1NhbWVDZWxsKHZhbHVlLCBjdXJyZW50RGF0ZSkpLCBfcmVmMjtcbiAgfVxuXG4gIHJldHVybiBnZXRDbGFzc05hbWU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlSG92ZXJWYWx1ZTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbnZhciBfdXNlVmFsdWVUZXh0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VzZVZhbHVlVGV4dHNcIikpO1xuXG5mdW5jdGlvbiB1c2VIb3ZlclZhbHVlKHZhbHVlVGV4dCwgX3JlZikge1xuICB2YXIgZm9ybWF0TGlzdCA9IF9yZWYuZm9ybWF0TGlzdCxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gX3JlZi5nZW5lcmF0ZUNvbmZpZyxcbiAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlO1xuXG4gIHZhciBfdXNlU3RhdGUgPSAoMCwgX3JlYWN0LnVzZVN0YXRlKShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZSwgMiksXG4gICAgICB2YWx1ZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBpbnRlcm5hbFNldFZhbHVlID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgcmFmID0gKDAsIF9yZWFjdC51c2VSZWYpKG51bGwpO1xuXG4gIGZ1bmN0aW9uIHNldFZhbHVlKHZhbCkge1xuICAgIHZhciBpbW1lZGlhdGVseSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmLmN1cnJlbnQpO1xuXG4gICAgaWYgKGltbWVkaWF0ZWx5KSB7XG4gICAgICBpbnRlcm5hbFNldFZhbHVlKHZhbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmFmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgaW50ZXJuYWxTZXRWYWx1ZSh2YWwpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIF91c2VWYWx1ZVRleHRzID0gKDAsIF91c2VWYWx1ZVRleHRzMy5kZWZhdWx0KSh2YWx1ZSwge1xuICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZTogbG9jYWxlXG4gIH0pLFxuICAgICAgX3VzZVZhbHVlVGV4dHMyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlVmFsdWVUZXh0cywgMiksXG4gICAgICBmaXJzdFRleHQgPSBfdXNlVmFsdWVUZXh0czJbMV07XG5cbiAgZnVuY3Rpb24gb25FbnRlcihkYXRlKSB7XG4gICAgc2V0VmFsdWUoZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkxlYXZlKCkge1xuICAgIHZhciBpbW1lZGlhdGVseSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgc2V0VmFsdWUobnVsbCwgaW1tZWRpYXRlbHkpO1xuICB9XG5cbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICBvbkxlYXZlKHRydWUpO1xuICB9LCBbdmFsdWVUZXh0XSk7XG4gICgwLCBfcmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjYW5jZWxBbmltYXRpb25GcmFtZShyYWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW2ZpcnN0VGV4dCwgb25FbnRlciwgb25MZWF2ZV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlUGlja2VySW5wdXQ7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF91aVV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbHMvdWlVdGlsXCIpO1xuXG5mdW5jdGlvbiB1c2VQaWNrZXJJbnB1dChfcmVmKSB7XG4gIHZhciBvcGVuID0gX3JlZi5vcGVuLFxuICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgaXNDbGlja091dHNpZGUgPSBfcmVmLmlzQ2xpY2tPdXRzaWRlLFxuICAgICAgdHJpZ2dlck9wZW4gPSBfcmVmLnRyaWdnZXJPcGVuLFxuICAgICAgZm9yd2FyZEtleURvd24gPSBfcmVmLmZvcndhcmRLZXlEb3duLFxuICAgICAgYmx1clRvQ2FuY2VsID0gX3JlZi5ibHVyVG9DYW5jZWwsXG4gICAgICBvblN1Ym1pdCA9IF9yZWYub25TdWJtaXQsXG4gICAgICBvbkNhbmNlbCA9IF9yZWYub25DYW5jZWwsXG4gICAgICBfb25Gb2N1cyA9IF9yZWYub25Gb2N1cyxcbiAgICAgIF9vbkJsdXIgPSBfcmVmLm9uQmx1cjtcblxuICB2YXIgX3VzZVN0YXRlID0gKDAsIF9yZWFjdC51c2VTdGF0ZSkoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIHR5cGluZyA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRUeXBpbmcgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfdXNlU3RhdGUzID0gKDAsIF9yZWFjdC51c2VTdGF0ZSkoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlMywgMiksXG4gICAgICBmb2N1c2VkID0gX3VzZVN0YXRlNFswXSxcbiAgICAgIHNldEZvY3VzZWQgPSBfdXNlU3RhdGU0WzFdO1xuICAvKipcbiAgICogV2Ugd2lsbCBwcmV2ZW50IGJsdXIgdG8gaGFuZGxlIG9wZW4gZXZlbnQgd2hlbiB1c2VyIGNsaWNrIG91dHNpZGUsXG4gICAqIHNpbmNlIHRoaXMgd2lsbCByZXBlYXQgdHJpZ2dlciBgb25PcGVuQ2hhbmdlYCBldmVudC5cbiAgICovXG5cblxuICB2YXIgcHJldmVudEJsdXJSZWYgPSAoMCwgX3JlYWN0LnVzZVJlZikoZmFsc2UpO1xuICB2YXIgdmFsdWVDaGFuZ2VkUmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKGZhbHNlKTtcbiAgdmFyIGlucHV0UHJvcHMgPSB7XG4gICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKCkge1xuICAgICAgc2V0VHlwaW5nKHRydWUpO1xuICAgICAgdHJpZ2dlck9wZW4odHJ1ZSk7XG4gICAgfSxcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICBzd2l0Y2ggKGUud2hpY2gpIHtcbiAgICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICghb3Blbikge1xuICAgICAgICAgICAgICB0cmlnZ2VyT3Blbih0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob25TdWJtaXQoKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgc2V0VHlwaW5nKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5UQUI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGluZyAmJiBvcGVuICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgIHNldFR5cGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXR5cGluZyAmJiBvcGVuKSB7XG4gICAgICAgICAgICAgIGlmICghZm9yd2FyZEtleURvd24oZSkgJiYgZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIHNldFR5cGluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuRVNDOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNldFR5cGluZyh0cnVlKTtcbiAgICAgICAgICAgIG9uQ2FuY2VsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIW9wZW4gJiYgIVtfS2V5Q29kZS5kZWZhdWx0LlNISUZUXS5pbmNsdWRlcyhlLndoaWNoKSkge1xuICAgICAgICB0cmlnZ2VyT3Blbih0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIXR5cGluZykge1xuICAgICAgICAvLyBMZXQgcG9wdXAgcGFuZWwgaGFuZGxlIGtleWJvYXJkXG4gICAgICAgIGZvcndhcmRLZXlEb3duKGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Gb2N1czogZnVuY3Rpb24gb25Gb2N1cyhlKSB7XG4gICAgICBzZXRUeXBpbmcodHJ1ZSk7XG4gICAgICBzZXRGb2N1c2VkKHRydWUpO1xuXG4gICAgICBpZiAoX29uRm9jdXMpIHtcbiAgICAgICAgX29uRm9jdXMoZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkJsdXI6IGZ1bmN0aW9uIG9uQmx1cihlKSB7XG4gICAgICBpZiAocHJldmVudEJsdXJSZWYuY3VycmVudCB8fCAhaXNDbGlja091dHNpZGUoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgcHJldmVudEJsdXJSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChibHVyVG9DYW5jZWwpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGlzQ2xpY2tPdXRzaWRlKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICBvbkNhbmNlbCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKG9wZW4pIHtcbiAgICAgICAgdHJpZ2dlck9wZW4oZmFsc2UpO1xuXG4gICAgICAgIGlmICh2YWx1ZUNoYW5nZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uU3VibWl0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0Rm9jdXNlZChmYWxzZSk7XG5cbiAgICAgIGlmIChfb25CbHVyKSB7XG4gICAgICAgIF9vbkJsdXIoZSk7XG4gICAgICB9XG4gICAgfVxuICB9OyAvLyBjaGVjayBpZiB2YWx1ZSBjaGFuZ2VkXG5cbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICB2YWx1ZUNoYW5nZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9LCBbb3Blbl0pO1xuICAoMCwgX3JlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIHZhbHVlQ2hhbmdlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfSwgW3ZhbHVlXSk7IC8vIEdsb2JhbCBjbGljayBoYW5kbGVyXG5cbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKDAsIF91aVV0aWwuYWRkR2xvYmFsTW91c2VEb3duRXZlbnQpKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIHRhcmdldCA9IF9yZWYyLnRhcmdldDtcblxuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgaWYgKCFpc0NsaWNrT3V0c2lkZSh0YXJnZXQpKSB7XG4gICAgICAgICAgcHJldmVudEJsdXJSZWYuY3VycmVudCA9IHRydWU7IC8vIEFsd2F5cyBzZXQgYmFjayBpbiBjYXNlIGBvbkJsdXJgIHByZXZlbnRlZCBieSB1c2VyXG5cbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcHJldmVudEJsdXJSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFmb2N1c2VkKSB7XG4gICAgICAgICAgdHJpZ2dlck9wZW4oZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gW2lucHV0UHJvcHMsIHtcbiAgICBmb2N1c2VkOiBmb2N1c2VkLFxuICAgIHR5cGluZzogdHlwaW5nXG4gIH1dO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlUmFuZ2VEaXNhYmxlZDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9taXNjVXRpbCA9IHJlcXVpcmUoXCIuLi91dGlscy9taXNjVXRpbFwiKTtcblxudmFyIF9kYXRlVXRpbCA9IHJlcXVpcmUoXCIuLi91dGlscy9kYXRlVXRpbFwiKTtcblxuZnVuY3Rpb24gdXNlUmFuZ2VEaXNhYmxlZChfcmVmLCBkaXNhYmxlZFN0YXJ0LCBkaXNhYmxlZEVuZCkge1xuICB2YXIgcGlja2VyID0gX3JlZi5waWNrZXIsXG4gICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgIHNlbGVjdGVkVmFsdWUgPSBfcmVmLnNlbGVjdGVkVmFsdWUsXG4gICAgICBkaXNhYmxlZERhdGUgPSBfcmVmLmRpc2FibGVkRGF0ZSxcbiAgICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gX3JlZi5nZW5lcmF0ZUNvbmZpZztcbiAgdmFyIHN0YXJ0RGF0ZSA9ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHNlbGVjdGVkVmFsdWUsIDApO1xuICB2YXIgZW5kRGF0ZSA9ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHNlbGVjdGVkVmFsdWUsIDEpO1xuXG4gIGZ1bmN0aW9uIHdlZWtOdW1iZXIoZGF0ZSkge1xuICAgIHZhciB5ZWFyID0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkYXRlKTtcbiAgICB2YXIgd2VlayA9IGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5nZXRXZWVrKGxvY2FsZS5sb2NhbGUsIGRhdGUpO1xuICAgIHJldHVybiB5ZWFyICogMTAwICsgd2VlaztcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vbnRoTnVtYmVyKGRhdGUpIHtcbiAgICB2YXIgeWVhciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoZGF0ZSk7XG4gICAgdmFyIG1vbnRoID0gZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZGF0ZSk7XG4gICAgcmV0dXJuIHllYXIgKiAxMDAgKyBtb250aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHF1YXJ0ZXJOdW1iZXIoZGF0ZSkge1xuICAgIHZhciB5ZWFyID0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkYXRlKTtcbiAgICB2YXIgcXVhcnRlciA9ICgwLCBfZGF0ZVV0aWwuZ2V0UXVhcnRlcikoZ2VuZXJhdGVDb25maWcsIGRhdGUpO1xuICAgIHJldHVybiB5ZWFyICogMTAgKyBxdWFydGVyO1xuICB9XG5cbiAgdmFyIGRpc2FibGVkU3RhcnREYXRlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGRhdGUpIHtcbiAgICBpZiAoZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShkYXRlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBEaXNhYmxlZCByYW5nZVxuXG5cbiAgICBpZiAoZGlzYWJsZWRbMV0gJiYgZW5kRGF0ZSkge1xuICAgICAgcmV0dXJuICEoMCwgX2RhdGVVdGlsLmlzU2FtZURhdGUpKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBlbmREYXRlKSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKGRhdGUsIGVuZERhdGUpO1xuICAgIH0gLy8gRGlzYWJsZWQgcGFydFxuXG5cbiAgICBpZiAoZGlzYWJsZWRTdGFydCAmJiBlbmREYXRlKSB7XG4gICAgICBzd2l0Y2ggKHBpY2tlcikge1xuICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICByZXR1cm4gcXVhcnRlck51bWJlcihkYXRlKSA+IHF1YXJ0ZXJOdW1iZXIoZW5kRGF0ZSk7XG5cbiAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgIHJldHVybiBtb250aE51bWJlcihkYXRlKSA+IG1vbnRoTnVtYmVyKGVuZERhdGUpO1xuXG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgIHJldHVybiB3ZWVrTnVtYmVyKGRhdGUpID4gd2Vla051bWJlcihlbmREYXRlKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAhKDAsIF9kYXRlVXRpbC5pc1NhbWVEYXRlKShnZW5lcmF0ZUNvbmZpZywgZGF0ZSwgZW5kRGF0ZSkgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihkYXRlLCBlbmREYXRlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZERhdGUsIGRpc2FibGVkWzFdLCBlbmREYXRlLCBkaXNhYmxlZFN0YXJ0XSk7XG4gIHZhciBkaXNhYmxlZEVuZERhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZGF0ZSkge1xuICAgIGlmIChkaXNhYmxlZERhdGUgJiYgZGlzYWJsZWREYXRlKGRhdGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIERpc2FibGVkIHJhbmdlXG5cblxuICAgIGlmIChkaXNhYmxlZFswXSAmJiBzdGFydERhdGUpIHtcbiAgICAgIHJldHVybiAhKDAsIF9kYXRlVXRpbC5pc1NhbWVEYXRlKShnZW5lcmF0ZUNvbmZpZywgZGF0ZSwgZW5kRGF0ZSkgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihzdGFydERhdGUsIGRhdGUpO1xuICAgIH0gLy8gRGlzYWJsZWQgcGFydFxuXG5cbiAgICBpZiAoZGlzYWJsZWRFbmQgJiYgc3RhcnREYXRlKSB7XG4gICAgICBzd2l0Y2ggKHBpY2tlcikge1xuICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICByZXR1cm4gcXVhcnRlck51bWJlcihkYXRlKSA8IHF1YXJ0ZXJOdW1iZXIoc3RhcnREYXRlKTtcblxuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgcmV0dXJuIG1vbnRoTnVtYmVyKGRhdGUpIDwgbW9udGhOdW1iZXIoc3RhcnREYXRlKTtcblxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICByZXR1cm4gd2Vla051bWJlcihkYXRlKSA8IHdlZWtOdW1iZXIoc3RhcnREYXRlKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAhKDAsIF9kYXRlVXRpbC5pc1NhbWVEYXRlKShnZW5lcmF0ZUNvbmZpZywgZGF0ZSwgc3RhcnREYXRlKSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKHN0YXJ0RGF0ZSwgZGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbZGlzYWJsZWREYXRlLCBkaXNhYmxlZFswXSwgc3RhcnREYXRlLCBkaXNhYmxlZEVuZF0pO1xuICByZXR1cm4gW2Rpc2FibGVkU3RhcnREYXRlLCBkaXNhYmxlZEVuZERhdGVdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZVJhbmdlVmlld0RhdGVzO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9taXNjVXRpbCA9IHJlcXVpcmUoXCIuLi91dGlscy9taXNjVXRpbFwiKTtcblxudmFyIF9kYXRlVXRpbCA9IHJlcXVpcmUoXCIuLi91dGlscy9kYXRlVXRpbFwiKTtcblxuZnVuY3Rpb24gZ2V0U3RhcnRFbmREaXN0YW5jZShzdGFydERhdGUsIGVuZERhdGUsIHBpY2tlciwgZ2VuZXJhdGVDb25maWcpIHtcbiAgdmFyIHN0YXJ0TmV4dCA9ICgwLCBfZGF0ZVV0aWwuZ2V0Q2xvc2luZ1ZpZXdEYXRlKShzdGFydERhdGUsIHBpY2tlciwgZ2VuZXJhdGVDb25maWcsIDEpO1xuXG4gIGZ1bmN0aW9uIGdldERpc3RhbmNlKGNvbXBhcmVGdW5jKSB7XG4gICAgaWYgKGNvbXBhcmVGdW5jKHN0YXJ0RGF0ZSwgZW5kRGF0ZSkpIHtcbiAgICAgIHJldHVybiAnc2FtZSc7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBhcmVGdW5jKHN0YXJ0TmV4dCwgZW5kRGF0ZSkpIHtcbiAgICAgIHJldHVybiAnY2xvc2luZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdmYXInO1xuICB9XG5cbiAgc3dpdGNoIChwaWNrZXIpIHtcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gKDAsIF9kYXRlVXRpbC5pc1NhbWVEZWNhZGUpKGdlbmVyYXRlQ29uZmlnLCBzdGFydCwgZW5kKTtcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2RhdGVVdGlsLmlzU2FtZVllYXIpKGdlbmVyYXRlQ29uZmlnLCBzdGFydCwgZW5kKTtcbiAgICAgIH0pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gKDAsIF9kYXRlVXRpbC5pc1NhbWVNb250aCkoZ2VuZXJhdGVDb25maWcsIHN0YXJ0LCBlbmQpO1xuICAgICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmFuZ2VWaWV3RGF0ZSh2YWx1ZXMsIGluZGV4LCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnKSB7XG4gIHZhciBzdGFydERhdGUgPSAoMCwgX21pc2NVdGlsLmdldFZhbHVlKSh2YWx1ZXMsIDApO1xuICB2YXIgZW5kRGF0ZSA9ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHZhbHVlcywgMSk7XG5cbiAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgcmV0dXJuIHN0YXJ0RGF0ZTtcbiAgfVxuXG4gIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSkge1xuICAgIHZhciBkaXN0YW5jZSA9IGdldFN0YXJ0RW5kRGlzdGFuY2Uoc3RhcnREYXRlLCBlbmREYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnKTtcblxuICAgIHN3aXRjaCAoZGlzdGFuY2UpIHtcbiAgICAgIGNhc2UgJ3NhbWUnOlxuICAgICAgICByZXR1cm4gc3RhcnREYXRlO1xuXG4gICAgICBjYXNlICdjbG9zaW5nJzpcbiAgICAgICAgcmV0dXJuIHN0YXJ0RGF0ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfZGF0ZVV0aWwuZ2V0Q2xvc2luZ1ZpZXdEYXRlKShlbmREYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnLCAtMSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXJ0RGF0ZTtcbn1cblxuZnVuY3Rpb24gdXNlUmFuZ2VWaWV3RGF0ZXMoX3JlZikge1xuICB2YXIgdmFsdWVzID0gX3JlZi52YWx1ZXMsXG4gICAgICBwaWNrZXIgPSBfcmVmLnBpY2tlcixcbiAgICAgIGRlZmF1bHREYXRlcyA9IF9yZWYuZGVmYXVsdERhdGVzLFxuICAgICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFsoMCwgX21pc2NVdGlsLmdldFZhbHVlKShkZWZhdWx0RGF0ZXMsIDApLCAoMCwgX21pc2NVdGlsLmdldFZhbHVlKShkZWZhdWx0RGF0ZXMsIDEpXTtcbiAgfSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgZGVmYXVsdFZpZXdEYXRlcyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXREZWZhdWx0Vmlld0RhdGVzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgICB2aWV3RGF0ZXMgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0SW50ZXJuYWxWaWV3RGF0ZXMgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBzdGFydERhdGUgPSAoMCwgX21pc2NVdGlsLmdldFZhbHVlKSh2YWx1ZXMsIDApO1xuICB2YXIgZW5kRGF0ZSA9ICgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHZhbHVlcywgMSk7XG5cbiAgZnVuY3Rpb24gZ2V0Vmlld0RhdGUoaW5kZXgpIHtcbiAgICAvLyBJZiBzZXQgZGVmYXVsdCB2aWV3IGRhdGUsIHVzZSBpdFxuICAgIGlmIChkZWZhdWx0Vmlld0RhdGVzW2luZGV4XSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWaWV3RGF0ZXNbaW5kZXhdO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX21pc2NVdGlsLmdldFZhbHVlKSh2aWV3RGF0ZXMsIGluZGV4KSB8fCBnZXRSYW5nZVZpZXdEYXRlKHZhbHVlcywgaW5kZXgsIHBpY2tlciwgZ2VuZXJhdGVDb25maWcpIHx8IHN0YXJ0RGF0ZSB8fCBlbmREYXRlIHx8IGdlbmVyYXRlQ29uZmlnLmdldE5vdygpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Vmlld0RhdGUodmlld0RhdGUsIGluZGV4KSB7XG4gICAgaWYgKHZpZXdEYXRlKSB7XG4gICAgICB2YXIgbmV3Vmlld0RhdGVzID0gKDAsIF9taXNjVXRpbC51cGRhdGVWYWx1ZXMpKHZpZXdEYXRlcywgdmlld0RhdGUsIGluZGV4KTsgLy8gU2V0IHZpZXcgZGF0ZSB3aWxsIGNsZWFuIHVwIGRlZmF1bHQgb25lXG5cbiAgICAgIHNldERlZmF1bHRWaWV3RGF0ZXMoIC8vIFNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXlcbiAgICAgICgwLCBfbWlzY1V0aWwudXBkYXRlVmFsdWVzKShkZWZhdWx0Vmlld0RhdGVzLCBudWxsLCBpbmRleCkgfHwgW251bGwsIG51bGxdKTsgLy8gUmVzZXQgYW5vdGhlciBvbmUgd2hlbiBub3QgaGF2ZSB2YWx1ZVxuXG4gICAgICB2YXIgYW5vdGhlckluZGV4ID0gKGluZGV4ICsgMSkgJSAyO1xuXG4gICAgICBpZiAoISgwLCBfbWlzY1V0aWwuZ2V0VmFsdWUpKHZhbHVlcywgYW5vdGhlckluZGV4KSkge1xuICAgICAgICBuZXdWaWV3RGF0ZXMgPSAoMCwgX21pc2NVdGlsLnVwZGF0ZVZhbHVlcykobmV3Vmlld0RhdGVzLCB2aWV3RGF0ZSwgYW5vdGhlckluZGV4KTtcbiAgICAgIH1cblxuICAgICAgc2V0SW50ZXJuYWxWaWV3RGF0ZXMobmV3Vmlld0RhdGVzKTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0RGF0ZSB8fCBlbmREYXRlKSB7XG4gICAgICAvLyBSZXNldCBhbGwgd2hlbiBoYXMgdmFsdWVzIHdoZW4gYHZpZXdEYXRlYCBpcyBgbnVsbGAgd2hpY2ggbWVhbnMgZnJvbSBvcGVuIHRyaWdnZXJcbiAgICAgIHNldEludGVybmFsVmlld0RhdGVzKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbZ2V0Vmlld0RhdGUsIHNldFZpZXdEYXRlXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VUZXh0VmFsdWVNYXBwaW5nO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuZnVuY3Rpb24gdXNlVGV4dFZhbHVlTWFwcGluZyhfcmVmKSB7XG4gIHZhciB2YWx1ZVRleHRzID0gX3JlZi52YWx1ZVRleHRzLFxuICAgICAgb25UZXh0Q2hhbmdlID0gX3JlZi5vblRleHRDaGFuZ2U7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCcnKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICB0ZXh0ID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldElubmVyVGV4dCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIHZhbHVlVGV4dHNSZWYgPSBSZWFjdC51c2VSZWYoW10pO1xuICB2YWx1ZVRleHRzUmVmLmN1cnJlbnQgPSB2YWx1ZVRleHRzO1xuXG4gIGZ1bmN0aW9uIHRyaWdnZXJUZXh0Q2hhbmdlKHZhbHVlKSB7XG4gICAgc2V0SW5uZXJUZXh0KHZhbHVlKTtcbiAgICBvblRleHRDaGFuZ2UodmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUZXh0KCkge1xuICAgIHNldElubmVyVGV4dCh2YWx1ZVRleHRzUmVmLmN1cnJlbnRbMF0pO1xuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmFsdWVUZXh0cy5ldmVyeShmdW5jdGlvbiAodmFsVGV4dCkge1xuICAgICAgcmV0dXJuIHZhbFRleHQgIT09IHRleHQ7XG4gICAgfSkpIHtcbiAgICAgIHJlc2V0VGV4dCgpO1xuICAgIH1cbiAgfSwgW3ZhbHVlVGV4dHMuam9pbignfHwnKV0pO1xuICByZXR1cm4gW3RleHQsIHRyaWdnZXJUZXh0Q2hhbmdlLCByZXNldFRleHRdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZVZhbHVlVGV4dHM7XG5cbnZhciBfc2hhbGxvd2VxdWFsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwic2hhbGxvd2VxdWFsXCIpKTtcblxudmFyIF91c2VNZW1vID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVtb1wiKSk7XG5cbmZ1bmN0aW9uIHVzZVZhbHVlVGV4dHModmFsdWUsIF9yZWYpIHtcbiAgdmFyIGZvcm1hdExpc3QgPSBfcmVmLmZvcm1hdExpc3QsXG4gICAgICBnZW5lcmF0ZUNvbmZpZyA9IF9yZWYuZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcbiAgcmV0dXJuICgwLCBfdXNlTWVtby5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIFtbJyddLCAnJ107XG4gICAgfSAvLyBXZSB3aWxsIGNvbnZlcnQgZGF0YSBmb3JtYXQgYmFjayB0byBmaXJzdCBmb3JtYXRcblxuXG4gICAgdmFyIGZpcnN0VmFsdWVUZXh0ID0gJyc7XG4gICAgdmFyIGZ1bGxWYWx1ZVRleHRzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hdExpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBmb3JtYXQgPSBmb3JtYXRMaXN0W2ldO1xuICAgICAgdmFyIGZvcm1hdFN0ciA9IGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5mb3JtYXQobG9jYWxlLmxvY2FsZSwgdmFsdWUsIGZvcm1hdCk7XG4gICAgICBmdWxsVmFsdWVUZXh0cy5wdXNoKGZvcm1hdFN0cik7XG5cbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIGZpcnN0VmFsdWVUZXh0ID0gZm9ybWF0U3RyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbZnVsbFZhbHVlVGV4dHMsIGZpcnN0VmFsdWVUZXh0XTtcbiAgfSwgW3ZhbHVlLCBmb3JtYXRMaXN0XSwgZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gcHJldlswXSAhPT0gbmV4dFswXSB8fCAhKDAsIF9zaGFsbG93ZXF1YWwuZGVmYXVsdCkocHJldlsxXSwgbmV4dFsxXSk7XG4gIH0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBpY2tlclBhbmVsXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9QaWNrZXJQYW5lbC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJhbmdlUGlja2VyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9SYW5nZVBpY2tlci5kZWZhdWx0O1xuICB9XG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9QaWNrZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BpY2tlclwiKSk7XG5cbnZhciBfUGlja2VyUGFuZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BpY2tlclBhbmVsXCIpKTtcblxudmFyIF9SYW5nZVBpY2tlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUmFuZ2VQaWNrZXJcIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfUGlja2VyLmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBsb2NhbGUgPSB7XG4gIGxvY2FsZTogJ2VuX1VTJyxcbiAgdG9kYXk6ICdUb2RheScsXG4gIG5vdzogJ05vdycsXG4gIGJhY2tUb1RvZGF5OiAnQmFjayB0byB0b2RheScsXG4gIG9rOiAnT2snLFxuICBjbGVhcjogJ0NsZWFyJyxcbiAgbW9udGg6ICdNb250aCcsXG4gIHllYXI6ICdZZWFyJyxcbiAgdGltZVNlbGVjdDogJ3NlbGVjdCB0aW1lJyxcbiAgZGF0ZVNlbGVjdDogJ3NlbGVjdCBkYXRlJyxcbiAgd2Vla1NlbGVjdDogJ0Nob29zZSBhIHdlZWsnLFxuICBtb250aFNlbGVjdDogJ0Nob29zZSBhIG1vbnRoJyxcbiAgeWVhclNlbGVjdDogJ0Nob29zZSBhIHllYXInLFxuICBkZWNhZGVTZWxlY3Q6ICdDaG9vc2UgYSBkZWNhZGUnLFxuICB5ZWFyRm9ybWF0OiAnWVlZWScsXG4gIGRhdGVGb3JtYXQ6ICdNL0QvWVlZWScsXG4gIGRheUZvcm1hdDogJ0QnLFxuICBkYXRlVGltZUZvcm1hdDogJ00vRC9ZWVlZIEhIOm1tOnNzJyxcbiAgbW9udGhCZWZvcmVZZWFyOiB0cnVlLFxuICBwcmV2aW91c01vbnRoOiAnUHJldmlvdXMgbW9udGggKFBhZ2VVcCknLFxuICBuZXh0TW9udGg6ICdOZXh0IG1vbnRoIChQYWdlRG93biknLFxuICBwcmV2aW91c1llYXI6ICdMYXN0IHllYXIgKENvbnRyb2wgKyBsZWZ0KScsXG4gIG5leHRZZWFyOiAnTmV4dCB5ZWFyIChDb250cm9sICsgcmlnaHQpJyxcbiAgcHJldmlvdXNEZWNhZGU6ICdMYXN0IGRlY2FkZScsXG4gIG5leHREZWNhZGU6ICdOZXh0IGRlY2FkZScsXG4gIHByZXZpb3VzQ2VudHVyeTogJ0xhc3QgY2VudHVyeScsXG4gIG5leHRDZW50dXJ5OiAnTmV4dCBjZW50dXJ5J1xufTtcbnZhciBfZGVmYXVsdCA9IGxvY2FsZTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9kYXRlVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9kYXRlVXRpbFwiKTtcblxudmFyIF9SYW5nZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9SYW5nZUNvbnRleHRcIikpO1xuXG52YXIgX3VzZUNlbGxDbGFzc05hbWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9ob29rcy91c2VDZWxsQ2xhc3NOYW1lXCIpKTtcblxudmFyIF9QYW5lbEJvZHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9QYW5lbEJvZHlcIikpO1xuXG5mdW5jdGlvbiBEYXRlQm9keShwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICAgIHByZWZpeENvbHVtbiA9IHByb3BzLnByZWZpeENvbHVtbixcbiAgICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICAgIHJvd0NvdW50ID0gcHJvcHMucm93Q291bnQsXG4gICAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGRhdGVSZW5kZXIgPSBwcm9wcy5kYXRlUmVuZGVyO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1JhbmdlQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgICBob3ZlclJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQuaG92ZXJSYW5nZWRWYWx1ZTtcblxuICB2YXIgYmFzZURhdGUgPSAoMCwgX2RhdGVVdGlsLmdldFdlZWtTdGFydERhdGUpKGxvY2FsZS5sb2NhbGUsIGdlbmVyYXRlQ29uZmlnLCB2aWV3RGF0ZSk7XG4gIHZhciBjZWxsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpO1xuICB2YXIgd2Vla0ZpcnN0RGF5ID0gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFdlZWtGaXJzdERheShsb2NhbGUubG9jYWxlKTtcbiAgdmFyIHRvZGF5ID0gZ2VuZXJhdGVDb25maWcuZ2V0Tm93KCk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIZWFkZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGhlYWRlckNlbGxzID0gW107XG4gIHZhciB3ZWVrRGF5c0xvY2FsZSA9IGxvY2FsZS5zaG9ydFdlZWtEYXlzIHx8IChnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0U2hvcnRXZWVrRGF5cyA/IGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5nZXRTaG9ydFdlZWtEYXlzKGxvY2FsZS5sb2NhbGUpIDogW10pO1xuXG4gIGlmIChwcmVmaXhDb2x1bW4pIHtcbiAgICBoZWFkZXJDZWxscy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB7XG4gICAgICBrZXk6IFwiZW1wdHlcIixcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiBcImVtcHR5IGNlbGxcIlxuICAgIH0pKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgX2RhdGVVdGlsLldFRUtfREFZX0NPVU5UOyBpICs9IDEpIHtcbiAgICBoZWFkZXJDZWxscy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB7XG4gICAgICBrZXk6IGlcbiAgICB9LCB3ZWVrRGF5c0xvY2FsZVsoaSArIHdlZWtGaXJzdERheSkgJSBfZGF0ZVV0aWwuV0VFS19EQVlfQ09VTlRdKSk7XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBnZXRDZWxsQ2xhc3NOYW1lID0gKDAsIF91c2VDZWxsQ2xhc3NOYW1lLmRlZmF1bHQpKHtcbiAgICBjZWxsUHJlZml4Q2xzOiBjZWxsUHJlZml4Q2xzLFxuICAgIHRvZGF5OiB0b2RheSxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIHJhbmdlZFZhbHVlOiBwcmVmaXhDb2x1bW4gPyBudWxsIDogcmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZTogcHJlZml4Q29sdW1uID8gbnVsbCA6IGhvdmVyUmFuZ2VkVmFsdWUsXG4gICAgaXNTYW1lQ2VsbDogZnVuY3Rpb24gaXNTYW1lQ2VsbChjdXJyZW50LCB0YXJnZXQpIHtcbiAgICAgIHJldHVybiAoMCwgX2RhdGVVdGlsLmlzU2FtZURhdGUpKGdlbmVyYXRlQ29uZmlnLCBjdXJyZW50LCB0YXJnZXQpO1xuICAgIH0sXG4gICAgaXNJblZpZXc6IGZ1bmN0aW9uIGlzSW5WaWV3KGRhdGUpIHtcbiAgICAgIHJldHVybiAoMCwgX2RhdGVVdGlsLmlzU2FtZU1vbnRoKShnZW5lcmF0ZUNvbmZpZywgZGF0ZSwgdmlld0RhdGUpO1xuICAgIH0sXG4gICAgb2Zmc2V0Q2VsbDogZnVuY3Rpb24gb2Zmc2V0Q2VsbChkYXRlLCBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5hZGREYXRlKGRhdGUsIG9mZnNldCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIGdldENlbGxOb2RlID0gZGF0ZVJlbmRlciA/IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGVSZW5kZXIoZGF0ZSwgdG9kYXkpO1xuICB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfUGFuZWxCb2R5LmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcm93TnVtOiByb3dDb3VudCxcbiAgICBjb2xOdW06IF9kYXRlVXRpbC5XRUVLX0RBWV9DT1VOVCxcbiAgICBiYXNlRGF0ZTogYmFzZURhdGUsXG4gICAgZ2V0Q2VsbE5vZGU6IGdldENlbGxOb2RlLFxuICAgIGdldENlbGxUZXh0OiBnZW5lcmF0ZUNvbmZpZy5nZXREYXRlLFxuICAgIGdldENlbGxDbGFzc05hbWU6IGdldENlbGxDbGFzc05hbWUsXG4gICAgZ2V0Q2VsbERhdGU6IGdlbmVyYXRlQ29uZmlnLmFkZERhdGUsXG4gICAgdGl0bGVDZWxsOiBmdW5jdGlvbiB0aXRsZUNlbGwoZGF0ZSkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5mb3JtYXQobG9jYWxlLmxvY2FsZSwgZGF0ZSwgJ1lZWVktTU0tREQnKTtcbiAgICB9LFxuICAgIGhlYWRlckNlbGxzOiBoZWFkZXJDZWxsc1xuICB9KSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IERhdGVCb2R5O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0hlYWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL0hlYWRlclwiKSk7XG5cbnZhciBfUGFuZWxDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vUGFuZWxDb250ZXh0XCIpKTtcblxuZnVuY3Rpb24gRGF0ZUhlYWRlcihwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgICBvbk5leHRNb250aCA9IHByb3BzLm9uTmV4dE1vbnRoLFxuICAgICAgb25QcmV2TW9udGggPSBwcm9wcy5vblByZXZNb250aCxcbiAgICAgIG9uTmV4dFllYXIgPSBwcm9wcy5vbk5leHRZZWFyLFxuICAgICAgb25QcmV2WWVhciA9IHByb3BzLm9uUHJldlllYXIsXG4gICAgICBvblllYXJDbGljayA9IHByb3BzLm9uWWVhckNsaWNrLFxuICAgICAgb25Nb250aENsaWNrID0gcHJvcHMub25Nb250aENsaWNrO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1BhbmVsQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIGhpZGVIZWFkZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlSGVhZGVyO1xuXG4gIGlmIChoaWRlSGVhZGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgaGVhZGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIik7XG4gIHZhciBtb250aHNMb2NhbGUgPSBsb2NhbGUuc2hvcnRNb250aHMgfHwgKGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5nZXRTaG9ydE1vbnRocyA/IGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5nZXRTaG9ydE1vbnRocyhsb2NhbGUubG9jYWxlKSA6IFtdKTtcbiAgdmFyIG1vbnRoID0gZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgodmlld0RhdGUpOyAvLyA9PT09PT09PT09PT09PT09PT09IE1vbnRoICYgWWVhciA9PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIHllYXJOb2RlID0gUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBrZXk6IFwieWVhclwiLFxuICAgIG9uQ2xpY2s6IG9uWWVhckNsaWNrLFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCIteWVhci1idG5cIilcbiAgfSwgZ2VuZXJhdGVDb25maWcubG9jYWxlLmZvcm1hdChsb2NhbGUubG9jYWxlLCB2aWV3RGF0ZSwgbG9jYWxlLnllYXJGb3JtYXQpKTtcbiAgdmFyIG1vbnRoTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAga2V5OiBcIm1vbnRoXCIsXG4gICAgb25DbGljazogb25Nb250aENsaWNrLFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW9udGgtYnRuXCIpXG4gIH0sIGxvY2FsZS5tb250aEZvcm1hdCA/IGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5mb3JtYXQobG9jYWxlLmxvY2FsZSwgdmlld0RhdGUsIGxvY2FsZS5tb250aEZvcm1hdCkgOiBtb250aHNMb2NhbGVbbW9udGhdKTtcbiAgdmFyIG1vbnRoWWVhck5vZGVzID0gbG9jYWxlLm1vbnRoQmVmb3JlWWVhciA/IFttb250aE5vZGUsIHllYXJOb2RlXSA6IFt5ZWFyTm9kZSwgbW9udGhOb2RlXTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0hlYWRlci5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogaGVhZGVyUHJlZml4Q2xzLFxuICAgIG9uU3VwZXJQcmV2OiBvblByZXZZZWFyLFxuICAgIG9uUHJldjogb25QcmV2TW9udGgsXG4gICAgb25OZXh0OiBvbk5leHRNb250aCxcbiAgICBvblN1cGVyTmV4dDogb25OZXh0WWVhclxuICB9KSwgbW9udGhZZWFyTm9kZXMpO1xufVxuXG52YXIgX2RlZmF1bHQgPSBEYXRlSGVhZGVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9EYXRlQm9keSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRGF0ZUJvZHlcIikpO1xuXG52YXIgX0RhdGVIZWFkZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0RhdGVIZWFkZXJcIikpO1xuXG52YXIgX2RhdGVVdGlsID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzL2RhdGVVdGlsXCIpO1xuXG52YXIgX3VpVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy91aVV0aWxcIik7XG5cbnZhciBEQVRFX1JPV19DT1VOVCA9IDY7XG5cbmZ1bmN0aW9uIERhdGVQYW5lbChwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgX3Byb3BzJHBhbmVsTmFtZSA9IHByb3BzLnBhbmVsTmFtZSxcbiAgICAgIHBhbmVsTmFtZSA9IF9wcm9wcyRwYW5lbE5hbWUgPT09IHZvaWQgMCA/ICdkYXRlJyA6IF9wcm9wcyRwYW5lbE5hbWUsXG4gICAgICBrZXlib2FyZENvbmZpZyA9IHByb3BzLmtleWJvYXJkQ29uZmlnLFxuICAgICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgICAgb3BlcmF0aW9uUmVmID0gcHJvcHMub3BlcmF0aW9uUmVmLFxuICAgICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgICAgb25WaWV3RGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld0RhdGVDaGFuZ2UsXG4gICAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZSxcbiAgICAgIF9vblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0O1xuICB2YXIgcGFuZWxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQocGFuZWxOYW1lLCBcIi1wYW5lbFwiKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBvcGVyYXRpb25SZWYuY3VycmVudCA9IHtcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgcmV0dXJuICgwLCBfdWlVdGlsLmNyZWF0ZUtleURvd25IYW5kbGVyKShldmVudCwgKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHtcbiAgICAgICAgb25MZWZ0UmlnaHQ6IGZ1bmN0aW9uIG9uTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkRGF0ZSh2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DdHJsTGVmdFJpZ2h0OiBmdW5jdGlvbiBvbkN0cmxMZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZhbHVlIHx8IHZpZXdEYXRlLCBkaWZmKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwRG93bjogZnVuY3Rpb24gb25VcERvd24oZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGREYXRlKHZhbHVlIHx8IHZpZXdEYXRlLCBkaWZmICogX2RhdGVVdGlsLldFRUtfREFZX0NPVU5UKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvblBhZ2VVcERvd246IGZ1bmN0aW9uIG9uUGFnZVVwRG93bihkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZE1vbnRoKHZhbHVlIHx8IHZpZXdEYXRlLCBkaWZmKSwgJ2tleScpO1xuICAgICAgICB9XG4gICAgICB9LCBrZXlib2FyZENvbmZpZykpO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT0gVmlldyBPcGVyYXRpb24gPT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgb25ZZWFyQ2hhbmdlID0gZnVuY3Rpb24gb25ZZWFyQ2hhbmdlKGRpZmYpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcblxuICB2YXIgb25Nb250aENoYW5nZSA9IGZ1bmN0aW9uIG9uTW9udGhDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkocGFuZWxQcmVmaXhDbHMsICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwYW5lbFByZWZpeENscywgXCItYWN0aXZlXCIpLCBhY3RpdmUpKVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9EYXRlSGVhZGVyLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHZpZXdEYXRlOiB2aWV3RGF0ZSxcbiAgICAvLyBWaWV3IE9wZXJhdGlvblxuICAgIG9uUHJldlllYXI6IGZ1bmN0aW9uIG9uUHJldlllYXIoKSB7XG4gICAgICBvblllYXJDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0WWVhcjogZnVuY3Rpb24gb25OZXh0WWVhcigpIHtcbiAgICAgIG9uWWVhckNoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uUHJldk1vbnRoOiBmdW5jdGlvbiBvblByZXZNb250aCgpIHtcbiAgICAgIG9uTW9udGhDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0TW9udGg6IGZ1bmN0aW9uIG9uTmV4dE1vbnRoKCkge1xuICAgICAgb25Nb250aENoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uTW9udGhDbGljazogZnVuY3Rpb24gb25Nb250aENsaWNrKCkge1xuICAgICAgb25QYW5lbENoYW5nZSgnbW9udGgnLCB2aWV3RGF0ZSk7XG4gICAgfSxcbiAgICBvblllYXJDbGljazogZnVuY3Rpb24gb25ZZWFyQ2xpY2soKSB7XG4gICAgICBvblBhbmVsQ2hhbmdlKCd5ZWFyJywgdmlld0RhdGUpO1xuICAgIH1cbiAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9EYXRlQm9keS5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlKSB7XG4gICAgICByZXR1cm4gX29uU2VsZWN0KGRhdGUsICdtb3VzZScpO1xuICAgIH0sXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHZpZXdEYXRlOiB2aWV3RGF0ZSxcbiAgICByb3dDb3VudDogREFURV9ST1dfQ09VTlRcbiAgfSkpKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gRGF0ZVBhbmVsO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvS2V5Q29kZVwiKSk7XG5cbnZhciBfRGF0ZVBhbmVsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vRGF0ZVBhbmVsXCIpKTtcblxudmFyIF9UaW1lUGFuZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9UaW1lUGFuZWxcIikpO1xuXG52YXIgX21pc2NVdGlsID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzL21pc2NVdGlsXCIpO1xuXG5mdW5jdGlvbiBzZXRUaW1lKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBkZWZhdWx0RGF0ZSkge1xuICBpZiAoIWRlZmF1bHREYXRlKSB7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICB2YXIgbmV3RGF0ZSA9IGRhdGU7XG4gIG5ld0RhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRIb3VyKG5ld0RhdGUsIGdlbmVyYXRlQ29uZmlnLmdldEhvdXIoZGVmYXVsdERhdGUpKTtcbiAgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldE1pbnV0ZShuZXdEYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUoZGVmYXVsdERhdGUpKTtcbiAgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldFNlY29uZChuZXdEYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRTZWNvbmQoZGVmYXVsdERhdGUpKTtcbiAgcmV0dXJuIG5ld0RhdGU7XG59XG5cbnZhciBBQ1RJVkVfUEFORUwgPSAoMCwgX21pc2NVdGlsLnR1cGxlKSgnZGF0ZScsICd0aW1lJyk7XG5cbmZ1bmN0aW9uIERhdGV0aW1lUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIG9wZXJhdGlvblJlZiA9IHByb3BzLm9wZXJhdGlvblJlZixcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgZGlzYWJsZWRUaW1lID0gcHJvcHMuZGlzYWJsZWRUaW1lLFxuICAgICAgc2hvd1RpbWUgPSBwcm9wcy5zaG93VGltZSxcbiAgICAgIG9uU2VsZWN0ID0gcHJvcHMub25TZWxlY3Q7XG4gIHZhciBwYW5lbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGF0ZXRpbWUtcGFuZWxcIik7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGFjdGl2ZVBhbmVsID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldEFjdGl2ZVBhbmVsID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgZGF0ZU9wZXJhdGlvblJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIHZhciB0aW1lT3BlcmF0aW9uUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgdmFyIHRpbWVQcm9wcyA9ICgwLCBfdHlwZW9mMi5kZWZhdWx0KShzaG93VGltZSkgPT09ICdvYmplY3QnID8gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzaG93VGltZSkgOiB7fTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBnZXROZXh0QWN0aXZlKG9mZnNldCkge1xuICAgIHZhciBhY3RpdmVJbmRleCA9IEFDVElWRV9QQU5FTC5pbmRleE9mKGFjdGl2ZVBhbmVsKSArIG9mZnNldDtcbiAgICB2YXIgbmV4dEFjdGl2ZVBhbmVsID0gQUNUSVZFX1BBTkVMW2FjdGl2ZUluZGV4XSB8fCBudWxsO1xuICAgIHJldHVybiBuZXh0QWN0aXZlUGFuZWw7XG4gIH1cblxuICB2YXIgb25CbHVyID0gZnVuY3Rpb24gb25CbHVyKGUpIHtcbiAgICBpZiAodGltZU9wZXJhdGlvblJlZi5jdXJyZW50Lm9uQmx1cikge1xuICAgICAgdGltZU9wZXJhdGlvblJlZi5jdXJyZW50Lm9uQmx1cihlKTtcbiAgICB9XG5cbiAgICBzZXRBY3RpdmVQYW5lbChudWxsKTtcbiAgfTtcblxuICBvcGVyYXRpb25SZWYuY3VycmVudCA9IHtcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgLy8gU3dpdGNoIGFjdGl2ZSBwYW5lbFxuICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBfS2V5Q29kZS5kZWZhdWx0LlRBQikge1xuICAgICAgICB2YXIgbmV4dEFjdGl2ZVBhbmVsID0gZ2V0TmV4dEFjdGl2ZShldmVudC5zaGlmdEtleSA/IC0xIDogMSk7XG4gICAgICAgIHNldEFjdGl2ZVBhbmVsKG5leHRBY3RpdmVQYW5lbCk7XG5cbiAgICAgICAgaWYgKG5leHRBY3RpdmVQYW5lbCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gT3BlcmF0ZSBvbiBjdXJyZW50IGFjdGl2ZSBwYW5lbFxuXG5cbiAgICAgIGlmIChhY3RpdmVQYW5lbCkge1xuICAgICAgICB2YXIgcmVmID0gYWN0aXZlUGFuZWwgPT09ICdkYXRlJyA/IGRhdGVPcGVyYXRpb25SZWYgOiB0aW1lT3BlcmF0aW9uUmVmO1xuXG4gICAgICAgIGlmIChyZWYuY3VycmVudCAmJiByZWYuY3VycmVudC5vbktleURvd24pIHtcbiAgICAgICAgICByZWYuY3VycmVudC5vbktleURvd24oZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIFN3aXRjaCBmaXJzdCBhY3RpdmUgcGFuZWwgaWYgb3BlcmF0ZSB3aXRob3V0IHBhbmVsXG5cblxuICAgICAgaWYgKFtfS2V5Q29kZS5kZWZhdWx0LkxFRlQsIF9LZXlDb2RlLmRlZmF1bHQuUklHSFQsIF9LZXlDb2RlLmRlZmF1bHQuVVAsIF9LZXlDb2RlLmRlZmF1bHQuRE9XTl0uaW5jbHVkZXMoZXZlbnQud2hpY2gpKSB7XG4gICAgICAgIHNldEFjdGl2ZVBhbmVsKCdkYXRlJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBvbkNsb3NlOiBvbkJsdXJcbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgb25JbnRlcm5hbFNlbGVjdCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWxlY3QoZGF0ZSwgc291cmNlKSB7XG4gICAgdmFyIHNlbGVjdGVkRGF0ZSA9IGRhdGU7XG5cbiAgICBpZiAoc291cmNlID09PSAnZGF0ZScgJiYgIXZhbHVlICYmIHRpbWVQcm9wcy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIC8vIERhdGUgd2l0aCB0aW1lIGRlZmF1bHRWYWx1ZVxuICAgICAgc2VsZWN0ZWREYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0SG91cihzZWxlY3RlZERhdGUsIGdlbmVyYXRlQ29uZmlnLmdldEhvdXIodGltZVByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgICAgc2VsZWN0ZWREYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0TWludXRlKHNlbGVjdGVkRGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0TWludXRlKHRpbWVQcm9wcy5kZWZhdWx0VmFsdWUpKTtcbiAgICAgIHNlbGVjdGVkRGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldFNlY29uZChzZWxlY3RlZERhdGUsIGdlbmVyYXRlQ29uZmlnLmdldFNlY29uZCh0aW1lUHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfSBlbHNlIGlmIChzb3VyY2UgPT09ICd0aW1lJyAmJiAhdmFsdWUgJiYgZGVmYXVsdFZhbHVlKSB7XG4gICAgICBzZWxlY3RlZERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRZZWFyKHNlbGVjdGVkRGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkZWZhdWx0VmFsdWUpKTtcbiAgICAgIHNlbGVjdGVkRGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldE1vbnRoKHNlbGVjdGVkRGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZGVmYXVsdFZhbHVlKSk7XG4gICAgICBzZWxlY3RlZERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXREYXRlKHNlbGVjdGVkRGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0RGF0ZShkZWZhdWx0VmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgIG9uU2VsZWN0KHNlbGVjdGVkRGF0ZSwgJ21vdXNlJyk7XG4gICAgfVxuICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIGRpc2FibGVkVGltZXMgPSBkaXNhYmxlZFRpbWUgPyBkaXNhYmxlZFRpbWUodmFsdWUgfHwgbnVsbCkgOiB7fTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHBhbmVsUHJlZml4Q2xzLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQocGFuZWxQcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlUGFuZWwpKVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9EYXRlUGFuZWwuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBvcGVyYXRpb25SZWY6IGRhdGVPcGVyYXRpb25SZWYsXG4gICAgYWN0aXZlOiBhY3RpdmVQYW5lbCA9PT0gJ2RhdGUnLFxuICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlKSB7XG4gICAgICBvbkludGVybmFsU2VsZWN0KHNldFRpbWUoZ2VuZXJhdGVDb25maWcsIGRhdGUsIHNob3dUaW1lICYmICgwLCBfdHlwZW9mMi5kZWZhdWx0KShzaG93VGltZSkgPT09ICdvYmplY3QnID8gc2hvd1RpbWUuZGVmYXVsdFZhbHVlIDogbnVsbCksICdkYXRlJyk7XG4gICAgfVxuICB9KSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1RpbWVQYW5lbC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGZvcm1hdDogdW5kZWZpbmVkXG4gIH0sIHRpbWVQcm9wcywgZGlzYWJsZWRUaW1lcywge1xuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIG9wZXJhdGlvblJlZjogdGltZU9wZXJhdGlvblJlZixcbiAgICBhY3RpdmU6IGFjdGl2ZVBhbmVsID09PSAndGltZScsXG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIG9uSW50ZXJuYWxTZWxlY3QoZGF0ZSwgJ3RpbWUnKTtcbiAgICB9XG4gIH0pKSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IERhdGV0aW1lUGFuZWw7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLkRFQ0FERV9DT0xfQ09VTlQgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfID0gcmVxdWlyZShcIi5cIik7XG5cbnZhciBfUGFuZWxCb2R5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vUGFuZWxCb2R5XCIpKTtcblxudmFyIERFQ0FERV9DT0xfQ09VTlQgPSAzO1xuZXhwb3J0cy5ERUNBREVfQ09MX0NPVU5UID0gREVDQURFX0NPTF9DT1VOVDtcbnZhciBERUNBREVfUk9XX0NPVU5UID0gNDtcblxuZnVuY3Rpb24gRGVjYWRlQm9keShwcm9wcykge1xuICB2YXIgREVDQURFX1VOSVRfRElGRl9ERVMgPSBfLkRFQ0FERV9VTklUX0RJRkYgLSAxO1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICBkaXNhYmxlZERhdGUgPSBwcm9wcy5kaXNhYmxlZERhdGU7XG4gIHZhciBjZWxsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpO1xuICB2YXIgeWVhck51bWJlciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIodmlld0RhdGUpO1xuXG4gIHZhciBkZWNhZGVZZWFyTnVtYmVyID0gTWF0aC5mbG9vcih5ZWFyTnVtYmVyIC8gXy5ERUNBREVfVU5JVF9ESUZGKSAqIF8uREVDQURFX1VOSVRfRElGRjtcblxuICB2YXIgc3RhcnREZWNhZGVZZWFyID0gTWF0aC5mbG9vcih5ZWFyTnVtYmVyIC8gXy5ERUNBREVfRElTVEFOQ0VfQ09VTlQpICogXy5ERUNBREVfRElTVEFOQ0VfQ09VTlQ7XG5cbiAgdmFyIGVuZERlY2FkZVllYXIgPSBzdGFydERlY2FkZVllYXIgKyBfLkRFQ0FERV9ESVNUQU5DRV9DT1VOVCAtIDE7XG4gIHZhciBiYXNlRGVjYWRlWWVhciA9IGdlbmVyYXRlQ29uZmlnLnNldFllYXIodmlld0RhdGUsIHN0YXJ0RGVjYWRlWWVhciAtIE1hdGguY2VpbCgoREVDQURFX0NPTF9DT1VOVCAqIERFQ0FERV9ST1dfQ09VTlQgKiBfLkRFQ0FERV9VTklUX0RJRkYgLSBfLkRFQ0FERV9ESVNUQU5DRV9DT1VOVCkgLyAyKSk7XG5cbiAgdmFyIGdldENlbGxDbGFzc05hbWUgPSBmdW5jdGlvbiBnZXRDZWxsQ2xhc3NOYW1lKGRhdGUpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBkaXNhYmxlZCA9IGRpc2FibGVkRGF0ZSAmJiBkaXNhYmxlZERhdGUoZGF0ZSk7XG4gICAgdmFyIHN0YXJ0RGVjYWRlTnVtYmVyID0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkYXRlKTtcbiAgICB2YXIgZW5kRGVjYWRlTnVtYmVyID0gc3RhcnREZWNhZGVOdW1iZXIgKyBERUNBREVfVU5JVF9ESUZGX0RFUztcbiAgICByZXR1cm4gX3JlZiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1pbi12aWV3XCIpLCBzdGFydERlY2FkZVllYXIgPD0gc3RhcnREZWNhZGVOdW1iZXIgJiYgZW5kRGVjYWRlTnVtYmVyIDw9IGVuZERlY2FkZVllYXIpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1zZWxlY3RlZFwiKSwgc3RhcnREZWNhZGVOdW1iZXIgPT09IGRlY2FkZVllYXJOdW1iZXIpLCBfcmVmO1xuICB9O1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9QYW5lbEJvZHkuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByb3dOdW06IERFQ0FERV9ST1dfQ09VTlQsXG4gICAgY29sTnVtOiBERUNBREVfQ09MX0NPVU5ULFxuICAgIGJhc2VEYXRlOiBiYXNlRGVjYWRlWWVhcixcbiAgICBnZXRDZWxsVGV4dDogZnVuY3Rpb24gZ2V0Q2VsbFRleHQoZGF0ZSkge1xuICAgICAgdmFyIHN0YXJ0RGVjYWRlTnVtYmVyID0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkYXRlKTtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChzdGFydERlY2FkZU51bWJlciwgXCItXCIpLmNvbmNhdChzdGFydERlY2FkZU51bWJlciArIERFQ0FERV9VTklUX0RJRkZfREVTKTtcbiAgICB9LFxuICAgIGdldENlbGxDbGFzc05hbWU6IGdldENlbGxDbGFzc05hbWUsXG4gICAgZ2V0Q2VsbERhdGU6IGZ1bmN0aW9uIGdldENlbGxEYXRlKGRhdGUsIG9mZnNldCkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmFkZFllYXIoZGF0ZSwgb2Zmc2V0ICogXy5ERUNBREVfVU5JVF9ESUZGKTtcbiAgICB9XG4gIH0pKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gRGVjYWRlQm9keTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9IZWFkZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9IZWFkZXJcIikpO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuXCIpO1xuXG52YXIgX1BhbmVsQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL1BhbmVsQ29udGV4dFwiKSk7XG5cbmZ1bmN0aW9uIERlY2FkZUhlYWRlcihwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgICBvblByZXZEZWNhZGVzID0gcHJvcHMub25QcmV2RGVjYWRlcyxcbiAgICAgIG9uTmV4dERlY2FkZXMgPSBwcm9wcy5vbk5leHREZWNhZGVzO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1BhbmVsQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIGhpZGVIZWFkZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlSGVhZGVyO1xuXG4gIGlmIChoaWRlSGVhZGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgaGVhZGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIik7XG4gIHZhciB5ZWFyTnVtYmVyID0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcih2aWV3RGF0ZSk7XG5cbiAgdmFyIHN0YXJ0WWVhciA9IE1hdGguZmxvb3IoeWVhck51bWJlciAvIF8uREVDQURFX0RJU1RBTkNFX0NPVU5UKSAqIF8uREVDQURFX0RJU1RBTkNFX0NPVU5UO1xuXG4gIHZhciBlbmRZZWFyID0gc3RhcnRZZWFyICsgXy5ERUNBREVfRElTVEFOQ0VfQ09VTlQgLSAxO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfSGVhZGVyLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBoZWFkZXJQcmVmaXhDbHMsXG4gICAgb25TdXBlclByZXY6IG9uUHJldkRlY2FkZXMsXG4gICAgb25TdXBlck5leHQ6IG9uTmV4dERlY2FkZXNcbiAgfSksIHN0YXJ0WWVhciwgXCItXCIsIGVuZFllYXIpO1xufVxuXG52YXIgX2RlZmF1bHQgPSBEZWNhZGVIZWFkZXI7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLkRFQ0FERV9ESVNUQU5DRV9DT1VOVCA9IGV4cG9ydHMuREVDQURFX1VOSVRfRElGRiA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9EZWNhZGVIZWFkZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0RlY2FkZUhlYWRlclwiKSk7XG5cbnZhciBfRGVjYWRlQm9keSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL0RlY2FkZUJvZHlcIikpO1xuXG52YXIgX3VpVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy91aVV0aWxcIik7XG5cbnZhciBERUNBREVfVU5JVF9ESUZGID0gMTA7XG5leHBvcnRzLkRFQ0FERV9VTklUX0RJRkYgPSBERUNBREVfVU5JVF9ESUZGO1xudmFyIERFQ0FERV9ESVNUQU5DRV9DT1VOVCA9IERFQ0FERV9VTklUX0RJRkYgKiAxMDtcbmV4cG9ydHMuREVDQURFX0RJU1RBTkNFX0NPVU5UID0gREVDQURFX0RJU1RBTkNFX0NPVU5UO1xuXG5mdW5jdGlvbiBEZWNhZGVQYW5lbChwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgb25WaWV3RGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld0RhdGVDaGFuZ2UsXG4gICAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICAgIG9wZXJhdGlvblJlZiA9IHByb3BzLm9wZXJhdGlvblJlZixcbiAgICAgIG9uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZTtcbiAgdmFyIHBhbmVsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kZWNhZGUtcGFuZWxcIik7IC8vID09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIHJldHVybiAoMCwgX3VpVXRpbC5jcmVhdGVLZXlEb3duSGFuZGxlcikoZXZlbnQsIHtcbiAgICAgICAgb25MZWZ0UmlnaHQ6IGZ1bmN0aW9uIG9uTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBvblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZpZXdEYXRlLCBkaWZmICogREVDQURFX1VOSVRfRElGRiksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DdHJsTGVmdFJpZ2h0OiBmdW5jdGlvbiBvbkN0cmxMZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIG9uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYgKiBERUNBREVfRElTVEFOQ0VfQ09VTlQpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVXBEb3duOiBmdW5jdGlvbiBvblVwRG93bihkaWZmKSB7XG4gICAgICAgICAgb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZiAqIERFQ0FERV9VTklUX0RJRkYgKiBfRGVjYWRlQm9keS5ERUNBREVfQ09MX0NPVU5UKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVudGVyOiBmdW5jdGlvbiBvbkVudGVyKCkge1xuICAgICAgICAgIG9uUGFuZWxDaGFuZ2UoJ3llYXInLCB2aWV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT0gVmlldyBPcGVyYXRpb24gPT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgb25EZWNhZGVzQ2hhbmdlID0gZnVuY3Rpb24gb25EZWNhZGVzQ2hhbmdlKGRpZmYpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYgKiBERUNBREVfRElTVEFOQ0VfQ09VTlQpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcblxuICB2YXIgb25JbnRlcm5hbFNlbGVjdCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWxlY3QoZGF0ZSkge1xuICAgIG9uU2VsZWN0KGRhdGUsICdtb3VzZScpO1xuICAgIG9uUGFuZWxDaGFuZ2UoJ3llYXInLCBkYXRlKTtcbiAgfTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBwYW5lbFByZWZpeENsc1xuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9EZWNhZGVIZWFkZXIuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblByZXZEZWNhZGVzOiBmdW5jdGlvbiBvblByZXZEZWNhZGVzKCkge1xuICAgICAgb25EZWNhZGVzQ2hhbmdlKC0xKTtcbiAgICB9LFxuICAgIG9uTmV4dERlY2FkZXM6IGZ1bmN0aW9uIG9uTmV4dERlY2FkZXMoKSB7XG4gICAgICBvbkRlY2FkZXNDaGFuZ2UoMSk7XG4gICAgfVxuICB9KSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0RlY2FkZUJvZHkuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblNlbGVjdDogb25JbnRlcm5hbFNlbGVjdFxuICB9KSkpO1xufVxuXG52YXIgX2RlZmF1bHQgPSBEZWNhZGVQYW5lbDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9QYW5lbENvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9QYW5lbENvbnRleHRcIikpO1xuXG52YXIgSElEREVOX1NUWUxFID0ge1xuICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xufTtcblxuZnVuY3Rpb24gSGVhZGVyKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgX3JlZiRwcmV2SWNvbiA9IF9yZWYucHJldkljb24sXG4gICAgICBwcmV2SWNvbiA9IF9yZWYkcHJldkljb24gPT09IHZvaWQgMCA/IFwiXFx1MjAzOVwiIDogX3JlZiRwcmV2SWNvbixcbiAgICAgIF9yZWYkbmV4dEljb24gPSBfcmVmLm5leHRJY29uLFxuICAgICAgbmV4dEljb24gPSBfcmVmJG5leHRJY29uID09PSB2b2lkIDAgPyBcIlxcdTIwM0FcIiA6IF9yZWYkbmV4dEljb24sXG4gICAgICBfcmVmJHN1cGVyUHJldkljb24gPSBfcmVmLnN1cGVyUHJldkljb24sXG4gICAgICBzdXBlclByZXZJY29uID0gX3JlZiRzdXBlclByZXZJY29uID09PSB2b2lkIDAgPyBcIlxceEFCXCIgOiBfcmVmJHN1cGVyUHJldkljb24sXG4gICAgICBfcmVmJHN1cGVyTmV4dEljb24gPSBfcmVmLnN1cGVyTmV4dEljb24sXG4gICAgICBzdXBlck5leHRJY29uID0gX3JlZiRzdXBlck5leHRJY29uID09PSB2b2lkIDAgPyBcIlxceEJCXCIgOiBfcmVmJHN1cGVyTmV4dEljb24sXG4gICAgICBvblN1cGVyUHJldiA9IF9yZWYub25TdXBlclByZXYsXG4gICAgICBvblN1cGVyTmV4dCA9IF9yZWYub25TdXBlck5leHQsXG4gICAgICBvblByZXYgPSBfcmVmLm9uUHJldixcbiAgICAgIG9uTmV4dCA9IF9yZWYub25OZXh0LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1BhbmVsQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIGhpZGVOZXh0QnRuID0gX1JlYWN0JHVzZUNvbnRleHQuaGlkZU5leHRCdG4sXG4gICAgICBoaWRlUHJldkJ0biA9IF9SZWFjdCR1c2VDb250ZXh0LmhpZGVQcmV2QnRuO1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHByZWZpeENsc1xuICB9LCBvblN1cGVyUHJldiAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIG9uQ2xpY2s6IG9uU3VwZXJQcmV2LFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VwZXItcHJldi1idG5cIiksXG4gICAgc3R5bGU6IGhpZGVQcmV2QnRuID8gSElEREVOX1NUWUxFIDoge31cbiAgfSwgc3VwZXJQcmV2SWNvbiksIG9uUHJldiAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIG9uQ2xpY2s6IG9uUHJldixcbiAgICB0YWJJbmRleDogLTEsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXByZXYtYnRuXCIpLFxuICAgIHN0eWxlOiBoaWRlUHJldkJ0biA/IEhJRERFTl9TVFlMRSA6IHt9XG4gIH0sIHByZXZJY29uKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXZpZXdcIilcbiAgfSwgY2hpbGRyZW4pLCBvbk5leHQgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBvbkNsaWNrOiBvbk5leHQsXG4gICAgdGFiSW5kZXg6IC0xLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uZXh0LWJ0blwiKSxcbiAgICBzdHlsZTogaGlkZU5leHRCdG4gPyBISURERU5fU1RZTEUgOiB7fVxuICB9LCBuZXh0SWNvbiksIG9uU3VwZXJOZXh0ICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgb25DbGljazogb25TdXBlck5leHQsXG4gICAgdGFiSW5kZXg6IC0xLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdXBlci1uZXh0LWJ0blwiKSxcbiAgICBzdHlsZTogaGlkZU5leHRCdG4gPyBISURERU5fU1RZTEUgOiB7fVxuICB9LCBzdXBlck5leHRJY29uKSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IEhlYWRlcjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuTU9OVEhfQ09MX0NPVU5UID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2RhdGVVdGlsID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzL2RhdGVVdGlsXCIpO1xuXG52YXIgX1JhbmdlQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL1JhbmdlQ29udGV4dFwiKSk7XG5cbnZhciBfdXNlQ2VsbENsYXNzTmFtZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2hvb2tzL3VzZUNlbGxDbGFzc05hbWVcIikpO1xuXG52YXIgX1BhbmVsQm9keSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL1BhbmVsQm9keVwiKSk7XG5cbnZhciBNT05USF9DT0xfQ09VTlQgPSAzO1xuZXhwb3J0cy5NT05USF9DT0xfQ09VTlQgPSBNT05USF9DT0xfQ09VTlQ7XG52YXIgTU9OVEhfUk9XX0NPVU5UID0gNDtcblxuZnVuY3Rpb24gTW9udGhCb2R5KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICBtb250aENlbGxSZW5kZXIgPSBwcm9wcy5tb250aENlbGxSZW5kZXI7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfUmFuZ2VDb250ZXh0LmRlZmF1bHQpLFxuICAgICAgcmFuZ2VkVmFsdWUgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZWRWYWx1ZSxcbiAgICAgIGhvdmVyUmFuZ2VkVmFsdWUgPSBfUmVhY3QkdXNlQ29udGV4dC5ob3ZlclJhbmdlZFZhbHVlO1xuXG4gIHZhciBjZWxsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpO1xuICB2YXIgZ2V0Q2VsbENsYXNzTmFtZSA9ICgwLCBfdXNlQ2VsbENsYXNzTmFtZS5kZWZhdWx0KSh7XG4gICAgY2VsbFByZWZpeENsczogY2VsbFByZWZpeENscyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIHJhbmdlZFZhbHVlOiByYW5nZWRWYWx1ZSxcbiAgICBob3ZlclJhbmdlZFZhbHVlOiBob3ZlclJhbmdlZFZhbHVlLFxuICAgIGlzU2FtZUNlbGw6IGZ1bmN0aW9uIGlzU2FtZUNlbGwoY3VycmVudCwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gKDAsIF9kYXRlVXRpbC5pc1NhbWVNb250aCkoZ2VuZXJhdGVDb25maWcsIGN1cnJlbnQsIHRhcmdldCk7XG4gICAgfSxcbiAgICBpc0luVmlldzogZnVuY3Rpb24gaXNJblZpZXcoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIG9mZnNldENlbGw6IGZ1bmN0aW9uIG9mZnNldENlbGwoZGF0ZSwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkTW9udGgoZGF0ZSwgb2Zmc2V0KTtcbiAgICB9XG4gIH0pO1xuICB2YXIgbW9udGhzTG9jYWxlID0gbG9jYWxlLnNob3J0TW9udGhzIHx8IChnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0U2hvcnRNb250aHMgPyBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0U2hvcnRNb250aHMobG9jYWxlLmxvY2FsZSkgOiBbXSk7XG4gIHZhciBiYXNlTW9udGggPSBnZW5lcmF0ZUNvbmZpZy5zZXRNb250aCh2aWV3RGF0ZSwgMCk7XG4gIHZhciBnZXRDZWxsTm9kZSA9IG1vbnRoQ2VsbFJlbmRlciA/IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgcmV0dXJuIG1vbnRoQ2VsbFJlbmRlcihkYXRlLCBsb2NhbGUpO1xuICB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfUGFuZWxCb2R5LmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcm93TnVtOiBNT05USF9ST1dfQ09VTlQsXG4gICAgY29sTnVtOiBNT05USF9DT0xfQ09VTlQsXG4gICAgYmFzZURhdGU6IGJhc2VNb250aCxcbiAgICBnZXRDZWxsTm9kZTogZ2V0Q2VsbE5vZGUsXG4gICAgZ2V0Q2VsbFRleHQ6IGZ1bmN0aW9uIGdldENlbGxUZXh0KGRhdGUpIHtcbiAgICAgIHJldHVybiBsb2NhbGUubW9udGhGb3JtYXQgPyBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZm9ybWF0KGxvY2FsZS5sb2NhbGUsIGRhdGUsIGxvY2FsZS5tb250aEZvcm1hdCkgOiBtb250aHNMb2NhbGVbZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZGF0ZSldO1xuICAgIH0sXG4gICAgZ2V0Q2VsbENsYXNzTmFtZTogZ2V0Q2VsbENsYXNzTmFtZSxcbiAgICBnZXRDZWxsRGF0ZTogZ2VuZXJhdGVDb25maWcuYWRkTW9udGgsXG4gICAgdGl0bGVDZWxsOiBmdW5jdGlvbiB0aXRsZUNlbGwoZGF0ZSkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5mb3JtYXQobG9jYWxlLmxvY2FsZSwgZGF0ZSwgJ1lZWVktTU0nKTtcbiAgICB9XG4gIH0pKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gTW9udGhCb2R5O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0hlYWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL0hlYWRlclwiKSk7XG5cbnZhciBfUGFuZWxDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vUGFuZWxDb250ZXh0XCIpKTtcblxuZnVuY3Rpb24gTW9udGhIZWFkZXIocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgICAgb25OZXh0WWVhciA9IHByb3BzLm9uTmV4dFllYXIsXG4gICAgICBvblByZXZZZWFyID0gcHJvcHMub25QcmV2WWVhcixcbiAgICAgIG9uWWVhckNsaWNrID0gcHJvcHMub25ZZWFyQ2xpY2s7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfUGFuZWxDb250ZXh0LmRlZmF1bHQpLFxuICAgICAgaGlkZUhlYWRlciA9IF9SZWFjdCR1c2VDb250ZXh0LmhpZGVIZWFkZXI7XG5cbiAgaWYgKGhpZGVIZWFkZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBoZWFkZXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0hlYWRlci5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogaGVhZGVyUHJlZml4Q2xzLFxuICAgIG9uU3VwZXJQcmV2OiBvblByZXZZZWFyLFxuICAgIG9uU3VwZXJOZXh0OiBvbk5leHRZZWFyXG4gIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIG9uQ2xpY2s6IG9uWWVhckNsaWNrLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi15ZWFyLWJ0blwiKVxuICB9LCBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZm9ybWF0KGxvY2FsZS5sb2NhbGUsIHZpZXdEYXRlLCBsb2NhbGUueWVhckZvcm1hdCkpKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gTW9udGhIZWFkZXI7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfTW9udGhIZWFkZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL01vbnRoSGVhZGVyXCIpKTtcblxudmFyIF9Nb250aEJvZHkgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9Nb250aEJvZHlcIikpO1xuXG52YXIgX3VpVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy91aVV0aWxcIik7XG5cbmZ1bmN0aW9uIE1vbnRoUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIG9wZXJhdGlvblJlZiA9IHByb3BzLm9wZXJhdGlvblJlZixcbiAgICAgIG9uVmlld0RhdGVDaGFuZ2UgPSBwcm9wcy5vblZpZXdEYXRlQ2hhbmdlLFxuICAgICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgICAgb25QYW5lbENoYW5nZSA9IHByb3BzLm9uUGFuZWxDaGFuZ2UsXG4gICAgICBfb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdDtcbiAgdmFyIHBhbmVsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tb250aC1wYW5lbFwiKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBvcGVyYXRpb25SZWYuY3VycmVudCA9IHtcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgcmV0dXJuICgwLCBfdWlVdGlsLmNyZWF0ZUtleURvd25IYW5kbGVyKShldmVudCwge1xuICAgICAgICBvbkxlZnRSaWdodDogZnVuY3Rpb24gb25MZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRNb250aCh2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DdHJsTGVmdFJpZ2h0OiBmdW5jdGlvbiBvbkN0cmxMZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZhbHVlIHx8IHZpZXdEYXRlLCBkaWZmKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwRG93bjogZnVuY3Rpb24gb25VcERvd24oZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRNb250aCh2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiAqIF9Nb250aEJvZHkuTU9OVEhfQ09MX0NPVU5UKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVudGVyOiBmdW5jdGlvbiBvbkVudGVyKCkge1xuICAgICAgICAgIG9uUGFuZWxDaGFuZ2UoJ2RhdGUnLCB2YWx1ZSB8fCB2aWV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT0gVmlldyBPcGVyYXRpb24gPT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgb25ZZWFyQ2hhbmdlID0gZnVuY3Rpb24gb25ZZWFyQ2hhbmdlKGRpZmYpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBwYW5lbFByZWZpeENsc1xuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9Nb250aEhlYWRlci5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uUHJldlllYXI6IGZ1bmN0aW9uIG9uUHJldlllYXIoKSB7XG4gICAgICBvblllYXJDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0WWVhcjogZnVuY3Rpb24gb25OZXh0WWVhcigpIHtcbiAgICAgIG9uWWVhckNoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uWWVhckNsaWNrOiBmdW5jdGlvbiBvblllYXJDbGljaygpIHtcbiAgICAgIG9uUGFuZWxDaGFuZ2UoJ3llYXInLCB2aWV3RGF0ZSk7XG4gICAgfVxuICB9KSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX01vbnRoQm9keS5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlKSB7XG4gICAgICBfb25TZWxlY3QoZGF0ZSwgJ21vdXNlJyk7XG5cbiAgICAgIG9uUGFuZWxDaGFuZ2UoJ2RhdGUnLCBkYXRlKTtcbiAgICB9XG4gIH0pKSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IE1vbnRoUGFuZWw7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBQYW5lbEJvZHk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX1BhbmVsQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL1BhbmVsQ29udGV4dFwiKSk7XG5cbmZ1bmN0aW9uIFBhbmVsQm9keShfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIGRpc2FibGVkRGF0ZSA9IF9yZWYuZGlzYWJsZWREYXRlLFxuICAgICAgb25TZWxlY3QgPSBfcmVmLm9uU2VsZWN0LFxuICAgICAgcm93TnVtID0gX3JlZi5yb3dOdW0sXG4gICAgICBjb2xOdW0gPSBfcmVmLmNvbE51bSxcbiAgICAgIHByZWZpeENvbHVtbiA9IF9yZWYucHJlZml4Q29sdW1uLFxuICAgICAgcm93Q2xhc3NOYW1lID0gX3JlZi5yb3dDbGFzc05hbWUsXG4gICAgICBiYXNlRGF0ZSA9IF9yZWYuYmFzZURhdGUsXG4gICAgICBnZXRDZWxsQ2xhc3NOYW1lID0gX3JlZi5nZXRDZWxsQ2xhc3NOYW1lLFxuICAgICAgZ2V0Q2VsbFRleHQgPSBfcmVmLmdldENlbGxUZXh0LFxuICAgICAgZ2V0Q2VsbE5vZGUgPSBfcmVmLmdldENlbGxOb2RlLFxuICAgICAgZ2V0Q2VsbERhdGUgPSBfcmVmLmdldENlbGxEYXRlLFxuICAgICAgdGl0bGVDZWxsID0gX3JlZi50aXRsZUNlbGwsXG4gICAgICBoZWFkZXJDZWxscyA9IF9yZWYuaGVhZGVyQ2VsbHM7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfUGFuZWxDb250ZXh0LmRlZmF1bHQpLFxuICAgICAgb25EYXRlTW91c2VFbnRlciA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uRGF0ZU1vdXNlRW50ZXIsXG4gICAgICBvbkRhdGVNb3VzZUxlYXZlID0gX1JlYWN0JHVzZUNvbnRleHQub25EYXRlTW91c2VMZWF2ZTtcblxuICB2YXIgY2VsbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbFwiKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgcm93cyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcm93TnVtOyBpICs9IDEpIHtcbiAgICB2YXIgcm93ID0gW107XG4gICAgdmFyIHJvd1N0YXJ0RGF0ZSA9IHZvaWQgMDtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGopIHtcbiAgICAgIHZhciBvZmZzZXQgPSBpICogY29sTnVtICsgajtcbiAgICAgIHZhciBjdXJyZW50RGF0ZSA9IGdldENlbGxEYXRlKGJhc2VEYXRlLCBvZmZzZXQpO1xuICAgICAgdmFyIGRpc2FibGVkID0gZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShjdXJyZW50RGF0ZSk7XG5cbiAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgIHJvd1N0YXJ0RGF0ZSA9IGN1cnJlbnREYXRlO1xuXG4gICAgICAgIGlmIChwcmVmaXhDb2x1bW4pIHtcbiAgICAgICAgICByb3cucHVzaChwcmVmaXhDb2x1bW4ocm93U3RhcnREYXRlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcm93LnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAga2V5OiBqLFxuICAgICAgICB0aXRsZTogdGl0bGVDZWxsICYmIHRpdGxlQ2VsbChjdXJyZW50RGF0ZSksXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGNlbGxQcmVmaXhDbHMsICgwLCBfb2JqZWN0U3ByZWFkMy5kZWZhdWx0KSgoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgZ2V0Q2VsbENsYXNzTmFtZShjdXJyZW50RGF0ZSkpKSxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAgICAgICBvblNlbGVjdChjdXJyZW50RGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcigpIHtcbiAgICAgICAgICBpZiAoIWRpc2FibGVkICYmIG9uRGF0ZU1vdXNlRW50ZXIpIHtcbiAgICAgICAgICAgIG9uRGF0ZU1vdXNlRW50ZXIoY3VycmVudERhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBvbkRhdGVNb3VzZUxlYXZlKSB7XG4gICAgICAgICAgICBvbkRhdGVNb3VzZUxlYXZlKGN1cnJlbnREYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGdldENlbGxOb2RlID8gZ2V0Q2VsbE5vZGUoY3VycmVudERhdGUpIDogUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItaW5uZXJcIilcbiAgICAgIH0sIGdldENlbGxUZXh0KGN1cnJlbnREYXRlKSkpKTtcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb2xOdW07IGogKz0gMSkge1xuICAgICAgX2xvb3Aoaik7XG4gICAgfVxuXG4gICAgcm93cy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7XG4gICAgICBrZXk6IGksXG4gICAgICBjbGFzc05hbWU6IHJvd0NsYXNzTmFtZSAmJiByb3dDbGFzc05hbWUocm93U3RhcnREYXRlKVxuICAgIH0sIHJvdykpO1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib2R5XCIpXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnRcIilcbiAgfSwgaGVhZGVyQ2VsbHMgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcInRoZWFkXCIsIG51bGwsIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCBudWxsLCBoZWFkZXJDZWxscykpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIiwgbnVsbCwgcm93cykpKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLlFVQVJURVJfQ09MX0NPVU5UID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2RhdGVVdGlsID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzL2RhdGVVdGlsXCIpO1xuXG52YXIgX1JhbmdlQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL1JhbmdlQ29udGV4dFwiKSk7XG5cbnZhciBfdXNlQ2VsbENsYXNzTmFtZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2hvb2tzL3VzZUNlbGxDbGFzc05hbWVcIikpO1xuXG52YXIgX1BhbmVsQm9keSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL1BhbmVsQm9keVwiKSk7XG5cbnZhciBRVUFSVEVSX0NPTF9DT1VOVCA9IDQ7XG5leHBvcnRzLlFVQVJURVJfQ09MX0NPVU5UID0gUVVBUlRFUl9DT0xfQ09VTlQ7XG52YXIgUVVBUlRFUl9ST1dfQ09VTlQgPSAxO1xuXG5mdW5jdGlvbiBRdWFydGVyQm9keShwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1JhbmdlQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgICBob3ZlclJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQuaG92ZXJSYW5nZWRWYWx1ZTtcblxuICB2YXIgY2VsbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbFwiKTtcbiAgdmFyIGdldENlbGxDbGFzc05hbWUgPSAoMCwgX3VzZUNlbGxDbGFzc05hbWUuZGVmYXVsdCkoe1xuICAgIGNlbGxQcmVmaXhDbHM6IGNlbGxQcmVmaXhDbHMsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICByYW5nZWRWYWx1ZTogcmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZTogaG92ZXJSYW5nZWRWYWx1ZSxcbiAgICBpc1NhbWVDZWxsOiBmdW5jdGlvbiBpc1NhbWVDZWxsKGN1cnJlbnQsIHRhcmdldCkge1xuICAgICAgcmV0dXJuICgwLCBfZGF0ZVV0aWwuaXNTYW1lUXVhcnRlcikoZ2VuZXJhdGVDb25maWcsIGN1cnJlbnQsIHRhcmdldCk7XG4gICAgfSxcbiAgICBpc0luVmlldzogZnVuY3Rpb24gaXNJblZpZXcoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIG9mZnNldENlbGw6IGZ1bmN0aW9uIG9mZnNldENlbGwoZGF0ZSwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkTW9udGgoZGF0ZSwgb2Zmc2V0ICogMyk7XG4gICAgfVxuICB9KTtcbiAgdmFyIGJhc2VRdWFydGVyID0gZ2VuZXJhdGVDb25maWcuc2V0RGF0ZShnZW5lcmF0ZUNvbmZpZy5zZXRNb250aCh2aWV3RGF0ZSwgMCksIDEpO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfUGFuZWxCb2R5LmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcm93TnVtOiBRVUFSVEVSX1JPV19DT1VOVCxcbiAgICBjb2xOdW06IFFVQVJURVJfQ09MX0NPVU5ULFxuICAgIGJhc2VEYXRlOiBiYXNlUXVhcnRlcixcbiAgICBnZXRDZWxsVGV4dDogZnVuY3Rpb24gZ2V0Q2VsbFRleHQoZGF0ZSkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5mb3JtYXQobG9jYWxlLmxvY2FsZSwgZGF0ZSwgbG9jYWxlLnF1YXJ0ZXJGb3JtYXQgfHwgJ1tRXVEnKTtcbiAgICB9LFxuICAgIGdldENlbGxDbGFzc05hbWU6IGdldENlbGxDbGFzc05hbWUsXG4gICAgZ2V0Q2VsbERhdGU6IGZ1bmN0aW9uIGdldENlbGxEYXRlKGRhdGUsIG9mZnNldCkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmFkZE1vbnRoKGRhdGUsIG9mZnNldCAqIDMpO1xuICAgIH0sXG4gICAgdGl0bGVDZWxsOiBmdW5jdGlvbiB0aXRsZUNlbGwoZGF0ZSkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5mb3JtYXQobG9jYWxlLmxvY2FsZSwgZGF0ZSwgJ1lZWVktW1FdUScpO1xuICAgIH1cbiAgfSkpO1xufVxuXG52YXIgX2RlZmF1bHQgPSBRdWFydGVyQm9keTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9IZWFkZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9IZWFkZXJcIikpO1xuXG52YXIgX1BhbmVsQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL1BhbmVsQ29udGV4dFwiKSk7XG5cbmZ1bmN0aW9uIFF1YXJ0ZXJIZWFkZXIocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgICAgb25OZXh0WWVhciA9IHByb3BzLm9uTmV4dFllYXIsXG4gICAgICBvblByZXZZZWFyID0gcHJvcHMub25QcmV2WWVhcixcbiAgICAgIG9uWWVhckNsaWNrID0gcHJvcHMub25ZZWFyQ2xpY2s7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfUGFuZWxDb250ZXh0LmRlZmF1bHQpLFxuICAgICAgaGlkZUhlYWRlciA9IF9SZWFjdCR1c2VDb250ZXh0LmhpZGVIZWFkZXI7XG5cbiAgaWYgKGhpZGVIZWFkZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBoZWFkZXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0hlYWRlci5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogaGVhZGVyUHJlZml4Q2xzLFxuICAgIG9uU3VwZXJQcmV2OiBvblByZXZZZWFyLFxuICAgIG9uU3VwZXJOZXh0OiBvbk5leHRZZWFyXG4gIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIG9uQ2xpY2s6IG9uWWVhckNsaWNrLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi15ZWFyLWJ0blwiKVxuICB9LCBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZm9ybWF0KGxvY2FsZS5sb2NhbGUsIHZpZXdEYXRlLCBsb2NhbGUueWVhckZvcm1hdCkpKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gUXVhcnRlckhlYWRlcjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9RdWFydGVySGVhZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9RdWFydGVySGVhZGVyXCIpKTtcblxudmFyIF9RdWFydGVyQm9keSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUXVhcnRlckJvZHlcIikpO1xuXG52YXIgX3VpVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy91aVV0aWxcIik7XG5cbmZ1bmN0aW9uIFF1YXJ0ZXJQYW5lbChwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgb3BlcmF0aW9uUmVmID0gcHJvcHMub3BlcmF0aW9uUmVmLFxuICAgICAgb25WaWV3RGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld0RhdGVDaGFuZ2UsXG4gICAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZSxcbiAgICAgIF9vblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0O1xuICB2YXIgcGFuZWxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXF1YXJ0ZXItcGFuZWxcIik7IC8vID09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIHJldHVybiAoMCwgX3VpVXRpbC5jcmVhdGVLZXlEb3duSGFuZGxlcikoZXZlbnQsIHtcbiAgICAgICAgb25MZWZ0UmlnaHQ6IGZ1bmN0aW9uIG9uTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYgKiAzKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvbkN0cmxMZWZ0UmlnaHQ6IGZ1bmN0aW9uIG9uQ3RybExlZnRSaWdodChkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVXBEb3duOiBmdW5jdGlvbiBvblVwRG93bihkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYpLCAna2V5Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT0gVmlldyBPcGVyYXRpb24gPT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgb25ZZWFyQ2hhbmdlID0gZnVuY3Rpb24gb25ZZWFyQ2hhbmdlKGRpZmYpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBwYW5lbFByZWZpeENsc1xuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9RdWFydGVySGVhZGVyLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25QcmV2WWVhcjogZnVuY3Rpb24gb25QcmV2WWVhcigpIHtcbiAgICAgIG9uWWVhckNoYW5nZSgtMSk7XG4gICAgfSxcbiAgICBvbk5leHRZZWFyOiBmdW5jdGlvbiBvbk5leHRZZWFyKCkge1xuICAgICAgb25ZZWFyQ2hhbmdlKDEpO1xuICAgIH0sXG4gICAgb25ZZWFyQ2xpY2s6IGZ1bmN0aW9uIG9uWWVhckNsaWNrKCkge1xuICAgICAgb25QYW5lbENoYW5nZSgneWVhcicsIHZpZXdEYXRlKTtcbiAgICB9XG4gIH0pKSwgUmVhY3QuY3JlYXRlRWxlbWVudChfUXVhcnRlckJvZHkuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSkge1xuICAgICAgX29uU2VsZWN0KGRhdGUsICdtb3VzZScpO1xuICAgIH1cbiAgfSkpKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gUXVhcnRlclBhbmVsO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91c2VNZW1vID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVtb1wiKSk7XG5cbnZhciBfVGltZVVuaXRDb2x1bW4gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RpbWVVbml0Q29sdW1uXCIpKTtcblxudmFyIF9taXNjVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9taXNjVXRpbFwiKTtcblxudmFyIF90aW1lVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy90aW1lVXRpbFwiKTtcblxuZnVuY3Rpb24gc2hvdWxkVW5pdHNVcGRhdGUocHJldlVuaXRzLCBuZXh0VW5pdHMpIHtcbiAgaWYgKHByZXZVbml0cy5sZW5ndGggIT09IG5leHRVbml0cy5sZW5ndGgpIHJldHVybiB0cnVlOyAvLyBpZiBhbnkgdW5pdCdzIGRpc2FibGVkIHN0YXR1cyBpcyBkaWZmZXJlbnQsIHRoZSB1bml0cyBzaG91bGQgYmUgcmUtZXZhbHV0ZWRcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZVbml0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChwcmV2VW5pdHNbaV0uZGlzYWJsZWQgIT09IG5leHRVbml0c1tpXS5kaXNhYmxlZCkgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlVW5pdHMoc3RhcnQsIGVuZCwgc3RlcCwgZGlzYWJsZWRVbml0cykge1xuICB2YXIgdW5pdHMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpICs9IHN0ZXApIHtcbiAgICB1bml0cy5wdXNoKHtcbiAgICAgIGxhYmVsOiAoMCwgX21pc2NVdGlsLmxlZnRQYWQpKGksIDIpLFxuICAgICAgdmFsdWU6IGksXG4gICAgICBkaXNhYmxlZDogKGRpc2FibGVkVW5pdHMgfHwgW10pLmluY2x1ZGVzKGkpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdW5pdHM7XG59XG5cbmZ1bmN0aW9uIFRpbWVCb2R5KHByb3BzKSB7XG4gIHZhciBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgb3BlcmF0aW9uUmVmID0gcHJvcHMub3BlcmF0aW9uUmVmLFxuICAgICAgYWN0aXZlQ29sdW1uSW5kZXggPSBwcm9wcy5hY3RpdmVDb2x1bW5JbmRleCxcbiAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICBzaG93SG91ciA9IHByb3BzLnNob3dIb3VyLFxuICAgICAgc2hvd01pbnV0ZSA9IHByb3BzLnNob3dNaW51dGUsXG4gICAgICBzaG93U2Vjb25kID0gcHJvcHMuc2hvd1NlY29uZCxcbiAgICAgIHVzZTEySG91cnMgPSBwcm9wcy51c2UxMkhvdXJzLFxuICAgICAgX3Byb3BzJGhvdXJTdGVwID0gcHJvcHMuaG91clN0ZXAsXG4gICAgICBob3VyU3RlcCA9IF9wcm9wcyRob3VyU3RlcCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRob3VyU3RlcCxcbiAgICAgIF9wcm9wcyRtaW51dGVTdGVwID0gcHJvcHMubWludXRlU3RlcCxcbiAgICAgIG1pbnV0ZVN0ZXAgPSBfcHJvcHMkbWludXRlU3RlcCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRtaW51dGVTdGVwLFxuICAgICAgX3Byb3BzJHNlY29uZFN0ZXAgPSBwcm9wcy5zZWNvbmRTdGVwLFxuICAgICAgc2Vjb25kU3RlcCA9IF9wcm9wcyRzZWNvbmRTdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJHNlY29uZFN0ZXAsXG4gICAgICBkaXNhYmxlZEhvdXJzID0gcHJvcHMuZGlzYWJsZWRIb3VycyxcbiAgICAgIGRpc2FibGVkTWludXRlcyA9IHByb3BzLmRpc2FibGVkTWludXRlcyxcbiAgICAgIGRpc2FibGVkU2Vjb25kcyA9IHByb3BzLmRpc2FibGVkU2Vjb25kcyxcbiAgICAgIGhpZGVEaXNhYmxlZE9wdGlvbnMgPSBwcm9wcy5oaWRlRGlzYWJsZWRPcHRpb25zLFxuICAgICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdDtcbiAgdmFyIGNvbHVtbnMgPSBbXTtcbiAgdmFyIGNvbnRlbnRQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnRcIik7XG4gIHZhciBjb2x1bW5QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpbWUtcGFuZWxcIik7XG4gIHZhciBpc1BNO1xuICB2YXIgaG91ciA9IHZhbHVlID8gZ2VuZXJhdGVDb25maWcuZ2V0SG91cih2YWx1ZSkgOiAtMTtcbiAgdmFyIG1pbnV0ZSA9IHZhbHVlID8gZ2VuZXJhdGVDb25maWcuZ2V0TWludXRlKHZhbHVlKSA6IC0xO1xuICB2YXIgc2Vjb25kID0gdmFsdWUgPyBnZW5lcmF0ZUNvbmZpZy5nZXRTZWNvbmQodmFsdWUpIDogLTE7XG5cbiAgdmFyIHNldFRpbWUgPSBmdW5jdGlvbiBzZXRUaW1lKGlzTmV3UE0sIG5ld0hvdXIsIG5ld01pbnV0ZSwgbmV3U2Vjb25kKSB7XG4gICAgdmFyIG5ld0RhdGUgPSB2YWx1ZSB8fCBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKTtcbiAgICB2YXIgbWVyZ2VkSG91ciA9IE1hdGgubWF4KDAsIG5ld0hvdXIpO1xuICAgIHZhciBtZXJnZWRNaW51dGUgPSBNYXRoLm1heCgwLCBuZXdNaW51dGUpO1xuICAgIHZhciBtZXJnZWRTZWNvbmQgPSBNYXRoLm1heCgwLCBuZXdTZWNvbmQpO1xuICAgIG5ld0RhdGUgPSAoMCwgX3RpbWVVdGlsLnNldFRpbWUpKGdlbmVyYXRlQ29uZmlnLCBuZXdEYXRlLCAhdXNlMTJIb3VycyB8fCAhaXNOZXdQTSA/IG1lcmdlZEhvdXIgOiBtZXJnZWRIb3VyICsgMTIsIG1lcmdlZE1pbnV0ZSwgbWVyZ2VkU2Vjb25kKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBVbml0ID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciByYXdIb3VycyA9IGdlbmVyYXRlVW5pdHMoMCwgMjMsIGhvdXJTdGVwLCBkaXNhYmxlZEhvdXJzICYmIGRpc2FibGVkSG91cnMoKSk7XG4gIHZhciBtZW1vcml6ZWRSYXdIb3VycyA9ICgwLCBfdXNlTWVtby5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJhd0hvdXJzO1xuICB9LCByYXdIb3Vycywgc2hvdWxkVW5pdHNVcGRhdGUpOyAvLyBTaG91bGQgYWRkaXRpb25hbCBsb2dpYyB0byBoYW5kbGUgMTIgaG91cnNcblxuICBpZiAodXNlMTJIb3Vycykge1xuICAgIGlzUE0gPSBob3VyID49IDEyOyAvLyAtMSBtZWFucyBzaG91bGQgZGlzcGxheSBBTVxuXG4gICAgaG91ciAlPSAxMjtcbiAgfVxuXG4gIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghdXNlMTJIb3Vycykge1xuICAgICAgcmV0dXJuIFtmYWxzZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIHZhciBBTVBNRGlzYWJsZWQgPSBbdHJ1ZSwgdHJ1ZV07XG4gICAgbWVtb3JpemVkUmF3SG91cnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICAgICAgICBob3VyVmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIGlmIChob3VyVmFsdWUgPj0gMTIpIHtcbiAgICAgICAgQU1QTURpc2FibGVkWzFdID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBTVBNRGlzYWJsZWRbMF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQU1QTURpc2FibGVkO1xuICB9LCBbdXNlMTJIb3VycywgbWVtb3JpemVkUmF3SG91cnNdKSxcbiAgICAgIF9SZWFjdCR1c2VNZW1vMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZU1lbW8sIDIpLFxuICAgICAgQU1EaXNhYmxlZCA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICAgIFBNRGlzYWJsZWQgPSBfUmVhY3QkdXNlTWVtbzJbMV07XG5cbiAgdmFyIGhvdXJzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF1c2UxMkhvdXJzKSByZXR1cm4gbWVtb3JpemVkUmF3SG91cnM7XG4gICAgcmV0dXJuIG1lbW9yaXplZFJhd0hvdXJzLmZpbHRlcihpc1BNID8gZnVuY3Rpb24gKGhvdXJNZXRhKSB7XG4gICAgICByZXR1cm4gaG91ck1ldGEudmFsdWUgPj0gMTI7XG4gICAgfSA6IGZ1bmN0aW9uIChob3VyTWV0YSkge1xuICAgICAgcmV0dXJuIGhvdXJNZXRhLnZhbHVlIDwgMTI7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChob3VyTWV0YSkge1xuICAgICAgdmFyIGhvdXJWYWx1ZSA9IGhvdXJNZXRhLnZhbHVlICUgMTI7XG4gICAgICB2YXIgaG91ckxhYmVsID0gaG91clZhbHVlID09PSAwID8gJzEyJyA6ICgwLCBfbWlzY1V0aWwubGVmdFBhZCkoaG91clZhbHVlLCAyKTtcbiAgICAgIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBob3VyTWV0YSksIHt9LCB7XG4gICAgICAgIGxhYmVsOiBob3VyTGFiZWwsXG4gICAgICAgIHZhbHVlOiBob3VyVmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCBbdXNlMTJIb3VycywgbWVtb3JpemVkUmF3SG91cnNdKTtcbiAgdmFyIG1pbnV0ZXMgPSBnZW5lcmF0ZVVuaXRzKDAsIDU5LCBtaW51dGVTdGVwLCBkaXNhYmxlZE1pbnV0ZXMgJiYgZGlzYWJsZWRNaW51dGVzKGhvdXIpKTtcbiAgdmFyIHNlY29uZHMgPSBnZW5lcmF0ZVVuaXRzKDAsIDU5LCBzZWNvbmRTdGVwLCBkaXNhYmxlZFNlY29uZHMgJiYgZGlzYWJsZWRTZWNvbmRzKGhvdXIsIG1pbnV0ZSkpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09IE9wZXJhdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIG9wZXJhdGlvblJlZi5jdXJyZW50ID0ge1xuICAgIG9uVXBEb3duOiBmdW5jdGlvbiBvblVwRG93bihkaWZmKSB7XG4gICAgICB2YXIgY29sdW1uID0gY29sdW1uc1thY3RpdmVDb2x1bW5JbmRleF07XG5cbiAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgdmFyIHZhbHVlSW5kZXggPSBjb2x1bW4udW5pdHMuZmluZEluZGV4KGZ1bmN0aW9uICh1bml0KSB7XG4gICAgICAgICAgcmV0dXJuIHVuaXQudmFsdWUgPT09IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB1bml0TGVuID0gY29sdW1uLnVuaXRzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHVuaXRMZW47IGkgKz0gMSkge1xuICAgICAgICAgIHZhciBuZXh0VW5pdCA9IGNvbHVtbi51bml0c1sodmFsdWVJbmRleCArIGRpZmYgKiBpICsgdW5pdExlbikgJSB1bml0TGVuXTtcblxuICAgICAgICAgIGlmIChuZXh0VW5pdC5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29sdW1uLm9uU2VsZWN0KG5leHRVbml0LnZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBhZGRDb2x1bW5Ob2RlKGNvbmRpdGlvbiwgbm9kZSwgY29sdW1uVmFsdWUsIHVuaXRzLCBvbkNvbHVtblNlbGVjdCkge1xuICAgIGlmIChjb25kaXRpb24gIT09IGZhbHNlKSB7XG4gICAgICBjb2x1bW5zLnB1c2goe1xuICAgICAgICBub2RlOiBSZWFjdC5jbG9uZUVsZW1lbnQobm9kZSwge1xuICAgICAgICAgIHByZWZpeENsczogY29sdW1uUHJlZml4Q2xzLFxuICAgICAgICAgIHZhbHVlOiBjb2x1bW5WYWx1ZSxcbiAgICAgICAgICBhY3RpdmU6IGFjdGl2ZUNvbHVtbkluZGV4ID09PSBjb2x1bW5zLmxlbmd0aCxcbiAgICAgICAgICBvblNlbGVjdDogb25Db2x1bW5TZWxlY3QsXG4gICAgICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgICAgIGhpZGVEaXNhYmxlZE9wdGlvbnM6IGhpZGVEaXNhYmxlZE9wdGlvbnNcbiAgICAgICAgfSksXG4gICAgICAgIG9uU2VsZWN0OiBvbkNvbHVtblNlbGVjdCxcbiAgICAgICAgdmFsdWU6IGNvbHVtblZhbHVlLFxuICAgICAgICB1bml0czogdW5pdHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvLyBIb3VyXG5cblxuICBhZGRDb2x1bW5Ob2RlKHNob3dIb3VyLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9UaW1lVW5pdENvbHVtbi5kZWZhdWx0LCB7XG4gICAga2V5OiBcImhvdXJcIlxuICB9KSwgaG91ciwgaG91cnMsIGZ1bmN0aW9uIChudW0pIHtcbiAgICBvblNlbGVjdChzZXRUaW1lKGlzUE0sIG51bSwgbWludXRlLCBzZWNvbmQpLCAnbW91c2UnKTtcbiAgfSk7IC8vIE1pbnV0ZVxuXG4gIGFkZENvbHVtbk5vZGUoc2hvd01pbnV0ZSwgUmVhY3QuY3JlYXRlRWxlbWVudChfVGltZVVuaXRDb2x1bW4uZGVmYXVsdCwge1xuICAgIGtleTogXCJtaW51dGVcIlxuICB9KSwgbWludXRlLCBtaW51dGVzLCBmdW5jdGlvbiAobnVtKSB7XG4gICAgb25TZWxlY3Qoc2V0VGltZShpc1BNLCBob3VyLCBudW0sIHNlY29uZCksICdtb3VzZScpO1xuICB9KTsgLy8gU2Vjb25kXG5cbiAgYWRkQ29sdW1uTm9kZShzaG93U2Vjb25kLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9UaW1lVW5pdENvbHVtbi5kZWZhdWx0LCB7XG4gICAga2V5OiBcInNlY29uZFwiXG4gIH0pLCBzZWNvbmQsIHNlY29uZHMsIGZ1bmN0aW9uIChudW0pIHtcbiAgICBvblNlbGVjdChzZXRUaW1lKGlzUE0sIGhvdXIsIG1pbnV0ZSwgbnVtKSwgJ21vdXNlJyk7XG4gIH0pOyAvLyAxMiBIb3Vyc1xuXG4gIHZhciBQTUluZGV4ID0gLTE7XG5cbiAgaWYgKHR5cGVvZiBpc1BNID09PSAnYm9vbGVhbicpIHtcbiAgICBQTUluZGV4ID0gaXNQTSA/IDEgOiAwO1xuICB9XG5cbiAgYWRkQ29sdW1uTm9kZSh1c2UxMkhvdXJzID09PSB0cnVlLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9UaW1lVW5pdENvbHVtbi5kZWZhdWx0LCB7XG4gICAga2V5OiBcIjEyaG91cnNcIlxuICB9KSwgUE1JbmRleCwgW3tcbiAgICBsYWJlbDogJ0FNJyxcbiAgICB2YWx1ZTogMCxcbiAgICBkaXNhYmxlZDogQU1EaXNhYmxlZFxuICB9LCB7XG4gICAgbGFiZWw6ICdQTScsXG4gICAgdmFsdWU6IDEsXG4gICAgZGlzYWJsZWQ6IFBNRGlzYWJsZWRcbiAgfV0sIGZ1bmN0aW9uIChudW0pIHtcbiAgICBvblNlbGVjdChzZXRUaW1lKCEhbnVtLCBob3VyLCBtaW51dGUsIHNlY29uZCksICdtb3VzZScpO1xuICB9KTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY29udGVudFByZWZpeENsc1xuICB9LCBjb2x1bW5zLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgbm9kZSA9IF9yZWYyLm5vZGU7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gVGltZUJvZHk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfSGVhZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vSGVhZGVyXCIpKTtcblxudmFyIF9QYW5lbENvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9QYW5lbENvbnRleHRcIikpO1xuXG5mdW5jdGlvbiBUaW1lSGVhZGVyKHByb3BzKSB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1BhbmVsQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIGhpZGVIZWFkZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlSGVhZGVyO1xuXG4gIGlmIChoaWRlSGVhZGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICBmb3JtYXQgPSBwcm9wcy5mb3JtYXQ7XG4gIHZhciBoZWFkZXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0hlYWRlci5kZWZhdWx0LCB7XG4gICAgcHJlZml4Q2xzOiBoZWFkZXJQcmVmaXhDbHNcbiAgfSwgdmFsdWUgPyBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZm9ybWF0KGxvY2FsZS5sb2NhbGUsIHZhbHVlLCBmb3JtYXQpIDogXCJcXHhBMFwiKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gVGltZUhlYWRlcjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfdWlVdGlsID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzL3VpVXRpbFwiKTtcblxudmFyIF9QYW5lbENvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9QYW5lbENvbnRleHRcIikpO1xuXG5mdW5jdGlvbiBUaW1lVW5pdENvbHVtbihwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgdW5pdHMgPSBwcm9wcy51bml0cyxcbiAgICAgIG9uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgICAgaGlkZURpc2FibGVkT3B0aW9ucyA9IHByb3BzLmhpZGVEaXNhYmxlZE9wdGlvbnM7XG4gIHZhciBjZWxsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1BhbmVsQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIG9wZW4gPSBfUmVhY3QkdXNlQ29udGV4dC5vcGVuO1xuXG4gIHZhciB1bFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGxpUmVmcyA9IFJlYWN0LnVzZVJlZihuZXcgTWFwKCkpOyAvLyBgdXNlTGF5b3V0RWZmZWN0YCBoZXJlIHRvIGF2b2lkIGJsaW5rIGJ5IGR1cmF0aW9uIGlzIDBcblxuICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBsaSA9IGxpUmVmcy5jdXJyZW50LmdldCh2YWx1ZSk7XG5cbiAgICBpZiAobGkgJiYgb3BlbiAhPT0gZmFsc2UpIHtcbiAgICAgICgwLCBfdWlVdGlsLnNjcm9sbFRvKSh1bFJlZi5jdXJyZW50LCBsaS5vZmZzZXRUb3AsIDEyMCk7XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgUmVhY3QudXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob3Blbikge1xuICAgICAgdmFyIGxpID0gbGlSZWZzLmN1cnJlbnQuZ2V0KHZhbHVlKTtcblxuICAgICAgaWYgKGxpKSB7XG4gICAgICAgICgwLCBfdWlVdGlsLnNjcm9sbFRvKSh1bFJlZi5jdXJyZW50LCBsaS5vZmZzZXRUb3AsIDApO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW29wZW5dKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW5cIiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbHVtbi1hY3RpdmVcIiksIGFjdGl2ZSkpLFxuICAgIHJlZjogdWxSZWYsXG4gICAgc3R5bGU6IHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgfVxuICB9LCB1bml0cy5tYXAoZnVuY3Rpb24gKHVuaXQpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXMyO1xuXG4gICAgaWYgKGhpZGVEaXNhYmxlZE9wdGlvbnMgJiYgdW5pdC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICBrZXk6IHVuaXQudmFsdWUsXG4gICAgICByZWY6IGZ1bmN0aW9uIHJlZihlbGVtZW50KSB7XG4gICAgICAgIGxpUmVmcy5jdXJyZW50LnNldCh1bml0LnZhbHVlLCBlbGVtZW50KTtcbiAgICAgIH0sXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShjZWxsUHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMyID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZGlzYWJsZWRcIiksIHVuaXQuZGlzYWJsZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXNlbGVjdGVkXCIpLCB2YWx1ZSA9PT0gdW5pdC52YWx1ZSksIF9jbGFzc05hbWVzMikpLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgaWYgKHVuaXQuZGlzYWJsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvblNlbGVjdCh1bml0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItaW5uZXJcIilcbiAgICB9LCB1bml0LmxhYmVsKSk7XG4gIH0pKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gVGltZVVuaXRDb2x1bW47XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9UaW1lSGVhZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UaW1lSGVhZGVyXCIpKTtcblxudmFyIF9UaW1lQm9keSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGltZUJvZHlcIikpO1xuXG52YXIgX3VpVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy91aVV0aWxcIik7XG5cbnZhciBjb3VudEJvb2xlYW4gPSBmdW5jdGlvbiBjb3VudEJvb2xlYW4oYm9vbExpc3QpIHtcbiAgcmV0dXJuIGJvb2xMaXN0LmZpbHRlcihmdW5jdGlvbiAoYm9vbCkge1xuICAgIHJldHVybiBib29sICE9PSBmYWxzZTtcbiAgfSkubGVuZ3RoO1xufTtcblxuZnVuY3Rpb24gVGltZVBhbmVsKHByb3BzKSB7XG4gIHZhciBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgICAgX3Byb3BzJGZvcm1hdCA9IHByb3BzLmZvcm1hdCxcbiAgICAgIGZvcm1hdCA9IF9wcm9wcyRmb3JtYXQgPT09IHZvaWQgMCA/ICdISDptbTpzcycgOiBfcHJvcHMkZm9ybWF0LFxuICAgICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgICAgb3BlcmF0aW9uUmVmID0gcHJvcHMub3BlcmF0aW9uUmVmLFxuICAgICAgc2hvd0hvdXIgPSBwcm9wcy5zaG93SG91cixcbiAgICAgIHNob3dNaW51dGUgPSBwcm9wcy5zaG93TWludXRlLFxuICAgICAgc2hvd1NlY29uZCA9IHByb3BzLnNob3dTZWNvbmQsXG4gICAgICBfcHJvcHMkdXNlMTJIb3VycyA9IHByb3BzLnVzZTEySG91cnMsXG4gICAgICB1c2UxMkhvdXJzID0gX3Byb3BzJHVzZTEySG91cnMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHVzZTEySG91cnMsXG4gICAgICBvblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0LFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZTtcbiAgdmFyIHBhbmVsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aW1lLXBhbmVsXCIpO1xuICB2YXIgYm9keU9wZXJhdGlvblJlZiA9IFJlYWN0LnVzZVJlZigpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgtMSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgYWN0aXZlQ29sdW1uSW5kZXggPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0QWN0aXZlQ29sdW1uSW5kZXggPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBjb2x1bW5zQ291bnQgPSBjb3VudEJvb2xlYW4oW3Nob3dIb3VyLCBzaG93TWludXRlLCBzaG93U2Vjb25kLCB1c2UxMkhvdXJzXSk7XG4gIG9wZXJhdGlvblJlZi5jdXJyZW50ID0ge1xuICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICByZXR1cm4gKDAsIF91aVV0aWwuY3JlYXRlS2V5RG93bkhhbmRsZXIpKGV2ZW50LCB7XG4gICAgICAgIG9uTGVmdFJpZ2h0OiBmdW5jdGlvbiBvbkxlZnRSaWdodChkaWZmKSB7XG4gICAgICAgICAgc2V0QWN0aXZlQ29sdW1uSW5kZXgoKGFjdGl2ZUNvbHVtbkluZGV4ICsgZGlmZiArIGNvbHVtbnNDb3VudCkgJSBjb2x1bW5zQ291bnQpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwRG93bjogZnVuY3Rpb24gb25VcERvd24oZGlmZikge1xuICAgICAgICAgIGlmIChhY3RpdmVDb2x1bW5JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHNldEFjdGl2ZUNvbHVtbkluZGV4KDApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYm9keU9wZXJhdGlvblJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBib2R5T3BlcmF0aW9uUmVmLmN1cnJlbnQub25VcERvd24oZGlmZik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVudGVyOiBmdW5jdGlvbiBvbkVudGVyKCkge1xuICAgICAgICAgIG9uU2VsZWN0KHZhbHVlIHx8IGdlbmVyYXRlQ29uZmlnLmdldE5vdygpLCAna2V5Jyk7XG4gICAgICAgICAgc2V0QWN0aXZlQ29sdW1uSW5kZXgoLTEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uQmx1cjogZnVuY3Rpb24gb25CbHVyKCkge1xuICAgICAgc2V0QWN0aXZlQ29sdW1uSW5kZXgoLTEpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHBhbmVsUHJlZml4Q2xzLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQocGFuZWxQcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSlcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChfVGltZUhlYWRlci5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGZvcm1hdDogZm9ybWF0LFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0pKSwgUmVhY3QuY3JlYXRlRWxlbWVudChfVGltZUJvZHkuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBhY3RpdmVDb2x1bW5JbmRleDogYWN0aXZlQ29sdW1uSW5kZXgsXG4gICAgb3BlcmF0aW9uUmVmOiBib2R5T3BlcmF0aW9uUmVmXG4gIH0pKSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IFRpbWVQYW5lbDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfRGF0ZVBhbmVsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vRGF0ZVBhbmVsXCIpKTtcblxudmFyIF9kYXRlVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9kYXRlVXRpbFwiKTtcblxuZnVuY3Rpb24gV2Vla1BhbmVsKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZTsgLy8gUmVuZGVyIGFkZGl0aW9uYWwgY29sdW1uXG5cbiAgdmFyIGNlbGxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNlbGxcIik7XG5cbiAgdmFyIHByZWZpeENvbHVtbiA9IGZ1bmN0aW9uIHByZWZpeENvbHVtbihkYXRlKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7XG4gICAgICBrZXk6IFwid2Vla1wiLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoY2VsbFByZWZpeENscywgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItd2Vla1wiKSlcbiAgICB9LCBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0V2Vlayhsb2NhbGUubG9jYWxlLCBkYXRlKSk7XG4gIH07IC8vIEFkZCByb3cgY2xhc3NOYW1lXG5cblxuICB2YXIgcm93UHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13ZWVrLXBhbmVsLXJvd1wiKTtcblxuICB2YXIgcm93Q2xhc3NOYW1lID0gZnVuY3Rpb24gcm93Q2xhc3NOYW1lKGRhdGUpIHtcbiAgICByZXR1cm4gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHJvd1ByZWZpeENscywgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHJvd1ByZWZpeENscywgXCItc2VsZWN0ZWRcIiksICgwLCBfZGF0ZVV0aWwuaXNTYW1lV2VlaykoZ2VuZXJhdGVDb25maWcsIGxvY2FsZS5sb2NhbGUsIHZhbHVlLCBkYXRlKSkpO1xuICB9O1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9EYXRlUGFuZWwuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBwYW5lbE5hbWU6IFwid2Vla1wiLFxuICAgIHByZWZpeENvbHVtbjogcHJlZml4Q29sdW1uLFxuICAgIHJvd0NsYXNzTmFtZTogcm93Q2xhc3NOYW1lLFxuICAgIGtleWJvYXJkQ29uZmlnOiB7XG4gICAgICBvbkxlZnRSaWdodDogbnVsbFxuICAgIH1cbiAgfSkpO1xufVxuXG52YXIgX2RlZmF1bHQgPSBXZWVrUGFuZWw7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLllFQVJfQ09MX0NPVU5UID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuXCIpO1xuXG52YXIgX3VzZUNlbGxDbGFzc05hbWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9ob29rcy91c2VDZWxsQ2xhc3NOYW1lXCIpKTtcblxudmFyIF9kYXRlVXRpbCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9kYXRlVXRpbFwiKTtcblxudmFyIF9SYW5nZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9SYW5nZUNvbnRleHRcIikpO1xuXG52YXIgX1BhbmVsQm9keSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL1BhbmVsQm9keVwiKSk7XG5cbnZhciBZRUFSX0NPTF9DT1VOVCA9IDM7XG5leHBvcnRzLllFQVJfQ09MX0NPVU5UID0gWUVBUl9DT0xfQ09VTlQ7XG52YXIgWUVBUl9ST1dfQ09VTlQgPSA0O1xuXG5mdW5jdGlvbiBZZWFyQm9keShwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1JhbmdlQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgICBob3ZlclJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQuaG92ZXJSYW5nZWRWYWx1ZTtcblxuICB2YXIgeWVhclByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbFwiKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBZZWFyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgeWVhck51bWJlciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIodmlld0RhdGUpO1xuXG4gIHZhciBzdGFydFllYXIgPSBNYXRoLmZsb29yKHllYXJOdW1iZXIgLyBfLllFQVJfREVDQURFX0NPVU5UKSAqIF8uWUVBUl9ERUNBREVfQ09VTlQ7XG5cbiAgdmFyIGVuZFllYXIgPSBzdGFydFllYXIgKyBfLllFQVJfREVDQURFX0NPVU5UIC0gMTtcbiAgdmFyIGJhc2VZZWFyID0gZ2VuZXJhdGVDb25maWcuc2V0WWVhcih2aWV3RGF0ZSwgc3RhcnRZZWFyIC0gTWF0aC5jZWlsKChZRUFSX0NPTF9DT1VOVCAqIFlFQVJfUk9XX0NPVU5UIC0gXy5ZRUFSX0RFQ0FERV9DT1VOVCkgLyAyKSk7XG5cbiAgdmFyIGlzSW5WaWV3ID0gZnVuY3Rpb24gaXNJblZpZXcoZGF0ZSkge1xuICAgIHZhciBjdXJyZW50WWVhck51bWJlciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoZGF0ZSk7XG4gICAgcmV0dXJuIHN0YXJ0WWVhciA8PSBjdXJyZW50WWVhck51bWJlciAmJiBjdXJyZW50WWVhck51bWJlciA8PSBlbmRZZWFyO1xuICB9O1xuXG4gIHZhciBnZXRDZWxsQ2xhc3NOYW1lID0gKDAsIF91c2VDZWxsQ2xhc3NOYW1lLmRlZmF1bHQpKHtcbiAgICBjZWxsUHJlZml4Q2xzOiB5ZWFyUHJlZml4Q2xzLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgcmFuZ2VkVmFsdWU6IHJhbmdlZFZhbHVlLFxuICAgIGhvdmVyUmFuZ2VkVmFsdWU6IGhvdmVyUmFuZ2VkVmFsdWUsXG4gICAgaXNTYW1lQ2VsbDogZnVuY3Rpb24gaXNTYW1lQ2VsbChjdXJyZW50LCB0YXJnZXQpIHtcbiAgICAgIHJldHVybiAoMCwgX2RhdGVVdGlsLmlzU2FtZVllYXIpKGdlbmVyYXRlQ29uZmlnLCBjdXJyZW50LCB0YXJnZXQpO1xuICAgIH0sXG4gICAgaXNJblZpZXc6IGlzSW5WaWV3LFxuICAgIG9mZnNldENlbGw6IGZ1bmN0aW9uIG9mZnNldENlbGwoZGF0ZSwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkWWVhcihkYXRlLCBvZmZzZXQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9QYW5lbEJvZHkuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByb3dOdW06IFlFQVJfUk9XX0NPVU5ULFxuICAgIGNvbE51bTogWUVBUl9DT0xfQ09VTlQsXG4gICAgYmFzZURhdGU6IGJhc2VZZWFyLFxuICAgIGdldENlbGxUZXh0OiBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyLFxuICAgIGdldENlbGxDbGFzc05hbWU6IGdldENlbGxDbGFzc05hbWUsXG4gICAgZ2V0Q2VsbERhdGU6IGdlbmVyYXRlQ29uZmlnLmFkZFllYXIsXG4gICAgdGl0bGVDZWxsOiBmdW5jdGlvbiB0aXRsZUNlbGwoZGF0ZSkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5mb3JtYXQobG9jYWxlLmxvY2FsZSwgZGF0ZSwgJ1lZWVknKTtcbiAgICB9XG4gIH0pKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gWWVhckJvZHk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfSGVhZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vSGVhZGVyXCIpKTtcblxudmFyIF8gPSByZXF1aXJlKFwiLlwiKTtcblxudmFyIF9QYW5lbENvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9QYW5lbENvbnRleHRcIikpO1xuXG5mdW5jdGlvbiBZZWFySGVhZGVyKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICAgIG9uUHJldkRlY2FkZSA9IHByb3BzLm9uUHJldkRlY2FkZSxcbiAgICAgIG9uTmV4dERlY2FkZSA9IHByb3BzLm9uTmV4dERlY2FkZSxcbiAgICAgIG9uRGVjYWRlQ2xpY2sgPSBwcm9wcy5vbkRlY2FkZUNsaWNrO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1BhbmVsQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIGhpZGVIZWFkZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlSGVhZGVyO1xuXG4gIGlmIChoaWRlSGVhZGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgaGVhZGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIik7XG4gIHZhciB5ZWFyTnVtYmVyID0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcih2aWV3RGF0ZSk7XG5cbiAgdmFyIHN0YXJ0WWVhciA9IE1hdGguZmxvb3IoeWVhck51bWJlciAvIF8uWUVBUl9ERUNBREVfQ09VTlQpICogXy5ZRUFSX0RFQ0FERV9DT1VOVDtcblxuICB2YXIgZW5kWWVhciA9IHN0YXJ0WWVhciArIF8uWUVBUl9ERUNBREVfQ09VTlQgLSAxO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfSGVhZGVyLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBoZWFkZXJQcmVmaXhDbHMsXG4gICAgb25TdXBlclByZXY6IG9uUHJldkRlY2FkZSxcbiAgICBvblN1cGVyTmV4dDogb25OZXh0RGVjYWRlXG4gIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIG9uQ2xpY2s6IG9uRGVjYWRlQ2xpY2ssXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRlY2FkZS1idG5cIilcbiAgfSwgc3RhcnRZZWFyLCBcIi1cIiwgZW5kWWVhcikpO1xufVxuXG52YXIgX2RlZmF1bHQgPSBZZWFySGVhZGVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5ZRUFSX0RFQ0FERV9DT1VOVCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9ZZWFySGVhZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ZZWFySGVhZGVyXCIpKTtcblxudmFyIF9ZZWFyQm9keSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1llYXJCb2R5XCIpKTtcblxudmFyIF91aVV0aWwgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHMvdWlVdGlsXCIpO1xuXG52YXIgWUVBUl9ERUNBREVfQ09VTlQgPSAxMDtcbmV4cG9ydHMuWUVBUl9ERUNBREVfQ09VTlQgPSBZRUFSX0RFQ0FERV9DT1VOVDtcblxuZnVuY3Rpb24gWWVhclBhbmVsKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBvcGVyYXRpb25SZWYgPSBwcm9wcy5vcGVyYXRpb25SZWYsXG4gICAgICBvblZpZXdEYXRlQ2hhbmdlID0gcHJvcHMub25WaWV3RGF0ZUNoYW5nZSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICAgIHNvdXJjZU1vZGUgPSBwcm9wcy5zb3VyY2VNb2RlLFxuICAgICAgX29uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZTtcbiAgdmFyIHBhbmVsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi15ZWFyLXBhbmVsXCIpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIG9wZXJhdGlvblJlZi5jdXJyZW50ID0ge1xuICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICByZXR1cm4gKDAsIF91aVV0aWwuY3JlYXRlS2V5RG93bkhhbmRsZXIpKGV2ZW50LCB7XG4gICAgICAgIG9uTGVmdFJpZ2h0OiBmdW5jdGlvbiBvbkxlZnRSaWdodChkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ3RybExlZnRSaWdodDogZnVuY3Rpb24gb25DdHJsTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiAqIFlFQVJfREVDQURFX0NPVU5UKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwRG93bjogZnVuY3Rpb24gb25VcERvd24oZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZhbHVlIHx8IHZpZXdEYXRlLCBkaWZmICogX1llYXJCb2R5LllFQVJfQ09MX0NPVU5UKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVudGVyOiBmdW5jdGlvbiBvbkVudGVyKCkge1xuICAgICAgICAgIG9uUGFuZWxDaGFuZ2Uoc291cmNlTW9kZSA9PT0gJ2RhdGUnID8gJ2RhdGUnIDogJ21vbnRoJywgdmFsdWUgfHwgdmlld0RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09IFZpZXcgT3BlcmF0aW9uID09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG9uRGVjYWRlQ2hhbmdlID0gZnVuY3Rpb24gb25EZWNhZGVDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZiAqIDEwKTtcbiAgICBvblZpZXdEYXRlQ2hhbmdlKG5ld0RhdGUpO1xuICAgIG9uUGFuZWxDaGFuZ2UobnVsbCwgbmV3RGF0ZSk7XG4gIH07XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogcGFuZWxQcmVmaXhDbHNcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChfWWVhckhlYWRlci5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uUHJldkRlY2FkZTogZnVuY3Rpb24gb25QcmV2RGVjYWRlKCkge1xuICAgICAgb25EZWNhZGVDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0RGVjYWRlOiBmdW5jdGlvbiBvbk5leHREZWNhZGUoKSB7XG4gICAgICBvbkRlY2FkZUNoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uRGVjYWRlQ2xpY2s6IGZ1bmN0aW9uIG9uRGVjYWRlQ2xpY2soKSB7XG4gICAgICBvblBhbmVsQ2hhbmdlKCdkZWNhZGUnLCB2aWV3RGF0ZSk7XG4gICAgfVxuICB9KSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1llYXJCb2R5LmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIG9uUGFuZWxDaGFuZ2Uoc291cmNlTW9kZSA9PT0gJ2RhdGUnID8gJ2RhdGUnIDogJ21vbnRoJywgZGF0ZSk7XG5cbiAgICAgIF9vblNlbGVjdChkYXRlLCAnbW91c2UnKTtcbiAgICB9XG4gIH0pKSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IFllYXJQYW5lbDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc051bGxFcXVhbCA9IGlzTnVsbEVxdWFsO1xuZXhwb3J0cy5pc1NhbWVEZWNhZGUgPSBpc1NhbWVEZWNhZGU7XG5leHBvcnRzLmlzU2FtZVllYXIgPSBpc1NhbWVZZWFyO1xuZXhwb3J0cy5nZXRRdWFydGVyID0gZ2V0UXVhcnRlcjtcbmV4cG9ydHMuaXNTYW1lUXVhcnRlciA9IGlzU2FtZVF1YXJ0ZXI7XG5leHBvcnRzLmlzU2FtZU1vbnRoID0gaXNTYW1lTW9udGg7XG5leHBvcnRzLmlzU2FtZURhdGUgPSBpc1NhbWVEYXRlO1xuZXhwb3J0cy5pc1NhbWVUaW1lID0gaXNTYW1lVGltZTtcbmV4cG9ydHMuaXNTYW1lV2VlayA9IGlzU2FtZVdlZWs7XG5leHBvcnRzLmlzRXF1YWwgPSBpc0VxdWFsO1xuZXhwb3J0cy5pc0luUmFuZ2UgPSBpc0luUmFuZ2U7XG5leHBvcnRzLmdldFdlZWtTdGFydERhdGUgPSBnZXRXZWVrU3RhcnREYXRlO1xuZXhwb3J0cy5nZXRDbG9zaW5nVmlld0RhdGUgPSBnZXRDbG9zaW5nVmlld0RhdGU7XG5leHBvcnRzLldFRUtfREFZX0NPVU5UID0gdm9pZCAwO1xudmFyIFdFRUtfREFZX0NPVU5UID0gNztcbmV4cG9ydHMuV0VFS19EQVlfQ09VTlQgPSBXRUVLX0RBWV9DT1VOVDtcblxuZnVuY3Rpb24gaXNOdWxsRXF1YWwodmFsdWUxLCB2YWx1ZTIpIHtcbiAgaWYgKCF2YWx1ZTEgJiYgIXZhbHVlMikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCF2YWx1ZTEgfHwgIXZhbHVlMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZURlY2FkZShnZW5lcmF0ZUNvbmZpZywgZGVjYWRlMSwgZGVjYWRlMikge1xuICB2YXIgZXF1YWwgPSBpc051bGxFcXVhbChkZWNhZGUxLCBkZWNhZGUyKTtcblxuICBpZiAodHlwZW9mIGVxdWFsID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZXF1YWw7XG4gIH1cblxuICB2YXIgbnVtMSA9IE1hdGguZmxvb3IoZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkZWNhZGUxKSAvIDEwKTtcbiAgdmFyIG51bTIgPSBNYXRoLmZsb29yKGdlbmVyYXRlQ29uZmlnLmdldFllYXIoZGVjYWRlMikgLyAxMCk7XG4gIHJldHVybiBudW0xID09PSBudW0yO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVZZWFyKGdlbmVyYXRlQ29uZmlnLCB5ZWFyMSwgeWVhcjIpIHtcbiAgdmFyIGVxdWFsID0gaXNOdWxsRXF1YWwoeWVhcjEsIHllYXIyKTtcblxuICBpZiAodHlwZW9mIGVxdWFsID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZXF1YWw7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcih5ZWFyMSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoeWVhcjIpO1xufVxuXG5mdW5jdGlvbiBnZXRRdWFydGVyKGdlbmVyYXRlQ29uZmlnLCBkYXRlKSB7XG4gIHZhciBxdW90YSA9IE1hdGguZmxvb3IoZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZGF0ZSkgLyAzKTtcbiAgcmV0dXJuIHF1b3RhICsgMTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lUXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgcXVhcnRlcjEsIHF1YXJ0ZXIyKSB7XG4gIHZhciBlcXVhbCA9IGlzTnVsbEVxdWFsKHF1YXJ0ZXIxLCBxdWFydGVyMik7XG5cbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG5cbiAgcmV0dXJuIGlzU2FtZVllYXIoZ2VuZXJhdGVDb25maWcsIHF1YXJ0ZXIxLCBxdWFydGVyMikgJiYgZ2V0UXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgcXVhcnRlcjEpID09PSBnZXRRdWFydGVyKGdlbmVyYXRlQ29uZmlnLCBxdWFydGVyMik7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU1vbnRoKGdlbmVyYXRlQ29uZmlnLCBtb250aDEsIG1vbnRoMikge1xuICB2YXIgZXF1YWwgPSBpc051bGxFcXVhbChtb250aDEsIG1vbnRoMik7XG5cbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG5cbiAgcmV0dXJuIGlzU2FtZVllYXIoZ2VuZXJhdGVDb25maWcsIG1vbnRoMSwgbW9udGgyKSAmJiBnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChtb250aDEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChtb250aDIpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBkYXRlMSwgZGF0ZTIpIHtcbiAgdmFyIGVxdWFsID0gaXNOdWxsRXF1YWwoZGF0ZTEsIGRhdGUyKTtcblxuICBpZiAodHlwZW9mIGVxdWFsID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZXF1YWw7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkYXRlMSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoZGF0ZTIpICYmIGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKGRhdGUxKSA9PT0gZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZGF0ZTIpICYmIGdlbmVyYXRlQ29uZmlnLmdldERhdGUoZGF0ZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXREYXRlKGRhdGUyKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lVGltZShnZW5lcmF0ZUNvbmZpZywgdGltZTEsIHRpbWUyKSB7XG4gIHZhciBlcXVhbCA9IGlzTnVsbEVxdWFsKHRpbWUxLCB0aW1lMik7XG5cbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmdldEhvdXIodGltZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRIb3VyKHRpbWUyKSAmJiBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUodGltZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUodGltZTIpICYmIGdlbmVyYXRlQ29uZmlnLmdldFNlY29uZCh0aW1lMSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldFNlY29uZCh0aW1lMik7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZVdlZWsoZ2VuZXJhdGVDb25maWcsIGxvY2FsZSwgZGF0ZTEsIGRhdGUyKSB7XG4gIHZhciBlcXVhbCA9IGlzTnVsbEVxdWFsKGRhdGUxLCBkYXRlMik7XG5cbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5nZXRXZWVrKGxvY2FsZSwgZGF0ZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0V2Vlayhsb2NhbGUsIGRhdGUyKTtcbn1cblxuZnVuY3Rpb24gaXNFcXVhbChnZW5lcmF0ZUNvbmZpZywgdmFsdWUxLCB2YWx1ZTIpIHtcbiAgcmV0dXJuIGlzU2FtZURhdGUoZ2VuZXJhdGVDb25maWcsIHZhbHVlMSwgdmFsdWUyKSAmJiBpc1NhbWVUaW1lKGdlbmVyYXRlQ29uZmlnLCB2YWx1ZTEsIHZhbHVlMik7XG59XG4vKiogQmV0d2VlbiBpbiBkYXRlIGJ1dCBub3QgZXF1YWwgb2YgZGF0ZSAqL1xuXG5cbmZ1bmN0aW9uIGlzSW5SYW5nZShnZW5lcmF0ZUNvbmZpZywgc3RhcnREYXRlLCBlbmREYXRlLCBjdXJyZW50KSB7XG4gIGlmICghc3RhcnREYXRlIHx8ICFlbmREYXRlIHx8ICFjdXJyZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICFpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBzdGFydERhdGUsIGN1cnJlbnQpICYmICFpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBlbmREYXRlLCBjdXJyZW50KSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKGN1cnJlbnQsIHN0YXJ0RGF0ZSkgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihlbmREYXRlLCBjdXJyZW50KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2Vla1N0YXJ0RGF0ZShsb2NhbGUsIGdlbmVyYXRlQ29uZmlnLCB2YWx1ZSkge1xuICB2YXIgd2Vla0ZpcnN0RGF5ID0gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFdlZWtGaXJzdERheShsb2NhbGUpO1xuICB2YXIgbW9udGhTdGFydERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXREYXRlKHZhbHVlLCAxKTtcbiAgdmFyIHN0YXJ0RGF0ZVdlZWtEYXkgPSBnZW5lcmF0ZUNvbmZpZy5nZXRXZWVrRGF5KG1vbnRoU3RhcnREYXRlKTtcbiAgdmFyIGFsaWduU3RhcnREYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkRGF0ZShtb250aFN0YXJ0RGF0ZSwgd2Vla0ZpcnN0RGF5IC0gc3RhcnREYXRlV2Vla0RheSk7XG5cbiAgaWYgKGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKGFsaWduU3RhcnREYXRlKSA9PT0gZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgodmFsdWUpICYmIGdlbmVyYXRlQ29uZmlnLmdldERhdGUoYWxpZ25TdGFydERhdGUpID4gMSkge1xuICAgIGFsaWduU3RhcnREYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkRGF0ZShhbGlnblN0YXJ0RGF0ZSwgLTcpO1xuICB9XG5cbiAgcmV0dXJuIGFsaWduU3RhcnREYXRlO1xufVxuXG5mdW5jdGlvbiBnZXRDbG9zaW5nVmlld0RhdGUodmlld0RhdGUsIHBpY2tlciwgZ2VuZXJhdGVDb25maWcpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogMTtcblxuICBzd2l0Y2ggKHBpY2tlcikge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIG9mZnNldCAqIDEwKTtcblxuICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZpZXdEYXRlLCBvZmZzZXQpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5hZGRNb250aCh2aWV3RGF0ZSwgb2Zmc2V0KTtcbiAgfVxufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZ2V0RXh0cmFGb290ZXI7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIGdldEV4dHJhRm9vdGVyKHByZWZpeENscywgbW9kZSwgcmVuZGVyRXh0cmFGb290ZXIpIHtcbiAgaWYgKCFyZW5kZXJFeHRyYUZvb3Rlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb290ZXItZXh0cmFcIilcbiAgfSwgcmVuZGVyRXh0cmFGb290ZXIobW9kZSkpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZ2V0UmFuZ2VzO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG5mdW5jdGlvbiBnZXRSYW5nZXMoX3JlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICBfcmVmJHJhbmdlTGlzdCA9IF9yZWYucmFuZ2VMaXN0LFxuICAgICAgcmFuZ2VMaXN0ID0gX3JlZiRyYW5nZUxpc3QgPT09IHZvaWQgMCA/IFtdIDogX3JlZiRyYW5nZUxpc3QsXG4gICAgICBfcmVmJGNvbXBvbmVudHMgPSBfcmVmLmNvbXBvbmVudHMsXG4gICAgICBjb21wb25lbnRzID0gX3JlZiRjb21wb25lbnRzID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkY29tcG9uZW50cyxcbiAgICAgIG5lZWRDb25maXJtQnV0dG9uID0gX3JlZi5uZWVkQ29uZmlybUJ1dHRvbixcbiAgICAgIG9uTm93ID0gX3JlZi5vbk5vdyxcbiAgICAgIG9uT2sgPSBfcmVmLm9uT2ssXG4gICAgICBva0Rpc2FibGVkID0gX3JlZi5va0Rpc2FibGVkLFxuICAgICAgc2hvd05vdyA9IF9yZWYuc2hvd05vdyxcbiAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlO1xuICB2YXIgcHJlc2V0Tm9kZTtcbiAgdmFyIG9rTm9kZTtcblxuICBpZiAocmFuZ2VMaXN0Lmxlbmd0aCkge1xuICAgIHZhciBJdGVtID0gY29tcG9uZW50cy5yYW5nZUl0ZW0gfHwgJ3NwYW4nO1xuICAgIHByZXNldE5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCByYW5nZUxpc3QubWFwKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIGxhYmVsID0gX3JlZjIubGFiZWwsXG4gICAgICAgICAgb25DbGljayA9IF9yZWYyLm9uQ2xpY2ssXG4gICAgICAgICAgb25Nb3VzZUVudGVyID0gX3JlZjIub25Nb3VzZUVudGVyLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZSA9IF9yZWYyLm9uTW91c2VMZWF2ZTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICBrZXk6IGxhYmVsLFxuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJlc2V0XCIpXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KEl0ZW0sIHtcbiAgICAgICAgb25DbGljazogb25DbGljayxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlXG4gICAgICB9LCBsYWJlbCkpO1xuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChuZWVkQ29uZmlybUJ1dHRvbikge1xuICAgIHZhciBCdXR0b24gPSBjb21wb25lbnRzLmJ1dHRvbiB8fCAnYnV0dG9uJztcblxuICAgIGlmIChvbk5vdyAmJiAhcHJlc2V0Tm9kZSAmJiBzaG93Tm93ICE9PSBmYWxzZSkge1xuICAgICAgcHJlc2V0Tm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ub3dcIilcbiAgICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vdy1idG5cIiksXG4gICAgICAgIG9uQ2xpY2s6IG9uTm93XG4gICAgICB9LCBsb2NhbGUubm93KSk7XG4gICAgfVxuXG4gICAgb2tOb2RlID0gbmVlZENvbmZpcm1CdXR0b24gJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1va1wiKVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7XG4gICAgICBkaXNhYmxlZDogb2tEaXNhYmxlZCxcbiAgICAgIG9uQ2xpY2s6IG9uT2tcbiAgICB9LCBsb2NhbGUub2spKTtcbiAgfVxuXG4gIGlmICghcHJlc2V0Tm9kZSAmJiAhb2tOb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcmFuZ2VzXCIpXG4gIH0sIHByZXNldE5vZGUsIG9rTm9kZSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmxlZnRQYWQgPSBsZWZ0UGFkO1xuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcbmV4cG9ydHMuZGVmYXVsdCA9IGdldERhdGFPckFyaWFQcm9wcztcbmV4cG9ydHMuZ2V0VmFsdWUgPSBnZXRWYWx1ZTtcbmV4cG9ydHMudXBkYXRlVmFsdWVzID0gdXBkYXRlVmFsdWVzO1xuZXhwb3J0cy50dXBsZSA9IHZvaWQgMDtcblxuZnVuY3Rpb24gbGVmdFBhZChzdHIsIGxlbmd0aCkge1xuICB2YXIgZmlsbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogJzAnO1xuICB2YXIgY3VycmVudCA9IFN0cmluZyhzdHIpO1xuXG4gIHdoaWxlIChjdXJyZW50Lmxlbmd0aCA8IGxlbmd0aCkge1xuICAgIGN1cnJlbnQgPSBcIlwiLmNvbmNhdChmaWxsKS5jb25jYXQoc3RyKTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufVxuXG52YXIgdHVwbGUgPSBmdW5jdGlvbiB0dXBsZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufTtcblxuZXhwb3J0cy50dXBsZSA9IHR1cGxlO1xuXG5mdW5jdGlvbiB0b0FycmF5KHZhbCkge1xuICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhT3JBcmlhUHJvcHMocHJvcHMpIHtcbiAgdmFyIHJldFByb3BzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoKGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJyB8fCBrZXkgPT09ICdyb2xlJyB8fCBrZXkgPT09ICduYW1lJykgJiYga2V5LnN1YnN0cigwLCA3KSAhPT0gJ2RhdGEtX18nKSB7XG4gICAgICByZXRQcm9wc1trZXldID0gcHJvcHNba2V5XTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmV0UHJvcHM7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHZhbHVlcywgaW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlcyA/IHZhbHVlc1tpbmRleF0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWYWx1ZXModmFsdWVzLCB2YWx1ZSwgaW5kZXgpIHtcbiAgdmFyIG5ld1ZhbHVlcyA9IFtnZXRWYWx1ZSh2YWx1ZXMsIDApLCBnZXRWYWx1ZSh2YWx1ZXMsIDEpXTtcbiAgbmV3VmFsdWVzW2luZGV4XSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlKG5ld1ZhbHVlc1tpbmRleF0pIDogdmFsdWU7XG5cbiAgaWYgKCFuZXdWYWx1ZXNbMF0gJiYgIW5ld1ZhbHVlc1sxXSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG5ld1ZhbHVlcztcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuc2V0VGltZSA9IHNldFRpbWU7XG5leHBvcnRzLmdldExvd2VyQm91bmRUaW1lID0gZ2V0TG93ZXJCb3VuZFRpbWU7XG5cbmZ1bmN0aW9uIHNldFRpbWUoZ2VuZXJhdGVDb25maWcsIGRhdGUsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSB7XG4gIHZhciBuZXh0VGltZSA9IGdlbmVyYXRlQ29uZmlnLnNldEhvdXIoZGF0ZSwgaG91cik7XG4gIG5leHRUaW1lID0gZ2VuZXJhdGVDb25maWcuc2V0TWludXRlKG5leHRUaW1lLCBtaW51dGUpO1xuICBuZXh0VGltZSA9IGdlbmVyYXRlQ29uZmlnLnNldFNlY29uZChuZXh0VGltZSwgc2Vjb25kKTtcbiAgcmV0dXJuIG5leHRUaW1lO1xufVxuXG5mdW5jdGlvbiBnZXRMb3dlckJvdW5kVGltZShob3VyLCBtaW51dGUsIHNlY29uZCwgaG91clN0ZXAsIG1pbnV0ZVN0ZXAsIHNlY29uZFN0ZXApIHtcbiAgdmFyIGxvd2VyQm91bmRIb3VyID0gTWF0aC5mbG9vcihob3VyIC8gaG91clN0ZXApICogaG91clN0ZXA7XG5cbiAgaWYgKGxvd2VyQm91bmRIb3VyIDwgaG91cikge1xuICAgIHJldHVybiBbbG93ZXJCb3VuZEhvdXIsIDYwIC0gbWludXRlU3RlcCwgNjAgLSBzZWNvbmRTdGVwXTtcbiAgfVxuXG4gIHZhciBsb3dlckJvdW5kTWludXRlID0gTWF0aC5mbG9vcihtaW51dGUgLyBtaW51dGVTdGVwKSAqIG1pbnV0ZVN0ZXA7XG5cbiAgaWYgKGxvd2VyQm91bmRNaW51dGUgPCBtaW51dGUpIHtcbiAgICByZXR1cm4gW2xvd2VyQm91bmRIb3VyLCBsb3dlckJvdW5kTWludXRlLCA2MCAtIHNlY29uZFN0ZXBdO1xuICB9XG5cbiAgdmFyIGxvd2VyQm91bmRTZWNvbmQgPSBNYXRoLmZsb29yKHNlY29uZCAvIHNlY29uZFN0ZXApICogc2Vjb25kU3RlcDtcbiAgcmV0dXJuIFtsb3dlckJvdW5kSG91ciwgbG93ZXJCb3VuZE1pbnV0ZSwgbG93ZXJCb3VuZFNlY29uZF07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5zY3JvbGxUbyA9IHNjcm9sbFRvO1xuZXhwb3J0cy5jcmVhdGVLZXlEb3duSGFuZGxlciA9IGNyZWF0ZUtleURvd25IYW5kbGVyO1xuZXhwb3J0cy5nZXREZWZhdWx0Rm9ybWF0ID0gZ2V0RGVmYXVsdEZvcm1hdDtcbmV4cG9ydHMuZ2V0SW5wdXRTaXplID0gZ2V0SW5wdXRTaXplO1xuZXhwb3J0cy5hZGRHbG9iYWxNb3VzZURvd25FdmVudCA9IGFkZEdsb2JhbE1vdXNlRG93bkV2ZW50O1xuZXhwb3J0cy5lbGVtZW50c0NvbnRhaW5zID0gZWxlbWVudHNDb250YWlucztcbmV4cG9ydHMuUGlja2VyTW9kZU1hcCA9IHZvaWQgMDtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvS2V5Q29kZVwiKSk7XG5cbnZhciBzY3JvbGxJZHMgPSBuZXcgTWFwKCk7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuXG5mdW5jdGlvbiBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24pIHtcbiAgaWYgKHNjcm9sbElkcy5nZXQoZWxlbWVudCkpIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZShzY3JvbGxJZHMuZ2V0KGVsZW1lbnQpKTtcbiAgfSAvLyBqdW1wIHRvIHRhcmdldCBpZiBkdXJhdGlvbiB6ZXJvXG5cblxuICBpZiAoZHVyYXRpb24gPD0gMCkge1xuICAgIHNjcm9sbElkcy5zZXQoZWxlbWVudCwgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdG87XG4gICAgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkaWZmZXJlbmNlID0gdG8gLSBlbGVtZW50LnNjcm9sbFRvcDtcbiAgdmFyIHBlclRpY2sgPSBkaWZmZXJlbmNlIC8gZHVyYXRpb24gKiAxMDtcbiAgc2Nyb2xsSWRzLnNldChlbGVtZW50LCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgIGVsZW1lbnQuc2Nyb2xsVG9wICs9IHBlclRpY2s7XG5cbiAgICBpZiAoZWxlbWVudC5zY3JvbGxUb3AgIT09IHRvKSB7XG4gICAgICBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24gLSAxMCk7XG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleURvd25IYW5kbGVyKGV2ZW50LCBfcmVmKSB7XG4gIHZhciBvbkxlZnRSaWdodCA9IF9yZWYub25MZWZ0UmlnaHQsXG4gICAgICBvbkN0cmxMZWZ0UmlnaHQgPSBfcmVmLm9uQ3RybExlZnRSaWdodCxcbiAgICAgIG9uVXBEb3duID0gX3JlZi5vblVwRG93bixcbiAgICAgIG9uUGFnZVVwRG93biA9IF9yZWYub25QYWdlVXBEb3duLFxuICAgICAgb25FbnRlciA9IF9yZWYub25FbnRlcjtcbiAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2gsXG4gICAgICBjdHJsS2V5ID0gZXZlbnQuY3RybEtleSxcbiAgICAgIG1ldGFLZXkgPSBldmVudC5tZXRhS2V5O1xuXG4gIHN3aXRjaCAod2hpY2gpIHtcbiAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuTEVGVDpcbiAgICAgIGlmIChjdHJsS2V5IHx8IG1ldGFLZXkpIHtcbiAgICAgICAgaWYgKG9uQ3RybExlZnRSaWdodCkge1xuICAgICAgICAgIG9uQ3RybExlZnRSaWdodCgtMSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob25MZWZ0UmlnaHQpIHtcbiAgICAgICAgb25MZWZ0UmlnaHQoLTEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuUklHSFQ6XG4gICAgICBpZiAoY3RybEtleSB8fCBtZXRhS2V5KSB7XG4gICAgICAgIGlmIChvbkN0cmxMZWZ0UmlnaHQpIHtcbiAgICAgICAgICBvbkN0cmxMZWZ0UmlnaHQoMSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob25MZWZ0UmlnaHQpIHtcbiAgICAgICAgb25MZWZ0UmlnaHQoMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5VUDpcbiAgICAgIGlmIChvblVwRG93bikge1xuICAgICAgICBvblVwRG93bigtMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5ET1dOOlxuICAgICAgaWYgKG9uVXBEb3duKSB7XG4gICAgICAgIG9uVXBEb3duKDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuUEFHRV9VUDpcbiAgICAgIGlmIChvblBhZ2VVcERvd24pIHtcbiAgICAgICAgb25QYWdlVXBEb3duKC0xKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LlBBR0VfRE9XTjpcbiAgICAgIGlmIChvblBhZ2VVcERvd24pIHtcbiAgICAgICAgb25QYWdlVXBEb3duKDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuRU5URVI6XG4gICAgICBpZiAob25FbnRlcikge1xuICAgICAgICBvbkVudGVyKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0gLy8gPT09PT09PT09PT09PT09PT09PT09IEZvcm1hdCA9PT09PT09PT09PT09PT09PT09PT1cblxuXG5mdW5jdGlvbiBnZXREZWZhdWx0Rm9ybWF0KGZvcm1hdCwgcGlja2VyLCBzaG93VGltZSwgdXNlMTJIb3Vycykge1xuICB2YXIgbWVyZ2VkRm9ybWF0ID0gZm9ybWF0O1xuXG4gIGlmICghbWVyZ2VkRm9ybWF0KSB7XG4gICAgc3dpdGNoIChwaWNrZXIpIHtcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSB1c2UxMkhvdXJzID8gJ2hoOm1tOnNzIGEnIDogJ0hIOm1tOnNzJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSAnZ2dnZy13byc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIG1lcmdlZEZvcm1hdCA9ICdZWVlZLU1NJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSAnWVlZWS1bUV1RJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSAnWVlZWSc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSBzaG93VGltZSA/ICdZWVlZLU1NLUREIEhIOm1tOnNzJyA6ICdZWVlZLU1NLUREJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkRm9ybWF0O1xufVxuXG5mdW5jdGlvbiBnZXRJbnB1dFNpemUocGlja2VyLCBmb3JtYXQpIHtcbiAgdmFyIGRlZmF1bHRTaXplID0gcGlja2VyID09PSAndGltZScgPyA4IDogMTA7XG4gIHJldHVybiBNYXRoLm1heChkZWZhdWx0U2l6ZSwgZm9ybWF0Lmxlbmd0aCkgKyAyO1xufVxuXG52YXIgZ2xvYmFsQ2xpY2tGdW5jID0gbnVsbDtcbnZhciBjbGlja0NhbGxiYWNrcyA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gYWRkR2xvYmFsTW91c2VEb3duRXZlbnQoY2FsbGJhY2spIHtcbiAgaWYgKCFnbG9iYWxDbGlja0Z1bmMgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICBnbG9iYWxDbGlja0Z1bmMgPSBmdW5jdGlvbiBnbG9iYWxDbGlja0Z1bmMoZSkge1xuICAgICAgLy8gQ2xvbmUgYSBuZXcgbGlzdCB0byBhdm9pZCByZXBlYXQgdHJpZ2dlciBldmVudHNcbiAgICAgICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGNsaWNrQ2FsbGJhY2tzKS5mb3JFYWNoKGZ1bmN0aW9uIChxdWV1ZUZ1bmMpIHtcbiAgICAgICAgcXVldWVGdW5jKGUpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBnbG9iYWxDbGlja0Z1bmMpO1xuICB9XG5cbiAgY2xpY2tDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBjbGlja0NhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spO1xuXG4gICAgaWYgKGNsaWNrQ2FsbGJhY2tzLnNpemUgPT09IDApIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBnbG9iYWxDbGlja0Z1bmMpO1xuICAgICAgZ2xvYmFsQ2xpY2tGdW5jID0gbnVsbDtcbiAgICB9XG4gIH07XG59IC8vID09PT09PT09PT09PT09PT09PT09PT0gTW9kZSA9PT09PT09PT09PT09PT09PT09PT09XG5cblxudmFyIGdldFllYXJOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldFllYXJOZXh0TW9kZShuZXh0KSB7XG4gIGlmIChuZXh0ID09PSAnbW9udGgnIHx8IG5leHQgPT09ICdkYXRlJykge1xuICAgIHJldHVybiAneWVhcic7XG4gIH1cblxuICByZXR1cm4gbmV4dDtcbn07XG5cbnZhciBnZXRNb250aE5leHRNb2RlID0gZnVuY3Rpb24gZ2V0TW9udGhOZXh0TW9kZShuZXh0KSB7XG4gIGlmIChuZXh0ID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gJ21vbnRoJztcbiAgfVxuXG4gIHJldHVybiBuZXh0O1xufTtcblxudmFyIGdldFF1YXJ0ZXJOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldFF1YXJ0ZXJOZXh0TW9kZShuZXh0KSB7XG4gIGlmIChuZXh0ID09PSAnbW9udGgnIHx8IG5leHQgPT09ICdkYXRlJykge1xuICAgIHJldHVybiAncXVhcnRlcic7XG4gIH1cblxuICByZXR1cm4gbmV4dDtcbn07XG5cbnZhciBnZXRXZWVrTmV4dE1vZGUgPSBmdW5jdGlvbiBnZXRXZWVrTmV4dE1vZGUobmV4dCkge1xuICBpZiAobmV4dCA9PT0gJ2RhdGUnKSB7XG4gICAgcmV0dXJuICd3ZWVrJztcbiAgfVxuXG4gIHJldHVybiBuZXh0O1xufTtcblxudmFyIFBpY2tlck1vZGVNYXAgPSB7XG4gIHllYXI6IGdldFllYXJOZXh0TW9kZSxcbiAgbW9udGg6IGdldE1vbnRoTmV4dE1vZGUsXG4gIHF1YXJ0ZXI6IGdldFF1YXJ0ZXJOZXh0TW9kZSxcbiAgd2VlazogZ2V0V2Vla05leHRNb2RlLFxuICB0aW1lOiBudWxsLFxuICBkYXRlOiBudWxsXG59O1xuZXhwb3J0cy5QaWNrZXJNb2RlTWFwID0gUGlja2VyTW9kZU1hcDtcblxuZnVuY3Rpb24gZWxlbWVudHNDb250YWlucyhlbGVtZW50cywgdGFyZ2V0KSB7XG4gIHJldHVybiBlbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZWxlICYmIGVsZS5jb250YWlucyh0YXJnZXQpO1xuICB9KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9jb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5cbnZhciBncmFkaWVudFNlZWQgPSAwO1xuXG5mdW5jdGlvbiBzdHJpcFBlcmNlbnRUb051bWJlcihwZXJjZW50KSB7XG4gIHJldHVybiArcGVyY2VudC5yZXBsYWNlKCclJywgJycpO1xufVxuXG5mdW5jdGlvbiB0b0FycmF5KHN5bUFycmF5KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHN5bUFycmF5KSA/IHN5bUFycmF5IDogW3N5bUFycmF5XTtcbn1cblxuZnVuY3Rpb24gZ2V0UGF0aFN0eWxlcyhvZmZzZXQsIHBlcmNlbnQsIHN0cm9rZUNvbG9yLCBzdHJva2VXaWR0aCkge1xuICB2YXIgZ2FwRGVncmVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAwO1xuICB2YXIgZ2FwUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gNSA/IGFyZ3VtZW50c1s1XSA6IHVuZGVmaW5lZDtcbiAgdmFyIHJhZGl1cyA9IDUwIC0gc3Ryb2tlV2lkdGggLyAyO1xuICB2YXIgYmVnaW5Qb3NpdGlvblggPSAwO1xuICB2YXIgYmVnaW5Qb3NpdGlvblkgPSAtcmFkaXVzO1xuICB2YXIgZW5kUG9zaXRpb25YID0gMDtcbiAgdmFyIGVuZFBvc2l0aW9uWSA9IC0yICogcmFkaXVzO1xuXG4gIHN3aXRjaCAoZ2FwUG9zaXRpb24pIHtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGJlZ2luUG9zaXRpb25YID0gLXJhZGl1cztcbiAgICAgIGJlZ2luUG9zaXRpb25ZID0gMDtcbiAgICAgIGVuZFBvc2l0aW9uWCA9IDIgKiByYWRpdXM7XG4gICAgICBlbmRQb3NpdGlvblkgPSAwO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyaWdodCc6XG4gICAgICBiZWdpblBvc2l0aW9uWCA9IHJhZGl1cztcbiAgICAgIGJlZ2luUG9zaXRpb25ZID0gMDtcbiAgICAgIGVuZFBvc2l0aW9uWCA9IC0yICogcmFkaXVzO1xuICAgICAgZW5kUG9zaXRpb25ZID0gMDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGJlZ2luUG9zaXRpb25ZID0gcmFkaXVzO1xuICAgICAgZW5kUG9zaXRpb25ZID0gMiAqIHJhZGl1cztcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgfVxuXG4gIHZhciBwYXRoU3RyaW5nID0gXCJNIDUwLDUwIG0gXCIuY29uY2F0KGJlZ2luUG9zaXRpb25YLCBcIixcIikuY29uY2F0KGJlZ2luUG9zaXRpb25ZLCBcIlxcbiAgIGEgXCIpLmNvbmNhdChyYWRpdXMsIFwiLFwiKS5jb25jYXQocmFkaXVzLCBcIiAwIDEgMSBcIikuY29uY2F0KGVuZFBvc2l0aW9uWCwgXCIsXCIpLmNvbmNhdCgtZW5kUG9zaXRpb25ZLCBcIlxcbiAgIGEgXCIpLmNvbmNhdChyYWRpdXMsIFwiLFwiKS5jb25jYXQocmFkaXVzLCBcIiAwIDEgMSBcIikuY29uY2F0KC1lbmRQb3NpdGlvblgsIFwiLFwiKS5jb25jYXQoZW5kUG9zaXRpb25ZKTtcbiAgdmFyIGxlbiA9IE1hdGguUEkgKiAyICogcmFkaXVzO1xuICB2YXIgcGF0aFN0eWxlID0ge1xuICAgIHN0cm9rZTogc3Ryb2tlQ29sb3IsXG4gICAgc3Ryb2tlRGFzaGFycmF5OiBcIlwiLmNvbmNhdChwZXJjZW50IC8gMTAwICogKGxlbiAtIGdhcERlZ3JlZSksIFwicHggXCIpLmNvbmNhdChsZW4sIFwicHhcIiksXG4gICAgc3Ryb2tlRGFzaG9mZnNldDogXCItXCIuY29uY2F0KGdhcERlZ3JlZSAvIDIgKyBvZmZzZXQgLyAxMDAgKiAobGVuIC0gZ2FwRGVncmVlKSwgXCJweFwiKSxcbiAgICB0cmFuc2l0aW9uOiAnc3Ryb2tlLWRhc2hvZmZzZXQgLjNzIGVhc2UgMHMsIHN0cm9rZS1kYXNoYXJyYXkgLjNzIGVhc2UgMHMsIHN0cm9rZSAuM3MsIHN0cm9rZS13aWR0aCAuMDZzIGVhc2UgLjNzJ1xuICB9O1xuICByZXR1cm4ge1xuICAgIHBhdGhTdHJpbmc6IHBhdGhTdHJpbmcsXG4gICAgcGF0aFN0eWxlOiBwYXRoU3R5bGVcbiAgfTtcbn1cblxudmFyIENpcmNsZSA9IGZ1bmN0aW9uIENpcmNsZShfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIHN0cm9rZVdpZHRoID0gX3JlZi5zdHJva2VXaWR0aCxcbiAgICAgIHRyYWlsV2lkdGggPSBfcmVmLnRyYWlsV2lkdGgsXG4gICAgICBnYXBEZWdyZWUgPSBfcmVmLmdhcERlZ3JlZSxcbiAgICAgIGdhcFBvc2l0aW9uID0gX3JlZi5nYXBQb3NpdGlvbixcbiAgICAgIHRyYWlsQ29sb3IgPSBfcmVmLnRyYWlsQ29sb3IsXG4gICAgICBzdHJva2VMaW5lY2FwID0gX3JlZi5zdHJva2VMaW5lY2FwLFxuICAgICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBzdHJva2VDb2xvciA9IF9yZWYuc3Ryb2tlQ29sb3IsXG4gICAgICBwZXJjZW50ID0gX3JlZi5wZXJjZW50LFxuICAgICAgcmVzdFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3JlZiwgW1wicHJlZml4Q2xzXCIsIFwic3Ryb2tlV2lkdGhcIiwgXCJ0cmFpbFdpZHRoXCIsIFwiZ2FwRGVncmVlXCIsIFwiZ2FwUG9zaXRpb25cIiwgXCJ0cmFpbENvbG9yXCIsIFwic3Ryb2tlTGluZWNhcFwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwic3Ryb2tlQ29sb3JcIiwgXCJwZXJjZW50XCJdKTtcbiAgdmFyIGdyYWRpZW50SWQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBncmFkaWVudFNlZWQgKz0gMTtcbiAgICByZXR1cm4gZ3JhZGllbnRTZWVkO1xuICB9LCBbXSk7XG5cbiAgdmFyIF9nZXRQYXRoU3R5bGVzID0gZ2V0UGF0aFN0eWxlcygwLCAxMDAsIHRyYWlsQ29sb3IsIHN0cm9rZVdpZHRoLCBnYXBEZWdyZWUsIGdhcFBvc2l0aW9uKSxcbiAgICAgIHBhdGhTdHJpbmcgPSBfZ2V0UGF0aFN0eWxlcy5wYXRoU3RyaW5nLFxuICAgICAgcGF0aFN0eWxlID0gX2dldFBhdGhTdHlsZXMucGF0aFN0eWxlO1xuXG4gIHZhciBwZXJjZW50TGlzdCA9IHRvQXJyYXkocGVyY2VudCk7XG4gIHZhciBzdHJva2VDb2xvckxpc3QgPSB0b0FycmF5KHN0cm9rZUNvbG9yKTtcbiAgdmFyIGdyYWRpZW50ID0gc3Ryb2tlQ29sb3JMaXN0LmZpbmQoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjb2xvcikgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuICB9KTtcblxuICB2YXIgX3VzZVRyYW5zaXRpb25EdXJhdGlvID0gKDAsIF9jb21tb24udXNlVHJhbnNpdGlvbkR1cmF0aW9uKShwZXJjZW50TGlzdCksXG4gICAgICBfdXNlVHJhbnNpdGlvbkR1cmF0aW8yID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlVHJhbnNpdGlvbkR1cmF0aW8sIDEpLFxuICAgICAgcGF0aHMgPSBfdXNlVHJhbnNpdGlvbkR1cmF0aW8yWzBdO1xuXG4gIHZhciBnZXRTdG9rZUxpc3QgPSBmdW5jdGlvbiBnZXRTdG9rZUxpc3QoKSB7XG4gICAgdmFyIHN0YWNrUHRnID0gMDtcbiAgICByZXR1cm4gcGVyY2VudExpc3QubWFwKGZ1bmN0aW9uIChwdGcsIGluZGV4KSB7XG4gICAgICB2YXIgY29sb3IgPSBzdHJva2VDb2xvckxpc3RbaW5kZXhdIHx8IHN0cm9rZUNvbG9yTGlzdFtzdHJva2VDb2xvckxpc3QubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgc3Ryb2tlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNvbG9yKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyBcInVybCgjXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JhZGllbnQtXCIpLmNvbmNhdChncmFkaWVudElkLCBcIilcIikgOiAnJztcbiAgICAgIHZhciBwYXRoU3R5bGVzID0gZ2V0UGF0aFN0eWxlcyhzdGFja1B0ZywgcHRnLCBjb2xvciwgc3Ryb2tlV2lkdGgsIGdhcERlZ3JlZSwgZ2FwUG9zaXRpb24pO1xuICAgICAgc3RhY2tQdGcgKz0gcHRnO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNpcmNsZS1wYXRoXCIpLFxuICAgICAgICBkOiBwYXRoU3R5bGVzLnBhdGhTdHJpbmcsXG4gICAgICAgIHN0cm9rZTogc3Ryb2tlLFxuICAgICAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgICAgICBzdHJva2VXaWR0aDogc3Ryb2tlV2lkdGgsXG4gICAgICAgIG9wYWNpdHk6IHB0ZyA9PT0gMCA/IDAgOiAxLFxuICAgICAgICBmaWxsT3BhY2l0eTogXCIwXCIsXG4gICAgICAgIHN0eWxlOiBwYXRoU3R5bGVzLnBhdGhTdHlsZSxcbiAgICAgICAgcmVmOiBwYXRoc1tpbmRleF1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIE9iamVjdC5hc3NpZ24oe1xuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2lyY2xlXCIpLCBjbGFzc05hbWUpLFxuICAgIHZpZXdCb3g6IFwiMCAwIDEwMCAxMDBcIixcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcmVzdFByb3BzKSwgZ3JhZGllbnQgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCwgUmVhY3QuY3JlYXRlRWxlbWVudChcImxpbmVhckdyYWRpZW50XCIsIHtcbiAgICBpZDogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ncmFkaWVudC1cIikuY29uY2F0KGdyYWRpZW50SWQpLFxuICAgIHgxOiBcIjEwMCVcIixcbiAgICB5MTogXCIwJVwiLFxuICAgIHgyOiBcIjAlXCIsXG4gICAgeTI6IFwiMCVcIlxuICB9LCBPYmplY3Qua2V5cyhncmFkaWVudCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBzdHJpcFBlcmNlbnRUb051bWJlcihhKSAtIHN0cmlwUGVyY2VudFRvTnVtYmVyKGIpO1xuICB9KS5tYXAoZnVuY3Rpb24gKGtleSwgaW5kZXgpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInN0b3BcIiwge1xuICAgICAga2V5OiBpbmRleCxcbiAgICAgIG9mZnNldDoga2V5LFxuICAgICAgc3RvcENvbG9yOiBncmFkaWVudFtrZXldXG4gICAgfSk7XG4gIH0pKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2lyY2xlLXRyYWlsXCIpLFxuICAgIGQ6IHBhdGhTdHJpbmcsXG4gICAgc3Ryb2tlOiB0cmFpbENvbG9yLFxuICAgIHN0cm9rZUxpbmVjYXA6IHN0cm9rZUxpbmVjYXAsXG4gICAgc3Ryb2tlV2lkdGg6IHRyYWlsV2lkdGggfHwgc3Ryb2tlV2lkdGgsXG4gICAgZmlsbE9wYWNpdHk6IFwiMFwiLFxuICAgIHN0eWxlOiBwYXRoU3R5bGVcbiAgfSksIGdldFN0b2tlTGlzdCgpLnJldmVyc2UoKSk7XG59O1xuXG5DaXJjbGUuZGVmYXVsdFByb3BzID0gX2NvbW1vbi5kZWZhdWx0UHJvcHM7XG5DaXJjbGUuZGlzcGxheU5hbWUgPSAnQ2lyY2xlJztcbnZhciBfZGVmYXVsdCA9IENpcmNsZTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcblxudmFyIExpbmUgPSBmdW5jdGlvbiBMaW5lKF9yZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgcGVyY2VudCA9IF9yZWYucGVyY2VudCxcbiAgICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgc3Ryb2tlQ29sb3IgPSBfcmVmLnN0cm9rZUNvbG9yLFxuICAgICAgc3Ryb2tlTGluZWNhcCA9IF9yZWYuc3Ryb2tlTGluZWNhcCxcbiAgICAgIHN0cm9rZVdpZHRoID0gX3JlZi5zdHJva2VXaWR0aCxcbiAgICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICAgIHRyYWlsQ29sb3IgPSBfcmVmLnRyYWlsQ29sb3IsXG4gICAgICB0cmFpbFdpZHRoID0gX3JlZi50cmFpbFdpZHRoLFxuICAgICAgdHJhbnNpdGlvbiA9IF9yZWYudHJhbnNpdGlvbixcbiAgICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF9yZWYsIFtcImNsYXNzTmFtZVwiLCBcInBlcmNlbnRcIiwgXCJwcmVmaXhDbHNcIiwgXCJzdHJva2VDb2xvclwiLCBcInN0cm9rZUxpbmVjYXBcIiwgXCJzdHJva2VXaWR0aFwiLCBcInN0eWxlXCIsIFwidHJhaWxDb2xvclwiLCBcInRyYWlsV2lkdGhcIiwgXCJ0cmFuc2l0aW9uXCJdKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGRlbGV0ZSByZXN0UHJvcHMuZ2FwUG9zaXRpb247XG4gIHZhciBwZXJjZW50TGlzdCA9IEFycmF5LmlzQXJyYXkocGVyY2VudCkgPyBwZXJjZW50IDogW3BlcmNlbnRdO1xuICB2YXIgc3Ryb2tlQ29sb3JMaXN0ID0gQXJyYXkuaXNBcnJheShzdHJva2VDb2xvcikgPyBzdHJva2VDb2xvciA6IFtzdHJva2VDb2xvcl07XG5cbiAgdmFyIF91c2VUcmFuc2l0aW9uRHVyYXRpbyA9ICgwLCBfY29tbW9uLnVzZVRyYW5zaXRpb25EdXJhdGlvbikocGVyY2VudExpc3QpLFxuICAgICAgX3VzZVRyYW5zaXRpb25EdXJhdGlvMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVRyYW5zaXRpb25EdXJhdGlvLCAxKSxcbiAgICAgIHBhdGhzID0gX3VzZVRyYW5zaXRpb25EdXJhdGlvMlswXTtcblxuICB2YXIgY2VudGVyID0gc3Ryb2tlV2lkdGggLyAyO1xuICB2YXIgcmlnaHQgPSAxMDAgLSBzdHJva2VXaWR0aCAvIDI7XG4gIHZhciBwYXRoU3RyaW5nID0gXCJNIFwiLmNvbmNhdChzdHJva2VMaW5lY2FwID09PSAncm91bmQnID8gY2VudGVyIDogMCwgXCIsXCIpLmNvbmNhdChjZW50ZXIsIFwiXFxuICAgICAgICAgTCBcIikuY29uY2F0KHN0cm9rZUxpbmVjYXAgPT09ICdyb3VuZCcgPyByaWdodCA6IDEwMCwgXCIsXCIpLmNvbmNhdChjZW50ZXIpO1xuICB2YXIgdmlld0JveFN0cmluZyA9IFwiMCAwIDEwMCBcIi5jb25jYXQoc3Ryb2tlV2lkdGgpO1xuICB2YXIgc3RhY2tQdGcgPSAwO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBPYmplY3QuYXNzaWduKHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpbmVcIiksIGNsYXNzTmFtZSksXG4gICAgdmlld0JveDogdmlld0JveFN0cmluZyxcbiAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiBcIm5vbmVcIixcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcmVzdFByb3BzKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saW5lLXRyYWlsXCIpLFxuICAgIGQ6IHBhdGhTdHJpbmcsXG4gICAgc3Ryb2tlTGluZWNhcDogc3Ryb2tlTGluZWNhcCxcbiAgICBzdHJva2U6IHRyYWlsQ29sb3IsXG4gICAgc3Ryb2tlV2lkdGg6IHRyYWlsV2lkdGggfHwgc3Ryb2tlV2lkdGgsXG4gICAgZmlsbE9wYWNpdHk6IFwiMFwiXG4gIH0pLCBwZXJjZW50TGlzdC5tYXAoZnVuY3Rpb24gKHB0ZywgaW5kZXgpIHtcbiAgICB2YXIgcGF0aFN0eWxlID0ge1xuICAgICAgc3Ryb2tlRGFzaGFycmF5OiBcIlwiLmNvbmNhdChwdGcsIFwicHgsIDEwMHB4XCIpLFxuICAgICAgc3Ryb2tlRGFzaG9mZnNldDogXCItXCIuY29uY2F0KHN0YWNrUHRnLCBcInB4XCIpLFxuICAgICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbiB8fCAnc3Ryb2tlLWRhc2hvZmZzZXQgMC4zcyBlYXNlIDBzLCBzdHJva2UtZGFzaGFycmF5IC4zcyBlYXNlIDBzLCBzdHJva2UgMC4zcyBsaW5lYXInXG4gICAgfTtcbiAgICB2YXIgY29sb3IgPSBzdHJva2VDb2xvckxpc3RbaW5kZXhdIHx8IHN0cm9rZUNvbG9yTGlzdFtzdHJva2VDb2xvckxpc3QubGVuZ3RoIC0gMV07XG4gICAgc3RhY2tQdGcgKz0gcHRnO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICBrZXk6IGluZGV4LFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpbmUtcGF0aFwiKSxcbiAgICAgIGQ6IHBhdGhTdHJpbmcsXG4gICAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgICAgc3Ryb2tlOiBjb2xvcixcbiAgICAgIHN0cm9rZVdpZHRoOiBzdHJva2VXaWR0aCxcbiAgICAgIGZpbGxPcGFjaXR5OiBcIjBcIixcbiAgICAgIHJlZjogcGF0aHNbaW5kZXhdLFxuICAgICAgc3R5bGU6IHBhdGhTdHlsZVxuICAgIH0pO1xuICB9KSk7XG59O1xuXG5MaW5lLmRlZmF1bHRQcm9wcyA9IF9jb21tb24uZGVmYXVsdFByb3BzO1xuTGluZS5kaXNwbGF5TmFtZSA9ICdMaW5lJztcbnZhciBfZGVmYXVsdCA9IExpbmU7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudXNlVHJhbnNpdGlvbkR1cmF0aW9uID0gZXhwb3J0cy5kZWZhdWx0UHJvcHMgPSB2b2lkIDA7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNsYXNzTmFtZTogJycsXG4gIHBlcmNlbnQ6IDAsXG4gIHByZWZpeENsczogJ3JjLXByb2dyZXNzJyxcbiAgc3Ryb2tlQ29sb3I6ICcjMmRiN2Y1JyxcbiAgc3Ryb2tlTGluZWNhcDogJ3JvdW5kJyxcbiAgc3Ryb2tlV2lkdGg6IDEsXG4gIHN0eWxlOiB7fSxcbiAgdHJhaWxDb2xvcjogJyNEOUQ5RDknLFxuICB0cmFpbFdpZHRoOiAxXG59O1xuZXhwb3J0cy5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbnZhciB1c2VUcmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbiB1c2VUcmFuc2l0aW9uRHVyYXRpb24ocGVyY2VudExpc3QpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzXG4gIHZhciBwYXRocyA9IHBlcmNlbnRMaXN0Lm1hcChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICgwLCBfcmVhY3QudXNlUmVmKSgpO1xuICB9KTtcbiAgdmFyIHByZXZUaW1lU3RhbXAgPSAoMCwgX3JlYWN0LnVzZVJlZikobnVsbCk7XG4gICgwLCBfcmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgdmFyIHVwZGF0ZWQgPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhwYXRocykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgcGF0aCA9IHBhdGhzW2tleV0uY3VycmVudDtcblxuICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICB2YXIgcGF0aFN0eWxlID0gcGF0aC5zdHlsZTtcbiAgICAgIHBhdGhTdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAnLjNzLCAuM3MsIC4zcywgLjA2cyc7XG5cbiAgICAgIGlmIChwcmV2VGltZVN0YW1wLmN1cnJlbnQgJiYgbm93IC0gcHJldlRpbWVTdGFtcC5jdXJyZW50IDwgMTAwKSB7XG4gICAgICAgIHBhdGhTdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAnMHMsIDBzJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICBwcmV2VGltZVN0YW1wLmN1cnJlbnQgPSBEYXRlLm5vdygpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBbcGF0aHNdO1xufTtcblxuZXhwb3J0cy51c2VUcmFuc2l0aW9uRHVyYXRpb24gPSB1c2VUcmFuc2l0aW9uRHVyYXRpb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGluZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfTGluZS5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNpcmNsZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfQ2lyY2xlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX0xpbmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xpbmVcIikpO1xuXG52YXIgX0NpcmNsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ2lyY2xlXCIpKTtcblxudmFyIF9kZWZhdWx0ID0ge1xuICBMaW5lOiBfTGluZS5kZWZhdWx0LFxuICBDaXJjbGU6IF9DaXJjbGUuZGVmYXVsdFxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKSk7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfZmluZERPTU5vZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vZmluZERPTU5vZGVcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvS2V5Q29kZVwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbnZhciBfU3RhciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RhclwiKSk7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7ICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMi5kZWZhdWx0KSh0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBSYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKFJhdGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUmF0ZSk7XG5cbiAgZnVuY3Rpb24gUmF0ZShwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIFJhdGUpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgX3RoaXMub25Ib3ZlciA9IGZ1bmN0aW9uIChldmVudCwgaW5kZXgpIHtcbiAgICAgIHZhciBvbkhvdmVyQ2hhbmdlID0gX3RoaXMucHJvcHMub25Ib3ZlckNoYW5nZTtcblxuICAgICAgdmFyIGhvdmVyVmFsdWUgPSBfdGhpcy5nZXRTdGFyVmFsdWUoaW5kZXgsIGV2ZW50LnBhZ2VYKTtcblxuICAgICAgdmFyIGNsZWFuZWRWYWx1ZSA9IF90aGlzLnN0YXRlLmNsZWFuZWRWYWx1ZTtcblxuICAgICAgaWYgKGhvdmVyVmFsdWUgIT09IGNsZWFuZWRWYWx1ZSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaG92ZXJWYWx1ZTogaG92ZXJWYWx1ZSxcbiAgICAgICAgICBjbGVhbmVkVmFsdWU6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG9uSG92ZXJDaGFuZ2UoaG92ZXJWYWx1ZSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uTW91c2VMZWF2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvbkhvdmVyQ2hhbmdlID0gX3RoaXMucHJvcHMub25Ib3ZlckNoYW5nZTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBob3ZlclZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGNsZWFuZWRWYWx1ZTogbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIG9uSG92ZXJDaGFuZ2UodW5kZWZpbmVkKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25DbGljayA9IGZ1bmN0aW9uIChldmVudCwgaW5kZXgpIHtcbiAgICAgIHZhciBhbGxvd0NsZWFyID0gX3RoaXMucHJvcHMuYWxsb3dDbGVhcjtcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLnN0YXRlLnZhbHVlO1xuXG4gICAgICB2YXIgbmV3VmFsdWUgPSBfdGhpcy5nZXRTdGFyVmFsdWUoaW5kZXgsIGV2ZW50LnBhZ2VYKTtcblxuICAgICAgdmFyIGlzUmVzZXQgPSBmYWxzZTtcblxuICAgICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgICAgaXNSZXNldCA9IG5ld1ZhbHVlID09PSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMub25Nb3VzZUxlYXZlKCk7XG5cbiAgICAgIF90aGlzLmNoYW5nZVZhbHVlKGlzUmVzZXQgPyAwIDogbmV3VmFsdWUpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGNsZWFuZWRWYWx1ZTogaXNSZXNldCA/IG5ld1ZhbHVlIDogbnVsbFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb25Gb2N1cyA9IF90aGlzLnByb3BzLm9uRm9jdXM7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZm9jdXNlZDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgIG9uRm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25CbHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uQmx1ciA9IF90aGlzLnByb3BzLm9uQmx1cjtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmb2N1c2VkOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbkJsdXIpIHtcbiAgICAgICAgb25CbHVyKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgY291bnQgPSBfdGhpcyRwcm9wcy5jb3VudCxcbiAgICAgICAgICBhbGxvd0hhbGYgPSBfdGhpcyRwcm9wcy5hbGxvd0hhbGYsXG4gICAgICAgICAgb25LZXlEb3duID0gX3RoaXMkcHJvcHMub25LZXlEb3duLFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzLmRpcmVjdGlvbjtcbiAgICAgIHZhciByZXZlcnNlID0gZGlyZWN0aW9uID09PSAncnRsJztcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLnN0YXRlLnZhbHVlO1xuXG4gICAgICBpZiAoa2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5SSUdIVCAmJiB2YWx1ZSA8IGNvdW50ICYmICFyZXZlcnNlKSB7XG4gICAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgICB2YWx1ZSArPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNoYW5nZVZhbHVlKHZhbHVlKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkxFRlQgJiYgdmFsdWUgPiAwICYmICFyZXZlcnNlKSB7XG4gICAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgICB2YWx1ZSAtPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNoYW5nZVZhbHVlKHZhbHVlKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LlJJR0hUICYmIHZhbHVlID4gMCAmJiByZXZlcnNlKSB7XG4gICAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgICB2YWx1ZSAtPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNoYW5nZVZhbHVlKHZhbHVlKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkxFRlQgJiYgdmFsdWUgPCBjb3VudCAmJiByZXZlcnNlKSB7XG4gICAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgICB2YWx1ZSArPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNoYW5nZVZhbHVlKHZhbHVlKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25LZXlEb3duKSB7XG4gICAgICAgIG9uS2V5RG93bihldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNhdmVSZWYgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBfdGhpcy5zdGFyc1tpbmRleF0gPSBub2RlO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2F2ZVJhdGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMucmF0ZSA9IG5vZGU7XG4gICAgfTtcblxuICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIF90aGlzLnN0YXJzID0ge307XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBmb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNsZWFuZWRWYWx1ZTogbnVsbFxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoUmF0ZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBhdXRvRm9jdXMgPSBfdGhpcyRwcm9wczIuYXV0b0ZvY3VzLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMyLmRpc2FibGVkO1xuXG4gICAgICBpZiAoYXV0b0ZvY3VzICYmICFkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFN0YXJET01cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3RhckRPTShpbmRleCkge1xuICAgICAgcmV0dXJuICgwLCBfZmluZERPTU5vZGUuZGVmYXVsdCkodGhpcy5zdGFyc1tpbmRleF0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTdGFyVmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3RhclZhbHVlKGluZGV4LCB4KSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBhbGxvd0hhbGYgPSBfdGhpcyRwcm9wczMuYWxsb3dIYWxmLFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzMy5kaXJlY3Rpb247XG4gICAgICB2YXIgcmV2ZXJzZSA9IGRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gICAgICB2YXIgdmFsdWUgPSBpbmRleCArIDE7XG5cbiAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgdmFyIHN0YXJFbGUgPSB0aGlzLmdldFN0YXJET00oaW5kZXgpO1xuICAgICAgICB2YXIgbGVmdERpcyA9ICgwLCBfdXRpbC5nZXRPZmZzZXRMZWZ0KShzdGFyRWxlKTtcbiAgICAgICAgdmFyIHdpZHRoID0gc3RhckVsZS5jbGllbnRXaWR0aDtcblxuICAgICAgICBpZiAocmV2ZXJzZSAmJiB4IC0gbGVmdERpcyA+IHdpZHRoIC8gMikge1xuICAgICAgICAgIHZhbHVlIC09IDAuNTtcbiAgICAgICAgfSBlbHNlIGlmICghcmV2ZXJzZSAmJiB4IC0gbGVmdERpcyA8IHdpZHRoIC8gMikge1xuICAgICAgICAgIHZhbHVlIC09IDAuNTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgdmFyIGRpc2FibGVkID0gdGhpcy5wcm9wcy5kaXNhYmxlZDtcblxuICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnJhdGUuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmx1clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdmFyIGRpc2FibGVkID0gdGhpcy5wcm9wcy5kaXNhYmxlZDtcblxuICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnJhdGUuYmx1cigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjaGFuZ2VWYWx1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGFuZ2VWYWx1ZSh2YWx1ZSkge1xuICAgICAgdmFyIG9uQ2hhbmdlID0gdGhpcy5wcm9wcy5vbkNoYW5nZTtcblxuICAgICAgaWYgKCEoJ3ZhbHVlJyBpbiB0aGlzLnByb3BzKSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNvdW50ID0gX3RoaXMkcHJvcHM0LmNvdW50LFxuICAgICAgICAgIGFsbG93SGFsZiA9IF90aGlzJHByb3BzNC5hbGxvd0hhbGYsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczQuc3R5bGUsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHM0LnByZWZpeENscyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzNC5kaXNhYmxlZCxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczQuY2xhc3NOYW1lLFxuICAgICAgICAgIGNoYXJhY3RlciA9IF90aGlzJHByb3BzNC5jaGFyYWN0ZXIsXG4gICAgICAgICAgY2hhcmFjdGVyUmVuZGVyID0gX3RoaXMkcHJvcHM0LmNoYXJhY3RlclJlbmRlcixcbiAgICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzNC50YWJJbmRleCxcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wczQuZGlyZWN0aW9uO1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHN0YXRlLnZhbHVlLFxuICAgICAgICAgIGhvdmVyVmFsdWUgPSBfdGhpcyRzdGF0ZS5ob3ZlclZhbHVlLFxuICAgICAgICAgIGZvY3VzZWQgPSBfdGhpcyRzdGF0ZS5mb2N1c2VkO1xuICAgICAgdmFyIHN0YXJzID0gW107XG4gICAgICB2YXIgZGlzYWJsZWRDbGFzcyA9IGRpc2FibGVkID8gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSA6ICcnO1xuXG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgc3RhcnMucHVzaChfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9TdGFyLmRlZmF1bHQsIHtcbiAgICAgICAgICByZWY6IHRoaXMuc2F2ZVJlZihpbmRleCksXG4gICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgIGNvdW50OiBjb3VudCxcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0YXJcIiksXG4gICAgICAgICAgYWxsb3dIYWxmOiBhbGxvd0hhbGYsXG4gICAgICAgICAgdmFsdWU6IGhvdmVyVmFsdWUgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogaG92ZXJWYWx1ZSxcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLm9uQ2xpY2ssXG4gICAgICAgICAgb25Ib3ZlcjogdGhpcy5vbkhvdmVyLFxuICAgICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgICAgY2hhcmFjdGVyOiBjaGFyYWN0ZXIsXG4gICAgICAgICAgY2hhcmFjdGVyUmVuZGVyOiBjaGFyYWN0ZXJSZW5kZXIsXG4gICAgICAgICAgZm9jdXNlZDogZm9jdXNlZFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHZhciByYXRlQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHByZWZpeENscywgZGlzYWJsZWRDbGFzcywgY2xhc3NOYW1lLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpKTtcbiAgICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHJhdGVDbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBkaXNhYmxlZCA/IG51bGwgOiB0aGlzLm9uTW91c2VMZWF2ZSxcbiAgICAgICAgdGFiSW5kZXg6IGRpc2FibGVkID8gLTEgOiB0YWJJbmRleCxcbiAgICAgICAgb25Gb2N1czogZGlzYWJsZWQgPyBudWxsIDogdGhpcy5vbkZvY3VzLFxuICAgICAgICBvbkJsdXI6IGRpc2FibGVkID8gbnVsbCA6IHRoaXMub25CbHVyLFxuICAgICAgICBvbktleURvd246IGRpc2FibGVkID8gbnVsbCA6IHRoaXMub25LZXlEb3duLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZVJhdGUsXG4gICAgICAgIHJvbGU6IFwicmFkaW9ncm91cFwiXG4gICAgICB9LCBzdGFycyk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHN0YXRlKSB7XG4gICAgICBpZiAoJ3ZhbHVlJyBpbiBuZXh0UHJvcHMgJiYgbmV4dFByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICAgIHZhbHVlOiBuZXh0UHJvcHMudmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFJhdGU7XG59KF9yZWFjdC5kZWZhdWx0LkNvbXBvbmVudCk7XG5cblJhdGUuZGVmYXVsdFByb3BzID0ge1xuICBkZWZhdWx0VmFsdWU6IDAsXG4gIGNvdW50OiA1LFxuICBhbGxvd0hhbGY6IGZhbHNlLFxuICBhbGxvd0NsZWFyOiB0cnVlLFxuICBzdHlsZToge30sXG4gIHByZWZpeENsczogJ3JjLXJhdGUnLFxuICBvbkNoYW5nZTogbm9vcCxcbiAgY2hhcmFjdGVyOiAn4piFJyxcbiAgb25Ib3ZlckNoYW5nZTogbm9vcCxcbiAgdGFiSW5kZXg6IDAsXG4gIGRpcmVjdGlvbjogJ2x0cidcbn07XG52YXIgX2RlZmF1bHQgPSBSYXRlO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCIpKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yLmRlZmF1bHQpKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgU3RhciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShTdGFyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFN0YXIpO1xuXG4gIGZ1bmN0aW9uIFN0YXIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgU3Rhcik7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIF90aGlzLm9uSG92ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb25Ib3ZlciA9IF90aGlzJHByb3BzLm9uSG92ZXIsXG4gICAgICAgICAgaW5kZXggPSBfdGhpcyRwcm9wcy5pbmRleDtcbiAgICAgIG9uSG92ZXIoZSwgaW5kZXgpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMyLm9uQ2xpY2ssXG4gICAgICAgICAgaW5kZXggPSBfdGhpcyRwcm9wczIuaW5kZXg7XG4gICAgICBvbkNsaWNrKGUsIGluZGV4KTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25LZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMzLm9uQ2xpY2ssXG4gICAgICAgICAgaW5kZXggPSBfdGhpcyRwcm9wczMuaW5kZXg7XG5cbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgIG9uQ2xpY2soZSwgaW5kZXgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShTdGFyLCBbe1xuICAgIGtleTogXCJnZXRDbGFzc05hbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHM0LnByZWZpeENscyxcbiAgICAgICAgICBpbmRleCA9IF90aGlzJHByb3BzNC5pbmRleCxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHByb3BzNC52YWx1ZSxcbiAgICAgICAgICBhbGxvd0hhbGYgPSBfdGhpcyRwcm9wczQuYWxsb3dIYWxmLFxuICAgICAgICAgIGZvY3VzZWQgPSBfdGhpcyRwcm9wczQuZm9jdXNlZDtcbiAgICAgIHZhciBzdGFyVmFsdWUgPSBpbmRleCArIDE7XG4gICAgICB2YXIgY2xhc3NOYW1lID0gcHJlZml4Q2xzO1xuXG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgaW5kZXggPT09IDAgJiYgZm9jdXNlZCkge1xuICAgICAgICBjbGFzc05hbWUgKz0gXCIgXCIuY29uY2F0KHByZWZpeENscywgXCItZm9jdXNlZFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoYWxsb3dIYWxmICYmIHZhbHVlICsgMC41ID49IHN0YXJWYWx1ZSAmJiB2YWx1ZSA8IHN0YXJWYWx1ZSkge1xuICAgICAgICBjbGFzc05hbWUgKz0gXCIgXCIuY29uY2F0KHByZWZpeENscywgXCItaGFsZiBcIikuY29uY2F0KHByZWZpeENscywgXCItYWN0aXZlXCIpO1xuXG4gICAgICAgIGlmIChmb2N1c2VkKSB7XG4gICAgICAgICAgY2xhc3NOYW1lICs9IFwiIFwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvY3VzZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzTmFtZSArPSBzdGFyVmFsdWUgPD0gdmFsdWUgPyBcIiBcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mdWxsXCIpIDogXCIgXCIuY29uY2F0KHByZWZpeENscywgXCItemVyb1wiKTtcblxuICAgICAgICBpZiAoc3RhclZhbHVlID09PSB2YWx1ZSAmJiBmb2N1c2VkKSB7XG4gICAgICAgICAgY2xhc3NOYW1lICs9IFwiIFwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvY3VzZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBvbkhvdmVyID0gdGhpcy5vbkhvdmVyLFxuICAgICAgICAgIG9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2ssXG4gICAgICAgICAgb25LZXlEb3duID0gdGhpcy5vbktleURvd247XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzNS5kaXNhYmxlZCxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczUucHJlZml4Q2xzLFxuICAgICAgICAgIGNoYXJhY3RlciA9IF90aGlzJHByb3BzNS5jaGFyYWN0ZXIsXG4gICAgICAgICAgY2hhcmFjdGVyUmVuZGVyID0gX3RoaXMkcHJvcHM1LmNoYXJhY3RlclJlbmRlcixcbiAgICAgICAgICBpbmRleCA9IF90aGlzJHByb3BzNS5pbmRleCxcbiAgICAgICAgICBjb3VudCA9IF90aGlzJHByb3BzNS5jb3VudCxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHByb3BzNS52YWx1ZTtcbiAgICAgIHZhciBjaGFyYWN0ZXJOb2RlID0gdHlwZW9mIGNoYXJhY3RlciA9PT0gJ2Z1bmN0aW9uJyA/IGNoYXJhY3Rlcih0aGlzLnByb3BzKSA6IGNoYXJhY3RlcjtcblxuICAgICAgdmFyIHN0YXJ0ID0gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmdldENsYXNzTmFtZSgpXG4gICAgICB9LCBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgb25DbGljazogZGlzYWJsZWQgPyBudWxsIDogb25DbGljayxcbiAgICAgICAgb25LZXlEb3duOiBkaXNhYmxlZCA/IG51bGwgOiBvbktleURvd24sXG4gICAgICAgIG9uTW91c2VNb3ZlOiBkaXNhYmxlZCA/IG51bGwgOiBvbkhvdmVyLFxuICAgICAgICByb2xlOiBcInJhZGlvXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHZhbHVlID4gaW5kZXggPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjogaW5kZXggKyAxLFxuICAgICAgICBcImFyaWEtc2V0c2l6ZVwiOiBjb3VudCxcbiAgICAgICAgdGFiSW5kZXg6IGRpc2FibGVkID8gLTEgOiAwXG4gICAgICB9LCBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZpcnN0XCIpXG4gICAgICB9LCBjaGFyYWN0ZXJOb2RlKSwgX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWNvbmRcIilcbiAgICAgIH0sIGNoYXJhY3Rlck5vZGUpKSk7XG5cbiAgICAgIGlmIChjaGFyYWN0ZXJSZW5kZXIpIHtcbiAgICAgICAgc3RhcnQgPSBjaGFyYWN0ZXJSZW5kZXIoc3RhcnQsIHRoaXMucHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RhcnQ7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTdGFyO1xufShfcmVhY3QuZGVmYXVsdC5Db21wb25lbnQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBTdGFyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9SYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9SYXRlXCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX1JhdGUuZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRPZmZzZXRMZWZ0ID0gZ2V0T2Zmc2V0TGVmdDtcblxuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L3ByZWZlci1kZWZhdWx0LWV4cG9ydCAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsKHcpIHtcbiAgdmFyIHJldCA9IHcucGFnZVhPZmZzZXQ7XG4gIHZhciBtZXRob2QgPSAnc2Nyb2xsTGVmdCc7XG5cbiAgaWYgKHR5cGVvZiByZXQgIT09ICdudW1iZXInKSB7XG4gICAgdmFyIGQgPSB3LmRvY3VtZW50OyAvLyBpZTYsNyw4IHN0YW5kYXJkIG1vZGVcblxuICAgIHJldCA9IGQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF07XG5cbiAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICAgIC8vIHF1aXJrcyBtb2RlXG4gICAgICByZXQgPSBkLmJvZHlbbWV0aG9kXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRQb3NpdGlvbihlbGVtKSB7XG4gIHZhciB4O1xuICB2YXIgeTtcbiAgdmFyIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcbiAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgdmFyIGRvY0VsZW0gPSBkb2MgJiYgZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHggPSBib3gubGVmdDtcbiAgeSA9IGJveC50b3A7XG4gIHggLT0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwO1xuICB5IC09IGRvY0VsZW0uY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7XG4gIHJldHVybiB7XG4gICAgbGVmdDogeCxcbiAgICB0b3A6IHlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0TGVmdChlbCkge1xuICB2YXIgcG9zID0gZ2V0Q2xpZW50UG9zaXRpb24oZWwpO1xuICB2YXIgZG9jID0gZWwub3duZXJEb2N1bWVudDsgLy8gT25seSBJRSB1c2UgYHBhcmVudFdpbmRvd2BcblxuICB2YXIgdyA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICBwb3MubGVmdCArPSBnZXRTY3JvbGwodyk7XG4gIHJldHVybiBwb3MubGVmdDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfZmluZERPTU5vZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vZmluZERPTU5vZGVcIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfcmVmID0gcmVxdWlyZShcInJjLXV0aWwvbGliL3JlZlwiKTtcblxudmFyIF9yZXNpemVPYnNlcnZlclBvbHlmaWxsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVzaXplLW9ic2VydmVyLXBvbHlmaWxsXCIpKTtcblxudmFyIElOVEVSTkFMX1BSRUZJWF9LRVkgPSAncmMtb2JzZXJ2ZXIta2V5JzsgLy8gU3RpbGwgbmVlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggUmVhY3QgMTUsIHdlIHVzZSBjbGFzcyBjb21wb25lbnQgaGVyZVxuXG52YXIgUmVhY3RSZXNpemVPYnNlcnZlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShSZWFjdFJlc2l6ZU9ic2VydmVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoUmVhY3RSZXNpemVPYnNlcnZlcik7XG5cbiAgZnVuY3Rpb24gUmVhY3RSZXNpemVPYnNlcnZlcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBSZWFjdFJlc2l6ZU9ic2VydmVyKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICBfdGhpcy5jaGlsZE5vZGUgPSBudWxsO1xuICAgIF90aGlzLmN1cnJlbnRFbGVtZW50ID0gbnVsbDtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgb2Zmc2V0SGVpZ2h0OiAwLFxuICAgICAgb2Zmc2V0V2lkdGg6IDBcbiAgICB9O1xuXG4gICAgX3RoaXMub25SZXNpemUgPSBmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgdmFyIG9uUmVzaXplID0gX3RoaXMucHJvcHMub25SZXNpemU7XG4gICAgICB2YXIgdGFyZ2V0ID0gZW50cmllc1swXS50YXJnZXQ7XG5cbiAgICAgIHZhciBfdGFyZ2V0JGdldEJvdW5kaW5nQ2wgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgd2lkdGggPSBfdGFyZ2V0JGdldEJvdW5kaW5nQ2wud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLmhlaWdodDtcblxuICAgICAgdmFyIG9mZnNldFdpZHRoID0gdGFyZ2V0Lm9mZnNldFdpZHRoLFxuICAgICAgICAgIG9mZnNldEhlaWdodCA9IHRhcmdldC5vZmZzZXRIZWlnaHQ7XG4gICAgICAvKipcbiAgICAgICAqIFJlc2l6ZSBvYnNlcnZlciB0cmlnZ2VyIHdoZW4gY29udGVudCBzaXplIGNoYW5nZWQuXG4gICAgICAgKiBJbiBtb3N0IGNhc2Ugd2UganVzdCBjYXJlIGFib3V0IGVsZW1lbnQgc2l6ZSxcbiAgICAgICAqIGxldCdzIHVzZSBgYm91bmRhcnlgIGluc3RlYWQgb2YgYGNvbnRlbnRSZWN0YCBoZXJlIHRvIGF2b2lkIHNoYWtpbmcuXG4gICAgICAgKi9cblxuICAgICAgdmFyIGZpeGVkV2lkdGggPSBNYXRoLmZsb29yKHdpZHRoKTtcbiAgICAgIHZhciBmaXhlZEhlaWdodCA9IE1hdGguZmxvb3IoaGVpZ2h0KTtcblxuICAgICAgaWYgKF90aGlzLnN0YXRlLndpZHRoICE9PSBmaXhlZFdpZHRoIHx8IF90aGlzLnN0YXRlLmhlaWdodCAhPT0gZml4ZWRIZWlnaHQgfHwgX3RoaXMuc3RhdGUub2Zmc2V0V2lkdGggIT09IG9mZnNldFdpZHRoIHx8IF90aGlzLnN0YXRlLm9mZnNldEhlaWdodCAhPT0gb2Zmc2V0SGVpZ2h0KSB7XG4gICAgICAgIHZhciBzaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBmaXhlZFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogZml4ZWRIZWlnaHQsXG4gICAgICAgICAgb2Zmc2V0V2lkdGg6IG9mZnNldFdpZHRoLFxuICAgICAgICAgIG9mZnNldEhlaWdodDogb2Zmc2V0SGVpZ2h0XG4gICAgICAgIH07XG5cbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoc2l6ZSk7XG5cbiAgICAgICAgaWYgKG9uUmVzaXplKSB7XG4gICAgICAgICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGJ1dCBub3QgZGVmZXIgdG8gbmV4dCBmcmFtZVxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb25SZXNpemUoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc2l6ZSksIHt9LCB7XG4gICAgICAgICAgICAgIG9mZnNldFdpZHRoOiBvZmZzZXRXaWR0aCxcbiAgICAgICAgICAgICAgb2Zmc2V0SGVpZ2h0OiBvZmZzZXRIZWlnaHRcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zZXRDaGlsZE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMuY2hpbGROb2RlID0gbm9kZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoUmVhY3RSZXNpemVPYnNlcnZlciwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLm9uQ29tcG9uZW50VXBkYXRlZCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy5vbkNvbXBvbmVudFVwZGF0ZWQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lPYnNlcnZlcigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkNvbXBvbmVudFVwZGF0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25Db21wb25lbnRVcGRhdGVkKCkge1xuICAgICAgdmFyIGRpc2FibGVkID0gdGhpcy5wcm9wcy5kaXNhYmxlZDsgLy8gVW5yZWdpc3RlciBpZiBkaXNhYmxlZFxuXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95T2JzZXJ2ZXIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBVbnJlZ2lzdGVyIGlmIGVsZW1lbnQgY2hhbmdlZFxuXG5cbiAgICAgIHZhciBlbGVtZW50ID0gKDAsIF9maW5kRE9NTm9kZS5kZWZhdWx0KSh0aGlzLmNoaWxkTm9kZSB8fCB0aGlzKTtcbiAgICAgIHZhciBlbGVtZW50Q2hhbmdlZCA9IGVsZW1lbnQgIT09IHRoaXMuY3VycmVudEVsZW1lbnQ7XG5cbiAgICAgIGlmIChlbGVtZW50Q2hhbmdlZCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lPYnNlcnZlcigpO1xuICAgICAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnJlc2l6ZU9ic2VydmVyICYmIGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbC5kZWZhdWx0KHRoaXMub25SZXNpemUpO1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lPYnNlcnZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95T2JzZXJ2ZXIoKSB7XG4gICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIGNoaWxkTm9kZXMgPSAoMCwgX3RvQXJyYXkuZGVmYXVsdCkoY2hpbGRyZW4pO1xuXG4gICAgICBpZiAoY2hpbGROb2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ0ZpbmQgbW9yZSB0aGFuIG9uZSBjaGlsZCBub2RlIHdpdGggYGNoaWxkcmVuYCBpbiBSZXNpemVPYnNlcnZlci4gV2lsbCBvbmx5IG9ic2VydmUgZmlyc3Qgb25lLicpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsICdgY2hpbGRyZW5gIG9mIFJlc2l6ZU9ic2VydmVyIGlzIGVtcHR5LiBOb3RoaW5nIGlzIGluIG9ic2VydmUuJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hpbGROb2RlID0gY2hpbGROb2Rlc1swXTtcblxuICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkTm9kZSkgJiYgKDAsIF9yZWYuc3VwcG9ydFJlZikoY2hpbGROb2RlKSkge1xuICAgICAgICB2YXIgcmVmID0gY2hpbGROb2RlLnJlZjtcbiAgICAgICAgY2hpbGROb2Rlc1swXSA9IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZE5vZGUsIHtcbiAgICAgICAgICByZWY6ICgwLCBfcmVmLmNvbXBvc2VSZWYpKHJlZiwgdGhpcy5zZXRDaGlsZE5vZGUpXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgPyBjaGlsZE5vZGVzWzBdIDogY2hpbGROb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7XG4gICAgICAgIGlmICghUmVhY3QuaXNWYWxpZEVsZW1lbnQobm9kZSkgfHwgJ2tleScgaW4gbm9kZSAmJiBub2RlLmtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChub2RlLCB7XG4gICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChJTlRFUk5BTF9QUkVGSVhfS0VZLCBcIi1cIikuY29uY2F0KGluZGV4KVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gUmVhY3RSZXNpemVPYnNlcnZlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuUmVhY3RSZXNpemVPYnNlcnZlci5kaXNwbGF5TmFtZSA9ICdSZXNpemVPYnNlcnZlcic7XG52YXIgX2RlZmF1bHQgPSBSZWFjdFJlc2l6ZU9ic2VydmVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbi8qKiBUaGlzIGlzIGEgcGxhY2Vob2xkZXIsIG5vdCByZWFsIHJlbmRlciBpbiBkb20gKi9cbnZhciBPcHRHcm91cCA9IGZ1bmN0aW9uIE9wdEdyb3VwKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbk9wdEdyb3VwLmlzU2VsZWN0T3B0R3JvdXAgPSB0cnVlO1xudmFyIF9kZWZhdWx0ID0gT3B0R3JvdXA7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxuLyoqIFRoaXMgaXMgYSBwbGFjZWhvbGRlciwgbm90IHJlYWwgcmVuZGVyIGluIGRvbSAqL1xudmFyIE9wdGlvbiA9IGZ1bmN0aW9uIE9wdGlvbigpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5PcHRpb24uaXNTZWxlY3RPcHRpb24gPSB0cnVlO1xudmFyIF9kZWZhdWx0ID0gT3B0aW9uO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvS2V5Q29kZVwiKSk7XG5cbnZhciBfcGlja0F0dHJzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvcGlja0F0dHJzXCIpKTtcblxudmFyIF91c2VNZW1vID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVtb1wiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3JjVmlydHVhbExpc3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy12aXJ0dWFsLWxpc3RcIikpO1xuXG52YXIgX1RyYW5zQnRuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UcmFuc0J0blwiKSk7XG5cbi8qKlxuICogVXNpbmcgdmlydHVhbCBsaXN0IG9mIG9wdGlvbiBkaXNwbGF5LlxuICogV2lsbCBmYWxsYmFjayB0byBkb20gaWYgdXNlIGN1c3RvbWl6ZSByZW5kZXIuXG4gKi9cbnZhciBPcHRpb25MaXN0ID0gZnVuY3Rpb24gT3B0aW9uTGlzdChfcmVmLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgaWQgPSBfcmVmLmlkLFxuICAgICAgZmxhdHRlbk9wdGlvbnMgPSBfcmVmLmZsYXR0ZW5PcHRpb25zLFxuICAgICAgY2hpbGRyZW5Bc0RhdGEgPSBfcmVmLmNoaWxkcmVuQXNEYXRhLFxuICAgICAgdmFsdWVzID0gX3JlZi52YWx1ZXMsXG4gICAgICBzZWFyY2hWYWx1ZSA9IF9yZWYuc2VhcmNoVmFsdWUsXG4gICAgICBtdWx0aXBsZSA9IF9yZWYubXVsdGlwbGUsXG4gICAgICBkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gPSBfcmVmLmRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbixcbiAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgaXRlbUhlaWdodCA9IF9yZWYuaXRlbUhlaWdodCxcbiAgICAgIG5vdEZvdW5kQ29udGVudCA9IF9yZWYubm90Rm91bmRDb250ZW50LFxuICAgICAgb3BlbiA9IF9yZWYub3BlbixcbiAgICAgIG1lbnVJdGVtU2VsZWN0ZWRJY29uID0gX3JlZi5tZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICAgIHZpcnR1YWwgPSBfcmVmLnZpcnR1YWwsXG4gICAgICBvblNlbGVjdCA9IF9yZWYub25TZWxlY3QsXG4gICAgICBvblRvZ2dsZU9wZW4gPSBfcmVmLm9uVG9nZ2xlT3BlbixcbiAgICAgIG9uQWN0aXZlVmFsdWUgPSBfcmVmLm9uQWN0aXZlVmFsdWUsXG4gICAgICBvblNjcm9sbCA9IF9yZWYub25TY3JvbGwsXG4gICAgICBvbk1vdXNlRW50ZXIgPSBfcmVmLm9uTW91c2VFbnRlcjtcbiAgdmFyIGl0ZW1QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIik7XG4gIHZhciBtZW1vRmxhdHRlbk9wdGlvbnMgPSAoMCwgX3VzZU1lbW8uZGVmYXVsdCkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbGF0dGVuT3B0aW9ucztcbiAgfSwgW29wZW4sIGZsYXR0ZW5PcHRpb25zXSwgZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gbmV4dFswXSAmJiBwcmV2WzFdICE9PSBuZXh0WzFdO1xuICB9KTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IExpc3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGxpc3RSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG5cbiAgdmFyIG9uTGlzdE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTGlzdE1vdXNlRG93bihldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgdmFyIHNjcm9sbEludG9WaWV3ID0gZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoaW5kZXgpIHtcbiAgICBpZiAobGlzdFJlZi5jdXJyZW50KSB7XG4gICAgICBsaXN0UmVmLmN1cnJlbnQuc2Nyb2xsVG8oe1xuICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQWN0aXZlID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgZ2V0RW5hYmxlZEFjdGl2ZUluZGV4ID0gZnVuY3Rpb24gZ2V0RW5hYmxlZEFjdGl2ZUluZGV4KGluZGV4KSB7XG4gICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICB2YXIgbGVuID0gbWVtb0ZsYXR0ZW5PcHRpb25zLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gKGluZGV4ICsgaSAqIG9mZnNldCArIGxlbikgJSBsZW47XG4gICAgICB2YXIgX21lbW9GbGF0dGVuT3B0aW9ucyRjID0gbWVtb0ZsYXR0ZW5PcHRpb25zW2N1cnJlbnRdLFxuICAgICAgICAgIGdyb3VwID0gX21lbW9GbGF0dGVuT3B0aW9ucyRjLmdyb3VwLFxuICAgICAgICAgIGRhdGEgPSBfbWVtb0ZsYXR0ZW5PcHRpb25zJGMuZGF0YTtcblxuICAgICAgaWYgKCFncm91cCAmJiAhZGF0YS5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0RW5hYmxlZEFjdGl2ZUluZGV4KDApO1xuICB9KSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBhY3RpdmVJbmRleCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRBY3RpdmVJbmRleCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIHNldEFjdGl2ZSA9IGZ1bmN0aW9uIHNldEFjdGl2ZShpbmRleCkge1xuICAgIHZhciBmcm9tS2V5Ym9hcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHNldEFjdGl2ZUluZGV4KGluZGV4KTtcbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHNvdXJjZTogZnJvbUtleWJvYXJkID8gJ2tleWJvYXJkJyA6ICdtb3VzZSdcbiAgICB9OyAvLyBUcmlnZ2VyIGFjdGl2ZSBldmVudFxuXG4gICAgdmFyIGZsYXR0ZW5JdGVtID0gbWVtb0ZsYXR0ZW5PcHRpb25zW2luZGV4XTtcblxuICAgIGlmICghZmxhdHRlbkl0ZW0pIHtcbiAgICAgIG9uQWN0aXZlVmFsdWUobnVsbCwgLTEsIGluZm8pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG9uQWN0aXZlVmFsdWUoZmxhdHRlbkl0ZW0uZGF0YS52YWx1ZSwgaW5kZXgsIGluZm8pO1xuICB9OyAvLyBBdXRvIGFjdGl2ZSBmaXJzdCBpdGVtIHdoZW4gbGlzdCBsZW5ndGggb3Igc2VhcmNoVmFsdWUgY2hhbmdlZFxuXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRBY3RpdmUoZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uICE9PSBmYWxzZSA/IGdldEVuYWJsZWRBY3RpdmVJbmRleCgwKSA6IC0xKTtcbiAgfSwgW21lbW9GbGF0dGVuT3B0aW9ucy5sZW5ndGgsIHNlYXJjaFZhbHVlXSk7IC8vIEF1dG8gc2Nyb2xsIHRvIGl0ZW0gcG9zaXRpb24gaW4gc2luZ2xlIG1vZGVcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIFJlYWN0IHdpbGwgc2tpcCBgb25DaGFuZ2VgIHdoZW4gY29tcG9uZW50IHVwZGF0ZS5cbiAgICAgKiBgc2V0QWN0aXZlYCBmdW5jdGlvbiB3aWxsIGNhbGwgcm9vdCBhY2Nlc3NpYmlsaXR5IHN0YXRlIHVwZGF0ZSB3aGljaCBtYWtlcyByZS1yZW5kZXIuXG4gICAgICogU28gd2UgbmVlZCB0byBkZWxheSB0byBsZXQgSW5wdXQgY29tcG9uZW50IHRyaWdnZXIgb25DaGFuZ2UgZmlyc3QuXG4gICAgICovXG4gICAgdmFyIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFtdWx0aXBsZSAmJiBvcGVuICYmIHZhbHVlcy5zaXplID09PSAxKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IEFycmF5LmZyb20odmFsdWVzKVswXTtcbiAgICAgICAgdmFyIGluZGV4ID0gbWVtb0ZsYXR0ZW5PcHRpb25zLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IF9yZWYyLmRhdGE7XG4gICAgICAgICAgcmV0dXJuIGRhdGEudmFsdWUgPT09IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgc2V0QWN0aXZlKGluZGV4KTtcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXcoaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfTtcbiAgfSwgW29wZW5dKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG9uU2VsZWN0VmFsdWUgPSBmdW5jdGlvbiBvblNlbGVjdFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uU2VsZWN0KHZhbHVlLCB7XG4gICAgICAgIHNlbGVjdGVkOiAhdmFsdWVzLmhhcyh2YWx1ZSlcbiAgICAgIH0pO1xuICAgIH0gLy8gU2luZ2xlIG1vZGUgc2hvdWxkIGFsd2F5cyBjbG9zZSBieSBzZWxlY3RcblxuXG4gICAgaWYgKCFtdWx0aXBsZSkge1xuICAgICAgb25Ub2dnbGVPcGVuKGZhbHNlKTtcbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgICAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2g7XG5cbiAgICAgICAgc3dpdGNoICh3aGljaCkge1xuICAgICAgICAgIC8vID4+PiBBcnJvdyBrZXlzXG4gICAgICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LlVQOlxuICAgICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5ET1dOOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcblxuICAgICAgICAgICAgICBpZiAod2hpY2ggPT09IF9LZXlDb2RlLmRlZmF1bHQuVVApIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtMTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGljaCA9PT0gX0tleUNvZGUuZGVmYXVsdC5ET1dOKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChvZmZzZXQgIT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dEFjdGl2ZUluZGV4ID0gZ2V0RW5hYmxlZEFjdGl2ZUluZGV4KGFjdGl2ZUluZGV4ICsgb2Zmc2V0LCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIHNjcm9sbEludG9WaWV3KG5leHRBY3RpdmVJbmRleCk7XG4gICAgICAgICAgICAgICAgc2V0QWN0aXZlKG5leHRBY3RpdmVJbmRleCwgdHJ1ZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvLyA+Pj4gU2VsZWN0XG5cbiAgICAgICAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuRU5URVI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIHZhbHVlXG4gICAgICAgICAgICAgIHZhciBpdGVtID0gbWVtb0ZsYXR0ZW5PcHRpb25zW2FjdGl2ZUluZGV4XTtcblxuICAgICAgICAgICAgICBpZiAoaXRlbSAmJiAhaXRlbS5kYXRhLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgb25TZWxlY3RWYWx1ZShpdGVtLmRhdGEudmFsdWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9uU2VsZWN0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIC8vID4+PiBDbG9zZVxuXG4gICAgICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LkVTQzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgb25Ub2dnbGVPcGVuKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uS2V5VXA6IGZ1bmN0aW9uIG9uS2V5VXAoKSB7fSxcbiAgICAgIHNjcm9sbFRvOiBmdW5jdGlvbiBzY3JvbGxUbyhpbmRleCkge1xuICAgICAgICBzY3JvbGxJbnRvVmlldyhpbmRleCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGlmIChtZW1vRmxhdHRlbk9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgcm9sZTogXCJsaXN0Ym94XCIsXG4gICAgICBpZDogXCJcIi5jb25jYXQoaWQsIFwiX2xpc3RcIiksXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLWVtcHR5XCIpLFxuICAgICAgb25Nb3VzZURvd246IG9uTGlzdE1vdXNlRG93blxuICAgIH0sIG5vdEZvdW5kQ29udGVudCk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJJdGVtKGluZGV4KSB7XG4gICAgdmFyIGl0ZW0gPSBtZW1vRmxhdHRlbk9wdGlvbnNbaW5kZXhdO1xuICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGl0ZW1EYXRhID0gaXRlbS5kYXRhIHx8IHt9O1xuICAgIHZhciB2YWx1ZSA9IGl0ZW1EYXRhLnZhbHVlLFxuICAgICAgICBsYWJlbCA9IGl0ZW1EYXRhLmxhYmVsLFxuICAgICAgICBjaGlsZHJlbiA9IGl0ZW1EYXRhLmNoaWxkcmVuO1xuICAgIHZhciBhdHRycyA9ICgwLCBfcGlja0F0dHJzLmRlZmF1bHQpKGl0ZW1EYXRhLCB0cnVlKTtcbiAgICB2YXIgbWVyZ2VkTGFiZWwgPSBjaGlsZHJlbkFzRGF0YSA/IGNoaWxkcmVuIDogbGFiZWw7XG4gICAgcmV0dXJuIGl0ZW0gPyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgXCJhcmlhLWxhYmVsXCI6IHR5cGVvZiBtZXJnZWRMYWJlbCA9PT0gJ3N0cmluZycgPyBtZXJnZWRMYWJlbCA6IG51bGxcbiAgICB9LCBhdHRycywge1xuICAgICAga2V5OiBpbmRleCxcbiAgICAgIHJvbGU6IFwib3B0aW9uXCIsXG4gICAgICBpZDogXCJcIi5jb25jYXQoaWQsIFwiX2xpc3RfXCIpLmNvbmNhdChpbmRleCksXG4gICAgICBcImFyaWEtc2VsZWN0ZWRcIjogdmFsdWVzLmhhcyh2YWx1ZSlcbiAgICB9KSwgdmFsdWUpIDogbnVsbDtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByb2xlOiBcImxpc3Rib3hcIixcbiAgICBpZDogXCJcIi5jb25jYXQoaWQsIFwiX2xpc3RcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfVxuICB9LCByZW5kZXJJdGVtKGFjdGl2ZUluZGV4IC0gMSksIHJlbmRlckl0ZW0oYWN0aXZlSW5kZXgpLCByZW5kZXJJdGVtKGFjdGl2ZUluZGV4ICsgMSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY1ZpcnR1YWxMaXN0LmRlZmF1bHQsIHtcbiAgICBpdGVtS2V5OiBcImtleVwiLFxuICAgIHJlZjogbGlzdFJlZixcbiAgICBkYXRhOiBtZW1vRmxhdHRlbk9wdGlvbnMsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgaXRlbUhlaWdodDogaXRlbUhlaWdodCxcbiAgICBmdWxsSGVpZ2h0OiBmYWxzZSxcbiAgICBvbk1vdXNlRG93bjogb25MaXN0TW91c2VEb3duLFxuICAgIG9uU2Nyb2xsOiBvblNjcm9sbCxcbiAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyXG4gIH0sIGZ1bmN0aW9uIChfcmVmMywgaXRlbUluZGV4KSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgdmFyIGdyb3VwID0gX3JlZjMuZ3JvdXAsXG4gICAgICAgIGdyb3VwT3B0aW9uID0gX3JlZjMuZ3JvdXBPcHRpb24sXG4gICAgICAgIGRhdGEgPSBfcmVmMy5kYXRhO1xuICAgIHZhciBsYWJlbCA9IGRhdGEubGFiZWwsXG4gICAgICAgIGtleSA9IGRhdGEua2V5OyAvLyBHcm91cFxuXG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGl0ZW1QcmVmaXhDbHMsIFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLWdyb3VwXCIpKVxuICAgICAgfSwgbGFiZWwgIT09IHVuZGVmaW5lZCA/IGxhYmVsIDoga2V5KTtcbiAgICB9XG5cbiAgICB2YXIgZGlzYWJsZWQgPSBkYXRhLmRpc2FibGVkLFxuICAgICAgICB2YWx1ZSA9IGRhdGEudmFsdWUsXG4gICAgICAgIHRpdGxlID0gZGF0YS50aXRsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuLFxuICAgICAgICBzdHlsZSA9IGRhdGEuc3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZSA9IGRhdGEuY2xhc3NOYW1lLFxuICAgICAgICBvdGhlclByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoZGF0YSwgW1wiZGlzYWJsZWRcIiwgXCJ2YWx1ZVwiLCBcInRpdGxlXCIsIFwiY2hpbGRyZW5cIiwgXCJzdHlsZVwiLCBcImNsYXNzTmFtZVwiXSk7IC8vIE9wdGlvblxuXG4gICAgdmFyIHNlbGVjdGVkID0gdmFsdWVzLmhhcyh2YWx1ZSk7XG4gICAgdmFyIG9wdGlvblByZWZpeENscyA9IFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLW9wdGlvblwiKTtcbiAgICB2YXIgb3B0aW9uQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGl0ZW1QcmVmaXhDbHMsIG9wdGlvblByZWZpeENscywgY2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItZ3JvdXBlZFwiKSwgZ3JvdXBPcHRpb24pLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQob3B0aW9uUHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZUluZGV4ID09PSBpdGVtSW5kZXggJiYgIWRpc2FibGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItc2VsZWN0ZWRcIiksIHNlbGVjdGVkKSwgX2NsYXNzTmFtZXMpKTtcbiAgICB2YXIgbWVyZ2VkTGFiZWwgPSBjaGlsZHJlbkFzRGF0YSA/IGNoaWxkcmVuIDogbGFiZWw7XG4gICAgdmFyIGljb25WaXNpYmxlID0gIW1lbnVJdGVtU2VsZWN0ZWRJY29uIHx8IHR5cGVvZiBtZW51SXRlbVNlbGVjdGVkSWNvbiA9PT0gJ2Z1bmN0aW9uJyB8fCBzZWxlY3RlZDtcbiAgICB2YXIgY29udGVudCA9IG1lcmdlZExhYmVsIHx8IHZhbHVlOyAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNjcxN1xuXG4gICAgdmFyIG9wdGlvblRpdGxlID0gdHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjb250ZW50ID09PSAnbnVtYmVyJyA/IGNvbnRlbnQudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25UaXRsZSA9IHRpdGxlO1xuICAgIH1cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIG90aGVyUHJvcHMsIHtcbiAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBzZWxlY3RlZCxcbiAgICAgIGNsYXNzTmFtZTogb3B0aW9uQ2xhc3NOYW1lLFxuICAgICAgdGl0bGU6IG9wdGlvblRpdGxlLFxuICAgICAgb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKCkge1xuICAgICAgICBpZiAoYWN0aXZlSW5kZXggPT09IGl0ZW1JbmRleCB8fCBkaXNhYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEFjdGl2ZShpdGVtSW5kZXgpO1xuICAgICAgfSxcbiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICBvblNlbGVjdFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQob3B0aW9uUHJlZml4Q2xzLCBcIi1jb250ZW50XCIpXG4gICAgfSwgY29udGVudCksIFJlYWN0LmlzVmFsaWRFbGVtZW50KG1lbnVJdGVtU2VsZWN0ZWRJY29uKSB8fCBzZWxlY3RlZCwgaWNvblZpc2libGUgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChfVHJhbnNCdG4uZGVmYXVsdCwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1vcHRpb24tc3RhdGVcIiksXG4gICAgICBjdXN0b21pemVJY29uOiBtZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICAgIGN1c3RvbWl6ZUljb25Qcm9wczoge1xuICAgICAgICBpc1NlbGVjdGVkOiBzZWxlY3RlZFxuICAgICAgfVxuICAgIH0sIHNlbGVjdGVkID8gJ+KckycgOiBudWxsKSk7XG4gIH0pKTtcbn07XG5cbnZhciBSZWZPcHRpb25MaXN0ID0gUmVhY3QuZm9yd2FyZFJlZihPcHRpb25MaXN0KTtcblJlZk9wdGlvbkxpc3QuZGlzcGxheU5hbWUgPSAnT3B0aW9uTGlzdCc7XG52YXIgX2RlZmF1bHQgPSBSZWZPcHRpb25MaXN0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX09wdGlvbkxpc3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL09wdGlvbkxpc3RcIikpO1xuXG52YXIgX09wdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vT3B0aW9uXCIpKTtcblxudmFyIF9PcHRHcm91cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vT3B0R3JvdXBcIikpO1xuXG52YXIgX2xlZ2FjeVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy9sZWdhY3lVdGlsXCIpO1xuXG52YXIgX3ZhbHVlVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL3ZhbHVlVXRpbFwiKTtcblxudmFyIF9nZW5lcmF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZ2VuZXJhdGVcIikpO1xuXG52YXIgX3dhcm5pbmdQcm9wc1V0aWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V0aWxzL3dhcm5pbmdQcm9wc1V0aWxcIikpO1xuXG4vKipcbiAqIFRvIG1hdGNoIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnQsIHdlIGFsd2F5cyBwcm92aWRlIGFuIGlucHV0IGluIHRoZSBjb21wb25lbnQuXG4gKiBPdGhlciBlbGVtZW50IHdpbGwgbm90IHNldCBgdGFiSW5kZXhgIHRvIGF2b2lkIGBvbkJsdXJgIHNlcXVlbmNlIHByb2JsZW0uXG4gKiBGb3IgZm9jdXNlZCBzZWxlY3QsIHdlIHNldCBgYXJpYS1saXZlPVwicG9saXRlXCJgIHRvIHVwZGF0ZSB0aGUgYWNjZXNzaWJpbGl0eSBjb250ZW50LlxuICpcbiAqIHJlZjpcbiAqIC0ga2V5Ym9hcmQ6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FjY2Vzc2liaWxpdHkvQVJJQS9Sb2xlcy9saXN0Ym94X3JvbGUjS2V5Ym9hcmRfaW50ZXJhY3Rpb25zXG4gKlxuICogTmV3IGFwaTpcbiAqIC0gbGlzdEhlaWdodFxuICogLSBsaXN0SXRlbUhlaWdodFxuICogLSBjb21wb25lbnRcbiAqXG4gKiBSZW1vdmUgZGVwcmVjYXRlZCBhcGk6XG4gKiAtIG11bHRpcGxlXG4gKiAtIHRhZ3NcbiAqIC0gY29tYm9ib3hcbiAqIC0gZmlyc3RBY3RpdmVWYWx1ZVxuICogLSBkcm9wZG93bk1lbnVTdHlsZVxuICogLSBvcGVuQ2xhc3NOYW1lIChOb3QgbGlzdCBpbiBhcGkpXG4gKlxuICogVXBkYXRlOlxuICogLSBgYmFja2ZpbGxgIG9ubHkgc3VwcG9ydCBgY29tYm9ib3hgIG1vZGVcbiAqIC0gYGNvbWJvYm94YCBtb2RlIG5vdCBzdXBwb3J0IGBsYWJlbEluVmFsdWVgIHNpbmNlIGl0J3MgbWVhbmluZ2xlc3NcbiAqIC0gYGdldElucHV0RWxlbWVudGAgb25seSBzdXBwb3J0IGBjb21ib2JveGAgbW9kZVxuICogLSBgb25DaGFuZ2VgIHJldHVybiBPcHRpb25EYXRhIGluc3RlYWQgb2YgUmVhY3ROb2RlXG4gKiAtIGBmaWx0ZXJPcHRpb25gIGBvbkNoYW5nZWAgYG9uU2VsZWN0YCBhY2NlcHQgT3B0aW9uRGF0YSBpbnN0ZWFkIG9mIFJlYWN0Tm9kZVxuICogLSBgY29tYm9ib3hgIG1vZGUgdHJpZ2dlciBgb25DaGFuZ2VgIHdpbGwgZ2V0IGB1bmRlZmluZWRgIGlmIG5vIGB2YWx1ZWAgbWF0Y2ggaW4gT3B0aW9uXG4gKiAtIGBjb21ib2JveGAgbW9kZSBub3Qgc3VwcG9ydCBgb3B0aW9uTGFiZWxQcm9wYFxuICovXG52YXIgUmVmU2VsZWN0ID0gKDAsIF9nZW5lcmF0ZS5kZWZhdWx0KSh7XG4gIHByZWZpeENsczogJ3JjLXNlbGVjdCcsXG4gIGNvbXBvbmVudHM6IHtcbiAgICBvcHRpb25MaXN0OiBfT3B0aW9uTGlzdC5kZWZhdWx0XG4gIH0sXG4gIGNvbnZlcnRDaGlsZHJlblRvRGF0YTogX2xlZ2FjeVV0aWwuY29udmVydENoaWxkcmVuVG9EYXRhLFxuICBmbGF0dGVuT3B0aW9uczogX3ZhbHVlVXRpbC5mbGF0dGVuT3B0aW9ucyxcbiAgZ2V0TGFiZWxlZFZhbHVlOiBfdmFsdWVVdGlsLmdldExhYmVsZWRWYWx1ZSxcbiAgZmlsdGVyT3B0aW9uczogX3ZhbHVlVXRpbC5maWx0ZXJPcHRpb25zLFxuICBpc1ZhbHVlRGlzYWJsZWQ6IF92YWx1ZVV0aWwuaXNWYWx1ZURpc2FibGVkLFxuICBmaW5kVmFsdWVPcHRpb246IF92YWx1ZVV0aWwuZmluZFZhbHVlT3B0aW9uLFxuICB3YXJuaW5nUHJvcHM6IF93YXJuaW5nUHJvcHNVdGlsLmRlZmF1bHQsXG4gIGZpbGxPcHRpb25zV2l0aE1pc3NpbmdWYWx1ZTogX3ZhbHVlVXRpbC5maWxsT3B0aW9uc1dpdGhNaXNzaW5nVmFsdWVcbn0pO1xuLyoqXG4gKiBUeXBlc2NyaXB0IG5vdCBzdXBwb3J0IGdlbmVyaWMgd2l0aCBmdW5jdGlvbiBjb21wb25lbnQsXG4gKiB3ZSBoYXZlIHRvIHdyYXAgYW4gY2xhc3MgY29tcG9uZW50IHRvIGhhbmRsZSB0aGlzLlxuICovXG5cbnZhciBTZWxlY3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoU2VsZWN0LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoU2VsZWN0KTtcblxuICBmdW5jdGlvbiBTZWxlY3QoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgU2VsZWN0KTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnNlbGVjdFJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuXG4gICAgX3RoaXMuZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZWxlY3RSZWYuY3VycmVudC5mb2N1cygpO1xuICAgIH07XG5cbiAgICBfdGhpcy5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2VsZWN0UmVmLmN1cnJlbnQuYmx1cigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShTZWxlY3QsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWZTZWxlY3QsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICByZWY6IHRoaXMuc2VsZWN0UmVmXG4gICAgICB9LCB0aGlzLnByb3BzKSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTZWxlY3Q7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblNlbGVjdC5PcHRpb24gPSBfT3B0aW9uLmRlZmF1bHQ7XG5TZWxlY3QuT3B0R3JvdXAgPSBfT3B0R3JvdXAuZGVmYXVsdDtcbnZhciBfZGVmYXVsdCA9IFNlbGVjdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY1RyaWdnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy10cmlnZ2VyXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBnZXRCdWlsdEluUGxhY2VtZW50cyA9IGZ1bmN0aW9uIGdldEJ1aWx0SW5QbGFjZW1lbnRzKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCkge1xuICAvLyBFbmFibGUgaG9yaXpvbnRhbCBvdmVyZmxvdyBhdXRvLWFkanVzdG1lbnQgd2hlbiBhIGN1c3RvbSBkcm9wZG93biB3aWR0aCBpcyBwcm92aWRlZFxuICB2YXIgYWRqdXN0WCA9IHR5cGVvZiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggIT09ICdudW1iZXInID8gMCA6IDE7XG4gIHJldHVybiB7XG4gICAgYm90dG9tTGVmdDoge1xuICAgICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICAgIG92ZXJmbG93OiB7XG4gICAgICAgIGFkanVzdFg6IGFkanVzdFgsXG4gICAgICAgIGFkanVzdFk6IDFcbiAgICAgIH1cbiAgICB9LFxuICAgIGJvdHRvbVJpZ2h0OiB7XG4gICAgICBwb2ludHM6IFsndHInLCAnYnInXSxcbiAgICAgIG9mZnNldDogWzAsIDRdLFxuICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgYWRqdXN0WDogYWRqdXN0WCxcbiAgICAgICAgYWRqdXN0WTogMVxuICAgICAgfVxuICAgIH0sXG4gICAgdG9wTGVmdDoge1xuICAgICAgcG9pbnRzOiBbJ2JsJywgJ3RsJ10sXG4gICAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgICBvdmVyZmxvdzoge1xuICAgICAgICBhZGp1c3RYOiBhZGp1c3RYLFxuICAgICAgICBhZGp1c3RZOiAxXG4gICAgICB9XG4gICAgfSxcbiAgICB0b3BSaWdodDoge1xuICAgICAgcG9pbnRzOiBbJ2JyJywgJ3RyJ10sXG4gICAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgICBvdmVyZmxvdzoge1xuICAgICAgICBhZGp1c3RYOiBhZGp1c3RYLFxuICAgICAgICBhZGp1c3RZOiAxXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxudmFyIFNlbGVjdFRyaWdnZXIgPSBmdW5jdGlvbiBTZWxlY3RUcmlnZ2VyKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBwb3B1cEVsZW1lbnQgPSBwcm9wcy5wb3B1cEVsZW1lbnQsXG4gICAgICBjb250YWluZXJXaWR0aCA9IHByb3BzLmNvbnRhaW5lcldpZHRoLFxuICAgICAgYW5pbWF0aW9uID0gcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICAgIGRyb3Bkb3duU3R5bGUgPSBwcm9wcy5kcm9wZG93blN0eWxlLFxuICAgICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgICBkaXJlY3Rpb24gPSBfcHJvcHMkZGlyZWN0aW9uID09PSB2b2lkIDAgPyAnbHRyJyA6IF9wcm9wcyRkaXJlY3Rpb24sXG4gICAgICBfcHJvcHMkZHJvcGRvd25NYXRjaFMgPSBwcm9wcy5kcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBfcHJvcHMkZHJvcGRvd25NYXRjaFMgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkZHJvcGRvd25NYXRjaFMsXG4gICAgICBkcm9wZG93blJlbmRlciA9IHByb3BzLmRyb3Bkb3duUmVuZGVyLFxuICAgICAgZHJvcGRvd25BbGlnbiA9IHByb3BzLmRyb3Bkb3duQWxpZ24sXG4gICAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgZW1wdHkgPSBwcm9wcy5lbXB0eSxcbiAgICAgIGdldFRyaWdnZXJET01Ob2RlID0gcHJvcHMuZ2V0VHJpZ2dlckRPTU5vZGUsXG4gICAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiZGlzYWJsZWRcIiwgXCJ2aXNpYmxlXCIsIFwiY2hpbGRyZW5cIiwgXCJwb3B1cEVsZW1lbnRcIiwgXCJjb250YWluZXJXaWR0aFwiLCBcImFuaW1hdGlvblwiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwiZHJvcGRvd25TdHlsZVwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwiZGlyZWN0aW9uXCIsIFwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXCIsIFwiZHJvcGRvd25SZW5kZXJcIiwgXCJkcm9wZG93bkFsaWduXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJlbXB0eVwiLCBcImdldFRyaWdnZXJET01Ob2RlXCJdKTtcbiAgdmFyIGRyb3Bkb3duUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kcm9wZG93blwiKTtcbiAgdmFyIHBvcHVwTm9kZSA9IHBvcHVwRWxlbWVudDtcblxuICBpZiAoZHJvcGRvd25SZW5kZXIpIHtcbiAgICBwb3B1cE5vZGUgPSBkcm9wZG93blJlbmRlcihwb3B1cEVsZW1lbnQpO1xuICB9XG5cbiAgdmFyIGJ1aWx0SW5QbGFjZW1lbnRzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEJ1aWx0SW5QbGFjZW1lbnRzKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCk7XG4gIH0sIFtkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG1lcmdlZFRyYW5zaXRpb25OYW1lID0gYW5pbWF0aW9uID8gXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYW5pbWF0aW9uKSA6IHRyYW5zaXRpb25OYW1lOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgcG9wdXBSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFBvcHVwRWxlbWVudDogZnVuY3Rpb24gZ2V0UG9wdXBFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gcG9wdXBSZWYuY3VycmVudDtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgdmFyIHBvcHVwU3R5bGUgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe1xuICAgIG1pbldpZHRoOiBjb250YWluZXJXaWR0aFxuICB9LCBkcm9wZG93blN0eWxlKTtcblxuICBpZiAodHlwZW9mIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9PT0gJ251bWJlcicpIHtcbiAgICBwb3B1cFN0eWxlLndpZHRoID0gZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoO1xuICB9IGVsc2UgaWYgKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCkge1xuICAgIHBvcHVwU3R5bGUud2lkdGggPSBjb250YWluZXJXaWR0aDtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY1RyaWdnZXIuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcmVzdFByb3BzLCB7XG4gICAgc2hvd0FjdGlvbjogW10sXG4gICAgaGlkZUFjdGlvbjogW10sXG4gICAgcG9wdXBQbGFjZW1lbnQ6IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnYm90dG9tUmlnaHQnIDogJ2JvdHRvbUxlZnQnLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBidWlsdEluUGxhY2VtZW50cyxcbiAgICBwcmVmaXhDbHM6IGRyb3Bkb3duUHJlZml4Q2xzLFxuICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IG1lcmdlZFRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogcG9wdXBSZWZcbiAgICB9LCBwb3B1cE5vZGUpLFxuICAgIHBvcHVwQWxpZ246IGRyb3Bkb3duQWxpZ24sXG4gICAgcG9wdXBWaXNpYmxlOiB2aXNpYmxlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lcixcbiAgICBwb3B1cENsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGRyb3Bkb3duQ2xhc3NOYW1lLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXhDbHMsIFwiLWVtcHR5XCIpLCBlbXB0eSkpLFxuICAgIHBvcHVwU3R5bGU6IHBvcHVwU3R5bGUsXG4gICAgZ2V0VHJpZ2dlckRPTU5vZGU6IGdldFRyaWdnZXJET01Ob2RlXG4gIH0pLCBjaGlsZHJlbik7XG59O1xuXG52YXIgUmVmU2VsZWN0VHJpZ2dlciA9IFJlYWN0LmZvcndhcmRSZWYoU2VsZWN0VHJpZ2dlcik7XG5SZWZTZWxlY3RUcmlnZ2VyLmRpc3BsYXlOYW1lID0gJ1NlbGVjdFRyaWdnZXInO1xudmFyIF9kZWZhdWx0ID0gUmVmU2VsZWN0VHJpZ2dlcjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yZWYyID0gcmVxdWlyZShcInJjLXV0aWwvbGliL3JlZlwiKTtcblxudmFyIElucHV0ID0gZnVuY3Rpb24gSW5wdXQoX3JlZiwgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIGlkID0gX3JlZi5pZCxcbiAgICAgIGlucHV0RWxlbWVudCA9IF9yZWYuaW5wdXRFbGVtZW50LFxuICAgICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgICAgdGFiSW5kZXggPSBfcmVmLnRhYkluZGV4LFxuICAgICAgYXV0b0ZvY3VzID0gX3JlZi5hdXRvRm9jdXMsXG4gICAgICBhdXRvQ29tcGxldGUgPSBfcmVmLmF1dG9Db21wbGV0ZSxcbiAgICAgIGVkaXRhYmxlID0gX3JlZi5lZGl0YWJsZSxcbiAgICAgIGFjY2Vzc2liaWxpdHlJbmRleCA9IF9yZWYuYWNjZXNzaWJpbGl0eUluZGV4LFxuICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgX29uS2V5RG93biA9IF9yZWYub25LZXlEb3duLFxuICAgICAgX29uTW91c2VEb3duID0gX3JlZi5vbk1vdXNlRG93bixcbiAgICAgIF9vbkNoYW5nZSA9IF9yZWYub25DaGFuZ2UsXG4gICAgICBvblBhc3RlID0gX3JlZi5vblBhc3RlLFxuICAgICAgX29uQ29tcG9zaXRpb25TdGFydCA9IF9yZWYub25Db21wb3NpdGlvblN0YXJ0LFxuICAgICAgX29uQ29tcG9zaXRpb25FbmQgPSBfcmVmLm9uQ29tcG9zaXRpb25FbmQsXG4gICAgICBvcGVuID0gX3JlZi5vcGVuLFxuICAgICAgYXR0cnMgPSBfcmVmLmF0dHJzO1xuICB2YXIgaW5wdXROb2RlID0gaW5wdXRFbGVtZW50IHx8IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBudWxsKTtcbiAgdmFyIF9pbnB1dE5vZGUgPSBpbnB1dE5vZGUsXG4gICAgICBvcmlnaW5SZWYgPSBfaW5wdXROb2RlLnJlZixcbiAgICAgIF9pbnB1dE5vZGUkcHJvcHMgPSBfaW5wdXROb2RlLnByb3BzLFxuICAgICAgb25PcmlnaW5LZXlEb3duID0gX2lucHV0Tm9kZSRwcm9wcy5vbktleURvd24sXG4gICAgICBvbk9yaWdpbkNoYW5nZSA9IF9pbnB1dE5vZGUkcHJvcHMub25DaGFuZ2UsXG4gICAgICBvbk9yaWdpbk1vdXNlRG93biA9IF9pbnB1dE5vZGUkcHJvcHMub25Nb3VzZURvd24sXG4gICAgICBvbk9yaWdpbkNvbXBvc2l0aW9uU3RhcnQgPSBfaW5wdXROb2RlJHByb3BzLm9uQ29tcG9zaXRpb25TdGFydCxcbiAgICAgIG9uT3JpZ2luQ29tcG9zaXRpb25FbmQgPSBfaW5wdXROb2RlJHByb3BzLm9uQ29tcG9zaXRpb25FbmQsXG4gICAgICBzdHlsZSA9IF9pbnB1dE5vZGUkcHJvcHMuc3R5bGU7XG4gIGlucHV0Tm9kZSA9IFJlYWN0LmNsb25lRWxlbWVudChpbnB1dE5vZGUsICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe1xuICAgIGlkOiBpZCxcbiAgICByZWY6ICgwLCBfcmVmMi5jb21wb3NlUmVmKShyZWYsIG9yaWdpblJlZiksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZSB8fCAnb2ZmJyxcbiAgICB0eXBlOiAnc2VhcmNoJyxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLXNlYXJjaC1pbnB1dFwiKSxcbiAgICBzdHlsZTogKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgb3BhY2l0eTogZWRpdGFibGUgPyBudWxsIDogMFxuICAgIH0pLFxuICAgIHJvbGU6ICdjb21ib2JveCcsXG4gICAgJ2FyaWEtZXhwYW5kZWQnOiBvcGVuLFxuICAgICdhcmlhLWhhc3BvcHVwJzogJ2xpc3Rib3gnLFxuICAgICdhcmlhLW93bnMnOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAnbGlzdCcsXG4gICAgJ2FyaWEtY29udHJvbHMnOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogXCJcIi5jb25jYXQoaWQsIFwiX2xpc3RfXCIpLmNvbmNhdChhY2Nlc3NpYmlsaXR5SW5kZXgpXG4gIH0sIGF0dHJzKSwge30sIHtcbiAgICB2YWx1ZTogZWRpdGFibGUgPyB2YWx1ZSA6ICcnLFxuICAgIHJlYWRPbmx5OiAhZWRpdGFibGUsXG4gICAgdW5zZWxlY3RhYmxlOiAhZWRpdGFibGUgPyAnb24nIDogbnVsbCxcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgX29uS2V5RG93bihldmVudCk7XG5cbiAgICAgIGlmIChvbk9yaWdpbktleURvd24pIHtcbiAgICAgICAgb25PcmlnaW5LZXlEb3duKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgX29uTW91c2VEb3duKGV2ZW50KTtcblxuICAgICAgaWYgKG9uT3JpZ2luTW91c2VEb3duKSB7XG4gICAgICAgIG9uT3JpZ2luTW91c2VEb3duKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShldmVudCkge1xuICAgICAgX29uQ2hhbmdlKGV2ZW50KTtcblxuICAgICAgaWYgKG9uT3JpZ2luQ2hhbmdlKSB7XG4gICAgICAgIG9uT3JpZ2luQ2hhbmdlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0KGV2ZW50KSB7XG4gICAgICBfb25Db21wb3NpdGlvblN0YXJ0KGV2ZW50KTtcblxuICAgICAgaWYgKG9uT3JpZ2luQ29tcG9zaXRpb25TdGFydCkge1xuICAgICAgICBvbk9yaWdpbkNvbXBvc2l0aW9uU3RhcnQoZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Db21wb3NpdGlvbkVuZDogZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZChldmVudCkge1xuICAgICAgX29uQ29tcG9zaXRpb25FbmQoZXZlbnQpO1xuXG4gICAgICBpZiAob25PcmlnaW5Db21wb3NpdGlvbkVuZCkge1xuICAgICAgICBvbk9yaWdpbkNvbXBvc2l0aW9uRW5kKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uUGFzdGU6IG9uUGFzdGVcbiAgfSkpO1xuICByZXR1cm4gaW5wdXROb2RlO1xufTtcblxudmFyIFJlZklucHV0ID0gUmVhY3QuZm9yd2FyZFJlZihJbnB1dCk7XG5SZWZJbnB1dC5kaXNwbGF5TmFtZSA9ICdJbnB1dCc7XG52YXIgX2RlZmF1bHQgPSBSZWZJbnB1dDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3BpY2tBdHRycyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3BpY2tBdHRyc1wiKSk7XG5cbnZhciBfcmNNb3Rpb24gPSByZXF1aXJlKFwicmMtbW90aW9uXCIpO1xuXG52YXIgX1RyYW5zQnRuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vVHJhbnNCdG5cIikpO1xuXG52YXIgX0lucHV0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JbnB1dFwiKSk7XG5cbnZhciBfdXNlTGF5b3V0RWZmZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaG9va3MvdXNlTGF5b3V0RWZmZWN0XCIpKTtcblxudmFyIFJFU1RfVEFHX0tFWSA9ICdfX1JDX1NFTEVDVF9NQVhfUkVTVF9DT1VOVF9fJztcblxudmFyIFNlbGVjdFNlbGVjdG9yID0gZnVuY3Rpb24gU2VsZWN0U2VsZWN0b3IocHJvcHMpIHtcbiAgdmFyIGlkID0gcHJvcHMuaWQsXG4gICAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICB2YWx1ZXMgPSBwcm9wcy52YWx1ZXMsXG4gICAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICAgIHNlYXJjaFZhbHVlID0gcHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgICBpbnB1dFJlZiA9IHByb3BzLmlucHV0UmVmLFxuICAgICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICAgIHNob3dTZWFyY2ggPSBwcm9wcy5zaG93U2VhcmNoLFxuICAgICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgICAgYXV0b0NvbXBsZXRlID0gcHJvcHMuYXV0b0NvbXBsZXRlLFxuICAgICAgYWNjZXNzaWJpbGl0eUluZGV4ID0gcHJvcHMuYWNjZXNzaWJpbGl0eUluZGV4LFxuICAgICAgdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleCxcbiAgICAgIHJlbW92ZUljb24gPSBwcm9wcy5yZW1vdmVJY29uLFxuICAgICAgY2hvaWNlVHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5jaG9pY2VUcmFuc2l0aW9uTmFtZSxcbiAgICAgIG1heFRhZ0NvdW50ID0gcHJvcHMubWF4VGFnQ291bnQsXG4gICAgICBtYXhUYWdUZXh0TGVuZ3RoID0gcHJvcHMubWF4VGFnVGV4dExlbmd0aCxcbiAgICAgIF9wcm9wcyRtYXhUYWdQbGFjZWhvbCA9IHByb3BzLm1heFRhZ1BsYWNlaG9sZGVyLFxuICAgICAgbWF4VGFnUGxhY2Vob2xkZXIgPSBfcHJvcHMkbWF4VGFnUGxhY2Vob2wgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChvbWl0dGVkVmFsdWVzKSB7XG4gICAgcmV0dXJuIFwiKyBcIi5jb25jYXQob21pdHRlZFZhbHVlcy5sZW5ndGgsIFwiIC4uLlwiKTtcbiAgfSA6IF9wcm9wcyRtYXhUYWdQbGFjZWhvbCxcbiAgICAgIHRhZ1JlbmRlciA9IHByb3BzLnRhZ1JlbmRlcixcbiAgICAgIG9uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgICBvbklucHV0Q2hhbmdlID0gcHJvcHMub25JbnB1dENoYW5nZSxcbiAgICAgIG9uSW5wdXRQYXN0ZSA9IHByb3BzLm9uSW5wdXRQYXN0ZSxcbiAgICAgIG9uSW5wdXRLZXlEb3duID0gcHJvcHMub25JbnB1dEtleURvd24sXG4gICAgICBvbklucHV0TW91c2VEb3duID0gcHJvcHMub25JbnB1dE1vdXNlRG93bixcbiAgICAgIG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0ID0gcHJvcHMub25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgICBvbklucHV0Q29tcG9zaXRpb25FbmQgPSBwcm9wcy5vbklucHV0Q29tcG9zaXRpb25FbmQ7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBtb3Rpb25BcHBlYXIgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0TW90aW9uQXBwZWFyID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgbWVhc3VyZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgICBpbnB1dFdpZHRoID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICAgIHNldElucHV0V2lkdGggPSBfUmVhY3QkdXNlU3RhdGU0WzFdOyAvLyA9PT09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0TW90aW9uQXBwZWFyKHRydWUpO1xuICB9LCBbXSk7IC8vID09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBpbnB1dFZhbHVlID0gb3BlbiB8fCBtb2RlID09PSAndGFncycgPyBzZWFyY2hWYWx1ZSA6ICcnO1xuICB2YXIgaW5wdXRFZGl0YWJsZSA9IG1vZGUgPT09ICd0YWdzJyB8fCBvcGVuICYmIHNob3dTZWFyY2g7IC8vIFdlIG1lYXN1cmUgd2lkdGggYW5kIHNldCB0byB0aGUgaW5wdXQgaW1tZWRpYXRlbHlcblxuICAoMCwgX3VzZUxheW91dEVmZmVjdC5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW5wdXRXaWR0aChtZWFzdXJlUmVmLmN1cnJlbnQuc2Nyb2xsV2lkdGgpO1xuICB9LCBbaW5wdXRWYWx1ZV0pOyAvLyA9PT09PT09PT09PT09PT09PT09PSBTZWxlY3Rpb24gPT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgZGlzcGxheVZhbHVlcyA9IHZhbHVlczsgLy8gQ3V0IGJ5IGBtYXhUYWdDb3VudGBcblxuICB2YXIgcmVzdENvdW50O1xuXG4gIGlmICh0eXBlb2YgbWF4VGFnQ291bnQgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdENvdW50ID0gdmFsdWVzLmxlbmd0aCAtIG1heFRhZ0NvdW50O1xuICAgIGRpc3BsYXlWYWx1ZXMgPSB2YWx1ZXMuc2xpY2UoMCwgbWF4VGFnQ291bnQpO1xuICB9IC8vIFVwZGF0ZSBieSBgbWF4VGFnVGV4dExlbmd0aGBcblxuXG4gIGlmICh0eXBlb2YgbWF4VGFnVGV4dExlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICBkaXNwbGF5VmFsdWVzID0gZGlzcGxheVZhbHVlcy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBsYWJlbCA9IF9yZWYubGFiZWwsXG4gICAgICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF9yZWYsIFtcImxhYmVsXCJdKTtcbiAgICAgIHZhciBkaXNwbGF5TGFiZWwgPSBsYWJlbDtcblxuICAgICAgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgc3RyTGFiZWwgPSBTdHJpbmcoZGlzcGxheUxhYmVsKTtcblxuICAgICAgICBpZiAoc3RyTGFiZWwubGVuZ3RoID4gbWF4VGFnVGV4dExlbmd0aCkge1xuICAgICAgICAgIGRpc3BsYXlMYWJlbCA9IFwiXCIuY29uY2F0KHN0ckxhYmVsLnNsaWNlKDAsIG1heFRhZ1RleHRMZW5ndGgpLCBcIi4uLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgcmVzdCksIHt9LCB7XG4gICAgICAgIGxhYmVsOiBkaXNwbGF5TGFiZWxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9IC8vIEZpbGwgcmVzdFxuXG5cbiAgaWYgKHJlc3RDb3VudCA+IDApIHtcbiAgICBkaXNwbGF5VmFsdWVzLnB1c2goe1xuICAgICAga2V5OiBSRVNUX1RBR19LRVksXG4gICAgICBsYWJlbDogdHlwZW9mIG1heFRhZ1BsYWNlaG9sZGVyID09PSAnZnVuY3Rpb24nID8gbWF4VGFnUGxhY2Vob2xkZXIodmFsdWVzLnNsaWNlKG1heFRhZ0NvdW50KSkgOiBtYXhUYWdQbGFjZWhvbGRlclxuICAgIH0pO1xuICB9XG5cbiAgdmFyIHNlbGVjdGlvbk5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY01vdGlvbi5DU1NNb3Rpb25MaXN0LCB7XG4gICAgY29tcG9uZW50OiBmYWxzZSxcbiAgICBrZXlzOiBkaXNwbGF5VmFsdWVzLFxuICAgIG1vdGlvbk5hbWU6IGNob2ljZVRyYW5zaXRpb25OYW1lLFxuICAgIG1vdGlvbkFwcGVhcjogbW90aW9uQXBwZWFyXG4gIH0sIGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBrZXkgPSBfcmVmMi5rZXksXG4gICAgICAgIGxhYmVsID0gX3JlZjIubGFiZWwsXG4gICAgICAgIHZhbHVlID0gX3JlZjIudmFsdWUsXG4gICAgICAgIGl0ZW1EaXNhYmxlZCA9IF9yZWYyLmRpc2FibGVkLFxuICAgICAgICBjbGFzc05hbWUgPSBfcmVmMi5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3JlZjIuc3R5bGU7XG4gICAgdmFyIG1lcmdlZEtleSA9IGtleSB8fCB2YWx1ZTtcbiAgICB2YXIgY2xvc2FibGUgPSBrZXkgIT09IFJFU1RfVEFHX0tFWSAmJiAhaXRlbURpc2FibGVkO1xuXG4gICAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgdmFyIG9uQ2xvc2UgPSBmdW5jdGlvbiBvbkNsb3NlKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25TZWxlY3QodmFsdWUsIHtcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHR5cGVvZiB0YWdSZW5kZXIgPT09ICdmdW5jdGlvbicgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBrZXk6IG1lcmdlZEtleSxcbiAgICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93bixcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSwgdGFnUmVuZGVyKHtcbiAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGRpc2FibGVkOiBpdGVtRGlzYWJsZWQsXG4gICAgICBjbG9zYWJsZTogY2xvc2FibGUsXG4gICAgICBvbkNsb3NlOiBvbkNsb3NlXG4gICAgfSkpIDogUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAga2V5OiBtZXJnZWRLZXksXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShjbGFzc05hbWUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLWl0ZW1cIiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1pdGVtLWRpc2FibGVkXCIpLCBpdGVtRGlzYWJsZWQpKSxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb24taXRlbS1jb250ZW50XCIpXG4gICAgfSwgbGFiZWwpLCBjbG9zYWJsZSAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KF9UcmFuc0J0bi5kZWZhdWx0LCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLWl0ZW0tcmVtb3ZlXCIpLFxuICAgICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgICAgb25DbGljazogb25DbG9zZSxcbiAgICAgIGN1c3RvbWl6ZUljb246IHJlbW92ZUljb25cbiAgICB9LCBcIlxceEQ3XCIpKTtcbiAgfSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBzZWxlY3Rpb25Ob2RlLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1zZWFyY2hcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBpbnB1dFdpZHRoXG4gICAgfVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9JbnB1dC5kZWZhdWx0LCB7XG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICBvcGVuOiBvcGVuLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGlkOiBpZCxcbiAgICBpbnB1dEVsZW1lbnQ6IG51bGwsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlLFxuICAgIGVkaXRhYmxlOiBpbnB1dEVkaXRhYmxlLFxuICAgIGFjY2Vzc2liaWxpdHlJbmRleDogYWNjZXNzaWJpbGl0eUluZGV4LFxuICAgIHZhbHVlOiBpbnB1dFZhbHVlLFxuICAgIG9uS2V5RG93bjogb25JbnB1dEtleURvd24sXG4gICAgb25Nb3VzZURvd246IG9uSW5wdXRNb3VzZURvd24sXG4gICAgb25DaGFuZ2U6IG9uSW5wdXRDaGFuZ2UsXG4gICAgb25QYXN0ZTogb25JbnB1dFBhc3RlLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnB1dENvbXBvc2l0aW9uRW5kLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBhdHRyczogKDAsIF9waWNrQXR0cnMuZGVmYXVsdCkocHJvcHMsIHRydWUpXG4gIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgcmVmOiBtZWFzdXJlUmVmLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb24tc2VhcmNoLW1pcnJvclwiKSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgaW5wdXRWYWx1ZSwgXCJcXHhBMFwiKSksICF2YWx1ZXMubGVuZ3RoICYmICFpbnB1dFZhbHVlICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLXBsYWNlaG9sZGVyXCIpXG4gIH0sIHBsYWNlaG9sZGVyKSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBTZWxlY3RTZWxlY3RvcjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcGlja0F0dHJzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvcGlja0F0dHJzXCIpKTtcblxudmFyIF9JbnB1dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSW5wdXRcIikpO1xuXG52YXIgU2luZ2xlU2VsZWN0b3IgPSBmdW5jdGlvbiBTaW5nbGVTZWxlY3Rvcihwcm9wcykge1xuICB2YXIgaW5wdXRFbGVtZW50ID0gcHJvcHMuaW5wdXRFbGVtZW50LFxuICAgICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgaWQgPSBwcm9wcy5pZCxcbiAgICAgIGlucHV0UmVmID0gcHJvcHMuaW5wdXRSZWYsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgICAgYXV0b0NvbXBsZXRlID0gcHJvcHMuYXV0b0NvbXBsZXRlLFxuICAgICAgYWNjZXNzaWJpbGl0eUluZGV4ID0gcHJvcHMuYWNjZXNzaWJpbGl0eUluZGV4LFxuICAgICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICAgIHZhbHVlcyA9IHByb3BzLnZhbHVlcyxcbiAgICAgIHBsYWNlaG9sZGVyID0gcHJvcHMucGxhY2Vob2xkZXIsXG4gICAgICB0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgICAgc2hvd1NlYXJjaCA9IHByb3BzLnNob3dTZWFyY2gsXG4gICAgICBzZWFyY2hWYWx1ZSA9IHByb3BzLnNlYXJjaFZhbHVlLFxuICAgICAgYWN0aXZlVmFsdWUgPSBwcm9wcy5hY3RpdmVWYWx1ZSxcbiAgICAgIG9uSW5wdXRLZXlEb3duID0gcHJvcHMub25JbnB1dEtleURvd24sXG4gICAgICBvbklucHV0TW91c2VEb3duID0gcHJvcHMub25JbnB1dE1vdXNlRG93bixcbiAgICAgIG9uSW5wdXRDaGFuZ2UgPSBwcm9wcy5vbklucHV0Q2hhbmdlLFxuICAgICAgb25JbnB1dFBhc3RlID0gcHJvcHMub25JbnB1dFBhc3RlLFxuICAgICAgb25JbnB1dENvbXBvc2l0aW9uU3RhcnQgPSBwcm9wcy5vbklucHV0Q29tcG9zaXRpb25TdGFydCxcbiAgICAgIG9uSW5wdXRDb21wb3NpdGlvbkVuZCA9IHByb3BzLm9uSW5wdXRDb21wb3NpdGlvbkVuZDtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGlucHV0Q2hhbmdlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRJbnB1dENoYW5nZWQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBjb21ib2JveCA9IG1vZGUgPT09ICdjb21ib2JveCc7XG4gIHZhciBpbnB1dEVkaXRhYmxlID0gY29tYm9ib3ggfHwgc2hvd1NlYXJjaDtcbiAgdmFyIGl0ZW0gPSB2YWx1ZXNbMF07XG4gIHZhciBpbnB1dFZhbHVlID0gc2VhcmNoVmFsdWUgfHwgJyc7XG5cbiAgaWYgKGNvbWJvYm94ICYmIGFjdGl2ZVZhbHVlICYmICFpbnB1dENoYW5nZWQpIHtcbiAgICBpbnB1dFZhbHVlID0gYWN0aXZlVmFsdWU7XG4gIH1cblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChjb21ib2JveCkge1xuICAgICAgc2V0SW5wdXRDaGFuZ2VkKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtjb21ib2JveCwgYWN0aXZlVmFsdWVdKTsgLy8gTm90IHNob3cgdGV4dCB3aGVuIGNsb3NlZCBleHBlY3QgY29tYm9ib3ggbW9kZVxuXG4gIHZhciBoYXNUZXh0SW5wdXQgPSBtb2RlICE9PSAnY29tYm9ib3gnICYmICFvcGVuID8gZmFsc2UgOiAhIWlucHV0VmFsdWU7XG4gIHZhciB0aXRsZSA9IGl0ZW0gJiYgKHR5cGVvZiBpdGVtLmxhYmVsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgaXRlbS5sYWJlbCA9PT0gJ251bWJlcicpID8gaXRlbS5sYWJlbC50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb24tc2VhcmNoXCIpXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0lucHV0LmRlZmF1bHQsIHtcbiAgICByZWY6IGlucHV0UmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGlkOiBpZCxcbiAgICBvcGVuOiBvcGVuLFxuICAgIGlucHV0RWxlbWVudDogaW5wdXRFbGVtZW50LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZSxcbiAgICBlZGl0YWJsZTogaW5wdXRFZGl0YWJsZSxcbiAgICBhY2Nlc3NpYmlsaXR5SW5kZXg6IGFjY2Vzc2liaWxpdHlJbmRleCxcbiAgICB2YWx1ZTogaW5wdXRWYWx1ZSxcbiAgICBvbktleURvd246IG9uSW5wdXRLZXlEb3duLFxuICAgIG9uTW91c2VEb3duOiBvbklucHV0TW91c2VEb3duLFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICBzZXRJbnB1dENoYW5nZWQodHJ1ZSk7XG4gICAgICBvbklucHV0Q2hhbmdlKGUpO1xuICAgIH0sXG4gICAgb25QYXN0ZTogb25JbnB1dFBhc3RlLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnB1dENvbXBvc2l0aW9uRW5kLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBhdHRyczogKDAsIF9waWNrQXR0cnMuZGVmYXVsdCkocHJvcHMsIHRydWUpXG4gIH0pKSwgIWNvbWJvYm94ICYmIGl0ZW0gJiYgIWhhc1RleHRJbnB1dCAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1pdGVtXCIpLFxuICAgIHRpdGxlOiB0aXRsZVxuICB9LCBpdGVtLmxhYmVsKSwgIWl0ZW0gJiYgIWhhc1RleHRJbnB1dCAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1wbGFjZWhvbGRlclwiKVxuICB9LCBwbGFjZWhvbGRlcikpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gU2luZ2xlU2VsZWN0b3I7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF9NdWx0aXBsZVNlbGVjdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9NdWx0aXBsZVNlbGVjdG9yXCIpKTtcblxudmFyIF9TaW5nbGVTZWxlY3RvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU2luZ2xlU2VsZWN0b3JcIikpO1xuXG52YXIgX3VzZUxvY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaG9va3MvdXNlTG9ja1wiKSk7XG5cbi8qKlxuICogQ3Vyc29yIHJ1bGU6XG4gKiAxLiBPbmx5IGBzaG93U2VhcmNoYCBlbmFibGVkXG4gKiAyLiBPbmx5IGBvcGVuYCBpcyBgdHJ1ZWBcbiAqIDMuIFdoZW4gdHlwaW5nLCBzZXQgYG9wZW5gIHRvIGB0cnVlYCB3aGljaCBoaXQgcnVsZSBvZiAyXG4gKlxuICogQWNjZXNzaWJpbGl0eTpcbiAqIC0gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLXByYWN0aWNlcy9leGFtcGxlcy9jb21ib2JveC9hcmlhMS4xcGF0dGVybi9saXN0Ym94LWNvbWJvLmh0bWxcbiAqL1xudmFyIFNlbGVjdG9yID0gZnVuY3Rpb24gU2VsZWN0b3IocHJvcHMsIHJlZikge1xuICB2YXIgaW5wdXRSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShudWxsKTtcbiAgdmFyIGNvbXBvc2l0aW9uU3RhdHVzUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoZmFsc2UpO1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgbXVsdGlwbGUgPSBwcm9wcy5tdWx0aXBsZSxcbiAgICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgICBzaG93U2VhcmNoID0gcHJvcHMuc2hvd1NlYXJjaCxcbiAgICAgIHRva2VuV2l0aEVudGVyID0gcHJvcHMudG9rZW5XaXRoRW50ZXIsXG4gICAgICBvblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoLFxuICAgICAgb25TZWFyY2hTdWJtaXQgPSBwcm9wcy5vblNlYXJjaFN1Ym1pdCxcbiAgICAgIG9uVG9nZ2xlT3BlbiA9IHByb3BzLm9uVG9nZ2xlT3BlbixcbiAgICAgIG9uSW5wdXRLZXlEb3duID0gcHJvcHMub25JbnB1dEtleURvd24sXG4gICAgICBkb21SZWYgPSBwcm9wcy5kb21SZWY7IC8vID09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgfSxcbiAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgfVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09IElucHV0ID09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgX3VzZUxvY2sgPSAoMCwgX3VzZUxvY2szLmRlZmF1bHQpKDApLFxuICAgICAgX3VzZUxvY2syID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlTG9jaywgMiksXG4gICAgICBnZXRJbnB1dE1vdXNlRG93biA9IF91c2VMb2NrMlswXSxcbiAgICAgIHNldElucHV0TW91c2VEb3duID0gX3VzZUxvY2syWzFdO1xuXG4gIHZhciBvbkludGVybmFsSW5wdXRLZXlEb3duID0gZnVuY3Rpb24gb25JbnRlcm5hbElucHV0S2V5RG93bihldmVudCkge1xuICAgIHZhciB3aGljaCA9IGV2ZW50LndoaWNoO1xuXG4gICAgaWYgKHdoaWNoID09PSBfS2V5Q29kZS5kZWZhdWx0LlVQIHx8IHdoaWNoID09PSBfS2V5Q29kZS5kZWZhdWx0LkRPV04pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKG9uSW5wdXRLZXlEb3duKSB7XG4gICAgICBvbklucHV0S2V5RG93bihldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKHdoaWNoID09PSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSICYmIG1vZGUgPT09ICd0YWdzJyAmJiAhY29tcG9zaXRpb25TdGF0dXNSZWYuY3VycmVudCAmJiAhb3Blbikge1xuICAgICAgLy8gV2hlbiBtZW51IGlzbid0IG9wZW4sIE9wdGlvbkxpc3Qgd29uJ3QgdHJpZ2dlciBhIHZhbHVlIGNoYW5nZVxuICAgICAgLy8gU28gd2hlbiBlbnRlciBpcyBwcmVzc2VkLCB0aGUgdGFnJ3MgaW5wdXQgdmFsdWUgc2hvdWxkIGJlIGVtaXR0ZWQgaGVyZSB0byBsZXQgc2VsZWN0b3Iga25vd1xuICAgICAgb25TZWFyY2hTdWJtaXQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoIVtfS2V5Q29kZS5kZWZhdWx0LlNISUZULCBfS2V5Q29kZS5kZWZhdWx0LlRBQiwgX0tleUNvZGUuZGVmYXVsdC5CQUNLU1BBQ0UsIF9LZXlDb2RlLmRlZmF1bHQuRVNDXS5pbmNsdWRlcyh3aGljaCkpIHtcbiAgICAgIG9uVG9nZ2xlT3Blbih0cnVlKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBXZSBjYW4gbm90IHVzZSBgZmluZERPTU5vZGVgIHNpbmUgaXQgd2lsbCBnZXQgd2FybmluZyxcbiAgICogaGF2ZSB0byB1c2UgdGltZXIgdG8gY2hlY2sgaWYgaXMgaW5wdXQgZWxlbWVudC5cbiAgICovXG5cblxuICB2YXIgb25JbnRlcm5hbElucHV0TW91c2VEb3duID0gZnVuY3Rpb24gb25JbnRlcm5hbElucHV0TW91c2VEb3duKCkge1xuICAgIHNldElucHV0TW91c2VEb3duKHRydWUpO1xuICB9OyAvLyBXaGVuIHBhc3RlIGNvbWUsIGlnbm9yZSBuZXh0IG9uQ2hhbmdlXG5cblxuICB2YXIgcGFzdGVkVGV4dFJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKG51bGwpO1xuXG4gIHZhciB0cmlnZ2VyT25TZWFyY2ggPSBmdW5jdGlvbiB0cmlnZ2VyT25TZWFyY2godmFsdWUpIHtcbiAgICBpZiAob25TZWFyY2godmFsdWUsIHRydWUsIGNvbXBvc2l0aW9uU3RhdHVzUmVmLmN1cnJlbnQpICE9PSBmYWxzZSkge1xuICAgICAgb25Ub2dnbGVPcGVuKHRydWUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25JbnB1dENvbXBvc2l0aW9uU3RhcnQgPSBmdW5jdGlvbiBvbklucHV0Q29tcG9zaXRpb25TdGFydCgpIHtcbiAgICBjb21wb3NpdGlvblN0YXR1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfTtcblxuICB2YXIgb25JbnB1dENvbXBvc2l0aW9uRW5kID0gZnVuY3Rpb24gb25JbnB1dENvbXBvc2l0aW9uRW5kKCkge1xuICAgIGNvbXBvc2l0aW9uU3RhdHVzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfTtcblxuICB2YXIgb25JbnB1dENoYW5nZSA9IGZ1bmN0aW9uIG9uSW5wdXRDaGFuZ2UoZXZlbnQpIHtcbiAgICB2YXIgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7IC8vIFBhc3RlZCB0ZXh0IHNob3VsZCByZXBsYWNlIGJhY2sgdG8gb3JpZ2luIGNvbnRlbnRcblxuICAgIGlmICh0b2tlbldpdGhFbnRlciAmJiBwYXN0ZWRUZXh0UmVmLmN1cnJlbnQgJiYgL1tcXHJcXG5dLy50ZXN0KHBhc3RlZFRleHRSZWYuY3VycmVudCkpIHtcbiAgICAgIC8vIENSTEYgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIHNwYWNlIGZvciBpbnB1dCBlbGVtZW50XG4gICAgICB2YXIgcmVwbGFjZWRUZXh0ID0gcGFzdGVkVGV4dFJlZi5jdXJyZW50LnJlcGxhY2UoL1xcclxcbi9nLCAnICcpLnJlcGxhY2UoL1tcXHJcXG5dL2csICcgJyk7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVwbGFjZWRUZXh0LCBwYXN0ZWRUZXh0UmVmLmN1cnJlbnQpO1xuICAgIH1cblxuICAgIHBhc3RlZFRleHRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgdHJpZ2dlck9uU2VhcmNoKHZhbHVlKTtcbiAgfTtcblxuICB2YXIgb25JbnB1dFBhc3RlID0gZnVuY3Rpb24gb25JbnB1dFBhc3RlKGUpIHtcbiAgICB2YXIgY2xpcGJvYXJkRGF0YSA9IGUuY2xpcGJvYXJkRGF0YTtcbiAgICB2YXIgdmFsdWUgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcbiAgICBwYXN0ZWRUZXh0UmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfTtcblxuICB2YXIgb25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soX3JlZikge1xuICAgIHZhciB0YXJnZXQgPSBfcmVmLnRhcmdldDtcblxuICAgIGlmICh0YXJnZXQgIT09IGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIC8vIFNob3VsZCBmb2N1cyBpbnB1dCBpZiBjbGljayB0aGUgc2VsZWN0b3JcbiAgICAgIHZhciBpc0lFID0gZG9jdW1lbnQuYm9keS5zdHlsZS5tc1RvdWNoQWN0aW9uICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChpc0lFKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgdmFyIGlucHV0TW91c2VEb3duID0gZ2V0SW5wdXRNb3VzZURvd24oKTtcblxuICAgIGlmIChldmVudC50YXJnZXQgIT09IGlucHV0UmVmLmN1cnJlbnQgJiYgIWlucHV0TW91c2VEb3duKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChtb2RlICE9PSAnY29tYm9ib3gnICYmICghc2hvd1NlYXJjaCB8fCAhaW5wdXRNb3VzZURvd24pIHx8ICFvcGVuKSB7XG4gICAgICBpZiAob3Blbikge1xuICAgICAgICBvblNlYXJjaCgnJywgdHJ1ZSwgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBvblRvZ2dsZU9wZW4oKTtcbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PT09IElubmVyIFNlbGVjdG9yID09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIHNoYXJlZFByb3BzID0ge1xuICAgIGlucHV0UmVmOiBpbnB1dFJlZixcbiAgICBvbklucHV0S2V5RG93bjogb25JbnRlcm5hbElucHV0S2V5RG93bixcbiAgICBvbklucHV0TW91c2VEb3duOiBvbkludGVybmFsSW5wdXRNb3VzZURvd24sXG4gICAgb25JbnB1dENoYW5nZTogb25JbnB1dENoYW5nZSxcbiAgICBvbklucHV0UGFzdGU6IG9uSW5wdXRQYXN0ZSxcbiAgICBvbklucHV0Q29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25JbnB1dENvbXBvc2l0aW9uRW5kOiBvbklucHV0Q29tcG9zaXRpb25FbmRcbiAgfTtcbiAgdmFyIHNlbGVjdE5vZGUgPSBtdWx0aXBsZSA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX011bHRpcGxlU2VsZWN0b3IuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHNoYXJlZFByb3BzKSkgOiBSZWFjdC5jcmVhdGVFbGVtZW50KF9TaW5nbGVTZWxlY3Rvci5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgc2hhcmVkUHJvcHMpKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogZG9tUmVmLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3RvclwiKSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93blxuICB9LCBzZWxlY3ROb2RlKTtcbn07XG5cbnZhciBGb3J3YXJkU2VsZWN0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKFNlbGVjdG9yKTtcbkZvcndhcmRTZWxlY3Rvci5kaXNwbGF5TmFtZSA9ICdTZWxlY3Rvcic7XG52YXIgX2RlZmF1bHQgPSBGb3J3YXJkU2VsZWN0b3I7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgVHJhbnNCdG4gPSBmdW5jdGlvbiBUcmFuc0J0bihfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIGN1c3RvbWl6ZUljb24gPSBfcmVmLmN1c3RvbWl6ZUljb24sXG4gICAgICBjdXN0b21pemVJY29uUHJvcHMgPSBfcmVmLmN1c3RvbWl6ZUljb25Qcm9wcyxcbiAgICAgIF9vbk1vdXNlRG93biA9IF9yZWYub25Nb3VzZURvd24sXG4gICAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgaWNvbjtcblxuICBpZiAodHlwZW9mIGN1c3RvbWl6ZUljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBpY29uID0gY3VzdG9taXplSWNvbihjdXN0b21pemVJY29uUHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIGljb24gPSBjdXN0b21pemVJY29uO1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChfb25Nb3VzZURvd24pIHtcbiAgICAgICAgX29uTW91c2VEb3duKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0eWxlOiB7XG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBXZWJraXRVc2VyU2VsZWN0OiAnbm9uZSdcbiAgICB9LFxuICAgIHVuc2VsZWN0YWJsZTogXCJvblwiLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIGljb24gIT09IHVuZGVmaW5lZCA/IGljb24gOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoY2xhc3NOYW1lLnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChjbHMsIFwiLWljb25cIik7XG4gICAgfSkpXG4gIH0sIGNoaWxkcmVuKSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBUcmFuc0J0bjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGdlbmVyYXRlU2VsZWN0b3I7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfdXNlTWVyZ2VkU3RhdGU1ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIikpO1xuXG52YXIgX1NlbGVjdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TZWxlY3RvclwiKSk7XG5cbnZhciBfU2VsZWN0VHJpZ2dlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU2VsZWN0VHJpZ2dlclwiKSk7XG5cbnZhciBfZ2VuZXJhdG9yID0gcmVxdWlyZShcIi4vaW50ZXJmYWNlL2dlbmVyYXRvclwiKTtcblxudmFyIF9jb21tb25VdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvY29tbW9uVXRpbFwiKTtcblxudmFyIF9UcmFuc0J0biA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVHJhbnNCdG5cIikpO1xuXG52YXIgX3VzZUxvY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VMb2NrXCIpKTtcblxudmFyIF91c2VEZWxheVJlc2V0MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlRGVsYXlSZXNldFwiKSk7XG5cbnZhciBfdXNlTGF5b3V0RWZmZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VMYXlvdXRFZmZlY3RcIikpO1xuXG52YXIgX3ZhbHVlVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL3ZhbHVlVXRpbFwiKTtcblxudmFyIF91c2VTZWxlY3RUcmlnZ2VyQ29udHJvbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlU2VsZWN0VHJpZ2dlckNvbnRyb2xcIikpO1xuXG52YXIgX3VzZUNhY2hlRGlzcGxheVZhbHVlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VDYWNoZURpc3BsYXlWYWx1ZVwiKSk7XG5cbnZhciBfdXNlQ2FjaGVPcHRpb25zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VDYWNoZU9wdGlvbnNcIikpO1xuXG4vKipcbiAqIFRvIG1hdGNoIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnQsIHdlIGFsd2F5cyBwcm92aWRlIGFuIGlucHV0IGluIHRoZSBjb21wb25lbnQuXG4gKiBPdGhlciBlbGVtZW50IHdpbGwgbm90IHNldCBgdGFiSW5kZXhgIHRvIGF2b2lkIGBvbkJsdXJgIHNlcXVlbmNlIHByb2JsZW0uXG4gKiBGb3IgZm9jdXNlZCBzZWxlY3QsIHdlIHNldCBgYXJpYS1saXZlPVwicG9saXRlXCJgIHRvIHVwZGF0ZSB0aGUgYWNjZXNzaWJpbGl0eSBjb250ZW50LlxuICpcbiAqIHJlZjpcbiAqIC0ga2V5Ym9hcmQ6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FjY2Vzc2liaWxpdHkvQVJJQS9Sb2xlcy9saXN0Ym94X3JvbGUjS2V5Ym9hcmRfaW50ZXJhY3Rpb25zXG4gKi9cbnZhciBERUZBVUxUX09NSVRfUFJPUFMgPSBbJ3JlbW92ZUljb24nLCAncGxhY2Vob2xkZXInLCAnYXV0b0ZvY3VzJywgJ21heFRhZ0NvdW50JywgJ21heFRhZ1RleHRMZW5ndGgnLCAnbWF4VGFnUGxhY2Vob2xkZXInLCAnY2hvaWNlVHJhbnNpdGlvbk5hbWUnLCAnb25JbnB1dEtleURvd24nXTtcbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBpbiBpbnRlcm5hbCB1c2FnZS5cbiAqIERvIG5vdCB1c2UgaXQgaW4geW91ciBwcm9kIGVudiBzaW5jZSB3ZSBtYXkgcmVmYWN0b3IgdGhpcy5cbiAqL1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVNlbGVjdG9yKGNvbmZpZykge1xuICB2YXIgZGVmYXVsdFByZWZpeENscyA9IGNvbmZpZy5wcmVmaXhDbHMsXG4gICAgICBPcHRpb25MaXN0ID0gY29uZmlnLmNvbXBvbmVudHMub3B0aW9uTGlzdCxcbiAgICAgIGNvbnZlcnRDaGlsZHJlblRvRGF0YSA9IGNvbmZpZy5jb252ZXJ0Q2hpbGRyZW5Ub0RhdGEsXG4gICAgICBmbGF0dGVuT3B0aW9ucyA9IGNvbmZpZy5mbGF0dGVuT3B0aW9ucyxcbiAgICAgIGdldExhYmVsZWRWYWx1ZSA9IGNvbmZpZy5nZXRMYWJlbGVkVmFsdWUsXG4gICAgICBmaWx0ZXJPcHRpb25zID0gY29uZmlnLmZpbHRlck9wdGlvbnMsXG4gICAgICBpc1ZhbHVlRGlzYWJsZWQgPSBjb25maWcuaXNWYWx1ZURpc2FibGVkLFxuICAgICAgZmluZFZhbHVlT3B0aW9uID0gY29uZmlnLmZpbmRWYWx1ZU9wdGlvbixcbiAgICAgIHdhcm5pbmdQcm9wcyA9IGNvbmZpZy53YXJuaW5nUHJvcHMsXG4gICAgICBmaWxsT3B0aW9uc1dpdGhNaXNzaW5nVmFsdWUgPSBjb25maWcuZmlsbE9wdGlvbnNXaXRoTWlzc2luZ1ZhbHVlLFxuICAgICAgb21pdERPTVByb3BzID0gY29uZmlnLm9taXRET01Qcm9wczsgLy8gVXNlIHJhdyBkZWZpbmUgc2luY2UgYFJlYWN0LkZDYCBub3Qgc3VwcG9ydCBnZW5lcmljXG5cbiAgZnVuY3Rpb24gU2VsZWN0KHByb3BzLCByZWYpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXMyO1xuXG4gICAgdmFyIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/IGRlZmF1bHRQcmVmaXhDbHMgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGlkID0gcHJvcHMuaWQsXG4gICAgICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgICAgICBkZWZhdWx0T3BlbiA9IHByb3BzLmRlZmF1bHRPcGVuLFxuICAgICAgICBvcHRpb25zID0gcHJvcHMub3B0aW9ucyxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgbGFiZWxJblZhbHVlID0gcHJvcHMubGFiZWxJblZhbHVlLFxuICAgICAgICBzaG93U2VhcmNoID0gcHJvcHMuc2hvd1NlYXJjaCxcbiAgICAgICAgaW5wdXRWYWx1ZSA9IHByb3BzLmlucHV0VmFsdWUsXG4gICAgICAgIHNlYXJjaFZhbHVlID0gcHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgICAgIGZpbHRlck9wdGlvbiA9IHByb3BzLmZpbHRlck9wdGlvbixcbiAgICAgICAgX3Byb3BzJG9wdGlvbkZpbHRlclByID0gcHJvcHMub3B0aW9uRmlsdGVyUHJvcCxcbiAgICAgICAgb3B0aW9uRmlsdGVyUHJvcCA9IF9wcm9wcyRvcHRpb25GaWx0ZXJQciA9PT0gdm9pZCAwID8gJ3ZhbHVlJyA6IF9wcm9wcyRvcHRpb25GaWx0ZXJQcixcbiAgICAgICAgX3Byb3BzJGF1dG9DbGVhclNlYXJjID0gcHJvcHMuYXV0b0NsZWFyU2VhcmNoVmFsdWUsXG4gICAgICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlID0gX3Byb3BzJGF1dG9DbGVhclNlYXJjID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGF1dG9DbGVhclNlYXJjLFxuICAgICAgICBvblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoLFxuICAgICAgICBhbGxvd0NsZWFyID0gcHJvcHMuYWxsb3dDbGVhcixcbiAgICAgICAgY2xlYXJJY29uID0gcHJvcHMuY2xlYXJJY29uLFxuICAgICAgICBzaG93QXJyb3cgPSBwcm9wcy5zaG93QXJyb3csXG4gICAgICAgIGlucHV0SWNvbiA9IHByb3BzLmlucHV0SWNvbixcbiAgICAgICAgbWVudUl0ZW1TZWxlY3RlZEljb24gPSBwcm9wcy5tZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmcsXG4gICAgICAgIGRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbiA9IHByb3BzLmRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbixcbiAgICAgICAgX3Byb3BzJG5vdEZvdW5kQ29udGVuID0gcHJvcHMubm90Rm91bmRDb250ZW50LFxuICAgICAgICBub3RGb3VuZENvbnRlbnQgPSBfcHJvcHMkbm90Rm91bmRDb250ZW4gPT09IHZvaWQgMCA/ICdOb3QgRm91bmQnIDogX3Byb3BzJG5vdEZvdW5kQ29udGVuLFxuICAgICAgICBvcHRpb25MYWJlbFByb3AgPSBwcm9wcy5vcHRpb25MYWJlbFByb3AsXG4gICAgICAgIGJhY2tmaWxsID0gcHJvcHMuYmFja2ZpbGwsXG4gICAgICAgIGdldElucHV0RWxlbWVudCA9IHByb3BzLmdldElucHV0RWxlbWVudCxcbiAgICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgX3Byb3BzJGxpc3RIZWlnaHQgPSBwcm9wcy5saXN0SGVpZ2h0LFxuICAgICAgICBsaXN0SGVpZ2h0ID0gX3Byb3BzJGxpc3RIZWlnaHQgPT09IHZvaWQgMCA/IDIwMCA6IF9wcm9wcyRsaXN0SGVpZ2h0LFxuICAgICAgICBfcHJvcHMkbGlzdEl0ZW1IZWlnaHQgPSBwcm9wcy5saXN0SXRlbUhlaWdodCxcbiAgICAgICAgbGlzdEl0ZW1IZWlnaHQgPSBfcHJvcHMkbGlzdEl0ZW1IZWlnaHQgPT09IHZvaWQgMCA/IDIwIDogX3Byb3BzJGxpc3RJdGVtSGVpZ2h0LFxuICAgICAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgICAgIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWUsXG4gICAgICAgIHZpcnR1YWwgPSBwcm9wcy52aXJ0dWFsLFxuICAgICAgICBkcm9wZG93blN0eWxlID0gcHJvcHMuZHJvcGRvd25TdHlsZSxcbiAgICAgICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICAgICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID0gcHJvcHMuZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoLFxuICAgICAgICBkcm9wZG93blJlbmRlciA9IHByb3BzLmRyb3Bkb3duUmVuZGVyLFxuICAgICAgICBkcm9wZG93bkFsaWduID0gcHJvcHMuZHJvcGRvd25BbGlnbixcbiAgICAgICAgX3Byb3BzJHNob3dBY3Rpb24gPSBwcm9wcy5zaG93QWN0aW9uLFxuICAgICAgICBzaG93QWN0aW9uID0gX3Byb3BzJHNob3dBY3Rpb24gPT09IHZvaWQgMCA/IFtdIDogX3Byb3BzJHNob3dBY3Rpb24sXG4gICAgICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICAgICAgdG9rZW5TZXBhcmF0b3JzID0gcHJvcHMudG9rZW5TZXBhcmF0b3JzLFxuICAgICAgICB0YWdSZW5kZXIgPSBwcm9wcy50YWdSZW5kZXIsXG4gICAgICAgIG9uUG9wdXBTY3JvbGwgPSBwcm9wcy5vblBvcHVwU2Nyb2xsLFxuICAgICAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlLFxuICAgICAgICBvbkZvY3VzID0gcHJvcHMub25Gb2N1cyxcbiAgICAgICAgb25CbHVyID0gcHJvcHMub25CbHVyLFxuICAgICAgICBvbktleVVwID0gcHJvcHMub25LZXlVcCxcbiAgICAgICAgb25LZXlEb3duID0gcHJvcHMub25LZXlEb3duLFxuICAgICAgICBvbk1vdXNlRG93biA9IHByb3BzLm9uTW91c2VEb3duLFxuICAgICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgICBvblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0LFxuICAgICAgICBvbkRlc2VsZWN0ID0gcHJvcHMub25EZXNlbGVjdCxcbiAgICAgICAgb25DbGVhciA9IHByb3BzLm9uQ2xlYXIsXG4gICAgICAgIF9wcm9wcyRpbnRlcm5hbFByb3BzID0gcHJvcHMuaW50ZXJuYWxQcm9wcyxcbiAgICAgICAgaW50ZXJuYWxQcm9wcyA9IF9wcm9wcyRpbnRlcm5hbFByb3BzID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRpbnRlcm5hbFByb3BzLFxuICAgICAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiaWRcIiwgXCJvcGVuXCIsIFwiZGVmYXVsdE9wZW5cIiwgXCJvcHRpb25zXCIsIFwiY2hpbGRyZW5cIiwgXCJtb2RlXCIsIFwidmFsdWVcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJsYWJlbEluVmFsdWVcIiwgXCJzaG93U2VhcmNoXCIsIFwiaW5wdXRWYWx1ZVwiLCBcInNlYXJjaFZhbHVlXCIsIFwiZmlsdGVyT3B0aW9uXCIsIFwib3B0aW9uRmlsdGVyUHJvcFwiLCBcImF1dG9DbGVhclNlYXJjaFZhbHVlXCIsIFwib25TZWFyY2hcIiwgXCJhbGxvd0NsZWFyXCIsIFwiY2xlYXJJY29uXCIsIFwic2hvd0Fycm93XCIsIFwiaW5wdXRJY29uXCIsIFwibWVudUl0ZW1TZWxlY3RlZEljb25cIiwgXCJkaXNhYmxlZFwiLCBcImxvYWRpbmdcIiwgXCJkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb25cIiwgXCJub3RGb3VuZENvbnRlbnRcIiwgXCJvcHRpb25MYWJlbFByb3BcIiwgXCJiYWNrZmlsbFwiLCBcImdldElucHV0RWxlbWVudFwiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwibGlzdEhlaWdodFwiLCBcImxpc3RJdGVtSGVpZ2h0XCIsIFwiYW5pbWF0aW9uXCIsIFwidHJhbnNpdGlvbk5hbWVcIiwgXCJ2aXJ0dWFsXCIsIFwiZHJvcGRvd25TdHlsZVwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXCIsIFwiZHJvcGRvd25SZW5kZXJcIiwgXCJkcm9wZG93bkFsaWduXCIsIFwic2hvd0FjdGlvblwiLCBcImRpcmVjdGlvblwiLCBcInRva2VuU2VwYXJhdG9yc1wiLCBcInRhZ1JlbmRlclwiLCBcIm9uUG9wdXBTY3JvbGxcIiwgXCJvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZVwiLCBcIm9uRm9jdXNcIiwgXCJvbkJsdXJcIiwgXCJvbktleVVwXCIsIFwib25LZXlEb3duXCIsIFwib25Nb3VzZURvd25cIiwgXCJvbkNoYW5nZVwiLCBcIm9uU2VsZWN0XCIsIFwib25EZXNlbGVjdFwiLCBcIm9uQ2xlYXJcIiwgXCJpbnRlcm5hbFByb3BzXCJdKTtcbiAgICB2YXIgdXNlSW50ZXJuYWxQcm9wcyA9IGludGVybmFsUHJvcHMubWFyayA9PT0gX2dlbmVyYXRvci5JTlRFUk5BTF9QUk9QU19NQVJLO1xuICAgIHZhciBkb21Qcm9wcyA9IG9taXRET01Qcm9wcyA/IG9taXRET01Qcm9wcyhyZXN0UHJvcHMpIDogcmVzdFByb3BzO1xuICAgIERFRkFVTFRfT01JVF9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBkZWxldGUgZG9tUHJvcHNbcHJvcF07XG4gICAgfSk7XG4gICAgdmFyIGNvbnRhaW5lclJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKG51bGwpO1xuICAgIHZhciB0cmlnZ2VyUmVmID0gKDAsIFJlYWN0LnVzZVJlZikobnVsbCk7XG4gICAgdmFyIHNlbGVjdG9yUmVmID0gKDAsIFJlYWN0LnVzZVJlZikobnVsbCk7XG4gICAgdmFyIGxpc3RSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShudWxsKTtcbiAgICB2YXIgdG9rZW5XaXRoRW50ZXIgPSAoMCwgUmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICh0b2tlblNlcGFyYXRvcnMgfHwgW10pLnNvbWUoZnVuY3Rpb24gKHRva2VuU2VwYXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBbJ1xcbicsICdcXHJcXG4nXS5pbmNsdWRlcyh0b2tlblNlcGFyYXRvcik7XG4gICAgICB9KTtcbiAgICB9LCBbdG9rZW5TZXBhcmF0b3JzXSk7XG4gICAgLyoqIFVzZWQgZm9yIGNvbXBvbmVudCBmb2N1c2VkIG1hbmFnZW1lbnQgKi9cblxuICAgIHZhciBfdXNlRGVsYXlSZXNldCA9ICgwLCBfdXNlRGVsYXlSZXNldDMuZGVmYXVsdCkoKSxcbiAgICAgICAgX3VzZURlbGF5UmVzZXQyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlRGVsYXlSZXNldCwgMyksXG4gICAgICAgIG1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzBdLFxuICAgICAgICBzZXRNb2NrRm9jdXNlZCA9IF91c2VEZWxheVJlc2V0MlsxXSxcbiAgICAgICAgY2FuY2VsU2V0TW9ja0ZvY3VzZWQgPSBfdXNlRGVsYXlSZXNldDJbMl07IC8vIElubmVyIGlkIGZvciBhY2Nlc3NpYmlsaXR5IHVzYWdlLiBPbmx5IHdvcmsgaW4gY2xpZW50IHNpZGVcblxuXG4gICAgdmFyIF91c2VTdGF0ZSA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoKSxcbiAgICAgICAgX3VzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlLCAyKSxcbiAgICAgICAgaW5uZXJJZCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICAgIHNldElubmVySWQgPSBfdXNlU3RhdGUyWzFdO1xuXG4gICAgKDAsIFJlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0SW5uZXJJZChcInJjX3NlbGVjdF9cIi5jb25jYXQoKDAsIF9jb21tb25VdGlsLmdldFVVSUQpKCkpKTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIG1lcmdlZElkID0gaWQgfHwgaW5uZXJJZDsgLy8gb3B0aW9uTGFiZWxQcm9wXG5cbiAgICB2YXIgbWVyZ2VkT3B0aW9uTGFiZWxQcm9wID0gb3B0aW9uTGFiZWxQcm9wO1xuXG4gICAgaWYgKG1lcmdlZE9wdGlvbkxhYmVsUHJvcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXJnZWRPcHRpb25MYWJlbFByb3AgPSBvcHRpb25zID8gJ2xhYmVsJyA6ICdjaGlsZHJlbic7XG4gICAgfSAvLyBsYWJlbEluVmFsdWVcblxuXG4gICAgdmFyIG1lcmdlZExhYmVsSW5WYWx1ZSA9IG1vZGUgPT09ICdjb21ib2JveCcgPyBmYWxzZSA6IGxhYmVsSW5WYWx1ZTtcbiAgICB2YXIgaXNNdWx0aXBsZSA9IG1vZGUgPT09ICd0YWdzJyB8fCBtb2RlID09PSAnbXVsdGlwbGUnO1xuICAgIHZhciBtZXJnZWRTaG93U2VhcmNoID0gc2hvd1NlYXJjaCAhPT0gdW5kZWZpbmVkID8gc2hvd1NlYXJjaCA6IGlzTXVsdGlwbGUgfHwgbW9kZSA9PT0gJ2NvbWJvYm94JzsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB2YXIgc2VsZWN0b3JEb21SZWYgPSAoMCwgUmVhY3QudXNlUmVmKShudWxsKTtcbiAgICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9jdXM6IHNlbGVjdG9yUmVmLmN1cnJlbnQuZm9jdXMsXG4gICAgICAgIGJsdXI6IHNlbGVjdG9yUmVmLmN1cnJlbnQuYmx1clxuICAgICAgfTtcbiAgICB9KTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gKDAsIF91c2VNZXJnZWRTdGF0ZTUuZGVmYXVsdCkoZGVmYXVsdFZhbHVlLCB7XG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KSxcbiAgICAgICAgX3VzZU1lcmdlZFN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICAgICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgICAgICBzZXRNZXJnZWRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gICAgLyoqIFVuaXF1ZSByYXcgdmFsdWVzICovXG5cblxuICAgIHZhciBtZXJnZWRSYXdWYWx1ZSA9ICgwLCBSZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gKDAsIF9jb21tb25VdGlsLnRvSW5uZXJWYWx1ZSkobWVyZ2VkVmFsdWUsIHtcbiAgICAgICAgbGFiZWxJblZhbHVlOiBtZXJnZWRMYWJlbEluVmFsdWUsXG4gICAgICAgIGNvbWJvYm94OiBtb2RlID09PSAnY29tYm9ib3gnXG4gICAgICB9KTtcbiAgICB9LCBbbWVyZ2VkVmFsdWUsIG1lcmdlZExhYmVsSW5WYWx1ZV0pO1xuICAgIC8qKiBXZSBjYWNoZSBhIHNldCBvZiByYXcgdmFsdWVzIHRvIHNwZWVkIHVwIGNoZWNrICovXG5cbiAgICB2YXIgcmF3VmFsdWVzID0gKDAsIFJlYWN0LnVzZU1lbW8pKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1lcmdlZFJhd1ZhbHVlKTtcbiAgICB9LCBbbWVyZ2VkUmF3VmFsdWVdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3B0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gU2V0IGJ5IG9wdGlvbiBsaXN0IGFjdGl2ZSwgaXQgd2lsbCBtZXJnZSBpbnRvIHNlYXJjaCBpbnB1dCB3aGVuIG1vZGUgaXMgYGNvbWJvYm94YFxuXG4gICAgdmFyIF91c2VTdGF0ZTMgPSAoMCwgUmVhY3QudXNlU3RhdGUpKG51bGwpLFxuICAgICAgICBfdXNlU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUzLCAyKSxcbiAgICAgICAgYWN0aXZlVmFsdWUgPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgICBzZXRBY3RpdmVWYWx1ZSA9IF91c2VTdGF0ZTRbMV07XG5cbiAgICB2YXIgX3VzZVN0YXRlNSA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoJycpLFxuICAgICAgICBfdXNlU3RhdGU2ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGU1LCAyKSxcbiAgICAgICAgaW5uZXJTZWFyY2hWYWx1ZSA9IF91c2VTdGF0ZTZbMF0sXG4gICAgICAgIHNldElubmVyU2VhcmNoVmFsdWUgPSBfdXNlU3RhdGU2WzFdO1xuXG4gICAgdmFyIG1lcmdlZFNlYXJjaFZhbHVlID0gaW5uZXJTZWFyY2hWYWx1ZTtcblxuICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnICYmIG1lcmdlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1lcmdlZFNlYXJjaFZhbHVlID0gbWVyZ2VkVmFsdWU7XG4gICAgfSBlbHNlIGlmIChzZWFyY2hWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXJnZWRTZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRWYWx1ZSkge1xuICAgICAgbWVyZ2VkU2VhcmNoVmFsdWUgPSBpbnB1dFZhbHVlO1xuICAgIH1cblxuICAgIHZhciBtZXJnZWRPcHRpb25zID0gKDAsIFJlYWN0LnVzZU1lbW8pKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuZXdPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgaWYgKG5ld09wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdPcHRpb25zID0gY29udmVydENoaWxkcmVuVG9EYXRhKGNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogYHRhZ3NgIHNob3VsZCBmaWxsIHVuLWxpc3QgaXRlbS5cbiAgICAgICAqIFRoaXMgaXMgbm90IGNvb2wgaGVyZSBzaW5jZSBUcmVlU2VsZWN0IGRvIG5vdCBuZWVkIHRoaXNcbiAgICAgICAqL1xuXG5cbiAgICAgIGlmIChtb2RlID09PSAndGFncycgJiYgZmlsbE9wdGlvbnNXaXRoTWlzc2luZ1ZhbHVlKSB7XG4gICAgICAgIG5ld09wdGlvbnMgPSBmaWxsT3B0aW9uc1dpdGhNaXNzaW5nVmFsdWUobmV3T3B0aW9ucywgbWVyZ2VkVmFsdWUsIG1lcmdlZE9wdGlvbkxhYmVsUHJvcCwgbGFiZWxJblZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld09wdGlvbnMgfHwgW107XG4gICAgfSwgW29wdGlvbnMsIGNoaWxkcmVuLCBtb2RlLCBtZXJnZWRWYWx1ZV0pO1xuICAgIHZhciBtZXJnZWRGbGF0dGVuT3B0aW9ucyA9ICgwLCBSZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmxhdHRlbk9wdGlvbnMobWVyZ2VkT3B0aW9ucywgcHJvcHMpO1xuICAgIH0sIFttZXJnZWRPcHRpb25zXSk7XG4gICAgdmFyIGdldFZhbHVlT3B0aW9uID0gKDAsIF91c2VDYWNoZU9wdGlvbnMuZGVmYXVsdCkobWVyZ2VkUmF3VmFsdWUsIG1lcmdlZEZsYXR0ZW5PcHRpb25zKTsgLy8gRGlzcGxheSBvcHRpb25zIGZvciBPcHRpb25MaXN0XG5cbiAgICB2YXIgZGlzcGxheU9wdGlvbnMgPSAoMCwgUmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFtZXJnZWRTZWFyY2hWYWx1ZSB8fCAhbWVyZ2VkU2hvd1NlYXJjaCkge1xuICAgICAgICByZXR1cm4gKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkobWVyZ2VkT3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJPcHRpb25zKG1lcmdlZFNlYXJjaFZhbHVlLCBtZXJnZWRPcHRpb25zLCB7XG4gICAgICAgIG9wdGlvbkZpbHRlclByb3A6IG9wdGlvbkZpbHRlclByb3AsXG4gICAgICAgIGZpbHRlck9wdGlvbjogbW9kZSA9PT0gJ2NvbWJvYm94JyAmJiBmaWx0ZXJPcHRpb24gPT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSA6IGZpbHRlck9wdGlvblxuICAgICAgfSk7XG5cbiAgICAgIGlmIChtb2RlID09PSAndGFncycgJiYgZmlsdGVyZWRPcHRpb25zLmV2ZXJ5KGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgICAgcmV0dXJuIG9wdFtvcHRpb25GaWx0ZXJQcm9wXSAhPT0gbWVyZ2VkU2VhcmNoVmFsdWU7XG4gICAgICB9KSkge1xuICAgICAgICBmaWx0ZXJlZE9wdGlvbnMudW5zaGlmdCh7XG4gICAgICAgICAgdmFsdWU6IG1lcmdlZFNlYXJjaFZhbHVlLFxuICAgICAgICAgIGxhYmVsOiBtZXJnZWRTZWFyY2hWYWx1ZSxcbiAgICAgICAgICBrZXk6ICdfX1JDX1NFTEVDVF9UQUdfUExBQ0VIT0xERVJfXydcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZE9wdGlvbnM7XG4gICAgfSwgW21lcmdlZE9wdGlvbnMsIG1lcmdlZFNlYXJjaFZhbHVlLCBtb2RlLCBtZXJnZWRTaG93U2VhcmNoXSk7XG4gICAgdmFyIGRpc3BsYXlGbGF0dGVuT3B0aW9ucyA9ICgwLCBSZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmxhdHRlbk9wdGlvbnMoZGlzcGxheU9wdGlvbnMsIHByb3BzKTtcbiAgICB9LCBbZGlzcGxheU9wdGlvbnNdKTtcbiAgICAoMCwgUmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobGlzdFJlZi5jdXJyZW50ICYmIGxpc3RSZWYuY3VycmVudC5zY3JvbGxUbykge1xuICAgICAgICBsaXN0UmVmLmN1cnJlbnQuc2Nyb2xsVG8oMCk7XG4gICAgICB9XG4gICAgfSwgW21lcmdlZFNlYXJjaFZhbHVlXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0b3IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgdmFyIGRpc3BsYXlWYWx1ZXMgPSAoMCwgUmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRtcFZhbHVlcyA9IG1lcmdlZFJhd1ZhbHVlLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHZhciB2YWx1ZU9wdGlvbnMgPSBnZXRWYWx1ZU9wdGlvbihbdmFsXSk7XG4gICAgICAgIHZhciBkaXNwbGF5VmFsdWUgPSBnZXRMYWJlbGVkVmFsdWUodmFsLCB7XG4gICAgICAgICAgb3B0aW9uczogdmFsdWVPcHRpb25zLFxuICAgICAgICAgIHByZXZWYWx1ZTogbWVyZ2VkVmFsdWUsXG4gICAgICAgICAgbGFiZWxJblZhbHVlOiBtZXJnZWRMYWJlbEluVmFsdWUsXG4gICAgICAgICAgb3B0aW9uTGFiZWxQcm9wOiBtZXJnZWRPcHRpb25MYWJlbFByb3BcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBkaXNwbGF5VmFsdWUpLCB7fSwge1xuICAgICAgICAgIGRpc2FibGVkOiBpc1ZhbHVlRGlzYWJsZWQodmFsLCB2YWx1ZU9wdGlvbnMpXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghbW9kZSAmJiB0bXBWYWx1ZXMubGVuZ3RoID09PSAxICYmIHRtcFZhbHVlc1swXS52YWx1ZSA9PT0gbnVsbCAmJiB0bXBWYWx1ZXNbMF0ubGFiZWwgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG1wVmFsdWVzO1xuICAgIH0sIFttZXJnZWRWYWx1ZSwgbWVyZ2VkT3B0aW9ucywgbW9kZV0pOyAvLyBQb2x5ZmlsbCB3aXRoIGNhY2hlIGxhYmVsXG5cbiAgICBkaXNwbGF5VmFsdWVzID0gKDAsIF91c2VDYWNoZURpc3BsYXlWYWx1ZS5kZWZhdWx0KShkaXNwbGF5VmFsdWVzKTtcblxuICAgIHZhciB0cmlnZ2VyU2VsZWN0ID0gZnVuY3Rpb24gdHJpZ2dlclNlbGVjdChuZXdWYWx1ZSwgaXNTZWxlY3QsIHNvdXJjZSkge1xuICAgICAgdmFyIG5ld1ZhbHVlT3B0aW9uID0gZ2V0VmFsdWVPcHRpb24oW25ld1ZhbHVlXSk7XG4gICAgICB2YXIgb3V0T3B0aW9uID0gZmluZFZhbHVlT3B0aW9uKFtuZXdWYWx1ZV0sIG5ld1ZhbHVlT3B0aW9uKVswXTtcblxuICAgICAgaWYgKCFpbnRlcm5hbFByb3BzLnNraXBUcmlnZ2VyU2VsZWN0KSB7XG4gICAgICAgIC8vIFNraXAgdHJpZ2dlciBgb25TZWxlY3RgIG9yIGBvbkRlc2VsZWN0YCBpZiBjb25maWd1cmVkXG4gICAgICAgIHZhciBzZWxlY3RWYWx1ZSA9IG1lcmdlZExhYmVsSW5WYWx1ZSA/IGdldExhYmVsZWRWYWx1ZShuZXdWYWx1ZSwge1xuICAgICAgICAgIG9wdGlvbnM6IG5ld1ZhbHVlT3B0aW9uLFxuICAgICAgICAgIHByZXZWYWx1ZTogbWVyZ2VkVmFsdWUsXG4gICAgICAgICAgbGFiZWxJblZhbHVlOiBtZXJnZWRMYWJlbEluVmFsdWUsXG4gICAgICAgICAgb3B0aW9uTGFiZWxQcm9wOiBtZXJnZWRPcHRpb25MYWJlbFByb3BcbiAgICAgICAgfSkgOiBuZXdWYWx1ZTtcblxuICAgICAgICBpZiAoaXNTZWxlY3QgJiYgb25TZWxlY3QpIHtcbiAgICAgICAgICBvblNlbGVjdChzZWxlY3RWYWx1ZSwgb3V0T3B0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNTZWxlY3QgJiYgb25EZXNlbGVjdCkge1xuICAgICAgICAgIG9uRGVzZWxlY3Qoc2VsZWN0VmFsdWUsIG91dE9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVHJpZ2dlciBpbnRlcm5hbCBldmVudFxuXG5cbiAgICAgIGlmICh1c2VJbnRlcm5hbFByb3BzKSB7XG4gICAgICAgIGlmIChpc1NlbGVjdCAmJiBpbnRlcm5hbFByb3BzLm9uUmF3U2VsZWN0KSB7XG4gICAgICAgICAgaW50ZXJuYWxQcm9wcy5vblJhd1NlbGVjdChuZXdWYWx1ZSwgb3V0T3B0aW9uLCBzb3VyY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdCAmJiBpbnRlcm5hbFByb3BzLm9uUmF3RGVzZWxlY3QpIHtcbiAgICAgICAgICBpbnRlcm5hbFByb3BzLm9uUmF3RGVzZWxlY3QobmV3VmFsdWUsIG91dE9wdGlvbiwgc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07IC8vIFdlIG5lZWQgY2FjaGUgb3B0aW9ucyBoZXJlIGluIGNhc2UgdXNlciB1cGRhdGUgdGhlIG9wdGlvbiBsaXN0XG5cblxuICAgIHZhciBfdXNlU3RhdGU3ID0gKDAsIFJlYWN0LnVzZVN0YXRlKShbXSksXG4gICAgICAgIF91c2VTdGF0ZTggPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTcsIDIpLFxuICAgICAgICBwcmV2VmFsdWVPcHRpb25zID0gX3VzZVN0YXRlOFswXSxcbiAgICAgICAgc2V0UHJldlZhbHVlT3B0aW9ucyA9IF91c2VTdGF0ZThbMV07XG5cbiAgICB2YXIgdHJpZ2dlckNoYW5nZSA9IGZ1bmN0aW9uIHRyaWdnZXJDaGFuZ2UobmV3UmF3VmFsdWVzKSB7XG4gICAgICBpZiAodXNlSW50ZXJuYWxQcm9wcyAmJiBpbnRlcm5hbFByb3BzLnNraXBUcmlnZ2VyQ2hhbmdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld1Jhd1ZhbHVlc09wdGlvbnMgPSBnZXRWYWx1ZU9wdGlvbihuZXdSYXdWYWx1ZXMpO1xuICAgICAgdmFyIG91dFZhbHVlcyA9ICgwLCBfY29tbW9uVXRpbC50b091dGVyVmFsdWVzKShBcnJheS5mcm9tKG5ld1Jhd1ZhbHVlcyksIHtcbiAgICAgICAgbGFiZWxJblZhbHVlOiBtZXJnZWRMYWJlbEluVmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IG5ld1Jhd1ZhbHVlc09wdGlvbnMsXG4gICAgICAgIGdldExhYmVsZWRWYWx1ZTogZ2V0TGFiZWxlZFZhbHVlLFxuICAgICAgICBwcmV2VmFsdWU6IG1lcmdlZFZhbHVlLFxuICAgICAgICBvcHRpb25MYWJlbFByb3A6IG1lcmdlZE9wdGlvbkxhYmVsUHJvcFxuICAgICAgfSk7XG4gICAgICB2YXIgb3V0VmFsdWUgPSBpc011bHRpcGxlID8gb3V0VmFsdWVzIDogb3V0VmFsdWVzWzBdOyAvLyBTa2lwIHRyaWdnZXIgaWYgcHJldiAmIGN1cnJlbnQgdmFsdWUgaXMgYm90aCBlbXB0eVxuXG4gICAgICBpZiAob25DaGFuZ2UgJiYgKG1lcmdlZFJhd1ZhbHVlLmxlbmd0aCAhPT0gMCB8fCBvdXRWYWx1ZXMubGVuZ3RoICE9PSAwKSkge1xuICAgICAgICB2YXIgb3V0T3B0aW9ucyA9IGZpbmRWYWx1ZU9wdGlvbihuZXdSYXdWYWx1ZXMsIG5ld1Jhd1ZhbHVlc09wdGlvbnMsIHtcbiAgICAgICAgICBwcmV2VmFsdWVPcHRpb25zOiBwcmV2VmFsdWVPcHRpb25zXG4gICAgICAgIH0pOyAvLyBXZSB3aWxsIGNhY2hlIG9wdGlvbiBpbiBjYXNlIGl0IHJlbW92ZWQgYnkgYWpheFxuXG4gICAgICAgIHNldFByZXZWYWx1ZU9wdGlvbnMob3V0T3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbiwgaW5kZXgpIHtcbiAgICAgICAgICB2YXIgY2xvbmUgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIG9wdGlvbik7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb25lLCAnX0lOVEVSTkFMX09QVElPTl9WQUxVRV8nLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ld1Jhd1ZhbHVlc1tpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgICB9KSk7XG4gICAgICAgIG9uQ2hhbmdlKG91dFZhbHVlLCBpc011bHRpcGxlID8gb3V0T3B0aW9ucyA6IG91dE9wdGlvbnNbMF0pO1xuICAgICAgfVxuXG4gICAgICBzZXRNZXJnZWRWYWx1ZShvdXRWYWx1ZSk7XG4gICAgfTtcblxuICAgIHZhciBvbkludGVybmFsU2VsZWN0ID0gZnVuY3Rpb24gb25JbnRlcm5hbFNlbGVjdChuZXdWYWx1ZSwgX3JlZikge1xuICAgICAgdmFyIHNlbGVjdGVkID0gX3JlZi5zZWxlY3RlZCxcbiAgICAgICAgICBzb3VyY2UgPSBfcmVmLnNvdXJjZTtcblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld1Jhd1ZhbHVlO1xuXG4gICAgICBpZiAoaXNNdWx0aXBsZSkge1xuICAgICAgICBuZXdSYXdWYWx1ZSA9IG5ldyBTZXQobWVyZ2VkUmF3VmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgIG5ld1Jhd1ZhbHVlLmFkZChuZXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3UmF3VmFsdWUuZGVsZXRlKG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3UmF3VmFsdWUgPSBuZXcgU2V0KCk7XG4gICAgICAgIG5ld1Jhd1ZhbHVlLmFkZChuZXdWYWx1ZSk7XG4gICAgICB9IC8vIE11bHRpcGxlIGFsd2F5cyB0cmlnZ2VyIGNoYW5nZSBhbmQgc2luZ2xlIHNob3VsZCBjaGFuZ2UgaWYgdmFsdWUgY2hhbmdlZFxuXG5cbiAgICAgIGlmIChpc011bHRpcGxlIHx8ICFpc011bHRpcGxlICYmIEFycmF5LmZyb20obWVyZ2VkUmF3VmFsdWUpWzBdICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICB0cmlnZ2VyQ2hhbmdlKEFycmF5LmZyb20obmV3UmF3VmFsdWUpKTtcbiAgICAgIH0gLy8gVHJpZ2dlciBgb25TZWxlY3RgLiBTaW5nbGUgbW9kZSBhbHdheXMgdHJpZ2dlciBzZWxlY3RcblxuXG4gICAgICB0cmlnZ2VyU2VsZWN0KG5ld1ZhbHVlLCAhaXNNdWx0aXBsZSB8fCBzZWxlY3RlZCwgc291cmNlKTsgLy8gQ2xlYW4gc2VhcmNoIHZhbHVlIGlmIHNpbmdsZSBvciBjb25maWd1cmVkXG5cbiAgICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICAgIHNldElubmVyU2VhcmNoVmFsdWUoU3RyaW5nKG5ld1ZhbHVlKSk7XG4gICAgICAgIHNldEFjdGl2ZVZhbHVlKCcnKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzTXVsdGlwbGUgfHwgYXV0b0NsZWFyU2VhcmNoVmFsdWUpIHtcbiAgICAgICAgc2V0SW5uZXJTZWFyY2hWYWx1ZSgnJyk7XG4gICAgICAgIHNldEFjdGl2ZVZhbHVlKCcnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIG9uSW50ZXJuYWxPcHRpb25TZWxlY3QgPSBmdW5jdGlvbiBvbkludGVybmFsT3B0aW9uU2VsZWN0KG5ld1ZhbHVlLCBpbmZvKSB7XG4gICAgICBvbkludGVybmFsU2VsZWN0KG5ld1ZhbHVlLCAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBpbmZvKSwge30sIHtcbiAgICAgICAgc291cmNlOiAnb3B0aW9uJ1xuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICB2YXIgb25JbnRlcm5hbFNlbGVjdGlvblNlbGVjdCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWxlY3Rpb25TZWxlY3QobmV3VmFsdWUsIGluZm8pIHtcbiAgICAgIG9uSW50ZXJuYWxTZWxlY3QobmV3VmFsdWUsICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGluZm8pLCB7fSwge1xuICAgICAgICBzb3VyY2U6ICdzZWxlY3Rpb24nXG4gICAgICB9KSk7XG4gICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5wdXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gT25seSB3b3JrcyBpbiBgY29tYm9ib3hgXG5cblxuICAgIHZhciBjdXN0b21pemVJbnB1dEVsZW1lbnQgPSBtb2RlID09PSAnY29tYm9ib3gnICYmIGdldElucHV0RWxlbWVudCAmJiBnZXRJbnB1dEVsZW1lbnQoKSB8fCBudWxsOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHZhciBfdXNlTWVyZ2VkU3RhdGUzID0gKDAsIF91c2VNZXJnZWRTdGF0ZTUuZGVmYXVsdCkodW5kZWZpbmVkLCB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRPcGVuLFxuICAgICAgdmFsdWU6IG9wZW5cbiAgICB9KSxcbiAgICAgICAgX3VzZU1lcmdlZFN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZU1lcmdlZFN0YXRlMywgMiksXG4gICAgICAgIGlubmVyT3BlbiA9IF91c2VNZXJnZWRTdGF0ZTRbMF0sXG4gICAgICAgIHNldElubmVyT3BlbiA9IF91c2VNZXJnZWRTdGF0ZTRbMV07XG5cbiAgICB2YXIgbWVyZ2VkT3BlbiA9IGlubmVyT3BlbjsgLy8gTm90IHRyaWdnZXIgYG9wZW5gIGluIGBjb21ib2JveGAgd2hlbiBgbm90Rm91bmRDb250ZW50YCBpcyBlbXB0eVxuXG4gICAgdmFyIGVtcHR5TGlzdENvbnRlbnQgPSAhbm90Rm91bmRDb250ZW50ICYmICFkaXNwbGF5T3B0aW9ucy5sZW5ndGg7XG5cbiAgICBpZiAoZGlzYWJsZWQgfHwgZW1wdHlMaXN0Q29udGVudCAmJiBtZXJnZWRPcGVuICYmIG1vZGUgPT09ICdjb21ib2JveCcpIHtcbiAgICAgIG1lcmdlZE9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdHJpZ2dlck9wZW4gPSBlbXB0eUxpc3RDb250ZW50ID8gZmFsc2UgOiBtZXJnZWRPcGVuO1xuXG4gICAgdmFyIG9uVG9nZ2xlT3BlbiA9IGZ1bmN0aW9uIG9uVG9nZ2xlT3BlbihuZXdPcGVuKSB7XG4gICAgICB2YXIgbmV4dE9wZW4gPSBuZXdPcGVuICE9PSB1bmRlZmluZWQgPyBuZXdPcGVuIDogIW1lcmdlZE9wZW47XG5cbiAgICAgIGlmIChpbm5lck9wZW4gIT09IG5leHRPcGVuICYmICFkaXNhYmxlZCkge1xuICAgICAgICBzZXRJbm5lck9wZW4obmV4dE9wZW4pO1xuXG4gICAgICAgIGlmIChvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSkge1xuICAgICAgICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlKG5leHRPcGVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAoMCwgX3VzZVNlbGVjdFRyaWdnZXJDb250cm9sLmRlZmF1bHQpKFtjb250YWluZXJSZWYuY3VycmVudCwgdHJpZ2dlclJlZi5jdXJyZW50ICYmIHRyaWdnZXJSZWYuY3VycmVudC5nZXRQb3B1cEVsZW1lbnQoKV0sIHRyaWdnZXJPcGVuLCBvblRvZ2dsZU9wZW4pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHZhciB0cmlnZ2VyU2VhcmNoID0gZnVuY3Rpb24gdHJpZ2dlclNlYXJjaChzZWFyY2hUZXh0LCBmcm9tVHlwaW5nLCBpc0NvbXBvc2l0aW5nKSB7XG4gICAgICB2YXIgcmV0ID0gdHJ1ZTtcbiAgICAgIHZhciBuZXdTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICAgIHNldEFjdGl2ZVZhbHVlKG51bGwpOyAvLyBDaGVjayBpZiBtYXRjaCB0aGUgYHRva2VuU2VwYXJhdG9yc2BcblxuICAgICAgdmFyIHBhdGNoTGFiZWxzID0gaXNDb21wb3NpdGluZyA/IG51bGwgOiAoMCwgX3ZhbHVlVXRpbC5nZXRTZXBhcmF0ZWRDb250ZW50KShzZWFyY2hUZXh0LCB0b2tlblNlcGFyYXRvcnMpO1xuICAgICAgdmFyIHBhdGNoUmF3VmFsdWVzID0gcGF0Y2hMYWJlbHM7XG5cbiAgICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICAgIC8vIE9ubHkgdHlwaW5nIHdpbGwgdHJpZ2dlciBvbkNoYW5nZVxuICAgICAgICBpZiAoZnJvbVR5cGluZykge1xuICAgICAgICAgIHRyaWdnZXJDaGFuZ2UoW25ld1NlYXJjaFRleHRdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXRjaExhYmVscykge1xuICAgICAgICBuZXdTZWFyY2hUZXh0ID0gJyc7XG5cbiAgICAgICAgaWYgKG1vZGUgIT09ICd0YWdzJykge1xuICAgICAgICAgIHBhdGNoUmF3VmFsdWVzID0gcGF0Y2hMYWJlbHMubWFwKGZ1bmN0aW9uIChsYWJlbCkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBtZXJnZWRGbGF0dGVuT3B0aW9ucy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgICB2YXIgZGF0YSA9IF9yZWYyLmRhdGE7XG4gICAgICAgICAgICAgIHJldHVybiBkYXRhW21lcmdlZE9wdGlvbkxhYmVsUHJvcF0gPT09IGxhYmVsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbSA/IGl0ZW0uZGF0YS52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwgIT09IG51bGw7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV3UmF3VmFsdWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShtZXJnZWRSYXdWYWx1ZSksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHBhdGNoUmF3VmFsdWVzKSkpKTtcbiAgICAgICAgdHJpZ2dlckNoYW5nZShuZXdSYXdWYWx1ZXMpO1xuICAgICAgICBuZXdSYXdWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAobmV3UmF3VmFsdWUpIHtcbiAgICAgICAgICB0cmlnZ2VyU2VsZWN0KG5ld1Jhd1ZhbHVlLCB0cnVlLCAnaW5wdXQnKTtcbiAgICAgICAgfSk7IC8vIFNob3VsZCBjbG9zZSB3aGVuIHBhc3RlIGZpbmlzaFxuXG4gICAgICAgIG9uVG9nZ2xlT3BlbihmYWxzZSk7IC8vIFRlbGwgU2VsZWN0b3IgdGhhdCBicmVhayBuZXh0IGFjdGlvbnNcblxuICAgICAgICByZXQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgc2V0SW5uZXJTZWFyY2hWYWx1ZShuZXdTZWFyY2hUZXh0KTtcblxuICAgICAgaWYgKG9uU2VhcmNoICYmIG1lcmdlZFNlYXJjaFZhbHVlICE9PSBuZXdTZWFyY2hUZXh0KSB7XG4gICAgICAgIG9uU2VhcmNoKG5ld1NlYXJjaFRleHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH07IC8vIE9ubHkgdHJpZ2dlcmVkIHdoZW4gbWVudSBpcyBjbG9zZWQgJiBtb2RlIGlzIHRhZ3NcbiAgICAvLyBJZiBtZW51IGlzIG9wZW4sIE9wdGlvbkxpc3Qgd2lsbCB0YWtlIGNoYXJnZVxuICAgIC8vIElmIG1vZGUgaXNuJ3QgdGFncywgcHJlc3MgZW50ZXIgaXMgbm90IG1lYW5pbmdmdWwgd2hlbiB5b3UgY2FuJ3Qgc2VlIGFueSBvcHRpb25cblxuXG4gICAgdmFyIG9uU2VhcmNoU3VibWl0ID0gZnVuY3Rpb24gb25TZWFyY2hTdWJtaXQoc2VhcmNoVGV4dCkge1xuICAgICAgdmFyIG5ld1Jhd1ZhbHVlcyA9IEFycmF5LmZyb20obmV3IFNldChbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkobWVyZ2VkUmF3VmFsdWUpLCBbc2VhcmNoVGV4dF0pKSk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlKG5ld1Jhd1ZhbHVlcyk7XG4gICAgICBuZXdSYXdWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAobmV3UmF3VmFsdWUpIHtcbiAgICAgICAgdHJpZ2dlclNlbGVjdChuZXdSYXdWYWx1ZSwgdHJ1ZSwgJ2lucHV0Jyk7XG4gICAgICB9KTtcbiAgICAgIHNldElubmVyU2VhcmNoVmFsdWUoJycpO1xuICAgIH07IC8vIENsb3NlIGRyb3Bkb3duIHdoZW4gZGlzYWJsZWQgY2hhbmdlXG5cblxuICAgICgwLCBSZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpbm5lck9wZW4gJiYgISFkaXNhYmxlZCkge1xuICAgICAgICBzZXRJbm5lck9wZW4oZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIFtkaXNhYmxlZF0pOyAvLyBDbG9zZSB3aWxsIGNsZWFuIHVwIHNpbmdsZSBtb2RlIHNlYXJjaCB0ZXh0XG5cbiAgICAoMCwgUmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIW1lcmdlZE9wZW4gJiYgIWlzTXVsdGlwbGUgJiYgbW9kZSAhPT0gJ2NvbWJvYm94Jykge1xuICAgICAgICB0cmlnZ2VyU2VhcmNoKCcnLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIFttZXJnZWRPcGVuXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogV2UgcmVjb3JkIGlucHV0IHZhbHVlIGhlcmUgdG8gY2hlY2sgaWYgY2FuIHByZXNzIHRvIGNsZWFuIHVwIGJ5IGJhY2tzcGFjZVxuICAgICAqIC0gbnVsbDogS2V5IGlzIG5vdCBkb3duLCB0aGlzIGlzIHJlc2V0IGJ5IGtleSB1cFxuICAgICAqIC0gdHJ1ZTogU2VhcmNoIHRleHQgaXMgZW1wdHkgd2hlbiBmaXJzdCB0aW1lIGJhY2tzcGFjZSBkb3duXG4gICAgICogLSBmYWxzZTogU2VhcmNoIHRleHQgaXMgbm90IGVtcHR5IHdoZW4gZmlyc3QgdGltZSBiYWNrc3BhY2UgZG93blxuICAgICAqL1xuXG4gICAgdmFyIF91c2VMb2NrID0gKDAsIF91c2VMb2NrMy5kZWZhdWx0KSgpLFxuICAgICAgICBfdXNlTG9jazIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VMb2NrLCAyKSxcbiAgICAgICAgZ2V0Q2xlYXJMb2NrID0gX3VzZUxvY2syWzBdLFxuICAgICAgICBzZXRDbGVhckxvY2sgPSBfdXNlTG9jazJbMV07IC8vIEtleURvd25cblxuXG4gICAgdmFyIG9uSW50ZXJuYWxLZXlEb3duID0gZnVuY3Rpb24gb25JbnRlcm5hbEtleURvd24oZXZlbnQpIHtcbiAgICAgIHZhciBjbGVhckxvY2sgPSBnZXRDbGVhckxvY2soKTtcbiAgICAgIHZhciB3aGljaCA9IGV2ZW50LndoaWNoOyAvLyBXZSBvbmx5IG1hbmFnZSBvcGVuIHN0YXRlIGhlcmUsIGNsb3NlIGxvZ2ljIHNob3VsZCBoYW5kbGUgYnkgbGlzdCBjb21wb25lbnRcblxuICAgICAgaWYgKCFtZXJnZWRPcGVuICYmIHdoaWNoID09PSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSKSB7XG4gICAgICAgIG9uVG9nZ2xlT3Blbih0cnVlKTtcbiAgICAgIH1cblxuICAgICAgc2V0Q2xlYXJMb2NrKCEhbWVyZ2VkU2VhcmNoVmFsdWUpOyAvLyBSZW1vdmUgdmFsdWUgYnkgYGJhY2tzcGFjZWBcblxuICAgICAgaWYgKHdoaWNoID09PSBfS2V5Q29kZS5kZWZhdWx0LkJBQ0tTUEFDRSAmJiAhY2xlYXJMb2NrICYmIGlzTXVsdGlwbGUgJiYgIW1lcmdlZFNlYXJjaFZhbHVlICYmIG1lcmdlZFJhd1ZhbHVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgcmVtb3ZlSW5mbyA9ICgwLCBfY29tbW9uVXRpbC5yZW1vdmVMYXN0RW5hYmxlZFZhbHVlKShkaXNwbGF5VmFsdWVzLCBtZXJnZWRSYXdWYWx1ZSk7XG5cbiAgICAgICAgaWYgKHJlbW92ZUluZm8ucmVtb3ZlZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdHJpZ2dlckNoYW5nZShyZW1vdmVJbmZvLnZhbHVlcyk7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChyZW1vdmVJbmZvLnJlbW92ZWRWYWx1ZSwgZmFsc2UsICdpbnB1dCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgcmVzdFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXJnZWRPcGVuICYmIGxpc3RSZWYuY3VycmVudCkge1xuICAgICAgICB2YXIgX2xpc3RSZWYkY3VycmVudDtcblxuICAgICAgICAoX2xpc3RSZWYkY3VycmVudCA9IGxpc3RSZWYuY3VycmVudCkub25LZXlEb3duLmFwcGx5KF9saXN0UmVmJGN1cnJlbnQsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uS2V5RG93bikge1xuICAgICAgICBvbktleURvd24uYXBwbHkodm9pZCAwLCBbZXZlbnRdLmNvbmNhdChyZXN0KSk7XG4gICAgICB9XG4gICAgfTsgLy8gS2V5VXBcblxuXG4gICAgdmFyIG9uSW50ZXJuYWxLZXlVcCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxLZXlVcChldmVudCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgcmVzdFtfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lcmdlZE9wZW4gJiYgbGlzdFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50MjtcblxuICAgICAgICAoX2xpc3RSZWYkY3VycmVudDIgPSBsaXN0UmVmLmN1cnJlbnQpLm9uS2V5VXAuYXBwbHkoX2xpc3RSZWYkY3VycmVudDIsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uS2V5VXApIHtcbiAgICAgICAgb25LZXlVcC5hcHBseSh2b2lkIDAsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgICAgIH1cbiAgICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBGb2N1cyAvIEJsdXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIC8qKiBSZWNvcmQgcmVhbCBmb2N1cyBzdGF0dXMgKi9cblxuXG4gICAgdmFyIGZvY3VzUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoZmFsc2UpO1xuXG4gICAgdmFyIG9uQ29udGFpbmVyRm9jdXMgPSBmdW5jdGlvbiBvbkNvbnRhaW5lckZvY3VzKCkge1xuICAgICAgc2V0TW9ja0ZvY3VzZWQodHJ1ZSk7XG5cbiAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKG9uRm9jdXMgJiYgIWZvY3VzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZvY3VzLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfSAvLyBgc2hvd0FjdGlvbmAgc2hvdWxkIGhhbmRsZSBgZm9jdXNgIGlmIHNldFxuXG5cbiAgICAgICAgaWYgKHNob3dBY3Rpb24uaW5jbHVkZXMoJ2ZvY3VzJykpIHtcbiAgICAgICAgICBvblRvZ2dsZU9wZW4odHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfTtcblxuICAgIHZhciBvbkNvbnRhaW5lckJsdXIgPSBmdW5jdGlvbiBvbkNvbnRhaW5lckJsdXIoKSB7XG4gICAgICBzZXRNb2NrRm9jdXNlZChmYWxzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIG9uVG9nZ2xlT3BlbihmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lcmdlZFNlYXJjaFZhbHVlKSB7XG4gICAgICAgIC8vIGB0YWdzYCBtb2RlIHNob3VsZCBtb3ZlIGBzZWFyY2hWYWx1ZWAgaW50byB2YWx1ZXNcbiAgICAgICAgaWYgKG1vZGUgPT09ICd0YWdzJykge1xuICAgICAgICAgIHRyaWdnZXJTZWFyY2goJycsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgdHJpZ2dlckNoYW5nZShBcnJheS5mcm9tKG5ldyBTZXQoW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG1lcmdlZFJhd1ZhbHVlKSwgW21lcmdlZFNlYXJjaFZhbHVlXSkpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAgIC8vIGBtdWx0aXBsZWAgbW9kZSBvbmx5IGNsZWFuIHRoZSBzZWFyY2ggdmFsdWUgYnV0IG5vdCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgICAgc2V0SW5uZXJTZWFyY2hWYWx1ZSgnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9uQmx1cikge1xuICAgICAgICBvbkJsdXIuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgYWN0aXZlVGltZW91dElkcyA9IFtdO1xuICAgICgwLCBSZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFjdGl2ZVRpbWVvdXRJZHMuZm9yRWFjaChmdW5jdGlvbiAodGltZW91dElkKSB7XG4gICAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZlVGltZW91dElkcy5zcGxpY2UoMCwgYWN0aXZlVGltZW91dElkcy5sZW5ndGgpO1xuICAgICAgfTtcbiAgICB9LCBbXSk7XG5cbiAgICB2YXIgb25JbnRlcm5hbE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxNb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICB2YXIgcG9wdXBFbGVtZW50ID0gdHJpZ2dlclJlZi5jdXJyZW50ICYmIHRyaWdnZXJSZWYuY3VycmVudC5nZXRQb3B1cEVsZW1lbnQoKTsgLy8gV2Ugc2hvdWxkIGdpdmUgZm9jdXMgYmFjayB0byBzZWxlY3RvciBpZiBjbGlja2VkIGl0ZW0gaXMgbm90IGZvY3VzYWJsZVxuXG4gICAgICBpZiAocG9wdXBFbGVtZW50ICYmIHBvcHVwRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgIHZhciB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgaW5kZXggPSBhY3RpdmVUaW1lb3V0SWRzLmluZGV4T2YodGltZW91dElkKTtcblxuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGFjdGl2ZVRpbWVvdXRJZHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYW5jZWxTZXRNb2NrRm9jdXNlZCgpO1xuXG4gICAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHNlbGVjdG9yUmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBhY3RpdmVUaW1lb3V0SWRzLnB1c2godGltZW91dElkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uTW91c2VEb3duKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdEFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMgPiAxID8gX2xlbjMgLSAxIDogMCksIF9rZXkzID0gMTsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICAgIHJlc3RBcmdzW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgICAgICB9XG5cbiAgICAgICAgb25Nb3VzZURvd24uYXBwbHkodm9pZCAwLCBbZXZlbnRdLmNvbmNhdChyZXN0QXJncykpO1xuICAgICAgfVxuICAgIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQWNjZXNzaWJpbGl0eSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgICB2YXIgX3VzZVN0YXRlOSA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoMCksXG4gICAgICAgIF91c2VTdGF0ZTEwID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGU5LCAyKSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eUluZGV4ID0gX3VzZVN0YXRlMTBbMF0sXG4gICAgICAgIHNldEFjY2Vzc2liaWxpdHlJbmRleCA9IF91c2VTdGF0ZTEwWzFdO1xuXG4gICAgdmFyIG1lcmdlZERlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbiA9IGRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbiAhPT0gdW5kZWZpbmVkID8gZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uIDogbW9kZSAhPT0gJ2NvbWJvYm94JztcblxuICAgIHZhciBvbkFjdGl2ZVZhbHVlID0gZnVuY3Rpb24gb25BY3RpdmVWYWx1ZShhY3RpdmUsIGluZGV4KSB7XG4gICAgICB2YXIgX3JlZjMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9LFxuICAgICAgICAgIF9yZWYzJHNvdXJjZSA9IF9yZWYzLnNvdXJjZSxcbiAgICAgICAgICBzb3VyY2UgPSBfcmVmMyRzb3VyY2UgPT09IHZvaWQgMCA/ICdrZXlib2FyZCcgOiBfcmVmMyRzb3VyY2U7XG5cbiAgICAgIHNldEFjY2Vzc2liaWxpdHlJbmRleChpbmRleCk7XG5cbiAgICAgIGlmIChiYWNrZmlsbCAmJiBtb2RlID09PSAnY29tYm9ib3gnICYmIGFjdGl2ZSAhPT0gbnVsbCAmJiBzb3VyY2UgPT09ICdrZXlib2FyZCcpIHtcbiAgICAgICAgc2V0QWN0aXZlVmFsdWUoU3RyaW5nKGFjdGl2ZSkpO1xuICAgICAgfVxuICAgIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBvcHVwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgICB2YXIgX3VzZVN0YXRlMTEgPSAoMCwgUmVhY3QudXNlU3RhdGUpKG51bGwpLFxuICAgICAgICBfdXNlU3RhdGUxMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlMTEsIDIpLFxuICAgICAgICBjb250YWluZXJXaWR0aCA9IF91c2VTdGF0ZTEyWzBdLFxuICAgICAgICBzZXRDb250YWluZXJXaWR0aCA9IF91c2VTdGF0ZTEyWzFdO1xuXG4gICAgdmFyIF91c2VTdGF0ZTEzID0gKDAsIFJlYWN0LnVzZVN0YXRlKSh7fSksXG4gICAgICAgIF91c2VTdGF0ZTE0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUxMywgMiksXG4gICAgICAgIGZvcmNlVXBkYXRlID0gX3VzZVN0YXRlMTRbMV07IC8vIFdlIG5lZWQgZm9yY2UgdXBkYXRlIGhlcmUgc2luY2UgcG9wdXAgZG9tIGlzIHJlbmRlciBhc3luY1xuXG5cbiAgICBmdW5jdGlvbiBvblBvcHVwTW91c2VFbnRlcigpIHtcbiAgICAgIGZvcmNlVXBkYXRlKHt9KTtcbiAgICB9XG5cbiAgICAoMCwgX3VzZUxheW91dEVmZmVjdC5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodHJpZ2dlck9wZW4pIHtcbiAgICAgICAgdmFyIG5ld1dpZHRoID0gTWF0aC5jZWlsKGNvbnRhaW5lclJlZi5jdXJyZW50Lm9mZnNldFdpZHRoKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyV2lkdGggIT09IG5ld1dpZHRoKSB7XG4gICAgICAgICAgc2V0Q29udGFpbmVyV2lkdGgobmV3V2lkdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgW3RyaWdnZXJPcGVuXSk7XG4gICAgdmFyIHBvcHVwTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoT3B0aW9uTGlzdCwge1xuICAgICAgcmVmOiBsaXN0UmVmLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBpZDogbWVyZ2VkSWQsXG4gICAgICBvcGVuOiBtZXJnZWRPcGVuLFxuICAgICAgY2hpbGRyZW5Bc0RhdGE6ICFvcHRpb25zLFxuICAgICAgb3B0aW9uczogZGlzcGxheU9wdGlvbnMsXG4gICAgICBmbGF0dGVuT3B0aW9uczogZGlzcGxheUZsYXR0ZW5PcHRpb25zLFxuICAgICAgbXVsdGlwbGU6IGlzTXVsdGlwbGUsXG4gICAgICB2YWx1ZXM6IHJhd1ZhbHVlcyxcbiAgICAgIGhlaWdodDogbGlzdEhlaWdodCxcbiAgICAgIGl0ZW1IZWlnaHQ6IGxpc3RJdGVtSGVpZ2h0LFxuICAgICAgb25TZWxlY3Q6IG9uSW50ZXJuYWxPcHRpb25TZWxlY3QsXG4gICAgICBvblRvZ2dsZU9wZW46IG9uVG9nZ2xlT3BlbixcbiAgICAgIG9uQWN0aXZlVmFsdWU6IG9uQWN0aXZlVmFsdWUsXG4gICAgICBkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb246IG1lcmdlZERlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbixcbiAgICAgIG5vdEZvdW5kQ29udGVudDogbm90Rm91bmRDb250ZW50LFxuICAgICAgb25TY3JvbGw6IG9uUG9wdXBTY3JvbGwsXG4gICAgICBzZWFyY2hWYWx1ZTogbWVyZ2VkU2VhcmNoVmFsdWUsXG4gICAgICBtZW51SXRlbVNlbGVjdGVkSWNvbjogbWVudUl0ZW1TZWxlY3RlZEljb24sXG4gICAgICB2aXJ0dWFsOiB2aXJ0dWFsICE9PSBmYWxzZSAmJiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggIT09IGZhbHNlLFxuICAgICAgb25Nb3VzZUVudGVyOiBvblBvcHVwTW91c2VFbnRlclxuICAgIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDbGVhciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHZhciBjbGVhck5vZGU7XG5cbiAgICB2YXIgb25DbGVhck1vdXNlRG93biA9IGZ1bmN0aW9uIG9uQ2xlYXJNb3VzZURvd24oKSB7XG4gICAgICAvLyBUcmlnZ2VyIGludGVybmFsIGBvbkNsZWFyYCBldmVudFxuICAgICAgaWYgKHVzZUludGVybmFsUHJvcHMgJiYgaW50ZXJuYWxQcm9wcy5vbkNsZWFyKSB7XG4gICAgICAgIGludGVybmFsUHJvcHMub25DbGVhcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25DbGVhcikge1xuICAgICAgICBvbkNsZWFyKCk7XG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJDaGFuZ2UoW10pO1xuICAgICAgdHJpZ2dlclNlYXJjaCgnJywgZmFsc2UsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgaWYgKCFkaXNhYmxlZCAmJiBhbGxvd0NsZWFyICYmIChtZXJnZWRSYXdWYWx1ZS5sZW5ndGggfHwgbWVyZ2VkU2VhcmNoVmFsdWUpKSB7XG4gICAgICBjbGVhck5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9UcmFuc0J0bi5kZWZhdWx0LCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbGVhclwiKSxcbiAgICAgICAgb25Nb3VzZURvd246IG9uQ2xlYXJNb3VzZURvd24sXG4gICAgICAgIGN1c3RvbWl6ZUljb246IGNsZWFySWNvblxuICAgICAgfSwgXCJcXHhEN1wiKTtcbiAgICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFycm93ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgICB2YXIgbWVyZ2VkU2hvd0Fycm93ID0gc2hvd0Fycm93ICE9PSB1bmRlZmluZWQgPyBzaG93QXJyb3cgOiBsb2FkaW5nIHx8ICFpc011bHRpcGxlICYmIG1vZGUgIT09ICdjb21ib2JveCc7XG4gICAgdmFyIGFycm93Tm9kZTtcblxuICAgIGlmIChtZXJnZWRTaG93QXJyb3cpIHtcbiAgICAgIGFycm93Tm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1RyYW5zQnRuLmRlZmF1bHQsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvd1wiKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3ctbG9hZGluZ1wiKSwgbG9hZGluZykpLFxuICAgICAgICBjdXN0b21pemVJY29uOiBpbnB1dEljb24sXG4gICAgICAgIGN1c3RvbWl6ZUljb25Qcm9wczoge1xuICAgICAgICAgIGxvYWRpbmc6IGxvYWRpbmcsXG4gICAgICAgICAgc2VhcmNoVmFsdWU6IG1lcmdlZFNlYXJjaFZhbHVlLFxuICAgICAgICAgIG9wZW46IG1lcmdlZE9wZW4sXG4gICAgICAgICAgZm9jdXNlZDogbW9ja0ZvY3VzZWQsXG4gICAgICAgICAgc2hvd1NlYXJjaDogbWVyZ2VkU2hvd1NlYXJjaFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuaW5nUHJvcHMpIHtcbiAgICAgIHdhcm5pbmdQcm9wcyhwcm9wcyk7XG4gICAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gICAgdmFyIG1lcmdlZENsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9jdXNlZFwiKSwgbW9ja0ZvY3VzZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbXVsdGlwbGVcIiksIGlzTXVsdGlwbGUpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2luZ2xlXCIpLCAhaXNNdWx0aXBsZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hbGxvdy1jbGVhclwiKSwgYWxsb3dDbGVhciksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWFycm93XCIpLCBtZXJnZWRTaG93QXJyb3cpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmdcIiksIGxvYWRpbmcpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlblwiKSwgbWVyZ2VkT3BlbiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jdXN0b21pemUtaW5wdXRcIiksIGN1c3RvbWl6ZUlucHV0RWxlbWVudCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LXNlYXJjaFwiKSwgbWVyZ2VkU2hvd1NlYXJjaCksIF9jbGFzc05hbWVzMikpO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWVcbiAgICB9LCBkb21Qcm9wcywge1xuICAgICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgICBvbk1vdXNlRG93bjogb25JbnRlcm5hbE1vdXNlRG93bixcbiAgICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd24sXG4gICAgICBvbktleVVwOiBvbkludGVybmFsS2V5VXAsXG4gICAgICBvbkZvY3VzOiBvbkNvbnRhaW5lckZvY3VzLFxuICAgICAgb25CbHVyOiBvbkNvbnRhaW5lckJsdXJcbiAgICB9KSwgbW9ja0ZvY3VzZWQgJiYgIW1lcmdlZE9wZW4gJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgIG9wYWNpdHk6IDBcbiAgICAgIH0sXG4gICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiXG4gICAgfSwgXCJcIi5jb25jYXQobWVyZ2VkUmF3VmFsdWUuam9pbignLCAnKSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9TZWxlY3RUcmlnZ2VyLmRlZmF1bHQsIHtcbiAgICAgIHJlZjogdHJpZ2dlclJlZixcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgdmlzaWJsZTogdHJpZ2dlck9wZW4sXG4gICAgICBwb3B1cEVsZW1lbnQ6IHBvcHVwTm9kZSxcbiAgICAgIGNvbnRhaW5lcldpZHRoOiBjb250YWluZXJXaWR0aCxcbiAgICAgIGFuaW1hdGlvbjogYW5pbWF0aW9uLFxuICAgICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgICAgZHJvcGRvd25TdHlsZTogZHJvcGRvd25TdHlsZSxcbiAgICAgIGRyb3Bkb3duQ2xhc3NOYW1lOiBkcm9wZG93bkNsYXNzTmFtZSxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgICBkcm9wZG93blJlbmRlcjogZHJvcGRvd25SZW5kZXIsXG4gICAgICBkcm9wZG93bkFsaWduOiBkcm9wZG93bkFsaWduLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgZW1wdHk6ICFtZXJnZWRPcHRpb25zLmxlbmd0aCxcbiAgICAgIGdldFRyaWdnZXJET01Ob2RlOiBmdW5jdGlvbiBnZXRUcmlnZ2VyRE9NTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yRG9tUmVmLmN1cnJlbnQ7XG4gICAgICB9XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChfU2VsZWN0b3IuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgIGRvbVJlZjogc2VsZWN0b3JEb21SZWYsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGlucHV0RWxlbWVudDogY3VzdG9taXplSW5wdXRFbGVtZW50LFxuICAgICAgcmVmOiBzZWxlY3RvclJlZixcbiAgICAgIGlkOiBtZXJnZWRJZCxcbiAgICAgIHNob3dTZWFyY2g6IG1lcmdlZFNob3dTZWFyY2gsXG4gICAgICBtb2RlOiBtb2RlLFxuICAgICAgYWNjZXNzaWJpbGl0eUluZGV4OiBhY2Nlc3NpYmlsaXR5SW5kZXgsXG4gICAgICBtdWx0aXBsZTogaXNNdWx0aXBsZSxcbiAgICAgIHRhZ1JlbmRlcjogdGFnUmVuZGVyLFxuICAgICAgdmFsdWVzOiBkaXNwbGF5VmFsdWVzLFxuICAgICAgb3BlbjogbWVyZ2VkT3BlbixcbiAgICAgIG9uVG9nZ2xlT3Blbjogb25Ub2dnbGVPcGVuLFxuICAgICAgc2VhcmNoVmFsdWU6IG1lcmdlZFNlYXJjaFZhbHVlLFxuICAgICAgYWN0aXZlVmFsdWU6IGFjdGl2ZVZhbHVlLFxuICAgICAgb25TZWFyY2g6IHRyaWdnZXJTZWFyY2gsXG4gICAgICBvblNlYXJjaFN1Ym1pdDogb25TZWFyY2hTdWJtaXQsXG4gICAgICBvblNlbGVjdDogb25JbnRlcm5hbFNlbGVjdGlvblNlbGVjdCxcbiAgICAgIHRva2VuV2l0aEVudGVyOiB0b2tlbldpdGhFbnRlclxuICAgIH0pKSksIGFycm93Tm9kZSwgY2xlYXJOb2RlKTtcbiAgfVxuXG4gIHZhciBSZWZTZWxlY3QgPSBSZWFjdC5mb3J3YXJkUmVmKFNlbGVjdCk7XG4gIHJldHVybiBSZWZTZWxlY3Q7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlQ2FjaGVEaXNwbGF5VmFsdWU7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIHVzZUNhY2hlRGlzcGxheVZhbHVlKHZhbHVlcykge1xuICB2YXIgcHJldlZhbHVlc1JlZiA9IFJlYWN0LnVzZVJlZih2YWx1ZXMpO1xuICB2YXIgbWVyZ2VkVmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gQ3JlYXRlIHZhbHVlIC0gbGFiZWwgbWFwXG4gICAgdmFyIHZhbHVlTGFiZWxzID0gbmV3IE1hcCgpO1xuICAgIHByZXZWYWx1ZXNSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgICAgIGxhYmVsID0gX3JlZi5sYWJlbDtcblxuICAgICAgaWYgKHZhbHVlICE9PSBsYWJlbCkge1xuICAgICAgICB2YWx1ZUxhYmVscy5zZXQodmFsdWUsIGxhYmVsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgcmVzdWx0VmFsdWVzID0gdmFsdWVzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNhY2hlTGFiZWwgPSB2YWx1ZUxhYmVscy5nZXQoaXRlbS52YWx1ZSk7XG5cbiAgICAgIGlmIChpdGVtLnZhbHVlID09PSBpdGVtLmxhYmVsICYmIGNhY2hlTGFiZWwpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGl0ZW0pLCB7fSwge1xuICAgICAgICAgIGxhYmVsOiBjYWNoZUxhYmVsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgICBwcmV2VmFsdWVzUmVmLmN1cnJlbnQgPSByZXN1bHRWYWx1ZXM7XG4gICAgcmV0dXJuIHJlc3VsdFZhbHVlcztcbiAgfSwgW3ZhbHVlc10pO1xuICByZXR1cm4gbWVyZ2VkVmFsdWVzO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlQ2FjaGVPcHRpb25zO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG5mdW5jdGlvbiB1c2VDYWNoZU9wdGlvbnModmFsdWVzLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2T3B0aW9uTWFwUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgb3B0aW9uTWFwID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciB2YWx1ZSA9IGl0ZW0uZGF0YS52YWx1ZTtcbiAgICAgIG1hcC5zZXQodmFsdWUsIGl0ZW0pO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXA7XG4gIH0sIFt2YWx1ZXMsIG9wdGlvbnNdKTtcbiAgcHJldk9wdGlvbk1hcFJlZi5jdXJyZW50ID0gb3B0aW9uTWFwO1xuXG4gIHZhciBnZXRWYWx1ZU9wdGlvbiA9IGZ1bmN0aW9uIGdldFZhbHVlT3B0aW9uKHZhbHMpIHtcbiAgICByZXR1cm4gdmFscy5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gcHJldk9wdGlvbk1hcFJlZi5jdXJyZW50LmdldCh2YWx1ZSk7XG4gICAgfSkuZmlsdGVyKEJvb2xlYW4pO1xuICB9O1xuXG4gIHJldHVybiBnZXRWYWx1ZU9wdGlvbjtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VEZWxheVJlc2V0O1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuLyoqXG4gKiBTaW1pbGFyIHdpdGggYHVzZUxvY2tgLCBidXQgdGhpcyBob29rIHdpbGwgYWx3YXlzIGV4ZWN1dGUgbGFzdCB2YWx1ZS5cbiAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgaXQgd2lsbCBrZWVwIGB0cnVlYCBmb3IgYSBzaG9ydCB0aW1lIGV2ZW4gaWYgYGZhbHNlYCBpcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIHVzZURlbGF5UmVzZXQoKSB7XG4gIHZhciB0aW1lb3V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxMDtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGJvb2wgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0Qm9vbCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIGRlbGF5UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuXG4gIHZhciBjYW5jZWxMYXRlc3QgPSBmdW5jdGlvbiBjYW5jZWxMYXRlc3QoKSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dChkZWxheVJlZi5jdXJyZW50KTtcbiAgfTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYW5jZWxMYXRlc3Q7XG4gIH0sIFtdKTtcblxuICB2YXIgZGVsYXlTZXRCb29sID0gZnVuY3Rpb24gZGVsYXlTZXRCb29sKHZhbHVlLCBjYWxsYmFjaykge1xuICAgIGNhbmNlbExhdGVzdCgpO1xuICAgIGRlbGF5UmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRCb29sKHZhbHVlKTtcblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSwgdGltZW91dCk7XG4gIH07XG5cbiAgcmV0dXJuIFtib29sLCBkZWxheVNldEJvb2wsIGNhbmNlbExhdGVzdF07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VMYXlvdXRFZmZlY3Q7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY29tbW9uVXRpbCA9IHJlcXVpcmUoXCIuLi91dGlscy9jb21tb25VdGlsXCIpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rcyAqL1xuXG4vKipcbiAqIFdyYXAgYFJlYWN0LnVzZUxheW91dEVmZmVjdGAgd2hpY2ggd2lsbCBub3QgdGhyb3cgd2FybmluZyBtZXNzYWdlIGluIHRlc3QgZW52XG4gKi9cbmZ1bmN0aW9uIHVzZUxheW91dEVmZmVjdChlZmZlY3QsIGRlcHMpIHtcbiAgLy8gTmV2ZXIgaGFwcGVuIGluIHRlc3QgZW52XG4gIGlmIChfY29tbW9uVXRpbC5pc0Jyb3dzZXJDbGllbnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdChlZmZlY3QsIGRlcHMpO1xuICB9IGVsc2Uge1xuICAgIFJlYWN0LnVzZUVmZmVjdChlZmZlY3QsIGRlcHMpO1xuICB9XG59XG4vKiBlc2xpbnQtZW5hYmxlICovIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VMb2NrO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG4vKipcbiAqIExvY2tlciByZXR1cm4gY2FjaGVkIG1hcmsuXG4gKiBJZiBzZXQgdG8gYHRydWVgLCB3aWxsIHJldHVybiBgdHJ1ZWAgaW4gYSBzaG9ydCB0aW1lIGV2ZW4gaWYgc2V0IGBmYWxzZWAuXG4gKiBJZiBzZXQgdG8gYGZhbHNlYCBhbmQgdGhlbiBzZXQgdG8gYHRydWVgLCB3aWxsIGNoYW5nZSB0byBgdHJ1ZWAuXG4gKiBBbmQgYWZ0ZXIgdGltZSBkdXJhdGlvbiwgaXQgd2lsbCBiYWNrIHRvIGBudWxsYCBhdXRvbWF0aWNhbGx5LlxuICovXG5mdW5jdGlvbiB1c2VMb2NrKCkge1xuICB2YXIgZHVyYXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDI1MDtcbiAgdmFyIGxvY2tSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpOyAvLyBDbGVhbiB1cFxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgZnVuY3Rpb24gZG9Mb2NrKGxvY2tlZCkge1xuICAgIGlmIChsb2NrZWQgfHwgbG9ja1JlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBsb2NrUmVmLmN1cnJlbnQgPSBsb2NrZWQ7XG4gICAgfVxuXG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGxvY2tSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfSwgZHVyYXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIFtmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2tSZWYuY3VycmVudDtcbiAgfSwgZG9Mb2NrXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZVNlbGVjdFRyaWdnZXJDb250cm9sO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG5mdW5jdGlvbiB1c2VTZWxlY3RUcmlnZ2VyQ29udHJvbChlbGVtZW50cywgb3BlbiwgdHJpZ2dlck9wZW4pIHtcbiAgdmFyIHByb3BzUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBwcm9wc1JlZi5jdXJyZW50ID0ge1xuICAgIGVsZW1lbnRzOiBlbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH0pLFxuICAgIG9wZW46IG9wZW4sXG4gICAgdHJpZ2dlck9wZW46IHRyaWdnZXJPcGVuXG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gb25HbG9iYWxNb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgIGlmIChwcm9wc1JlZi5jdXJyZW50Lm9wZW4gJiYgcHJvcHNSZWYuY3VycmVudC5lbGVtZW50cy5ldmVyeShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gIWVsZW1lbnQuY29udGFpbnModGFyZ2V0KSAmJiBlbGVtZW50ICE9PSB0YXJnZXQ7XG4gICAgICB9KSkge1xuICAgICAgICAvLyBTaG91bGQgdHJpZ2dlciBjbG9zZVxuICAgICAgICBwcm9wc1JlZi5jdXJyZW50LnRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25HbG9iYWxNb3VzZURvd24pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uR2xvYmFsTW91c2VEb3duKTtcbiAgICB9O1xuICB9LCBbXSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiT3B0aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9PcHRpb24uZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJPcHRHcm91cFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfT3B0R3JvdXAuZGVmYXVsdDtcbiAgfVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfU2VsZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TZWxlY3RcIikpO1xuXG52YXIgX09wdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vT3B0aW9uXCIpKTtcblxudmFyIF9PcHRHcm91cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vT3B0R3JvdXBcIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfU2VsZWN0LmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuSU5URVJOQUxfUFJPUFNfTUFSSyA9IHZvaWQgMDtcbnZhciBJTlRFUk5BTF9QUk9QU19NQVJLID0gJ1JDX1NFTEVDVF9JTlRFUk5BTF9QUk9QU19NQVJLJztcbmV4cG9ydHMuSU5URVJOQUxfUFJPUFNfTUFSSyA9IElOVEVSTkFMX1BST1BTX01BUks7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcbmV4cG9ydHMudG9Jbm5lclZhbHVlID0gdG9Jbm5lclZhbHVlO1xuZXhwb3J0cy50b091dGVyVmFsdWVzID0gdG9PdXRlclZhbHVlcztcbmV4cG9ydHMucmVtb3ZlTGFzdEVuYWJsZWRWYWx1ZSA9IHJlbW92ZUxhc3RFbmFibGVkVmFsdWU7XG5leHBvcnRzLmdldFVVSUQgPSBnZXRVVUlEO1xuZXhwb3J0cy5pc0Jyb3dzZXJDbGllbnQgPSBleHBvcnRzLmlzQ2xpZW50ID0gdm9pZCAwO1xuXG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xuXG5mdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gW3ZhbHVlXSA6IFtdO1xufVxuLyoqXG4gKiBDb252ZXJ0IG91dGVyIHByb3BzIHZhbHVlIGludG8gaW50ZXJuYWwgdmFsdWVcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvSW5uZXJWYWx1ZSh2YWx1ZSwgX3JlZikge1xuICB2YXIgbGFiZWxJblZhbHVlID0gX3JlZi5sYWJlbEluVmFsdWUsXG4gICAgICBjb21ib2JveCA9IF9yZWYuY29tYm9ib3g7XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnICYmIGNvbWJvYm94KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gIGlmIChsYWJlbEluVmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVzLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciBrZXkgPSBfcmVmMi5rZXksXG4gICAgICAgICAgdmFsID0gX3JlZjIudmFsdWU7XG4gICAgICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPyB2YWwgOiBrZXk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzO1xufVxuLyoqXG4gKiBDb252ZXJ0IGludGVybmFsIHZhbHVlIGludG8gb3V0IGV2ZW50IHZhbHVlXG4gKi9cblxuXG5mdW5jdGlvbiB0b091dGVyVmFsdWVzKHZhbHVlTGlzdCwgX3JlZjMpIHtcbiAgdmFyIG9wdGlvbkxhYmVsUHJvcCA9IF9yZWYzLm9wdGlvbkxhYmVsUHJvcCxcbiAgICAgIGxhYmVsSW5WYWx1ZSA9IF9yZWYzLmxhYmVsSW5WYWx1ZSxcbiAgICAgIHByZXZWYWx1ZSA9IF9yZWYzLnByZXZWYWx1ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMy5vcHRpb25zLFxuICAgICAgZ2V0TGFiZWxlZFZhbHVlID0gX3JlZjMuZ2V0TGFiZWxlZFZhbHVlO1xuICB2YXIgdmFsdWVzID0gdmFsdWVMaXN0O1xuXG4gIGlmIChsYWJlbEluVmFsdWUpIHtcbiAgICB2YWx1ZXMgPSB2YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBnZXRMYWJlbGVkVmFsdWUodmFsLCB7XG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIHByZXZWYWx1ZTogcHJldlZhbHVlLFxuICAgICAgICBsYWJlbEluVmFsdWU6IGxhYmVsSW5WYWx1ZSxcbiAgICAgICAgb3B0aW9uTGFiZWxQcm9wOiBvcHRpb25MYWJlbFByb3BcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTGFzdEVuYWJsZWRWYWx1ZShtZWFzdXJlVmFsdWVzLCB2YWx1ZXMpIHtcbiAgdmFyIG5ld1ZhbHVlcyA9ICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHZhbHVlcyk7XG4gIHZhciByZW1vdmVJbmRleDtcblxuICBmb3IgKHJlbW92ZUluZGV4ID0gbWVhc3VyZVZhbHVlcy5sZW5ndGggLSAxOyByZW1vdmVJbmRleCA+PSAwOyByZW1vdmVJbmRleCAtPSAxKSB7XG4gICAgaWYgKCFtZWFzdXJlVmFsdWVzW3JlbW92ZUluZGV4XS5kaXNhYmxlZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbW92ZWRWYWx1ZSA9IG51bGw7XG5cbiAgaWYgKHJlbW92ZUluZGV4ICE9PSAtMSkge1xuICAgIHJlbW92ZWRWYWx1ZSA9IG5ld1ZhbHVlc1tyZW1vdmVJbmRleF07XG4gICAgbmV3VmFsdWVzLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbHVlczogbmV3VmFsdWVzLFxuICAgIHJlbW92ZWRWYWx1ZTogcmVtb3ZlZFZhbHVlXG4gIH07XG59XG5cbnZhciBpc0NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuLyoqIElzIGNsaWVudCBzaWRlIGFuZCBub3QganNkb20gKi9cblxuZXhwb3J0cy5pc0NsaWVudCA9IGlzQ2xpZW50O1xudmFyIGlzQnJvd3NlckNsaWVudCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgaXNDbGllbnQ7XG5leHBvcnRzLmlzQnJvd3NlckNsaWVudCA9IGlzQnJvd3NlckNsaWVudDtcbnZhciB1dWlkID0gMDtcbi8qKiBHZXQgdW5pcXVlIGlkIGZvciBhY2Nlc3NpYmlsaXR5IHVzYWdlICovXG5cbmZ1bmN0aW9uIGdldFVVSUQoKSB7XG4gIHZhciByZXRJZDsgLy8gVGVzdCBuZXZlciByZWFjaFxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuXG4gIGlmIChpc0Jyb3dzZXJDbGllbnQpIHtcbiAgICByZXRJZCA9IHV1aWQ7XG4gICAgdXVpZCArPSAxO1xuICB9IGVsc2Uge1xuICAgIHJldElkID0gJ1RFU1RfT1JfU1NSJztcbiAgfVxuXG4gIHJldHVybiByZXRJZDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNvbnZlcnRDaGlsZHJlblRvRGF0YSA9IGNvbnZlcnRDaGlsZHJlblRvRGF0YTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF90b0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvQ2hpbGRyZW4vdG9BcnJheVwiKSk7XG5cbmZ1bmN0aW9uIGNvbnZlcnROb2RlVG9PcHRpb24obm9kZSkge1xuICB2YXIga2V5ID0gbm9kZS5rZXksXG4gICAgICBfbm9kZSRwcm9wcyA9IG5vZGUucHJvcHMsXG4gICAgICBjaGlsZHJlbiA9IF9ub2RlJHByb3BzLmNoaWxkcmVuLFxuICAgICAgdmFsdWUgPSBfbm9kZSRwcm9wcy52YWx1ZSxcbiAgICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF9ub2RlJHByb3BzLCBbXCJjaGlsZHJlblwiLCBcInZhbHVlXCJdKTtcbiAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAga2V5OiBrZXksXG4gICAgdmFsdWU6IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgfSwgcmVzdFByb3BzKTtcbn1cblxuZnVuY3Rpb24gY29udmVydENoaWxkcmVuVG9EYXRhKG5vZGVzKSB7XG4gIHZhciBvcHRpb25Pbmx5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgcmV0dXJuICgwLCBfdG9BcnJheS5kZWZhdWx0KShub2RlcykubWFwKGZ1bmN0aW9uIChub2RlLCBpbmRleCkge1xuICAgIGlmICghUmVhY3QuaXNWYWxpZEVsZW1lbnQobm9kZSkgfHwgIW5vZGUudHlwZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGlzU2VsZWN0T3B0R3JvdXAgPSBub2RlLnR5cGUuaXNTZWxlY3RPcHRHcm91cCxcbiAgICAgICAga2V5ID0gbm9kZS5rZXksXG4gICAgICAgIF9ub2RlJHByb3BzMiA9IG5vZGUucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX25vZGUkcHJvcHMyLmNoaWxkcmVuLFxuICAgICAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfbm9kZSRwcm9wczIsIFtcImNoaWxkcmVuXCJdKTtcblxuICAgIGlmIChvcHRpb25Pbmx5IHx8ICFpc1NlbGVjdE9wdEdyb3VwKSB7XG4gICAgICByZXR1cm4gY29udmVydE5vZGVUb09wdGlvbihub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAgICBrZXk6IFwiX19SQ19TRUxFQ1RfR1JQX19cIi5jb25jYXQoa2V5ID09PSBudWxsID8gaW5kZXggOiBrZXksIFwiX19cIiksXG4gICAgICBsYWJlbDoga2V5XG4gICAgfSwgcmVzdFByb3BzKSwge30sIHtcbiAgICAgIG9wdGlvbnM6IGNvbnZlcnRDaGlsZHJlblRvRGF0YShjaGlsZHJlbilcbiAgICB9KTtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZmxhdHRlbk9wdGlvbnMgPSBmbGF0dGVuT3B0aW9ucztcbmV4cG9ydHMuZmluZFZhbHVlT3B0aW9uID0gZmluZFZhbHVlT3B0aW9uO1xuZXhwb3J0cy5maWx0ZXJPcHRpb25zID0gZmlsdGVyT3B0aW9ucztcbmV4cG9ydHMuZ2V0U2VwYXJhdGVkQ29udGVudCA9IGdldFNlcGFyYXRlZENvbnRlbnQ7XG5leHBvcnRzLmlzVmFsdWVEaXNhYmxlZCA9IGlzVmFsdWVEaXNhYmxlZDtcbmV4cG9ydHMuZmlsbE9wdGlvbnNXaXRoTWlzc2luZ1ZhbHVlID0gZmlsbE9wdGlvbnNXaXRoTWlzc2luZ1ZhbHVlO1xuZXhwb3J0cy5nZXRMYWJlbGVkVmFsdWUgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfdG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQXJyYXlcIikpO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuXG52YXIgX2NvbW1vblV0aWwgPSByZXF1aXJlKFwiLi9jb21tb25VdGlsXCIpO1xuXG5mdW5jdGlvbiBnZXRLZXkoZGF0YSwgaW5kZXgpIHtcbiAgdmFyIGtleSA9IGRhdGEua2V5O1xuICB2YXIgdmFsdWU7XG5cbiAgaWYgKCd2YWx1ZScgaW4gZGF0YSkge1xuICAgIHZhbHVlID0gZGF0YS52YWx1ZTtcbiAgfVxuXG4gIGlmIChrZXkgIT09IG51bGwgJiYga2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gXCJyYy1pbmRleC1rZXktXCIuY29uY2F0KGluZGV4KTtcbn1cbi8qKlxuICogRmxhdCBvcHRpb25zIGludG8gZmxhdHRlbiBsaXN0LlxuICogV2UgdXNlIGBvcHRpb25Pbmx5YCBoZXJlIGlzIGFpbSB0byBhdm9pZCB1c2VyIHVzZSBuZXN0ZWQgb3B0aW9uIGdyb3VwLlxuICogSGVyZSBpcyBzaW1wbHkgc2V0IGBrZXlgIHRvIHRoZSBpbmRleCBpZiBub3QgcHJvdmlkZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBmbGF0dGVuT3B0aW9ucyhvcHRpb25zKSB7XG4gIHZhciBmbGF0dGVuTGlzdCA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRpZyhsaXN0LCBpc0dyb3VwT3B0aW9uKSB7XG4gICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBpZiAoaXNHcm91cE9wdGlvbiB8fCAhKCdvcHRpb25zJyBpbiBkYXRhKSkge1xuICAgICAgICAvLyBPcHRpb25cbiAgICAgICAgZmxhdHRlbkxpc3QucHVzaCh7XG4gICAgICAgICAga2V5OiBnZXRLZXkoZGF0YSwgZmxhdHRlbkxpc3QubGVuZ3RoKSxcbiAgICAgICAgICBncm91cE9wdGlvbjogaXNHcm91cE9wdGlvbixcbiAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3B0aW9uIEdyb3VwXG4gICAgICAgIGZsYXR0ZW5MaXN0LnB1c2goe1xuICAgICAgICAgIGtleTogZ2V0S2V5KGRhdGEsIGZsYXR0ZW5MaXN0Lmxlbmd0aCksXG4gICAgICAgICAgZ3JvdXA6IHRydWUsXG4gICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgZGlnKGRhdGEub3B0aW9ucywgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBkaWcob3B0aW9ucywgZmFsc2UpO1xuICByZXR1cm4gZmxhdHRlbkxpc3Q7XG59XG4vKipcbiAqIEluamVjdCBgcHJvcHNgIGludG8gYG9wdGlvbmAgZm9yIGxlZ2FjeSB1c2FnZVxuICovXG5cblxuZnVuY3Rpb24gaW5qZWN0UHJvcHNXaXRoT3B0aW9uKG9wdGlvbikge1xuICB2YXIgbmV3T3B0aW9uID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBvcHRpb24pO1xuXG4gIGlmICghKCdwcm9wcycgaW4gbmV3T3B0aW9uKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPcHRpb24sICdwcm9wcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsICdSZXR1cm4gdHlwZSBpcyBvcHRpb24gaW5zdGVhZCBvZiBPcHRpb24gaW5zdGFuY2UuIFBsZWFzZSByZWFkIHZhbHVlIGRpcmVjdGx5IGluc3RlYWQgb2YgcmVhZGluZyBmcm9tIGBwcm9wc2AuJyk7XG4gICAgICAgIHJldHVybiBuZXdPcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3T3B0aW9uO1xufVxuXG5mdW5jdGlvbiBmaW5kVmFsdWVPcHRpb24odmFsdWVzLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fSxcbiAgICAgIF9yZWYkcHJldlZhbHVlT3B0aW9ucyA9IF9yZWYucHJldlZhbHVlT3B0aW9ucyxcbiAgICAgIHByZXZWYWx1ZU9wdGlvbnMgPSBfcmVmJHByZXZWYWx1ZU9wdGlvbnMgPT09IHZvaWQgMCA/IFtdIDogX3JlZiRwcmV2VmFsdWVPcHRpb25zO1xuXG4gIHZhciBvcHRpb25NYXAgPSBuZXcgTWFwKCk7XG4gIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoZmxhdHRlbkl0ZW0pIHtcbiAgICBpZiAoIWZsYXR0ZW5JdGVtLmdyb3VwKSB7XG4gICAgICB2YXIgZGF0YSA9IGZsYXR0ZW5JdGVtLmRhdGE7IC8vIENoZWNrIGlmIG1hdGNoXG5cbiAgICAgIG9wdGlvbk1hcC5zZXQoZGF0YS52YWx1ZSwgZGF0YSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvcHRpb24gPSBvcHRpb25NYXAuZ2V0KHZhbCk7IC8vIEZhbGxiYWNrIHRvIHRyeSB0byBmaW5kIHByZXYgb3B0aW9uc1xuXG4gICAgaWYgKCFvcHRpb24pIHtcbiAgICAgIG9wdGlvbiA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgcHJldlZhbHVlT3B0aW9ucy5maW5kKGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgICAgcmV0dXJuIG9wdC5fSU5URVJOQUxfT1BUSU9OX1ZBTFVFXyA9PT0gdmFsO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmplY3RQcm9wc1dpdGhPcHRpb24ob3B0aW9uKTtcbiAgfSk7XG59XG5cbnZhciBnZXRMYWJlbGVkVmFsdWUgPSBmdW5jdGlvbiBnZXRMYWJlbGVkVmFsdWUodmFsdWUsIF9yZWYyKSB7XG4gIHZhciBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIHByZXZWYWx1ZSA9IF9yZWYyLnByZXZWYWx1ZSxcbiAgICAgIGxhYmVsSW5WYWx1ZSA9IF9yZWYyLmxhYmVsSW5WYWx1ZSxcbiAgICAgIG9wdGlvbkxhYmVsUHJvcCA9IF9yZWYyLm9wdGlvbkxhYmVsUHJvcDtcbiAgdmFyIGl0ZW0gPSBmaW5kVmFsdWVPcHRpb24oW3ZhbHVlXSwgb3B0aW9ucylbMF07XG4gIHZhciByZXN1bHQgPSB7XG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG4gIHZhciBwcmV2VmFsSXRlbTtcbiAgdmFyIHByZXZWYWx1ZXMgPSAoMCwgX2NvbW1vblV0aWwudG9BcnJheSkocHJldlZhbHVlKTtcblxuICBpZiAobGFiZWxJblZhbHVlKSB7XG4gICAgcHJldlZhbEl0ZW0gPSBwcmV2VmFsdWVzLmZpbmQoZnVuY3Rpb24gKHByZXZJdGVtKSB7XG4gICAgICBpZiAoKDAsIF90eXBlb2YyLmRlZmF1bHQpKHByZXZJdGVtKSA9PT0gJ29iamVjdCcgJiYgJ3ZhbHVlJyBpbiBwcmV2SXRlbSkge1xuICAgICAgICByZXR1cm4gcHJldkl0ZW0udmFsdWUgPT09IHZhbHVlO1xuICAgICAgfSAvLyBbTGVnYWN5XSBTdXBwb3J0IGBrZXlgIGFzIGB2YWx1ZWBcblxuXG4gICAgICByZXR1cm4gcHJldkl0ZW0ua2V5ID09PSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwcmV2VmFsSXRlbSAmJiAoMCwgX3R5cGVvZjIuZGVmYXVsdCkocHJldlZhbEl0ZW0pID09PSAnb2JqZWN0JyAmJiAnbGFiZWwnIGluIHByZXZWYWxJdGVtKSB7XG4gICAgcmVzdWx0LmxhYmVsID0gcHJldlZhbEl0ZW0ubGFiZWw7XG5cbiAgICBpZiAoaXRlbSAmJiB0eXBlb2YgcHJldlZhbEl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBpdGVtW29wdGlvbkxhYmVsUHJvcF0gPT09ICdzdHJpbmcnICYmIHByZXZWYWxJdGVtLmxhYmVsLnRyaW0oKSAhPT0gaXRlbVtvcHRpb25MYWJlbFByb3BdLnRyaW0oKSkge1xuICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCAnYGxhYmVsYCBvZiBgdmFsdWVgIGlzIG5vdCBzYW1lIGFzIGBsYWJlbGAgaW4gU2VsZWN0IG9wdGlvbnMuJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGl0ZW0gJiYgb3B0aW9uTGFiZWxQcm9wIGluIGl0ZW0pIHtcbiAgICByZXN1bHQubGFiZWwgPSBpdGVtW29wdGlvbkxhYmVsUHJvcF07XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LmxhYmVsID0gdmFsdWU7XG4gIH0gLy8gVXNlZCBmb3IgbW90aW9uIGNvbnRyb2xcblxuXG4gIHJlc3VsdC5rZXkgPSByZXN1bHQudmFsdWU7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnRzLmdldExhYmVsZWRWYWx1ZSA9IGdldExhYmVsZWRWYWx1ZTtcblxuZnVuY3Rpb24gdG9SYXdTdHJpbmcoY29udGVudCkge1xuICByZXR1cm4gKDAsIF9jb21tb25VdGlsLnRvQXJyYXkpKGNvbnRlbnQpLmpvaW4oJycpO1xufVxuLyoqIEZpbHRlciBzaW5nbGUgb3B0aW9uIGlmIG1hdGNoIHRoZSBzZWFyY2ggdGV4dCAqL1xuXG5cbmZ1bmN0aW9uIGdldEZpbHRlckZ1bmN0aW9uKG9wdGlvbkZpbHRlclByb3ApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzZWFyY2hWYWx1ZSwgb3B0aW9uKSB7XG4gICAgdmFyIGxvd2VyU2VhcmNoVGV4dCA9IHNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCk7IC8vIEdyb3VwIGxhYmVsIHNlYXJjaFxuXG4gICAgaWYgKCdvcHRpb25zJyBpbiBvcHRpb24pIHtcbiAgICAgIHJldHVybiB0b1Jhd1N0cmluZyhvcHRpb24ubGFiZWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJTZWFyY2hUZXh0KTtcbiAgICB9IC8vIE9wdGlvbiB2YWx1ZSBzZWFyY2hcblxuXG4gICAgdmFyIHJhd1ZhbHVlID0gb3B0aW9uW29wdGlvbkZpbHRlclByb3BdO1xuICAgIHZhciB2YWx1ZSA9IHRvUmF3U3RyaW5nKHJhd1ZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhsb3dlclNlYXJjaFRleHQpO1xuICB9O1xufVxuLyoqIEZpbHRlciBvcHRpb25zIGFuZCByZXR1cm4gYSBuZXcgb3B0aW9ucyBieSB0aGUgc2VhcmNoIHRleHQgKi9cblxuXG5mdW5jdGlvbiBmaWx0ZXJPcHRpb25zKHNlYXJjaFZhbHVlLCBvcHRpb25zLCBfcmVmMykge1xuICB2YXIgb3B0aW9uRmlsdGVyUHJvcCA9IF9yZWYzLm9wdGlvbkZpbHRlclByb3AsXG4gICAgICBmaWx0ZXJPcHRpb24gPSBfcmVmMy5maWx0ZXJPcHRpb247XG4gIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBbXTtcbiAgdmFyIGZpbHRlckZ1bmM7XG5cbiAgaWYgKGZpbHRlck9wdGlvbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIGlmICh0eXBlb2YgZmlsdGVyT3B0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZmlsdGVyRnVuYyA9IGZpbHRlck9wdGlvbjtcbiAgfSBlbHNlIHtcbiAgICBmaWx0ZXJGdW5jID0gZ2V0RmlsdGVyRnVuY3Rpb24ob3B0aW9uRmlsdGVyUHJvcCk7XG4gIH1cblxuICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAvLyBHcm91cCBzaG91bGQgY2hlY2sgY2hpbGQgb3B0aW9uc1xuICAgIGlmICgnb3B0aW9ucycgaW4gaXRlbSkge1xuICAgICAgLy8gQ2hlY2sgZ3JvdXAgZmlyc3RcbiAgICAgIHZhciBtYXRjaEdyb3VwID0gZmlsdGVyRnVuYyhzZWFyY2hWYWx1ZSwgaXRlbSk7XG5cbiAgICAgIGlmIChtYXRjaEdyb3VwKSB7XG4gICAgICAgIGZpbHRlcmVkT3B0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ2hlY2sgb3B0aW9uXG4gICAgICAgIHZhciBzdWJPcHRpb25zID0gaXRlbS5vcHRpb25zLmZpbHRlcihmdW5jdGlvbiAoc3ViSXRlbSkge1xuICAgICAgICAgIHJldHVybiBmaWx0ZXJGdW5jKHNlYXJjaFZhbHVlLCBzdWJJdGVtKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHN1Yk9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgZmlsdGVyZWRPcHRpb25zLnB1c2goKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgaXRlbSksIHt9LCB7XG4gICAgICAgICAgICBvcHRpb25zOiBzdWJPcHRpb25zXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyRnVuYyhzZWFyY2hWYWx1ZSwgaW5qZWN0UHJvcHNXaXRoT3B0aW9uKGl0ZW0pKSkge1xuICAgICAgZmlsdGVyZWRPcHRpb25zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpbHRlcmVkT3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0U2VwYXJhdGVkQ29udGVudCh0ZXh0LCB0b2tlbnMpIHtcbiAgaWYgKCF0b2tlbnMgfHwgIXRva2Vucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXRjaCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHNlcGFyYXRlKHN0ciwgX3JlZjQpIHtcbiAgICB2YXIgX3JlZjUgPSAoMCwgX3RvQXJyYXkyLmRlZmF1bHQpKF9yZWY0KSxcbiAgICAgICAgdG9rZW4gPSBfcmVmNVswXSxcbiAgICAgICAgcmVzdFRva2VucyA9IF9yZWY1LnNsaWNlKDEpO1xuXG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIFtzdHJdO1xuICAgIH1cblxuICAgIHZhciBsaXN0ID0gc3RyLnNwbGl0KHRva2VuKTtcbiAgICBtYXRjaCA9IG1hdGNoIHx8IGxpc3QubGVuZ3RoID4gMTtcbiAgICByZXR1cm4gbGlzdC5yZWR1Y2UoZnVuY3Rpb24gKHByZXZMaXN0LCB1bml0U3RyKSB7XG4gICAgICByZXR1cm4gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHByZXZMaXN0KSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoc2VwYXJhdGUodW5pdFN0ciwgcmVzdFRva2VucykpKTtcbiAgICB9LCBbXSkuZmlsdGVyKGZ1bmN0aW9uICh1bml0KSB7XG4gICAgICByZXR1cm4gdW5pdDtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBsaXN0ID0gc2VwYXJhdGUodGV4dCwgdG9rZW5zKTtcbiAgcmV0dXJuIG1hdGNoID8gbGlzdCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVEaXNhYmxlZCh2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgb3B0aW9uID0gZmluZFZhbHVlT3B0aW9uKFt2YWx1ZV0sIG9wdGlvbnMpWzBdO1xuICByZXR1cm4gb3B0aW9uLmRpc2FibGVkO1xufVxuLyoqXG4gKiBgdGFnc2AgbW9kZSBzaG91bGQgZmlsbCB1bi1saXN0IGl0ZW0gaW50byB0aGUgb3B0aW9uIGxpc3RcbiAqL1xuXG5cbmZ1bmN0aW9uIGZpbGxPcHRpb25zV2l0aE1pc3NpbmdWYWx1ZShvcHRpb25zLCB2YWx1ZSwgb3B0aW9uTGFiZWxQcm9wLCBsYWJlbEluVmFsdWUpIHtcbiAgdmFyIHZhbHVlcyA9ICgwLCBfY29tbW9uVXRpbC50b0FycmF5KSh2YWx1ZSkuc2xpY2UoKS5zb3J0KCk7XG4gIHZhciBjbG9uZU9wdGlvbnMgPSAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShvcHRpb25zKTsgLy8gQ29udmVydCBvcHRpb25zIHZhbHVlIHRvIHNldFxuXG4gIHZhciBvcHRpb25WYWx1ZXMgPSBuZXcgU2V0KCk7XG4gIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob3B0KSB7XG4gICAgaWYgKG9wdC5vcHRpb25zKSB7XG4gICAgICBvcHQub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJPcHQpIHtcbiAgICAgICAgb3B0aW9uVmFsdWVzLmFkZChzdWJPcHQudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvblZhbHVlcy5hZGQob3B0LnZhbHVlKTtcbiAgICB9XG4gIH0pOyAvLyBGaWxsIG1pc3NpbmcgdmFsdWVcblxuICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciB2YWwgPSBsYWJlbEluVmFsdWUgPyBpdGVtLnZhbHVlIDogaXRlbTtcblxuICAgIGlmICghb3B0aW9uVmFsdWVzLmhhcyh2YWwpKSB7XG4gICAgICB2YXIgX3JlZjY7XG5cbiAgICAgIGNsb25lT3B0aW9ucy5wdXNoKGxhYmVsSW5WYWx1ZSA/IChfcmVmNiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmNiwgb3B0aW9uTGFiZWxQcm9wLCBpdGVtLmxhYmVsKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX3JlZjYsIFwidmFsdWVcIiwgdmFsKSwgX3JlZjYpIDoge1xuICAgICAgICB2YWx1ZTogdmFsXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2xvbmVPcHRpb25zO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3dhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfdG9BcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0NoaWxkcmVuL3RvQXJyYXlcIikpO1xuXG52YXIgX2xlZ2FjeVV0aWwgPSByZXF1aXJlKFwiLi9sZWdhY3lVdGlsXCIpO1xuXG52YXIgX2NvbW1vblV0aWwgPSByZXF1aXJlKFwiLi9jb21tb25VdGlsXCIpO1xuXG5mdW5jdGlvbiB3YXJuaW5nUHJvcHMocHJvcHMpIHtcbiAgdmFyIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgICAgb3B0aW9ucyA9IHByb3BzLm9wdGlvbnMsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgYmFja2ZpbGwgPSBwcm9wcy5iYWNrZmlsbCxcbiAgICAgIGFsbG93Q2xlYXIgPSBwcm9wcy5hbGxvd0NsZWFyLFxuICAgICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICAgIGdldElucHV0RWxlbWVudCA9IHByb3BzLmdldElucHV0RWxlbWVudCxcbiAgICAgIHNob3dTZWFyY2ggPSBwcm9wcy5zaG93U2VhcmNoLFxuICAgICAgb25TZWFyY2ggPSBwcm9wcy5vblNlYXJjaCxcbiAgICAgIGRlZmF1bHRPcGVuID0gcHJvcHMuZGVmYXVsdE9wZW4sXG4gICAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgICBsYWJlbEluVmFsdWUgPSBwcm9wcy5sYWJlbEluVmFsdWUsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgaW5wdXRWYWx1ZSA9IHByb3BzLmlucHV0VmFsdWUsXG4gICAgICBvcHRpb25MYWJlbFByb3AgPSBwcm9wcy5vcHRpb25MYWJlbFByb3A7XG4gIHZhciBtdWx0aXBsZSA9IG1vZGUgPT09ICdtdWx0aXBsZScgfHwgbW9kZSA9PT0gJ3RhZ3MnO1xuICB2YXIgbWVyZ2VkU2hvd1NlYXJjaCA9IHNob3dTZWFyY2ggIT09IHVuZGVmaW5lZCA/IHNob3dTZWFyY2ggOiBtdWx0aXBsZSB8fCBtb2RlID09PSAnY29tYm9ib3gnO1xuICB2YXIgbWVyZ2VkT3B0aW9ucyA9IG9wdGlvbnMgfHwgKDAsIF9sZWdhY3lVdGlsLmNvbnZlcnRDaGlsZHJlblRvRGF0YSkoY2hpbGRyZW4pOyAvLyBgdGFnc2Agc2hvdWxkIG5vdCBzZXQgb3B0aW9uIGFzIGRpc2FibGVkXG5cbiAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKG1vZGUgIT09ICd0YWdzJyB8fCBtZXJnZWRPcHRpb25zLmV2ZXJ5KGZ1bmN0aW9uIChvcHQpIHtcbiAgICByZXR1cm4gIW9wdC5kaXNhYmxlZDtcbiAgfSksICdQbGVhc2UgYXZvaWQgc2V0dGluZyBvcHRpb24gdG8gZGlzYWJsZWQgaW4gdGFncyBtb2RlIHNpbmNlIHVzZXIgY2FuIGFsd2F5cyB0eXBlIHRleHQgYXMgdGFnLicpOyAvLyBgY29tYm9ib3hgICYgYHRhZ3NgIHNob3VsZCBvcHRpb24gYmUgYHN0cmluZ2AgdHlwZVxuXG4gIGlmIChtb2RlID09PSAndGFncycgfHwgbW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgIHZhciBoYXNOdW1iZXJWYWx1ZSA9IG1lcmdlZE9wdGlvbnMuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKGl0ZW0ub3B0aW9ucykge1xuICAgICAgICByZXR1cm4gaXRlbS5vcHRpb25zLnNvbWUoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgKCd2YWx1ZScgaW4gb3B0ID8gb3B0LnZhbHVlIDogb3B0LmtleSkgPT09ICdudW1iZXInO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHR5cGVvZiAoJ3ZhbHVlJyBpbiBpdGVtID8gaXRlbS52YWx1ZSA6IGl0ZW0ua2V5KSA9PT0gJ251bWJlcic7XG4gICAgfSk7XG4gICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKCFoYXNOdW1iZXJWYWx1ZSwgJ2B2YWx1ZWAgb2YgT3B0aW9uIHNob3VsZCBub3QgdXNlIG51bWJlciB0eXBlIHdoZW4gYG1vZGVgIGlzIGB0YWdzYCBvciBgY29tYm9ib3hgLicpO1xuICB9IC8vIGBjb21ib2JveGAgc2hvdWxkIG5vdCB1c2UgYG9wdGlvbkxhYmVsUHJvcGBcblxuXG4gICgwLCBfd2FybmluZy5kZWZhdWx0KShtb2RlICE9PSAnY29tYm9ib3gnIHx8ICFvcHRpb25MYWJlbFByb3AsICdgY29tYm9ib3hgIG1vZGUgbm90IHN1cHBvcnQgYG9wdGlvbkxhYmVsUHJvcGAuIFBsZWFzZSBzZXQgYHZhbHVlYCBvbiBPcHRpb24gZGlyZWN0bHkuJyk7IC8vIE9ubHkgYGNvbWJvYm94YCBzdXBwb3J0IGBiYWNrZmlsbGBcblxuICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkobW9kZSA9PT0gJ2NvbWJvYm94JyB8fCAhYmFja2ZpbGwsICdgYmFja2ZpbGxgIG9ubHkgd29ya3Mgd2l0aCBgY29tYm9ib3hgIG1vZGUuJyk7IC8vIE9ubHkgYGNvbWJvYm94YCBzdXBwb3J0IGBnZXRJbnB1dEVsZW1lbnRgXG5cbiAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKG1vZGUgPT09ICdjb21ib2JveCcgfHwgIWdldElucHV0RWxlbWVudCwgJ2BnZXRJbnB1dEVsZW1lbnRgIG9ubHkgd29yayB3aXRoIGBjb21ib2JveGAgbW9kZS4nKTsgLy8gQ3VzdG9taXplIGBnZXRJbnB1dEVsZW1lbnRgIHNob3VsZCBub3QgdXNlIGBhbGxvd0NsZWFyYCAmIGBwbGFjZWhvbGRlcmBcblxuICAoMCwgX3dhcm5pbmcubm90ZU9uY2UpKG1vZGUgIT09ICdjb21ib2JveCcgfHwgIWdldElucHV0RWxlbWVudCB8fCAhYWxsb3dDbGVhciB8fCAhcGxhY2Vob2xkZXIsICdDdXN0b21pemUgYGdldElucHV0RWxlbWVudGAgc2hvdWxkIGN1c3RvbWl6ZSBjbGVhciBhbmQgcGxhY2Vob2xkZXIgbG9naWMgaW5zdGVhZCBvZiBjb25maWd1cmluZyBgYWxsb3dDbGVhcmAgYW5kIGBwbGFjZWhvbGRlcmAuJyk7IC8vIGBvblNlYXJjaGAgc2hvdWxkIHVzZSBpbiBgY29tYm9ib3hgIG9yIGBzaG93U2VhcmNoYFxuXG4gIGlmIChvblNlYXJjaCAmJiAhbWVyZ2VkU2hvd1NlYXJjaCAmJiBtb2RlICE9PSAnY29tYm9ib3gnICYmIG1vZGUgIT09ICd0YWdzJykge1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ2BvblNlYXJjaGAgc2hvdWxkIHdvcmsgd2l0aCBgc2hvd1NlYXJjaGAgaW5zdGVhZCBvZiB1c2UgYWxvbmUuJyk7XG4gIH1cblxuICAoMCwgX3dhcm5pbmcubm90ZU9uY2UpKCFkZWZhdWx0T3BlbiB8fCBhdXRvRm9jdXMsICdgZGVmYXVsdE9wZW5gIG1ha2VzIFNlbGVjdCBvcGVuIHdpdGhvdXQgZm9jdXMgd2hpY2ggbWVhbnMgaXQgd2lsbCBub3QgY2xvc2UgYnkgY2xpY2sgb3V0c2lkZS4gWW91IGNhbiBzZXQgYGF1dG9Gb2N1c2AgaWYgbmVlZGVkLicpO1xuXG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgdmFyIHZhbHVlcyA9ICgwLCBfY29tbW9uVXRpbC50b0FycmF5KSh2YWx1ZSk7XG4gICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKCFsYWJlbEluVmFsdWUgfHwgdmFsdWVzLmV2ZXJ5KGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiAoMCwgX3R5cGVvZjIuZGVmYXVsdCkodmFsKSA9PT0gJ29iamVjdCcgJiYgKCdrZXknIGluIHZhbCB8fCAndmFsdWUnIGluIHZhbCk7XG4gICAgfSksICdgdmFsdWVgIHNob3VsZCBpbiBzaGFwZSBvZiBgeyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLCBsYWJlbD86IFJlYWN0Tm9kZSB9YCB3aGVuIHlvdSBzZXQgYGxhYmVsSW5WYWx1ZWAgdG8gYHRydWVgJyk7XG4gICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKCFtdWx0aXBsZSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSwgJ2B2YWx1ZWAgc2hvdWxkIGJlIGFycmF5IHdoZW4gYG1vZGVgIGlzIGBtdWx0aXBsZWAgb3IgYHRhZ3NgJyk7XG4gIH0gLy8gU3ludGFjdGljIHN1Z2FyIHNob3VsZCB1c2UgY29ycmVjdCBjaGlsZHJlbiB0eXBlXG5cblxuICBpZiAoY2hpbGRyZW4pIHtcbiAgICB2YXIgaW52YWxpZGF0ZUNoaWxkVHlwZSA9IG51bGw7XG4gICAgKDAsIF90b0FycmF5LmRlZmF1bHQpKGNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBpZiAoIVJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpIHx8ICFub2RlLnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHlwZSA9IG5vZGUudHlwZTtcblxuICAgICAgaWYgKHR5cGUuaXNTZWxlY3RPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZS5pc1NlbGVjdE9wdEdyb3VwKSB7XG4gICAgICAgIHZhciBhbGxDaGlsZHJlblZhbGlkID0gKDAsIF90b0FycmF5LmRlZmF1bHQpKG5vZGUucHJvcHMuY2hpbGRyZW4pLmV2ZXJ5KGZ1bmN0aW9uIChzdWJOb2RlKSB7XG4gICAgICAgICAgaWYgKCFSZWFjdC5pc1ZhbGlkRWxlbWVudChzdWJOb2RlKSB8fCAhbm9kZS50eXBlIHx8IHN1Yk5vZGUudHlwZS5pc1NlbGVjdE9wdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW52YWxpZGF0ZUNoaWxkVHlwZSA9IHN1Yk5vZGUudHlwZTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhbGxDaGlsZHJlblZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGludmFsaWRhdGVDaGlsZFR5cGUgPSB0eXBlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBpZiAoaW52YWxpZGF0ZUNoaWxkVHlwZSkge1xuICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCBcImBjaGlsZHJlbmAgc2hvdWxkIGJlIGBTZWxlY3QuT3B0aW9uYCBvciBgU2VsZWN0Lk9wdEdyb3VwYCBpbnN0ZWFkIG9mIGBcIi5jb25jYXQoaW52YWxpZGF0ZUNoaWxkVHlwZS5kaXNwbGF5TmFtZSB8fCBpbnZhbGlkYXRlQ2hpbGRUeXBlLm5hbWUgfHwgaW52YWxpZGF0ZUNoaWxkVHlwZSwgXCJgLlwiKSk7XG4gICAgfVxuXG4gICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZCwgJ2BpbnB1dFZhbHVlYCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGBzZWFyY2hWYWx1ZWAgaW5zdGVhZC4nKTtcbiAgfVxufVxuXG52YXIgX2RlZmF1bHQgPSB3YXJuaW5nUHJvcHM7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiKSk7XG5cbnZhciBIYW5kbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoSGFuZGxlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoSGFuZGxlKTtcblxuICBmdW5jdGlvbiBIYW5kbGUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgSGFuZGxlKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgY2xpY2tGb2N1c2VkOiBmYWxzZVxuICAgIH07XG5cbiAgICBfdGhpcy5zZXRIYW5kbGVSZWYgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMuaGFuZGxlID0gbm9kZTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlTW91c2VVcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBfdGhpcy5oYW5kbGUpIHtcbiAgICAgICAgX3RoaXMuc2V0Q2xpY2tGb2N1cyh0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIGF2b2lkIHNlbGVjdGluZyB0ZXh0IGR1cmluZyBkcmFnXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNTAxMFxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAvLyBmaXggaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTUzMjRcblxuICAgICAgX3RoaXMuZm9jdXMoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldENsaWNrRm9jdXMoZmFsc2UpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2V0Q2xpY2tGb2N1cyhmYWxzZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKEhhbmRsZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAvLyBtb3VzZXVwIHdvbid0IHRyaWdnZXIgaWYgbW91c2UgbW92ZWQgb3V0IG9mIGhhbmRsZSxcbiAgICAgIC8vIHNvIHdlIGxpc3RlbiBvbiBkb2N1bWVudCBoZXJlLlxuICAgICAgdGhpcy5vbk1vdXNlVXBMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lci5kZWZhdWx0KShkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLmhhbmRsZU1vdXNlVXApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLm9uTW91c2VVcExpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldENsaWNrRm9jdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q2xpY2tGb2N1cyhmb2N1c2VkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY2xpY2tGb2N1c2VkOiBmb2N1c2VkXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xpY2tGb2N1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGlja0ZvY3VzKCkge1xuICAgICAgdGhpcy5zZXRDbGlja0ZvY3VzKHRydWUpO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb2N1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgIHRoaXMuaGFuZGxlLmZvY3VzKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJsdXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgIHRoaXMuaGFuZGxlLmJsdXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfcmVmLCBfcmVmMjtcblxuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgICAgdmVydGljYWwgPSBfdGhpcyRwcm9wcy52ZXJ0aWNhbCxcbiAgICAgICAgICByZXZlcnNlID0gX3RoaXMkcHJvcHMucmV2ZXJzZSxcbiAgICAgICAgICBvZmZzZXQgPSBfdGhpcyRwcm9wcy5vZmZzZXQsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wcy5zdHlsZSxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzLmRpc2FibGVkLFxuICAgICAgICAgIG1pbiA9IF90aGlzJHByb3BzLm1pbixcbiAgICAgICAgICBtYXggPSBfdGhpcyRwcm9wcy5tYXgsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy52YWx1ZSxcbiAgICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzLnRhYkluZGV4LFxuICAgICAgICAgIGFyaWFMYWJlbCA9IF90aGlzJHByb3BzLmFyaWFMYWJlbCxcbiAgICAgICAgICBhcmlhTGFiZWxsZWRCeSA9IF90aGlzJHByb3BzLmFyaWFMYWJlbGxlZEJ5LFxuICAgICAgICAgIGFyaWFWYWx1ZVRleHRGb3JtYXR0ZXIgPSBfdGhpcyRwcm9wcy5hcmlhVmFsdWVUZXh0Rm9ybWF0dGVyLFxuICAgICAgICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF90aGlzJHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJ2ZXJ0aWNhbFwiLCBcInJldmVyc2VcIiwgXCJvZmZzZXRcIiwgXCJzdHlsZVwiLCBcImRpc2FibGVkXCIsIFwibWluXCIsIFwibWF4XCIsIFwidmFsdWVcIiwgXCJ0YWJJbmRleFwiLCBcImFyaWFMYWJlbFwiLCBcImFyaWFMYWJlbGxlZEJ5XCIsIFwiYXJpYVZhbHVlVGV4dEZvcm1hdHRlclwiXSk7XG4gICAgICB2YXIgY2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHRoaXMucHJvcHMuY2xhc3NOYW1lLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGUtY2xpY2stZm9jdXNlZFwiKSwgdGhpcy5zdGF0ZS5jbGlja0ZvY3VzZWQpKTtcbiAgICAgIHZhciBwb3NpdGlvblN0eWxlID0gdmVydGljYWwgPyAoX3JlZiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmLCByZXZlcnNlID8gJ3RvcCcgOiAnYm90dG9tJywgXCJcIi5jb25jYXQob2Zmc2V0LCBcIiVcIikpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmLCByZXZlcnNlID8gJ2JvdHRvbScgOiAndG9wJywgJ2F1dG8nKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX3JlZiwgXCJ0cmFuc2Zvcm1cIiwgcmV2ZXJzZSA/IG51bGwgOiBcInRyYW5zbGF0ZVkoKzUwJSlcIiksIF9yZWYpIDogKF9yZWYyID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYyLCByZXZlcnNlID8gJ3JpZ2h0JyA6ICdsZWZ0JywgXCJcIi5jb25jYXQob2Zmc2V0LCBcIiVcIikpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgcmV2ZXJzZSA/ICdsZWZ0JyA6ICdyaWdodCcsICdhdXRvJyksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9yZWYyLCBcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZVgoXCIuY29uY2F0KHJldmVyc2UgPyAnKycgOiAnLScsIFwiNTAlKVwiKSksIF9yZWYyKTtcbiAgICAgIHZhciBlbFN0eWxlID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc3R5bGUpLCBwb3NpdGlvblN0eWxlKTtcbiAgICAgIHZhciBtZXJnZWRUYWJJbmRleCA9IHRhYkluZGV4IHx8IDA7XG5cbiAgICAgIGlmIChkaXNhYmxlZCB8fCB0YWJJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICBtZXJnZWRUYWJJbmRleCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBhcmlhVmFsdWVUZXh0O1xuXG4gICAgICBpZiAoYXJpYVZhbHVlVGV4dEZvcm1hdHRlcikge1xuICAgICAgICBhcmlhVmFsdWVUZXh0ID0gYXJpYVZhbHVlVGV4dEZvcm1hdHRlcih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICByZWY6IHRoaXMuc2V0SGFuZGxlUmVmLFxuICAgICAgICB0YWJJbmRleDogbWVyZ2VkVGFiSW5kZXhcbiAgICAgIH0sIHJlc3RQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGU6IGVsU3R5bGUsXG4gICAgICAgIG9uQmx1cjogdGhpcy5oYW5kbGVCbHVyLFxuICAgICAgICBvbktleURvd246IHRoaXMuaGFuZGxlS2V5RG93bixcbiAgICAgICAgb25Nb3VzZURvd246IHRoaXMuaGFuZGxlTW91c2VEb3duLFxuICAgICAgICAvLyBhcmlhIGF0dHJpYnV0ZVxuICAgICAgICByb2xlOiBcInNsaWRlclwiLFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogbWluLFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogbWF4LFxuICAgICAgICBcImFyaWEtdmFsdWVub3dcIjogdmFsdWUsXG4gICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiAhIWRpc2FibGVkLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogYXJpYUxhYmVsLFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiBhcmlhTGFiZWxsZWRCeSxcbiAgICAgICAgXCJhcmlhLXZhbHVldGV4dFwiOiBhcmlhVmFsdWVUZXh0XG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBIYW5kbGU7XG59KF9yZWFjdC5kZWZhdWx0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEhhbmRsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3NoYWxsb3dlcXVhbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInNoYWxsb3dlcXVhbFwiKSk7XG5cbnZhciBfVHJhY2sgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NvbW1vbi9UcmFja1wiKSk7XG5cbnZhciBfY3JlYXRlU2xpZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb21tb24vY3JlYXRlU2xpZGVyXCIpKTtcblxudmFyIHV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vdXRpbHNcIikpO1xuXG52YXIgX3RyaW1BbGlnblZhbHVlID0gZnVuY3Rpb24gdHJpbUFsaWduVmFsdWUoX3JlZikge1xuICB2YXIgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgaGFuZGxlID0gX3JlZi5oYW5kbGUsXG4gICAgICBib3VuZHMgPSBfcmVmLmJvdW5kcyxcbiAgICAgIHByb3BzID0gX3JlZi5wcm9wcztcbiAgdmFyIGFsbG93Q3Jvc3MgPSBwcm9wcy5hbGxvd0Nyb3NzLFxuICAgICAgcHVzaGFibGUgPSBwcm9wcy5wdXNoYWJsZTtcbiAgdmFyIHRoZXJzaG9sZCA9IE51bWJlcihwdXNoYWJsZSk7XG4gIHZhciB2YWxJblJhbmdlID0gdXRpbHMuZW5zdXJlVmFsdWVJblJhbmdlKHZhbHVlLCBwcm9wcyk7XG4gIHZhciB2YWxOb3RDb25mbGljdCA9IHZhbEluUmFuZ2U7XG5cbiAgaWYgKCFhbGxvd0Nyb3NzICYmIGhhbmRsZSAhPSBudWxsICYmIGJvdW5kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGhhbmRsZSA+IDAgJiYgdmFsSW5SYW5nZSA8PSBib3VuZHNbaGFuZGxlIC0gMV0gKyB0aGVyc2hvbGQpIHtcbiAgICAgIHZhbE5vdENvbmZsaWN0ID0gYm91bmRzW2hhbmRsZSAtIDFdICsgdGhlcnNob2xkO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGUgPCBib3VuZHMubGVuZ3RoIC0gMSAmJiB2YWxJblJhbmdlID49IGJvdW5kc1toYW5kbGUgKyAxXSAtIHRoZXJzaG9sZCkge1xuICAgICAgdmFsTm90Q29uZmxpY3QgPSBib3VuZHNbaGFuZGxlICsgMV0gLSB0aGVyc2hvbGQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHV0aWxzLmVuc3VyZVZhbHVlUHJlY2lzaW9uKHZhbE5vdENvbmZsaWN0LCBwcm9wcyk7XG59O1xuXG52YXIgUmFuZ2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoUmFuZ2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShSYW5nZSk7XG5cbiAgZnVuY3Rpb24gUmFuZ2UocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBSYW5nZSk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfdGhpcy5vbkVuZCA9IGZ1bmN0aW9uIChmb3JjZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IF90aGlzLnN0YXRlLmhhbmRsZTtcblxuICAgICAgX3RoaXMucmVtb3ZlRG9jdW1lbnRFdmVudHMoKTtcblxuICAgICAgaWYgKGhhbmRsZSAhPT0gbnVsbCB8fCBmb3JjZSkge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkFmdGVyQ2hhbmdlKF90aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGhhbmRsZTogbnVsbFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciBjb3VudCA9IHByb3BzLmNvdW50LFxuICAgICAgICBtaW4gPSBwcm9wcy5taW4sXG4gICAgICAgIG1heCA9IHByb3BzLm1heDtcbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gQXJyYXkuYXBwbHkodm9pZCAwLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShBcnJheShjb3VudCArIDEpKSkubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtaW47XG4gICAgfSk7XG4gICAgdmFyIGRlZmF1bHRWYWx1ZSA9ICdkZWZhdWx0VmFsdWUnIGluIHByb3BzID8gcHJvcHMuZGVmYXVsdFZhbHVlIDogaW5pdGlhbFZhbHVlO1xuICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB2YXIgYm91bmRzID0gdmFsdWUubWFwKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICByZXR1cm4gX3RyaW1BbGlnblZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgIGhhbmRsZTogaSxcbiAgICAgICAgcHJvcHM6IHByb3BzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgcmVjZW50ID0gYm91bmRzWzBdID09PSBtYXggPyAwIDogYm91bmRzLmxlbmd0aCAtIDE7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBoYW5kbGU6IG51bGwsXG4gICAgICByZWNlbnQ6IHJlY2VudCxcbiAgICAgIGJvdW5kczogYm91bmRzXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFtMZWdhY3ldIFVzZWQgZm9yIGluaGVyaXQgb3RoZXIgY29tcG9uZW50LlxuICAgKiBJdCdzIGEgYmFkIGNvZGUgc3R5bGUgd2hpY2ggc2hvdWxkIGJlIHJlZmFjdG9yLlxuICAgKi9cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMsIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cblxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFJhbmdlLCBbe1xuICAgIGtleTogXCJjYWxjVmFsdWVCeVBvc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxjVmFsdWVCeVBvcyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbGNPZmZzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FsY09mZnNldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNhdmVIYW5kbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2F2ZUhhbmRsZShpbmRleCwgaCkge31cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVEb2N1bWVudEV2ZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVEb2N1bWVudEV2ZW50cygpIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICghKCd2YWx1ZScgaW4gdGhpcy5wcm9wcyB8fCAnbWluJyBpbiB0aGlzLnByb3BzIHx8ICdtYXgnIGluIHRoaXMucHJvcHMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMubWluID09PSBwcmV2UHJvcHMubWluICYmIHRoaXMucHJvcHMubWF4ID09PSBwcmV2UHJvcHMubWF4ICYmICgwLCBfc2hhbGxvd2VxdWFsLmRlZmF1bHQpKHRoaXMucHJvcHMudmFsdWUsIHByZXZQcm9wcy52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIG9uQ2hhbmdlID0gX3RoaXMkcHJvcHMub25DaGFuZ2UsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy52YWx1ZTtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZSB8fCBwcmV2U3RhdGUuYm91bmRzO1xuXG4gICAgICBpZiAoY3VycmVudFZhbHVlLnNvbWUoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLmlzVmFsdWVPdXRPZlJhbmdlKHYsIF90aGlzMi5wcm9wcyk7XG4gICAgICB9KSkge1xuICAgICAgICB2YXIgbmV3VmFsdWVzID0gY3VycmVudFZhbHVlLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICAgIHJldHVybiB1dGlscy5lbnN1cmVWYWx1ZUluUmFuZ2UodiwgX3RoaXMyLnByb3BzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9uQ2hhbmdlKG5ld1ZhbHVlcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uQ2hhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlKHN0YXRlKSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgdmFyIGlzTm90Q29udHJvbGxlZCA9ICEoJ3ZhbHVlJyBpbiBwcm9wcyk7XG5cbiAgICAgIGlmIChpc05vdENvbnRyb2xsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY29udHJvbGxlZFN0YXRlID0ge307XG4gICAgICAgIFsnaGFuZGxlJywgJ3JlY2VudCddLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICBpZiAoc3RhdGVbaXRlbV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udHJvbGxlZFN0YXRlW2l0ZW1dID0gc3RhdGVbaXRlbV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29udHJvbGxlZFN0YXRlKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnRyb2xsZWRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRhdGEgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCB0aGlzLnN0YXRlKSwgc3RhdGUpO1xuICAgICAgdmFyIGNoYW5nZWRWYWx1ZSA9IGRhdGEuYm91bmRzO1xuICAgICAgcHJvcHMub25DaGFuZ2UoY2hhbmdlZFZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25TdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblN0YXJ0KHBvc2l0aW9uKSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgIHZhciBib3VuZHMgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICBwcm9wcy5vbkJlZm9yZUNoYW5nZShib3VuZHMpO1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5jYWxjVmFsdWVCeVBvcyhwb3NpdGlvbik7XG4gICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgdmFyIGNsb3Nlc3RCb3VuZCA9IHRoaXMuZ2V0Q2xvc2VzdEJvdW5kKHZhbHVlKTtcbiAgICAgIHRoaXMucHJldk1vdmVkSGFuZGxlSW5kZXggPSB0aGlzLmdldEJvdW5kTmVlZE1vdmluZyh2YWx1ZSwgY2xvc2VzdEJvdW5kKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBoYW5kbGU6IHRoaXMucHJldk1vdmVkSGFuZGxlSW5kZXgsXG4gICAgICAgIHJlY2VudDogdGhpcy5wcmV2TW92ZWRIYW5kbGVJbmRleFxuICAgICAgfSk7XG4gICAgICB2YXIgcHJldlZhbHVlID0gYm91bmRzW3RoaXMucHJldk1vdmVkSGFuZGxlSW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwcmV2VmFsdWUpIHJldHVybjtcbiAgICAgIHZhciBuZXh0Qm91bmRzID0gKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoc3RhdGUuYm91bmRzKTtcbiAgICAgIG5leHRCb3VuZHNbdGhpcy5wcmV2TW92ZWRIYW5kbGVJbmRleF0gPSB2YWx1ZTtcbiAgICAgIHRoaXMub25DaGFuZ2Uoe1xuICAgICAgICBib3VuZHM6IG5leHRCb3VuZHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbk1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25Nb3ZlKGUsIHBvc2l0aW9uKSB7XG4gICAgICB1dGlscy5wYXVzZUV2ZW50KGUpO1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuY2FsY1ZhbHVlQnlQb3MocG9zaXRpb24pO1xuICAgICAgdmFyIG9sZFZhbHVlID0gc3RhdGUuYm91bmRzW3N0YXRlLmhhbmRsZV07XG4gICAgICBpZiAodmFsdWUgPT09IG9sZFZhbHVlKSByZXR1cm47XG4gICAgICB0aGlzLm1vdmVUbyh2YWx1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uS2V5Ym9hcmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25LZXlib2FyZChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICByZXZlcnNlID0gX3RoaXMkcHJvcHMyLnJldmVyc2UsXG4gICAgICAgICAgdmVydGljYWwgPSBfdGhpcyRwcm9wczIudmVydGljYWw7XG4gICAgICB2YXIgdmFsdWVNdXRhdG9yID0gdXRpbHMuZ2V0S2V5Ym9hcmRWYWx1ZU11dGF0b3IoZSwgdmVydGljYWwsIHJldmVyc2UpO1xuXG4gICAgICBpZiAodmFsdWVNdXRhdG9yKSB7XG4gICAgICAgIHV0aWxzLnBhdXNlRXZlbnQoZSk7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciBib3VuZHMgPSBzdGF0ZS5ib3VuZHMsXG4gICAgICAgICAgICBoYW5kbGUgPSBzdGF0ZS5oYW5kbGU7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IGJvdW5kc1toYW5kbGUgPT09IG51bGwgPyBzdGF0ZS5yZWNlbnQgOiBoYW5kbGVdO1xuICAgICAgICB2YXIgbXV0YXRlZFZhbHVlID0gdmFsdWVNdXRhdG9yKG9sZFZhbHVlLCBwcm9wcyk7XG5cbiAgICAgICAgdmFyIHZhbHVlID0gX3RyaW1BbGlnblZhbHVlKHtcbiAgICAgICAgICB2YWx1ZTogbXV0YXRlZFZhbHVlLFxuICAgICAgICAgIGhhbmRsZTogaGFuZGxlLFxuICAgICAgICAgIGJvdW5kczogc3RhdGUuYm91bmRzLFxuICAgICAgICAgIHByb3BzOiBwcm9wc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IG9sZFZhbHVlKSByZXR1cm47XG4gICAgICAgIHZhciBpc0Zyb21LZXlib2FyZEV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tb3ZlVG8odmFsdWUsIGlzRnJvbUtleWJvYXJkRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRWYWx1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmJvdW5kcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2xvc2VzdEJvdW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENsb3Nlc3RCb3VuZCh2YWx1ZSkge1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuc3RhdGUuYm91bmRzO1xuICAgICAgdmFyIGNsb3Nlc3RCb3VuZCA9IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYm91bmRzLmxlbmd0aCAtIDE7IGkgKz0gMSkge1xuICAgICAgICBpZiAodmFsdWUgPj0gYm91bmRzW2ldKSB7XG4gICAgICAgICAgY2xvc2VzdEJvdW5kID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoTWF0aC5hYnMoYm91bmRzW2Nsb3Nlc3RCb3VuZCArIDFdIC0gdmFsdWUpIDwgTWF0aC5hYnMoYm91bmRzW2Nsb3Nlc3RCb3VuZF0gLSB2YWx1ZSkpIHtcbiAgICAgICAgY2xvc2VzdEJvdW5kICs9IDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjbG9zZXN0Qm91bmQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJvdW5kTmVlZE1vdmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCb3VuZE5lZWRNb3ZpbmcodmFsdWUsIGNsb3Nlc3RCb3VuZCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBib3VuZHMgPSBfdGhpcyRzdGF0ZS5ib3VuZHMsXG4gICAgICAgICAgcmVjZW50ID0gX3RoaXMkc3RhdGUucmVjZW50O1xuICAgICAgdmFyIGJvdW5kTmVlZE1vdmluZyA9IGNsb3Nlc3RCb3VuZDtcbiAgICAgIHZhciBpc0F0VGhlU2FtZVBvaW50ID0gYm91bmRzW2Nsb3Nlc3RCb3VuZCArIDFdID09PSBib3VuZHNbY2xvc2VzdEJvdW5kXTtcblxuICAgICAgaWYgKGlzQXRUaGVTYW1lUG9pbnQgJiYgYm91bmRzW3JlY2VudF0gPT09IGJvdW5kc1tjbG9zZXN0Qm91bmRdKSB7XG4gICAgICAgIGJvdW5kTmVlZE1vdmluZyA9IHJlY2VudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXRUaGVTYW1lUG9pbnQgJiYgdmFsdWUgIT09IGJvdW5kc1tjbG9zZXN0Qm91bmQgKyAxXSkge1xuICAgICAgICBib3VuZE5lZWRNb3ZpbmcgPSB2YWx1ZSA8IGJvdW5kc1tjbG9zZXN0Qm91bmQgKyAxXSA/IGNsb3Nlc3RCb3VuZCA6IGNsb3Nlc3RCb3VuZCArIDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBib3VuZE5lZWRNb3Zpbmc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldExvd2VyQm91bmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TG93ZXJCb3VuZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmJvdW5kc1swXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VXBwZXJCb3VuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRVcHBlckJvdW5kKCkge1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuc3RhdGUuYm91bmRzO1xuICAgICAgcmV0dXJuIGJvdW5kc1tib3VuZHMubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcG9zc2libGUgc2xpZGVyIHBvaW50cywgdGFraW5nIGludG8gYWNjb3VudCBib3RoXG4gICAgICogYG1hcmtzYCBhbmQgYHN0ZXBgLiBUaGUgcmVzdWx0IGlzIGNhY2hlZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFBvaW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb2ludHMoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBtYXJrcyA9IF90aGlzJHByb3BzMy5tYXJrcyxcbiAgICAgICAgICBzdGVwID0gX3RoaXMkcHJvcHMzLnN0ZXAsXG4gICAgICAgICAgbWluID0gX3RoaXMkcHJvcHMzLm1pbixcbiAgICAgICAgICBtYXggPSBfdGhpcyRwcm9wczMubWF4O1xuICAgICAgdmFyIGNhY2hlID0gdGhpcy5pbnRlcm5hbFBvaW50c0NhY2hlO1xuXG4gICAgICBpZiAoIWNhY2hlIHx8IGNhY2hlLm1hcmtzICE9PSBtYXJrcyB8fCBjYWNoZS5zdGVwICE9PSBzdGVwKSB7XG4gICAgICAgIHZhciBwb2ludHNPYmplY3QgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIG1hcmtzKTtcblxuICAgICAgICBpZiAoc3RlcCAhPT0gbnVsbCkge1xuICAgICAgICAgIGZvciAodmFyIHBvaW50ID0gbWluOyBwb2ludCA8PSBtYXg7IHBvaW50ICs9IHN0ZXApIHtcbiAgICAgICAgICAgIHBvaW50c09iamVjdFtwb2ludF0gPSBwb2ludDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9pbnRzID0gT2JqZWN0LmtleXMocG9pbnRzT2JqZWN0KS5tYXAocGFyc2VGbG9hdCk7XG4gICAgICAgIHBvaW50cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGEgLSBiO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFBvaW50c0NhY2hlID0ge1xuICAgICAgICAgIG1hcmtzOiBtYXJrcyxcbiAgICAgICAgICBzdGVwOiBzdGVwLFxuICAgICAgICAgIHBvaW50czogcG9pbnRzXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmludGVybmFsUG9pbnRzQ2FjaGUucG9pbnRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtb3ZlVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZVRvKHZhbHVlLCBpc0Zyb21LZXlib2FyZEV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgbmV4dEJvdW5kcyA9ICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHN0YXRlLmJvdW5kcyk7XG4gICAgICB2YXIgaGFuZGxlID0gc3RhdGUuaGFuZGxlID09PSBudWxsID8gc3RhdGUucmVjZW50IDogc3RhdGUuaGFuZGxlO1xuICAgICAgbmV4dEJvdW5kc1toYW5kbGVdID0gdmFsdWU7XG4gICAgICB2YXIgbmV4dEhhbmRsZSA9IGhhbmRsZTtcblxuICAgICAgaWYgKHByb3BzLnB1c2hhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnB1c2hTdXJyb3VuZGluZ0hhbmRsZXMobmV4dEJvdW5kcywgbmV4dEhhbmRsZSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BzLmFsbG93Q3Jvc3MpIHtcbiAgICAgICAgbmV4dEJvdW5kcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGEgLSBiO1xuICAgICAgICB9KTtcbiAgICAgICAgbmV4dEhhbmRsZSA9IG5leHRCb3VuZHMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMub25DaGFuZ2Uoe1xuICAgICAgICByZWNlbnQ6IG5leHRIYW5kbGUsXG4gICAgICAgIGhhbmRsZTogbmV4dEhhbmRsZSxcbiAgICAgICAgYm91bmRzOiBuZXh0Qm91bmRzXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzRnJvbUtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgLy8ga25vd24gcHJvYmxlbTogYmVjYXVzZSBzZXRTdGF0ZSBpcyBhc3luYyxcbiAgICAgICAgLy8gc28gdHJpZ2dlciBmb2N1cyB3aWxsIGludm9rZSBoYW5kbGVyJ3Mgb25FbmQgYW5kIGFub3RoZXIgaGFuZGxlcidzIG9uU3RhcnQgdG9vIGVhcmx5LFxuICAgICAgICAvLyBjYXVzZSBvbkJlZm9yZUNoYW5nZSBhbmQgb25BZnRlckNoYW5nZSByZWNlaXZlIHdyb25nIHZhbHVlLlxuICAgICAgICAvLyBoZXJlIHVzZSBzZXRTdGF0ZSBjYWxsYmFjayB0byBoYWNr77yMYnV0IG5vdCBlbGVnYW50XG4gICAgICAgIHRoaXMucHJvcHMub25BZnRlckNoYW5nZShuZXh0Qm91bmRzKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7fSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMy5oYW5kbGVzUmVmc1tuZXh0SGFuZGxlXS5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbkVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwdXNoU3Vycm91bmRpbmdIYW5kbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHB1c2hTdXJyb3VuZGluZ0hhbmRsZXMoYm91bmRzLCBoYW5kbGUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGJvdW5kc1toYW5kbGVdO1xuICAgICAgdmFyIHB1c2hhYmxlID0gdGhpcy5wcm9wcy5wdXNoYWJsZTtcbiAgICAgIHZhciB0aHJlc2hvbGQgPSBOdW1iZXIocHVzaGFibGUpO1xuICAgICAgdmFyIGRpcmVjdGlvbiA9IDA7XG5cbiAgICAgIGlmIChib3VuZHNbaGFuZGxlICsgMV0gLSB2YWx1ZSA8IHRocmVzaG9sZCkge1xuICAgICAgICBkaXJlY3Rpb24gPSArMTsgLy8gcHVzaCB0byByaWdodFxuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgLSBib3VuZHNbaGFuZGxlIC0gMV0gPCB0aHJlc2hvbGQpIHtcbiAgICAgICAgZGlyZWN0aW9uID0gLTE7IC8vIHB1c2ggdG8gbGVmdFxuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG5leHRIYW5kbGUgPSBoYW5kbGUgKyBkaXJlY3Rpb247XG4gICAgICB2YXIgZGlmZlRvTmV4dCA9IGRpcmVjdGlvbiAqIChib3VuZHNbbmV4dEhhbmRsZV0gLSB2YWx1ZSk7XG5cbiAgICAgIGlmICghdGhpcy5wdXNoSGFuZGxlKGJvdW5kcywgbmV4dEhhbmRsZSwgZGlyZWN0aW9uLCB0aHJlc2hvbGQgLSBkaWZmVG9OZXh0KSkge1xuICAgICAgICAvLyByZXZlcnQgdG8gb3JpZ2luYWwgdmFsdWUgaWYgcHVzaGluZyBpcyBpbXBvc3NpYmxlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBib3VuZHNbaGFuZGxlXSA9IGJvdW5kc1tuZXh0SGFuZGxlXSAtIGRpcmVjdGlvbiAqIHRocmVzaG9sZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHVzaEhhbmRsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoSGFuZGxlKGJvdW5kcywgaGFuZGxlLCBkaXJlY3Rpb24sIGFtb3VudCkge1xuICAgICAgdmFyIG9yaWdpbmFsVmFsdWUgPSBib3VuZHNbaGFuZGxlXTtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBib3VuZHNbaGFuZGxlXTtcblxuICAgICAgd2hpbGUgKGRpcmVjdGlvbiAqIChjdXJyZW50VmFsdWUgLSBvcmlnaW5hbFZhbHVlKSA8IGFtb3VudCkge1xuICAgICAgICBpZiAoIXRoaXMucHVzaEhhbmRsZU9uZVBvaW50KGJvdW5kcywgaGFuZGxlLCBkaXJlY3Rpb24pKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgcHVzaCBoYW5kbGUgZW5vdWdoIHRvIGNyZWF0ZSB0aGUgbmVlZGVkIGBhbW91bnRgIGdhcCwgc28gd2VcbiAgICAgICAgICAvLyByZXZlcnQgaXRzIHBvc2l0aW9uIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgIGJvdW5kc1toYW5kbGVdID0gb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VmFsdWUgPSBib3VuZHNbaGFuZGxlXTtcbiAgICAgIH0gLy8gdGhlIGhhbmRsZSB3YXMgcHVzaGVkIGVub3VnaCB0byBjcmVhdGUgdGhlIG5lZWRlZCBgYW1vdW50YCBnYXBcblxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHVzaEhhbmRsZU9uZVBvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHB1c2hIYW5kbGVPbmVQb2ludChib3VuZHMsIGhhbmRsZSwgZGlyZWN0aW9uKSB7XG4gICAgICB2YXIgcG9pbnRzID0gdGhpcy5nZXRQb2ludHMoKTtcbiAgICAgIHZhciBwb2ludEluZGV4ID0gcG9pbnRzLmluZGV4T2YoYm91bmRzW2hhbmRsZV0pO1xuICAgICAgdmFyIG5leHRQb2ludEluZGV4ID0gcG9pbnRJbmRleCArIGRpcmVjdGlvbjtcblxuICAgICAgaWYgKG5leHRQb2ludEluZGV4ID49IHBvaW50cy5sZW5ndGggfHwgbmV4dFBvaW50SW5kZXggPCAwKSB7XG4gICAgICAgIC8vIHJlYWNoZWQgdGhlIG1pbmltdW0gb3IgbWF4aW11bSBhdmFpbGFibGUgcG9pbnQsIGNhbid0IHB1c2ggYW55bW9yZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0SGFuZGxlID0gaGFuZGxlICsgZGlyZWN0aW9uO1xuICAgICAgdmFyIG5leHRWYWx1ZSA9IHBvaW50c1tuZXh0UG9pbnRJbmRleF07XG4gICAgICB2YXIgcHVzaGFibGUgPSB0aGlzLnByb3BzLnB1c2hhYmxlO1xuICAgICAgdmFyIHRocmVzaG9sZCA9IE51bWJlcihwdXNoYWJsZSk7XG4gICAgICB2YXIgZGlmZlRvTmV4dCA9IGRpcmVjdGlvbiAqIChib3VuZHNbbmV4dEhhbmRsZV0gLSBuZXh0VmFsdWUpO1xuXG4gICAgICBpZiAoIXRoaXMucHVzaEhhbmRsZShib3VuZHMsIG5leHRIYW5kbGUsIGRpcmVjdGlvbiwgdGhyZXNob2xkIC0gZGlmZlRvTmV4dCkpIHtcbiAgICAgICAgLy8gY291bGRuJ3QgcHVzaCBuZXh0IGhhbmRsZSwgc28gd2Ugd29uJ3QgcHVzaCB0aGlzIG9uZSBlaXRoZXJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBwdXNoIHRoZSBoYW5kbGVcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXG5cbiAgICAgIGJvdW5kc1toYW5kbGVdID0gbmV4dFZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRyaW1BbGlnblZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyaW1BbGlnblZhbHVlKHZhbHVlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBoYW5kbGUgPSBfdGhpcyRzdGF0ZTIuaGFuZGxlLFxuICAgICAgICAgIGJvdW5kcyA9IF90aGlzJHN0YXRlMi5ib3VuZHM7XG4gICAgICByZXR1cm4gX3RyaW1BbGlnblZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBoYW5kbGU6IGhhbmRsZSxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIHByb3BzOiB0aGlzLnByb3BzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkc3RhdGUzID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBoYW5kbGUgPSBfdGhpcyRzdGF0ZTMuaGFuZGxlLFxuICAgICAgICAgIGJvdW5kcyA9IF90aGlzJHN0YXRlMy5ib3VuZHM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczQucHJlZml4Q2xzLFxuICAgICAgICAgIHZlcnRpY2FsID0gX3RoaXMkcHJvcHM0LnZlcnRpY2FsLFxuICAgICAgICAgIGluY2x1ZGVkID0gX3RoaXMkcHJvcHM0LmluY2x1ZGVkLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHM0LmRpc2FibGVkLFxuICAgICAgICAgIG1pbiA9IF90aGlzJHByb3BzNC5taW4sXG4gICAgICAgICAgbWF4ID0gX3RoaXMkcHJvcHM0Lm1heCxcbiAgICAgICAgICByZXZlcnNlID0gX3RoaXMkcHJvcHM0LnJldmVyc2UsXG4gICAgICAgICAgaGFuZGxlR2VuZXJhdG9yID0gX3RoaXMkcHJvcHM0LmhhbmRsZSxcbiAgICAgICAgICB0cmFja1N0eWxlID0gX3RoaXMkcHJvcHM0LnRyYWNrU3R5bGUsXG4gICAgICAgICAgaGFuZGxlU3R5bGUgPSBfdGhpcyRwcm9wczQuaGFuZGxlU3R5bGUsXG4gICAgICAgICAgdGFiSW5kZXggPSBfdGhpcyRwcm9wczQudGFiSW5kZXgsXG4gICAgICAgICAgYXJpYUxhYmVsR3JvdXBGb3JIYW5kbGVzID0gX3RoaXMkcHJvcHM0LmFyaWFMYWJlbEdyb3VwRm9ySGFuZGxlcyxcbiAgICAgICAgICBhcmlhTGFiZWxsZWRCeUdyb3VwRm9ySGFuZGxlcyA9IF90aGlzJHByb3BzNC5hcmlhTGFiZWxsZWRCeUdyb3VwRm9ySGFuZGxlcyxcbiAgICAgICAgICBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyR3JvdXBGb3JIYW5kbGVzID0gX3RoaXMkcHJvcHM0LmFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJHcm91cEZvckhhbmRsZXM7XG4gICAgICB2YXIgb2Zmc2V0cyA9IGJvdW5kcy5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzNC5jYWxjT2Zmc2V0KHYpO1xuICAgICAgfSk7XG4gICAgICB2YXIgaGFuZGxlQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGVcIik7XG4gICAgICB2YXIgaGFuZGxlcyA9IGJvdW5kcy5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICAgIHZhciBtZXJnZWRUYWJJbmRleCA9IHRhYkluZGV4W2ldIHx8IDA7XG5cbiAgICAgICAgaWYgKGRpc2FibGVkIHx8IHRhYkluZGV4W2ldID09PSBudWxsKSB7XG4gICAgICAgICAgbWVyZ2VkVGFiSW5kZXggPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRyYWdnaW5nID0gaGFuZGxlID09PSBpO1xuICAgICAgICByZXR1cm4gaGFuZGxlR2VuZXJhdG9yKHtcbiAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KSgoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIGhhbmRsZUNsYXNzTmFtZSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChoYW5kbGVDbGFzc05hbWUsIFwiLVwiKS5jb25jYXQoaSArIDEpLCB0cnVlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGhhbmRsZUNsYXNzTmFtZSwgXCItZHJhZ2dpbmdcIiksIGRyYWdnaW5nKSwgX2NsYXNzTmFtZXMpKSxcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICB2ZXJ0aWNhbDogdmVydGljYWwsXG4gICAgICAgICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0c1tpXSxcbiAgICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0YWJJbmRleDogbWVyZ2VkVGFiSW5kZXgsXG4gICAgICAgICAgbWluOiBtaW4sXG4gICAgICAgICAgbWF4OiBtYXgsXG4gICAgICAgICAgcmV2ZXJzZTogcmV2ZXJzZSxcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgc3R5bGU6IGhhbmRsZVN0eWxlW2ldLFxuICAgICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKGgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczQuc2F2ZUhhbmRsZShpLCBoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFyaWFMYWJlbDogYXJpYUxhYmVsR3JvdXBGb3JIYW5kbGVzW2ldLFxuICAgICAgICAgIGFyaWFMYWJlbGxlZEJ5OiBhcmlhTGFiZWxsZWRCeUdyb3VwRm9ySGFuZGxlc1tpXSxcbiAgICAgICAgICBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyOiBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyR3JvdXBGb3JIYW5kbGVzW2ldXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB2YXIgdHJhY2tzID0gYm91bmRzLnNsaWNlKDAsIC0xKS5tYXAoZnVuY3Rpb24gKF8sIGluZGV4KSB7XG4gICAgICAgIHZhciBfY2xhc3NOYW1lczI7XG5cbiAgICAgICAgdmFyIGkgPSBpbmRleCArIDE7XG4gICAgICAgIHZhciB0cmFja0NsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KSgoX2NsYXNzTmFtZXMyID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmFja1wiKSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmFjay1cIikuY29uY2F0KGkpLCB0cnVlKSwgX2NsYXNzTmFtZXMyKSk7XG4gICAgICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9UcmFjay5kZWZhdWx0LCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiB0cmFja0NsYXNzTmFtZSxcbiAgICAgICAgICB2ZXJ0aWNhbDogdmVydGljYWwsXG4gICAgICAgICAgcmV2ZXJzZTogcmV2ZXJzZSxcbiAgICAgICAgICBpbmNsdWRlZDogaW5jbHVkZWQsXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXRzW2kgLSAxXSxcbiAgICAgICAgICBsZW5ndGg6IG9mZnNldHNbaV0gLSBvZmZzZXRzW2kgLSAxXSxcbiAgICAgICAgICBzdHlsZTogdHJhY2tTdHlsZVtpbmRleF0sXG4gICAgICAgICAga2V5OiBpXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFja3M6IHRyYWNrcyxcbiAgICAgICAgaGFuZGxlczogaGFuZGxlc1xuICAgICAgfTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgICAgaWYgKCd2YWx1ZScgaW4gcHJvcHMgfHwgJ21pbicgaW4gcHJvcHMgfHwgJ21heCcgaW4gcHJvcHMpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWUgfHwgc3RhdGUuYm91bmRzO1xuICAgICAgICB2YXIgbmV4dEJvdW5kcyA9IHZhbHVlLm1hcChmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICAgIHJldHVybiBfdHJpbUFsaWduVmFsdWUoe1xuICAgICAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgICAgICBoYW5kbGU6IGksXG4gICAgICAgICAgICBib3VuZHM6IHN0YXRlLmJvdW5kcyxcbiAgICAgICAgICAgIHByb3BzOiBwcm9wc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmV4dEJvdW5kcy5sZW5ndGggPT09IHN0YXRlLmJvdW5kcy5sZW5ndGggJiYgbmV4dEJvdW5kcy5ldmVyeShmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICAgIHJldHVybiB2ID09PSBzdGF0ZS5ib3VuZHNbaV07XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICAgIGJvdW5kczogbmV4dEJvdW5kc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBSYW5nZTtcbn0oX3JlYWN0LmRlZmF1bHQuQ29tcG9uZW50KTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxuXG5SYW5nZS5kaXNwbGF5TmFtZSA9ICdSYW5nZSc7XG5SYW5nZS5kZWZhdWx0UHJvcHMgPSB7XG4gIGNvdW50OiAxLFxuICBhbGxvd0Nyb3NzOiB0cnVlLFxuICBwdXNoYWJsZTogZmFsc2UsXG4gIHRhYkluZGV4OiBbXSxcbiAgYXJpYUxhYmVsR3JvdXBGb3JIYW5kbGVzOiBbXSxcbiAgYXJpYUxhYmVsbGVkQnlHcm91cEZvckhhbmRsZXM6IFtdLFxuICBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyR3JvdXBGb3JIYW5kbGVzOiBbXVxufTtcblxudmFyIF9kZWZhdWx0ID0gKDAsIF9jcmVhdGVTbGlkZXIuZGVmYXVsdCkoUmFuZ2UpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuXG52YXIgX1RyYWNrID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb21tb24vVHJhY2tcIikpO1xuXG52YXIgX2NyZWF0ZVNsaWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY29tbW9uL2NyZWF0ZVNsaWRlclwiKSk7XG5cbnZhciB1dGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL3V0aWxzXCIpKTtcblxudmFyIFNsaWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShTbGlkZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShTbGlkZXIpO1xuXG4gIC8qIGVzbGludC1lbmFibGUgKi9cbiAgZnVuY3Rpb24gU2xpZGVyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgU2xpZGVyKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF90aGlzLm9uRW5kID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gICAgICB2YXIgZHJhZ2dpbmcgPSBfdGhpcy5zdGF0ZS5kcmFnZ2luZztcblxuICAgICAgX3RoaXMucmVtb3ZlRG9jdW1lbnRFdmVudHMoKTtcblxuICAgICAgaWYgKGRyYWdnaW5nIHx8IGZvcmNlKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uQWZ0ZXJDaGFuZ2UoX3RoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gcHJvcHMuZGVmYXVsdFZhbHVlIDogcHJvcHMubWluO1xuICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHZhbHVlOiBfdGhpcy50cmltQWxpZ25WYWx1ZSh2YWx1ZSksXG4gICAgICBkcmFnZ2luZzogZmFsc2VcbiAgICB9O1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KSghKCdtaW5pbXVtVHJhY2tTdHlsZScgaW4gcHJvcHMpLCAnbWluaW11bVRyYWNrU3R5bGUgd2lsbCBiZSBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIHRyYWNrU3R5bGUgaW5zdGVhZC4nKTtcbiAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoISgnbWF4aW11bVRyYWNrU3R5bGUnIGluIHByb3BzKSwgJ21heGltdW1UcmFja1N0eWxlIHdpbGwgYmUgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSByYWlsU3R5bGUgaW5zdGVhZC4nKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFtMZWdhY3ldIFVzZWQgZm9yIGluaGVyaXQgb3RoZXIgY29tcG9uZW50LlxuICAgKiBJdCdzIGEgYmFkIGNvZGUgc3R5bGUgd2hpY2ggc2hvdWxkIGJlIHJlZmFjdG9yLlxuICAgKi9cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMsIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cblxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFNsaWRlciwgW3tcbiAgICBrZXk6IFwiY2FsY1ZhbHVlQnlQb3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FsY1ZhbHVlQnlQb3ModmFsdWUpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjYWxjT2Zmc2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGNPZmZzZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzYXZlSGFuZGxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNhdmVIYW5kbGUoaW5kZXgsIGgpIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlRG9jdW1lbnRFdmVudHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRG9jdW1lbnRFdmVudHMoKSB7fVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoXywgcHJldlN0YXRlKSB7XG4gICAgICBpZiAoISgndmFsdWUnIGluIHRoaXMucHJvcHMgfHwgJ21pbicgaW4gdGhpcy5wcm9wcyB8fCAnbWF4JyBpbiB0aGlzLnByb3BzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy52YWx1ZSxcbiAgICAgICAgICBvbkNoYW5nZSA9IF90aGlzJHByb3BzLm9uQ2hhbmdlO1xuICAgICAgdmFyIHRoZVZhbHVlID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogcHJldlN0YXRlLnZhbHVlO1xuICAgICAgdmFyIG5leHRWYWx1ZSA9IHRoaXMudHJpbUFsaWduVmFsdWUodGhlVmFsdWUsIHRoaXMucHJvcHMpO1xuXG4gICAgICBpZiAobmV4dFZhbHVlICE9PSBwcmV2U3RhdGUudmFsdWUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHZhbHVlOiBuZXh0VmFsdWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzVmFsdWVPdXRPZlJhbmdlKHRoZVZhbHVlLCB0aGlzLnByb3BzKSkge1xuICAgICAgICAgIG9uQ2hhbmdlKG5leHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25DaGFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2Uoc3RhdGUpIHtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgaXNOb3RDb250cm9sbGVkID0gISgndmFsdWUnIGluIHByb3BzKTtcbiAgICAgIHZhciBuZXh0U3RhdGUgPSBzdGF0ZS52YWx1ZSA+IHRoaXMucHJvcHMubWF4ID8gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICB2YWx1ZTogdGhpcy5wcm9wcy5tYXhcbiAgICAgIH0pIDogc3RhdGU7XG5cbiAgICAgIGlmIChpc05vdENvbnRyb2xsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXh0U3RhdGUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hhbmdlZFZhbHVlID0gbmV4dFN0YXRlLnZhbHVlO1xuICAgICAgcHJvcHMub25DaGFuZ2UoY2hhbmdlZFZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25TdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblN0YXJ0KHBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBwcmV2VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICBwcm9wcy5vbkJlZm9yZUNoYW5nZShwcmV2VmFsdWUpO1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5jYWxjVmFsdWVCeVBvcyhwb3NpdGlvbik7XG4gICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgaWYgKHZhbHVlID09PSBwcmV2VmFsdWUpIHJldHVybjtcbiAgICAgIHRoaXMucHJldk1vdmVkSGFuZGxlSW5kZXggPSAwO1xuICAgICAgdGhpcy5vbkNoYW5nZSh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uTW92ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbk1vdmUoZSwgcG9zaXRpb24pIHtcbiAgICAgIHV0aWxzLnBhdXNlRXZlbnQoZSk7XG4gICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5jYWxjVmFsdWVCeVBvcyhwb3NpdGlvbik7XG4gICAgICBpZiAodmFsdWUgPT09IG9sZFZhbHVlKSByZXR1cm47XG4gICAgICB0aGlzLm9uQ2hhbmdlKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25LZXlib2FyZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbktleWJvYXJkKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHJldmVyc2UgPSBfdGhpcyRwcm9wczIucmV2ZXJzZSxcbiAgICAgICAgICB2ZXJ0aWNhbCA9IF90aGlzJHByb3BzMi52ZXJ0aWNhbDtcbiAgICAgIHZhciB2YWx1ZU11dGF0b3IgPSB1dGlscy5nZXRLZXlib2FyZFZhbHVlTXV0YXRvcihlLCB2ZXJ0aWNhbCwgcmV2ZXJzZSk7XG5cbiAgICAgIGlmICh2YWx1ZU11dGF0b3IpIHtcbiAgICAgICAgdXRpbHMucGF1c2VFdmVudChlKTtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgICAgIHZhciBtdXRhdGVkVmFsdWUgPSB2YWx1ZU11dGF0b3Iob2xkVmFsdWUsIHRoaXMucHJvcHMpO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnRyaW1BbGlnblZhbHVlKG11dGF0ZWRWYWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gb2xkVmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb3BzLm9uQWZ0ZXJDaGFuZ2UodmFsdWUpO1xuICAgICAgICB0aGlzLm9uRW5kKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldExvd2VyQm91bmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TG93ZXJCb3VuZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLm1pbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VXBwZXJCb3VuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRVcHBlckJvdW5kKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRyaW1BbGlnblZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyaW1BbGlnblZhbHVlKHYpIHtcbiAgICAgIHZhciBuZXh0UHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgICBpZiAodiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIG1lcmdlZFByb3BzID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgdGhpcy5wcm9wcyksIG5leHRQcm9wcyk7XG4gICAgICB2YXIgdmFsID0gdXRpbHMuZW5zdXJlVmFsdWVJblJhbmdlKHYsIG1lcmdlZFByb3BzKTtcbiAgICAgIHJldHVybiB1dGlscy5lbnN1cmVWYWx1ZVByZWNpc2lvbih2YWwsIG1lcmdlZFByb3BzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczMucHJlZml4Q2xzLFxuICAgICAgICAgIHZlcnRpY2FsID0gX3RoaXMkcHJvcHMzLnZlcnRpY2FsLFxuICAgICAgICAgIGluY2x1ZGVkID0gX3RoaXMkcHJvcHMzLmluY2x1ZGVkLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMzLmRpc2FibGVkLFxuICAgICAgICAgIG1pbmltdW1UcmFja1N0eWxlID0gX3RoaXMkcHJvcHMzLm1pbmltdW1UcmFja1N0eWxlLFxuICAgICAgICAgIHRyYWNrU3R5bGUgPSBfdGhpcyRwcm9wczMudHJhY2tTdHlsZSxcbiAgICAgICAgICBoYW5kbGVTdHlsZSA9IF90aGlzJHByb3BzMy5oYW5kbGVTdHlsZSxcbiAgICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzMy50YWJJbmRleCxcbiAgICAgICAgICBhcmlhTGFiZWxGb3JIYW5kbGUgPSBfdGhpcyRwcm9wczMuYXJpYUxhYmVsRm9ySGFuZGxlLFxuICAgICAgICAgIGFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlID0gX3RoaXMkcHJvcHMzLmFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLFxuICAgICAgICAgIGFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJGb3JIYW5kbGUgPSBfdGhpcyRwcm9wczMuYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZSxcbiAgICAgICAgICBtaW4gPSBfdGhpcyRwcm9wczMubWluLFxuICAgICAgICAgIG1heCA9IF90aGlzJHByb3BzMy5tYXgsXG4gICAgICAgICAgc3RhcnRQb2ludCA9IF90aGlzJHByb3BzMy5zdGFydFBvaW50LFxuICAgICAgICAgIHJldmVyc2UgPSBfdGhpcyRwcm9wczMucmV2ZXJzZSxcbiAgICAgICAgICBoYW5kbGVHZW5lcmF0b3IgPSBfdGhpcyRwcm9wczMuaGFuZGxlO1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHN0YXRlLnZhbHVlLFxuICAgICAgICAgIGRyYWdnaW5nID0gX3RoaXMkc3RhdGUuZHJhZ2dpbmc7XG4gICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5jYWxjT2Zmc2V0KHZhbHVlKTtcbiAgICAgIHZhciBoYW5kbGUgPSBoYW5kbGVHZW5lcmF0b3Ioe1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlXCIpLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgdmVydGljYWw6IHZlcnRpY2FsLFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBkcmFnZ2luZzogZHJhZ2dpbmcsXG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgbWluOiBtaW4sXG4gICAgICAgIG1heDogbWF4LFxuICAgICAgICByZXZlcnNlOiByZXZlcnNlLFxuICAgICAgICBpbmRleDogMCxcbiAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgICBhcmlhTGFiZWw6IGFyaWFMYWJlbEZvckhhbmRsZSxcbiAgICAgICAgYXJpYUxhYmVsbGVkQnk6IGFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLFxuICAgICAgICBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyOiBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyRm9ySGFuZGxlLFxuICAgICAgICBzdHlsZTogaGFuZGxlU3R5bGVbMF0gfHwgaGFuZGxlU3R5bGUsXG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKGgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLnNhdmVIYW5kbGUoMCwgaCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdmFyIHRyYWNrT2Zmc2V0ID0gc3RhcnRQb2ludCAhPT0gdW5kZWZpbmVkID8gdGhpcy5jYWxjT2Zmc2V0KHN0YXJ0UG9pbnQpIDogMDtcbiAgICAgIHZhciBtZXJnZWRUcmFja1N0eWxlID0gdHJhY2tTdHlsZVswXSB8fCB0cmFja1N0eWxlO1xuXG4gICAgICB2YXIgdHJhY2sgPSBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9UcmFjay5kZWZhdWx0LCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmFja1wiKSxcbiAgICAgICAgdmVydGljYWw6IHZlcnRpY2FsLFxuICAgICAgICBpbmNsdWRlZDogaW5jbHVkZWQsXG4gICAgICAgIG9mZnNldDogdHJhY2tPZmZzZXQsXG4gICAgICAgIHJldmVyc2U6IHJldmVyc2UsXG4gICAgICAgIGxlbmd0aDogb2Zmc2V0IC0gdHJhY2tPZmZzZXQsXG4gICAgICAgIHN0eWxlOiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBtaW5pbXVtVHJhY2tTdHlsZSksIG1lcmdlZFRyYWNrU3R5bGUpXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhY2tzOiB0cmFjayxcbiAgICAgICAgaGFuZGxlczogaGFuZGxlXG4gICAgICB9O1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gU2xpZGVyO1xufShfcmVhY3QuZGVmYXVsdC5Db21wb25lbnQpO1xuXG52YXIgX2RlZmF1bHQgPSAoMCwgX2NyZWF0ZVNsaWRlci5kZWZhdWx0KShTbGlkZXIpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBNYXJrcyA9IGZ1bmN0aW9uIE1hcmtzKF9yZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgdmVydGljYWwgPSBfcmVmLnZlcnRpY2FsLFxuICAgICAgcmV2ZXJzZSA9IF9yZWYucmV2ZXJzZSxcbiAgICAgIG1hcmtzID0gX3JlZi5tYXJrcyxcbiAgICAgIGluY2x1ZGVkID0gX3JlZi5pbmNsdWRlZCxcbiAgICAgIHVwcGVyQm91bmQgPSBfcmVmLnVwcGVyQm91bmQsXG4gICAgICBsb3dlckJvdW5kID0gX3JlZi5sb3dlckJvdW5kLFxuICAgICAgbWF4ID0gX3JlZi5tYXgsXG4gICAgICBtaW4gPSBfcmVmLm1pbixcbiAgICAgIG9uQ2xpY2tMYWJlbCA9IF9yZWYub25DbGlja0xhYmVsO1xuICB2YXIgbWFya3NLZXlzID0gT2JqZWN0LmtleXMobWFya3MpO1xuICB2YXIgcmFuZ2UgPSBtYXggLSBtaW47XG4gIHZhciBlbGVtZW50cyA9IG1hcmtzS2V5cy5tYXAocGFyc2VGbG9hdCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSkubWFwKGZ1bmN0aW9uIChwb2ludCkge1xuICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgIHZhciBtYXJrUG9pbnQgPSBtYXJrc1twb2ludF07XG4gICAgdmFyIG1hcmtQb2ludElzT2JqZWN0ID0gKDAsIF90eXBlb2YyLmRlZmF1bHQpKG1hcmtQb2ludCkgPT09ICdvYmplY3QnICYmICFfcmVhY3QuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudChtYXJrUG9pbnQpO1xuICAgIHZhciBtYXJrTGFiZWwgPSBtYXJrUG9pbnRJc09iamVjdCA/IG1hcmtQb2ludC5sYWJlbCA6IG1hcmtQb2ludDtcblxuICAgIGlmICghbWFya0xhYmVsICYmIG1hcmtMYWJlbCAhPT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGlzQWN0aXZlID0gIWluY2x1ZGVkICYmIHBvaW50ID09PSB1cHBlckJvdW5kIHx8IGluY2x1ZGVkICYmIHBvaW50IDw9IHVwcGVyQm91bmQgJiYgcG9pbnQgPj0gbG93ZXJCb3VuZDtcbiAgICB2YXIgbWFya0NsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KSgoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGNsYXNzTmFtZSwgXCItdGV4dFwiKSwgdHJ1ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjbGFzc05hbWUsIFwiLXRleHQtYWN0aXZlXCIpLCBpc0FjdGl2ZSksIF9jbGFzc05hbWVzKSk7XG4gICAgdmFyIGJvdHRvbVN0eWxlID0gKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe1xuICAgICAgbWFyZ2luQm90dG9tOiAnLTUwJSdcbiAgICB9LCByZXZlcnNlID8gJ3RvcCcgOiAnYm90dG9tJywgXCJcIi5jb25jYXQoKHBvaW50IC0gbWluKSAvIHJhbmdlICogMTAwLCBcIiVcIikpO1xuICAgIHZhciBsZWZ0U3R5bGUgPSAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7XG4gICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWChcIi5jb25jYXQocmV2ZXJzZSA/IFwiNTAlXCIgOiBcIi01MCVcIiwgXCIpXCIpLFxuICAgICAgbXNUcmFuc2Zvcm06IFwidHJhbnNsYXRlWChcIi5jb25jYXQocmV2ZXJzZSA/IFwiNTAlXCIgOiBcIi01MCVcIiwgXCIpXCIpXG4gICAgfSwgcmV2ZXJzZSA/ICdyaWdodCcgOiAnbGVmdCcsIFwiXCIuY29uY2F0KChwb2ludCAtIG1pbikgLyByYW5nZSAqIDEwMCwgXCIlXCIpKTtcbiAgICB2YXIgc3R5bGUgPSB2ZXJ0aWNhbCA/IGJvdHRvbVN0eWxlIDogbGVmdFN0eWxlO1xuICAgIHZhciBtYXJrU3R5bGUgPSBtYXJrUG9pbnRJc09iamVjdCA/ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHN0eWxlKSwgbWFya1BvaW50LnN0eWxlKSA6IHN0eWxlO1xuICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IG1hcmtDbGFzc05hbWUsXG4gICAgICBzdHlsZTogbWFya1N0eWxlLFxuICAgICAga2V5OiBwb2ludCxcbiAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIHJldHVybiBvbkNsaWNrTGFiZWwoZSwgcG9pbnQpO1xuICAgICAgfSxcbiAgICAgIG9uVG91Y2hTdGFydDogZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICAgICAgcmV0dXJuIG9uQ2xpY2tMYWJlbChlLCBwb2ludCk7XG4gICAgICB9XG4gICAgfSwgbWFya0xhYmVsKTtcbiAgfSk7XG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCBlbGVtZW50cyk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBNYXJrcztcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQ0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuXG52YXIgY2FsY1BvaW50cyA9IGZ1bmN0aW9uIGNhbGNQb2ludHModmVydGljYWwsIG1hcmtzLCBkb3RzLCBzdGVwLCBtaW4sIG1heCkge1xuICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZG90cyA/IHN0ZXAgPiAwIDogdHJ1ZSwgJ2BTbGlkZXJbc3RlcF1gIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlciBpbiBvcmRlciB0byBtYWtlIFNsaWRlcltkb3RzXSB3b3JrLicpO1xuICB2YXIgcG9pbnRzID0gT2JqZWN0LmtleXMobWFya3MpLm1hcChwYXJzZUZsb2F0KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEgLSBiO1xuICB9KTtcblxuICBpZiAoZG90cyAmJiBzdGVwKSB7XG4gICAgZm9yICh2YXIgaSA9IG1pbjsgaSA8PSBtYXg7IGkgKz0gc3RlcCkge1xuICAgICAgaWYgKHBvaW50cy5pbmRleE9mKGkpID09PSAtMSkge1xuICAgICAgICBwb2ludHMucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcG9pbnRzO1xufTtcblxudmFyIFN0ZXBzID0gZnVuY3Rpb24gU3RlcHMoX3JlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICB2ZXJ0aWNhbCA9IF9yZWYudmVydGljYWwsXG4gICAgICByZXZlcnNlID0gX3JlZi5yZXZlcnNlLFxuICAgICAgbWFya3MgPSBfcmVmLm1hcmtzLFxuICAgICAgZG90cyA9IF9yZWYuZG90cyxcbiAgICAgIHN0ZXAgPSBfcmVmLnN0ZXAsXG4gICAgICBpbmNsdWRlZCA9IF9yZWYuaW5jbHVkZWQsXG4gICAgICBsb3dlckJvdW5kID0gX3JlZi5sb3dlckJvdW5kLFxuICAgICAgdXBwZXJCb3VuZCA9IF9yZWYudXBwZXJCb3VuZCxcbiAgICAgIG1heCA9IF9yZWYubWF4LFxuICAgICAgbWluID0gX3JlZi5taW4sXG4gICAgICBkb3RTdHlsZSA9IF9yZWYuZG90U3R5bGUsXG4gICAgICBhY3RpdmVEb3RTdHlsZSA9IF9yZWYuYWN0aXZlRG90U3R5bGU7XG4gIHZhciByYW5nZSA9IG1heCAtIG1pbjtcbiAgdmFyIGVsZW1lbnRzID0gY2FsY1BvaW50cyh2ZXJ0aWNhbCwgbWFya3MsIGRvdHMsIHN0ZXAsIG1pbiwgbWF4KS5tYXAoZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgdmFyIG9mZnNldCA9IFwiXCIuY29uY2F0KE1hdGguYWJzKHBvaW50IC0gbWluKSAvIHJhbmdlICogMTAwLCBcIiVcIik7XG4gICAgdmFyIGlzQWN0aXZlZCA9ICFpbmNsdWRlZCAmJiBwb2ludCA9PT0gdXBwZXJCb3VuZCB8fCBpbmNsdWRlZCAmJiBwb2ludCA8PSB1cHBlckJvdW5kICYmIHBvaW50ID49IGxvd2VyQm91bmQ7XG4gICAgdmFyIHN0eWxlID0gdmVydGljYWwgPyAoMCwgX29iamVjdFNwcmVhZDQuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQ0LmRlZmF1bHQpKHt9LCBkb3RTdHlsZSksIHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgcmV2ZXJzZSA/ICd0b3AnIDogJ2JvdHRvbScsIG9mZnNldCkpIDogKDAsIF9vYmplY3RTcHJlYWQ0LmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkNC5kZWZhdWx0KSh7fSwgZG90U3R5bGUpLCB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIHJldmVyc2UgPyAncmlnaHQnIDogJ2xlZnQnLCBvZmZzZXQpKTtcblxuICAgIGlmIChpc0FjdGl2ZWQpIHtcbiAgICAgIHN0eWxlID0gKDAsIF9vYmplY3RTcHJlYWQ0LmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkNC5kZWZhdWx0KSh7fSwgc3R5bGUpLCBhY3RpdmVEb3RTdHlsZSk7XG4gICAgfVxuXG4gICAgdmFyIHBvaW50Q2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kb3RcIiksIHRydWUpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kb3QtYWN0aXZlXCIpLCBpc0FjdGl2ZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kb3QtcmV2ZXJzZVwiKSwgcmV2ZXJzZSksIF9jbGFzc05hbWVzKSk7XG4gICAgcmV0dXJuIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogcG9pbnRDbGFzc05hbWUsXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBrZXk6IHBvaW50XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0ZXBcIilcbiAgfSwgZWxlbWVudHMpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gU3RlcHM7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBUcmFjayA9IGZ1bmN0aW9uIFRyYWNrKHByb3BzKSB7XG4gIHZhciBfcmVmLCBfcmVmMjtcblxuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgaW5jbHVkZWQgPSBwcm9wcy5pbmNsdWRlZCxcbiAgICAgIHZlcnRpY2FsID0gcHJvcHMudmVydGljYWwsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlO1xuICB2YXIgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gcHJvcHMub2Zmc2V0LFxuICAgICAgcmV2ZXJzZSA9IHByb3BzLnJldmVyc2U7XG5cbiAgaWYgKGxlbmd0aCA8IDApIHtcbiAgICByZXZlcnNlID0gIXJldmVyc2U7XG4gICAgbGVuZ3RoID0gTWF0aC5hYnMobGVuZ3RoKTtcbiAgICBvZmZzZXQgPSAxMDAgLSBvZmZzZXQ7XG4gIH1cblxuICB2YXIgcG9zaXRvblN0eWxlID0gdmVydGljYWwgPyAoX3JlZiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmLCByZXZlcnNlID8gJ3RvcCcgOiAnYm90dG9tJywgXCJcIi5jb25jYXQob2Zmc2V0LCBcIiVcIikpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmLCByZXZlcnNlID8gJ2JvdHRvbScgOiAndG9wJywgJ2F1dG8nKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX3JlZiwgXCJoZWlnaHRcIiwgXCJcIi5jb25jYXQobGVuZ3RoLCBcIiVcIikpLCBfcmVmKSA6IChfcmVmMiA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgcmV2ZXJzZSA/ICdyaWdodCcgOiAnbGVmdCcsIFwiXCIuY29uY2F0KG9mZnNldCwgXCIlXCIpKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX3JlZjIsIHJldmVyc2UgPyAnbGVmdCcgOiAncmlnaHQnLCAnYXV0bycpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfcmVmMiwgXCJ3aWR0aFwiLCBcIlwiLmNvbmNhdChsZW5ndGgsIFwiJVwiKSksIF9yZWYyKTtcbiAgdmFyIGVsU3R5bGUgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzdHlsZSksIHBvc2l0b25TdHlsZSk7XG4gIHJldHVybiBpbmNsdWRlZCA/IF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHN0eWxlOiBlbFN0eWxlXG4gIH0pIDogbnVsbDtcbn07XG5cbnZhciBfZGVmYXVsdCA9IFRyYWNrO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlU2xpZGVyO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2dldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFwiKSk7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9hZGRFdmVudExpc3RlbmVyXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuXG52YXIgX1N0ZXBzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdGVwc1wiKSk7XG5cbnZhciBfTWFya3MgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL01hcmtzXCIpKTtcblxudmFyIF9IYW5kbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9IYW5kbGVcIikpO1xuXG52YXIgdXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi4vdXRpbHNcIikpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gY3JlYXRlU2xpZGVyKENvbXBvbmVudCkge1xuICB2YXIgX2E7XG5cbiAgcmV0dXJuIF9hID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoQ29tcG9uZW50RW5oYW5jZXIsIF9Db21wb25lbnQpO1xuXG4gICAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyLmRlZmF1bHQpKENvbXBvbmVudEVuaGFuY2VyKTtcblxuICAgIGZ1bmN0aW9uIENvbXBvbmVudEVuaGFuY2VyKHByb3BzKSB7XG4gICAgICB2YXIgX3RoaXM7XG5cbiAgICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIENvbXBvbmVudEVuaGFuY2VyKTtcbiAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgICBfdGhpcy5vbk1vdXNlRG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpc1ZlcnRpY2FsID0gX3RoaXMucHJvcHMudmVydGljYWw7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IHV0aWxzLmdldE1vdXNlUG9zaXRpb24oaXNWZXJ0aWNhbCwgZSk7XG5cbiAgICAgICAgaWYgKCF1dGlscy5pc0V2ZW50RnJvbUhhbmRsZShlLCBfdGhpcy5oYW5kbGVzUmVmcykpIHtcbiAgICAgICAgICBfdGhpcy5kcmFnT2Zmc2V0ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgaGFuZGxlUG9zaXRpb24gPSB1dGlscy5nZXRIYW5kbGVDZW50ZXJQb3NpdGlvbihpc1ZlcnRpY2FsLCBlLnRhcmdldCk7XG4gICAgICAgICAgX3RoaXMuZHJhZ09mZnNldCA9IHBvc2l0aW9uIC0gaGFuZGxlUG9zaXRpb247XG4gICAgICAgICAgcG9zaXRpb24gPSBoYW5kbGVQb3NpdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnJlbW92ZURvY3VtZW50RXZlbnRzKCk7XG5cbiAgICAgICAgX3RoaXMub25TdGFydChwb3NpdGlvbik7XG5cbiAgICAgICAgX3RoaXMuYWRkRG9jdW1lbnRNb3VzZUV2ZW50cygpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMub25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHV0aWxzLmlzTm90VG91Y2hFdmVudChlKSkgcmV0dXJuO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbCA9IF90aGlzLnByb3BzLnZlcnRpY2FsO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSB1dGlscy5nZXRUb3VjaFBvc2l0aW9uKGlzVmVydGljYWwsIGUpO1xuXG4gICAgICAgIGlmICghdXRpbHMuaXNFdmVudEZyb21IYW5kbGUoZSwgX3RoaXMuaGFuZGxlc1JlZnMpKSB7XG4gICAgICAgICAgX3RoaXMuZHJhZ09mZnNldCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGhhbmRsZVBvc2l0aW9uID0gdXRpbHMuZ2V0SGFuZGxlQ2VudGVyUG9zaXRpb24oaXNWZXJ0aWNhbCwgZS50YXJnZXQpO1xuICAgICAgICAgIF90aGlzLmRyYWdPZmZzZXQgPSBwb3NpdGlvbiAtIGhhbmRsZVBvc2l0aW9uO1xuICAgICAgICAgIHBvc2l0aW9uID0gaGFuZGxlUG9zaXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5vblN0YXJ0KHBvc2l0aW9uKTtcblxuICAgICAgICBfdGhpcy5hZGREb2N1bWVudFRvdWNoRXZlbnRzKCk7XG5cbiAgICAgICAgdXRpbHMucGF1c2VFdmVudChlKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uRm9jdXMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIG9uRm9jdXMgPSBfdGhpcyRwcm9wcy5vbkZvY3VzLFxuICAgICAgICAgICAgdmVydGljYWwgPSBfdGhpcyRwcm9wcy52ZXJ0aWNhbDtcblxuICAgICAgICBpZiAodXRpbHMuaXNFdmVudEZyb21IYW5kbGUoZSwgX3RoaXMuaGFuZGxlc1JlZnMpKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZVBvc2l0aW9uID0gdXRpbHMuZ2V0SGFuZGxlQ2VudGVyUG9zaXRpb24odmVydGljYWwsIGUudGFyZ2V0KTtcbiAgICAgICAgICBfdGhpcy5kcmFnT2Zmc2V0ID0gMDtcblxuICAgICAgICAgIF90aGlzLm9uU3RhcnQoaGFuZGxlUG9zaXRpb24pO1xuXG4gICAgICAgICAgdXRpbHMucGF1c2VFdmVudChlKTtcblxuICAgICAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgICAgICBvbkZvY3VzKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3RoaXMub25CbHVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG9uQmx1ciA9IF90aGlzLnByb3BzLm9uQmx1cjtcblxuICAgICAgICBfdGhpcy5vbkVuZCgpO1xuXG4gICAgICAgIGlmIChvbkJsdXIpIHtcbiAgICAgICAgICBvbkJsdXIoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uTW91c2VVcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzLmhhbmRsZXNSZWZzW190aGlzLnByZXZNb3ZlZEhhbmRsZUluZGV4XSkge1xuICAgICAgICAgIF90aGlzLmhhbmRsZXNSZWZzW190aGlzLnByZXZNb3ZlZEhhbmRsZUluZGV4XS5jbGlja0ZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFfdGhpcy5zbGlkZXJSZWYpIHtcbiAgICAgICAgICBfdGhpcy5vbkVuZCgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBvc2l0aW9uID0gdXRpbHMuZ2V0TW91c2VQb3NpdGlvbihfdGhpcy5wcm9wcy52ZXJ0aWNhbCwgZSk7XG5cbiAgICAgICAgX3RoaXMub25Nb3ZlKGUsIHBvc2l0aW9uIC0gX3RoaXMuZHJhZ09mZnNldCk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5vblRvdWNoTW92ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh1dGlscy5pc05vdFRvdWNoRXZlbnQoZSkgfHwgIV90aGlzLnNsaWRlclJlZikge1xuICAgICAgICAgIF90aGlzLm9uRW5kKCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9zaXRpb24gPSB1dGlscy5nZXRUb3VjaFBvc2l0aW9uKF90aGlzLnByb3BzLnZlcnRpY2FsLCBlKTtcblxuICAgICAgICBfdGhpcy5vbk1vdmUoZSwgcG9zaXRpb24gLSBfdGhpcy5kcmFnT2Zmc2V0KTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChfdGhpcy5zbGlkZXJSZWYgJiYgdXRpbHMuaXNFdmVudEZyb21IYW5kbGUoZSwgX3RoaXMuaGFuZGxlc1JlZnMpKSB7XG4gICAgICAgICAgX3RoaXMub25LZXlib2FyZChlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3RoaXMub25DbGlja01hcmtMYWJlbCA9IGZ1bmN0aW9uIChlLCB2YWx1ZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIF90aGlzLm9uQ2hhbmdlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby11bnVzZWQtc3RhdGVcblxuXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5vbkVuZCh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5zYXZlU2xpZGVyID0gZnVuY3Rpb24gKHNsaWRlcikge1xuICAgICAgICBfdGhpcy5zbGlkZXJSZWYgPSBzbGlkZXI7XG4gICAgICB9O1xuXG4gICAgICB2YXIgc3RlcCA9IHByb3BzLnN0ZXAsXG4gICAgICAgICAgbWF4ID0gcHJvcHMubWF4LFxuICAgICAgICAgIG1pbiA9IHByb3BzLm1pbjtcbiAgICAgIHZhciBpc1BvaW50RGlmZkV2ZW4gPSBpc0Zpbml0ZShtYXggLSBtaW4pID8gKG1heCAtIG1pbikgJSBzdGVwID09PSAwIDogdHJ1ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoc3RlcCAmJiBNYXRoLmZsb29yKHN0ZXApID09PSBzdGVwID8gaXNQb2ludERpZmZFdmVuIDogdHJ1ZSwgXCJTbGlkZXJbbWF4XSAtIFNsaWRlclttaW5dIChcIi5jb25jYXQobWF4IC0gbWluLCBcIikgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgU2xpZGVyW3N0ZXBdIChcIikuY29uY2F0KHN0ZXAsIFwiKVwiKSk7XG4gICAgICBfdGhpcy5oYW5kbGVzUmVmcyA9IHt9O1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKENvbXBvbmVudEVuaGFuY2VyLCBbe1xuICAgICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIC8vIFNuYXBzaG90IHRlc3RpbmcgY2Fubm90IGhhbmRsZSByZWZzLCBzbyBiZSBzdXJlIHRvIG51bGwtY2hlY2sgdGhpcy5cbiAgICAgICAgdGhpcy5kb2N1bWVudCA9IHRoaXMuc2xpZGVyUmVmICYmIHRoaXMuc2xpZGVyUmVmLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgYXV0b0ZvY3VzID0gX3RoaXMkcHJvcHMyLmF1dG9Gb2N1cyxcbiAgICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMyLmRpc2FibGVkO1xuXG4gICAgICAgIGlmIChhdXRvRm9jdXMgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIGlmICgoMCwgX2dldDIuZGVmYXVsdCkoKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoQ29tcG9uZW50RW5oYW5jZXIucHJvdG90eXBlKSwgXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLCB0aGlzKSkgKDAsIF9nZXQyLmRlZmF1bHQpKCgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKENvbXBvbmVudEVuaGFuY2VyLnByb3RvdHlwZSksIFwiY29tcG9uZW50V2lsbFVubW91bnRcIiwgdGhpcykuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZW1vdmVEb2N1bWVudEV2ZW50cygpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJnZXRTbGlkZXJTdGFydFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNsaWRlclN0YXJ0KCkge1xuICAgICAgICB2YXIgc2xpZGVyID0gdGhpcy5zbGlkZXJSZWY7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgdmVydGljYWwgPSBfdGhpcyRwcm9wczMudmVydGljYWwsXG4gICAgICAgICAgICByZXZlcnNlID0gX3RoaXMkcHJvcHMzLnJldmVyc2U7XG4gICAgICAgIHZhciByZWN0ID0gc2xpZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICAgIHJldHVybiByZXZlcnNlID8gcmVjdC5ib3R0b20gOiByZWN0LnRvcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3aW5kb3cucGFnZVhPZmZzZXQgKyAocmV2ZXJzZSA/IHJlY3QucmlnaHQgOiByZWN0LmxlZnQpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJnZXRTbGlkZXJMZW5ndGhcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTbGlkZXJMZW5ndGgoKSB7XG4gICAgICAgIHZhciBzbGlkZXIgPSB0aGlzLnNsaWRlclJlZjtcblxuICAgICAgICBpZiAoIXNsaWRlcikge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvb3JkcyA9IHNsaWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudmVydGljYWwgPyBjb29yZHMuaGVpZ2h0IDogY29vcmRzLndpZHRoO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJhZGREb2N1bWVudFRvdWNoRXZlbnRzXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gYWRkRG9jdW1lbnRUb3VjaEV2ZW50cygpIHtcbiAgICAgICAgLy8ganVzdCB3b3JrIGZvciBDaHJvbWUgaU9TIFNhZmFyaSBhbmQgQW5kcm9pZCBCcm93c2VyXG4gICAgICAgIHRoaXMub25Ub3VjaE1vdmVMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lci5kZWZhdWx0KSh0aGlzLmRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZSk7XG4gICAgICAgIHRoaXMub25Ub3VjaFVwTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIuZGVmYXVsdCkodGhpcy5kb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5vbkVuZCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImFkZERvY3VtZW50TW91c2VFdmVudHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGREb2N1bWVudE1vdXNlRXZlbnRzKCkge1xuICAgICAgICB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIuZGVmYXVsdCkodGhpcy5kb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgICB0aGlzLm9uTW91c2VVcExpc3RlbmVyID0gKDAsIF9hZGRFdmVudExpc3RlbmVyLmRlZmF1bHQpKHRoaXMuZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5vbkVuZCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInJlbW92ZURvY3VtZW50RXZlbnRzXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRG9jdW1lbnRFdmVudHMoKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgICAgICAgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyICYmIHRoaXMub25Ub3VjaE1vdmVMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoVXBMaXN0ZW5lciAmJiB0aGlzLm9uVG91Y2hVcExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIgJiYgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLm9uTW91c2VVcExpc3RlbmVyICYmIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImZvY3VzXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlc1JlZnNbMF0uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJibHVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy5oYW5kbGVzUmVmcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMyLmhhbmRsZXNSZWZzW2tleV0gJiYgX3RoaXMyLmhhbmRsZXNSZWZzW2tleV0uYmx1cikge1xuICAgICAgICAgICAgICBfdGhpczIuaGFuZGxlc1JlZnNba2V5XS5ibHVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY2FsY1ZhbHVlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY2FsY1ZhbHVlKG9mZnNldCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIHZlcnRpY2FsID0gX3RoaXMkcHJvcHM0LnZlcnRpY2FsLFxuICAgICAgICAgICAgbWluID0gX3RoaXMkcHJvcHM0Lm1pbixcbiAgICAgICAgICAgIG1heCA9IF90aGlzJHByb3BzNC5tYXg7XG4gICAgICAgIHZhciByYXRpbyA9IE1hdGguYWJzKE1hdGgubWF4KG9mZnNldCwgMCkgLyB0aGlzLmdldFNsaWRlckxlbmd0aCgpKTtcbiAgICAgICAgdmFyIHZhbHVlID0gdmVydGljYWwgPyAoMSAtIHJhdGlvKSAqIChtYXggLSBtaW4pICsgbWluIDogcmF0aW8gKiAobWF4IC0gbWluKSArIG1pbjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjYWxjVmFsdWVCeVBvc1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGNWYWx1ZUJ5UG9zKHBvc2l0aW9uKSB7XG4gICAgICAgIHZhciBzaWduID0gdGhpcy5wcm9wcy5yZXZlcnNlID8gLTEgOiArMTtcbiAgICAgICAgdmFyIHBpeGVsT2Zmc2V0ID0gc2lnbiAqIChwb3NpdGlvbiAtIHRoaXMuZ2V0U2xpZGVyU3RhcnQoKSk7XG4gICAgICAgIHZhciBuZXh0VmFsdWUgPSB0aGlzLnRyaW1BbGlnblZhbHVlKHRoaXMuY2FsY1ZhbHVlKHBpeGVsT2Zmc2V0KSk7XG4gICAgICAgIHJldHVybiBuZXh0VmFsdWU7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNhbGNPZmZzZXRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxjT2Zmc2V0KHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczUgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgbWluID0gX3RoaXMkcHJvcHM1Lm1pbixcbiAgICAgICAgICAgIG1heCA9IF90aGlzJHByb3BzNS5tYXg7XG4gICAgICAgIHZhciByYXRpbyA9ICh2YWx1ZSAtIG1pbikgLyAobWF4IC0gbWluKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHJhdGlvICogMTAwKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwic2F2ZUhhbmRsZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNhdmVIYW5kbGUoaW5kZXgsIGhhbmRsZSkge1xuICAgICAgICB0aGlzLmhhbmRsZXNSZWZzW2luZGV4XSA9IGhhbmRsZTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgICAgdmFyIF90aGlzJHByb3BzNiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczYucHJlZml4Q2xzLFxuICAgICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM2LmNsYXNzTmFtZSxcbiAgICAgICAgICAgIG1hcmtzID0gX3RoaXMkcHJvcHM2Lm1hcmtzLFxuICAgICAgICAgICAgZG90cyA9IF90aGlzJHByb3BzNi5kb3RzLFxuICAgICAgICAgICAgc3RlcCA9IF90aGlzJHByb3BzNi5zdGVwLFxuICAgICAgICAgICAgaW5jbHVkZWQgPSBfdGhpcyRwcm9wczYuaW5jbHVkZWQsXG4gICAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzNi5kaXNhYmxlZCxcbiAgICAgICAgICAgIHZlcnRpY2FsID0gX3RoaXMkcHJvcHM2LnZlcnRpY2FsLFxuICAgICAgICAgICAgcmV2ZXJzZSA9IF90aGlzJHByb3BzNi5yZXZlcnNlLFxuICAgICAgICAgICAgbWluID0gX3RoaXMkcHJvcHM2Lm1pbixcbiAgICAgICAgICAgIG1heCA9IF90aGlzJHByb3BzNi5tYXgsXG4gICAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzNi5jaGlsZHJlbixcbiAgICAgICAgICAgIG1heGltdW1UcmFja1N0eWxlID0gX3RoaXMkcHJvcHM2Lm1heGltdW1UcmFja1N0eWxlLFxuICAgICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczYuc3R5bGUsXG4gICAgICAgICAgICByYWlsU3R5bGUgPSBfdGhpcyRwcm9wczYucmFpbFN0eWxlLFxuICAgICAgICAgICAgZG90U3R5bGUgPSBfdGhpcyRwcm9wczYuZG90U3R5bGUsXG4gICAgICAgICAgICBhY3RpdmVEb3RTdHlsZSA9IF90aGlzJHByb3BzNi5hY3RpdmVEb3RTdHlsZTtcblxuICAgICAgICB2YXIgX2dldCRjYWxsID0gKDAsIF9nZXQyLmRlZmF1bHQpKCgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKENvbXBvbmVudEVuaGFuY2VyLnByb3RvdHlwZSksIFwicmVuZGVyXCIsIHRoaXMpLmNhbGwodGhpcyksXG4gICAgICAgICAgICB0cmFja3MgPSBfZ2V0JGNhbGwudHJhY2tzLFxuICAgICAgICAgICAgaGFuZGxlcyA9IF9nZXQkY2FsbC5oYW5kbGVzO1xuXG4gICAgICAgIHZhciBzbGlkZXJDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2l0aC1tYXJrc1wiKSwgT2JqZWN0LmtleXMobWFya3MpLmxlbmd0aCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXZlcnRpY2FsXCIpLCB2ZXJ0aWNhbCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBjbGFzc05hbWUsIGNsYXNzTmFtZSksIF9jbGFzc05hbWVzKSk7XG4gICAgICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICByZWY6IHRoaXMuc2F2ZVNsaWRlcixcbiAgICAgICAgICBjbGFzc05hbWU6IHNsaWRlckNsYXNzTmFtZSxcbiAgICAgICAgICBvblRvdWNoU3RhcnQ6IGRpc2FibGVkID8gbm9vcCA6IHRoaXMub25Ub3VjaFN0YXJ0LFxuICAgICAgICAgIG9uTW91c2VEb3duOiBkaXNhYmxlZCA/IG5vb3AgOiB0aGlzLm9uTW91c2VEb3duLFxuICAgICAgICAgIG9uTW91c2VVcDogZGlzYWJsZWQgPyBub29wIDogdGhpcy5vbk1vdXNlVXAsXG4gICAgICAgICAgb25LZXlEb3duOiBkaXNhYmxlZCA/IG5vb3AgOiB0aGlzLm9uS2V5RG93bixcbiAgICAgICAgICBvbkZvY3VzOiBkaXNhYmxlZCA/IG5vb3AgOiB0aGlzLm9uRm9jdXMsXG4gICAgICAgICAgb25CbHVyOiBkaXNhYmxlZCA/IG5vb3AgOiB0aGlzLm9uQmx1cixcbiAgICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgICAgfSwgX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJhaWxcIiksXG4gICAgICAgICAgc3R5bGU6ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIG1heGltdW1UcmFja1N0eWxlKSwgcmFpbFN0eWxlKVxuICAgICAgICB9KSwgdHJhY2tzLCBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9TdGVwcy5kZWZhdWx0LCB7XG4gICAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgdmVydGljYWw6IHZlcnRpY2FsLFxuICAgICAgICAgIHJldmVyc2U6IHJldmVyc2UsXG4gICAgICAgICAgbWFya3M6IG1hcmtzLFxuICAgICAgICAgIGRvdHM6IGRvdHMsXG4gICAgICAgICAgc3RlcDogc3RlcCxcbiAgICAgICAgICBpbmNsdWRlZDogaW5jbHVkZWQsXG4gICAgICAgICAgbG93ZXJCb3VuZDogdGhpcy5nZXRMb3dlckJvdW5kKCksXG4gICAgICAgICAgdXBwZXJCb3VuZDogdGhpcy5nZXRVcHBlckJvdW5kKCksXG4gICAgICAgICAgbWF4OiBtYXgsXG4gICAgICAgICAgbWluOiBtaW4sXG4gICAgICAgICAgZG90U3R5bGU6IGRvdFN0eWxlLFxuICAgICAgICAgIGFjdGl2ZURvdFN0eWxlOiBhY3RpdmVEb3RTdHlsZVxuICAgICAgICB9KSwgaGFuZGxlcywgX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfTWFya3MuZGVmYXVsdCwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tYXJrXCIpLFxuICAgICAgICAgIG9uQ2xpY2tMYWJlbDogZGlzYWJsZWQgPyBub29wIDogdGhpcy5vbkNsaWNrTWFya0xhYmVsLFxuICAgICAgICAgIHZlcnRpY2FsOiB2ZXJ0aWNhbCxcbiAgICAgICAgICBtYXJrczogbWFya3MsXG4gICAgICAgICAgaW5jbHVkZWQ6IGluY2x1ZGVkLFxuICAgICAgICAgIGxvd2VyQm91bmQ6IHRoaXMuZ2V0TG93ZXJCb3VuZCgpLFxuICAgICAgICAgIHVwcGVyQm91bmQ6IHRoaXMuZ2V0VXBwZXJCb3VuZCgpLFxuICAgICAgICAgIG1heDogbWF4LFxuICAgICAgICAgIG1pbjogbWluLFxuICAgICAgICAgIHJldmVyc2U6IHJldmVyc2VcbiAgICAgICAgfSksIGNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9XSk7XG4gICAgcmV0dXJuIENvbXBvbmVudEVuaGFuY2VyO1xuICB9KENvbXBvbmVudCksIF9hLmRpc3BsYXlOYW1lID0gXCJDb21wb25lbnRFbmhhbmNlcihcIi5jb25jYXQoQ29tcG9uZW50LmRpc3BsYXlOYW1lLCBcIilcIiksIF9hLmRlZmF1bHRQcm9wcyA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpLCB7fSwge1xuICAgIHByZWZpeENsczogJ3JjLXNsaWRlcicsXG4gICAgY2xhc3NOYW1lOiAnJyxcbiAgICBtaW46IDAsXG4gICAgbWF4OiAxMDAsXG4gICAgc3RlcDogMSxcbiAgICBtYXJrczoge30sXG4gICAgaGFuZGxlOiBmdW5jdGlvbiBoYW5kbGUocHJvcHMpIHtcbiAgICAgIHZhciBpbmRleCA9IHByb3BzLmluZGV4LFxuICAgICAgICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKHByb3BzLCBbXCJpbmRleFwiXSk7XG4gICAgICBkZWxldGUgcmVzdFByb3BzLmRyYWdnaW5nO1xuXG4gICAgICBpZiAocmVzdFByb3BzLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfSGFuZGxlLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcywge1xuICAgICAgICBrZXk6IGluZGV4XG4gICAgICB9KSk7XG4gICAgfSxcbiAgICBvbkJlZm9yZUNoYW5nZTogbm9vcCxcbiAgICBvbkNoYW5nZTogbm9vcCxcbiAgICBvbkFmdGVyQ2hhbmdlOiBub29wLFxuICAgIGluY2x1ZGVkOiB0cnVlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBkb3RzOiBmYWxzZSxcbiAgICB2ZXJ0aWNhbDogZmFsc2UsXG4gICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgdHJhY2tTdHlsZTogW3t9XSxcbiAgICBoYW5kbGVTdHlsZTogW3t9XSxcbiAgICByYWlsU3R5bGU6IHt9LFxuICAgIGRvdFN0eWxlOiB7fSxcbiAgICBhY3RpdmVEb3RTdHlsZToge31cbiAgfSksIF9hO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZVNsaWRlcldpdGhUb29sdGlwO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjVG9vbHRpcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXRvb2x0aXBcIikpO1xuXG52YXIgX0hhbmRsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSGFuZGxlXCIpKTtcblxuZnVuY3Rpb24gY3JlYXRlU2xpZGVyV2l0aFRvb2x0aXAoQ29tcG9uZW50KSB7XG4gIHZhciBfYTtcblxuICByZXR1cm4gX2EgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShDb21wb25lbnRXcmFwcGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShDb21wb25lbnRXcmFwcGVyKTtcblxuICAgIGZ1bmN0aW9uIENvbXBvbmVudFdyYXBwZXIoKSB7XG4gICAgICB2YXIgX3RoaXM7XG5cbiAgICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIENvbXBvbmVudFdyYXBwZXIpO1xuICAgICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICB2aXNpYmxlczoge31cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmhhbmRsZVRvb2x0aXBWaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gKGluZGV4LCB2aXNpYmxlKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmlzaWJsZXM6ICgwLCBfb2JqZWN0U3ByZWFkMy5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoe30sIHByZXZTdGF0ZS52aXNpYmxlcyksIHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgaW5kZXgsIHZpc2libGUpKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuaGFuZGxlV2l0aFRvb2x0aXAgPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgICAgICAgZHJhZ2dpbmcgPSBfcmVmLmRyYWdnaW5nLFxuICAgICAgICAgICAgaW5kZXggPSBfcmVmLmluZGV4LFxuICAgICAgICAgICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgICAgICAgICAgcmVzdFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3JlZiwgW1widmFsdWVcIiwgXCJkcmFnZ2luZ1wiLCBcImluZGV4XCIsIFwiZGlzYWJsZWRcIl0pO1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIHRpcEZvcm1hdHRlciA9IF90aGlzJHByb3BzLnRpcEZvcm1hdHRlcixcbiAgICAgICAgICAgIHRpcFByb3BzID0gX3RoaXMkcHJvcHMudGlwUHJvcHMsXG4gICAgICAgICAgICBoYW5kbGVTdHlsZSA9IF90aGlzJHByb3BzLmhhbmRsZVN0eWxlLFxuICAgICAgICAgICAgZ2V0VG9vbHRpcENvbnRhaW5lciA9IF90aGlzJHByb3BzLmdldFRvb2x0aXBDb250YWluZXI7XG4gICAgICAgIHZhciBfdGlwUHJvcHMkcHJlZml4Q2xzID0gdGlwUHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgICAgcHJlZml4Q2xzID0gX3RpcFByb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXNsaWRlci10b29sdGlwJyA6IF90aXBQcm9wcyRwcmVmaXhDbHMsXG4gICAgICAgICAgICBfdGlwUHJvcHMkb3ZlcmxheSA9IHRpcFByb3BzLm92ZXJsYXksXG4gICAgICAgICAgICBvdmVybGF5ID0gX3RpcFByb3BzJG92ZXJsYXkgPT09IHZvaWQgMCA/IHRpcEZvcm1hdHRlcih2YWx1ZSkgOiBfdGlwUHJvcHMkb3ZlcmxheSxcbiAgICAgICAgICAgIF90aXBQcm9wcyRwbGFjZW1lbnQgPSB0aXBQcm9wcy5wbGFjZW1lbnQsXG4gICAgICAgICAgICBwbGFjZW1lbnQgPSBfdGlwUHJvcHMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyAndG9wJyA6IF90aXBQcm9wcyRwbGFjZW1lbnQsXG4gICAgICAgICAgICBfdGlwUHJvcHMkdmlzaWJsZSA9IHRpcFByb3BzLnZpc2libGUsXG4gICAgICAgICAgICB2aXNpYmxlID0gX3RpcFByb3BzJHZpc2libGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3RpcFByb3BzJHZpc2libGUsXG4gICAgICAgICAgICByZXN0VG9vbHRpcFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkodGlwUHJvcHMsIFtcInByZWZpeENsc1wiLCBcIm92ZXJsYXlcIiwgXCJwbGFjZW1lbnRcIiwgXCJ2aXNpYmxlXCJdKTtcbiAgICAgICAgdmFyIGhhbmRsZVN0eWxlV2l0aEluZGV4O1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZVN0eWxlKSkge1xuICAgICAgICAgIGhhbmRsZVN0eWxlV2l0aEluZGV4ID0gaGFuZGxlU3R5bGVbaW5kZXhdIHx8IGhhbmRsZVN0eWxlWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhbmRsZVN0eWxlV2l0aEluZGV4ID0gaGFuZGxlU3R5bGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfcmNUb29sdGlwLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RUb29sdGlwUHJvcHMsIHtcbiAgICAgICAgICBnZXRUb29sdGlwQ29udGFpbmVyOiBnZXRUb29sdGlwQ29udGFpbmVyLFxuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIG92ZXJsYXk6IG92ZXJsYXksXG4gICAgICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICAgICAgdmlzaWJsZTogIWRpc2FibGVkICYmIChfdGhpcy5zdGF0ZS52aXNpYmxlc1tpbmRleF0gfHwgZHJhZ2dpbmcpIHx8IHZpc2libGUsXG4gICAgICAgICAga2V5OiBpbmRleFxuICAgICAgICB9KSwgX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfSGFuZGxlLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcywge1xuICAgICAgICAgIHN0eWxlOiAoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoe30sIGhhbmRsZVN0eWxlV2l0aEluZGV4KSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuaGFuZGxlVG9vbHRpcFZpc2libGVDaGFuZ2UoaW5kZXgsIHRydWUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuaGFuZGxlVG9vbHRpcFZpc2libGVDaGFuZ2UoaW5kZXgsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoQ29tcG9uZW50V3JhcHBlciwgW3tcbiAgICAgIGtleTogXCJyZW5kZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICAgIGhhbmRsZTogdGhpcy5oYW5kbGVXaXRoVG9vbHRpcFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfV0pO1xuICAgIHJldHVybiBDb21wb25lbnRXcmFwcGVyO1xuICB9KF9yZWFjdC5kZWZhdWx0LkNvbXBvbmVudCksIF9hLmRlZmF1bHRQcm9wcyA9IHtcbiAgICB0aXBGb3JtYXR0ZXI6IGZ1bmN0aW9uIHRpcEZvcm1hdHRlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgaGFuZGxlU3R5bGU6IFt7fV0sXG4gICAgdGlwUHJvcHM6IHt9LFxuICAgIGdldFRvb2x0aXBDb250YWluZXI6IGZ1bmN0aW9uIGdldFRvb2x0aXBDb250YWluZXIobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH0sIF9hO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJhbmdlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9SYW5nZS5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkhhbmRsZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfSGFuZGxlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlU2xpZGVyV2l0aFRvb2x0aXBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NyZWF0ZVNsaWRlcldpdGhUb29sdGlwLmRlZmF1bHQ7XG4gIH1cbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX1NsaWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU2xpZGVyXCIpKTtcblxudmFyIF9SYW5nZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUmFuZ2VcIikpO1xuXG52YXIgX0hhbmRsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSGFuZGxlXCIpKTtcblxudmFyIF9jcmVhdGVTbGlkZXJXaXRoVG9vbHRpcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY3JlYXRlU2xpZGVyV2l0aFRvb2x0aXBcIikpO1xuXG52YXIgSW50ZXJuYWxTbGlkZXIgPSBfU2xpZGVyLmRlZmF1bHQ7XG5JbnRlcm5hbFNsaWRlci5SYW5nZSA9IF9SYW5nZS5kZWZhdWx0O1xuSW50ZXJuYWxTbGlkZXIuSGFuZGxlID0gX0hhbmRsZS5kZWZhdWx0O1xuSW50ZXJuYWxTbGlkZXIuY3JlYXRlU2xpZGVyV2l0aFRvb2x0aXAgPSBfY3JlYXRlU2xpZGVyV2l0aFRvb2x0aXAuZGVmYXVsdDtcbnZhciBfZGVmYXVsdCA9IEludGVybmFsU2xpZGVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc0V2ZW50RnJvbUhhbmRsZSA9IGlzRXZlbnRGcm9tSGFuZGxlO1xuZXhwb3J0cy5pc1ZhbHVlT3V0T2ZSYW5nZSA9IGlzVmFsdWVPdXRPZlJhbmdlO1xuZXhwb3J0cy5pc05vdFRvdWNoRXZlbnQgPSBpc05vdFRvdWNoRXZlbnQ7XG5leHBvcnRzLmdldENsb3Nlc3RQb2ludCA9IGdldENsb3Nlc3RQb2ludDtcbmV4cG9ydHMuZ2V0UHJlY2lzaW9uID0gZ2V0UHJlY2lzaW9uO1xuZXhwb3J0cy5nZXRNb3VzZVBvc2l0aW9uID0gZ2V0TW91c2VQb3NpdGlvbjtcbmV4cG9ydHMuZ2V0VG91Y2hQb3NpdGlvbiA9IGdldFRvdWNoUG9zaXRpb247XG5leHBvcnRzLmdldEhhbmRsZUNlbnRlclBvc2l0aW9uID0gZ2V0SGFuZGxlQ2VudGVyUG9zaXRpb247XG5leHBvcnRzLmVuc3VyZVZhbHVlSW5SYW5nZSA9IGVuc3VyZVZhbHVlSW5SYW5nZTtcbmV4cG9ydHMuZW5zdXJlVmFsdWVQcmVjaXNpb24gPSBlbnN1cmVWYWx1ZVByZWNpc2lvbjtcbmV4cG9ydHMucGF1c2VFdmVudCA9IHBhdXNlRXZlbnQ7XG5leHBvcnRzLmNhbGN1bGF0ZU5leHRWYWx1ZSA9IGNhbGN1bGF0ZU5leHRWYWx1ZTtcbmV4cG9ydHMuZ2V0S2V5Ym9hcmRWYWx1ZU11dGF0b3IgPSBnZXRLZXlib2FyZFZhbHVlTXV0YXRvcjtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoXCJyZWFjdC1kb21cIik7XG5cbnZhciBfS2V5Q29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0tleUNvZGVcIikpO1xuXG5mdW5jdGlvbiBpc0V2ZW50RnJvbUhhbmRsZShlLCBoYW5kbGVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGhhbmRsZXMpLnNvbWUoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIGUudGFyZ2V0ID09PSAoMCwgX3JlYWN0RG9tLmZpbmRET01Ob2RlKShoYW5kbGVzW2tleV0pO1xuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlT3V0T2ZSYW5nZSh2YWx1ZSwgX3JlZikge1xuICB2YXIgbWluID0gX3JlZi5taW4sXG4gICAgICBtYXggPSBfcmVmLm1heDtcbiAgcmV0dXJuIHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4O1xufVxuXG5mdW5jdGlvbiBpc05vdFRvdWNoRXZlbnQoZSkge1xuICByZXR1cm4gZS50b3VjaGVzLmxlbmd0aCA+IDEgfHwgZS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICd0b3VjaGVuZCcgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGdldENsb3Nlc3RQb2ludCh2YWwsIF9yZWYyKSB7XG4gIHZhciBtYXJrcyA9IF9yZWYyLm1hcmtzLFxuICAgICAgc3RlcCA9IF9yZWYyLnN0ZXAsXG4gICAgICBtaW4gPSBfcmVmMi5taW4sXG4gICAgICBtYXggPSBfcmVmMi5tYXg7XG4gIHZhciBwb2ludHMgPSBPYmplY3Qua2V5cyhtYXJrcykubWFwKHBhcnNlRmxvYXQpO1xuXG4gIGlmIChzdGVwICE9PSBudWxsKSB7XG4gICAgdmFyIG1heFN0ZXBzID0gTWF0aC5mbG9vcigobWF4IC0gbWluKSAvIHN0ZXApO1xuICAgIHZhciBzdGVwcyA9IE1hdGgubWluKCh2YWwgLSBtaW4pIC8gc3RlcCwgbWF4U3RlcHMpO1xuICAgIHZhciBjbG9zZXN0U3RlcCA9IE1hdGgucm91bmQoc3RlcHMpICogc3RlcCArIG1pbjtcbiAgICBwb2ludHMucHVzaChjbG9zZXN0U3RlcCk7XG4gIH1cblxuICB2YXIgZGlmZnMgPSBwb2ludHMubWFwKGZ1bmN0aW9uIChwb2ludCkge1xuICAgIHJldHVybiBNYXRoLmFicyh2YWwgLSBwb2ludCk7XG4gIH0pO1xuICByZXR1cm4gcG9pbnRzW2RpZmZzLmluZGV4T2YoTWF0aC5taW4uYXBwbHkoTWF0aCwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoZGlmZnMpKSldO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVjaXNpb24oc3RlcCkge1xuICB2YXIgc3RlcFN0cmluZyA9IHN0ZXAudG9TdHJpbmcoKTtcbiAgdmFyIHByZWNpc2lvbiA9IDA7XG5cbiAgaWYgKHN0ZXBTdHJpbmcuaW5kZXhPZignLicpID49IDApIHtcbiAgICBwcmVjaXNpb24gPSBzdGVwU3RyaW5nLmxlbmd0aCAtIHN0ZXBTdHJpbmcuaW5kZXhPZignLicpIC0gMTtcbiAgfVxuXG4gIHJldHVybiBwcmVjaXNpb247XG59XG5cbmZ1bmN0aW9uIGdldE1vdXNlUG9zaXRpb24odmVydGljYWwsIGUpIHtcbiAgcmV0dXJuIHZlcnRpY2FsID8gZS5jbGllbnRZIDogZS5wYWdlWDtcbn1cblxuZnVuY3Rpb24gZ2V0VG91Y2hQb3NpdGlvbih2ZXJ0aWNhbCwgZSkge1xuICByZXR1cm4gdmVydGljYWwgPyBlLnRvdWNoZXNbMF0uY2xpZW50WSA6IGUudG91Y2hlc1swXS5wYWdlWDtcbn1cblxuZnVuY3Rpb24gZ2V0SGFuZGxlQ2VudGVyUG9zaXRpb24odmVydGljYWwsIGhhbmRsZSkge1xuICB2YXIgY29vcmRzID0gaGFuZGxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4gdmVydGljYWwgPyBjb29yZHMudG9wICsgY29vcmRzLmhlaWdodCAqIDAuNSA6IHdpbmRvdy5wYWdlWE9mZnNldCArIGNvb3Jkcy5sZWZ0ICsgY29vcmRzLndpZHRoICogMC41O1xufVxuXG5mdW5jdGlvbiBlbnN1cmVWYWx1ZUluUmFuZ2UodmFsLCBfcmVmMykge1xuICB2YXIgbWF4ID0gX3JlZjMubWF4LFxuICAgICAgbWluID0gX3JlZjMubWluO1xuXG4gIGlmICh2YWwgPD0gbWluKSB7XG4gICAgcmV0dXJuIG1pbjtcbiAgfVxuXG4gIGlmICh2YWwgPj0gbWF4KSB7XG4gICAgcmV0dXJuIG1heDtcbiAgfVxuXG4gIHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVZhbHVlUHJlY2lzaW9uKHZhbCwgcHJvcHMpIHtcbiAgdmFyIHN0ZXAgPSBwcm9wcy5zdGVwO1xuICB2YXIgY2xvc2VzdFBvaW50ID0gaXNGaW5pdGUoZ2V0Q2xvc2VzdFBvaW50KHZhbCwgcHJvcHMpKSA/IGdldENsb3Nlc3RQb2ludCh2YWwsIHByb3BzKSA6IDA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICByZXR1cm4gc3RlcCA9PT0gbnVsbCA/IGNsb3Nlc3RQb2ludCA6IHBhcnNlRmxvYXQoY2xvc2VzdFBvaW50LnRvRml4ZWQoZ2V0UHJlY2lzaW9uKHN0ZXApKSk7XG59XG5cbmZ1bmN0aW9uIHBhdXNlRXZlbnQoZSkge1xuICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZU5leHRWYWx1ZShmdW5jLCB2YWx1ZSwgcHJvcHMpIHtcbiAgdmFyIG9wZXJhdGlvbnMgPSB7XG4gICAgaW5jcmVhc2U6IGZ1bmN0aW9uIGluY3JlYXNlKGEsIGIpIHtcbiAgICAgIHJldHVybiBhICsgYjtcbiAgICB9LFxuICAgIGRlY3JlYXNlOiBmdW5jdGlvbiBkZWNyZWFzZShhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfVxuICB9O1xuICB2YXIgaW5kZXhUb0dldCA9IG9wZXJhdGlvbnNbZnVuY10oT2JqZWN0LmtleXMocHJvcHMubWFya3MpLmluZGV4T2YoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSwgMSk7XG4gIHZhciBrZXlUb0dldCA9IE9iamVjdC5rZXlzKHByb3BzLm1hcmtzKVtpbmRleFRvR2V0XTtcblxuICBpZiAocHJvcHMuc3RlcCkge1xuICAgIHJldHVybiBvcGVyYXRpb25zW2Z1bmNdKHZhbHVlLCBwcm9wcy5zdGVwKTtcbiAgfVxuXG4gIGlmICghIU9iamVjdC5rZXlzKHByb3BzLm1hcmtzKS5sZW5ndGggJiYgISFwcm9wcy5tYXJrc1trZXlUb0dldF0pIHtcbiAgICByZXR1cm4gcHJvcHMubWFya3Nba2V5VG9HZXRdO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRLZXlib2FyZFZhbHVlTXV0YXRvcihlLCB2ZXJ0aWNhbCwgcmV2ZXJzZSkge1xuICB2YXIgaW5jcmVhc2UgPSAnaW5jcmVhc2UnO1xuICB2YXIgZGVjcmVhc2UgPSAnZGVjcmVhc2UnO1xuICB2YXIgbWV0aG9kID0gaW5jcmVhc2U7XG5cbiAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuVVA6XG4gICAgICBtZXRob2QgPSB2ZXJ0aWNhbCAmJiByZXZlcnNlID8gZGVjcmVhc2UgOiBpbmNyZWFzZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LlJJR0hUOlxuICAgICAgbWV0aG9kID0gIXZlcnRpY2FsICYmIHJldmVyc2UgPyBkZWNyZWFzZSA6IGluY3JlYXNlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuRE9XTjpcbiAgICAgIG1ldGhvZCA9IHZlcnRpY2FsICYmIHJldmVyc2UgPyBpbmNyZWFzZSA6IGRlY3JlYXNlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuTEVGVDpcbiAgICAgIG1ldGhvZCA9ICF2ZXJ0aWNhbCAmJiByZXZlcnNlID8gaW5jcmVhc2UgOiBkZWNyZWFzZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LkVORDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy5tYXg7XG4gICAgICB9O1xuXG4gICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LkhPTUU6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gcHJvcHMubWluO1xuICAgICAgfTtcblxuICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5QQUdFX1VQOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICsgcHJvcHMuc3RlcCAqIDI7XG4gICAgICB9O1xuXG4gICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LlBBR0VfRE9XTjpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAtIHByb3BzLnN0ZXAgKiAyO1xuICAgICAgfTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcHMpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlTmV4dFZhbHVlKG1ldGhvZCwgdmFsdWUsIHByb3BzKTtcbiAgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIikpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yLmRlZmF1bHQpKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBpc1N0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnO1xufVxuXG52YXIgU3RlcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShTdGVwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFN0ZXApO1xuXG4gIGZ1bmN0aW9uIFN0ZXAoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgU3RlcCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIF90aGlzLm9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMub25DbGljayxcbiAgICAgICAgICBvblN0ZXBDbGljayA9IF90aGlzJHByb3BzLm9uU3RlcENsaWNrLFxuICAgICAgICAgIHN0ZXBJbmRleCA9IF90aGlzJHByb3BzLnN0ZXBJbmRleDtcblxuICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgb25DbGljay5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIG9uU3RlcENsaWNrKHN0ZXBJbmRleCk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFN0ZXAsIFt7XG4gICAga2V5OiBcInJlbmRlckljb25Ob2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckljb25Ob2RlKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgIHByb2dyZXNzRG90ID0gX3RoaXMkcHJvcHMyLnByb2dyZXNzRG90LFxuICAgICAgICAgIHN0ZXBJY29uID0gX3RoaXMkcHJvcHMyLnN0ZXBJY29uLFxuICAgICAgICAgIHN0ZXBOdW1iZXIgPSBfdGhpcyRwcm9wczIuc3RlcE51bWJlcixcbiAgICAgICAgICBzdGF0dXMgPSBfdGhpcyRwcm9wczIuc3RhdHVzLFxuICAgICAgICAgIHRpdGxlID0gX3RoaXMkcHJvcHMyLnRpdGxlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uID0gX3RoaXMkcHJvcHMyLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGljb24gPSBfdGhpcyRwcm9wczIuaWNvbixcbiAgICAgICAgICBpY29uUHJlZml4ID0gX3RoaXMkcHJvcHMyLmljb25QcmVmaXgsXG4gICAgICAgICAgaWNvbnMgPSBfdGhpcyRwcm9wczIuaWNvbnM7XG4gICAgICB2YXIgaWNvbk5vZGU7XG4gICAgICB2YXIgaWNvbkNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb25cIiksIFwiXCIuY29uY2F0KGljb25QcmVmaXgsIFwiaWNvblwiKSwgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpY29uUHJlZml4LCBcImljb24tXCIpLmNvbmNhdChpY29uKSwgaWNvbiAmJiBpc1N0cmluZyhpY29uKSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpY29uUHJlZml4LCBcImljb24tY2hlY2tcIiksICFpY29uICYmIHN0YXR1cyA9PT0gJ2ZpbmlzaCcgJiYgKGljb25zICYmICFpY29ucy5maW5pc2ggfHwgIWljb25zKSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpY29uUHJlZml4LCBcImljb24tY3Jvc3NcIiksICFpY29uICYmIHN0YXR1cyA9PT0gJ2Vycm9yJyAmJiAoaWNvbnMgJiYgIWljb25zLmVycm9yIHx8ICFpY29ucykpLCBfY2xhc3NOYW1lcykpO1xuXG4gICAgICB2YXIgaWNvbkRvdCA9IF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb24tZG90XCIpXG4gICAgICB9KTsgLy8gYHByb2dyZXNzRG90YCBlbmpveSB0aGUgaGlnaGVzdCBwcmlvcml0eVxuXG5cbiAgICAgIGlmIChwcm9ncmVzc0RvdCkge1xuICAgICAgICBpZiAodHlwZW9mIHByb2dyZXNzRG90ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWNvbk5vZGUgPSBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvblwiKVxuICAgICAgICAgIH0sIHByb2dyZXNzRG90KGljb25Eb3QsIHtcbiAgICAgICAgICAgIGluZGV4OiBzdGVwTnVtYmVyIC0gMSxcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGljb25Ob2RlID0gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb25cIilcbiAgICAgICAgICB9LCBpY29uRG90KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpY29uICYmICFpc1N0cmluZyhpY29uKSkge1xuICAgICAgICBpY29uTm9kZSA9IF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvblwiKVxuICAgICAgICB9LCBpY29uKTtcbiAgICAgIH0gZWxzZSBpZiAoaWNvbnMgJiYgaWNvbnMuZmluaXNoICYmIHN0YXR1cyA9PT0gJ2ZpbmlzaCcpIHtcbiAgICAgICAgaWNvbk5vZGUgPSBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb25cIilcbiAgICAgICAgfSwgaWNvbnMuZmluaXNoKTtcbiAgICAgIH0gZWxzZSBpZiAoaWNvbnMgJiYgaWNvbnMuZXJyb3IgJiYgc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgIGljb25Ob2RlID0gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uXCIpXG4gICAgICAgIH0sIGljb25zLmVycm9yKTtcbiAgICAgIH0gZWxzZSBpZiAoaWNvbiB8fCBzdGF0dXMgPT09ICdmaW5pc2gnIHx8IHN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICBpY29uTm9kZSA9IF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGljb25DbGFzc05hbWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpY29uTm9kZSA9IF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvblwiKVxuICAgICAgICB9LCBzdGVwTnVtYmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0ZXBJY29uKSB7XG4gICAgICAgIGljb25Ob2RlID0gc3RlcEljb24oe1xuICAgICAgICAgIGluZGV4OiBzdGVwTnVtYmVyIC0gMSxcbiAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICAgIG5vZGU6IGljb25Ob2RlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaWNvbk5vZGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXMyO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczMuY2xhc3NOYW1lLFxuICAgICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzMy5wcmVmaXhDbHMsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczMuc3R5bGUsXG4gICAgICAgICAgYWN0aXZlID0gX3RoaXMkcHJvcHMzLmFjdGl2ZSxcbiAgICAgICAgICBfdGhpcyRwcm9wczMkc3RhdHVzID0gX3RoaXMkcHJvcHMzLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXMgPSBfdGhpcyRwcm9wczMkc3RhdHVzID09PSB2b2lkIDAgPyAnd2FpdCcgOiBfdGhpcyRwcm9wczMkc3RhdHVzLFxuICAgICAgICAgIGljb25QcmVmaXggPSBfdGhpcyRwcm9wczMuaWNvblByZWZpeCxcbiAgICAgICAgICBpY29uID0gX3RoaXMkcHJvcHMzLmljb24sXG4gICAgICAgICAgd3JhcHBlclN0eWxlID0gX3RoaXMkcHJvcHMzLndyYXBwZXJTdHlsZSxcbiAgICAgICAgICBzdGVwTnVtYmVyID0gX3RoaXMkcHJvcHMzLnN0ZXBOdW1iZXIsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczMuZGlzYWJsZWQsXG4gICAgICAgICAgZGVzY3JpcHRpb24gPSBfdGhpcyRwcm9wczMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgdGl0bGUgPSBfdGhpcyRwcm9wczMudGl0bGUsXG4gICAgICAgICAgc3ViVGl0bGUgPSBfdGhpcyRwcm9wczMuc3ViVGl0bGUsXG4gICAgICAgICAgcHJvZ3Jlc3NEb3QgPSBfdGhpcyRwcm9wczMucHJvZ3Jlc3NEb3QsXG4gICAgICAgICAgc3RlcEljb24gPSBfdGhpcyRwcm9wczMuc3RlcEljb24sXG4gICAgICAgICAgdGFpbENvbnRlbnQgPSBfdGhpcyRwcm9wczMudGFpbENvbnRlbnQsXG4gICAgICAgICAgaWNvbnMgPSBfdGhpcyRwcm9wczMuaWNvbnMsXG4gICAgICAgICAgc3RlcEluZGV4ID0gX3RoaXMkcHJvcHMzLnN0ZXBJbmRleCxcbiAgICAgICAgICBvblN0ZXBDbGljayA9IF90aGlzJHByb3BzMy5vblN0ZXBDbGljayxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMzLm9uQ2xpY2ssXG4gICAgICAgICAgcmVzdFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3RoaXMkcHJvcHMzLCBbXCJjbGFzc05hbWVcIiwgXCJwcmVmaXhDbHNcIiwgXCJzdHlsZVwiLCBcImFjdGl2ZVwiLCBcInN0YXR1c1wiLCBcImljb25QcmVmaXhcIiwgXCJpY29uXCIsIFwid3JhcHBlclN0eWxlXCIsIFwic3RlcE51bWJlclwiLCBcImRpc2FibGVkXCIsIFwiZGVzY3JpcHRpb25cIiwgXCJ0aXRsZVwiLCBcInN1YlRpdGxlXCIsIFwicHJvZ3Jlc3NEb3RcIiwgXCJzdGVwSWNvblwiLCBcInRhaWxDb250ZW50XCIsIFwiaWNvbnNcIiwgXCJzdGVwSW5kZXhcIiwgXCJvblN0ZXBDbGlja1wiLCBcIm9uQ2xpY2tcIl0pO1xuICAgICAgdmFyIGNsYXNzU3RyaW5nID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbVwiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLVwiKS5jb25jYXQoc3RhdHVzKSwgY2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMyID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWN1c3RvbVwiKSwgaWNvbiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWFjdGl2ZVwiKSwgYWN0aXZlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZGlzYWJsZWRcIiksIGRpc2FibGVkID09PSB0cnVlKSwgX2NsYXNzTmFtZXMyKSk7XG5cbiAgICAgIHZhciBzdGVwSXRlbVN0eWxlID0gX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpO1xuXG4gICAgICB2YXIgYWNjZXNzaWJpbGl0eVByb3BzID0ge307XG5cbiAgICAgIGlmIChvblN0ZXBDbGljayAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgYWNjZXNzaWJpbGl0eVByb3BzLnJvbGUgPSAnYnV0dG9uJztcbiAgICAgICAgYWNjZXNzaWJpbGl0eVByb3BzLnRhYkluZGV4ID0gMDtcbiAgICAgICAgYWNjZXNzaWJpbGl0eVByb3BzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2s7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgICAgICBzdHlsZTogc3RlcEl0ZW1TdHlsZVxuICAgICAgfSksIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2tcbiAgICAgIH0sIGFjY2Vzc2liaWxpdHlQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1jb250YWluZXJcIilcbiAgICAgIH0pLCBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tdGFpbFwiKVxuICAgICAgfSwgdGFpbENvbnRlbnQpLCBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0taWNvblwiKVxuICAgICAgfSwgdGhpcy5yZW5kZXJJY29uTm9kZSgpKSwgX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWNvbnRlbnRcIilcbiAgICAgIH0sIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS10aXRsZVwiKVxuICAgICAgfSwgdGl0bGUsIHN1YlRpdGxlICYmIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICB0aXRsZTogdHlwZW9mIHN1YlRpdGxlID09PSAnc3RyaW5nJyA/IHN1YlRpdGxlIDogdW5kZWZpbmVkLFxuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1zdWJ0aXRsZVwiKVxuICAgICAgfSwgc3ViVGl0bGUpKSwgZGVzY3JpcHRpb24gJiYgX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWRlc2NyaXB0aW9uXCIpXG4gICAgICB9LCBkZXNjcmlwdGlvbikpKSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTdGVwO1xufShfcmVhY3QuZGVmYXVsdC5Db21wb25lbnQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBTdGVwOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKSk7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfU3RlcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RlcFwiKSk7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7ICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMi5kZWZhdWx0KSh0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIFN0ZXBzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKFN0ZXBzLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFN0ZXBzKTtcblxuICBmdW5jdGlvbiBTdGVwcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBTdGVwcyk7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIF90aGlzLm9uU3RlcENsaWNrID0gZnVuY3Rpb24gKG5leHQpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uQ2hhbmdlID0gX3RoaXMkcHJvcHMub25DaGFuZ2UsXG4gICAgICAgICAgY3VycmVudCA9IF90aGlzJHByb3BzLmN1cnJlbnQ7XG5cbiAgICAgIGlmIChvbkNoYW5nZSAmJiBjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgIG9uQ2hhbmdlKG5leHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShTdGVwcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfY2xhc3NOYW1lcyxcbiAgICAgICAgICBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgIF90aGlzJHByb3BzMiRzdHlsZSA9IF90aGlzJHByb3BzMi5zdHlsZSxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMiRzdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfdGhpcyRwcm9wczIkc3R5bGUsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbixcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wczIuZGlyZWN0aW9uLFxuICAgICAgICAgIHR5cGUgPSBfdGhpcyRwcm9wczIudHlwZSxcbiAgICAgICAgICBsYWJlbFBsYWNlbWVudCA9IF90aGlzJHByb3BzMi5sYWJlbFBsYWNlbWVudCxcbiAgICAgICAgICBpY29uUHJlZml4ID0gX3RoaXMkcHJvcHMyLmljb25QcmVmaXgsXG4gICAgICAgICAgc3RhdHVzID0gX3RoaXMkcHJvcHMyLnN0YXR1cyxcbiAgICAgICAgICBzaXplID0gX3RoaXMkcHJvcHMyLnNpemUsXG4gICAgICAgICAgY3VycmVudCA9IF90aGlzJHByb3BzMi5jdXJyZW50LFxuICAgICAgICAgIHByb2dyZXNzRG90ID0gX3RoaXMkcHJvcHMyLnByb2dyZXNzRG90LFxuICAgICAgICAgIHN0ZXBJY29uID0gX3RoaXMkcHJvcHMyLnN0ZXBJY29uLFxuICAgICAgICAgIGluaXRpYWwgPSBfdGhpcyRwcm9wczIuaW5pdGlhbCxcbiAgICAgICAgICBpY29ucyA9IF90aGlzJHByb3BzMi5pY29ucyxcbiAgICAgICAgICBvbkNoYW5nZSA9IF90aGlzJHByb3BzMi5vbkNoYW5nZSxcbiAgICAgICAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfdGhpcyRwcm9wczIsIFtcInByZWZpeENsc1wiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJkaXJlY3Rpb25cIiwgXCJ0eXBlXCIsIFwibGFiZWxQbGFjZW1lbnRcIiwgXCJpY29uUHJlZml4XCIsIFwic3RhdHVzXCIsIFwic2l6ZVwiLCBcImN1cnJlbnRcIiwgXCJwcm9ncmVzc0RvdFwiLCBcInN0ZXBJY29uXCIsIFwiaW5pdGlhbFwiLCBcImljb25zXCIsIFwib25DaGFuZ2VcIl0pO1xuICAgICAgdmFyIGlzTmF2ID0gdHlwZSA9PT0gJ25hdmlnYXRpb24nO1xuICAgICAgdmFyIGFkanVzdGVkTGFiZWxQbGFjZW1lbnQgPSBwcm9ncmVzc0RvdCA/ICd2ZXJ0aWNhbCcgOiBsYWJlbFBsYWNlbWVudDtcbiAgICAgIHZhciBjbGFzc1N0cmluZyA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChkaXJlY3Rpb24pLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemUpLCBzaXplKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGFiZWwtXCIpLmNvbmNhdChhZGp1c3RlZExhYmVsUGxhY2VtZW50KSwgZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kb3RcIiksICEhcHJvZ3Jlc3NEb3QpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uYXZpZ2F0aW9uXCIpLCBpc05hdiksIF9jbGFzc05hbWVzKSk7XG4gICAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9LCByZXN0UHJvcHMpLCAoMCwgX3RvQXJyYXkuZGVmYXVsdCkoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgICAgIHZhciBzdGVwTnVtYmVyID0gaW5pdGlhbCArIGluZGV4O1xuXG4gICAgICAgIHZhciBjaGlsZFByb3BzID0gX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgc3RlcE51bWJlcjogXCJcIi5jb25jYXQoc3RlcE51bWJlciArIDEpLFxuICAgICAgICAgIHN0ZXBJbmRleDogc3RlcE51bWJlcixcbiAgICAgICAgICBrZXk6IHN0ZXBOdW1iZXIsXG4gICAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgaWNvblByZWZpeDogaWNvblByZWZpeCxcbiAgICAgICAgICB3cmFwcGVyU3R5bGU6IHN0eWxlLFxuICAgICAgICAgIHByb2dyZXNzRG90OiBwcm9ncmVzc0RvdCxcbiAgICAgICAgICBzdGVwSWNvbjogc3RlcEljb24sXG4gICAgICAgICAgaWNvbnM6IGljb25zLFxuICAgICAgICAgIG9uU3RlcENsaWNrOiBvbkNoYW5nZSAmJiBfdGhpczIub25TdGVwQ2xpY2tcbiAgICAgICAgfSwgY2hpbGQucHJvcHMpOyAvLyBmaXggdGFpbCBjb2xvclxuXG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJyAmJiBpbmRleCA9PT0gY3VycmVudCAtIDEpIHtcbiAgICAgICAgICBjaGlsZFByb3BzLmNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmV4dC1lcnJvclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2hpbGQucHJvcHMuc3RhdHVzKSB7XG4gICAgICAgICAgaWYgKHN0ZXBOdW1iZXIgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNoaWxkUHJvcHMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcE51bWJlciA8IGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNoaWxkUHJvcHMuc3RhdHVzID0gJ2ZpbmlzaCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkUHJvcHMuc3RhdHVzID0gJ3dhaXQnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkUHJvcHMuYWN0aXZlID0gc3RlcE51bWJlciA9PT0gY3VycmVudDtcbiAgICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgY2hpbGRQcm9wcyk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTdGVwcztcbn0oX3JlYWN0LmRlZmF1bHQuQ29tcG9uZW50KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gU3RlcHM7XG5TdGVwcy5TdGVwID0gX1N0ZXAuZGVmYXVsdDtcblN0ZXBzLmRlZmF1bHRQcm9wcyA9IHtcbiAgdHlwZTogJ2RlZmF1bHQnLFxuICBwcmVmaXhDbHM6ICdyYy1zdGVwcycsXG4gIGljb25QcmVmaXg6ICdyYycsXG4gIGRpcmVjdGlvbjogJ2hvcml6b250YWwnLFxuICBsYWJlbFBsYWNlbWVudDogJ2hvcml6b250YWwnLFxuICBpbml0aWFsOiAwLFxuICBjdXJyZW50OiAwLFxuICBzdGF0dXM6ICdwcm9jZXNzJyxcbiAgc2l6ZTogJycsXG4gIHByb2dyZXNzRG90OiBmYWxzZVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdGVwXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9TdGVwLmRlZmF1bHQ7XG4gIH1cbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX1N0ZXBzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdGVwc1wiKSk7XG5cbnZhciBfU3RlcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RlcFwiKSk7XG5cbnZhciBfZGVmYXVsdCA9IF9TdGVwcy5kZWZhdWx0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfdXNlTWVyZ2VkU3RhdGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIFN3aXRjaCA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIF9yZWYkcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICBwcmVmaXhDbHMgPSBfcmVmJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXN3aXRjaCcgOiBfcmVmJHByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgY2hlY2tlZCA9IF9yZWYuY2hlY2tlZCxcbiAgICAgIGRlZmF1bHRDaGVja2VkID0gX3JlZi5kZWZhdWx0Q2hlY2tlZCxcbiAgICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICAgIGxvYWRpbmdJY29uID0gX3JlZi5sb2FkaW5nSWNvbixcbiAgICAgIGNoZWNrZWRDaGlsZHJlbiA9IF9yZWYuY2hlY2tlZENoaWxkcmVuLFxuICAgICAgdW5DaGVja2VkQ2hpbGRyZW4gPSBfcmVmLnVuQ2hlY2tlZENoaWxkcmVuLFxuICAgICAgb25DbGljayA9IF9yZWYub25DbGljayxcbiAgICAgIG9uQ2hhbmdlID0gX3JlZi5vbkNoYW5nZSxcbiAgICAgIG9uS2V5RG93biA9IF9yZWYub25LZXlEb3duLFxuICAgICAgcmVzdFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3JlZiwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2hlY2tlZFwiLCBcImRlZmF1bHRDaGVja2VkXCIsIFwiZGlzYWJsZWRcIiwgXCJsb2FkaW5nSWNvblwiLCBcImNoZWNrZWRDaGlsZHJlblwiLCBcInVuQ2hlY2tlZENoaWxkcmVuXCIsIFwib25DbGlja1wiLCBcIm9uQ2hhbmdlXCIsIFwib25LZXlEb3duXCJdKTtcblxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gKDAsIF91c2VNZXJnZWRTdGF0ZTMuZGVmYXVsdCkoZmFsc2UsIHtcbiAgICB2YWx1ZTogY2hlY2tlZCxcbiAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRDaGVja2VkXG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICAgIGlubmVyQ2hlY2tlZCA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgICBzZXRJbm5lckNoZWNrZWQgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuXG4gIGZ1bmN0aW9uIHRyaWdnZXJDaGFuZ2UobmV3Q2hlY2tlZCwgZXZlbnQpIHtcbiAgICB2YXIgbWVyZ2VkQ2hlY2tlZCA9IGlubmVyQ2hlY2tlZDtcblxuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIG1lcmdlZENoZWNrZWQgPSBuZXdDaGVja2VkO1xuICAgICAgc2V0SW5uZXJDaGVja2VkKG1lcmdlZENoZWNrZWQpO1xuICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG1lcmdlZENoZWNrZWQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkQ2hlY2tlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uSW50ZXJuYWxLZXlEb3duKGUpIHtcbiAgICBpZiAoZS53aGljaCA9PT0gX0tleUNvZGUuZGVmYXVsdC5MRUZUKSB7XG4gICAgICB0cmlnZ2VyQ2hhbmdlKGZhbHNlLCBlKTtcbiAgICB9IGVsc2UgaWYgKGUud2hpY2ggPT09IF9LZXlDb2RlLmRlZmF1bHQuUklHSFQpIHtcbiAgICAgIHRyaWdnZXJDaGFuZ2UodHJ1ZSwgZSk7XG4gICAgfVxuXG4gICAgb25LZXlEb3duID09PSBudWxsIHx8IG9uS2V5RG93biA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25LZXlEb3duKGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25JbnRlcm5hbENsaWNrKGUpIHtcbiAgICB2YXIgcmV0ID0gdHJpZ2dlckNoYW5nZSghaW5uZXJDaGVja2VkLCBlKTsgLy8gW0xlZ2FjeV0gdHJpZ2dlciBvbkNsaWNrIHdpdGggdmFsdWVcblxuICAgIG9uQ2xpY2sgPT09IG51bGwgfHwgb25DbGljayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbGljayhyZXQsIGUpO1xuICB9XG5cbiAgdmFyIHN3aXRjaENsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrZWRcIiksIGlubmVyQ2hlY2tlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIF9jbGFzc05hbWVzKSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcywge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgcm9sZTogXCJzd2l0Y2hcIixcbiAgICBcImFyaWEtY2hlY2tlZFwiOiBpbm5lckNoZWNrZWQsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGNsYXNzTmFtZTogc3dpdGNoQ2xhc3NOYW1lLFxuICAgIHJlZjogcmVmLFxuICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd24sXG4gICAgb25DbGljazogb25JbnRlcm5hbENsaWNrXG4gIH0pLCBsb2FkaW5nSWNvbiwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lclwiKVxuICB9LCBpbm5lckNoZWNrZWQgPyBjaGVja2VkQ2hpbGRyZW4gOiB1bkNoZWNrZWRDaGlsZHJlbikpO1xufSk7XG5Td2l0Y2guZGlzcGxheU5hbWUgPSAnU3dpdGNoJztcbnZhciBfZGVmYXVsdCA9IFN3aXRjaDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX0NlbGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9DZWxsXCIpKTtcblxudmFyIF9UYWJsZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb250ZXh0L1RhYmxlQ29udGV4dFwiKSk7XG5cbnZhciBfQm9keUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb250ZXh0L0JvZHlDb250ZXh0XCIpKTtcblxudmFyIF92YWx1ZVV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbHMvdmFsdWVVdGlsXCIpO1xuXG52YXIgX0V4cGFuZGVkUm93ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9FeHBhbmRlZFJvd1wiKSk7XG5cbmZ1bmN0aW9uIEJvZHlSb3cocHJvcHMpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICByZWNvcmQgPSBwcm9wcy5yZWNvcmQsXG4gICAgICBpbmRleCA9IHByb3BzLmluZGV4LFxuICAgICAgcm93S2V5ID0gcHJvcHMucm93S2V5LFxuICAgICAgZ2V0Um93S2V5ID0gcHJvcHMuZ2V0Um93S2V5LFxuICAgICAgcm93RXhwYW5kYWJsZSA9IHByb3BzLnJvd0V4cGFuZGFibGUsXG4gICAgICBleHBhbmRlZEtleXMgPSBwcm9wcy5leHBhbmRlZEtleXMsXG4gICAgICBvblJvdyA9IHByb3BzLm9uUm93LFxuICAgICAgX3Byb3BzJGluZGVudCA9IHByb3BzLmluZGVudCxcbiAgICAgIGluZGVudCA9IF9wcm9wcyRpbmRlbnQgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkaW5kZW50LFxuICAgICAgUm93Q29tcG9uZW50ID0gcHJvcHMucm93Q29tcG9uZW50LFxuICAgICAgY2VsbENvbXBvbmVudCA9IHByb3BzLmNlbGxDb21wb25lbnQsXG4gICAgICBjaGlsZHJlbkNvbHVtbk5hbWUgPSBwcm9wcy5jaGlsZHJlbkNvbHVtbk5hbWU7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfVGFibGVDb250ZXh0LmRlZmF1bHQpLFxuICAgICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzLFxuICAgICAgZml4ZWRJbmZvTGlzdCA9IF9SZWFjdCR1c2VDb250ZXh0LmZpeGVkSW5mb0xpc3Q7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0MiA9IFJlYWN0LnVzZUNvbnRleHQoX0JvZHlDb250ZXh0LmRlZmF1bHQpLFxuICAgICAgZml4SGVhZGVyID0gX1JlYWN0JHVzZUNvbnRleHQyLmZpeEhlYWRlcixcbiAgICAgIGZpeENvbHVtbiA9IF9SZWFjdCR1c2VDb250ZXh0Mi5maXhDb2x1bW4sXG4gICAgICBob3Jpem9uU2Nyb2xsID0gX1JlYWN0JHVzZUNvbnRleHQyLmhvcml6b25TY3JvbGwsXG4gICAgICBjb21wb25lbnRXaWR0aCA9IF9SZWFjdCR1c2VDb250ZXh0Mi5jb21wb25lbnRXaWR0aCxcbiAgICAgIGZsYXR0ZW5Db2x1bW5zID0gX1JlYWN0JHVzZUNvbnRleHQyLmZsYXR0ZW5Db2x1bW5zLFxuICAgICAgZXhwYW5kYWJsZVR5cGUgPSBfUmVhY3QkdXNlQ29udGV4dDIuZXhwYW5kYWJsZVR5cGUsXG4gICAgICBleHBhbmRSb3dCeUNsaWNrID0gX1JlYWN0JHVzZUNvbnRleHQyLmV4cGFuZFJvd0J5Q2xpY2ssXG4gICAgICBvblRyaWdnZXJFeHBhbmQgPSBfUmVhY3QkdXNlQ29udGV4dDIub25UcmlnZ2VyRXhwYW5kLFxuICAgICAgcm93Q2xhc3NOYW1lID0gX1JlYWN0JHVzZUNvbnRleHQyLnJvd0NsYXNzTmFtZSxcbiAgICAgIGV4cGFuZGVkUm93Q2xhc3NOYW1lID0gX1JlYWN0JHVzZUNvbnRleHQyLmV4cGFuZGVkUm93Q2xhc3NOYW1lLFxuICAgICAgaW5kZW50U2l6ZSA9IF9SZWFjdCR1c2VDb250ZXh0Mi5pbmRlbnRTaXplLFxuICAgICAgZXhwYW5kSWNvbiA9IF9SZWFjdCR1c2VDb250ZXh0Mi5leHBhbmRJY29uLFxuICAgICAgZXhwYW5kZWRSb3dSZW5kZXIgPSBfUmVhY3QkdXNlQ29udGV4dDIuZXhwYW5kZWRSb3dSZW5kZXIsXG4gICAgICBleHBhbmRJY29uQ29sdW1uSW5kZXggPSBfUmVhY3QkdXNlQ29udGV4dDIuZXhwYW5kSWNvbkNvbHVtbkluZGV4O1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgZXhwYW5kUmVuZGVkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldEV4cGFuZFJlbmRlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIGV4cGFuZGVkID0gZXhwYW5kZWRLZXlzICYmIGV4cGFuZGVkS2V5cy5oYXMocHJvcHMucmVjb3JkS2V5KTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgIHNldEV4cGFuZFJlbmRlZCh0cnVlKTtcbiAgICB9XG4gIH0sIFtleHBhbmRlZF0pO1xuICB2YXIgcm93U3VwcG9ydEV4cGFuZCA9IGV4cGFuZGFibGVUeXBlID09PSAncm93JyAmJiAoIXJvd0V4cGFuZGFibGUgfHwgcm93RXhwYW5kYWJsZShyZWNvcmQpKTsgLy8gT25seSB3aGVuIHJvdyBpcyBub3QgZXhwYW5kYWJsZSBhbmQgYGNoaWxkcmVuYCBleGlzdCBpbiByZWNvcmRcblxuICB2YXIgbmVzdEV4cGFuZGFibGUgPSBleHBhbmRhYmxlVHlwZSA9PT0gJ25lc3QnO1xuICB2YXIgaGFzTmVzdENoaWxkcmVuID0gY2hpbGRyZW5Db2x1bW5OYW1lICYmIHJlY29yZCAmJiByZWNvcmRbY2hpbGRyZW5Db2x1bW5OYW1lXTtcbiAgdmFyIG1lcmdlZEV4cGFuZGFibGUgPSByb3dTdXBwb3J0RXhwYW5kIHx8IG5lc3RFeHBhbmRhYmxlOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gb25Sb3cgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGFkZGl0aW9uYWxQcm9wcztcblxuICBpZiAob25Sb3cpIHtcbiAgICBhZGRpdGlvbmFsUHJvcHMgPSBvblJvdyhyZWNvcmQsIGluZGV4KTtcbiAgfVxuXG4gIHZhciBvbkNsaWNrID0gZnVuY3Rpb24gb25DbGljayhldmVudCkge1xuICAgIGlmIChleHBhbmRSb3dCeUNsaWNrICYmIG1lcmdlZEV4cGFuZGFibGUpIHtcbiAgICAgIG9uVHJpZ2dlckV4cGFuZChyZWNvcmQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoYWRkaXRpb25hbFByb3BzICYmIGFkZGl0aW9uYWxQcm9wcy5vbkNsaWNrKSB7XG4gICAgICB2YXIgX2FkZGl0aW9uYWxQcm9wcztcblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgKF9hZGRpdGlvbmFsUHJvcHMgPSBhZGRpdGlvbmFsUHJvcHMpLm9uQ2xpY2suYXBwbHkoX2FkZGl0aW9uYWxQcm9wcywgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEJhc2UgdHIgcm93ID09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIGNvbXB1dGVSb3dDbGFzc05hbWU7XG5cbiAgaWYgKHR5cGVvZiByb3dDbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29tcHV0ZVJvd0NsYXNzTmFtZSA9IHJvd0NsYXNzTmFtZTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygcm93Q2xhc3NOYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29tcHV0ZVJvd0NsYXNzTmFtZSA9IHJvd0NsYXNzTmFtZShyZWNvcmQsIGluZGV4LCBpbmRlbnQpO1xuICB9XG5cbiAgdmFyIGNvbHVtbnNLZXkgPSAoMCwgX3ZhbHVlVXRpbC5nZXRDb2x1bW5zS2V5KShmbGF0dGVuQ29sdW1ucyk7XG4gIHZhciBiYXNlUm93Tm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm93Q29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBhZGRpdGlvbmFsUHJvcHMsIHtcbiAgICBcImRhdGEtcm93LWtleVwiOiByb3dLZXksXG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoY2xhc3NOYW1lLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJvd1wiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctbGV2ZWwtXCIpLmNvbmNhdChpbmRlbnQpLCBjb21wdXRlUm93Q2xhc3NOYW1lLCBhZGRpdGlvbmFsUHJvcHMgJiYgYWRkaXRpb25hbFByb3BzLmNsYXNzTmFtZSksXG4gICAgc3R5bGU6ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHN0eWxlKSwgYWRkaXRpb25hbFByb3BzID8gYWRkaXRpb25hbFByb3BzLnN0eWxlIDogbnVsbCksXG4gICAgb25DbGljazogb25DbGlja1xuICB9KSwgZmxhdHRlbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4sIGNvbEluZGV4KSB7XG4gICAgdmFyIHJlbmRlciA9IGNvbHVtbi5yZW5kZXIsXG4gICAgICAgIGRhdGFJbmRleCA9IGNvbHVtbi5kYXRhSW5kZXgsXG4gICAgICAgIGNvbHVtbkNsYXNzTmFtZSA9IGNvbHVtbi5jbGFzc05hbWU7XG4gICAgdmFyIGtleSA9IGNvbHVtbnNLZXlbY29sSW5kZXhdO1xuICAgIHZhciBmaXhlZEluZm8gPSBmaXhlZEluZm9MaXN0W2NvbEluZGV4XTsgLy8gPT09PT09PT09PT09PSBVc2VkIGZvciBuZXN0IGV4cGFuZGFibGUgPT09PT09PT09PT09PVxuXG4gICAgdmFyIGFwcGVuZENlbGxOb2RlO1xuXG4gICAgaWYgKGNvbEluZGV4ID09PSAoZXhwYW5kSWNvbkNvbHVtbkluZGV4IHx8IDApICYmIG5lc3RFeHBhbmRhYmxlKSB7XG4gICAgICBhcHBlbmRDZWxsTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBwYWRkaW5nTGVmdDogXCJcIi5jb25jYXQoaW5kZW50U2l6ZSAqIGluZGVudCwgXCJweFwiKVxuICAgICAgICB9LFxuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcm93LWluZGVudCBpbmRlbnQtbGV2ZWwtXCIpLmNvbmNhdChpbmRlbnQpXG4gICAgICB9KSwgZXhwYW5kSWNvbih7XG4gICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICBleHBhbmRlZDogZXhwYW5kZWQsXG4gICAgICAgIGV4cGFuZGFibGU6IGhhc05lc3RDaGlsZHJlbixcbiAgICAgICAgcmVjb3JkOiByZWNvcmQsXG4gICAgICAgIG9uRXhwYW5kOiBvblRyaWdnZXJFeHBhbmRcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICB2YXIgYWRkaXRpb25hbENlbGxQcm9wcztcblxuICAgIGlmIChjb2x1bW4ub25DZWxsKSB7XG4gICAgICBhZGRpdGlvbmFsQ2VsbFByb3BzID0gY29sdW1uLm9uQ2VsbChyZWNvcmQsIGluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQ2VsbC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGNsYXNzTmFtZTogY29sdW1uQ2xhc3NOYW1lLFxuICAgICAgZWxsaXBzaXM6IGNvbHVtbi5lbGxpcHNpcyxcbiAgICAgIGFsaWduOiBjb2x1bW4uYWxpZ24sXG4gICAgICBjb21wb25lbnQ6IGNlbGxDb21wb25lbnQsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGtleToga2V5LFxuICAgICAgcmVjb3JkOiByZWNvcmQsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBkYXRhSW5kZXg6IGRhdGFJbmRleCxcbiAgICAgIHJlbmRlcjogcmVuZGVyLFxuICAgICAgc2hvdWxkQ2VsbFVwZGF0ZTogY29sdW1uLnNob3VsZENlbGxVcGRhdGVcbiAgICB9LCBmaXhlZEluZm8sIHtcbiAgICAgIGFwcGVuZE5vZGU6IGFwcGVuZENlbGxOb2RlLFxuICAgICAgYWRkaXRpb25hbFByb3BzOiBhZGRpdGlvbmFsQ2VsbFByb3BzXG4gICAgfSkpO1xuICB9KSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBFeHBhbmQgUm93ID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgZXhwYW5kUm93Tm9kZTtcblxuICBpZiAocm93U3VwcG9ydEV4cGFuZCAmJiAoZXhwYW5kUmVuZGVkIHx8IGV4cGFuZGVkKSkge1xuICAgIHZhciBleHBhbmRDb250ZW50ID0gZXhwYW5kZWRSb3dSZW5kZXIocmVjb3JkLCBpbmRleCwgaW5kZW50ICsgMSwgZXhwYW5kZWQpO1xuICAgIHZhciBjb21wdXRlZEV4cGFuZGVkUm93Q2xhc3NOYW1lID0gZXhwYW5kZWRSb3dDbGFzc05hbWUgJiYgZXhwYW5kZWRSb3dDbGFzc05hbWUocmVjb3JkLCBpbmRleCwgaW5kZW50KTtcbiAgICBleHBhbmRSb3dOb2RlID0gUmVhY3QuY3JlYXRlRWxlbWVudChfRXhwYW5kZWRSb3cuZGVmYXVsdCwge1xuICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1leHBhbmRlZC1yb3dcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZXhwYW5kZWQtcm93LWxldmVsLVwiKS5jb25jYXQoaW5kZW50ICsgMSksIGNvbXB1dGVkRXhwYW5kZWRSb3dDbGFzc05hbWUpLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBmaXhIZWFkZXI6IGZpeEhlYWRlcixcbiAgICAgIGZpeENvbHVtbjogZml4Q29sdW1uLFxuICAgICAgaG9yaXpvblNjcm9sbDogaG9yaXpvblNjcm9sbCxcbiAgICAgIGNvbXBvbmVudDogUm93Q29tcG9uZW50LFxuICAgICAgY29tcG9uZW50V2lkdGg6IGNvbXBvbmVudFdpZHRoLFxuICAgICAgY2VsbENvbXBvbmVudDogY2VsbENvbXBvbmVudCxcbiAgICAgIGNvbFNwYW46IGZsYXR0ZW5Db2x1bW5zLmxlbmd0aFxuICAgIH0sIGV4cGFuZENvbnRlbnQpO1xuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gTmVzdCBSb3cgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBuZXN0Um93Tm9kZTtcblxuICBpZiAoaGFzTmVzdENoaWxkcmVuICYmIGV4cGFuZGVkKSB7XG4gICAgbmVzdFJvd05vZGUgPSAocmVjb3JkW2NoaWxkcmVuQ29sdW1uTmFtZV0gfHwgW10pLm1hcChmdW5jdGlvbiAoc3ViUmVjb3JkLCBzdWJJbmRleCkge1xuICAgICAgdmFyIHN1YktleSA9IGdldFJvd0tleShzdWJSZWNvcmQsIHN1YkluZGV4KTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEJvZHlSb3csIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIGtleTogc3ViS2V5LFxuICAgICAgICByb3dLZXk6IHN1YktleSxcbiAgICAgICAgcmVjb3JkOiBzdWJSZWNvcmQsXG4gICAgICAgIHJlY29yZEtleTogc3ViS2V5LFxuICAgICAgICBpbmRleDogc3ViSW5kZXgsXG4gICAgICAgIGluZGVudDogaW5kZW50ICsgMVxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGJhc2VSb3dOb2RlLCBleHBhbmRSb3dOb2RlLCBuZXN0Um93Tm9kZSk7XG59XG5cbkJvZHlSb3cuZGlzcGxheU5hbWUgPSAnQm9keVJvdyc7XG52YXIgX2RlZmF1bHQgPSBCb2R5Um93O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0NlbGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9DZWxsXCIpKTtcblxudmFyIF9UYWJsZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb250ZXh0L1RhYmxlQ29udGV4dFwiKSk7XG5cbmZ1bmN0aW9uIEV4cGFuZGVkUm93KF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgICAgQ29tcG9uZW50ID0gX3JlZi5jb21wb25lbnQsXG4gICAgICBjZWxsQ29tcG9uZW50ID0gX3JlZi5jZWxsQ29tcG9uZW50LFxuICAgICAgZml4SGVhZGVyID0gX3JlZi5maXhIZWFkZXIsXG4gICAgICBmaXhDb2x1bW4gPSBfcmVmLmZpeENvbHVtbixcbiAgICAgIGhvcml6b25TY3JvbGwgPSBfcmVmLmhvcml6b25TY3JvbGwsXG4gICAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIGV4cGFuZGVkID0gX3JlZi5leHBhbmRlZCxcbiAgICAgIGNvbXBvbmVudFdpZHRoID0gX3JlZi5jb21wb25lbnRXaWR0aCxcbiAgICAgIGNvbFNwYW4gPSBfcmVmLmNvbFNwYW47XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfVGFibGVDb250ZXh0LmRlZmF1bHQpLFxuICAgICAgc2Nyb2xsYmFyU2l6ZSA9IF9SZWFjdCR1c2VDb250ZXh0LnNjcm9sbGJhclNpemU7IC8vIENhY2hlIHJlbmRlciBub2RlXG5cblxuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRlbnROb2RlID0gY2hpbGRyZW47XG5cbiAgICBpZiAoZml4Q29sdW1uKSB7XG4gICAgICBjb250ZW50Tm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHdpZHRoOiBjb21wb25lbnRXaWR0aCAtIChmaXhIZWFkZXIgPyBzY3JvbGxiYXJTaXplIDogMCksXG4gICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxuICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1leHBhbmRlZC1yb3ctZml4ZWRcIilcbiAgICAgIH0sIGNvbnRlbnROb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogZXhwYW5kZWQgPyBudWxsIDogJ25vbmUnXG4gICAgICB9XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChfQ2VsbC5kZWZhdWx0LCB7XG4gICAgICBjb21wb25lbnQ6IGNlbGxDb21wb25lbnQsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNvbFNwYW46IGNvbFNwYW5cbiAgICB9LCBjb250ZW50Tm9kZSkpO1xuICB9LCBbY2hpbGRyZW4sIENvbXBvbmVudCwgZml4SGVhZGVyLCBob3Jpem9uU2Nyb2xsLCBjbGFzc05hbWUsIGV4cGFuZGVkLCBjb21wb25lbnRXaWR0aCwgY29sU3Bhbiwgc2Nyb2xsYmFyU2l6ZV0pO1xufVxuXG52YXIgX2RlZmF1bHQgPSBFeHBhbmRlZFJvdztcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IE1lYXN1cmVDZWxsO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjUmVzaXplT2JzZXJ2ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1yZXNpemUtb2JzZXJ2ZXJcIikpO1xuXG5mdW5jdGlvbiBNZWFzdXJlQ2VsbChfcmVmKSB7XG4gIHZhciBjb2x1bW5LZXkgPSBfcmVmLmNvbHVtbktleSxcbiAgICAgIG9uQ29sdW1uUmVzaXplID0gX3JlZi5vbkNvbHVtblJlc2l6ZTtcbiAgdmFyIGNlbGxSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2VsbFJlZi5jdXJyZW50KSB7XG4gICAgICBvbkNvbHVtblJlc2l6ZShjb2x1bW5LZXksIGNlbGxSZWYuY3VycmVudC5vZmZzZXRXaWR0aCk7XG4gICAgfVxuICB9LCBbXSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY1Jlc2l6ZU9ic2VydmVyLmRlZmF1bHQsIHtcbiAgICBvblJlc2l6ZTogZnVuY3Rpb24gb25SZXNpemUoX3JlZjIpIHtcbiAgICAgIHZhciBvZmZzZXRXaWR0aCA9IF9yZWYyLm9mZnNldFdpZHRoO1xuICAgICAgb25Db2x1bW5SZXNpemUoY29sdW1uS2V5LCBvZmZzZXRXaWR0aCk7XG4gICAgfVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGRcIiwge1xuICAgIHJlZjogY2VsbFJlZixcbiAgICBzdHlsZToge1xuICAgICAgcGFkZGluZzogMCxcbiAgICAgIGJvcmRlcjogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH1cbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH1cbiAgfSwgXCJcXHhBMFwiKSkpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9Cb2R5Um93ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Cb2R5Um93XCIpKTtcblxudmFyIF9UYWJsZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb250ZXh0L1RhYmxlQ29udGV4dFwiKSk7XG5cbnZhciBfRXhwYW5kZWRSb3cgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0V4cGFuZGVkUm93XCIpKTtcblxudmFyIF9Cb2R5Q29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbnRleHQvQm9keUNvbnRleHRcIikpO1xuXG52YXIgX3ZhbHVlVXRpbCA9IHJlcXVpcmUoXCIuLi91dGlscy92YWx1ZVV0aWxcIik7XG5cbnZhciBfUmVzaXplQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbnRleHQvUmVzaXplQ29udGV4dFwiKSk7XG5cbnZhciBfTWVhc3VyZUNlbGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL01lYXN1cmVDZWxsXCIpKTtcblxuZnVuY3Rpb24gQm9keShfcmVmKSB7XG4gIHZhciBkYXRhID0gX3JlZi5kYXRhLFxuICAgICAgZ2V0Um93S2V5ID0gX3JlZi5nZXRSb3dLZXksXG4gICAgICBtZWFzdXJlQ29sdW1uV2lkdGggPSBfcmVmLm1lYXN1cmVDb2x1bW5XaWR0aCxcbiAgICAgIGV4cGFuZGVkS2V5cyA9IF9yZWYuZXhwYW5kZWRLZXlzLFxuICAgICAgb25Sb3cgPSBfcmVmLm9uUm93LFxuICAgICAgcm93RXhwYW5kYWJsZSA9IF9yZWYucm93RXhwYW5kYWJsZSxcbiAgICAgIGVtcHR5Tm9kZSA9IF9yZWYuZW1wdHlOb2RlLFxuICAgICAgY2hpbGRyZW5Db2x1bW5OYW1lID0gX3JlZi5jaGlsZHJlbkNvbHVtbk5hbWU7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfUmVzaXplQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIG9uQ29sdW1uUmVzaXplID0gX1JlYWN0JHVzZUNvbnRleHQub25Db2x1bW5SZXNpemU7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0MiA9IFJlYWN0LnVzZUNvbnRleHQoX1RhYmxlQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0Mi5wcmVmaXhDbHMsXG4gICAgICBnZXRDb21wb25lbnQgPSBfUmVhY3QkdXNlQ29udGV4dDIuZ2V0Q29tcG9uZW50O1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDMgPSBSZWFjdC51c2VDb250ZXh0KF9Cb2R5Q29udGV4dC5kZWZhdWx0KSxcbiAgICAgIGZpeEhlYWRlciA9IF9SZWFjdCR1c2VDb250ZXh0My5maXhIZWFkZXIsXG4gICAgICBob3Jpem9uU2Nyb2xsID0gX1JlYWN0JHVzZUNvbnRleHQzLmhvcml6b25TY3JvbGwsXG4gICAgICBmbGF0dGVuQ29sdW1ucyA9IF9SZWFjdCR1c2VDb250ZXh0My5mbGF0dGVuQ29sdW1ucyxcbiAgICAgIGNvbXBvbmVudFdpZHRoID0gX1JlYWN0JHVzZUNvbnRleHQzLmNvbXBvbmVudFdpZHRoO1xuXG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgV3JhcHBlckNvbXBvbmVudCA9IGdldENvbXBvbmVudChbJ2JvZHknLCAnd3JhcHBlciddLCAndGJvZHknKTtcbiAgICB2YXIgdHJDb21wb25lbnQgPSBnZXRDb21wb25lbnQoWydib2R5JywgJ3JvdyddLCAndHInKTtcbiAgICB2YXIgdGRDb21wb25lbnQgPSBnZXRDb21wb25lbnQoWydib2R5JywgJ2NlbGwnXSwgJ3RkJyk7XG4gICAgdmFyIHJvd3M7XG5cbiAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgIHJvd3MgPSBkYXRhLm1hcChmdW5jdGlvbiAocmVjb3JkLCBpbmRleCkge1xuICAgICAgICB2YXIga2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfQm9keVJvdy5kZWZhdWx0LCB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgcm93S2V5OiBrZXksXG4gICAgICAgICAgcmVjb3JkOiByZWNvcmQsXG4gICAgICAgICAgcmVjb3JkS2V5OiBrZXksXG4gICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgIHJvd0NvbXBvbmVudDogdHJDb21wb25lbnQsXG4gICAgICAgICAgY2VsbENvbXBvbmVudDogdGRDb21wb25lbnQsXG4gICAgICAgICAgZXhwYW5kZWRLZXlzOiBleHBhbmRlZEtleXMsXG4gICAgICAgICAgb25Sb3c6IG9uUm93LFxuICAgICAgICAgIGdldFJvd0tleTogZ2V0Um93S2V5LFxuICAgICAgICAgIHJvd0V4cGFuZGFibGU6IHJvd0V4cGFuZGFibGUsXG4gICAgICAgICAgY2hpbGRyZW5Db2x1bW5OYW1lOiBjaGlsZHJlbkNvbHVtbk5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm93cyA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0V4cGFuZGVkUm93LmRlZmF1bHQsIHtcbiAgICAgICAgZXhwYW5kZWQ6IHRydWUsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wbGFjZWhvbGRlclwiKSxcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGZpeEhlYWRlcjogZml4SGVhZGVyLFxuICAgICAgICBmaXhDb2x1bW46IGhvcml6b25TY3JvbGwsXG4gICAgICAgIGhvcml6b25TY3JvbGw6IGhvcml6b25TY3JvbGwsXG4gICAgICAgIGNvbXBvbmVudDogdHJDb21wb25lbnQsXG4gICAgICAgIGNvbXBvbmVudFdpZHRoOiBjb21wb25lbnRXaWR0aCxcbiAgICAgICAgY2VsbENvbXBvbmVudDogdGRDb21wb25lbnQsXG4gICAgICAgIGNvbFNwYW46IGZsYXR0ZW5Db2x1bW5zLmxlbmd0aFxuICAgICAgfSwgZW1wdHlOb2RlKTtcbiAgICB9XG5cbiAgICB2YXIgY29sdW1uc0tleSA9ICgwLCBfdmFsdWVVdGlsLmdldENvbHVtbnNLZXkpKGZsYXR0ZW5Db2x1bW5zKTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVyQ29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGJvZHlcIilcbiAgICB9LCBtZWFzdXJlQ29sdW1uV2lkdGggJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIHtcbiAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVhc3VyZS1yb3dcIiksXG4gICAgICBzdHlsZToge1xuICAgICAgICBoZWlnaHQ6IDBcbiAgICAgIH1cbiAgICB9LCBjb2x1bW5zS2V5Lm1hcChmdW5jdGlvbiAoY29sdW1uS2V5KSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfTWVhc3VyZUNlbGwuZGVmYXVsdCwge1xuICAgICAgICBrZXk6IGNvbHVtbktleSxcbiAgICAgICAgY29sdW1uS2V5OiBjb2x1bW5LZXksXG4gICAgICAgIG9uQ29sdW1uUmVzaXplOiBvbkNvbHVtblJlc2l6ZVxuICAgICAgfSk7XG4gICAgfSkpLCByb3dzKTtcbiAgfSwgW2RhdGEsIHByZWZpeENscywgb25Sb3csIG1lYXN1cmVDb2x1bW5XaWR0aCwgZXhwYW5kZWRLZXlzLCBnZXRSb3dLZXksIGdldENvbXBvbmVudCwgY29tcG9uZW50V2lkdGgsIGVtcHR5Tm9kZSwgZmxhdHRlbkNvbHVtbnNdKTtcbn1cblxudmFyIE1lbW9Cb2R5ID0gUmVhY3QubWVtbyhCb2R5KTtcbk1lbW9Cb2R5LmRpc3BsYXlOYW1lID0gJ0JvZHknO1xudmFyIF9kZWZhdWx0ID0gTWVtb0JvZHk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcmVmMyA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yZWZcIik7XG5cbnZhciBfdmFsdWVVdGlsID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbHVlVXRpbFwiKTtcblxuZnVuY3Rpb24gaXNSZW5kZXJDZWxsKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgJiYgKDAsIF90eXBlb2YyLmRlZmF1bHQpKGRhdGEpID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSAmJiAhUmVhY3QuaXNWYWxpZEVsZW1lbnQoZGF0YSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVmQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICAvLyBTdHJpbmcgdGFnIGNvbXBvbmVudCBhbHNvIHN1cHBvcnQgcmVmXG4gIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfcmVmMy5zdXBwb3J0UmVmKShjb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBDZWxsKF9yZWYsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICByZWNvcmQgPSBfcmVmLnJlY29yZCxcbiAgICAgIGluZGV4ID0gX3JlZi5pbmRleCxcbiAgICAgIGRhdGFJbmRleCA9IF9yZWYuZGF0YUluZGV4LFxuICAgICAgcmVuZGVyID0gX3JlZi5yZW5kZXIsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBfcmVmJGNvbXBvbmVudCA9IF9yZWYuY29tcG9uZW50LFxuICAgICAgQ29tcG9uZW50ID0gX3JlZiRjb21wb25lbnQgPT09IHZvaWQgMCA/ICd0ZCcgOiBfcmVmJGNvbXBvbmVudCxcbiAgICAgIGNvbFNwYW4gPSBfcmVmLmNvbFNwYW4sXG4gICAgICByb3dTcGFuID0gX3JlZi5yb3dTcGFuLFxuICAgICAgZml4TGVmdCA9IF9yZWYuZml4TGVmdCxcbiAgICAgIGZpeFJpZ2h0ID0gX3JlZi5maXhSaWdodCxcbiAgICAgIGZpcnN0Rml4TGVmdCA9IF9yZWYuZmlyc3RGaXhMZWZ0LFxuICAgICAgbGFzdEZpeExlZnQgPSBfcmVmLmxhc3RGaXhMZWZ0LFxuICAgICAgZmlyc3RGaXhSaWdodCA9IF9yZWYuZmlyc3RGaXhSaWdodCxcbiAgICAgIGxhc3RGaXhSaWdodCA9IF9yZWYubGFzdEZpeFJpZ2h0LFxuICAgICAgYXBwZW5kTm9kZSA9IF9yZWYuYXBwZW5kTm9kZSxcbiAgICAgIF9yZWYkYWRkaXRpb25hbFByb3BzID0gX3JlZi5hZGRpdGlvbmFsUHJvcHMsXG4gICAgICBhZGRpdGlvbmFsUHJvcHMgPSBfcmVmJGFkZGl0aW9uYWxQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJGFkZGl0aW9uYWxQcm9wcyxcbiAgICAgIGVsbGlwc2lzID0gX3JlZi5lbGxpcHNpcyxcbiAgICAgIGFsaWduID0gX3JlZi5hbGlnbixcbiAgICAgIHJvd1R5cGUgPSBfcmVmLnJvd1R5cGUsXG4gICAgICBpc1N0aWNreSA9IF9yZWYuaXNTdGlja3k7XG4gIHZhciBjZWxsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpOyAvLyA9PT09PT09PT09PT09PT09PT09PSBDaGlsZCBOb2RlID09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGNlbGxQcm9wcztcbiAgdmFyIGNoaWxkTm9kZTtcblxuICBpZiAoY2hpbGRyZW4pIHtcbiAgICBjaGlsZE5vZGUgPSBjaGlsZHJlbjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmFsdWUgPSAoMCwgX3ZhbHVlVXRpbC5nZXRQYXRoVmFsdWUpKHJlY29yZCwgZGF0YUluZGV4KTsgLy8gQ3VzdG9taXplIHJlbmRlciBub2RlXG5cbiAgICBjaGlsZE5vZGUgPSB2YWx1ZTtcblxuICAgIGlmIChyZW5kZXIpIHtcbiAgICAgIHZhciByZW5kZXJEYXRhID0gcmVuZGVyKHZhbHVlLCByZWNvcmQsIGluZGV4KTtcblxuICAgICAgaWYgKGlzUmVuZGVyQ2VsbChyZW5kZXJEYXRhKSkge1xuICAgICAgICBjaGlsZE5vZGUgPSByZW5kZXJEYXRhLmNoaWxkcmVuO1xuICAgICAgICBjZWxsUHJvcHMgPSByZW5kZXJEYXRhLnByb3BzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGROb2RlID0gcmVuZGVyRGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gTm90IGNyYXNoIGlmIGZpbmFsIGBjaGlsZE5vZGVgIGlzIG5vdCB2YWxpZGF0ZSBSZWFjdE5vZGVcblxuXG4gIGlmICgoMCwgX3R5cGVvZjIuZGVmYXVsdCkoY2hpbGROb2RlKSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY2hpbGROb2RlKSAmJiAhUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGROb2RlKSkge1xuICAgIGNoaWxkTm9kZSA9IG51bGw7XG4gIH1cblxuICBpZiAoZWxsaXBzaXMgJiYgKGxhc3RGaXhMZWZ0IHx8IGZpcnN0Rml4UmlnaHQpKSB7XG4gICAgY2hpbGROb2RlID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1jb250ZW50XCIpXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuXG4gIHZhciBfcmVmMiA9IGNlbGxQcm9wcyB8fCB7fSxcbiAgICAgIGNlbGxDb2xTcGFuID0gX3JlZjIuY29sU3BhbixcbiAgICAgIGNlbGxSb3dTcGFuID0gX3JlZjIucm93U3BhbixcbiAgICAgIGNlbGxTdHlsZSA9IF9yZWYyLnN0eWxlLFxuICAgICAgY2VsbENsYXNzTmFtZSA9IF9yZWYyLmNsYXNzTmFtZSxcbiAgICAgIHJlc3RDZWxsUHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfcmVmMiwgW1wiY29sU3BhblwiLCBcInJvd1NwYW5cIiwgXCJzdHlsZVwiLCBcImNsYXNzTmFtZVwiXSk7XG5cbiAgdmFyIG1lcmdlZENvbFNwYW4gPSBjZWxsQ29sU3BhbiAhPT0gdW5kZWZpbmVkID8gY2VsbENvbFNwYW4gOiBjb2xTcGFuO1xuICB2YXIgbWVyZ2VkUm93U3BhbiA9IGNlbGxSb3dTcGFuICE9PSB1bmRlZmluZWQgPyBjZWxsUm93U3BhbiA6IHJvd1NwYW47XG5cbiAgaWYgKG1lcmdlZENvbFNwYW4gPT09IDAgfHwgbWVyZ2VkUm93U3BhbiA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT0gRml4ZWQgPT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBmaXhlZFN0eWxlID0ge307XG4gIHZhciBpc0ZpeExlZnQgPSB0eXBlb2YgZml4TGVmdCA9PT0gJ251bWJlcic7XG4gIHZhciBpc0ZpeFJpZ2h0ID0gdHlwZW9mIGZpeFJpZ2h0ID09PSAnbnVtYmVyJztcblxuICBpZiAoaXNGaXhMZWZ0KSB7XG4gICAgZml4ZWRTdHlsZS5wb3NpdGlvbiA9ICdzdGlja3knO1xuICAgIGZpeGVkU3R5bGUubGVmdCA9IGZpeExlZnQ7XG4gIH1cblxuICBpZiAoaXNGaXhSaWdodCkge1xuICAgIGZpeGVkU3R5bGUucG9zaXRpb24gPSAnc3RpY2t5JztcbiAgICBmaXhlZFN0eWxlLnJpZ2h0ID0gZml4UmlnaHQ7XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PSBBbGlnbiA9PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIGFsaWduU3R5bGUgPSB7fTtcblxuICBpZiAoYWxpZ24pIHtcbiAgICBhbGlnblN0eWxlLnRleHRBbGlnbiA9IGFsaWduO1xuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciB0aXRsZTtcbiAgdmFyIGVsbGlwc2lzQ29uZmlnID0gZWxsaXBzaXMgPT09IHRydWUgPyB7XG4gICAgc2hvd1RpdGxlOiB0cnVlXG4gIH0gOiBlbGxpcHNpcztcblxuICBpZiAoZWxsaXBzaXNDb25maWcgJiYgKGVsbGlwc2lzQ29uZmlnLnNob3dUaXRsZSB8fCByb3dUeXBlID09PSAnaGVhZGVyJykpIHtcbiAgICBpZiAodHlwZW9mIGNoaWxkTm9kZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxkTm9kZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRpdGxlID0gY2hpbGROb2RlLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZE5vZGUpICYmIHR5cGVvZiBjaGlsZE5vZGUucHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aXRsZSA9IGNoaWxkTm9kZS5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tcG9uZW50UHJvcHMgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAgdGl0bGU6IHRpdGxlXG4gIH0sIHJlc3RDZWxsUHJvcHMpLCBhZGRpdGlvbmFsUHJvcHMpLCB7fSwge1xuICAgIGNvbFNwYW46IG1lcmdlZENvbFNwYW4gJiYgbWVyZ2VkQ29sU3BhbiAhPT0gMSA/IG1lcmdlZENvbFNwYW4gOiBudWxsLFxuICAgIHJvd1NwYW46IG1lcmdlZFJvd1NwYW4gJiYgbWVyZ2VkUm93U3BhbiAhPT0gMSA/IG1lcmdlZFJvd1NwYW4gOiBudWxsLFxuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGNlbGxQcmVmaXhDbHMsIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1maXgtbGVmdFwiKSwgaXNGaXhMZWZ0KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWZpeC1sZWZ0LWZpcnN0XCIpLCBmaXJzdEZpeExlZnQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZml4LWxlZnQtbGFzdFwiKSwgbGFzdEZpeExlZnQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZml4LXJpZ2h0XCIpLCBpc0ZpeFJpZ2h0KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWZpeC1yaWdodC1maXJzdFwiKSwgZmlyc3RGaXhSaWdodCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1maXgtcmlnaHQtbGFzdFwiKSwgbGFzdEZpeFJpZ2h0KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWVsbGlwc2lzXCIpLCBlbGxpcHNpcyksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi13aXRoLWFwcGVuZFwiKSwgYXBwZW5kTm9kZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1maXgtc3RpY2t5XCIpLCAoaXNGaXhMZWZ0IHx8IGlzRml4UmlnaHQpICYmIGlzU3RpY2t5KSwgX2NsYXNzTmFtZXMpLCBhZGRpdGlvbmFsUHJvcHMuY2xhc3NOYW1lLCBjZWxsQ2xhc3NOYW1lKSxcbiAgICBzdHlsZTogKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBhZGRpdGlvbmFsUHJvcHMuc3R5bGUpLCBhbGlnblN0eWxlKSwgZml4ZWRTdHlsZSksIGNlbGxTdHlsZSksXG4gICAgcmVmOiBpc1JlZkNvbXBvbmVudChDb21wb25lbnQpID8gcmVmIDogbnVsbFxuICB9KTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBjb21wb25lbnRQcm9wcyksIGFwcGVuZE5vZGUsIGNoaWxkTm9kZSk7XG59XG5cbnZhciBSZWZDZWxsID0gUmVhY3QuZm9yd2FyZFJlZihDZWxsKTtcblJlZkNlbGwuZGlzcGxheU5hbWUgPSAnQ2VsbCc7XG52YXIgTWVtb0NlbGwgPSBSZWFjdC5tZW1vKFJlZkNlbGwsIGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gIGlmIChuZXh0LnNob3VsZENlbGxVcGRhdGUpIHtcbiAgICByZXR1cm4gIW5leHQuc2hvdWxkQ2VsbFVwZGF0ZShuZXh0LnJlY29yZCwgcHJldi5yZWNvcmQpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSk7XG52YXIgX2RlZmF1bHQgPSBNZW1vQ2VsbDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2xlZ2FjeVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy9sZWdhY3lVdGlsXCIpO1xuXG5mdW5jdGlvbiBDb2xHcm91cChfcmVmKSB7XG4gIHZhciBjb2xXaWR0aHMgPSBfcmVmLmNvbFdpZHRocyxcbiAgICAgIGNvbHVtbnMgPSBfcmVmLmNvbHVtbnMsXG4gICAgICBjb2x1bUNvdW50ID0gX3JlZi5jb2x1bUNvdW50O1xuICB2YXIgY29scyA9IFtdO1xuICB2YXIgbGVuID0gY29sdW1Db3VudCB8fCBjb2x1bW5zLmxlbmd0aDsgLy8gT25seSBpbnNlcnQgY29sIHdpdGggd2lkdGggJiBhZGRpdGlvbmFsIHByb3BzXG4gIC8vIFNraXAgaWYgcmVzdCBjb2wgZG8gbm90IGhhdmUgYW55IHVzZWZ1bCBpbmZvXG5cbiAgdmFyIG11c3RJbnNlcnQgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICB2YXIgd2lkdGggPSBjb2xXaWR0aHNbaV07XG4gICAgdmFyIGNvbHVtbiA9IGNvbHVtbnMgJiYgY29sdW1uc1tpXTtcbiAgICB2YXIgYWRkaXRpb25hbFByb3BzID0gY29sdW1uICYmIGNvbHVtbltfbGVnYWN5VXRpbC5JTlRFUk5BTF9DT0xfREVGSU5FXTtcblxuICAgIGlmICh3aWR0aCB8fCBhZGRpdGlvbmFsUHJvcHMgfHwgbXVzdEluc2VydCkge1xuICAgICAgY29scy51bnNoaWZ0KFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2xcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGtleTogaSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgbWluV2lkdGg6IHdpZHRoXG4gICAgICAgIH1cbiAgICAgIH0sIGFkZGl0aW9uYWxQcm9wcykpKTtcbiAgICAgIG11c3RJbnNlcnQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiY29sZ3JvdXBcIiwgbnVsbCwgY29scyk7XG59XG5cbnZhciBfZGVmYXVsdCA9IENvbEdyb3VwO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gU3VtbWFyeUNlbGw7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfQ2VsbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL0NlbGxcIikpO1xuXG52YXIgX1RhYmxlQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbnRleHQvVGFibGVDb250ZXh0XCIpKTtcblxuZnVuY3Rpb24gU3VtbWFyeUNlbGwoX3JlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBpbmRleCA9IF9yZWYuaW5kZXgsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBjb2xTcGFuID0gX3JlZi5jb2xTcGFuLFxuICAgICAgcm93U3BhbiA9IF9yZWYucm93U3BhbjtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9UYWJsZUNvbnRleHQuZGVmYXVsdCksXG4gICAgICBwcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHMsXG4gICAgICBmaXhlZEluZm9MaXN0ID0gX1JlYWN0JHVzZUNvbnRleHQuZml4ZWRJbmZvTGlzdDtcblxuICB2YXIgZml4ZWRJbmZvID0gZml4ZWRJbmZvTGlzdFtpbmRleF07XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9DZWxsLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIGluZGV4OiBpbmRleCxcbiAgICBjb21wb25lbnQ6IFwidGRcIixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICByZWNvcmQ6IG51bGwsXG4gICAgZGF0YUluZGV4OiBudWxsLFxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGNvbFNwYW46IGNvbFNwYW4sXG4gICAgICAgICAgcm93U3Bhbjogcm93U3BhblxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSwgZml4ZWRJbmZvKSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBGb290ZXJSb3c7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIEZvb3RlclJvdyhwcm9wcykge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5Gb290ZXJDb21wb25lbnRzID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1RhYmxlQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbnRleHQvVGFibGVDb250ZXh0XCIpKTtcblxudmFyIF9DZWxsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9DZWxsXCIpKTtcblxudmFyIF9Sb3cgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1Jvd1wiKSk7XG5cbmZ1bmN0aW9uIEZvb3RlcihfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfVGFibGVDb250ZXh0LmRlZmF1bHQpLFxuICAgICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzO1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGZvb3RcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdW1tYXJ5XCIpXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gRm9vdGVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG52YXIgRm9vdGVyQ29tcG9uZW50cyA9IHtcbiAgQ2VsbDogX0NlbGwuZGVmYXVsdCxcbiAgUm93OiBfUm93LmRlZmF1bHRcbn07XG5leHBvcnRzLkZvb3RlckNvbXBvbmVudHMgPSBGb290ZXJDb21wb25lbnRzOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcmVmMiA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yZWZcIik7XG5cbnZhciBfSGVhZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9IZWFkZXJcIikpO1xuXG52YXIgX0NvbEdyb3VwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vQ29sR3JvdXBcIikpO1xuXG52YXIgX1RhYmxlQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbnRleHQvVGFibGVDb250ZXh0XCIpKTtcblxuZnVuY3Rpb24gdXNlQ29sdW1uV2lkdGgoY29sV2lkdGhzLCBjb2x1bUNvdW50KSB7XG4gIHJldHVybiAoMCwgUmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjbG9uZUNvbHVtbnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1Db3VudDsgaSArPSAxKSB7XG4gICAgICB2YXIgdmFsID0gY29sV2lkdGhzW2ldO1xuXG4gICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xvbmVDb2x1bW5zW2ldID0gdmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lQ29sdW1ucztcbiAgfSwgW2NvbFdpZHRocy5qb2luKCdfJyksIGNvbHVtQ291bnRdKTtcbn1cblxudmFyIEZpeGVkSGVhZGVyID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX3JlZiwgcmVmKSB7XG4gIHZhciBub0RhdGEgPSBfcmVmLm5vRGF0YSxcbiAgICAgIGNvbHVtbnMgPSBfcmVmLmNvbHVtbnMsXG4gICAgICBmbGF0dGVuQ29sdW1ucyA9IF9yZWYuZmxhdHRlbkNvbHVtbnMsXG4gICAgICBjb2xXaWR0aHMgPSBfcmVmLmNvbFdpZHRocyxcbiAgICAgIGNvbHVtQ291bnQgPSBfcmVmLmNvbHVtQ291bnQsXG4gICAgICBzdGlja3lPZmZzZXRzID0gX3JlZi5zdGlja3lPZmZzZXRzLFxuICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb24sXG4gICAgICBmaXhIZWFkZXIgPSBfcmVmLmZpeEhlYWRlcixcbiAgICAgIG9mZnNldEhlYWRlciA9IF9yZWYub2Zmc2V0SGVhZGVyLFxuICAgICAgc3RpY2t5Q2xhc3NOYW1lID0gX3JlZi5zdGlja3lDbGFzc05hbWUsXG4gICAgICBvblNjcm9sbCA9IF9yZWYub25TY3JvbGwsXG4gICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF9yZWYsIFtcIm5vRGF0YVwiLCBcImNvbHVtbnNcIiwgXCJmbGF0dGVuQ29sdW1uc1wiLCBcImNvbFdpZHRoc1wiLCBcImNvbHVtQ291bnRcIiwgXCJzdGlja3lPZmZzZXRzXCIsIFwiZGlyZWN0aW9uXCIsIFwiZml4SGVhZGVyXCIsIFwib2Zmc2V0SGVhZGVyXCIsIFwic3RpY2t5Q2xhc3NOYW1lXCIsIFwib25TY3JvbGxcIl0pO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1RhYmxlQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICAgIHNjcm9sbGJhclNpemUgPSBfUmVhY3QkdXNlQ29udGV4dC5zY3JvbGxiYXJTaXplLFxuICAgICAgaXNTdGlja3kgPSBfUmVhY3QkdXNlQ29udGV4dC5pc1N0aWNreTtcblxuICB2YXIgY29tYmluYXRpb25TY3JvbGxCYXJTaXplID0gaXNTdGlja3kgJiYgIWZpeEhlYWRlciA/IDAgOiBzY3JvbGxiYXJTaXplOyAvLyBQYXNzIHdoZWVsIHRvIHNjcm9sbCBldmVudFxuXG4gIHZhciBzY3JvbGxSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBzZXRTY3JvbGxSZWYgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICgwLCBfcmVmMi5maWxsUmVmKShyZWYsIGVsZW1lbnQpO1xuICAgICgwLCBfcmVmMi5maWxsUmVmKShzY3JvbGxSZWYsIGVsZW1lbnQpO1xuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9zY3JvbGxSZWYkY3VycmVudDtcblxuICAgIGZ1bmN0aW9uIG9uV2hlZWwoZSkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgZGVsdGFYID0gZS5kZWx0YVg7XG5cbiAgICAgIGlmIChkZWx0YVgpIHtcbiAgICAgICAgb25TY3JvbGwoe1xuICAgICAgICAgIGN1cnJlbnRUYXJnZXQ6IGN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgc2Nyb2xsTGVmdDogY3VycmVudFRhcmdldC5zY3JvbGxMZWZ0ICsgZGVsdGFYXG4gICAgICAgIH0pO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgKF9zY3JvbGxSZWYkY3VycmVudCA9IHNjcm9sbFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2Nyb2xsUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zY3JvbGxSZWYkY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uV2hlZWwpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3Njcm9sbFJlZiRjdXJyZW50MjtcblxuICAgICAgKF9zY3JvbGxSZWYkY3VycmVudDIgPSBzY3JvbGxSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3Njcm9sbFJlZiRjdXJyZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Njcm9sbFJlZiRjdXJyZW50Mi5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uV2hlZWwpO1xuICAgIH07XG4gIH0sIFtdKTsgLy8gQWRkIHNjcm9sbGJhciBjb2x1bW5cblxuICB2YXIgbGFzdENvbHVtbiA9IGZsYXR0ZW5Db2x1bW5zW2ZsYXR0ZW5Db2x1bW5zLmxlbmd0aCAtIDFdO1xuICB2YXIgU2Nyb2xsQmFyQ29sdW1uID0ge1xuICAgIGZpeGVkOiBsYXN0Q29sdW1uID8gbGFzdENvbHVtbi5maXhlZCA6IG51bGwsXG4gICAgb25IZWFkZXJDZWxsOiBmdW5jdGlvbiBvbkhlYWRlckNlbGwoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbC1zY3JvbGxiYXJcIilcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICB2YXIgY29sdW1uc1dpdGhTY3JvbGxiYXIgPSAoMCwgUmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb21iaW5hdGlvblNjcm9sbEJhclNpemUgPyBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoY29sdW1ucyksIFtTY3JvbGxCYXJDb2x1bW5dKSA6IGNvbHVtbnM7XG4gIH0sIFtjb21iaW5hdGlvblNjcm9sbEJhclNpemUsIGNvbHVtbnNdKTtcbiAgdmFyIGZsYXR0ZW5Db2x1bW5zV2l0aFNjcm9sbGJhciA9ICgwLCBSZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvbWJpbmF0aW9uU2Nyb2xsQmFyU2l6ZSA/IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShmbGF0dGVuQ29sdW1ucyksIFtTY3JvbGxCYXJDb2x1bW5dKSA6IGZsYXR0ZW5Db2x1bW5zO1xuICB9LCBbY29tYmluYXRpb25TY3JvbGxCYXJTaXplLCBmbGF0dGVuQ29sdW1uc10pOyAvLyBDYWxjdWxhdGUgdGhlIHN0aWNreSBvZmZzZXRzXG5cbiAgdmFyIGhlYWRlclN0aWNreU9mZnNldHMgPSAoMCwgUmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgIHZhciByaWdodCA9IHN0aWNreU9mZnNldHMucmlnaHQsXG4gICAgICAgIGxlZnQgPSBzdGlja3lPZmZzZXRzLmxlZnQ7XG4gICAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHN0aWNreU9mZnNldHMpLCB7fSwge1xuICAgICAgbGVmdDogZGlyZWN0aW9uID09PSAncnRsJyA/IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShsZWZ0Lm1hcChmdW5jdGlvbiAod2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHdpZHRoICsgY29tYmluYXRpb25TY3JvbGxCYXJTaXplO1xuICAgICAgfSkpLCBbMF0pIDogbGVmdCxcbiAgICAgIHJpZ2h0OiBkaXJlY3Rpb24gPT09ICdydGwnID8gcmlnaHQgOiBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkocmlnaHQubWFwKGZ1bmN0aW9uICh3aWR0aCkge1xuICAgICAgICByZXR1cm4gd2lkdGggKyBjb21iaW5hdGlvblNjcm9sbEJhclNpemU7XG4gICAgICB9KSksIFswXSksXG4gICAgICBpc1N0aWNreTogaXNTdGlja3lcbiAgICB9KTtcbiAgfSwgW2NvbWJpbmF0aW9uU2Nyb2xsQmFyU2l6ZSwgc3RpY2t5T2Zmc2V0cywgaXNTdGlja3ldKTtcbiAgdmFyIG1lcmdlZENvbHVtbldpZHRoID0gdXNlQ29sdW1uV2lkdGgoY29sV2lkdGhzLCBjb2x1bUNvdW50KTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfSwgaXNTdGlja3kgPyB7XG4gICAgICB0b3A6IG9mZnNldEhlYWRlclxuICAgIH0gOiB7fSksXG4gICAgcmVmOiBzZXRTY3JvbGxSZWYsXG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBzdGlja3lDbGFzc05hbWUsICEhc3RpY2t5Q2xhc3NOYW1lKSlcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgdGFibGVMYXlvdXQ6ICdmaXhlZCcsXG4gICAgICB2aXNpYmlsaXR5OiBub0RhdGEgfHwgbWVyZ2VkQ29sdW1uV2lkdGggPyBudWxsIDogJ2hpZGRlbidcbiAgICB9XG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0NvbEdyb3VwLmRlZmF1bHQsIHtcbiAgICBjb2xXaWR0aHM6IG1lcmdlZENvbHVtbldpZHRoID8gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG1lcmdlZENvbHVtbldpZHRoKSwgW2NvbWJpbmF0aW9uU2Nyb2xsQmFyU2l6ZV0pIDogW10sXG4gICAgY29sdW1Db3VudDogY29sdW1Db3VudCArIDEsXG4gICAgY29sdW1uczogZmxhdHRlbkNvbHVtbnNXaXRoU2Nyb2xsYmFyXG4gIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9IZWFkZXIuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBzdGlja3lPZmZzZXRzOiBoZWFkZXJTdGlja3lPZmZzZXRzLFxuICAgIGNvbHVtbnM6IGNvbHVtbnNXaXRoU2Nyb2xsYmFyLFxuICAgIGZsYXR0ZW5Db2x1bW5zOiBmbGF0dGVuQ29sdW1uc1dpdGhTY3JvbGxiYXJcbiAgfSkpKSk7XG59KTtcbkZpeGVkSGVhZGVyLmRpc3BsYXlOYW1lID0gJ0ZpeGVkSGVhZGVyJztcbnZhciBfZGVmYXVsdCA9IEZpeGVkSGVhZGVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0hlYWRlclJvdyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSGVhZGVyUm93XCIpKTtcblxudmFyIF9UYWJsZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb250ZXh0L1RhYmxlQ29udGV4dFwiKSk7XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyUm93cyhyb290Q29sdW1ucykge1xuICB2YXIgcm93cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGZpbGxSb3dDZWxscyhjb2x1bW5zLCBjb2xJbmRleCkge1xuICAgIHZhciByb3dJbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMDtcbiAgICAvLyBJbml0IHJvd3NcbiAgICByb3dzW3Jvd0luZGV4XSA9IHJvd3Nbcm93SW5kZXhdIHx8IFtdO1xuICAgIHZhciBjdXJyZW50Q29sSW5kZXggPSBjb2xJbmRleDtcbiAgICB2YXIgY29sU3BhbnMgPSBjb2x1bW5zLmZpbHRlcihCb29sZWFuKS5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgdmFyIGNlbGwgPSB7XG4gICAgICAgIGtleTogY29sdW1uLmtleSxcbiAgICAgICAgY2xhc3NOYW1lOiBjb2x1bW4uY2xhc3NOYW1lIHx8ICcnLFxuICAgICAgICBjaGlsZHJlbjogY29sdW1uLnRpdGxlLFxuICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgY29sU3RhcnQ6IGN1cnJlbnRDb2xJbmRleFxuICAgICAgfTtcbiAgICAgIHZhciBjb2xTcGFuID0gMTtcbiAgICAgIHZhciBzdWJDb2x1bW5zID0gY29sdW1uLmNoaWxkcmVuO1xuXG4gICAgICBpZiAoc3ViQ29sdW1ucyAmJiBzdWJDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29sU3BhbiA9IGZpbGxSb3dDZWxscyhzdWJDb2x1bW5zLCBjdXJyZW50Q29sSW5kZXgsIHJvd0luZGV4ICsgMSkucmVkdWNlKGZ1bmN0aW9uICh0b3RhbCwgY291bnQpIHtcbiAgICAgICAgICByZXR1cm4gdG90YWwgKyBjb3VudDtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIGNlbGwuaGFzU3ViQ29sdW1ucyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgnY29sU3BhbicgaW4gY29sdW1uKSB7XG4gICAgICAgIGNvbFNwYW4gPSBjb2x1bW4uY29sU3BhbjtcbiAgICAgIH1cblxuICAgICAgaWYgKCdyb3dTcGFuJyBpbiBjb2x1bW4pIHtcbiAgICAgICAgY2VsbC5yb3dTcGFuID0gY29sdW1uLnJvd1NwYW47XG4gICAgICB9XG5cbiAgICAgIGNlbGwuY29sU3BhbiA9IGNvbFNwYW47XG4gICAgICBjZWxsLmNvbEVuZCA9IGNlbGwuY29sU3RhcnQgKyBjb2xTcGFuIC0gMTtcbiAgICAgIHJvd3Nbcm93SW5kZXhdLnB1c2goY2VsbCk7XG4gICAgICBjdXJyZW50Q29sSW5kZXggKz0gY29sU3BhbjtcbiAgICAgIHJldHVybiBjb2xTcGFuO1xuICAgIH0pO1xuICAgIHJldHVybiBjb2xTcGFucztcbiAgfSAvLyBHZW5lcmF0ZSBgcm93c2AgY2VsbCBkYXRhXG5cblxuICBmaWxsUm93Q2VsbHMocm9vdENvbHVtbnMsIDApOyAvLyBIYW5kbGUgYHJvd1NwYW5gXG5cbiAgdmFyIHJvd0NvdW50ID0gcm93cy5sZW5ndGg7XG5cbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aocm93SW5kZXgpIHtcbiAgICByb3dzW3Jvd0luZGV4XS5mb3JFYWNoKGZ1bmN0aW9uIChjZWxsKSB7XG4gICAgICBpZiAoISgncm93U3BhbicgaW4gY2VsbCkgJiYgIWNlbGwuaGFzU3ViQ29sdW1ucykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2VsbC5yb3dTcGFuID0gcm93Q291bnQgLSByb3dJbmRleDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93Q291bnQ7IHJvd0luZGV4ICs9IDEpIHtcbiAgICBfbG9vcChyb3dJbmRleCk7XG4gIH1cblxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gSGVhZGVyKF9yZWYpIHtcbiAgdmFyIHN0aWNreU9mZnNldHMgPSBfcmVmLnN0aWNreU9mZnNldHMsXG4gICAgICBjb2x1bW5zID0gX3JlZi5jb2x1bW5zLFxuICAgICAgZmxhdHRlbkNvbHVtbnMgPSBfcmVmLmZsYXR0ZW5Db2x1bW5zLFxuICAgICAgb25IZWFkZXJSb3cgPSBfcmVmLm9uSGVhZGVyUm93O1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1RhYmxlQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICAgIGdldENvbXBvbmVudCA9IF9SZWFjdCR1c2VDb250ZXh0LmdldENvbXBvbmVudDtcblxuICB2YXIgcm93cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwYXJzZUhlYWRlclJvd3MoY29sdW1ucyk7XG4gIH0sIFtjb2x1bW5zXSk7XG4gIHZhciBXcmFwcGVyQ29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KFsnaGVhZGVyJywgJ3dyYXBwZXInXSwgJ3RoZWFkJyk7XG4gIHZhciB0ckNvbXBvbmVudCA9IGdldENvbXBvbmVudChbJ2hlYWRlcicsICdyb3cnXSwgJ3RyJyk7XG4gIHZhciB0aENvbXBvbmVudCA9IGdldENvbXBvbmVudChbJ2hlYWRlcicsICdjZWxsJ10sICd0aCcpO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVyQ29tcG9uZW50LCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRoZWFkXCIpXG4gIH0sIHJvd3MubWFwKGZ1bmN0aW9uIChyb3csIHJvd0luZGV4KSB7XG4gICAgdmFyIHJvd05vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9IZWFkZXJSb3cuZGVmYXVsdCwge1xuICAgICAga2V5OiByb3dJbmRleCxcbiAgICAgIGZsYXR0ZW5Db2x1bW5zOiBmbGF0dGVuQ29sdW1ucyxcbiAgICAgIGNlbGxzOiByb3csXG4gICAgICBzdGlja3lPZmZzZXRzOiBzdGlja3lPZmZzZXRzLFxuICAgICAgcm93Q29tcG9uZW50OiB0ckNvbXBvbmVudCxcbiAgICAgIGNlbGxDb21wb25lbnQ6IHRoQ29tcG9uZW50LFxuICAgICAgb25IZWFkZXJSb3c6IG9uSGVhZGVyUm93LFxuICAgICAgaW5kZXg6IHJvd0luZGV4XG4gICAgfSk7XG4gICAgcmV0dXJuIHJvd05vZGU7XG4gIH0pKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gSGVhZGVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0NlbGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9DZWxsXCIpKTtcblxudmFyIF9UYWJsZUNvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb250ZXh0L1RhYmxlQ29udGV4dFwiKSk7XG5cbnZhciBfZml4VXRpbCA9IHJlcXVpcmUoXCIuLi91dGlscy9maXhVdGlsXCIpO1xuXG52YXIgX3ZhbHVlVXRpbCA9IHJlcXVpcmUoXCIuLi91dGlscy92YWx1ZVV0aWxcIik7XG5cbmZ1bmN0aW9uIEhlYWRlclJvdyhfcmVmKSB7XG4gIHZhciBjZWxscyA9IF9yZWYuY2VsbHMsXG4gICAgICBzdGlja3lPZmZzZXRzID0gX3JlZi5zdGlja3lPZmZzZXRzLFxuICAgICAgZmxhdHRlbkNvbHVtbnMgPSBfcmVmLmZsYXR0ZW5Db2x1bW5zLFxuICAgICAgUm93Q29tcG9uZW50ID0gX3JlZi5yb3dDb21wb25lbnQsXG4gICAgICBDZWxsQ29tcG9uZW50ID0gX3JlZi5jZWxsQ29tcG9uZW50LFxuICAgICAgb25IZWFkZXJSb3cgPSBfcmVmLm9uSGVhZGVyUm93LFxuICAgICAgaW5kZXggPSBfcmVmLmluZGV4O1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1RhYmxlQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgcm93UHJvcHM7XG5cbiAgaWYgKG9uSGVhZGVyUm93KSB7XG4gICAgcm93UHJvcHMgPSBvbkhlYWRlclJvdyhjZWxscy5tYXAoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgIHJldHVybiBjZWxsLmNvbHVtbjtcbiAgICB9KSwgaW5kZXgpO1xuICB9XG5cbiAgdmFyIGNvbHVtbnNLZXkgPSAoMCwgX3ZhbHVlVXRpbC5nZXRDb2x1bW5zS2V5KShjZWxscy5tYXAoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICByZXR1cm4gY2VsbC5jb2x1bW47XG4gIH0pKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm93Q29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCByb3dQcm9wcyksIGNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbCwgY2VsbEluZGV4KSB7XG4gICAgdmFyIGNvbHVtbiA9IGNlbGwuY29sdW1uO1xuICAgIHZhciBmaXhlZEluZm8gPSAoMCwgX2ZpeFV0aWwuZ2V0Q2VsbEZpeGVkSW5mbykoY2VsbC5jb2xTdGFydCwgY2VsbC5jb2xFbmQsIGZsYXR0ZW5Db2x1bW5zLCBzdGlja3lPZmZzZXRzLCBkaXJlY3Rpb24pO1xuICAgIHZhciBhZGRpdGlvbmFsUHJvcHM7XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5vbkhlYWRlckNlbGwpIHtcbiAgICAgIGFkZGl0aW9uYWxQcm9wcyA9IGNlbGwuY29sdW1uLm9uSGVhZGVyQ2VsbChjb2x1bW4pO1xuICAgIH1cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9DZWxsLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIGNlbGwsIHtcbiAgICAgIGVsbGlwc2lzOiBjb2x1bW4uZWxsaXBzaXMsXG4gICAgICBhbGlnbjogY29sdW1uLmFsaWduLFxuICAgICAgY29tcG9uZW50OiBDZWxsQ29tcG9uZW50LFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBrZXk6IGNvbHVtbnNLZXlbY2VsbEluZGV4XVxuICAgIH0sIGZpeGVkSW5mbywge1xuICAgICAgYWRkaXRpb25hbFByb3BzOiBhZGRpdGlvbmFsUHJvcHMsXG4gICAgICByb3dUeXBlOiBcImhlYWRlclwiXG4gICAgfSkpO1xuICB9KSk7XG59XG5cbkhlYWRlclJvdy5kaXNwbGF5TmFtZSA9ICdIZWFkZXJSb3cnO1xudmFyIF9kZWZhdWx0ID0gSGVhZGVyUm93O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIFBhbmVsKF9yZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSwgY2hpbGRyZW4pO1xufVxuXG52YXIgX2RlZmF1bHQgPSBQYW5lbDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuSU5URVJOQUxfSE9PS1MgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3NoYWxsb3dlcXVhbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInNoYWxsb3dlcXVhbFwiKSk7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuXG52YXIgX3JjUmVzaXplT2JzZXJ2ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1yZXNpemUtb2JzZXJ2ZXJcIikpO1xuXG52YXIgX2dldFNjcm9sbEJhclNpemUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9nZXRTY3JvbGxCYXJTaXplXCIpKTtcblxudmFyIF9Db2x1bW5Hcm91cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3VnYXIvQ29sdW1uR3JvdXBcIikpO1xuXG52YXIgX0NvbHVtbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3VnYXIvQ29sdW1uXCIpKTtcblxudmFyIF9GaXhlZEhlYWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSGVhZGVyL0ZpeGVkSGVhZGVyXCIpKTtcblxudmFyIF9IZWFkZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0hlYWRlci9IZWFkZXJcIikpO1xuXG52YXIgX1RhYmxlQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY29udGV4dC9UYWJsZUNvbnRleHRcIikpO1xuXG52YXIgX0JvZHlDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb250ZXh0L0JvZHlDb250ZXh0XCIpKTtcblxudmFyIF9Cb2R5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Cb2R5XCIpKTtcblxudmFyIF91c2VDb2x1bW5zMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlQ29sdW1uc1wiKSk7XG5cbnZhciBfdXNlRnJhbWUgPSByZXF1aXJlKFwiLi9ob29rcy91c2VGcmFtZVwiKTtcblxudmFyIF92YWx1ZVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy92YWx1ZVV0aWxcIik7XG5cbnZhciBfUmVzaXplQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY29udGV4dC9SZXNpemVDb250ZXh0XCIpKTtcblxudmFyIF91c2VTdGlja3lPZmZzZXRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VTdGlja3lPZmZzZXRzXCIpKTtcblxudmFyIF9Db2xHcm91cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29sR3JvdXBcIikpO1xuXG52YXIgX2xlZ2FjeVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy9sZWdhY3lVdGlsXCIpO1xuXG52YXIgX1BhbmVsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYW5lbFwiKSk7XG5cbnZhciBfRm9vdGVyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vRm9vdGVyXCIpKTtcblxudmFyIF9leHBhbmRVdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvZXhwYW5kVXRpbFwiKTtcblxudmFyIF9maXhVdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvZml4VXRpbFwiKTtcblxudmFyIF9zdGlja3lTY3JvbGxCYXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3N0aWNreVNjcm9sbEJhclwiKSk7XG5cbnZhciBfdXNlU3RpY2t5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlU3RpY2t5XCIpKTtcblxuLyoqXG4gKiBGZWF0dXJlOlxuICogIC0gZml4ZWQgbm90IG5lZWQgdG8gc2V0IHdpZHRoXG4gKiAgLSBzdXBwb3J0IGByb3dFeHBhbmRhYmxlYCB0byBjb25maWcgcm93IGV4cGFuZCBsb2dpY1xuICogIC0gYWRkIGBzdW1tYXJ5YCB0byBzdXBwb3J0IGAoKSA9PiBSZWFjdE5vZGVgXG4gKlxuICogVXBkYXRlOlxuICogIC0gYGRhdGFJbmRleGAgaXMgYGFycmF5W11gIG5vd1xuICogIC0gYGV4cGFuZGFibGVgIHdyYXAgYWxsIHRoZSBleHBhbmQgcmVsYXRlZCBwcm9wc1xuICpcbiAqIFJlbW92ZWQ6XG4gKiAgLSBleHBhbmRJY29uQXNDZWxsXG4gKiAgLSB1c2VGaXhlZEhlYWRlclxuICogIC0gcm93UmVmXG4gKiAgLSBjb2x1bW5zW251bWJlcl0ub25DZWxsQ2xpY2tcbiAqICAtIG9uUm93Q2xpY2tcbiAqICAtIG9uUm93RG91YmxlQ2xpY2tcbiAqICAtIG9uUm93TW91c2VFbnRlclxuICogIC0gb25Sb3dNb3VzZUxlYXZlXG4gKiAgLSBnZXRCb2R5V3JhcHBlclxuICogIC0gYm9keVN0eWxlXG4gKlxuICogRGVwcmVjYXRlZDpcbiAqICAtIEFsbCBleHBhbmRlZCBwcm9wcywgbW92ZSBpbnRvIGV4cGFuZGFibGVcbiAqL1xuLy8gVXNlZCBmb3IgY29uZGl0aW9ucyBjYWNoZVxudmFyIEVNUFRZX0RBVEEgPSBbXTsgLy8gVXNlZCBmb3IgY3VzdG9taXplIHNjcm9sbFxuXG52YXIgRU1QVFlfU0NST0xMX1RBUkdFVCA9IHt9O1xudmFyIElOVEVSTkFMX0hPT0tTID0gJ3JjLXRhYmxlLWludGVybmFsLWhvb2snO1xuZXhwb3J0cy5JTlRFUk5BTF9IT09LUyA9IElOVEVSTkFMX0hPT0tTO1xudmFyIE1lbW9UYWJsZUNvbnRlbnQgPSBSZWFjdC5tZW1vKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHJldHVybiBjaGlsZHJlbjtcbn0sIGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gIGlmICghKDAsIF9zaGFsbG93ZXF1YWwuZGVmYXVsdCkocHJldi5wcm9wcywgbmV4dC5wcm9wcykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gTm8gYWRkaXRpb25hbCByZW5kZXIgd2hlbiBwaW5nZWQgc3RhdHVzIGNoYW5nZS5cbiAgLy8gVGhpcyBpcyBub3QgYSBidWcuXG5cblxuICByZXR1cm4gcHJldi5waW5nTGVmdCAhPT0gbmV4dC5waW5nTGVmdCB8fCBwcmV2LnBpbmdSaWdodCAhPT0gbmV4dC5waW5nUmlnaHQ7XG59KTtcblxuZnVuY3Rpb24gVGFibGUocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICByb3dDbGFzc05hbWUgPSBwcm9wcy5yb3dDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgICByb3dLZXkgPSBwcm9wcy5yb3dLZXksXG4gICAgICBzY3JvbGwgPSBwcm9wcy5zY3JvbGwsXG4gICAgICB0YWJsZUxheW91dCA9IHByb3BzLnRhYmxlTGF5b3V0LFxuICAgICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIGZvb3RlciA9IHByb3BzLmZvb3RlcixcbiAgICAgIHN1bW1hcnkgPSBwcm9wcy5zdW1tYXJ5LFxuICAgICAgaWQgPSBwcm9wcy5pZCxcbiAgICAgIHNob3dIZWFkZXIgPSBwcm9wcy5zaG93SGVhZGVyLFxuICAgICAgY29tcG9uZW50cyA9IHByb3BzLmNvbXBvbmVudHMsXG4gICAgICBlbXB0eVRleHQgPSBwcm9wcy5lbXB0eVRleHQsXG4gICAgICBvblJvdyA9IHByb3BzLm9uUm93LFxuICAgICAgb25IZWFkZXJSb3cgPSBwcm9wcy5vbkhlYWRlclJvdyxcbiAgICAgIGludGVybmFsSG9va3MgPSBwcm9wcy5pbnRlcm5hbEhvb2tzLFxuICAgICAgdHJhbnNmb3JtQ29sdW1ucyA9IHByb3BzLnRyYW5zZm9ybUNvbHVtbnMsXG4gICAgICBpbnRlcm5hbFJlZnMgPSBwcm9wcy5pbnRlcm5hbFJlZnMsXG4gICAgICBzdGlja3kgPSBwcm9wcy5zdGlja3k7XG4gIHZhciBtZXJnZWREYXRhID0gZGF0YSB8fCBFTVBUWV9EQVRBO1xuICB2YXIgaGFzRGF0YSA9ICEhbWVyZ2VkRGF0YS5sZW5ndGg7IC8vID09PT09PT09PT09PT09PT09PT09PSBFZmZlY3RzID09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoMCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgc2Nyb2xsYmFyU2l6ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTY3JvbGxiYXJTaXplID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldFNjcm9sbGJhclNpemUoKDAsIF9nZXRTY3JvbGxCYXJTaXplLmRlZmF1bHQpKCkpO1xuICB9KTsgLy8gPT09PT09PT09PT09PT09PT09PT09IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgWydvblJvd0NsaWNrJywgJ29uUm93RG91YmxlQ2xpY2snLCAnb25Sb3dDb250ZXh0TWVudScsICdvblJvd01vdXNlRW50ZXInLCAnb25Sb3dNb3VzZUxlYXZlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKHByb3BzW25hbWVdID09PSB1bmRlZmluZWQsIFwiYFwiLmNvbmNhdChuYW1lLCBcImAgaXMgcmVtb3ZlZCwgcGxlYXNlIHVzZSBgb25Sb3dgIGluc3RlYWQuXCIpKTtcbiAgICB9KTtcbiAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoISgnZ2V0Qm9keVdyYXBwZXInIGluIHByb3BzKSwgJ2BnZXRCb2R5V3JhcHBlcmAgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBjdXN0b20gYGNvbXBvbmVudHNgIGluc3RlYWQuJyk7XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT0gQ3VzdG9taXplID09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIG1lcmdlZENvbXBvbmVudHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKDAsIF92YWx1ZVV0aWwubWVyZ2VPYmplY3QpKGNvbXBvbmVudHMsIHt9KTtcbiAgfSwgW2NvbXBvbmVudHNdKTtcbiAgdmFyIGdldENvbXBvbmVudCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChwYXRoLCBkZWZhdWx0Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuICgwLCBfdmFsdWVVdGlsLmdldFBhdGhWYWx1ZSkobWVyZ2VkQ29tcG9uZW50cywgcGF0aCkgfHwgZGVmYXVsdENvbXBvbmVudDtcbiAgfSwgW21lcmdlZENvbXBvbmVudHNdKTtcbiAgdmFyIGdldFJvd0tleSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2Ygcm93S2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcm93S2V5O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICB2YXIga2V5ID0gcmVjb3JkICYmIHJlY29yZFtyb3dLZXldO1xuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoa2V5ICE9PSB1bmRlZmluZWQsICdFYWNoIHJlY29yZCBpbiB0YWJsZSBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBga2V5YCBwcm9wLCBvciBzZXQgYHJvd0tleWAgdG8gYW4gdW5pcXVlIHByaW1hcnkga2V5LicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gIH0sIFtyb3dLZXldKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PSBFeHBhbmQgPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBleHBhbmRhYmxlQ29uZmlnID0gKDAsIF9sZWdhY3lVdGlsLmdldEV4cGFuZGFibGVQcm9wcykocHJvcHMpO1xuICB2YXIgZXhwYW5kSWNvbiA9IGV4cGFuZGFibGVDb25maWcuZXhwYW5kSWNvbixcbiAgICAgIGV4cGFuZGVkUm93S2V5cyA9IGV4cGFuZGFibGVDb25maWcuZXhwYW5kZWRSb3dLZXlzLFxuICAgICAgZGVmYXVsdEV4cGFuZGVkUm93S2V5cyA9IGV4cGFuZGFibGVDb25maWcuZGVmYXVsdEV4cGFuZGVkUm93S2V5cyxcbiAgICAgIGRlZmF1bHRFeHBhbmRBbGxSb3dzID0gZXhwYW5kYWJsZUNvbmZpZy5kZWZhdWx0RXhwYW5kQWxsUm93cyxcbiAgICAgIGV4cGFuZGVkUm93UmVuZGVyID0gZXhwYW5kYWJsZUNvbmZpZy5leHBhbmRlZFJvd1JlbmRlcixcbiAgICAgIG9uRXhwYW5kID0gZXhwYW5kYWJsZUNvbmZpZy5vbkV4cGFuZCxcbiAgICAgIG9uRXhwYW5kZWRSb3dzQ2hhbmdlID0gZXhwYW5kYWJsZUNvbmZpZy5vbkV4cGFuZGVkUm93c0NoYW5nZSxcbiAgICAgIGV4cGFuZFJvd0J5Q2xpY2sgPSBleHBhbmRhYmxlQ29uZmlnLmV4cGFuZFJvd0J5Q2xpY2ssXG4gICAgICByb3dFeHBhbmRhYmxlID0gZXhwYW5kYWJsZUNvbmZpZy5yb3dFeHBhbmRhYmxlLFxuICAgICAgZXhwYW5kSWNvbkNvbHVtbkluZGV4ID0gZXhwYW5kYWJsZUNvbmZpZy5leHBhbmRJY29uQ29sdW1uSW5kZXgsXG4gICAgICBleHBhbmRlZFJvd0NsYXNzTmFtZSA9IGV4cGFuZGFibGVDb25maWcuZXhwYW5kZWRSb3dDbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbkNvbHVtbk5hbWUgPSBleHBhbmRhYmxlQ29uZmlnLmNoaWxkcmVuQ29sdW1uTmFtZSxcbiAgICAgIGluZGVudFNpemUgPSBleHBhbmRhYmxlQ29uZmlnLmluZGVudFNpemU7XG4gIHZhciBtZXJnZWRFeHBhbmRJY29uID0gZXhwYW5kSWNvbiB8fCBfZXhwYW5kVXRpbC5yZW5kZXJFeHBhbmRJY29uO1xuICB2YXIgbWVyZ2VkQ2hpbGRyZW5Db2x1bW5OYW1lID0gY2hpbGRyZW5Db2x1bW5OYW1lIHx8ICdjaGlsZHJlbic7XG4gIHZhciBleHBhbmRhYmxlVHlwZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChleHBhbmRlZFJvd1JlbmRlcikge1xuICAgICAgcmV0dXJuICdyb3cnO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuXG4gICAgLyoqXG4gICAgICogRml4IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIxMTU0XG4gICAgICogVGhpcyBpcyBhIHdvcmthcm91bmQgdG8gbm90IHRvIGJyZWFrIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAgICogV2UgY2FuIHJlbW92ZSBmb2xsb3cgY29kZSBhZnRlciBmaW5hbCByZWxlYXNlLlxuICAgICAqXG4gICAgICogVG8gb3RoZXIgZGV2ZWxvcGVyOlxuICAgICAqICBEbyBub3QgdXNlIGBfX1BBUkVOVF9SRU5ERVJfSUNPTl9fYCBpbiBwcm9kIHNpbmNlIHdlIHdpbGwgcmVtb3ZlIHRoaXMgd2hlbiByZWZhY3RvclxuICAgICAqL1xuXG5cbiAgICBpZiAocHJvcHMuZXhwYW5kYWJsZSAmJiBpbnRlcm5hbEhvb2tzID09PSBJTlRFUk5BTF9IT09LUyAmJiBwcm9wcy5leHBhbmRhYmxlLl9fUEFSRU5UX1JFTkRFUl9JQ09OX18gfHwgbWVyZ2VkRGF0YS5zb21lKGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgIHJldHVybiByZWNvcmQgJiYgKDAsIF90eXBlb2YyLmRlZmF1bHQpKHJlY29yZCkgPT09ICdvYmplY3QnICYmIHJlY29yZFttZXJnZWRDaGlsZHJlbkNvbHVtbk5hbWVdO1xuICAgIH0pKSB7XG4gICAgICByZXR1cm4gJ25lc3QnO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlICovXG5cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgWyEhZXhwYW5kZWRSb3dSZW5kZXIsIG1lcmdlZERhdGFdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZGVmYXVsdEV4cGFuZGVkUm93S2V5cykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRFeHBhbmRlZFJvd0tleXM7XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRFeHBhbmRBbGxSb3dzKSB7XG4gICAgICByZXR1cm4gKDAsIF9leHBhbmRVdGlsLmZpbmRBbGxDaGlsZHJlbktleXMpKG1lcmdlZERhdGEsIGdldFJvd0tleSwgbWVyZ2VkQ2hpbGRyZW5Db2x1bW5OYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG4gIH0pLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgICBpbm5lckV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRJbm5lckV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG5cbiAgdmFyIG1lcmdlZEV4cGFuZGVkS2V5cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgU2V0KGV4cGFuZGVkUm93S2V5cyB8fCBpbm5lckV4cGFuZGVkS2V5cyB8fCBbXSk7XG4gIH0sIFtleHBhbmRlZFJvd0tleXMsIGlubmVyRXhwYW5kZWRLZXlzXSk7XG4gIHZhciBvblRyaWdnZXJFeHBhbmQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgdmFyIGtleSA9IGdldFJvd0tleShyZWNvcmQsIG1lcmdlZERhdGEuaW5kZXhPZihyZWNvcmQpKTtcbiAgICB2YXIgbmV3RXhwYW5kZWRLZXlzO1xuICAgIHZhciBoYXNLZXkgPSBtZXJnZWRFeHBhbmRlZEtleXMuaGFzKGtleSk7XG5cbiAgICBpZiAoaGFzS2V5KSB7XG4gICAgICBtZXJnZWRFeHBhbmRlZEtleXMuZGVsZXRlKGtleSk7XG4gICAgICBuZXdFeHBhbmRlZEtleXMgPSAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShtZXJnZWRFeHBhbmRlZEtleXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFeHBhbmRlZEtleXMgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkobWVyZ2VkRXhwYW5kZWRLZXlzKSwgW2tleV0pO1xuICAgIH1cblxuICAgIHNldElubmVyRXhwYW5kZWRLZXlzKG5ld0V4cGFuZGVkS2V5cyk7XG5cbiAgICBpZiAob25FeHBhbmQpIHtcbiAgICAgIG9uRXhwYW5kKCFoYXNLZXksIHJlY29yZCk7XG4gICAgfVxuXG4gICAgaWYgKG9uRXhwYW5kZWRSb3dzQ2hhbmdlKSB7XG4gICAgICBvbkV4cGFuZGVkUm93c0NoYW5nZShuZXdFeHBhbmRlZEtleXMpO1xuICAgIH1cbiAgfSwgW2dldFJvd0tleSwgbWVyZ2VkRXhwYW5kZWRLZXlzLCBtZXJnZWREYXRhLCBvbkV4cGFuZCwgb25FeHBhbmRlZFJvd3NDaGFuZ2VdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PSBDb2x1bW4gPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUoMCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU2ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICAgIGNvbXBvbmVudFdpZHRoID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICAgIHNldENvbXBvbmVudFdpZHRoID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcblxuICB2YXIgX3VzZUNvbHVtbnMgPSAoMCwgX3VzZUNvbHVtbnMzLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwcm9wcyksIGV4cGFuZGFibGVDb25maWcpLCB7fSwge1xuICAgIGV4cGFuZGFibGU6ICEhZXhwYW5kZWRSb3dSZW5kZXIsXG4gICAgZXhwYW5kZWRLZXlzOiBtZXJnZWRFeHBhbmRlZEtleXMsXG4gICAgZ2V0Um93S2V5OiBnZXRSb3dLZXksXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjM4OTRcbiAgICBvblRyaWdnZXJFeHBhbmQ6IG9uVHJpZ2dlckV4cGFuZCxcbiAgICBleHBhbmRJY29uOiBtZXJnZWRFeHBhbmRJY29uLFxuICAgIGV4cGFuZEljb25Db2x1bW5JbmRleDogZXhwYW5kSWNvbkNvbHVtbkluZGV4LFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gIH0pLCBpbnRlcm5hbEhvb2tzID09PSBJTlRFUk5BTF9IT09LUyA/IHRyYW5zZm9ybUNvbHVtbnMgOiBudWxsKSxcbiAgICAgIF91c2VDb2x1bW5zMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZUNvbHVtbnMsIDIpLFxuICAgICAgY29sdW1ucyA9IF91c2VDb2x1bW5zMlswXSxcbiAgICAgIGZsYXR0ZW5Db2x1bW5zID0gX3VzZUNvbHVtbnMyWzFdO1xuXG4gIHZhciBjb2x1bW5Db250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICBmbGF0dGVuQ29sdW1uczogZmxhdHRlbkNvbHVtbnNcbiAgICB9O1xuICB9LCBbY29sdW1ucywgZmxhdHRlbkNvbHVtbnNdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PSBTY3JvbGwgPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBmdWxsVGFibGVSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIHNjcm9sbEhlYWRlclJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgc2Nyb2xsQm9keVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU3ID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlOCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlNywgMiksXG4gICAgICBwaW5nZWRMZWZ0ID0gX1JlYWN0JHVzZVN0YXRlOFswXSxcbiAgICAgIHNldFBpbmdlZExlZnQgPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU5ID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMTAgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZTksIDIpLFxuICAgICAgcGluZ2VkUmlnaHQgPSBfUmVhY3QkdXNlU3RhdGUxMFswXSxcbiAgICAgIHNldFBpbmdlZFJpZ2h0ID0gX1JlYWN0JHVzZVN0YXRlMTBbMV07XG5cbiAgdmFyIF91c2VGcmFtZVN0YXRlID0gKDAsIF91c2VGcmFtZS51c2VGcmFtZVN0YXRlKShuZXcgTWFwKCkpLFxuICAgICAgX3VzZUZyYW1lU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlRnJhbWVTdGF0ZSwgMiksXG4gICAgICBjb2xzV2lkdGhzID0gX3VzZUZyYW1lU3RhdGUyWzBdLFxuICAgICAgdXBkYXRlQ29sc1dpZHRocyA9IF91c2VGcmFtZVN0YXRlMlsxXTsgLy8gQ29udmVydCBtYXAgdG8gbnVtYmVyIHdpZHRoXG5cblxuICB2YXIgY29sc0tleXMgPSAoMCwgX3ZhbHVlVXRpbC5nZXRDb2x1bW5zS2V5KShmbGF0dGVuQ29sdW1ucyk7XG4gIHZhciBwdXJlQ29sV2lkdGhzID0gY29sc0tleXMubWFwKGZ1bmN0aW9uIChjb2x1bW5LZXkpIHtcbiAgICByZXR1cm4gY29sc1dpZHRocy5nZXQoY29sdW1uS2V5KTtcbiAgfSk7XG4gIHZhciBjb2xXaWR0aHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcHVyZUNvbFdpZHRocztcbiAgfSwgW3B1cmVDb2xXaWR0aHMuam9pbignXycpXSk7XG4gIHZhciBzdGlja3lPZmZzZXRzID0gKDAsIF91c2VTdGlja3lPZmZzZXRzLmRlZmF1bHQpKGNvbFdpZHRocywgZmxhdHRlbkNvbHVtbnMubGVuZ3RoLCBkaXJlY3Rpb24pO1xuICB2YXIgZml4SGVhZGVyID0gc2Nyb2xsICYmICgwLCBfdmFsdWVVdGlsLnZhbGlkYXRlVmFsdWUpKHNjcm9sbC55KTtcbiAgdmFyIGhvcml6b25TY3JvbGwgPSBzY3JvbGwgJiYgKDAsIF92YWx1ZVV0aWwudmFsaWRhdGVWYWx1ZSkoc2Nyb2xsLngpO1xuICB2YXIgZml4Q29sdW1uID0gaG9yaXpvblNjcm9sbCAmJiBmbGF0dGVuQ29sdW1ucy5zb21lKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBmaXhlZCA9IF9yZWYyLmZpeGVkO1xuICAgIHJldHVybiBmaXhlZDtcbiAgfSk7IC8vIFN0aWNreVxuXG4gIHZhciBzdGlja3lSZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICB2YXIgX3VzZVN0aWNreSA9ICgwLCBfdXNlU3RpY2t5Mi5kZWZhdWx0KShzdGlja3ksIHByZWZpeENscyksXG4gICAgICBpc1N0aWNreSA9IF91c2VTdGlja3kuaXNTdGlja3ksXG4gICAgICBvZmZzZXRIZWFkZXIgPSBfdXNlU3RpY2t5Lm9mZnNldEhlYWRlcixcbiAgICAgIG9mZnNldFNjcm9sbCA9IF91c2VTdGlja3kub2Zmc2V0U2Nyb2xsLFxuICAgICAgc3RpY2t5Q2xhc3NOYW1lID0gX3VzZVN0aWNreS5zdGlja3lDbGFzc05hbWU7XG5cbiAgdmFyIHNjcm9sbFhTdHlsZTtcbiAgdmFyIHNjcm9sbFlTdHlsZTtcbiAgdmFyIHNjcm9sbFRhYmxlU3R5bGU7XG5cbiAgaWYgKGZpeEhlYWRlcikge1xuICAgIHNjcm9sbFlTdHlsZSA9IHtcbiAgICAgIG92ZXJmbG93WTogJ3Njcm9sbCcsXG4gICAgICBtYXhIZWlnaHQ6IHNjcm9sbC55XG4gICAgfTtcbiAgfVxuXG4gIGlmIChob3Jpem9uU2Nyb2xsKSB7XG4gICAgc2Nyb2xsWFN0eWxlID0ge1xuICAgICAgb3ZlcmZsb3dYOiAnYXV0bydcbiAgICB9OyAvLyBXaGVuIG5vIHZlcnRpY2FsIHNjcm9sbGJhciwgc2hvdWxkIGhpZGUgaXRcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL3B1bGwvMjA3MDVcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMTg3OVxuXG4gICAgaWYgKCFmaXhIZWFkZXIpIHtcbiAgICAgIHNjcm9sbFlTdHlsZSA9IHtcbiAgICAgICAgb3ZlcmZsb3dZOiAnaGlkZGVuJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBzY3JvbGxUYWJsZVN0eWxlID0ge1xuICAgICAgd2lkdGg6IHNjcm9sbC54ID09PSB0cnVlID8gJ2F1dG8nIDogc2Nyb2xsLngsXG4gICAgICBtaW5XaWR0aDogJzEwMCUnXG4gICAgfTtcbiAgfVxuXG4gIHZhciBvbkNvbHVtblJlc2l6ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5LZXksIHdpZHRoKSB7XG4gICAgdXBkYXRlQ29sc1dpZHRocyhmdW5jdGlvbiAod2lkdGhzKSB7XG4gICAgICB2YXIgbmV3V2lkdGhzID0gbmV3IE1hcCh3aWR0aHMpO1xuICAgICAgbmV3V2lkdGhzLnNldChjb2x1bW5LZXksIHdpZHRoKTtcbiAgICAgIHJldHVybiBuZXdXaWR0aHM7XG4gICAgfSk7XG4gIH0sIFtdKTtcblxuICB2YXIgX3VzZVRpbWVvdXRMb2NrID0gKDAsIF91c2VGcmFtZS51c2VUaW1lb3V0TG9jaykobnVsbCksXG4gICAgICBfdXNlVGltZW91dExvY2syID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlVGltZW91dExvY2ssIDIpLFxuICAgICAgc2V0U2Nyb2xsVGFyZ2V0ID0gX3VzZVRpbWVvdXRMb2NrMlswXSxcbiAgICAgIGdldFNjcm9sbFRhcmdldCA9IF91c2VUaW1lb3V0TG9jazJbMV07XG5cbiAgZnVuY3Rpb24gZm9yY2VTY3JvbGwoc2Nyb2xsTGVmdCwgdGFyZ2V0KSB7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGFyZ2V0KHNjcm9sbExlZnQpO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0LnNjcm9sbExlZnQgIT09IHNjcm9sbExlZnQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgdGFyZ2V0LnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgIH1cbiAgfVxuXG4gIHZhciBvblNjcm9sbCA9IGZ1bmN0aW9uIG9uU2Nyb2xsKF9yZWYzKSB7XG4gICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBfcmVmMy5jdXJyZW50VGFyZ2V0LFxuICAgICAgICBzY3JvbGxMZWZ0ID0gX3JlZjMuc2Nyb2xsTGVmdDtcbiAgICB2YXIgbWVyZ2VkU2Nyb2xsTGVmdCA9IHR5cGVvZiBzY3JvbGxMZWZ0ID09PSAnbnVtYmVyJyA/IHNjcm9sbExlZnQgOiBjdXJyZW50VGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgdmFyIGNvbXBhcmVUYXJnZXQgPSBjdXJyZW50VGFyZ2V0IHx8IEVNUFRZX1NDUk9MTF9UQVJHRVQ7XG5cbiAgICBpZiAoIWdldFNjcm9sbFRhcmdldCgpIHx8IGdldFNjcm9sbFRhcmdldCgpID09PSBjb21wYXJlVGFyZ2V0KSB7XG4gICAgICB2YXIgX3N0aWNreVJlZiRjdXJyZW50O1xuXG4gICAgICBzZXRTY3JvbGxUYXJnZXQoY29tcGFyZVRhcmdldCk7XG4gICAgICBmb3JjZVNjcm9sbChtZXJnZWRTY3JvbGxMZWZ0LCBzY3JvbGxIZWFkZXJSZWYuY3VycmVudCk7XG4gICAgICBmb3JjZVNjcm9sbChtZXJnZWRTY3JvbGxMZWZ0LCBzY3JvbGxCb2R5UmVmLmN1cnJlbnQpO1xuICAgICAgZm9yY2VTY3JvbGwobWVyZ2VkU2Nyb2xsTGVmdCwgKF9zdGlja3lSZWYkY3VycmVudCA9IHN0aWNreVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc3RpY2t5UmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zdGlja3lSZWYkY3VycmVudC5zZXRTY3JvbGxMZWZ0KTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFRhcmdldCkge1xuICAgICAgdmFyIHNjcm9sbFdpZHRoID0gY3VycmVudFRhcmdldC5zY3JvbGxXaWR0aCxcbiAgICAgICAgICBjbGllbnRXaWR0aCA9IGN1cnJlbnRUYXJnZXQuY2xpZW50V2lkdGg7XG4gICAgICBzZXRQaW5nZWRMZWZ0KG1lcmdlZFNjcm9sbExlZnQgPiAwKTtcbiAgICAgIHNldFBpbmdlZFJpZ2h0KG1lcmdlZFNjcm9sbExlZnQgPCBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHRyaWdnZXJPblNjcm9sbCA9IGZ1bmN0aW9uIHRyaWdnZXJPblNjcm9sbCgpIHtcbiAgICBpZiAoc2Nyb2xsQm9keVJlZi5jdXJyZW50KSB7XG4gICAgICBvblNjcm9sbCh7XG4gICAgICAgIGN1cnJlbnRUYXJnZXQ6IHNjcm9sbEJvZHlSZWYuY3VycmVudFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvbkZ1bGxUYWJsZVJlc2l6ZSA9IGZ1bmN0aW9uIG9uRnVsbFRhYmxlUmVzaXplKF9yZWY0KSB7XG4gICAgdmFyIHdpZHRoID0gX3JlZjQud2lkdGg7XG4gICAgdHJpZ2dlck9uU2Nyb2xsKCk7XG4gICAgc2V0Q29tcG9uZW50V2lkdGgoZnVsbFRhYmxlUmVmLmN1cnJlbnQgPyBmdWxsVGFibGVSZWYuY3VycmVudC5vZmZzZXRXaWR0aCA6IHdpZHRoKTtcbiAgfTsgLy8gU3luYyBzY3JvbGwgYmFyIHdoZW4gaW5pdCBvciBgaG9yaXpvblNjcm9sbGAgY2hhbmdlZFxuXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHJpZ2dlck9uU2Nyb2xsO1xuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGhvcml6b25TY3JvbGwpIHtcbiAgICAgIHRyaWdnZXJPblNjcm9sbCgpO1xuICAgIH1cbiAgfSwgW2hvcml6b25TY3JvbGxdKTsgLy8gPT09PT09PT09PT09PT09PT09IElOVEVSTkFMIEhPT0tTID09PT09PT09PT09PT09PT09PVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGludGVybmFsSG9va3MgPT09IElOVEVSTkFMX0hPT0tTICYmIGludGVybmFsUmVmcykge1xuICAgICAgaW50ZXJuYWxSZWZzLmJvZHkuY3VycmVudCA9IHNjcm9sbEJvZHlSZWYuY3VycmVudDtcbiAgICB9XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIFRhYmxlQ29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KFsndGFibGUnXSwgJ3RhYmxlJyk7IC8vIFRhYmxlIGxheW91dFxuXG4gIHZhciBtZXJnZWRUYWJsZUxheW91dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0YWJsZUxheW91dCkge1xuICAgICAgcmV0dXJuIHRhYmxlTGF5b3V0O1xuICAgIH0gLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjUyMjdcbiAgICAvLyBXaGVuIHNjcm9sbC54IGlzIG1heC1jb250ZW50LCBubyBuZWVkIHRvIGZpeCB0YWJsZSBsYXlvdXRcbiAgICAvLyBpdCdzIHdpZHRoIHNob3VsZCBzdHJldGNoIG91dCB0byBmaXQgY29udGVudFxuXG5cbiAgICBpZiAoZml4Q29sdW1uKSB7XG4gICAgICByZXR1cm4gc2Nyb2xsLnggPT09ICdtYXgtY29udGVudCcgPyAnYXV0bycgOiAnZml4ZWQnO1xuICAgIH1cblxuICAgIGlmIChmaXhIZWFkZXIgfHwgZmxhdHRlbkNvbHVtbnMuc29tZShmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgIHZhciBlbGxpcHNpcyA9IF9yZWY1LmVsbGlwc2lzO1xuICAgICAgcmV0dXJuIGVsbGlwc2lzO1xuICAgIH0pKSB7XG4gICAgICByZXR1cm4gJ2ZpeGVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ2F1dG8nO1xuICB9LCBbZml4SGVhZGVyLCBmaXhDb2x1bW4sIGZsYXR0ZW5Db2x1bW5zLCB0YWJsZUxheW91dF0pO1xuICB2YXIgZ3JvdXBUYWJsZU5vZGU7IC8vIEhlYWRlciBwcm9wc1xuXG4gIHZhciBoZWFkZXJQcm9wcyA9IHtcbiAgICBjb2xXaWR0aHM6IGNvbFdpZHRocyxcbiAgICBjb2x1bUNvdW50OiBmbGF0dGVuQ29sdW1ucy5sZW5ndGgsXG4gICAgc3RpY2t5T2Zmc2V0czogc3RpY2t5T2Zmc2V0cyxcbiAgICBvbkhlYWRlclJvdzogb25IZWFkZXJSb3csXG4gICAgZml4SGVhZGVyOiBmaXhIZWFkZXJcbiAgfTsgLy8gRW1wdHlcblxuICB2YXIgZW1wdHlOb2RlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGhhc0RhdGEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZW1wdHlUZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZW1wdHlUZXh0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVtcHR5VGV4dDtcbiAgfSwgW2hhc0RhdGEsIGVtcHR5VGV4dF0pOyAvLyBCb2R5XG5cbiAgdmFyIGJvZHlUYWJsZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0JvZHkuZGVmYXVsdCwge1xuICAgIGRhdGE6IG1lcmdlZERhdGEsXG4gICAgbWVhc3VyZUNvbHVtbldpZHRoOiBmaXhIZWFkZXIgfHwgaG9yaXpvblNjcm9sbCB8fCBpc1N0aWNreSxcbiAgICBleHBhbmRlZEtleXM6IG1lcmdlZEV4cGFuZGVkS2V5cyxcbiAgICByb3dFeHBhbmRhYmxlOiByb3dFeHBhbmRhYmxlLFxuICAgIGdldFJvd0tleTogZ2V0Um93S2V5LFxuICAgIG9uUm93OiBvblJvdyxcbiAgICBlbXB0eU5vZGU6IGVtcHR5Tm9kZSxcbiAgICBjaGlsZHJlbkNvbHVtbk5hbWU6IG1lcmdlZENoaWxkcmVuQ29sdW1uTmFtZVxuICB9KTtcbiAgdmFyIGJvZHlDb2xHcm91cCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0NvbEdyb3VwLmRlZmF1bHQsIHtcbiAgICBjb2xXaWR0aHM6IGZsYXR0ZW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICAgIHZhciB3aWR0aCA9IF9yZWY2LndpZHRoO1xuICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH0pLFxuICAgIGNvbHVtbnM6IGZsYXR0ZW5Db2x1bW5zXG4gIH0pO1xuICB2YXIgZm9vdGVyVGFibGUgPSBzdW1tYXJ5ICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0Zvb3Rlci5kZWZhdWx0LCBudWxsLCBzdW1tYXJ5KG1lcmdlZERhdGEpKTtcbiAgdmFyIGN1c3RvbWl6ZVNjcm9sbEJvZHkgPSBnZXRDb21wb25lbnQoWydib2R5J10pO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjdXN0b21pemVTY3JvbGxCb2R5ID09PSAnZnVuY3Rpb24nICYmIGhhc0RhdGEgJiYgIWZpeEhlYWRlcikge1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ2Bjb21wb25lbnRzLmJvZHlgIHdpdGggcmVuZGVyIHByb3BzIGlzIG9ubHkgd29yayBvbiBgc2Nyb2xsLnlgLicpO1xuICB9XG5cbiAgaWYgKGZpeEhlYWRlciB8fCBpc1N0aWNreSkge1xuICAgIHZhciBib2R5Q29udGVudDtcblxuICAgIGlmICh0eXBlb2YgY3VzdG9taXplU2Nyb2xsQm9keSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm9keUNvbnRlbnQgPSBjdXN0b21pemVTY3JvbGxCb2R5KG1lcmdlZERhdGEsIHtcbiAgICAgICAgc2Nyb2xsYmFyU2l6ZTogc2Nyb2xsYmFyU2l6ZSxcbiAgICAgICAgcmVmOiBzY3JvbGxCb2R5UmVmLFxuICAgICAgICBvblNjcm9sbDogb25TY3JvbGxcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUHJvcHMuY29sV2lkdGhzID0gZmxhdHRlbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChfcmVmNywgaW5kZXgpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gX3JlZjcud2lkdGg7XG4gICAgICAgIHZhciBjb2xXaWR0aCA9IGluZGV4ID09PSBjb2x1bW5zLmxlbmd0aCAtIDEgPyB3aWR0aCAtIHNjcm9sbGJhclNpemUgOiB3aWR0aDtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbFdpZHRoID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzTmFOKGNvbFdpZHRoKSkge1xuICAgICAgICAgIHJldHVybiBjb2xXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ1doZW4gdXNlIGBjb21wb25lbnRzLmJvZHlgIHdpdGggcmVuZGVyIHByb3BzLiBFYWNoIGNvbHVtbiBzaG91bGQgaGF2ZSBhIGZpeGVkIHZhbHVlLicpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBib2R5Q29udGVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBzdHlsZTogKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc2Nyb2xsWFN0eWxlKSwgc2Nyb2xsWVN0eWxlKSxcbiAgICAgICAgb25TY3JvbGw6IG9uU2Nyb2xsLFxuICAgICAgICByZWY6IHNjcm9sbEJvZHlSZWYsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9keVwiKSlcbiAgICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGVDb21wb25lbnQsIHtcbiAgICAgICAgc3R5bGU6ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHNjcm9sbFRhYmxlU3R5bGUpLCB7fSwge1xuICAgICAgICAgIHRhYmxlTGF5b3V0OiBtZXJnZWRUYWJsZUxheW91dFxuICAgICAgICB9KVxuICAgICAgfSwgYm9keUNvbEdyb3VwLCBib2R5VGFibGUsIGZvb3RlclRhYmxlKSwgaXNTdGlja3kgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChfc3RpY2t5U2Nyb2xsQmFyLmRlZmF1bHQsIHtcbiAgICAgICAgcmVmOiBzdGlja3lSZWYsXG4gICAgICAgIG9mZnNldFNjcm9sbDogb2Zmc2V0U2Nyb2xsLFxuICAgICAgICBzY3JvbGxCb2R5UmVmOiBzY3JvbGxCb2R5UmVmLFxuICAgICAgICBvblNjcm9sbDogb25TY3JvbGxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBncm91cFRhYmxlTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHNob3dIZWFkZXIgIT09IGZhbHNlICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZpeGVkSGVhZGVyLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgbm9EYXRhOiAhbWVyZ2VkRGF0YS5sZW5ndGhcbiAgICB9LCBoZWFkZXJQcm9wcywgY29sdW1uQ29udGV4dCwge1xuICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICAvLyBGaXhlZCBQcm9wc1xuICAgICAgb2Zmc2V0SGVhZGVyOiBvZmZzZXRIZWFkZXIsXG4gICAgICBzdGlja3lDbGFzc05hbWU6IHN0aWNreUNsYXNzTmFtZSxcbiAgICAgIHJlZjogc2Nyb2xsSGVhZGVyUmVmLFxuICAgICAgb25TY3JvbGw6IG9uU2Nyb2xsXG4gICAgfSkpLCBib2R5Q29udGVudCk7XG4gIH0gZWxzZSB7XG4gICAgZ3JvdXBUYWJsZU5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHN0eWxlOiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzY3JvbGxYU3R5bGUpLCBzY3JvbGxZU3R5bGUpLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpKSxcbiAgICAgIG9uU2Nyb2xsOiBvblNjcm9sbCxcbiAgICAgIHJlZjogc2Nyb2xsQm9keVJlZlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGVDb21wb25lbnQsIHtcbiAgICAgIHN0eWxlOiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzY3JvbGxUYWJsZVN0eWxlKSwge30sIHtcbiAgICAgICAgdGFibGVMYXlvdXQ6IG1lcmdlZFRhYmxlTGF5b3V0XG4gICAgICB9KVxuICAgIH0sIGJvZHlDb2xHcm91cCwgc2hvd0hlYWRlciAhPT0gZmFsc2UgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChfSGVhZGVyLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIGhlYWRlclByb3BzLCBjb2x1bW5Db250ZXh0KSksIGJvZHlUYWJsZSwgZm9vdGVyVGFibGUpKTtcbiAgfVxuXG4gIHZhciBhcmlhUHJvcHMgPSAoMCwgX2xlZ2FjeVV0aWwuZ2V0RGF0YUFuZEFyaWFQcm9wcykocHJvcHMpO1xuICB2YXIgZnVsbFRhYmxlID0gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpbmctbGVmdFwiKSwgcGluZ2VkTGVmdCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpbmctcmlnaHRcIiksIHBpbmdlZFJpZ2h0KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGF5b3V0LWZpeGVkXCIpLCB0YWJsZUxheW91dCA9PT0gJ2ZpeGVkJyksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZpeGVkLWhlYWRlclwiKSwgZml4SGVhZGVyKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZml4ZWQtY29sdW1uXCIpLCBmaXhDb2x1bW4pLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zY3JvbGwtaG9yaXpvbnRhbFwiKSwgaG9yaXpvblNjcm9sbCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhcy1maXgtbGVmdFwiKSwgZmxhdHRlbkNvbHVtbnNbMF0gJiYgZmxhdHRlbkNvbHVtbnNbMF0uZml4ZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYXMtZml4LXJpZ2h0XCIpLCBmbGF0dGVuQ29sdW1uc1tmbGF0dGVuQ29sdW1ucy5sZW5ndGggLSAxXSAmJiBmbGF0dGVuQ29sdW1uc1tmbGF0dGVuQ29sdW1ucy5sZW5ndGggLSAxXS5maXhlZCA9PT0gJ3JpZ2h0JyksIF9jbGFzc05hbWVzKSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGlkOiBpZCxcbiAgICByZWY6IGZ1bGxUYWJsZVJlZlxuICB9LCBhcmlhUHJvcHMpLCBSZWFjdC5jcmVhdGVFbGVtZW50KE1lbW9UYWJsZUNvbnRlbnQsIHtcbiAgICBwaW5nTGVmdDogcGluZ2VkTGVmdCxcbiAgICBwaW5nUmlnaHQ6IHBpbmdlZFJpZ2h0LFxuICAgIHByb3BzOiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICBzdGlja3lPZmZzZXRzOiBzdGlja3lPZmZzZXRzLFxuICAgICAgbWVyZ2VkRXhwYW5kZWRLZXlzOiBtZXJnZWRFeHBhbmRlZEtleXNcbiAgICB9KVxuICB9LCB0aXRsZSAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KF9QYW5lbC5kZWZhdWx0LCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpdGxlXCIpXG4gIH0sIHRpdGxlKG1lcmdlZERhdGEpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRhaW5lclwiKVxuICB9LCBncm91cFRhYmxlTm9kZSksIGZvb3RlciAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KF9QYW5lbC5kZWZhdWx0LCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvb3RlclwiKVxuICB9LCBmb290ZXIobWVyZ2VkRGF0YSkpKSk7XG5cbiAgaWYgKGhvcml6b25TY3JvbGwpIHtcbiAgICBmdWxsVGFibGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY1Jlc2l6ZU9ic2VydmVyLmRlZmF1bHQsIHtcbiAgICAgIG9uUmVzaXplOiBvbkZ1bGxUYWJsZVJlc2l6ZVxuICAgIH0sIGZ1bGxUYWJsZSk7XG4gIH1cblxuICB2YXIgVGFibGVDb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBnZXRDb21wb25lbnQ6IGdldENvbXBvbmVudCxcbiAgICAgIHNjcm9sbGJhclNpemU6IHNjcm9sbGJhclNpemUsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGZpeGVkSW5mb0xpc3Q6IGZsYXR0ZW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoXywgY29sSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfZml4VXRpbC5nZXRDZWxsRml4ZWRJbmZvKShjb2xJbmRleCwgY29sSW5kZXgsIGZsYXR0ZW5Db2x1bW5zLCBzdGlja3lPZmZzZXRzLCBkaXJlY3Rpb24pO1xuICAgICAgfSksXG4gICAgICBpc1N0aWNreTogaXNTdGlja3lcbiAgICB9O1xuICB9LCBbcHJlZml4Q2xzLCBnZXRDb21wb25lbnQsIHNjcm9sbGJhclNpemUsIGRpcmVjdGlvbiwgZmxhdHRlbkNvbHVtbnMsIHN0aWNreU9mZnNldHMsIGRpcmVjdGlvbiwgaXNTdGlja3ldKTtcbiAgdmFyIEJvZHlDb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgY29sdW1uQ29udGV4dCksIHt9LCB7XG4gICAgICB0YWJsZUxheW91dDogbWVyZ2VkVGFibGVMYXlvdXQsXG4gICAgICByb3dDbGFzc05hbWU6IHJvd0NsYXNzTmFtZSxcbiAgICAgIGV4cGFuZGVkUm93Q2xhc3NOYW1lOiBleHBhbmRlZFJvd0NsYXNzTmFtZSxcbiAgICAgIGNvbXBvbmVudFdpZHRoOiBjb21wb25lbnRXaWR0aCxcbiAgICAgIGZpeEhlYWRlcjogZml4SGVhZGVyLFxuICAgICAgZml4Q29sdW1uOiBmaXhDb2x1bW4sXG4gICAgICBob3Jpem9uU2Nyb2xsOiBob3Jpem9uU2Nyb2xsLFxuICAgICAgZXhwYW5kSWNvbjogbWVyZ2VkRXhwYW5kSWNvbixcbiAgICAgIGV4cGFuZGFibGVUeXBlOiBleHBhbmRhYmxlVHlwZSxcbiAgICAgIGV4cGFuZFJvd0J5Q2xpY2s6IGV4cGFuZFJvd0J5Q2xpY2ssXG4gICAgICBleHBhbmRlZFJvd1JlbmRlcjogZXhwYW5kZWRSb3dSZW5kZXIsXG4gICAgICBvblRyaWdnZXJFeHBhbmQ6IG9uVHJpZ2dlckV4cGFuZCxcbiAgICAgIGV4cGFuZEljb25Db2x1bW5JbmRleDogZXhwYW5kSWNvbkNvbHVtbkluZGV4LFxuICAgICAgaW5kZW50U2l6ZTogaW5kZW50U2l6ZVxuICAgIH0pO1xuICB9LCBbY29sdW1uQ29udGV4dCwgbWVyZ2VkVGFibGVMYXlvdXQsIHJvd0NsYXNzTmFtZSwgZXhwYW5kZWRSb3dDbGFzc05hbWUsIGNvbXBvbmVudFdpZHRoLCBmaXhIZWFkZXIsIGZpeENvbHVtbiwgaG9yaXpvblNjcm9sbCwgbWVyZ2VkRXhwYW5kSWNvbiwgZXhwYW5kYWJsZVR5cGUsIGV4cGFuZFJvd0J5Q2xpY2ssIGV4cGFuZGVkUm93UmVuZGVyLCBvblRyaWdnZXJFeHBhbmQsIGV4cGFuZEljb25Db2x1bW5JbmRleCwgaW5kZW50U2l6ZV0pO1xuICB2YXIgUmVzaXplQ29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ29sdW1uUmVzaXplOiBvbkNvbHVtblJlc2l6ZVxuICAgIH07XG4gIH0sIFtvbkNvbHVtblJlc2l6ZV0pO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfVGFibGVDb250ZXh0LmRlZmF1bHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogVGFibGVDb250ZXh0VmFsdWVcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChfQm9keUNvbnRleHQuZGVmYXVsdC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBCb2R5Q29udGV4dFZhbHVlXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1Jlc2l6ZUNvbnRleHQuZGVmYXVsdC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBSZXNpemVDb250ZXh0VmFsdWVcbiAgfSwgZnVsbFRhYmxlKSkpO1xufVxuXG5UYWJsZS5Db2x1bW4gPSBfQ29sdW1uLmRlZmF1bHQ7XG5UYWJsZS5Db2x1bW5Hcm91cCA9IF9Db2x1bW5Hcm91cC5kZWZhdWx0O1xuVGFibGUuU3VtbWFyeSA9IF9Gb290ZXIuRm9vdGVyQ29tcG9uZW50cztcblRhYmxlLmRlZmF1bHRQcm9wcyA9IHtcbiAgcm93S2V5OiAna2V5JyxcbiAgcHJlZml4Q2xzOiAncmMtdGFibGUnLFxuICBlbXB0eVRleHQ6IGZ1bmN0aW9uIGVtcHR5VGV4dCgpIHtcbiAgICByZXR1cm4gJ05vIERhdGEnO1xuICB9XG59O1xudmFyIF9kZWZhdWx0ID0gVGFibGU7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIEJvZHlDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbnZhciBfZGVmYXVsdCA9IEJvZHlDb250ZXh0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBSZXNpemVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbnZhciBfZGVmYXVsdCA9IFJlc2l6ZUNvbnRleHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIFRhYmxlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG52YXIgX2RlZmF1bHQgPSBUYWJsZUNvbnRleHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNvbnZlcnRDaGlsZHJlblRvQ29sdW1ucyA9IGNvbnZlcnRDaGlsZHJlblRvQ29sdW1ucztcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfdG9BcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0NoaWxkcmVuL3RvQXJyYXlcIikpO1xuXG52YXIgX2xlZ2FjeVV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbHMvbGVnYWN5VXRpbFwiKTtcblxuZnVuY3Rpb24gY29udmVydENoaWxkcmVuVG9Db2x1bW5zKGNoaWxkcmVuKSB7XG4gIHJldHVybiAoMCwgX3RvQXJyYXkuZGVmYXVsdCkoY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBSZWFjdC5pc1ZhbGlkRWxlbWVudChub2RlKTtcbiAgfSkubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGtleSA9IF9yZWYua2V5LFxuICAgICAgICBwcm9wcyA9IF9yZWYucHJvcHM7XG4gICAgdmFyIG5vZGVDaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShwcm9wcywgW1wiY2hpbGRyZW5cIl0pO1xuICAgIHZhciBjb2x1bW4gPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe1xuICAgICAga2V5OiBrZXlcbiAgICB9LCByZXN0UHJvcHMpO1xuXG4gICAgaWYgKG5vZGVDaGlsZHJlbikge1xuICAgICAgY29sdW1uLmNoaWxkcmVuID0gY29udmVydENoaWxkcmVuVG9Db2x1bW5zKG5vZGVDaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZsYXRDb2x1bW5zKGNvbHVtbnMpIHtcbiAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChsaXN0LCBjb2x1bW4pIHtcbiAgICB2YXIgZml4ZWQgPSBjb2x1bW4uZml4ZWQ7IC8vIENvbnZlcnQgYGZpeGVkPSd0cnVlJ2AgdG8gYGZpeGVkPSdsZWZ0J2AgaW5zdGVhZFxuXG4gICAgdmFyIHBhcnNlZEZpeGVkID0gZml4ZWQgPT09IHRydWUgPyAnbGVmdCcgOiBmaXhlZDtcbiAgICB2YXIgc3ViQ29sdW1ucyA9IGNvbHVtbi5jaGlsZHJlbjtcblxuICAgIGlmIChzdWJDb2x1bW5zICYmIHN1YkNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShsaXN0KSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoZmxhdENvbHVtbnMoc3ViQ29sdW1ucykubWFwKGZ1bmN0aW9uIChzdWJDb2x1bSkge1xuICAgICAgICByZXR1cm4gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHtcbiAgICAgICAgICBmaXhlZDogcGFyc2VkRml4ZWRcbiAgICAgICAgfSwgc3ViQ29sdW0pO1xuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGxpc3QpLCBbKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgY29sdW1uKSwge30sIHtcbiAgICAgIGZpeGVkOiBwYXJzZWRGaXhlZFxuICAgIH0pXSk7XG4gIH0sIFtdKTtcbn1cblxuZnVuY3Rpb24gd2FybmluZ0ZpeGVkKGZsYXR0ZW5Db2x1bW5zKSB7XG4gIHZhciBhbGxGaXhMZWZ0ID0gdHJ1ZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZsYXR0ZW5Db2x1bW5zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGNvbCA9IGZsYXR0ZW5Db2x1bW5zW2ldO1xuXG4gICAgaWYgKGFsbEZpeExlZnQgJiYgY29sLmZpeGVkICE9PSAnbGVmdCcpIHtcbiAgICAgIGFsbEZpeExlZnQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFhbGxGaXhMZWZ0ICYmIGNvbC5maXhlZCA9PT0gJ2xlZnQnKSB7XG4gICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsIFwiSW5kZXggXCIuY29uY2F0KGkgLSAxLCBcIiBvZiBgY29sdW1uc2AgbWlzc2luZyBgZml4ZWQ9J2xlZnQnYCBwcm9wLlwiKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgYWxsRml4UmlnaHQgPSB0cnVlO1xuXG4gIGZvciAodmFyIF9pID0gZmxhdHRlbkNvbHVtbnMubGVuZ3RoIC0gMTsgX2kgPj0gMDsgX2kgLT0gMSkge1xuICAgIHZhciBfY29sID0gZmxhdHRlbkNvbHVtbnNbX2ldO1xuXG4gICAgaWYgKGFsbEZpeFJpZ2h0ICYmIF9jb2wuZml4ZWQgIT09ICdyaWdodCcpIHtcbiAgICAgIGFsbEZpeFJpZ2h0ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghYWxsRml4UmlnaHQgJiYgX2NvbC5maXhlZCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCBcIkluZGV4IFwiLmNvbmNhdChfaSArIDEsIFwiIG9mIGBjb2x1bW5zYCBtaXNzaW5nIGBmaXhlZD0ncmlnaHQnYCBwcm9wLlwiKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV2ZXJ0Rm9yUnRsKGNvbHVtbnMpIHtcbiAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICB2YXIgZml4ZWQgPSBjb2x1bW4uZml4ZWQsXG4gICAgICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKGNvbHVtbiwgW1wiZml4ZWRcIl0pOyAvLyBDb252ZXJ0IGBmaXhlZD0nbGVmdCdgIHRvIGBmaXhlZD0ncmlnaHQnYCBpbnN0ZWFkXG5cbiAgICB2YXIgcGFyc2VkRml4ZWQgPSBmaXhlZDtcblxuICAgIGlmIChmaXhlZCA9PT0gJ2xlZnQnKSB7XG4gICAgICBwYXJzZWRGaXhlZCA9ICdyaWdodCc7XG4gICAgfSBlbHNlIGlmIChmaXhlZCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcGFyc2VkRml4ZWQgPSAnbGVmdCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAgICBmaXhlZDogcGFyc2VkRml4ZWRcbiAgICB9LCByZXN0UHJvcHMpO1xuICB9KTtcbn1cbi8qKlxuICogUGFyc2UgYGNvbHVtbnNgICYgYGNoaWxkcmVuYCBpbnRvIGBjb2x1bW5zYC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHVzZUNvbHVtbnMoX3JlZjIsIHRyYW5zZm9ybUNvbHVtbnMpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYyLnByZWZpeENscyxcbiAgICAgIGNvbHVtbnMgPSBfcmVmMi5jb2x1bW5zLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMi5jaGlsZHJlbixcbiAgICAgIGV4cGFuZGFibGUgPSBfcmVmMi5leHBhbmRhYmxlLFxuICAgICAgZXhwYW5kZWRLZXlzID0gX3JlZjIuZXhwYW5kZWRLZXlzLFxuICAgICAgZ2V0Um93S2V5ID0gX3JlZjIuZ2V0Um93S2V5LFxuICAgICAgb25UcmlnZ2VyRXhwYW5kID0gX3JlZjIub25UcmlnZ2VyRXhwYW5kLFxuICAgICAgZXhwYW5kSWNvbiA9IF9yZWYyLmV4cGFuZEljb24sXG4gICAgICByb3dFeHBhbmRhYmxlID0gX3JlZjIucm93RXhwYW5kYWJsZSxcbiAgICAgIGV4cGFuZEljb25Db2x1bW5JbmRleCA9IF9yZWYyLmV4cGFuZEljb25Db2x1bW5JbmRleCxcbiAgICAgIGRpcmVjdGlvbiA9IF9yZWYyLmRpcmVjdGlvbixcbiAgICAgIGV4cGFuZFJvd0J5Q2xpY2sgPSBfcmVmMi5leHBhbmRSb3dCeUNsaWNrO1xuICB2YXIgYmFzZUNvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29sdW1ucyB8fCBjb252ZXJ0Q2hpbGRyZW5Ub0NvbHVtbnMoY2hpbGRyZW4pO1xuICB9LCBbY29sdW1ucywgY2hpbGRyZW5dKTsgLy8gQWRkIGV4cGFuZCBjb2x1bW5cblxuICB2YXIgd2l0aEV4cGFuZENvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZXhwYW5kYWJsZSkge1xuICAgICAgdmFyIF9leHBhbmRDb2x1bW47XG5cbiAgICAgIHZhciBleHBhbmRDb2xJbmRleCA9IGV4cGFuZEljb25Db2x1bW5JbmRleCB8fCAwO1xuICAgICAgdmFyIHByZXZDb2x1bW4gPSBiYXNlQ29sdW1uc1tleHBhbmRDb2xJbmRleF07XG4gICAgICB2YXIgZXhwYW5kQ29sdW1uID0gKF9leHBhbmRDb2x1bW4gPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2V4cGFuZENvbHVtbiwgX2xlZ2FjeVV0aWwuSU5URVJOQUxfQ09MX0RFRklORSwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZXhwYW5kLWljb24tY29sXCIpXG4gICAgICB9KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2V4cGFuZENvbHVtbiwgXCJ0aXRsZVwiLCAnJyksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9leHBhbmRDb2x1bW4sIFwiZml4ZWRcIiwgcHJldkNvbHVtbiA/IHByZXZDb2x1bW4uZml4ZWQgOiBudWxsKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2V4cGFuZENvbHVtbiwgXCJjbGFzc05hbWVcIiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctZXhwYW5kLWljb24tY2VsbFwiKSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9leHBhbmRDb2x1bW4sIFwicmVuZGVyXCIsIGZ1bmN0aW9uIHJlbmRlcihfLCByZWNvcmQsIGluZGV4KSB7XG4gICAgICAgIHZhciByb3dLZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCk7XG4gICAgICAgIHZhciBleHBhbmRlZCA9IGV4cGFuZGVkS2V5cy5oYXMocm93S2V5KTtcbiAgICAgICAgdmFyIHJlY29yZEV4cGFuZGFibGUgPSByb3dFeHBhbmRhYmxlID8gcm93RXhwYW5kYWJsZShyZWNvcmQpIDogdHJ1ZTtcbiAgICAgICAgdmFyIGljb24gPSBleHBhbmRJY29uKHtcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBleHBhbmRlZDogZXhwYW5kZWQsXG4gICAgICAgICAgZXhwYW5kYWJsZTogcmVjb3JkRXhwYW5kYWJsZSxcbiAgICAgICAgICByZWNvcmQ6IHJlY29yZCxcbiAgICAgICAgICBvbkV4cGFuZDogb25UcmlnZ2VyRXhwYW5kXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChleHBhbmRSb3dCeUNsaWNrKSB7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBpY29uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpY29uO1xuICAgICAgfSksIF9leHBhbmRDb2x1bW4pOyAvLyBJbnNlcnQgZXhwYW5kIGNvbHVtbiBpbiB0aGUgdGFyZ2V0IHBvc2l0aW9uXG5cbiAgICAgIHZhciBjbG9uZUNvbHVtbnMgPSBiYXNlQ29sdW1ucy5zbGljZSgpO1xuXG4gICAgICBpZiAoZXhwYW5kQ29sSW5kZXggPj0gMCkge1xuICAgICAgICBjbG9uZUNvbHVtbnMuc3BsaWNlKGV4cGFuZENvbEluZGV4LCAwLCBleHBhbmRDb2x1bW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2xvbmVDb2x1bW5zO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlQ29sdW1ucztcbiAgfSwgW2V4cGFuZGFibGUsIGJhc2VDb2x1bW5zLCBnZXRSb3dLZXksIGV4cGFuZGVkS2V5cywgZXhwYW5kSWNvbiwgZGlyZWN0aW9uXSk7XG4gIHZhciBtZXJnZWRDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZpbmFsQ29sdW1ucyA9IHdpdGhFeHBhbmRDb2x1bW5zO1xuXG4gICAgaWYgKHRyYW5zZm9ybUNvbHVtbnMpIHtcbiAgICAgIGZpbmFsQ29sdW1ucyA9IHRyYW5zZm9ybUNvbHVtbnMoZmluYWxDb2x1bW5zKTtcbiAgICB9IC8vIEFsd2F5cyBwcm92aWRlcyBhdCBsZWFzdCBvbmUgY29sdW1uIGZvciB0YWJsZSBkaXNwbGF5XG5cblxuICAgIGlmICghZmluYWxDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgZmluYWxDb2x1bW5zID0gW3tcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1dO1xuICAgIH1cblxuICAgIHJldHVybiBmaW5hbENvbHVtbnM7XG4gIH0sIFt0cmFuc2Zvcm1Db2x1bW5zLCB3aXRoRXhwYW5kQ29sdW1ucywgZGlyZWN0aW9uXSk7XG4gIHZhciBmbGF0dGVuQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChkaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICByZXR1cm4gcmV2ZXJ0Rm9yUnRsKGZsYXRDb2x1bW5zKG1lcmdlZENvbHVtbnMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdENvbHVtbnMobWVyZ2VkQ29sdW1ucyk7XG4gIH0sIFttZXJnZWRDb2x1bW5zLCBkaXJlY3Rpb25dKTsgLy8gT25seSBjaGVjayBvdXQgb2YgcHJvZHVjdGlvbiBzaW5jZSBpdCdzIHdhc3RlIGZvciBlYWNoIHJlbmRlclxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybmluZ0ZpeGVkKGZsYXR0ZW5Db2x1bW5zKTtcbiAgfVxuXG4gIHJldHVybiBbbWVyZ2VkQ29sdW1ucywgZmxhdHRlbkNvbHVtbnNdO1xufVxuXG52YXIgX2RlZmF1bHQgPSB1c2VDb2x1bW5zO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy51c2VGcmFtZVN0YXRlID0gdXNlRnJhbWVTdGF0ZTtcbmV4cG9ydHMudXNlVGltZW91dExvY2sgPSB1c2VUaW1lb3V0TG9jaztcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbnZhciBfcmFmID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmFmXCIpKTtcblxuZnVuY3Rpb24gdXNlRnJhbWVTdGF0ZShkZWZhdWx0U3RhdGUpIHtcbiAgdmFyIHN0YXRlUmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKGRlZmF1bHRTdGF0ZSk7XG5cbiAgdmFyIF91c2VTdGF0ZSA9ICgwLCBfcmVhY3QudXNlU3RhdGUpKHt9KSxcbiAgICAgIF91c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZSwgMiksXG4gICAgICBmb3JjZVVwZGF0ZSA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIHRpbWVvdXRSZWYgPSAoMCwgX3JlYWN0LnVzZVJlZikobnVsbCk7XG4gIHZhciB1cGRhdGVCYXRjaFJlZiA9ICgwLCBfcmVhY3QudXNlUmVmKShbXSk7XG5cbiAgZnVuY3Rpb24gc2V0RnJhbWVTdGF0ZSh1cGRhdGVyKSB7XG4gICAgaWYgKHRpbWVvdXRSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgdXBkYXRlQmF0Y2hSZWYuY3VycmVudCA9IFtdO1xuICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gKDAsIF9yYWYuZGVmYXVsdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB1cGRhdGVCYXRjaFJlZi5jdXJyZW50LmZvckVhY2goZnVuY3Rpb24gKGJhdGNoVXBkYXRlcikge1xuICAgICAgICAgIHN0YXRlUmVmLmN1cnJlbnQgPSBiYXRjaFVwZGF0ZXIoc3RhdGVSZWYuY3VycmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aW1lb3V0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBmb3JjZVVwZGF0ZSh7fSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVCYXRjaFJlZi5jdXJyZW50LnB1c2godXBkYXRlcik7XG4gIH1cblxuICAoMCwgX3JlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBfcmFmLmRlZmF1bHQuY2FuY2VsKHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW3N0YXRlUmVmLmN1cnJlbnQsIHNldEZyYW1lU3RhdGVdO1xufVxuLyoqIExvY2sgZnJhbWUsIHdoZW4gZnJhbWUgcGFzcyByZXNldCB0aGUgbG9jay4gKi9cblxuXG5mdW5jdGlvbiB1c2VUaW1lb3V0TG9jayhkZWZhdWx0U3RhdGUpIHtcbiAgdmFyIGZyYW1lUmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKGRlZmF1bHRTdGF0ZSk7XG4gIHZhciB0aW1lb3V0UmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKG51bGwpO1xuXG4gIGZ1bmN0aW9uIGNsZWFuVXAoKSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICBmcmFtZVJlZi5jdXJyZW50ID0gbmV3U3RhdGU7XG4gICAgY2xlYW5VcCgpO1xuICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGZyYW1lUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIGZyYW1lUmVmLmN1cnJlbnQ7XG4gIH1cblxuICAoMCwgX3JlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjbGVhblVwO1xuICB9LCBbXSk7XG4gIHJldHVybiBbc2V0U3RhdGUsIGdldFN0YXRlXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VTdGlja3k7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuLyoqIFN0aWNreSBoZWFkZXIgaG9va3MgKi9cbmZ1bmN0aW9uIHVzZVN0aWNreShzdGlja3ksIHByZWZpeENscykge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlzU3RpY2t5ID0gISFzdGlja3k7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzU3RpY2t5OiBpc1N0aWNreSxcbiAgICAgIHN0aWNreUNsYXNzTmFtZTogaXNTdGlja3kgPyBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0aWNreS1oZWFkZXJcIikgOiAnJyxcbiAgICAgIG9mZnNldEhlYWRlcjogKDAsIF90eXBlb2YyLmRlZmF1bHQpKHN0aWNreSkgPT09ICdvYmplY3QnID8gc3RpY2t5Lm9mZnNldEhlYWRlciB8fCAwIDogMCxcbiAgICAgIG9mZnNldFNjcm9sbDogKDAsIF90eXBlb2YyLmRlZmF1bHQpKHN0aWNreSkgPT09ICdvYmplY3QnID8gc3RpY2t5Lm9mZnNldFNjcm9sbCB8fCAwIDogMFxuICAgIH07XG4gIH0sIFtzdGlja3ksIHByZWZpeENsc10pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKipcbiAqIEdldCBzdGlja3kgY29sdW1uIG9mZnNldCB3aWR0aFxuICovXG5mdW5jdGlvbiB1c2VTdGlja3lPZmZzZXRzKGNvbFdpZHRocywgY29sdW1Db3VudCwgZGlyZWN0aW9uKSB7XG4gIHZhciBzdGlja3lPZmZzZXRzID0gKDAsIF9yZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlZnRPZmZzZXRzID0gW107XG4gICAgdmFyIHJpZ2h0T2Zmc2V0cyA9IFtdO1xuICAgIHZhciBsZWZ0ID0gMDtcbiAgICB2YXIgcmlnaHQgPSAwO1xuXG4gICAgZm9yICh2YXIgc3RhcnQgPSAwOyBzdGFydCA8IGNvbHVtQ291bnQ7IHN0YXJ0ICs9IDEpIHtcbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICAgIC8vIExlZnQgb2Zmc2V0XG4gICAgICAgIHJpZ2h0T2Zmc2V0c1tzdGFydF0gPSByaWdodDtcbiAgICAgICAgcmlnaHQgKz0gY29sV2lkdGhzW3N0YXJ0XSB8fCAwOyAvLyBSaWdodCBvZmZzZXRcblxuICAgICAgICB2YXIgZW5kID0gY29sdW1Db3VudCAtIHN0YXJ0IC0gMTtcbiAgICAgICAgbGVmdE9mZnNldHNbZW5kXSA9IGxlZnQ7XG4gICAgICAgIGxlZnQgKz0gY29sV2lkdGhzW2VuZF0gfHwgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIExlZnQgb2Zmc2V0XG4gICAgICAgIGxlZnRPZmZzZXRzW3N0YXJ0XSA9IGxlZnQ7XG4gICAgICAgIGxlZnQgKz0gY29sV2lkdGhzW3N0YXJ0XSB8fCAwOyAvLyBSaWdodCBvZmZzZXRcblxuICAgICAgICB2YXIgX2VuZCA9IGNvbHVtQ291bnQgLSBzdGFydCAtIDE7XG5cbiAgICAgICAgcmlnaHRPZmZzZXRzW19lbmRdID0gcmlnaHQ7XG4gICAgICAgIHJpZ2h0ICs9IGNvbFdpZHRoc1tfZW5kXSB8fCAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBsZWZ0T2Zmc2V0cyxcbiAgICAgIHJpZ2h0OiByaWdodE9mZnNldHNcbiAgICB9O1xuICB9LCBbY29sV2lkdGhzLCBjb2x1bUNvdW50LCBkaXJlY3Rpb25dKTtcbiAgcmV0dXJuIHN0aWNreU9mZnNldHM7XG59XG5cbnZhciBfZGVmYXVsdCA9IHVzZVN0aWNreU9mZnNldHM7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdW1tYXJ5XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9Gb290ZXIuRm9vdGVyQ29tcG9uZW50cztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2x1bW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX0NvbHVtbi5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbHVtbkdyb3VwXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9Db2x1bW5Hcm91cC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIklOVEVSTkFMX0NPTF9ERUZJTkVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2xlZ2FjeVV0aWwuSU5URVJOQUxfQ09MX0RFRklORTtcbiAgfVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfVGFibGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RhYmxlXCIpKTtcblxudmFyIF9Gb290ZXIgPSByZXF1aXJlKFwiLi9Gb290ZXJcIik7XG5cbnZhciBfQ29sdW1uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdWdhci9Db2x1bW5cIikpO1xuXG52YXIgX0NvbHVtbkdyb3VwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdWdhci9Db2x1bW5Hcm91cFwiKSk7XG5cbnZhciBfbGVnYWN5VXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL2xlZ2FjeVV0aWxcIik7XG5cbnZhciBfZGVmYXVsdCA9IF9UYWJsZS5kZWZhdWx0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9hZGRFdmVudExpc3RlbmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2FkZEV2ZW50TGlzdGVuZXJcIikpO1xuXG52YXIgX2dldFNjcm9sbEJhclNpemUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9nZXRTY3JvbGxCYXJTaXplXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfY3NzID0gcmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9jc3NcIik7XG5cbnZhciBfVGFibGVDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb250ZXh0L1RhYmxlQ29udGV4dFwiKSk7XG5cbnZhciBfdXNlRnJhbWUgPSByZXF1aXJlKFwiLi9ob29rcy91c2VGcmFtZVwiKTtcblxudmFyIFN0aWNreVNjcm9sbEJhciA9IGZ1bmN0aW9uIFN0aWNreVNjcm9sbEJhcihfcmVmLCByZWYpIHtcbiAgdmFyIF9zY3JvbGxCb2R5UmVmJGN1cnJlbiwgX3Njcm9sbEJvZHlSZWYkY3VycmVuMjtcblxuICB2YXIgc2Nyb2xsQm9keVJlZiA9IF9yZWYuc2Nyb2xsQm9keVJlZixcbiAgICAgIG9uU2Nyb2xsID0gX3JlZi5vblNjcm9sbCxcbiAgICAgIG9mZnNldFNjcm9sbCA9IF9yZWYub2Zmc2V0U2Nyb2xsO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX1RhYmxlQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscztcblxuICB2YXIgYm9keVNjcm9sbFdpZHRoID0gKChfc2Nyb2xsQm9keVJlZiRjdXJyZW4gPSBzY3JvbGxCb2R5UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zY3JvbGxCb2R5UmVmJGN1cnJlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Njcm9sbEJvZHlSZWYkY3VycmVuLnNjcm9sbFdpZHRoKSB8fCAwO1xuICB2YXIgYm9keVdpZHRoID0gKChfc2Nyb2xsQm9keVJlZiRjdXJyZW4yID0gc2Nyb2xsQm9keVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2Nyb2xsQm9keVJlZiRjdXJyZW4yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2Nyb2xsQm9keVJlZiRjdXJyZW4yLmNsaWVudFdpZHRoKSB8fCAwO1xuICB2YXIgc2Nyb2xsQmFyV2lkdGggPSBib2R5U2Nyb2xsV2lkdGggJiYgYm9keVdpZHRoICogKGJvZHlXaWR0aCAvIGJvZHlTY3JvbGxXaWR0aCk7XG4gIHZhciBzY3JvbGxCYXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICB2YXIgX3VzZUZyYW1lU3RhdGUgPSAoMCwgX3VzZUZyYW1lLnVzZUZyYW1lU3RhdGUpKHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIGlzSGlkZGVuU2Nyb2xsQmFyOiBmYWxzZVxuICB9KSxcbiAgICAgIF91c2VGcmFtZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZUZyYW1lU3RhdGUsIDIpLFxuICAgICAgZnJhbWVTdGF0ZSA9IF91c2VGcmFtZVN0YXRlMlswXSxcbiAgICAgIHNldEZyYW1lU3RhdGUgPSBfdXNlRnJhbWVTdGF0ZTJbMV07XG5cbiAgdmFyIHJlZlN0YXRlID0gUmVhY3QudXNlUmVmKHtcbiAgICBkZWx0YTogMCxcbiAgICB4OiAwXG4gIH0pO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgaXNBY3RpdmUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0QWN0aXZlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgb25Nb3VzZVVwID0gZnVuY3Rpb24gb25Nb3VzZVVwKCkge1xuICAgIHNldEFjdGl2ZShmYWxzZSk7XG4gIH07XG5cbiAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBldmVudC5wZXJzaXN0KCk7XG4gICAgcmVmU3RhdGUuY3VycmVudC5kZWx0YSA9IGV2ZW50LnBhZ2VYIC0gZnJhbWVTdGF0ZS5zY3JvbGxMZWZ0O1xuICAgIHJlZlN0YXRlLmN1cnJlbnQueCA9IDA7XG4gICAgc2V0QWN0aXZlKHRydWUpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgdmFyIG9uTW91c2VNb3ZlID0gZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICB2YXIgX3dpbmRvdztcblxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Nb3VzZUV2ZW50L2J1dHRvbnNcbiAgICB2YXIgX3JlZjIgPSBldmVudCB8fCAoKF93aW5kb3cgPSB3aW5kb3cpID09PSBudWxsIHx8IF93aW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3cuZXZlbnQpLFxuICAgICAgICBidXR0b25zID0gX3JlZjIuYnV0dG9ucztcblxuICAgIGlmICghaXNBY3RpdmUgfHwgYnV0dG9ucyA9PT0gMCkge1xuICAgICAgLy8gSWYgb3V0IGJvZHkgbW91c2UgdXAsIHdlIGNhbiBzZXQgaXNBY3RpdmUgZmFsc2Ugd2hlbiBtb3VzZSBtb3ZlXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgc2V0QWN0aXZlKGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBsZWZ0ID0gcmVmU3RhdGUuY3VycmVudC54ICsgZXZlbnQucGFnZVggLSByZWZTdGF0ZS5jdXJyZW50LnggLSByZWZTdGF0ZS5jdXJyZW50LmRlbHRhO1xuXG4gICAgaWYgKGxlZnQgPD0gMCkge1xuICAgICAgbGVmdCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGxlZnQgKyBzY3JvbGxCYXJXaWR0aCA+PSBib2R5V2lkdGgpIHtcbiAgICAgIGxlZnQgPSBib2R5V2lkdGggLSBzY3JvbGxCYXJXaWR0aDtcbiAgICB9XG5cbiAgICBvblNjcm9sbCh7XG4gICAgICBzY3JvbGxMZWZ0OiBsZWZ0IC8gYm9keVdpZHRoICogKGJvZHlTY3JvbGxXaWR0aCArIDIpXG4gICAgfSk7XG4gICAgcmVmU3RhdGUuY3VycmVudC54ID0gZXZlbnQucGFnZVg7XG4gIH07XG5cbiAgdmFyIG9uQ29udGFpbmVyU2Nyb2xsID0gZnVuY3Rpb24gb25Db250YWluZXJTY3JvbGwoKSB7XG4gICAgdmFyIHRhYmxlT2Zmc2V0VG9wID0gKDAsIF9jc3MuZ2V0T2Zmc2V0KShzY3JvbGxCb2R5UmVmLmN1cnJlbnQpLnRvcDtcbiAgICB2YXIgdGFibGVCb3R0b21PZmZzZXQgPSB0YWJsZU9mZnNldFRvcCArIHNjcm9sbEJvZHlSZWYuY3VycmVudC5vZmZzZXRIZWlnaHQ7XG4gICAgdmFyIGN1cnJlbnRDbGllbnRPZmZzZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wICsgd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgaWYgKHRhYmxlQm90dG9tT2Zmc2V0IC0gKDAsIF9nZXRTY3JvbGxCYXJTaXplLmRlZmF1bHQpKCkgPD0gY3VycmVudENsaWVudE9mZnNldCB8fCB0YWJsZU9mZnNldFRvcCA+PSBjdXJyZW50Q2xpZW50T2Zmc2V0IC0gb2Zmc2V0U2Nyb2xsKSB7XG4gICAgICBzZXRGcmFtZVN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICAgIGlzSGlkZGVuU2Nyb2xsQmFyOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEZyYW1lU3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzdGF0ZSksIHt9LCB7XG4gICAgICAgICAgaXNIaWRkZW5TY3JvbGxCYXI6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBzZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24gc2V0U2Nyb2xsTGVmdChsZWZ0KSB7XG4gICAgc2V0RnJhbWVTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBzdGF0ZSksIHt9LCB7XG4gICAgICAgIHNjcm9sbExlZnQ6IGxlZnQgLyBib2R5U2Nyb2xsV2lkdGggKiBib2R5V2lkdGggfHwgMFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U2Nyb2xsTGVmdDogc2V0U2Nyb2xsTGVmdFxuICAgIH07XG4gIH0pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvbk1vdXNlVXBMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lci5kZWZhdWx0KShkb2N1bWVudC5ib2R5LCAnbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuICAgIHZhciBvbk1vdXNlTW92ZUxpc3RlbmVyID0gKDAsIF9hZGRFdmVudExpc3RlbmVyLmRlZmF1bHQpKGRvY3VtZW50LmJvZHksICdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgIG9uQ29udGFpbmVyU2Nyb2xsKCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uTW91c2VVcExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgb25Nb3VzZU1vdmVMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICB9O1xuICB9LCBbc2Nyb2xsQmFyV2lkdGgsIGlzQWN0aXZlXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9uU2Nyb2xsTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIuZGVmYXVsdCkod2luZG93LCAnc2Nyb2xsJywgb25Db250YWluZXJTY3JvbGwsIGZhbHNlKTtcbiAgICB2YXIgb25SZXNpemVMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lci5kZWZhdWx0KSh3aW5kb3csICdyZXNpemUnLCBvbkNvbnRhaW5lclNjcm9sbCwgZmFsc2UpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBvblNjcm9sbExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgb25SZXNpemVMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFmcmFtZVN0YXRlLmlzSGlkZGVuU2Nyb2xsQmFyKSB7XG4gICAgICBzZXRGcmFtZVN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgX3Njcm9sbEJvZHlSZWYkY3VycmVuMywgX3Njcm9sbEJvZHlSZWYkY3VycmVuNDtcblxuICAgICAgICByZXR1cm4gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICAgIHNjcm9sbExlZnQ6IHNjcm9sbEJvZHlSZWYuY3VycmVudC5zY3JvbGxMZWZ0IC8gKChfc2Nyb2xsQm9keVJlZiRjdXJyZW4zID0gc2Nyb2xsQm9keVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2Nyb2xsQm9keVJlZiRjdXJyZW4zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2Nyb2xsQm9keVJlZiRjdXJyZW4zLnNjcm9sbFdpZHRoKSAqICgoX3Njcm9sbEJvZHlSZWYkY3VycmVuNCA9IHNjcm9sbEJvZHlSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3Njcm9sbEJvZHlSZWYkY3VycmVuNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Njcm9sbEJvZHlSZWYkY3VycmVuNC5jbGllbnRXaWR0aClcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtmcmFtZVN0YXRlLmlzSGlkZGVuU2Nyb2xsQmFyXSk7XG5cbiAgaWYgKGJvZHlTY3JvbGxXaWR0aCA8PSBib2R5V2lkdGggfHwgIXNjcm9sbEJhcldpZHRoIHx8IGZyYW1lU3RhdGUuaXNIaWRkZW5TY3JvbGxCYXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgaGVpZ2h0OiAoMCwgX2dldFNjcm9sbEJhclNpemUuZGVmYXVsdCkoKSxcbiAgICAgIHdpZHRoOiBib2R5V2lkdGgsXG4gICAgICBib3R0b206IG9mZnNldFNjcm9sbFxuICAgIH0sXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0aWNreS1zY3JvbGxcIilcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgIHJlZjogc2Nyb2xsQmFyUmVmLFxuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3RpY2t5LXNjcm9sbC1iYXJcIiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0aWNreS1zY3JvbGwtYmFyLWFjdGl2ZVwiKSwgaXNBY3RpdmUpKSxcbiAgICBzdHlsZToge1xuICAgICAgd2lkdGg6IFwiXCIuY29uY2F0KHNjcm9sbEJhcldpZHRoLCBcInB4XCIpLFxuICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZTNkKFwiLmNvbmNhdChmcmFtZVN0YXRlLnNjcm9sbExlZnQsIFwicHgsIDAsIDApXCIpXG4gICAgfVxuICB9KSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKFN0aWNreVNjcm9sbEJhcik7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBzeW50YWN0aWMgc3VnYXIgZm9yIGBjb2x1bW5zYCBwcm9wLlxuICogU28gSE9DIHdpbGwgbm90IHdvcmsgb24gdGhpcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gQ29sdW1uKF8pIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBfZGVmYXVsdCA9IENvbHVtbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBzeW50YWN0aWMgc3VnYXIgZm9yIGBjb2x1bW5zYCBwcm9wLlxuICogU28gSE9DIHdpbGwgbm90IHdvcmsgb24gdGhpcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gQ29sdW1uR3JvdXAoXykge1xuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIF9kZWZhdWx0ID0gQ29sdW1uR3JvdXA7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnJlbmRlckV4cGFuZEljb24gPSByZW5kZXJFeHBhbmRJY29uO1xuZXhwb3J0cy5maW5kQWxsQ2hpbGRyZW5LZXlzID0gZmluZEFsbENoaWxkcmVuS2V5cztcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbmZ1bmN0aW9uIHJlbmRlckV4cGFuZEljb24oX3JlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgcmVjb3JkID0gX3JlZi5yZWNvcmQsXG4gICAgICBvbkV4cGFuZCA9IF9yZWYub25FeHBhbmQsXG4gICAgICBleHBhbmRlZCA9IF9yZWYuZXhwYW5kZWQsXG4gICAgICBleHBhbmRhYmxlID0gX3JlZi5leHBhbmRhYmxlO1xuICB2YXIgZXhwYW5kQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctZXhwYW5kLWljb25cIik7XG5cbiAgaWYgKCFleHBhbmRhYmxlKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGV4cGFuZENsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctc3BhY2VkXCIpKVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIG9uQ2xpY2sgPSBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgb25FeHBhbmQocmVjb3JkLCBldmVudCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH07XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShleHBhbmRDbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctZXhwYW5kZWRcIiksIGV4cGFuZGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcm93LWNvbGxhcHNlZFwiKSwgIWV4cGFuZGVkKSwgX2NsYXNzTmFtZXMpKSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaW5kQWxsQ2hpbGRyZW5LZXlzKGRhdGEsIGdldFJvd0tleSwgY2hpbGRyZW5Db2x1bW5OYW1lKSB7XG4gIHZhciBrZXlzID0gW107XG5cbiAgZnVuY3Rpb24gZGlnKGxpc3QpIHtcbiAgICAobGlzdCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgIGtleXMucHVzaChnZXRSb3dLZXkoaXRlbSwgaW5kZXgpKTtcbiAgICAgIGRpZyhpdGVtW2NoaWxkcmVuQ29sdW1uTmFtZV0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGlnKGRhdGEpO1xuICByZXR1cm4ga2V5cztcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0Q2VsbEZpeGVkSW5mbyA9IGdldENlbGxGaXhlZEluZm87XG5cbmZ1bmN0aW9uIGdldENlbGxGaXhlZEluZm8oY29sU3RhcnQsIGNvbEVuZCwgY29sdW1ucywgc3RpY2t5T2Zmc2V0cywgZGlyZWN0aW9uKSB7XG4gIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbnNbY29sU3RhcnRdIHx8IHt9O1xuICB2YXIgZW5kQ29sdW1uID0gY29sdW1uc1tjb2xFbmRdIHx8IHt9O1xuICB2YXIgZml4TGVmdDtcbiAgdmFyIGZpeFJpZ2h0O1xuXG4gIGlmIChzdGFydENvbHVtbi5maXhlZCA9PT0gJ2xlZnQnKSB7XG4gICAgZml4TGVmdCA9IHN0aWNreU9mZnNldHMubGVmdFtjb2xTdGFydF07XG4gIH0gZWxzZSBpZiAoZW5kQ29sdW1uLmZpeGVkID09PSAncmlnaHQnKSB7XG4gICAgZml4UmlnaHQgPSBzdGlja3lPZmZzZXRzLnJpZ2h0W2NvbEVuZF07XG4gIH1cblxuICB2YXIgbGFzdEZpeExlZnQgPSBmYWxzZTtcbiAgdmFyIGZpcnN0Rml4UmlnaHQgPSBmYWxzZTtcbiAgdmFyIGxhc3RGaXhSaWdodCA9IGZhbHNlO1xuICB2YXIgZmlyc3RGaXhMZWZ0ID0gZmFsc2U7XG4gIHZhciBuZXh0Q29sdW1uID0gY29sdW1uc1tjb2xFbmQgKyAxXTtcbiAgdmFyIHByZXZDb2x1bW4gPSBjb2x1bW5zW2NvbFN0YXJ0IC0gMV07XG5cbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICBpZiAoZml4TGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcHJldkZpeExlZnQgPSBwcmV2Q29sdW1uICYmIHByZXZDb2x1bW4uZml4ZWQgPT09ICdsZWZ0JztcbiAgICAgIGZpcnN0Rml4TGVmdCA9ICFwcmV2Rml4TGVmdDtcbiAgICB9IGVsc2UgaWYgKGZpeFJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBuZXh0Rml4UmlnaHQgPSBuZXh0Q29sdW1uICYmIG5leHRDb2x1bW4uZml4ZWQgPT09ICdyaWdodCc7XG4gICAgICBsYXN0Rml4UmlnaHQgPSAhbmV4dEZpeFJpZ2h0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChmaXhMZWZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgbmV4dEZpeExlZnQgPSBuZXh0Q29sdW1uICYmIG5leHRDb2x1bW4uZml4ZWQgPT09ICdsZWZ0JztcbiAgICBsYXN0Rml4TGVmdCA9ICFuZXh0Rml4TGVmdDtcbiAgfSBlbHNlIGlmIChmaXhSaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHByZXZGaXhSaWdodCA9IHByZXZDb2x1bW4gJiYgcHJldkNvbHVtbi5maXhlZCA9PT0gJ3JpZ2h0JztcbiAgICBmaXJzdEZpeFJpZ2h0ID0gIXByZXZGaXhSaWdodDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZml4TGVmdDogZml4TGVmdCxcbiAgICBmaXhSaWdodDogZml4UmlnaHQsXG4gICAgbGFzdEZpeExlZnQ6IGxhc3RGaXhMZWZ0LFxuICAgIGZpcnN0Rml4UmlnaHQ6IGZpcnN0Rml4UmlnaHQsXG4gICAgbGFzdEZpeFJpZ2h0OiBsYXN0Rml4UmlnaHQsXG4gICAgZmlyc3RGaXhMZWZ0OiBmaXJzdEZpeExlZnQsXG4gICAgaXNTdGlja3k6IHN0aWNreU9mZnNldHMuaXNTdGlja3lcbiAgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldEV4cGFuZGFibGVQcm9wcyA9IGdldEV4cGFuZGFibGVQcm9wcztcbmV4cG9ydHMuZ2V0RGF0YUFuZEFyaWFQcm9wcyA9IGdldERhdGFBbmRBcmlhUHJvcHM7XG5leHBvcnRzLklOVEVSTkFMX0NPTF9ERUZJTkUgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfd2FybmluZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuXG52YXIgSU5URVJOQUxfQ09MX0RFRklORSA9ICdSQ19UQUJMRV9JTlRFUk5BTF9DT0xfREVGSU5FJztcbmV4cG9ydHMuSU5URVJOQUxfQ09MX0RFRklORSA9IElOVEVSTkFMX0NPTF9ERUZJTkU7XG5cbmZ1bmN0aW9uIGdldEV4cGFuZGFibGVQcm9wcyhwcm9wcykge1xuICB2YXIgZXhwYW5kYWJsZSA9IHByb3BzLmV4cGFuZGFibGUsXG4gICAgICBsZWdhY3lFeHBhbmRhYmxlQ29uZmlnID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkocHJvcHMsIFtcImV4cGFuZGFibGVcIl0pO1xuXG4gIGlmICgnZXhwYW5kYWJsZScgaW4gcHJvcHMpIHtcbiAgICByZXR1cm4gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgbGVnYWN5RXhwYW5kYWJsZUNvbmZpZyksIGV4cGFuZGFibGUpO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgWydpbmRlbnRTaXplJywgJ2V4cGFuZGVkUm93S2V5cycsICdkZWZhdWx0RXhwYW5kZWRSb3dLZXlzJywgJ2RlZmF1bHRFeHBhbmRBbGxSb3dzJywgJ2V4cGFuZGVkUm93UmVuZGVyJywgJ2V4cGFuZFJvd0J5Q2xpY2snLCAnZXhwYW5kSWNvbicsICdvbkV4cGFuZCcsICdvbkV4cGFuZGVkUm93c0NoYW5nZScsICdleHBhbmRlZFJvd0NsYXNzTmFtZScsICdleHBhbmRJY29uQ29sdW1uSW5kZXgnXS5zb21lKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AgaW4gcHJvcHM7XG4gIH0pKSB7XG4gICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCAnZXhwYW5kZWQgcmVsYXRlZCBwcm9wcyBoYXZlIGJlZW4gbW92ZWQgaW50byBgZXhwYW5kYWJsZWAuJyk7XG4gIH1cblxuICByZXR1cm4gbGVnYWN5RXhwYW5kYWJsZUNvbmZpZztcbn1cbi8qKlxuICogUmV0dXJucyBvbmx5IGRhdGEtIGFuZCBhcmlhLSBrZXkvdmFsdWUgcGFpcnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICovXG5cblxuZnVuY3Rpb24gZ2V0RGF0YUFuZEFyaWFQcm9wcyhwcm9wcykge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICByZXR1cm4gT2JqZWN0LmtleXMocHJvcHMpLnJlZHVjZShmdW5jdGlvbiAobWVtbywga2V5KSB7XG4gICAgaWYgKGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgbWVtb1trZXldID0gcHJvcHNba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVtbztcbiAgfSwge30pO1xuICAvKiBlc2xpbnQtZW5hYmxlICovXG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRQYXRoVmFsdWUgPSBnZXRQYXRoVmFsdWU7XG5leHBvcnRzLmdldENvbHVtbnNLZXkgPSBnZXRDb2x1bW5zS2V5O1xuZXhwb3J0cy5tZXJnZU9iamVjdCA9IG1lcmdlT2JqZWN0O1xuZXhwb3J0cy52YWxpZGF0ZVZhbHVlID0gdmFsaWRhdGVWYWx1ZTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgSU5URVJOQUxfS0VZX1BSRUZJWCA9ICdSQ19UQUJMRV9LRVknO1xuXG5mdW5jdGlvbiB0b0FycmF5KGFycikge1xuICBpZiAoYXJyID09PSB1bmRlZmluZWQgfHwgYXJyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSA/IGFyciA6IFthcnJdO1xufVxuXG5mdW5jdGlvbiBnZXRQYXRoVmFsdWUocmVjb3JkLCBwYXRoKSB7XG4gIC8vIFNraXAgaWYgcGF0aCBpcyBlbXB0eVxuICBpZiAoIXBhdGggJiYgdHlwZW9mIHBhdGggIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuXG4gIHZhciBwYXRoTGlzdCA9IHRvQXJyYXkocGF0aCk7XG4gIHZhciBjdXJyZW50ID0gcmVjb3JkO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aExpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBwcm9wID0gcGF0aExpc3RbaV07XG4gICAgY3VycmVudCA9IGN1cnJlbnRbcHJvcF07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29sdW1uc0tleShjb2x1bW5zKSB7XG4gIHZhciBjb2x1bW5LZXlzID0gW107XG4gIHZhciBrZXlzID0ge307XG4gIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgdmFyIF9yZWYgPSBjb2x1bW4gfHwge30sXG4gICAgICAgIGtleSA9IF9yZWYua2V5LFxuICAgICAgICBkYXRhSW5kZXggPSBfcmVmLmRhdGFJbmRleDtcblxuICAgIHZhciBtZXJnZWRLZXkgPSBrZXkgfHwgdG9BcnJheShkYXRhSW5kZXgpLmpvaW4oJy0nKSB8fCBJTlRFUk5BTF9LRVlfUFJFRklYO1xuXG4gICAgd2hpbGUgKGtleXNbbWVyZ2VkS2V5XSkge1xuICAgICAgbWVyZ2VkS2V5ID0gXCJcIi5jb25jYXQobWVyZ2VkS2V5LCBcIl9uZXh0XCIpO1xuICAgIH1cblxuICAgIGtleXNbbWVyZ2VkS2V5XSA9IHRydWU7XG4gICAgY29sdW1uS2V5cy5wdXNoKG1lcmdlZEtleSk7XG4gIH0pO1xuICByZXR1cm4gY29sdW1uS2V5cztcbn1cblxuZnVuY3Rpb24gbWVyZ2VPYmplY3QoKSB7XG4gIHZhciBtZXJnZWQgPSB7fTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cblxuICBmdW5jdGlvbiBmaWxsUHJvcHMob2JqLCBjbG9uZSkge1xuICAgIGlmIChjbG9uZSkge1xuICAgICAgT2JqZWN0LmtleXMoY2xvbmUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBjbG9uZVtrZXldO1xuXG4gICAgICAgIGlmICh2YWx1ZSAmJiAoMCwgX3R5cGVvZjIuZGVmYXVsdCkodmFsdWUpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIG9ialtrZXldID0gb2JqW2tleV0gfHwge307XG4gICAgICAgICAgZmlsbFByb3BzKG9ialtrZXldLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qIGVzbGludC1lbmFibGUgKi9cblxuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBvYmplY3RzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIG9iamVjdHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBvYmplY3RzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgZmlsbFByb3BzKG1lcmdlZCwgY2xvbmUpO1xuICB9KTtcbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWYWx1ZSh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxudmFyIF9kZWZhdWx0ID0gKDAsIF9yZWFjdC5jcmVhdGVDb250ZXh0KShudWxsKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIEFkZEJ1dHRvbihfcmVmLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgZWRpdGFibGUgPSBfcmVmLmVkaXRhYmxlLFxuICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICBzdHlsZSA9IF9yZWYuc3R5bGU7XG5cbiAgaWYgKCFlZGl0YWJsZSB8fCBlZGl0YWJsZS5zaG93QWRkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHJlZjogcmVmLFxuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5hdi1hZGRcIiksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIFwiYXJpYS1sYWJlbFwiOiAobG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLmFkZEFyaWFMYWJlbCkgfHwgJ0FkZCB0YWInLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgIGVkaXRhYmxlLm9uRWRpdCgnYWRkJywge1xuICAgICAgICBldmVudDogZXZlbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZWRpdGFibGUuYWRkSWNvbiB8fCAnKycpO1xufVxuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKEFkZEJ1dHRvbik7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF9yY01lbnUgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmMtbWVudVwiKSk7XG5cbnZhciBfcmNEcm9wZG93biA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLWRyb3Bkb3duXCIpKTtcblxudmFyIF9BZGRCdXR0b24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0FkZEJ1dHRvblwiKSk7XG5cbmZ1bmN0aW9uIE9wZXJhdGlvbk5vZGUoX3JlZiwgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIGlkID0gX3JlZi5pZCxcbiAgICAgIHRhYnMgPSBfcmVmLnRhYnMsXG4gICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgIG1vYmlsZSA9IF9yZWYubW9iaWxlLFxuICAgICAgX3JlZiRtb3JlSWNvbiA9IF9yZWYubW9yZUljb24sXG4gICAgICBtb3JlSWNvbiA9IF9yZWYkbW9yZUljb24gPT09IHZvaWQgMCA/ICdNb3JlJyA6IF9yZWYkbW9yZUljb24sXG4gICAgICBtb3JlVHJhbnNpdGlvbk5hbWUgPSBfcmVmLm1vcmVUcmFuc2l0aW9uTmFtZSxcbiAgICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgZWRpdGFibGUgPSBfcmVmLmVkaXRhYmxlLFxuICAgICAgdGFiQmFyR3V0dGVyID0gX3JlZi50YWJCYXJHdXR0ZXIsXG4gICAgICBydGwgPSBfcmVmLnJ0bCxcbiAgICAgIG9uVGFiQ2xpY2sgPSBfcmVmLm9uVGFiQ2xpY2s7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IERyb3Bkb3duID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVN0YXRlID0gKDAsIFJlYWN0LnVzZVN0YXRlKShmYWxzZSksXG4gICAgICBfdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUsIDIpLFxuICAgICAgb3BlbiA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRPcGVuID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlMyA9ICgwLCBSZWFjdC51c2VTdGF0ZSkobnVsbCksXG4gICAgICBfdXNlU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUzLCAyKSxcbiAgICAgIHNlbGVjdGVkS2V5ID0gX3VzZVN0YXRlNFswXSxcbiAgICAgIHNldFNlbGVjdGVkS2V5ID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgcG9wdXBJZCA9IFwiXCIuY29uY2F0KGlkLCBcIi1tb3JlLXBvcHVwXCIpO1xuICB2YXIgZHJvcGRvd25QcmVmaXggPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyb3Bkb3duXCIpO1xuICB2YXIgc2VsZWN0ZWRJdGVtSWQgPSBzZWxlY3RlZEtleSAhPT0gbnVsbCA/IFwiXCIuY29uY2F0KHBvcHVwSWQsIFwiLVwiKS5jb25jYXQoc2VsZWN0ZWRLZXkpIDogbnVsbDtcbiAgdmFyIGRyb3Bkb3duQXJpYUxhYmVsID0gbG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLmRyb3Bkb3duQXJpYUxhYmVsO1xuICB2YXIgbWVudSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjTWVudS5kZWZhdWx0LCB7XG4gICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhfcmVmMikge1xuICAgICAgdmFyIGtleSA9IF9yZWYyLmtleSxcbiAgICAgICAgICBkb21FdmVudCA9IF9yZWYyLmRvbUV2ZW50O1xuICAgICAgb25UYWJDbGljayhrZXksIGRvbUV2ZW50KTtcbiAgICAgIHNldE9wZW4oZmFsc2UpO1xuICAgIH0sXG4gICAgaWQ6IHBvcHVwSWQsXG4gICAgdGFiSW5kZXg6IC0xLFxuICAgIHJvbGU6IFwibGlzdGJveFwiLFxuICAgIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCI6IHNlbGVjdGVkSXRlbUlkLFxuICAgIHNlbGVjdGVkS2V5czogW3NlbGVjdGVkS2V5XSxcbiAgICBcImFyaWEtbGFiZWxcIjogZHJvcGRvd25BcmlhTGFiZWwgIT09IHVuZGVmaW5lZCA/IGRyb3Bkb3duQXJpYUxhYmVsIDogJ2V4cGFuZGVkIGRyb3Bkb3duJ1xuICB9LCB0YWJzLm1hcChmdW5jdGlvbiAodGFiKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjTWVudS5NZW51SXRlbSwge1xuICAgICAga2V5OiB0YWIua2V5LFxuICAgICAgaWQ6IFwiXCIuY29uY2F0KHBvcHVwSWQsIFwiLVwiKS5jb25jYXQodGFiLmtleSksXG4gICAgICByb2xlOiBcIm9wdGlvblwiLFxuICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IGlkICYmIFwiXCIuY29uY2F0KGlkLCBcIi1wYW5lbC1cIikuY29uY2F0KHRhYi5rZXkpLFxuICAgICAgZGlzYWJsZWQ6IHRhYi5kaXNhYmxlZFxuICAgIH0sIHRhYi50YWIpO1xuICB9KSk7XG5cbiAgZnVuY3Rpb24gc2VsZWN0T2Zmc2V0KG9mZnNldCkge1xuICAgIHZhciBlbmFibGVkVGFicyA9IHRhYnMuZmlsdGVyKGZ1bmN0aW9uICh0YWIpIHtcbiAgICAgIHJldHVybiAhdGFiLmRpc2FibGVkO1xuICAgIH0pO1xuICAgIHZhciBzZWxlY3RlZEluZGV4ID0gZW5hYmxlZFRhYnMuZmluZEluZGV4KGZ1bmN0aW9uICh0YWIpIHtcbiAgICAgIHJldHVybiB0YWIua2V5ID09PSBzZWxlY3RlZEtleTtcbiAgICB9KSB8fCAwO1xuICAgIHZhciBsZW4gPSBlbmFibGVkVGFicy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBzZWxlY3RlZEluZGV4ID0gKHNlbGVjdGVkSW5kZXggKyBvZmZzZXQgKyBsZW4pICUgbGVuO1xuICAgICAgdmFyIHRhYiA9IGVuYWJsZWRUYWJzW3NlbGVjdGVkSW5kZXhdO1xuXG4gICAgICBpZiAoIXRhYi5kaXNhYmxlZCkge1xuICAgICAgICBzZXRTZWxlY3RlZEtleSh0YWIua2V5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgdmFyIHdoaWNoID0gZS53aGljaDtcblxuICAgIGlmICghb3Blbikge1xuICAgICAgaWYgKFtfS2V5Q29kZS5kZWZhdWx0LkRPV04sIF9LZXlDb2RlLmRlZmF1bHQuU1BBQ0UsIF9LZXlDb2RlLmRlZmF1bHQuRU5URVJdLmluY2x1ZGVzKHdoaWNoKSkge1xuICAgICAgICBzZXRPcGVuKHRydWUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHdoaWNoKSB7XG4gICAgICBjYXNlIF9LZXlDb2RlLmRlZmF1bHQuVVA6XG4gICAgICAgIHNlbGVjdE9mZnNldCgtMSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5ET1dOOlxuICAgICAgICBzZWxlY3RPZmZzZXQoMSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5FU0M6XG4gICAgICAgIHNldE9wZW4oZmFsc2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LlNQQUNFOlxuICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSOlxuICAgICAgICBpZiAoc2VsZWN0ZWRLZXkgIT09IG51bGwpIG9uVGFiQ2xpY2soc2VsZWN0ZWRLZXksIGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgKDAsIFJlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIC8vIFdlIHVzZSBxdWVyeSBlbGVtZW50IGhlcmUgdG8gYXZvaWQgUmVhY3Qgc3RyaWN0IHdhcm5pbmdcbiAgICB2YXIgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZWN0ZWRJdGVtSWQpO1xuXG4gICAgaWYgKGVsZSAmJiBlbGUuc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgIGVsZS5zY3JvbGxJbnRvVmlldyhmYWxzZSk7XG4gICAgfVxuICB9LCBbc2VsZWN0ZWRLZXldKTtcbiAgKDAsIFJlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIGlmICghb3Blbikge1xuICAgICAgc2V0U2VsZWN0ZWRLZXkobnVsbCk7XG4gICAgfVxuICB9LCBbb3Blbl0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG1vcmVTdHlsZSA9ICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBydGwgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnLCB0YWJCYXJHdXR0ZXIpO1xuXG4gIGlmICghdGFicy5sZW5ndGgpIHtcbiAgICBtb3JlU3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIG1vcmVTdHlsZS5vcmRlciA9IDE7XG4gIH1cblxuICB2YXIgb3ZlcmxheUNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KSgoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh7fSwgXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXgsIFwiLXJ0bFwiKSwgcnRsKSk7XG4gIHZhciBtb3JlTm9kZSA9IG1vYmlsZSA/IG51bGwgOiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY0Ryb3Bkb3duLmRlZmF1bHQsIHtcbiAgICBwcmVmaXhDbHM6IGRyb3Bkb3duUHJlZml4LFxuICAgIG92ZXJsYXk6IG1lbnUsXG4gICAgdHJpZ2dlcjogWydob3ZlciddLFxuICAgIHZpc2libGU6IG9wZW4sXG4gICAgdHJhbnNpdGlvbk5hbWU6IG1vcmVUcmFuc2l0aW9uTmFtZSxcbiAgICBvblZpc2libGVDaGFuZ2U6IHNldE9wZW4sXG4gICAgb3ZlcmxheUNsYXNzTmFtZTogb3ZlcmxheUNsYXNzTmFtZSxcbiAgICBtb3VzZUVudGVyRGVsYXk6IDAuMSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IDAuMVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uYXYtbW9yZVwiKSxcbiAgICBzdHlsZTogbW9yZVN0eWxlLFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiLFxuICAgIFwiYXJpYS1oYXNwb3B1cFwiOiBcImxpc3Rib3hcIixcbiAgICBcImFyaWEtY29udHJvbHNcIjogcG9wdXBJZCxcbiAgICBpZDogXCJcIi5jb25jYXQoaWQsIFwiLW1vcmVcIiksXG4gICAgXCJhcmlhLWV4cGFuZGVkXCI6IG9wZW4sXG4gICAgb25LZXlEb3duOiBvbktleURvd25cbiAgfSwgbW9yZUljb24pKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmF2LW9wZXJhdGlvbnNcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJlZjogcmVmXG4gIH0sIG1vcmVOb2RlLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9BZGRCdXR0b24uZGVmYXVsdCwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGxvY2FsZTogbG9jYWxlLFxuICAgIGVkaXRhYmxlOiBlZGl0YWJsZVxuICB9KSk7XG59XG5cbnZhciBfZGVmYXVsdCA9IFJlYWN0LmZvcndhcmRSZWYoT3BlcmF0aW9uTm9kZSk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfS2V5Q29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0tleUNvZGVcIikpO1xuXG5mdW5jdGlvbiBUYWJOb2RlKF9yZWYsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgaWQgPSBfcmVmLmlkLFxuICAgICAgYWN0aXZlID0gX3JlZi5hY3RpdmUsXG4gICAgICBydGwgPSBfcmVmLnJ0bCxcbiAgICAgIF9yZWYkdGFiID0gX3JlZi50YWIsXG4gICAgICBrZXkgPSBfcmVmJHRhYi5rZXksXG4gICAgICB0YWIgPSBfcmVmJHRhYi50YWIsXG4gICAgICBkaXNhYmxlZCA9IF9yZWYkdGFiLmRpc2FibGVkLFxuICAgICAgY2xvc2VJY29uID0gX3JlZiR0YWIuY2xvc2VJY29uLFxuICAgICAgdGFiQmFyR3V0dGVyID0gX3JlZi50YWJCYXJHdXR0ZXIsXG4gICAgICB0YWJQb3NpdGlvbiA9IF9yZWYudGFiUG9zaXRpb24sXG4gICAgICBjbG9zYWJsZSA9IF9yZWYuY2xvc2FibGUsXG4gICAgICByZW5kZXJXcmFwcGVyID0gX3JlZi5yZW5kZXJXcmFwcGVyLFxuICAgICAgcmVtb3ZlQXJpYUxhYmVsID0gX3JlZi5yZW1vdmVBcmlhTGFiZWwsXG4gICAgICBlZGl0YWJsZSA9IF9yZWYuZWRpdGFibGUsXG4gICAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgICAgb25SZW1vdmUgPSBfcmVmLm9uUmVtb3ZlLFxuICAgICAgb25Gb2N1cyA9IF9yZWYub25Gb2N1cztcbiAgdmFyIHRhYlByZWZpeCA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGFiXCIpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBvblJlbW92ZTtcbiAgfSwgW10pO1xuICB2YXIgbm9kZVN0eWxlID0ge307XG5cbiAgaWYgKHRhYlBvc2l0aW9uID09PSAndG9wJyB8fCB0YWJQb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICBub2RlU3R5bGVbcnRsID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0J10gPSB0YWJCYXJHdXR0ZXI7XG4gIH0gZWxzZSB7XG4gICAgbm9kZVN0eWxlLm1hcmdpbkJvdHRvbSA9IHRhYkJhckd1dHRlcjtcbiAgfVxuXG4gIHZhciByZW1vdmFibGUgPSBlZGl0YWJsZSAmJiBjbG9zYWJsZSAhPT0gZmFsc2UgJiYgIWRpc2FibGVkO1xuXG4gIGZ1bmN0aW9uIG9uSW50ZXJuYWxDbGljayhlKSB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgb25DbGljayhlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUmVtb3ZlVGFiKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlZGl0YWJsZS5vbkVkaXQoJ3JlbW92ZScsIHtcbiAgICAgIGtleToga2V5LFxuICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgfSk7XG4gIH1cblxuICB2YXIgbm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHRhYlByZWZpeCwgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh0YWJQcmVmaXgsIFwiLXdpdGgtcmVtb3ZlXCIpLCByZW1vdmFibGUpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQodGFiUHJlZml4LCBcIi1hY3RpdmVcIiksIGFjdGl2ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh0YWJQcmVmaXgsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIF9jbGFzc05hbWVzKSksXG4gICAgc3R5bGU6IG5vZGVTdHlsZSxcbiAgICBvbkNsaWNrOiBvbkludGVybmFsQ2xpY2tcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcm9sZTogXCJ0YWJcIixcbiAgICBcImFyaWEtc2VsZWN0ZWRcIjogYWN0aXZlLFxuICAgIGlkOiBpZCAmJiBcIlwiLmNvbmNhdChpZCwgXCItdGFiLVwiKS5jb25jYXQoa2V5KSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHRhYlByZWZpeCwgXCItYnRuXCIpLFxuICAgIFwiYXJpYS1jb250cm9sc1wiOiBpZCAmJiBcIlwiLmNvbmNhdChpZCwgXCItcGFuZWwtXCIpLmNvbmNhdChrZXkpLFxuICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBkaXNhYmxlZCxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyBudWxsIDogMCxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBvbkludGVybmFsQ2xpY2soZSk7XG4gICAgfSxcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICBpZiAoW19LZXlDb2RlLmRlZmF1bHQuU1BBQ0UsIF9LZXlDb2RlLmRlZmF1bHQuRU5URVJdLmluY2x1ZGVzKGUud2hpY2gpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25JbnRlcm5hbENsaWNrKGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Gb2N1czogb25Gb2N1c1xuICB9LCB0YWIpLCByZW1vdmFibGUgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBcImFyaWEtbGFiZWxcIjogcmVtb3ZlQXJpYUxhYmVsIHx8ICdyZW1vdmUnLFxuICAgIHRhYkluZGV4OiAwLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQodGFiUHJlZml4LCBcIi1yZW1vdmVcIiksXG4gICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25SZW1vdmVUYWIoZSk7XG4gICAgfVxuICB9LCBjbG9zZUljb24gfHwgZWRpdGFibGUucmVtb3ZlSWNvbiB8fCAnw5cnKSk7XG5cbiAgaWYgKHJlbmRlcldyYXBwZXIpIHtcbiAgICBub2RlID0gcmVuZGVyV3JhcHBlcihub2RlKTtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKFRhYk5vZGUpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYWZcIikpO1xuXG52YXIgX3JjUmVzaXplT2JzZXJ2ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1yZXNpemUtb2JzZXJ2ZXJcIikpO1xuXG52YXIgX3VzZVJhZiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuLi9ob29rcy91c2VSYWZcIikpO1xuXG52YXIgX1RhYk5vZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RhYk5vZGVcIikpO1xuXG52YXIgX3VzZU9mZnNldHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9ob29rcy91c2VPZmZzZXRzXCIpKTtcblxudmFyIF91c2VWaXNpYmxlUmFuZ2UzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaG9va3MvdXNlVmlzaWJsZVJhbmdlXCIpKTtcblxudmFyIF9PcGVyYXRpb25Ob2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9PcGVyYXRpb25Ob2RlXCIpKTtcblxudmFyIF9UYWJDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vVGFiQ29udGV4dFwiKSk7XG5cbnZhciBfdXNlVG91Y2hNb3ZlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaG9va3MvdXNlVG91Y2hNb3ZlXCIpKTtcblxudmFyIF91c2VSZWZzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2hvb2tzL3VzZVJlZnNcIikpO1xuXG52YXIgX0FkZEJ1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQWRkQnV0dG9uXCIpKTtcblxudmFyIF91c2VTeW5jU3RhdGU1ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaG9va3MvdXNlU3luY1N0YXRlXCIpKTtcblxudmFyIEV4dHJhQ29udGVudCA9IGZ1bmN0aW9uIEV4dHJhQ29udGVudChfcmVmKSB7XG4gIHZhciBwb3NpdGlvbiA9IF9yZWYucG9zaXRpb24sXG4gICAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIGV4dHJhID0gX3JlZi5leHRyYTtcbiAgaWYgKCFleHRyYSkgcmV0dXJuIG51bGw7XG4gIHZhciBjb250ZW50O1xuICB2YXIgYXNzZXJ0RXh0cmEgPSBleHRyYTtcblxuICBpZiAocG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICBjb250ZW50ID0gYXNzZXJ0RXh0cmEucmlnaHQgfHwgIWFzc2VydEV4dHJhLmxlZnQgJiYgYXNzZXJ0RXh0cmEgfHwgbnVsbDtcbiAgfVxuXG4gIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgY29udGVudCA9IGFzc2VydEV4dHJhLmxlZnQgfHwgbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50ID8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4dHJhLWNvbnRlbnRcIilcbiAgfSwgY29udGVudCkgOiBudWxsO1xufTtcblxuZnVuY3Rpb24gVGFiTmF2TGlzdChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KF9UYWJDb250ZXh0LmRlZmF1bHQpLFxuICAgICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzLFxuICAgICAgdGFicyA9IF9SZWFjdCR1c2VDb250ZXh0LnRhYnM7XG5cbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBpZCA9IHByb3BzLmlkLFxuICAgICAgYW5pbWF0ZWQgPSBwcm9wcy5hbmltYXRlZCxcbiAgICAgIGFjdGl2ZUtleSA9IHByb3BzLmFjdGl2ZUtleSxcbiAgICAgIHJ0bCA9IHByb3BzLnJ0bCxcbiAgICAgIGV4dHJhID0gcHJvcHMuZXh0cmEsXG4gICAgICBlZGl0YWJsZSA9IHByb3BzLmVkaXRhYmxlLFxuICAgICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgICAgdGFiUG9zaXRpb24gPSBwcm9wcy50YWJQb3NpdGlvbixcbiAgICAgIHRhYkJhckd1dHRlciA9IHByb3BzLnRhYkJhckd1dHRlcixcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBvblRhYkNsaWNrID0gcHJvcHMub25UYWJDbGljayxcbiAgICAgIG9uVGFiU2Nyb2xsID0gcHJvcHMub25UYWJTY3JvbGw7XG4gIHZhciB0YWJzV3JhcHBlclJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKCk7XG4gIHZhciB0YWJMaXN0UmVmID0gKDAsIFJlYWN0LnVzZVJlZikoKTtcbiAgdmFyIG9wZXJhdGlvbnNSZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgpO1xuICB2YXIgaW5uZXJBZGRCdXR0b25SZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgpO1xuXG4gIHZhciBfdXNlUmVmcyA9ICgwLCBfdXNlUmVmczMuZGVmYXVsdCkoKSxcbiAgICAgIF91c2VSZWZzMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVJlZnMsIDIpLFxuICAgICAgZ2V0QnRuUmVmID0gX3VzZVJlZnMyWzBdLFxuICAgICAgcmVtb3ZlQnRuUmVmID0gX3VzZVJlZnMyWzFdO1xuXG4gIHZhciB0YWJQb3NpdGlvblRvcE9yQm90dG9tID0gdGFiUG9zaXRpb24gPT09ICd0b3AnIHx8IHRhYlBvc2l0aW9uID09PSAnYm90dG9tJztcblxuICB2YXIgX3VzZVN5bmNTdGF0ZSA9ICgwLCBfdXNlU3luY1N0YXRlNS5kZWZhdWx0KSgwLCBmdW5jdGlvbiAobmV4dCwgcHJldikge1xuICAgIGlmICh0YWJQb3NpdGlvblRvcE9yQm90dG9tICYmIG9uVGFiU2Nyb2xsKSB7XG4gICAgICBvblRhYlNjcm9sbCh7XG4gICAgICAgIGRpcmVjdGlvbjogbmV4dCA+IHByZXYgPyAnbGVmdCcgOiAncmlnaHQnXG4gICAgICB9KTtcbiAgICB9XG4gIH0pLFxuICAgICAgX3VzZVN5bmNTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTeW5jU3RhdGUsIDIpLFxuICAgICAgdHJhbnNmb3JtTGVmdCA9IF91c2VTeW5jU3RhdGUyWzBdLFxuICAgICAgc2V0VHJhbnNmb3JtTGVmdCA9IF91c2VTeW5jU3RhdGUyWzFdO1xuXG4gIHZhciBfdXNlU3luY1N0YXRlMyA9ICgwLCBfdXNlU3luY1N0YXRlNS5kZWZhdWx0KSgwLCBmdW5jdGlvbiAobmV4dCwgcHJldikge1xuICAgIGlmICghdGFiUG9zaXRpb25Ub3BPckJvdHRvbSAmJiBvblRhYlNjcm9sbCkge1xuICAgICAgb25UYWJTY3JvbGwoe1xuICAgICAgICBkaXJlY3Rpb246IG5leHQgPiBwcmV2ID8gJ3RvcCcgOiAnYm90dG9tJ1xuICAgICAgfSk7XG4gICAgfVxuICB9KSxcbiAgICAgIF91c2VTeW5jU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3luY1N0YXRlMywgMiksXG4gICAgICB0cmFuc2Zvcm1Ub3AgPSBfdXNlU3luY1N0YXRlNFswXSxcbiAgICAgIHNldFRyYW5zZm9ybVRvcCA9IF91c2VTeW5jU3RhdGU0WzFdO1xuXG4gIHZhciBfdXNlU3RhdGUgPSAoMCwgUmVhY3QudXNlU3RhdGUpKDApLFxuICAgICAgX3VzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIHdyYXBwZXJTY3JvbGxXaWR0aCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRXcmFwcGVyU2Nyb2xsV2lkdGggPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfdXNlU3RhdGUzID0gKDAsIFJlYWN0LnVzZVN0YXRlKSgwKSxcbiAgICAgIF91c2VTdGF0ZTQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTMsIDIpLFxuICAgICAgd3JhcHBlclNjcm9sbEhlaWdodCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRXcmFwcGVyU2Nyb2xsSGVpZ2h0ID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgX3VzZVN0YXRlNSA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoMCksXG4gICAgICBfdXNlU3RhdGU2ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGU1LCAyKSxcbiAgICAgIHdyYXBwZXJDb250ZW50V2lkdGggPSBfdXNlU3RhdGU2WzBdLFxuICAgICAgc2V0V3JhcHBlckNvbnRlbnRXaWR0aCA9IF91c2VTdGF0ZTZbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTcgPSAoMCwgUmVhY3QudXNlU3RhdGUpKDApLFxuICAgICAgX3VzZVN0YXRlOCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlNywgMiksXG4gICAgICB3cmFwcGVyQ29udGVudEhlaWdodCA9IF91c2VTdGF0ZThbMF0sXG4gICAgICBzZXRXcmFwcGVyQ29udGVudEhlaWdodCA9IF91c2VTdGF0ZThbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTkgPSAoMCwgUmVhY3QudXNlU3RhdGUpKG51bGwpLFxuICAgICAgX3VzZVN0YXRlMTAgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTksIDIpLFxuICAgICAgd3JhcHBlcldpZHRoID0gX3VzZVN0YXRlMTBbMF0sXG4gICAgICBzZXRXcmFwcGVyV2lkdGggPSBfdXNlU3RhdGUxMFsxXTtcblxuICB2YXIgX3VzZVN0YXRlMTEgPSAoMCwgUmVhY3QudXNlU3RhdGUpKG51bGwpLFxuICAgICAgX3VzZVN0YXRlMTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTExLCAyKSxcbiAgICAgIHdyYXBwZXJIZWlnaHQgPSBfdXNlU3RhdGUxMlswXSxcbiAgICAgIHNldFdyYXBwZXJIZWlnaHQgPSBfdXNlU3RhdGUxMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlMTMgPSAoMCwgUmVhY3QudXNlU3RhdGUpKDApLFxuICAgICAgX3VzZVN0YXRlMTQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTEzLCAyKSxcbiAgICAgIGFkZFdpZHRoID0gX3VzZVN0YXRlMTRbMF0sXG4gICAgICBzZXRBZGRXaWR0aCA9IF91c2VTdGF0ZTE0WzFdO1xuXG4gIHZhciBfdXNlU3RhdGUxNSA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoMCksXG4gICAgICBfdXNlU3RhdGUxNiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlMTUsIDIpLFxuICAgICAgYWRkSGVpZ2h0ID0gX3VzZVN0YXRlMTZbMF0sXG4gICAgICBzZXRBZGRIZWlnaHQgPSBfdXNlU3RhdGUxNlsxXTtcblxuICB2YXIgX3VzZVJhZlN0YXRlID0gKDAsIF91c2VSYWYudXNlUmFmU3RhdGUpKG5ldyBNYXAoKSksXG4gICAgICBfdXNlUmFmU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlUmFmU3RhdGUsIDIpLFxuICAgICAgdGFiU2l6ZXMgPSBfdXNlUmFmU3RhdGUyWzBdLFxuICAgICAgc2V0VGFiU2l6ZXMgPSBfdXNlUmFmU3RhdGUyWzFdO1xuXG4gIHZhciB0YWJPZmZzZXRzID0gKDAsIF91c2VPZmZzZXRzLmRlZmF1bHQpKHRhYnMsIHRhYlNpemVzLCB3cmFwcGVyU2Nyb2xsV2lkdGgpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBVdGlsID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgb3BlcmF0aW9uc0hpZGRlbkNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmF2LW9wZXJhdGlvbnMtaGlkZGVuXCIpO1xuICB2YXIgdHJhbnNmb3JtTWluID0gMDtcbiAgdmFyIHRyYW5zZm9ybU1heCA9IDA7XG5cbiAgaWYgKCF0YWJQb3NpdGlvblRvcE9yQm90dG9tKSB7XG4gICAgdHJhbnNmb3JtTWluID0gTWF0aC5taW4oMCwgd3JhcHBlckhlaWdodCAtIHdyYXBwZXJTY3JvbGxIZWlnaHQpO1xuICAgIHRyYW5zZm9ybU1heCA9IDA7XG4gIH0gZWxzZSBpZiAocnRsKSB7XG4gICAgdHJhbnNmb3JtTWluID0gMDtcbiAgICB0cmFuc2Zvcm1NYXggPSBNYXRoLm1heCgwLCB3cmFwcGVyU2Nyb2xsV2lkdGggLSB3cmFwcGVyV2lkdGgpO1xuICB9IGVsc2Uge1xuICAgIHRyYW5zZm9ybU1pbiA9IE1hdGgubWluKDAsIHdyYXBwZXJXaWR0aCAtIHdyYXBwZXJTY3JvbGxXaWR0aCk7XG4gICAgdHJhbnNmb3JtTWF4ID0gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFsaWduSW5SYW5nZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA8IHRyYW5zZm9ybU1pbikge1xuICAgICAgcmV0dXJuIFt0cmFuc2Zvcm1NaW4sIGZhbHNlXTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPiB0cmFuc2Zvcm1NYXgpIHtcbiAgICAgIHJldHVybiBbdHJhbnNmb3JtTWF4LCBmYWxzZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFt2YWx1ZSwgdHJ1ZV07XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBNb2JpbGUgPT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgdG91Y2hNb3ZpbmdSZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgpO1xuXG4gIHZhciBfdXNlU3RhdGUxNyA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoKSxcbiAgICAgIF91c2VTdGF0ZTE4ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUxNywgMiksXG4gICAgICBsb2NrQW5pbWF0aW9uID0gX3VzZVN0YXRlMThbMF0sXG4gICAgICBzZXRMb2NrQW5pbWF0aW9uID0gX3VzZVN0YXRlMThbMV07XG5cbiAgZnVuY3Rpb24gZG9Mb2NrQW5pbWF0aW9uKCkge1xuICAgIHNldExvY2tBbmltYXRpb24oRGF0ZS5ub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhclRvdWNoTW92aW5nKCkge1xuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodG91Y2hNb3ZpbmdSZWYuY3VycmVudCk7XG4gIH1cblxuICAoMCwgX3VzZVRvdWNoTW92ZS5kZWZhdWx0KSh0YWJzV3JhcHBlclJlZiwgZnVuY3Rpb24gKG9mZnNldFgsIG9mZnNldFkpIHtcbiAgICB2YXIgcHJldmVudERlZmF1bHQgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIGRvTW92ZShzZXRTdGF0ZSwgb2Zmc2V0KSB7XG4gICAgICBzZXRTdGF0ZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF9hbGlnbkluUmFuZ2UgPSBhbGlnbkluUmFuZ2UodmFsdWUgKyBvZmZzZXQpLFxuICAgICAgICAgICAgX2FsaWduSW5SYW5nZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9hbGlnbkluUmFuZ2UsIDIpLFxuICAgICAgICAgICAgbmV3VmFsdWUgPSBfYWxpZ25JblJhbmdlMlswXSxcbiAgICAgICAgICAgIG5lZWRQcmV2ZW50ID0gX2FsaWduSW5SYW5nZTJbMV07XG5cbiAgICAgICAgcHJldmVudERlZmF1bHQgPSBuZWVkUHJldmVudDtcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRhYlBvc2l0aW9uVG9wT3JCb3R0b20pIHtcbiAgICAgIC8vIFNraXAgc2Nyb2xsIGlmIHBsYWNlIGlzIGVub3VnaFxuICAgICAgaWYgKHdyYXBwZXJXaWR0aCA+PSB3cmFwcGVyU2Nyb2xsV2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHByZXZlbnREZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICBkb01vdmUoc2V0VHJhbnNmb3JtTGVmdCwgb2Zmc2V0WCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh3cmFwcGVySGVpZ2h0ID49IHdyYXBwZXJTY3JvbGxIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHByZXZlbnREZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICBkb01vdmUoc2V0VHJhbnNmb3JtVG9wLCBvZmZzZXRZKTtcbiAgICB9XG5cbiAgICBjbGVhclRvdWNoTW92aW5nKCk7XG4gICAgZG9Mb2NrQW5pbWF0aW9uKCk7XG4gICAgcmV0dXJuIHByZXZlbnREZWZhdWx0O1xuICB9KTtcbiAgKDAsIFJlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVG91Y2hNb3ZpbmcoKTtcblxuICAgIGlmIChsb2NrQW5pbWF0aW9uKSB7XG4gICAgICB0b3VjaE1vdmluZ1JlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRMb2NrQW5pbWF0aW9uKDApO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xlYXJUb3VjaE1vdmluZztcbiAgfSwgW2xvY2tBbmltYXRpb25dKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBTY3JvbGwgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gc2Nyb2xsVG9UYWIoKSB7XG4gICAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogYWN0aXZlS2V5O1xuICAgIHZhciB0YWJPZmZzZXQgPSB0YWJPZmZzZXRzLmdldChrZXkpO1xuICAgIGlmICghdGFiT2Zmc2V0KSByZXR1cm47XG5cbiAgICBpZiAodGFiUG9zaXRpb25Ub3BPckJvdHRvbSkge1xuICAgICAgLy8gPT09PT09PT09PT09IEFsaWduIHdpdGggdG9wICYgYm90dG9tID09PT09PT09PT09PVxuICAgICAgdmFyIG5ld1RyYW5zZm9ybSA9IHRyYW5zZm9ybUxlZnQ7IC8vIFJUTFxuXG4gICAgICBpZiAocnRsKSB7XG4gICAgICAgIGlmICh0YWJPZmZzZXQucmlnaHQgPCB0cmFuc2Zvcm1MZWZ0KSB7XG4gICAgICAgICAgbmV3VHJhbnNmb3JtID0gdGFiT2Zmc2V0LnJpZ2h0O1xuICAgICAgICB9IGVsc2UgaWYgKHRhYk9mZnNldC5yaWdodCArIHRhYk9mZnNldC53aWR0aCA+IHRyYW5zZm9ybUxlZnQgKyB3cmFwcGVyV2lkdGgpIHtcbiAgICAgICAgICBuZXdUcmFuc2Zvcm0gPSB0YWJPZmZzZXQucmlnaHQgKyB0YWJPZmZzZXQud2lkdGggLSB3cmFwcGVyV2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gTFRSXG4gICAgICBlbHNlIGlmICh0YWJPZmZzZXQubGVmdCA8IC10cmFuc2Zvcm1MZWZ0KSB7XG4gICAgICAgICAgbmV3VHJhbnNmb3JtID0gLXRhYk9mZnNldC5sZWZ0O1xuICAgICAgICB9IGVsc2UgaWYgKHRhYk9mZnNldC5sZWZ0ICsgdGFiT2Zmc2V0LndpZHRoID4gLXRyYW5zZm9ybUxlZnQgKyB3cmFwcGVyV2lkdGgpIHtcbiAgICAgICAgICBuZXdUcmFuc2Zvcm0gPSAtKHRhYk9mZnNldC5sZWZ0ICsgdGFiT2Zmc2V0LndpZHRoIC0gd3JhcHBlcldpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICBzZXRUcmFuc2Zvcm1Ub3AoMCk7XG4gICAgICBzZXRUcmFuc2Zvcm1MZWZ0KGFsaWduSW5SYW5nZShuZXdUcmFuc2Zvcm0pWzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gPT09PT09PT09PT09IEFsaWduIHdpdGggbGVmdCAmIHJpZ2h0ID09PT09PT09PT09PVxuICAgICAgdmFyIF9uZXdUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1Ub3A7XG5cbiAgICAgIGlmICh0YWJPZmZzZXQudG9wIDwgLXRyYW5zZm9ybVRvcCkge1xuICAgICAgICBfbmV3VHJhbnNmb3JtID0gLXRhYk9mZnNldC50b3A7XG4gICAgICB9IGVsc2UgaWYgKHRhYk9mZnNldC50b3AgKyB0YWJPZmZzZXQuaGVpZ2h0ID4gLXRyYW5zZm9ybVRvcCArIHdyYXBwZXJIZWlnaHQpIHtcbiAgICAgICAgX25ld1RyYW5zZm9ybSA9IC0odGFiT2Zmc2V0LnRvcCArIHRhYk9mZnNldC5oZWlnaHQgLSB3cmFwcGVySGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgc2V0VHJhbnNmb3JtTGVmdCgwKTtcbiAgICAgIHNldFRyYW5zZm9ybVRvcChhbGlnbkluUmFuZ2UoX25ld1RyYW5zZm9ybSlbMF0pO1xuICAgIH1cbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBUYWIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVuZGVyIHRhYiBub2RlICYgY29sbGVjdCB0YWIgb2Zmc2V0XG5cblxuICB2YXIgX3VzZVZpc2libGVSYW5nZSA9ICgwLCBfdXNlVmlzaWJsZVJhbmdlMy5kZWZhdWx0KSh0YWJPZmZzZXRzLCB7XG4gICAgd2lkdGg6IHdyYXBwZXJXaWR0aCxcbiAgICBoZWlnaHQ6IHdyYXBwZXJIZWlnaHQsXG4gICAgbGVmdDogdHJhbnNmb3JtTGVmdCxcbiAgICB0b3A6IHRyYW5zZm9ybVRvcFxuICB9LCB7XG4gICAgd2lkdGg6IHdyYXBwZXJDb250ZW50V2lkdGgsXG4gICAgaGVpZ2h0OiB3cmFwcGVyQ29udGVudEhlaWdodFxuICB9LCB7XG4gICAgd2lkdGg6IGFkZFdpZHRoLFxuICAgIGhlaWdodDogYWRkSGVpZ2h0XG4gIH0sICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHByb3BzKSwge30sIHtcbiAgICB0YWJzOiB0YWJzXG4gIH0pKSxcbiAgICAgIF91c2VWaXNpYmxlUmFuZ2UyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlVmlzaWJsZVJhbmdlLCAyKSxcbiAgICAgIHZpc2libGVTdGFydCA9IF91c2VWaXNpYmxlUmFuZ2UyWzBdLFxuICAgICAgdmlzaWJsZUVuZCA9IF91c2VWaXNpYmxlUmFuZ2UyWzFdO1xuXG4gIHZhciB0YWJOb2RlcyA9IHRhYnMubWFwKGZ1bmN0aW9uICh0YWIpIHtcbiAgICB2YXIga2V5ID0gdGFiLmtleTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfVGFiTm9kZS5kZWZhdWx0LCB7XG4gICAgICBpZDogaWQsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGtleToga2V5LFxuICAgICAgcnRsOiBydGwsXG4gICAgICB0YWI6IHRhYixcbiAgICAgIGNsb3NhYmxlOiB0YWIuY2xvc2FibGUsXG4gICAgICBlZGl0YWJsZTogZWRpdGFibGUsXG4gICAgICBhY3RpdmU6IGtleSA9PT0gYWN0aXZlS2V5LFxuICAgICAgdGFiUG9zaXRpb246IHRhYlBvc2l0aW9uLFxuICAgICAgdGFiQmFyR3V0dGVyOiB0YWJCYXJHdXR0ZXIsXG4gICAgICByZW5kZXJXcmFwcGVyOiBjaGlsZHJlbixcbiAgICAgIHJlbW92ZUFyaWFMYWJlbDogbG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLnJlbW92ZUFyaWFMYWJlbCxcbiAgICAgIHJlZjogZ2V0QnRuUmVmKGtleSksXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgb25UYWJDbGljayhrZXksIGUpO1xuICAgICAgfSxcbiAgICAgIG9uUmVtb3ZlOiBmdW5jdGlvbiBvblJlbW92ZSgpIHtcbiAgICAgICAgcmVtb3ZlQnRuUmVmKGtleSk7XG4gICAgICB9LFxuICAgICAgb25Gb2N1czogZnVuY3Rpb24gb25Gb2N1cygpIHtcbiAgICAgICAgc2Nyb2xsVG9UYWIoa2V5KTtcbiAgICAgICAgZG9Mb2NrQW5pbWF0aW9uKCk7IC8vIEZvY3VzIGVsZW1lbnQgd2lsbCBtYWtlIHNjcm9sbExlZnQgY2hhbmdlIHdoaWNoIHdlIHNob3VsZCByZXNldCBiYWNrXG5cbiAgICAgICAgaWYgKCFydGwpIHtcbiAgICAgICAgICB0YWJzV3JhcHBlclJlZi5jdXJyZW50LnNjcm9sbExlZnQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFic1dyYXBwZXJSZWYuY3VycmVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgdmFyIG9uTGlzdEhvbGRlclJlc2l6ZSA9ICgwLCBfdXNlUmFmLmRlZmF1bHQpKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RhYnNXcmFwcGVyUmVmJGN1cnJlLCBfdGFic1dyYXBwZXJSZWYkY3VycmUyLCBfaW5uZXJBZGRCdXR0b25SZWYkY3UsIF9pbm5lckFkZEJ1dHRvblJlZiRjdTIsIF9vcGVyYXRpb25zUmVmJGN1cnJlbiwgX29wZXJhdGlvbnNSZWYkY3VycmVuMiwgX3RhYkxpc3RSZWYkY3VycmVudCwgX3RhYkxpc3RSZWYkY3VycmVudDIsIF9vcGVyYXRpb25zUmVmJGN1cnJlbjM7XG5cbiAgICAvLyBVcGRhdGUgd3JhcHBlciByZWNvcmRzXG4gICAgdmFyIG9mZnNldFdpZHRoID0gKChfdGFic1dyYXBwZXJSZWYkY3VycmUgPSB0YWJzV3JhcHBlclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdGFic1dyYXBwZXJSZWYkY3VycmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YWJzV3JhcHBlclJlZiRjdXJyZS5vZmZzZXRXaWR0aCkgfHwgMDtcbiAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gKChfdGFic1dyYXBwZXJSZWYkY3VycmUyID0gdGFic1dyYXBwZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RhYnNXcmFwcGVyUmVmJGN1cnJlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RhYnNXcmFwcGVyUmVmJGN1cnJlMi5vZmZzZXRIZWlnaHQpIHx8IDA7XG4gICAgdmFyIG5ld0FkZFdpZHRoID0gKChfaW5uZXJBZGRCdXR0b25SZWYkY3UgPSBpbm5lckFkZEJ1dHRvblJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfaW5uZXJBZGRCdXR0b25SZWYkY3UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9pbm5lckFkZEJ1dHRvblJlZiRjdS5vZmZzZXRXaWR0aCkgfHwgMDtcbiAgICB2YXIgbmV3QWRkSGVpZ2h0ID0gKChfaW5uZXJBZGRCdXR0b25SZWYkY3UyID0gaW5uZXJBZGRCdXR0b25SZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2lubmVyQWRkQnV0dG9uUmVmJGN1MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2lubmVyQWRkQnV0dG9uUmVmJGN1Mi5vZmZzZXRIZWlnaHQpIHx8IDA7XG4gICAgdmFyIG5ld09wZXJhdGlvbldpZHRoID0gKChfb3BlcmF0aW9uc1JlZiRjdXJyZW4gPSBvcGVyYXRpb25zUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9vcGVyYXRpb25zUmVmJGN1cnJlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wZXJhdGlvbnNSZWYkY3VycmVuLm9mZnNldFdpZHRoKSB8fCAwO1xuICAgIHZhciBuZXdPcGVyYXRpb25IZWlnaHQgPSAoKF9vcGVyYXRpb25zUmVmJGN1cnJlbjIgPSBvcGVyYXRpb25zUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9vcGVyYXRpb25zUmVmJGN1cnJlbjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcGVyYXRpb25zUmVmJGN1cnJlbjIub2Zmc2V0SGVpZ2h0KSB8fCAwO1xuICAgIHNldFdyYXBwZXJXaWR0aChvZmZzZXRXaWR0aCk7XG4gICAgc2V0V3JhcHBlckhlaWdodChvZmZzZXRIZWlnaHQpO1xuICAgIHNldEFkZFdpZHRoKG5ld0FkZFdpZHRoKTtcbiAgICBzZXRBZGRIZWlnaHQobmV3QWRkSGVpZ2h0KTtcbiAgICB2YXIgbmV3V3JhcHBlclNjcm9sbFdpZHRoID0gKCgoX3RhYkxpc3RSZWYkY3VycmVudCA9IHRhYkxpc3RSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RhYkxpc3RSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RhYkxpc3RSZWYkY3VycmVudC5vZmZzZXRXaWR0aCkgfHwgMCkgLSBuZXdBZGRXaWR0aDtcbiAgICB2YXIgbmV3V3JhcHBlclNjcm9sbEhlaWdodCA9ICgoKF90YWJMaXN0UmVmJGN1cnJlbnQyID0gdGFiTGlzdFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdGFiTGlzdFJlZiRjdXJyZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RhYkxpc3RSZWYkY3VycmVudDIub2Zmc2V0SGVpZ2h0KSB8fCAwKSAtIG5ld0FkZEhlaWdodDtcbiAgICBzZXRXcmFwcGVyU2Nyb2xsV2lkdGgobmV3V3JhcHBlclNjcm9sbFdpZHRoKTtcbiAgICBzZXRXcmFwcGVyU2Nyb2xsSGVpZ2h0KG5ld1dyYXBwZXJTY3JvbGxIZWlnaHQpO1xuICAgIHZhciBpc09wZXJhdGlvbkhpZGRlbiA9IChfb3BlcmF0aW9uc1JlZiRjdXJyZW4zID0gb3BlcmF0aW9uc1JlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfb3BlcmF0aW9uc1JlZiRjdXJyZW4zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3BlcmF0aW9uc1JlZiRjdXJyZW4zLmNsYXNzTmFtZS5pbmNsdWRlcyhvcGVyYXRpb25zSGlkZGVuQ2xhc3NOYW1lKTtcbiAgICBzZXRXcmFwcGVyQ29udGVudFdpZHRoKG5ld1dyYXBwZXJTY3JvbGxXaWR0aCAtIChpc09wZXJhdGlvbkhpZGRlbiA/IDAgOiBuZXdPcGVyYXRpb25XaWR0aCkpO1xuICAgIHNldFdyYXBwZXJDb250ZW50SGVpZ2h0KG5ld1dyYXBwZXJTY3JvbGxIZWlnaHQgLSAoaXNPcGVyYXRpb25IaWRkZW4gPyAwIDogbmV3T3BlcmF0aW9uSGVpZ2h0KSk7IC8vIFVwZGF0ZSBidXR0b25zIHJlY29yZHNcblxuICAgIHNldFRhYlNpemVzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuZXdTaXplcyA9IG5ldyBNYXAoKTtcbiAgICAgIHRhYnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYyLmtleTtcbiAgICAgICAgdmFyIGJ0bk5vZGUgPSBnZXRCdG5SZWYoa2V5KS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChidG5Ob2RlKSB7XG4gICAgICAgICAgbmV3U2l6ZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgd2lkdGg6IGJ0bk5vZGUub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGJ0bk5vZGUub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgICAgbGVmdDogYnRuTm9kZS5vZmZzZXRMZWZ0LFxuICAgICAgICAgICAgdG9wOiBidG5Ob2RlLm9mZnNldFRvcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXdTaXplcztcbiAgICB9KTtcbiAgfSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBEcm9wZG93biA9PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBzdGFydEhpZGRlblRhYnMgPSB0YWJzLnNsaWNlKDAsIHZpc2libGVTdGFydCk7XG4gIHZhciBlbmRIaWRkZW5UYWJzID0gdGFicy5zbGljZSh2aXNpYmxlRW5kICsgMSk7XG4gIHZhciBoaWRkZW5UYWJzID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHN0YXJ0SGlkZGVuVGFicyksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGVuZEhpZGRlblRhYnMpKTsgLy8gPT09PT09PT09PT09PT09PT09PSBMaW5rICYgT3BlcmF0aW9ucyA9PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIF91c2VTdGF0ZTE5ID0gKDAsIFJlYWN0LnVzZVN0YXRlKSgpLFxuICAgICAgX3VzZVN0YXRlMjAgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTE5LCAyKSxcbiAgICAgIGlua1N0eWxlID0gX3VzZVN0YXRlMjBbMF0sXG4gICAgICBzZXRJbmtTdHlsZSA9IF91c2VTdGF0ZTIwWzFdO1xuXG4gIHZhciBhY3RpdmVUYWJPZmZzZXQgPSB0YWJPZmZzZXRzLmdldChhY3RpdmVLZXkpOyAvLyBEZWxheSBzZXQgaW5rIHN0eWxlIHRvIGF2b2lkIHJlbW92ZSB0YWIgYmxpbmtcblxuICB2YXIgaW5rQmFyUmFmUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoKTtcblxuICBmdW5jdGlvbiBjbGVhbklua0JhclJhZigpIHtcbiAgICBfcmFmLmRlZmF1bHQuY2FuY2VsKGlua0JhclJhZlJlZi5jdXJyZW50KTtcbiAgfVxuXG4gICgwLCBSZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3SW5rU3R5bGUgPSB7fTtcblxuICAgIGlmIChhY3RpdmVUYWJPZmZzZXQpIHtcbiAgICAgIGlmICh0YWJQb3NpdGlvblRvcE9yQm90dG9tKSB7XG4gICAgICAgIGlmIChydGwpIHtcbiAgICAgICAgICBuZXdJbmtTdHlsZS5yaWdodCA9IGFjdGl2ZVRhYk9mZnNldC5yaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdJbmtTdHlsZS5sZWZ0ID0gYWN0aXZlVGFiT2Zmc2V0LmxlZnQ7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdJbmtTdHlsZS53aWR0aCA9IGFjdGl2ZVRhYk9mZnNldC53aWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0lua1N0eWxlLnRvcCA9IGFjdGl2ZVRhYk9mZnNldC50b3A7XG4gICAgICAgIG5ld0lua1N0eWxlLmhlaWdodCA9IGFjdGl2ZVRhYk9mZnNldC5oZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xlYW5JbmtCYXJSYWYoKTtcbiAgICBpbmtCYXJSYWZSZWYuY3VycmVudCA9ICgwLCBfcmFmLmRlZmF1bHQpKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldElua1N0eWxlKG5ld0lua1N0eWxlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2xlYW5JbmtCYXJSYWY7XG4gIH0sIFthY3RpdmVUYWJPZmZzZXQsIHRhYlBvc2l0aW9uVG9wT3JCb3R0b20sIHJ0bF0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAoMCwgUmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgc2Nyb2xsVG9UYWIoKTtcbiAgfSwgW2FjdGl2ZUtleSwgYWN0aXZlVGFiT2Zmc2V0LCB0YWJPZmZzZXRzLCB0YWJQb3NpdGlvblRvcE9yQm90dG9tXSk7IC8vIFNob3VsZCByZWNhbGN1bGF0ZSB3aGVuIHJ0bCBjaGFuZ2VkXG5cbiAgKDAsIFJlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIG9uTGlzdEhvbGRlclJlc2l6ZSgpO1xuICB9LCBbcnRsLCB0YWJCYXJHdXR0ZXIsIGFjdGl2ZUtleSwgdGFicy5tYXAoZnVuY3Rpb24gKHRhYikge1xuICAgIHJldHVybiB0YWIua2V5O1xuICB9KS5qb2luKCdfJyldKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGhhc0Ryb3Bkb3duID0gISFoaWRkZW5UYWJzLmxlbmd0aDtcbiAgdmFyIHdyYXBQcmVmaXggPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5hdi13cmFwXCIpO1xuICB2YXIgcGluZ0xlZnQ7XG4gIHZhciBwaW5nUmlnaHQ7XG4gIHZhciBwaW5nVG9wO1xuICB2YXIgcGluZ0JvdHRvbTtcblxuICBpZiAodGFiUG9zaXRpb25Ub3BPckJvdHRvbSkge1xuICAgIGlmIChydGwpIHtcbiAgICAgIHBpbmdSaWdodCA9IHRyYW5zZm9ybUxlZnQgPiAwO1xuICAgICAgcGluZ0xlZnQgPSB0cmFuc2Zvcm1MZWZ0ICsgd3JhcHBlcldpZHRoIDwgd3JhcHBlclNjcm9sbFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBwaW5nTGVmdCA9IHRyYW5zZm9ybUxlZnQgPCAwO1xuICAgICAgcGluZ1JpZ2h0ID0gLXRyYW5zZm9ybUxlZnQgKyB3cmFwcGVyV2lkdGggPCB3cmFwcGVyU2Nyb2xsV2lkdGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBpbmdUb3AgPSB0cmFuc2Zvcm1Ub3AgPCAwO1xuICAgIHBpbmdCb3R0b20gPSAtdHJhbnNmb3JtVG9wICsgd3JhcHBlckhlaWdodCA8IHdyYXBwZXJTY3JvbGxIZWlnaHQ7XG4gIH1cbiAgLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvaW50ZXJhY3RpdmUtc3VwcG9ydHMtZm9jdXMgKi9cblxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IHJlZixcbiAgICByb2xlOiBcInRhYmxpc3RcIixcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5hdlwiKSwgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oKSB7XG4gICAgICAvLyBObyBuZWVkIGFuaW1hdGlvbiB3aGVuIHVzZSBrZXlib2FyZFxuICAgICAgZG9Mb2NrQW5pbWF0aW9uKCk7XG4gICAgfVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KEV4dHJhQ29udGVudCwge1xuICAgIHBvc2l0aW9uOiBcImxlZnRcIixcbiAgICBleHRyYTogZXh0cmEsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjUmVzaXplT2JzZXJ2ZXIuZGVmYXVsdCwge1xuICAgIG9uUmVzaXplOiBvbkxpc3RIb2xkZXJSZXNpemVcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkod3JhcFByZWZpeCwgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh3cmFwUHJlZml4LCBcIi1waW5nLWxlZnRcIiksIHBpbmdMZWZ0KSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHdyYXBQcmVmaXgsIFwiLXBpbmctcmlnaHRcIiksIHBpbmdSaWdodCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh3cmFwUHJlZml4LCBcIi1waW5nLXRvcFwiKSwgcGluZ1RvcCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh3cmFwUHJlZml4LCBcIi1waW5nLWJvdHRvbVwiKSwgcGluZ0JvdHRvbSksIF9jbGFzc05hbWVzKSksXG4gICAgcmVmOiB0YWJzV3JhcHBlclJlZlxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY1Jlc2l6ZU9ic2VydmVyLmRlZmF1bHQsIHtcbiAgICBvblJlc2l6ZTogb25MaXN0SG9sZGVyUmVzaXplXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogdGFiTGlzdFJlZixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmF2LWxpc3RcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIuY29uY2F0KHRyYW5zZm9ybUxlZnQsIFwicHgsIFwiKS5jb25jYXQodHJhbnNmb3JtVG9wLCBcInB4KVwiKSxcbiAgICAgIHRyYW5zaXRpb246IGxvY2tBbmltYXRpb24gPyAnbm9uZScgOiB1bmRlZmluZWRcbiAgICB9XG4gIH0sIHRhYk5vZGVzLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9BZGRCdXR0b24uZGVmYXVsdCwge1xuICAgIHJlZjogaW5uZXJBZGRCdXR0b25SZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZWRpdGFibGU6IGVkaXRhYmxlLFxuICAgIHN0eWxlOiB7XG4gICAgICB2aXNpYmlsaXR5OiBoYXNEcm9wZG93biA/ICdoaWRkZW4nIDogbnVsbFxuICAgIH1cbiAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5rLWJhclwiKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5rLWJhci1hbmltYXRlZFwiKSwgYW5pbWF0ZWQuaW5rQmFyKSksXG4gICAgc3R5bGU6IGlua1N0eWxlXG4gIH0pKSkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChfT3BlcmF0aW9uTm9kZS5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogb3BlcmF0aW9uc1JlZixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB0YWJzOiBoaWRkZW5UYWJzLFxuICAgIGNsYXNzTmFtZTogIWhhc0Ryb3Bkb3duICYmIG9wZXJhdGlvbnNIaWRkZW5DbGFzc05hbWVcbiAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KEV4dHJhQ29udGVudCwge1xuICAgIHBvc2l0aW9uOiBcInJpZ2h0XCIsXG4gICAgZXh0cmE6IGV4dHJhLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0pKTtcbiAgLyogZXNsaW50LWVuYWJsZSAqL1xufVxuXG52YXIgX2RlZmF1bHQgPSBSZWFjdC5mb3J3YXJkUmVmKFRhYk5hdkxpc3QpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBUYWJQYW5lO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbmZ1bmN0aW9uIFRhYlBhbmUoX3JlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICBmb3JjZVJlbmRlciA9IF9yZWYuZm9yY2VSZW5kZXIsXG4gICAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICAgIGlkID0gX3JlZi5pZCxcbiAgICAgIGFjdGl2ZSA9IF9yZWYuYWN0aXZlLFxuICAgICAgYW5pbWF0ZWQgPSBfcmVmLmFuaW1hdGVkLFxuICAgICAgZGVzdHJveUluYWN0aXZlVGFiUGFuZSA9IF9yZWYuZGVzdHJveUluYWN0aXZlVGFiUGFuZSxcbiAgICAgIHRhYktleSA9IF9yZWYudGFiS2V5LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmb3JjZVJlbmRlciksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgdmlzaXRlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRWaXNpdGVkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHNldFZpc2l0ZWQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChkZXN0cm95SW5hY3RpdmVUYWJQYW5lKSB7XG4gICAgICBzZXRWaXNpdGVkKGZhbHNlKTtcbiAgICB9XG4gIH0sIFthY3RpdmUsIGRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmVdKTtcbiAgdmFyIG1lcmdlZFN0eWxlID0ge307XG5cbiAgaWYgKCFhY3RpdmUpIHtcbiAgICBpZiAoYW5pbWF0ZWQpIHtcbiAgICAgIG1lcmdlZFN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIG1lcmdlZFN0eWxlLmhlaWdodCA9IDA7XG4gICAgICBtZXJnZWRTdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJztcbiAgICB9IGVsc2Uge1xuICAgICAgbWVyZ2VkU3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgaWQ6IGlkICYmIFwiXCIuY29uY2F0KGlkLCBcIi1wYW5lbC1cIikuY29uY2F0KHRhYktleSksXG4gICAgcm9sZTogXCJ0YWJwYW5lbFwiLFxuICAgIHRhYkluZGV4OiBhY3RpdmUgPyAwIDogLTEsXG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogaWQgJiYgXCJcIi5jb25jYXQoaWQsIFwiLXRhYi1cIikuY29uY2F0KHRhYktleSksXG4gICAgXCJhcmlhLWhpZGRlblwiOiAhYWN0aXZlLFxuICAgIHN0eWxlOiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBtZXJnZWRTdHlsZSksIHN0eWxlKSxcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRhYnBhbmVcIiksIGFjdGl2ZSAmJiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRhYnBhbmUtYWN0aXZlXCIpLCBjbGFzc05hbWUpXG4gIH0sIChhY3RpdmUgfHwgdmlzaXRlZCB8fCBmb3JjZVJlbmRlcikgJiYgY2hpbGRyZW4pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IFRhYlBhbmVsTGlzdDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfVGFiQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL1RhYkNvbnRleHRcIikpO1xuXG5mdW5jdGlvbiBUYWJQYW5lbExpc3QoX3JlZikge1xuICB2YXIgaWQgPSBfcmVmLmlkLFxuICAgICAgYWN0aXZlS2V5ID0gX3JlZi5hY3RpdmVLZXksXG4gICAgICBhbmltYXRlZCA9IF9yZWYuYW5pbWF0ZWQsXG4gICAgICB0YWJQb3NpdGlvbiA9IF9yZWYudGFiUG9zaXRpb24sXG4gICAgICBydGwgPSBfcmVmLnJ0bCxcbiAgICAgIGRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmUgPSBfcmVmLmRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmU7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfVGFiQ29udGV4dC5kZWZhdWx0KSxcbiAgICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICAgIHRhYnMgPSBfUmVhY3QkdXNlQ29udGV4dC50YWJzO1xuXG4gIHZhciB0YWJQYW5lQW5pbWF0ZWQgPSBhbmltYXRlZC50YWJQYW5lO1xuICB2YXIgYWN0aXZlSW5kZXggPSB0YWJzLmZpbmRJbmRleChmdW5jdGlvbiAodGFiKSB7XG4gICAgcmV0dXJuIHRhYi5rZXkgPT09IGFjdGl2ZUtleTtcbiAgfSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnQtaG9sZGVyXCIpKVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnRcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudC1cIikuY29uY2F0KHRhYlBvc2l0aW9uKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudC1hbmltYXRlZFwiKSwgdGFiUGFuZUFuaW1hdGVkKSksXG4gICAgc3R5bGU6IGFjdGl2ZUluZGV4ICYmIHRhYlBhbmVBbmltYXRlZCA/ICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBydGwgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnLCBcIi1cIi5jb25jYXQoYWN0aXZlSW5kZXgsIFwiMDAlXCIpKSA6IG51bGxcbiAgfSwgdGFicy5tYXAoZnVuY3Rpb24gKHRhYikge1xuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQodGFiLm5vZGUsIHtcbiAgICAgIGtleTogdGFiLmtleSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgdGFiS2V5OiB0YWIua2V5LFxuICAgICAgaWQ6IGlkLFxuICAgICAgYW5pbWF0ZWQ6IHRhYlBhbmVBbmltYXRlZCxcbiAgICAgIGFjdGl2ZTogdGFiLmtleSA9PT0gYWN0aXZlS2V5LFxuICAgICAgZGVzdHJveUluYWN0aXZlVGFiUGFuZTogZGVzdHJveUluYWN0aXZlVGFiUGFuZVxuICAgIH0pO1xuICB9KSkpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxudmFyIF91c2VNZXJnZWRTdGF0ZTUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9ob29rcy91c2VNZXJnZWRTdGF0ZVwiKSk7XG5cbnZhciBfVGFiTmF2TGlzdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGFiTmF2TGlzdFwiKSk7XG5cbnZhciBfVGFiUGFuZWxMaXN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UYWJQYW5lbExpc3RcIikpO1xuXG52YXIgX1RhYlBhbmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RhYlBhbmVsTGlzdC9UYWJQYW5lXCIpKTtcblxudmFyIF9UYWJDb250ZXh0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UYWJDb250ZXh0XCIpKTtcblxudmFyIF91c2VUb3VjaE1vdmUgPSByZXF1aXJlKFwiLi9ob29rcy91c2VUb3VjaE1vdmVcIik7XG5cbi8vIEFjY2Vzc2liaWxpdHkgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQWNjZXNzaWJpbGl0eS9BUklBL1JvbGVzL1RhYl9Sb2xlXG5cbi8qKlxuICogU2hvdWxkIGFkZGVkIGFudGQ6XG4gKiAtIHR5cGVcbiAqXG4gKiBSZW1vdmVkOlxuICogLSBvbk5leHRDbGlja1xuICogLSBvblByZXZDbGlja1xuICogLSBrZXlib2FyZFxuICovXG4vLyBVc2VkIGZvciBhY2Nlc3NpYmlsaXR5XG52YXIgdXVpZCA9IDA7XG5cbmZ1bmN0aW9uIHBhcnNlVGFiTGlzdChjaGlsZHJlbikge1xuICByZXR1cm4gKDAsIF90b0FycmF5LmRlZmF1bHQpKGNoaWxkcmVuKS5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIHZhciBrZXkgPSBub2RlLmtleSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKG5vZGUua2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHtcbiAgICAgICAga2V5OiBrZXlcbiAgICAgIH0sIG5vZGUucHJvcHMpLCB7fSwge1xuICAgICAgICBub2RlOiBub2RlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uICh0YWIpIHtcbiAgICByZXR1cm4gdGFiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gVGFicyhfcmVmLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBpZCA9IF9yZWYuaWQsXG4gICAgICBfcmVmJHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgcHJlZml4Q2xzID0gX3JlZiRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy10YWJzJyA6IF9yZWYkcHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbixcbiAgICAgIGFjdGl2ZUtleSA9IF9yZWYuYWN0aXZlS2V5LFxuICAgICAgZGVmYXVsdEFjdGl2ZUtleSA9IF9yZWYuZGVmYXVsdEFjdGl2ZUtleSxcbiAgICAgIGVkaXRhYmxlID0gX3JlZi5lZGl0YWJsZSxcbiAgICAgIGFuaW1hdGVkID0gX3JlZi5hbmltYXRlZCxcbiAgICAgIF9yZWYkdGFiUG9zaXRpb24gPSBfcmVmLnRhYlBvc2l0aW9uLFxuICAgICAgdGFiUG9zaXRpb24gPSBfcmVmJHRhYlBvc2l0aW9uID09PSB2b2lkIDAgPyAndG9wJyA6IF9yZWYkdGFiUG9zaXRpb24sXG4gICAgICB0YWJCYXJHdXR0ZXIgPSBfcmVmLnRhYkJhckd1dHRlcixcbiAgICAgIHRhYkJhclN0eWxlID0gX3JlZi50YWJCYXJTdHlsZSxcbiAgICAgIHRhYkJhckV4dHJhQ29udGVudCA9IF9yZWYudGFiQmFyRXh0cmFDb250ZW50LFxuICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICBtb3JlSWNvbiA9IF9yZWYubW9yZUljb24sXG4gICAgICBtb3JlVHJhbnNpdGlvbk5hbWUgPSBfcmVmLm1vcmVUcmFuc2l0aW9uTmFtZSxcbiAgICAgIGRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmUgPSBfcmVmLmRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmUsXG4gICAgICByZW5kZXJUYWJCYXIgPSBfcmVmLnJlbmRlclRhYkJhcixcbiAgICAgIG9uQ2hhbmdlID0gX3JlZi5vbkNoYW5nZSxcbiAgICAgIG9uVGFiQ2xpY2sgPSBfcmVmLm9uVGFiQ2xpY2ssXG4gICAgICBvblRhYlNjcm9sbCA9IF9yZWYub25UYWJTY3JvbGwsXG4gICAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfcmVmLCBbXCJpZFwiLCBcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiZGlyZWN0aW9uXCIsIFwiYWN0aXZlS2V5XCIsIFwiZGVmYXVsdEFjdGl2ZUtleVwiLCBcImVkaXRhYmxlXCIsIFwiYW5pbWF0ZWRcIiwgXCJ0YWJQb3NpdGlvblwiLCBcInRhYkJhckd1dHRlclwiLCBcInRhYkJhclN0eWxlXCIsIFwidGFiQmFyRXh0cmFDb250ZW50XCIsIFwibG9jYWxlXCIsIFwibW9yZUljb25cIiwgXCJtb3JlVHJhbnNpdGlvbk5hbWVcIiwgXCJkZXN0cm95SW5hY3RpdmVUYWJQYW5lXCIsIFwicmVuZGVyVGFiQmFyXCIsIFwib25DaGFuZ2VcIiwgXCJvblRhYkNsaWNrXCIsIFwib25UYWJTY3JvbGxcIl0pO1xuICB2YXIgdGFicyA9IHBhcnNlVGFiTGlzdChjaGlsZHJlbik7XG4gIHZhciBydGwgPSBkaXJlY3Rpb24gPT09ICdydGwnO1xuICB2YXIgbWVyZ2VkQW5pbWF0ZWQ7XG5cbiAgaWYgKGFuaW1hdGVkID09PSBmYWxzZSkge1xuICAgIG1lcmdlZEFuaW1hdGVkID0ge1xuICAgICAgaW5rQmFyOiBmYWxzZSxcbiAgICAgIHRhYlBhbmU6IGZhbHNlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWRBbmltYXRlZCA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAgICBpbmtCYXI6IHRydWUsXG4gICAgICB0YWJQYW5lOiBmYWxzZVxuICAgIH0sIGFuaW1hdGVkICE9PSB0cnVlID8gYW5pbWF0ZWQgOiBudWxsKTtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gTW9iaWxlID09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIF91c2VTdGF0ZSA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIG1vYmlsZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRNb2JpbGUgPSBfdXNlU3RhdGUyWzFdO1xuXG4gICgwLCBSZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBPbmx5IHVwZGF0ZSBvbiB0aGUgY2xpZW50IHNpZGVcbiAgICBzZXRNb2JpbGUoKDAsIF91c2VUb3VjaE1vdmUuaXNNb2JpbGUpKCkpO1xuICB9LCBbXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT0gQWN0aXZlIEtleSA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9ICgwLCBfdXNlTWVyZ2VkU3RhdGU1LmRlZmF1bHQpKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RhYnMkO1xuXG4gICAgcmV0dXJuIChfdGFicyQgPSB0YWJzWzBdKSA9PT0gbnVsbCB8fCBfdGFicyQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YWJzJC5rZXk7XG4gIH0sIHtcbiAgICB2YWx1ZTogYWN0aXZlS2V5LFxuICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdEFjdGl2ZUtleVxuICB9KSxcbiAgICAgIF91c2VNZXJnZWRTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgICBtZXJnZWRBY3RpdmVLZXkgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgICAgc2V0TWVyZ2VkQWN0aXZlS2V5ID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlMyA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0YWJzLmZpbmRJbmRleChmdW5jdGlvbiAodGFiKSB7XG4gICAgICByZXR1cm4gdGFiLmtleSA9PT0gbWVyZ2VkQWN0aXZlS2V5O1xuICAgIH0pO1xuICB9KSxcbiAgICAgIF91c2VTdGF0ZTQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTMsIDIpLFxuICAgICAgYWN0aXZlSW5kZXggPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0QWN0aXZlSW5kZXggPSBfdXNlU3RhdGU0WzFdOyAvLyBSZXNldCBhY3RpdmUga2V5IGlmIG5vdCBleGlzdCBhbnltb3JlXG5cblxuICAoMCwgUmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5ld0FjdGl2ZUluZGV4ID0gdGFicy5maW5kSW5kZXgoZnVuY3Rpb24gKHRhYikge1xuICAgICAgcmV0dXJuIHRhYi5rZXkgPT09IG1lcmdlZEFjdGl2ZUtleTtcbiAgICB9KTtcblxuICAgIGlmIChuZXdBY3RpdmVJbmRleCA9PT0gLTEpIHtcbiAgICAgIHZhciBfdGFicyRuZXdBY3RpdmVJbmRleDtcblxuICAgICAgbmV3QWN0aXZlSW5kZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihhY3RpdmVJbmRleCwgdGFicy5sZW5ndGggLSAxKSk7XG4gICAgICBzZXRNZXJnZWRBY3RpdmVLZXkoKF90YWJzJG5ld0FjdGl2ZUluZGV4ID0gdGFic1tuZXdBY3RpdmVJbmRleF0pID09PSBudWxsIHx8IF90YWJzJG5ld0FjdGl2ZUluZGV4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGFicyRuZXdBY3RpdmVJbmRleC5rZXkpO1xuICAgIH1cblxuICAgIHNldEFjdGl2ZUluZGV4KG5ld0FjdGl2ZUluZGV4KTtcbiAgfSwgW3RhYnMubWFwKGZ1bmN0aW9uICh0YWIpIHtcbiAgICByZXR1cm4gdGFiLmtleTtcbiAgfSkuam9pbignXycpLCBtZXJnZWRBY3RpdmVLZXksIGFjdGl2ZUluZGV4XSk7IC8vID09PT09PT09PT09PT09PT09PT09PSBBY2Nlc3NpYmlsaXR5ID09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTMgPSAoMCwgX3VzZU1lcmdlZFN0YXRlNS5kZWZhdWx0KShudWxsLCB7XG4gICAgdmFsdWU6IGlkXG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlNCA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZU1lcmdlZFN0YXRlMywgMiksXG4gICAgICBtZXJnZWRJZCA9IF91c2VNZXJnZWRTdGF0ZTRbMF0sXG4gICAgICBzZXRNZXJnZWRJZCA9IF91c2VNZXJnZWRTdGF0ZTRbMV07XG5cbiAgdmFyIG1lcmdlZFRhYlBvc2l0aW9uID0gdGFiUG9zaXRpb247XG5cbiAgaWYgKG1vYmlsZSAmJiAhWydsZWZ0JywgJ3JpZ2h0J10uaW5jbHVkZXModGFiUG9zaXRpb24pKSB7XG4gICAgbWVyZ2VkVGFiUG9zaXRpb24gPSAndG9wJztcbiAgfSAvLyBBc3luYyBnZW5lcmF0ZSBpZCB0byBhdm9pZCBzc3IgbWFwcGluZyBmYWlsZWRcblxuXG4gICgwLCBSZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWlkKSB7XG4gICAgICBzZXRNZXJnZWRJZChcInJjLXRhYnMtXCIuY29uY2F0KHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcgPyAndGVzdCcgOiB1dWlkKSk7XG4gICAgICB1dWlkICs9IDE7XG4gICAgfVxuICB9LCBbXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gb25JbnRlcm5hbFRhYkNsaWNrKGtleSwgZSkge1xuICAgIG9uVGFiQ2xpY2sgPT09IG51bGwgfHwgb25UYWJDbGljayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25UYWJDbGljayhrZXksIGUpO1xuICAgIHNldE1lcmdlZEFjdGl2ZUtleShrZXkpO1xuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShrZXkpO1xuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgc2hhcmVkUHJvcHMgPSB7XG4gICAgaWQ6IG1lcmdlZElkLFxuICAgIGFjdGl2ZUtleTogbWVyZ2VkQWN0aXZlS2V5LFxuICAgIGFuaW1hdGVkOiBtZXJnZWRBbmltYXRlZCxcbiAgICB0YWJQb3NpdGlvbjogbWVyZ2VkVGFiUG9zaXRpb24sXG4gICAgcnRsOiBydGwsXG4gICAgbW9iaWxlOiBtb2JpbGVcbiAgfTtcbiAgdmFyIHRhYk5hdkJhcjtcbiAgdmFyIHRhYk5hdkJhclByb3BzID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc2hhcmVkUHJvcHMpLCB7fSwge1xuICAgIGVkaXRhYmxlOiBlZGl0YWJsZSxcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICBtb3JlSWNvbjogbW9yZUljb24sXG4gICAgbW9yZVRyYW5zaXRpb25OYW1lOiBtb3JlVHJhbnNpdGlvbk5hbWUsXG4gICAgdGFiQmFyR3V0dGVyOiB0YWJCYXJHdXR0ZXIsXG4gICAgb25UYWJDbGljazogb25JbnRlcm5hbFRhYkNsaWNrLFxuICAgIG9uVGFiU2Nyb2xsOiBvblRhYlNjcm9sbCxcbiAgICBleHRyYTogdGFiQmFyRXh0cmFDb250ZW50LFxuICAgIHN0eWxlOiB0YWJCYXJTdHlsZSxcbiAgICBwYW5lczogY2hpbGRyZW5cbiAgfSk7XG5cbiAgaWYgKHJlbmRlclRhYkJhcikge1xuICAgIHRhYk5hdkJhciA9IHJlbmRlclRhYkJhcih0YWJOYXZCYXJQcm9wcywgX1RhYk5hdkxpc3QuZGVmYXVsdCk7XG4gIH0gZWxzZSB7XG4gICAgdGFiTmF2QmFyID0gUmVhY3QuY3JlYXRlRWxlbWVudChfVGFiTmF2TGlzdC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCB0YWJOYXZCYXJQcm9wcykpO1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1RhYkNvbnRleHQuZGVmYXVsdC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiB7XG4gICAgICB0YWJzOiB0YWJzLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgICB9XG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiByZWYsXG4gICAgaWQ6IGlkLFxuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHByZWZpeENscywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KG1lcmdlZFRhYlBvc2l0aW9uKSwgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1vYmlsZVwiKSwgbW9iaWxlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWRpdGFibGVcIiksIGVkaXRhYmxlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBydGwpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSlcbiAgfSwgcmVzdFByb3BzKSwgdGFiTmF2QmFyLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9UYWJQYW5lbExpc3QuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7XG4gICAgZGVzdHJveUluYWN0aXZlVGFiUGFuZTogZGVzdHJveUluYWN0aXZlVGFiUGFuZVxuICB9LCBzaGFyZWRQcm9wcywge1xuICAgIGFuaW1hdGVkOiBtZXJnZWRBbmltYXRlZFxuICB9KSkpKTtcbn1cblxudmFyIEZvcndhcmRUYWJzID0gUmVhY3QuZm9yd2FyZFJlZihUYWJzKTtcbkZvcndhcmRUYWJzLlRhYlBhbmUgPSBfVGFiUGFuZS5kZWZhdWx0O1xudmFyIF9kZWZhdWx0ID0gRm9yd2FyZFRhYnM7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VPZmZzZXRzO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgREVGQVVMVF9TSVpFID0ge1xuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBsZWZ0OiAwLFxuICB0b3A6IDBcbn07XG5cbmZ1bmN0aW9uIHVzZU9mZnNldHModGFicywgdGFiU2l6ZXMsIGhvbGRlclNjcm9sbFdpZHRoKSB7XG4gIHJldHVybiAoMCwgX3JlYWN0LnVzZU1lbW8pKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RhYnMkO1xuXG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbGFzdE9mZnNldCA9IHRhYlNpemVzLmdldCgoX3RhYnMkID0gdGFic1swXSkgPT09IG51bGwgfHwgX3RhYnMkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGFicyQua2V5KSB8fCBERUZBVUxUX1NJWkU7XG4gICAgdmFyIHJpZ2h0T2Zmc2V0ID0gbGFzdE9mZnNldC5sZWZ0ICsgbGFzdE9mZnNldC53aWR0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGtleSA9IHRhYnNbaV0ua2V5O1xuICAgICAgdmFyIGRhdGEgPSB0YWJTaXplcy5nZXQoa2V5KTsgLy8gUmV1c2UgbGFzdCBvbmUgd2hlbiBub3QgZXhpc3QgeWV0XG5cbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICB2YXIgX3RhYnM7XG5cbiAgICAgICAgZGF0YSA9IHRhYlNpemVzLmdldCgoX3RhYnMgPSB0YWJzW2kgLSAxXSkgPT09IG51bGwgfHwgX3RhYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YWJzLmtleSkgfHwgREVGQVVMVF9TSVpFO1xuICAgICAgfVxuXG4gICAgICB2YXIgZW50aXR5ID0gbWFwLmdldChrZXkpIHx8ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgZGF0YSk7IC8vIFJpZ2h0XG5cbiAgICAgIGVudGl0eS5yaWdodCA9IHJpZ2h0T2Zmc2V0IC0gZW50aXR5LmxlZnQgLSBlbnRpdHkud2lkdGg7IC8vIFVwZGF0ZSBlbnRpdHlcblxuICAgICAgbWFwLnNldChrZXksIGVudGl0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfSwgW3RhYnMubWFwKGZ1bmN0aW9uICh0YWIpIHtcbiAgICByZXR1cm4gdGFiLmtleTtcbiAgfSkuam9pbignXycpLCB0YWJTaXplcywgaG9sZGVyU2Nyb2xsV2lkdGhdKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VSYWY7XG5leHBvcnRzLnVzZVJhZlN0YXRlID0gdXNlUmFmU3RhdGU7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJhZlwiKSk7XG5cbmZ1bmN0aW9uIHVzZVJhZihjYWxsYmFjaykge1xuICB2YXIgcmFmUmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKCk7XG4gIHZhciByZW1vdmVkUmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKGZhbHNlKTtcblxuICBmdW5jdGlvbiB0cmlnZ2VyKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpZiAoIXJlbW92ZWRSZWYuY3VycmVudCkge1xuICAgICAgX3JhZi5kZWZhdWx0LmNhbmNlbChyYWZSZWYuY3VycmVudCk7XG5cbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gKDAsIF9yYWYuZGVmYXVsdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjay5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3ZlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcblxuICAgICAgX3JhZi5kZWZhdWx0LmNhbmNlbChyYWZSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gdHJpZ2dlcjtcbn1cblxuZnVuY3Rpb24gdXNlUmFmU3RhdGUoZGVmYXVsdFN0YXRlKSB7XG4gIHZhciBiYXRjaFJlZiA9ICgwLCBfcmVhY3QudXNlUmVmKShbXSk7XG5cbiAgdmFyIF91c2VTdGF0ZSA9ICgwLCBfcmVhY3QudXNlU3RhdGUpKHt9KSxcbiAgICAgIF91c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZSwgMiksXG4gICAgICBmb3JjZVVwZGF0ZSA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIHN0YXRlID0gKDAsIF9yZWFjdC51c2VSZWYpKHR5cGVvZiBkZWZhdWx0U3RhdGUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0U3RhdGUoKSA6IGRlZmF1bHRTdGF0ZSk7XG4gIHZhciBmbHVzaFVwZGF0ZSA9IHVzZVJhZihmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBzdGF0ZS5jdXJyZW50O1xuICAgIGJhdGNoUmVmLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGN1cnJlbnQgPSBjYWxsYmFjayhjdXJyZW50KTtcbiAgICB9KTtcbiAgICBiYXRjaFJlZi5jdXJyZW50ID0gW107XG4gICAgc3RhdGUuY3VycmVudCA9IGN1cnJlbnQ7XG4gICAgZm9yY2VVcGRhdGUoe30pO1xuICB9KTtcblxuICBmdW5jdGlvbiB1cGRhdGVyKGNhbGxiYWNrKSB7XG4gICAgYmF0Y2hSZWYuY3VycmVudC5wdXNoKGNhbGxiYWNrKTtcbiAgICBmbHVzaFVwZGF0ZSgpO1xuICB9XG5cbiAgcmV0dXJuIFtzdGF0ZS5jdXJyZW50LCB1cGRhdGVyXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZVJlZnM7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIHVzZVJlZnMoKSB7XG4gIHZhciBjYWNoZVJlZnMgPSAoMCwgUmVhY3QudXNlUmVmKShuZXcgTWFwKCkpO1xuXG4gIGZ1bmN0aW9uIGdldFJlZihrZXkpIHtcbiAgICBpZiAoIWNhY2hlUmVmcy5jdXJyZW50LmhhcyhrZXkpKSB7XG4gICAgICBjYWNoZVJlZnMuY3VycmVudC5zZXQoa2V5LCBSZWFjdC5jcmVhdGVSZWYoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlUmVmcy5jdXJyZW50LmdldChrZXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlUmVmKGtleSkge1xuICAgIGNhY2hlUmVmcy5jdXJyZW50LmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgcmV0dXJuIFtnZXRSZWYsIHJlbW92ZVJlZl07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlU3luY1N0YXRlO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuZnVuY3Rpb24gdXNlU3luY1N0YXRlKGRlZmF1bHRTdGF0ZSwgb25DaGFuZ2UpIHtcbiAgdmFyIHN0YXRlUmVmID0gUmVhY3QudXNlUmVmKGRlZmF1bHRTdGF0ZSk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBmb3JjZVVwZGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUodXBkYXRlcikge1xuICAgIHZhciBuZXdWYWx1ZSA9IHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nID8gdXBkYXRlcihzdGF0ZVJlZi5jdXJyZW50KSA6IHVwZGF0ZXI7XG5cbiAgICBpZiAobmV3VmFsdWUgIT09IHN0YXRlUmVmLmN1cnJlbnQpIHtcbiAgICAgIG9uQ2hhbmdlKG5ld1ZhbHVlLCBzdGF0ZVJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBzdGF0ZVJlZi5jdXJyZW50ID0gbmV3VmFsdWU7XG4gICAgZm9yY2VVcGRhdGUoe30pO1xuICB9XG5cbiAgcmV0dXJuIFtzdGF0ZVJlZi5jdXJyZW50LCBzZXRTdGF0ZV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc01vYmlsZSA9IGlzTW9iaWxlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlVG91Y2hNb3ZlO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIE1JTl9TV0lQRV9ESVNUQU5DRSA9IDAuMTtcbnZhciBTVE9QX1NXSVBFX0RJU1RBTkNFID0gMC4wMTtcbnZhciBSRUZSRVNIX0lOVEVSVkFMID0gMjA7XG52YXIgU1BFRURfT0ZGX01VTFRJUExFID0gTWF0aC5wb3coMC45OTUsIFJFRlJFU0hfSU5URVJWQUwpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IENoZWNrIGlmIGlzIGEgbW9iaWxlID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gaXNNb2JpbGUoKSB7XG4gIHZhciBhZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnZlbmRvciB8fCB3aW5kb3cub3BlcmE7XG5cbiAgaWYgKC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm98YW5kcm9pZHxpcGFkfHBsYXlib29rfHNpbGsvaS50ZXN0KGFnZW50KSB8fCAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298cy0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8LW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxidy0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbS18Y2VsbHxjaHRtfGNsZGN8Y21kLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkYy1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZi01fGctbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZC0obXxwfHQpfGhlaS18aGkocHR8dGEpfGhwKCBpfGlwKXxocy1jfGh0KGMoLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGktKDIwfGdvfG1hKXxpMjMwfGlhYyggfC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Yy18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8LVthLXddKXxsaWJ3fGx5bnh8bTEtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG0tY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8LShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwbi0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHQtZ3xxYS1hfHFjKDA3fDEyfDIxfDMyfDYwfC1bMi03XXxpLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGgtfG9vfHAtKXxzZGtcXC98c2UoYygtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaC18c2hhcnxzaWUoLXxtKXxzay0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGgtfHYtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsLXx0ZGctfHRlbChpfG0pfHRpbS18dC1tb3x0byhwbHxzaCl8dHMoNzB8bS18bTN8bTUpfHR4LTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXMtfHlvdXJ8emV0b3x6dGUtL2kudGVzdChhZ2VudC5zdWJzdHIoMCwgNCkpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIb29rID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbmZ1bmN0aW9uIHVzZVRvdWNoTW92ZShyZWYsIG9uT2Zmc2V0KSB7XG4gIHZhciBfdXNlU3RhdGUgPSAoMCwgUmVhY3QudXNlU3RhdGUpKCksXG4gICAgICBfdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUsIDIpLFxuICAgICAgdG91Y2hQb3NpdGlvbiA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRUb3VjaFBvc2l0aW9uID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlMyA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoMCksXG4gICAgICBfdXNlU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUzLCAyKSxcbiAgICAgIGxhc3RUaW1lc3RhbXAgPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0TGFzdFRpbWVzdGFtcCA9IF91c2VTdGF0ZTRbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTUgPSAoMCwgUmVhY3QudXNlU3RhdGUpKDApLFxuICAgICAgX3VzZVN0YXRlNiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlNSwgMiksXG4gICAgICBsYXN0VGltZURpZmYgPSBfdXNlU3RhdGU2WzBdLFxuICAgICAgc2V0TGFzdFRpbWVEaWZmID0gX3VzZVN0YXRlNlsxXTtcblxuICB2YXIgX3VzZVN0YXRlNyA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoKSxcbiAgICAgIF91c2VTdGF0ZTggPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdGF0ZTcsIDIpLFxuICAgICAgbGFzdE9mZnNldCA9IF91c2VTdGF0ZThbMF0sXG4gICAgICBzZXRMYXN0T2Zmc2V0ID0gX3VzZVN0YXRlOFsxXTtcblxuICB2YXIgbW90aW9uUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA+Pj4gVG91Y2ggZXZlbnRzXG5cbiAgZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICB2YXIgX2UkdG91Y2hlcyQgPSBlLnRvdWNoZXNbMF0sXG4gICAgICAgIHNjcmVlblggPSBfZSR0b3VjaGVzJC5zY3JlZW5YLFxuICAgICAgICBzY3JlZW5ZID0gX2UkdG91Y2hlcyQuc2NyZWVuWTtcbiAgICBzZXRUb3VjaFBvc2l0aW9uKHtcbiAgICAgIHg6IHNjcmVlblgsXG4gICAgICB5OiBzY3JlZW5ZXG4gICAgfSk7XG4gICAgd2luZG93LmNsZWFySW50ZXJ2YWwobW90aW9uUmVmLmN1cnJlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Ub3VjaE1vdmUoZSkge1xuICAgIGlmICghdG91Y2hQb3NpdGlvbikgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgX2UkdG91Y2hlcyQyID0gZS50b3VjaGVzWzBdLFxuICAgICAgICBzY3JlZW5YID0gX2UkdG91Y2hlcyQyLnNjcmVlblgsXG4gICAgICAgIHNjcmVlblkgPSBfZSR0b3VjaGVzJDIuc2NyZWVuWTtcbiAgICBzZXRUb3VjaFBvc2l0aW9uKHtcbiAgICAgIHg6IHNjcmVlblgsXG4gICAgICB5OiBzY3JlZW5ZXG4gICAgfSk7XG4gICAgdmFyIG9mZnNldFggPSBzY3JlZW5YIC0gdG91Y2hQb3NpdGlvbi54O1xuICAgIHZhciBvZmZzZXRZID0gc2NyZWVuWSAtIHRvdWNoUG9zaXRpb24ueTtcbiAgICBvbk9mZnNldChvZmZzZXRYLCBvZmZzZXRZKTtcbiAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBzZXRMYXN0VGltZXN0YW1wKG5vdyk7XG4gICAgc2V0TGFzdFRpbWVEaWZmKG5vdyAtIGxhc3RUaW1lc3RhbXApO1xuICAgIHNldExhc3RPZmZzZXQoe1xuICAgICAgeDogb2Zmc2V0WCxcbiAgICAgIHk6IG9mZnNldFlcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hFbmQoKSB7XG4gICAgaWYgKCF0b3VjaFBvc2l0aW9uKSByZXR1cm47XG4gICAgc2V0VG91Y2hQb3NpdGlvbihudWxsKTtcbiAgICBzZXRMYXN0T2Zmc2V0KG51bGwpOyAvLyBTd2lwZSBpZiBuZWVkZWRcblxuICAgIGlmIChsYXN0T2Zmc2V0KSB7XG4gICAgICB2YXIgZGlzdGFuY2VYID0gbGFzdE9mZnNldC54IC8gbGFzdFRpbWVEaWZmO1xuICAgICAgdmFyIGRpc3RhbmNlWSA9IGxhc3RPZmZzZXQueSAvIGxhc3RUaW1lRGlmZjtcbiAgICAgIHZhciBhYnNYID0gTWF0aC5hYnMoZGlzdGFuY2VYKTtcbiAgICAgIHZhciBhYnNZID0gTWF0aC5hYnMoZGlzdGFuY2VZKTsgLy8gU2tpcCBzd2lwZSBpZiBsb3cgZGlzdGFuY2VcblxuICAgICAgaWYgKE1hdGgubWF4KGFic1gsIGFic1kpIDwgTUlOX1NXSVBFX0RJU1RBTkNFKSByZXR1cm47XG4gICAgICB2YXIgY3VycmVudFggPSBkaXN0YW5jZVg7XG4gICAgICB2YXIgY3VycmVudFkgPSBkaXN0YW5jZVk7XG4gICAgICBtb3Rpb25SZWYuY3VycmVudCA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhjdXJyZW50WCkgPCBTVE9QX1NXSVBFX0RJU1RBTkNFICYmIE1hdGguYWJzKGN1cnJlbnRZKSA8IFNUT1BfU1dJUEVfRElTVEFOQ0UpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChtb3Rpb25SZWYuY3VycmVudCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFggKj0gU1BFRURfT0ZGX01VTFRJUExFO1xuICAgICAgICBjdXJyZW50WSAqPSBTUEVFRF9PRkZfTVVMVElQTEU7XG4gICAgICAgIG9uT2Zmc2V0KGN1cnJlbnRYICogUkVGUkVTSF9JTlRFUlZBTCwgY3VycmVudFkgKiBSRUZSRVNIX0lOVEVSVkFMKTtcbiAgICAgIH0sIFJFRlJFU0hfSU5URVJWQUwpO1xuICAgIH1cbiAgfSAvLyA+Pj4gV2hlZWwgZXZlbnRcblxuXG4gIHZhciBsYXN0V2hlZWxUaW1lc3RhbXBSZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgwKTtcbiAgdmFyIGxhc3RXaGVlbFByZXZlbnRSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShmYWxzZSk7XG4gIHZhciBsYXN0V2hlZWxEaXJlY3Rpb25SZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgpO1xuXG4gIGZ1bmN0aW9uIG9uV2hlZWwoZSkge1xuICAgIHZhciBkZWx0YVggPSBlLmRlbHRhWCxcbiAgICAgICAgZGVsdGFZID0gZS5kZWx0YVk7IC8vIENvbnZlcnQgYm90aCB0byB4ICYgeSBzaW5jZSB3aGVlbCBvbmx5IGhhcHBlbmVkIG9uIFBDXG5cbiAgICB2YXIgbWl4ZWQgPSAwO1xuICAgIHZhciBhYnNYID0gTWF0aC5hYnMoZGVsdGFYKTtcbiAgICB2YXIgYWJzWSA9IE1hdGguYWJzKGRlbHRhWSk7XG5cbiAgICBpZiAoYWJzWCA9PT0gYWJzWSkge1xuICAgICAgbWl4ZWQgPSBsYXN0V2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9PT0gJ3gnID8gZGVsdGFYIDogZGVsdGFZO1xuICAgIH0gZWxzZSBpZiAoYWJzWCA+IGFic1kpIHtcbiAgICAgIG1peGVkID0gZGVsdGFYO1xuICAgICAgbGFzdFdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPSAneCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1peGVkID0gZGVsdGFZO1xuICAgICAgbGFzdFdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPSAneSc7XG4gICAgfSAvLyBPcHRpbWl6ZSBtYWMgdG91Y2ggc2Nyb2xsXG5cblxuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKG5vdyAtIGxhc3RXaGVlbFRpbWVzdGFtcFJlZi5jdXJyZW50ID4gMTAwKSB7XG4gICAgICBsYXN0V2hlZWxQcmV2ZW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAob25PZmZzZXQoLW1peGVkLCAtbWl4ZWQpIHx8IGxhc3RXaGVlbFByZXZlbnRSZWYuY3VycmVudCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbGFzdFdoZWVsUHJldmVudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsYXN0V2hlZWxUaW1lc3RhbXBSZWYuY3VycmVudCA9IG5vdztcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgdG91Y2hFdmVudHNSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShudWxsKTtcbiAgdG91Y2hFdmVudHNSZWYuY3VycmVudCA9IHtcbiAgICBvblRvdWNoU3RhcnQ6IG9uVG91Y2hTdGFydCxcbiAgICBvblRvdWNoTW92ZTogb25Ub3VjaE1vdmUsXG4gICAgb25Ub3VjaEVuZDogb25Ub3VjaEVuZCxcbiAgICBvbldoZWVsOiBvbldoZWVsXG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gb25Qcm94eVRvdWNoU3RhcnQoZSkge1xuICAgICAgdG91Y2hFdmVudHNSZWYuY3VycmVudC5vblRvdWNoU3RhcnQoZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Qcm94eVRvdWNoTW92ZShlKSB7XG4gICAgICB0b3VjaEV2ZW50c1JlZi5jdXJyZW50Lm9uVG91Y2hNb3ZlKGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uUHJveHlUb3VjaEVuZChlKSB7XG4gICAgICB0b3VjaEV2ZW50c1JlZi5jdXJyZW50Lm9uVG91Y2hFbmQoZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Qcm94eVdoZWVsKGUpIHtcbiAgICAgIHRvdWNoRXZlbnRzUmVmLmN1cnJlbnQub25XaGVlbChlKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblByb3h5VG91Y2hNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Qcm94eVRvdWNoRW5kLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pOyAvLyBObyBuZWVkIHRvIGNsZWFuIHVwIHNpbmNlIGVsZW1lbnQgcmVtb3ZlZFxuXG4gICAgcmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uUHJveHlUb3VjaFN0YXJ0LCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25Qcm94eVdoZWVsKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Qcm94eVRvdWNoTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uUHJveHlUb3VjaEVuZCk7XG4gICAgfTtcbiAgfSwgW10pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlVmlzaWJsZVJhbmdlO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgREVGQVVMVF9TSVpFID0ge1xuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBsZWZ0OiAwLFxuICB0b3A6IDAsXG4gIHJpZ2h0OiAwXG59O1xuXG5mdW5jdGlvbiB1c2VWaXNpYmxlUmFuZ2UodGFiT2Zmc2V0cywgY29udGFpbmVyU2l6ZSwgdGFiQ29udGVudE5vZGVTaXplLCBhZGROb2RlU2l6ZSwgX3JlZikge1xuICB2YXIgdGFicyA9IF9yZWYudGFicyxcbiAgICAgIHRhYlBvc2l0aW9uID0gX3JlZi50YWJQb3NpdGlvbixcbiAgICAgIHJ0bCA9IF9yZWYucnRsO1xuICB2YXIgdW5pdDtcbiAgdmFyIHBvc2l0aW9uO1xuICB2YXIgdHJhbnNmb3JtU2l6ZTtcblxuICBpZiAoWyd0b3AnLCAnYm90dG9tJ10uaW5jbHVkZXModGFiUG9zaXRpb24pKSB7XG4gICAgdW5pdCA9ICd3aWR0aCc7XG4gICAgcG9zaXRpb24gPSBydGwgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgIHRyYW5zZm9ybVNpemUgPSBNYXRoLmFicyhjb250YWluZXJTaXplLmxlZnQpO1xuICB9IGVsc2Uge1xuICAgIHVuaXQgPSAnaGVpZ2h0JztcbiAgICBwb3NpdGlvbiA9ICd0b3AnO1xuICAgIHRyYW5zZm9ybVNpemUgPSAtY29udGFpbmVyU2l6ZS50b3A7XG4gIH1cblxuICB2YXIgYmFzaWNTaXplID0gY29udGFpbmVyU2l6ZVt1bml0XTtcbiAgdmFyIHRhYkNvbnRlbnRTaXplID0gdGFiQ29udGVudE5vZGVTaXplW3VuaXRdO1xuICB2YXIgYWRkU2l6ZSA9IGFkZE5vZGVTaXplW3VuaXRdO1xuICB2YXIgbWVyZ2VkQmFzaWNTaXplID0gYmFzaWNTaXplO1xuXG4gIGlmICh0YWJDb250ZW50U2l6ZSArIGFkZFNpemUgPiBiYXNpY1NpemUpIHtcbiAgICBtZXJnZWRCYXNpY1NpemUgPSBiYXNpY1NpemUgLSBhZGRTaXplO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfcmVhY3QudXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGFicy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbMCwgMF07XG4gICAgfVxuXG4gICAgdmFyIGxlbiA9IHRhYnMubGVuZ3RoO1xuICAgIHZhciBlbmRJbmRleCA9IGxlbjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHZhciBvZmZzZXQgPSB0YWJPZmZzZXRzLmdldCh0YWJzW2ldLmtleSkgfHwgREVGQVVMVF9TSVpFO1xuXG4gICAgICBpZiAob2Zmc2V0W3Bvc2l0aW9uXSArIG9mZnNldFt1bml0XSA+IHRyYW5zZm9ybVNpemUgKyBtZXJnZWRCYXNpY1NpemUpIHtcbiAgICAgICAgZW5kSW5kZXggPSBpIC0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0SW5kZXggPSAwO1xuXG4gICAgZm9yICh2YXIgX2kgPSBsZW4gLSAxOyBfaSA+PSAwOyBfaSAtPSAxKSB7XG4gICAgICB2YXIgX29mZnNldCA9IHRhYk9mZnNldHMuZ2V0KHRhYnNbX2ldLmtleSkgfHwgREVGQVVMVF9TSVpFO1xuXG4gICAgICBpZiAoX29mZnNldFtwb3NpdGlvbl0gPCB0cmFuc2Zvcm1TaXplKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggPSBfaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbc3RhcnRJbmRleCwgZW5kSW5kZXhdO1xuICB9LCBbdGFiT2Zmc2V0cywgdHJhbnNmb3JtU2l6ZSwgbWVyZ2VkQmFzaWNTaXplLCB0YWJQb3NpdGlvbiwgdGFicy5tYXAoZnVuY3Rpb24gKHRhYikge1xuICAgIHJldHVybiB0YWIua2V5O1xuICB9KS5qb2luKCdfJyksIHJ0bF0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRhYlBhbmVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX1RhYlBhbmUuZGVmYXVsdDtcbiAgfVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfVGFicyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGFic1wiKSk7XG5cbnZhciBfVGFiUGFuZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGFiUGFuZWxMaXN0L1RhYlBhbmVcIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfVGFicy5kZWZhdWx0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCIpKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY1Jlc2l6ZU9ic2VydmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtcmVzaXplLW9ic2VydmVyXCIpKTtcblxudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwib21pdC5qc1wiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NhbGN1bGF0ZU5vZGVIZWlnaHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NhbGN1bGF0ZU5vZGVIZWlnaHRcIikpO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KShEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gKDAsIF9nZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIuZGVmYXVsdCkodGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbnZhciBSRVNJWkVfU1RBVFVTO1xuXG4oZnVuY3Rpb24gKFJFU0laRV9TVEFUVVMpIHtcbiAgUkVTSVpFX1NUQVRVU1tSRVNJWkVfU1RBVFVTW1wiTk9ORVwiXSA9IDBdID0gXCJOT05FXCI7XG4gIFJFU0laRV9TVEFUVVNbUkVTSVpFX1NUQVRVU1tcIlJFU0laSU5HXCJdID0gMV0gPSBcIlJFU0laSU5HXCI7XG4gIFJFU0laRV9TVEFUVVNbUkVTSVpFX1NUQVRVU1tcIlJFU0laRURcIl0gPSAyXSA9IFwiUkVTSVpFRFwiO1xufSkoUkVTSVpFX1NUQVRVUyB8fCAoUkVTSVpFX1NUQVRVUyA9IHt9KSk7XG5cbnZhciBSZXNpemFibGVUZXh0QXJlYSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShSZXNpemFibGVUZXh0QXJlYSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihSZXNpemFibGVUZXh0QXJlYSk7XG5cbiAgZnVuY3Rpb24gUmVzaXphYmxlVGV4dEFyZWEocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBSZXNpemFibGVUZXh0QXJlYSk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfdGhpcy5zYXZlVGV4dEFyZWEgPSBmdW5jdGlvbiAodGV4dEFyZWEpIHtcbiAgICAgIF90aGlzLnRleHRBcmVhID0gdGV4dEFyZWE7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVJlc2l6ZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICB2YXIgcmVzaXplU3RhdHVzID0gX3RoaXMuc3RhdGUucmVzaXplU3RhdHVzO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgYXV0b1NpemUgPSBfdGhpcyRwcm9wcy5hdXRvU2l6ZSxcbiAgICAgICAgICBvblJlc2l6ZSA9IF90aGlzJHByb3BzLm9uUmVzaXplO1xuXG4gICAgICBpZiAocmVzaXplU3RhdHVzICE9PSBSRVNJWkVfU1RBVFVTLk5PTkUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9uUmVzaXplID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uUmVzaXplKHNpemUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXV0b1NpemUpIHtcbiAgICAgICAgX3RoaXMucmVzaXplT25OZXh0RnJhbWUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMucmVzaXplT25OZXh0RnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShfdGhpcy5uZXh0RnJhbWVBY3Rpb25JZCk7XG4gICAgICBfdGhpcy5uZXh0RnJhbWVBY3Rpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShfdGhpcy5yZXNpemVUZXh0YXJlYSk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlc2l6ZVRleHRhcmVhID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGF1dG9TaXplID0gX3RoaXMucHJvcHMuYXV0b1NpemU7XG5cbiAgICAgIGlmICghYXV0b1NpemUgfHwgIV90aGlzLnRleHRBcmVhKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG1pblJvd3MgPSBhdXRvU2l6ZS5taW5Sb3dzLFxuICAgICAgICAgIG1heFJvd3MgPSBhdXRvU2l6ZS5tYXhSb3dzO1xuICAgICAgdmFyIHRleHRhcmVhU3R5bGVzID0gKDAsIF9jYWxjdWxhdGVOb2RlSGVpZ2h0LmRlZmF1bHQpKF90aGlzLnRleHRBcmVhLCBmYWxzZSwgbWluUm93cywgbWF4Um93cyk7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdGV4dGFyZWFTdHlsZXM6IHRleHRhcmVhU3R5bGVzLFxuICAgICAgICByZXNpemVTdGF0dXM6IFJFU0laRV9TVEFUVVMuUkVTSVpJTkdcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX3RoaXMucmVzaXplRnJhbWVJZCk7XG4gICAgICAgIF90aGlzLnJlc2l6ZUZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6ZVN0YXR1czogUkVTSVpFX1NUQVRVUy5SRVNJWkVEXG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMucmVzaXplRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICByZXNpemVTdGF0dXM6IFJFU0laRV9TVEFUVVMuTk9ORVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBfdGhpcy5maXhGaXJlZm94QXV0b1Njcm9sbCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlclRleHRBcmVhID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIF90aGlzJHByb3BzMiRwcmVmaXhDbCA9IF90aGlzJHByb3BzMi5wcmVmaXhDbHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyJHByZWZpeENsID09PSB2b2lkIDAgPyAncmMtdGV4dGFyZWEnIDogX3RoaXMkcHJvcHMyJHByZWZpeENsLFxuICAgICAgICAgIGF1dG9TaXplID0gX3RoaXMkcHJvcHMyLmF1dG9TaXplLFxuICAgICAgICAgIG9uUmVzaXplID0gX3RoaXMkcHJvcHMyLm9uUmVzaXplLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczIuZGlzYWJsZWQ7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICB0ZXh0YXJlYVN0eWxlcyA9IF90aGlzJHN0YXRlLnRleHRhcmVhU3R5bGVzLFxuICAgICAgICAgIHJlc2l6ZVN0YXR1cyA9IF90aGlzJHN0YXRlLnJlc2l6ZVN0YXR1cztcbiAgICAgIHZhciBvdGhlclByb3BzID0gKDAsIF9vbWl0LmRlZmF1bHQpKF90aGlzLnByb3BzLCBbJ3ByZWZpeENscycsICdvblByZXNzRW50ZXInLCAnYXV0b1NpemUnLCAnZGVmYXVsdFZhbHVlJywgJ29uUmVzaXplJ10pO1xuICAgICAgdmFyIGNscyA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIGNsYXNzTmFtZSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSk7IC8vIEZpeCBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy82Nzc2XG4gICAgICAvLyBNYWtlIHN1cmUgaXQgY291bGQgYmUgcmVzZXQgd2hlbiB1c2luZyBmb3JtLmdldEZpZWxkRGVjb3JhdG9yXG5cbiAgICAgIGlmICgndmFsdWUnIGluIG90aGVyUHJvcHMpIHtcbiAgICAgICAgb3RoZXJQcm9wcy52YWx1ZSA9IG90aGVyUHJvcHMudmFsdWUgfHwgJyc7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpcy5wcm9wcy5zdHlsZSksIHRleHRhcmVhU3R5bGVzKSwgcmVzaXplU3RhdHVzID09PSBSRVNJWkVfU1RBVFVTLlJFU0laSU5HID8gLy8gUmVhY3Qgd2lsbCB3YXJuaW5nIHdoZW4gbWl4IGBvdmVyZmxvd2AgJiBgb3ZlcmZsb3dZYC5cbiAgICAgIC8vIFdlIG5lZWQgdG8gZGVmaW5lIHRoaXMgc2VwYXJhdGVseS5cbiAgICAgIHtcbiAgICAgICAgb3ZlcmZsb3dYOiAnaGlkZGVuJyxcbiAgICAgICAgb3ZlcmZsb3dZOiAnaGlkZGVuJ1xuICAgICAgfSA6IG51bGwpO1xuXG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfcmNSZXNpemVPYnNlcnZlci5kZWZhdWx0LCB7XG4gICAgICAgIG9uUmVzaXplOiBfdGhpcy5oYW5kbGVSZXNpemUsXG4gICAgICAgIGRpc2FibGVkOiAhKGF1dG9TaXplIHx8IG9uUmVzaXplKVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIsIE9iamVjdC5hc3NpZ24oe30sIG90aGVyUHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbHMsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgcmVmOiBfdGhpcy5zYXZlVGV4dEFyZWFcbiAgICAgIH0pKSk7XG4gICAgfTtcblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgdGV4dGFyZWFTdHlsZXM6IHt9LFxuICAgICAgcmVzaXplU3RhdHVzOiBSRVNJWkVfU1RBVFVTLk5PTkVcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFJlc2l6YWJsZVRleHRBcmVhLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMucmVzaXplVGV4dGFyZWEoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIC8vIFJlLXJlbmRlciB3aXRoIHRoZSBuZXcgY29udGVudCB0aGVuIHJlY2FsY3VsYXRlIHRoZSBoZWlnaHQgYXMgcmVxdWlyZWQuXG4gICAgICBpZiAocHJldlByb3BzLnZhbHVlICE9PSB0aGlzLnByb3BzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMucmVzaXplVGV4dGFyZWEoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLm5leHRGcmFtZUFjdGlvbklkKTtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmVzaXplRnJhbWVJZCk7XG4gICAgfSAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMTg3MFxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZml4RmlyZWZveEF1dG9TY3JvbGxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZml4RmlyZWZveEF1dG9TY3JvbGwoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50ZXh0QXJlYSkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhcnQgPSB0aGlzLnRleHRBcmVhLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgIHZhciBjdXJyZW50RW5kID0gdGhpcy50ZXh0QXJlYS5zZWxlY3Rpb25FbmQ7XG4gICAgICAgICAgdGhpcy50ZXh0QXJlYS5zZXRTZWxlY3Rpb25SYW5nZShjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7Ly8gRml4IGVycm9yIGluIENocm9tZTpcbiAgICAgICAgLy8gRmFpbGVkIHRvIHJlYWQgdGhlICdzZWxlY3Rpb25TdGFydCcgcHJvcGVydHkgZnJvbSAnSFRNTElucHV0RWxlbWVudCdcbiAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMjExNzc0ODkvMzA0MDYwNVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVGV4dEFyZWEoKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFJlc2l6YWJsZVRleHRBcmVhO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG52YXIgX2RlZmF1bHQgPSBSZXNpemFibGVUZXh0QXJlYTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jYWxjdWxhdGVOb2RlU3R5bGluZyA9IGNhbGN1bGF0ZU5vZGVTdHlsaW5nO1xuZXhwb3J0cy5kZWZhdWx0ID0gY2FsY3VsYXRlTm9kZUhlaWdodDtcbi8vIFRoYW5rcyB0byBodHRwczovL2dpdGh1Yi5jb20vYW5kcmV5cG9wcC9yZWFjdC10ZXh0YXJlYS1hdXRvc2l6ZS9cblxuLyoqXG4gKiBjYWxjdWxhdGVOb2RlSGVpZ2h0KHVpVGV4dE5vZGUsIHVzZUNhY2hlID0gZmFsc2UpXG4gKi9cbnZhciBISURERU5fVEVYVEFSRUFfU1RZTEUgPSBcIlxcbiAgbWluLWhlaWdodDowICFpbXBvcnRhbnQ7XFxuICBtYXgtaGVpZ2h0Om5vbmUgIWltcG9ydGFudDtcXG4gIGhlaWdodDowICFpbXBvcnRhbnQ7XFxuICB2aXNpYmlsaXR5OmhpZGRlbiAhaW1wb3J0YW50O1xcbiAgb3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnQ7XFxuICBwb3NpdGlvbjphYnNvbHV0ZSAhaW1wb3J0YW50O1xcbiAgei1pbmRleDotMTAwMCAhaW1wb3J0YW50O1xcbiAgdG9wOjAgIWltcG9ydGFudDtcXG4gIHJpZ2h0OjAgIWltcG9ydGFudFxcblwiO1xudmFyIFNJWklOR19TVFlMRSA9IFsnbGV0dGVyLXNwYWNpbmcnLCAnbGluZS1oZWlnaHQnLCAncGFkZGluZy10b3AnLCAncGFkZGluZy1ib3R0b20nLCAnZm9udC1mYW1pbHknLCAnZm9udC13ZWlnaHQnLCAnZm9udC1zaXplJywgJ2ZvbnQtdmFyaWFudCcsICd0ZXh0LXJlbmRlcmluZycsICd0ZXh0LXRyYW5zZm9ybScsICd3aWR0aCcsICd0ZXh0LWluZGVudCcsICdwYWRkaW5nLWxlZnQnLCAncGFkZGluZy1yaWdodCcsICdib3JkZXItd2lkdGgnLCAnYm94LXNpemluZyddO1xudmFyIGNvbXB1dGVkU3R5bGVDYWNoZSA9IHt9O1xudmFyIGhpZGRlblRleHRhcmVhO1xuXG5mdW5jdGlvbiBjYWxjdWxhdGVOb2RlU3R5bGluZyhub2RlKSB7XG4gIHZhciB1c2VDYWNoZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHZhciBub2RlUmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhY3RpZCcpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgaWYgKHVzZUNhY2hlICYmIGNvbXB1dGVkU3R5bGVDYWNoZVtub2RlUmVmXSkge1xuICAgIHJldHVybiBjb21wdXRlZFN0eWxlQ2FjaGVbbm9kZVJlZl07XG4gIH1cblxuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgdmFyIGJveFNpemluZyA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JveC1zaXppbmcnKSB8fCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctbW96LWJveC1zaXppbmcnKSB8fCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctd2Via2l0LWJveC1zaXppbmcnKTtcbiAgdmFyIHBhZGRpbmdTaXplID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpKSArIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG4gIHZhciBib3JkZXJTaXplID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItYm90dG9tLXdpZHRoJykpICsgcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItdG9wLXdpZHRoJykpO1xuICB2YXIgc2l6aW5nU3R5bGUgPSBTSVpJTkdfU1RZTEUubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KG5hbWUsIFwiOlwiKS5jb25jYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gIH0pLmpvaW4oJzsnKTtcbiAgdmFyIG5vZGVJbmZvID0ge1xuICAgIHNpemluZ1N0eWxlOiBzaXppbmdTdHlsZSxcbiAgICBwYWRkaW5nU2l6ZTogcGFkZGluZ1NpemUsXG4gICAgYm9yZGVyU2l6ZTogYm9yZGVyU2l6ZSxcbiAgICBib3hTaXppbmc6IGJveFNpemluZ1xuICB9O1xuXG4gIGlmICh1c2VDYWNoZSAmJiBub2RlUmVmKSB7XG4gICAgY29tcHV0ZWRTdHlsZUNhY2hlW25vZGVSZWZdID0gbm9kZUluZm87XG4gIH1cblxuICByZXR1cm4gbm9kZUluZm87XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZU5vZGVIZWlnaHQodWlUZXh0Tm9kZSkge1xuICB2YXIgdXNlQ2FjaGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICB2YXIgbWluUm93cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgdmFyIG1heFJvd3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAgaWYgKCFoaWRkZW5UZXh0YXJlYSkge1xuICAgIGhpZGRlblRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3RhYi1pbmRleCcsICctMScpO1xuICAgIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlkZGVuVGV4dGFyZWEpO1xuICB9IC8vIEZpeCB3cmFwPVwib2ZmXCIgaXNzdWVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNjU3N1xuXG5cbiAgaWYgKHVpVGV4dE5vZGUuZ2V0QXR0cmlidXRlKCd3cmFwJykpIHtcbiAgICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3dyYXAnLCB1aVRleHROb2RlLmdldEF0dHJpYnV0ZSgnd3JhcCcpKTtcbiAgfSBlbHNlIHtcbiAgICBoaWRkZW5UZXh0YXJlYS5yZW1vdmVBdHRyaWJ1dGUoJ3dyYXAnKTtcbiAgfSAvLyBDb3B5IGFsbCBDU1MgcHJvcGVydGllcyB0aGF0IGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQgaW5cbiAgLy8gdGhlIHRleHRib3hcblxuXG4gIHZhciBfY2FsY3VsYXRlTm9kZVN0eWxpbmcgPSBjYWxjdWxhdGVOb2RlU3R5bGluZyh1aVRleHROb2RlLCB1c2VDYWNoZSksXG4gICAgICBwYWRkaW5nU2l6ZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5wYWRkaW5nU2l6ZSxcbiAgICAgIGJvcmRlclNpemUgPSBfY2FsY3VsYXRlTm9kZVN0eWxpbmcuYm9yZGVyU2l6ZSxcbiAgICAgIGJveFNpemluZyA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5ib3hTaXppbmcsXG4gICAgICBzaXppbmdTdHlsZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5zaXppbmdTdHlsZTsgLy8gTmVlZCB0byBoYXZlIHRoZSBvdmVyZmxvdyBhdHRyaWJ1dGUgdG8gaGlkZSB0aGUgc2Nyb2xsYmFyIG90aGVyd2lzZVxuICAvLyB0ZXh0LWxpbmVzIHdpbGwgbm90IGNhbGN1bGF0ZWQgcHJvcGVybHkgYXMgdGhlIHNoYWRvdyB3aWxsIHRlY2huaWNhbGx5IGJlXG4gIC8vIG5hcnJvd2VyIGZvciBjb250ZW50XG5cblxuICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgXCJcIi5jb25jYXQoc2l6aW5nU3R5bGUsIFwiO1wiKS5jb25jYXQoSElEREVOX1RFWFRBUkVBX1NUWUxFKSk7XG4gIGhpZGRlblRleHRhcmVhLnZhbHVlID0gdWlUZXh0Tm9kZS52YWx1ZSB8fCB1aVRleHROb2RlLnBsYWNlaG9sZGVyIHx8ICcnO1xuICB2YXIgbWluSGVpZ2h0ID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gIHZhciBtYXhIZWlnaHQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIGhlaWdodCA9IGhpZGRlblRleHRhcmVhLnNjcm9sbEhlaWdodDtcbiAgdmFyIG92ZXJmbG93WTtcblxuICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAvLyBib3JkZXItYm94OiBhZGQgYm9yZGVyLCBzaW5jZSBoZWlnaHQgPSBjb250ZW50ICsgcGFkZGluZyArIGJvcmRlclxuICAgIGhlaWdodCArPSBib3JkZXJTaXplO1xuICB9IGVsc2UgaWYgKGJveFNpemluZyA9PT0gJ2NvbnRlbnQtYm94Jykge1xuICAgIC8vIHJlbW92ZSBwYWRkaW5nLCBzaW5jZSBoZWlnaHQgPSBjb250ZW50XG4gICAgaGVpZ2h0IC09IHBhZGRpbmdTaXplO1xuICB9XG5cbiAgaWYgKG1pblJvd3MgIT09IG51bGwgfHwgbWF4Um93cyAhPT0gbnVsbCkge1xuICAgIC8vIG1lYXN1cmUgaGVpZ2h0IG9mIGEgdGV4dGFyZWEgd2l0aCBhIHNpbmdsZSByb3dcbiAgICBoaWRkZW5UZXh0YXJlYS52YWx1ZSA9ICcgJztcbiAgICB2YXIgc2luZ2xlUm93SGVpZ2h0ID0gaGlkZGVuVGV4dGFyZWEuc2Nyb2xsSGVpZ2h0IC0gcGFkZGluZ1NpemU7XG5cbiAgICBpZiAobWluUm93cyAhPT0gbnVsbCkge1xuICAgICAgbWluSGVpZ2h0ID0gc2luZ2xlUm93SGVpZ2h0ICogbWluUm93cztcblxuICAgICAgaWYgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCArIHBhZGRpbmdTaXplICsgYm9yZGVyU2l6ZTtcbiAgICAgIH1cblxuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBoZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChtYXhSb3dzICE9PSBudWxsKSB7XG4gICAgICBtYXhIZWlnaHQgPSBzaW5nbGVSb3dIZWlnaHQgKiBtYXhSb3dzO1xuXG4gICAgICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SGVpZ2h0ICsgcGFkZGluZ1NpemUgKyBib3JkZXJTaXplO1xuICAgICAgfVxuXG4gICAgICBvdmVyZmxvd1kgPSBoZWlnaHQgPiBtYXhIZWlnaHQgPyAnJyA6ICdoaWRkZW4nO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5taW4obWF4SGVpZ2h0LCBoZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgbWluSGVpZ2h0OiBtaW5IZWlnaHQsXG4gICAgbWF4SGVpZ2h0OiBtYXhIZWlnaHQsXG4gICAgb3ZlcmZsb3dZOiBvdmVyZmxvd1lcbiAgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNpemFibGVUZXh0QXJlYVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfUmVzaXphYmxlVGV4dEFyZWEuZGVmYXVsdDtcbiAgfVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIikpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX1Jlc2l6YWJsZVRleHRBcmVhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9SZXNpemFibGVUZXh0QXJlYVwiKSk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9ICgwLCBfZ2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSAoMCwgX2dldFByb3RvdHlwZU9mMi5kZWZhdWx0KSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMi5kZWZhdWx0KSh0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIFRleHRBcmVhID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKFRleHRBcmVhLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFRleHRBcmVhKTtcblxuICBmdW5jdGlvbiBUZXh0QXJlYShwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIFRleHRBcmVhKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMucmVzaXphYmxlVGV4dEFyZWEudGV4dEFyZWEuZm9jdXMoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2F2ZVRleHRBcmVhID0gZnVuY3Rpb24gKHJlc2l6YWJsZVRleHRBcmVhKSB7XG4gICAgICBfdGhpcy5yZXNpemFibGVUZXh0QXJlYSA9IHJlc2l6YWJsZVRleHRBcmVhO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uQ2hhbmdlID0gX3RoaXMucHJvcHMub25DaGFuZ2U7XG5cbiAgICAgIF90aGlzLnNldFZhbHVlKGUudGFyZ2V0LnZhbHVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnJlc2l6YWJsZVRleHRBcmVhLnJlc2l6ZVRleHRhcmVhKCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uUHJlc3NFbnRlciA9IF90aGlzJHByb3BzLm9uUHJlc3NFbnRlcixcbiAgICAgICAgICBvbktleURvd24gPSBfdGhpcyRwcm9wcy5vbktleURvd247XG5cbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzICYmIG9uUHJlc3NFbnRlcikge1xuICAgICAgICBvblByZXNzRW50ZXIoZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbktleURvd24pIHtcbiAgICAgICAgb25LZXlEb3duKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgdmFsdWUgPSB0eXBlb2YgcHJvcHMudmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BzLnZhbHVlID09PSBudWxsID8gcHJvcHMuZGVmYXVsdFZhbHVlIDogcHJvcHMudmFsdWU7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFRleHRBcmVhLCBbe1xuICAgIGtleTogXCJzZXRWYWx1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWYWx1ZSh2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmICghKCd2YWx1ZScgaW4gdGhpcy5wcm9wcykpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmx1clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdGhpcy5yZXNpemFibGVUZXh0QXJlYS50ZXh0QXJlYS5ibHVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfUmVzaXphYmxlVGV4dEFyZWEuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICB2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgICAgb25LZXlEb3duOiB0aGlzLmhhbmRsZUtleURvd24sXG4gICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgcmVmOiB0aGlzLnNhdmVUZXh0QXJlYVxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICBpZiAoJ3ZhbHVlJyBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogbmV4dFByb3BzLnZhbHVlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVGV4dEFyZWE7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBfZGVmYXVsdCA9IFRleHRBcmVhO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBDb250ZW50ID0gZnVuY3Rpb24gQ29udGVudChwcm9wcykge1xuICB2YXIgb3ZlcmxheSA9IHByb3BzLm92ZXJsYXksXG4gICAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBpZCA9IHByb3BzLmlkLFxuICAgICAgb3ZlcmxheUlubmVyU3R5bGUgPSBwcm9wcy5vdmVybGF5SW5uZXJTdHlsZTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lclwiKSxcbiAgICBpZDogaWQsXG4gICAgcm9sZTogXCJ0b29sdGlwXCIsXG4gICAgc3R5bGU6IG92ZXJsYXlJbm5lclN0eWxlXG4gIH0sIHR5cGVvZiBvdmVybGF5ID09PSAnZnVuY3Rpb24nID8gb3ZlcmxheSgpIDogb3ZlcmxheSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBDb250ZW50O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmNUcmlnZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdHJpZ2dlclwiKSk7XG5cbnZhciBfcGxhY2VtZW50cyA9IHJlcXVpcmUoXCIuL3BsYWNlbWVudHNcIik7XG5cbnZhciBfQ29udGVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29udGVudFwiKSk7XG5cbnZhciBUb29sdGlwID0gZnVuY3Rpb24gVG9vbHRpcChwcm9wcywgcmVmKSB7XG4gIHZhciBvdmVybGF5Q2xhc3NOYW1lID0gcHJvcHMub3ZlcmxheUNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyR0cmlnZ2VyID0gcHJvcHMudHJpZ2dlcixcbiAgICAgIHRyaWdnZXIgPSBfcHJvcHMkdHJpZ2dlciA9PT0gdm9pZCAwID8gWydob3ZlciddIDogX3Byb3BzJHRyaWdnZXIsXG4gICAgICBfcHJvcHMkbW91c2VFbnRlckRlbGEgPSBwcm9wcy5tb3VzZUVudGVyRGVsYXksXG4gICAgICBtb3VzZUVudGVyRGVsYXkgPSBfcHJvcHMkbW91c2VFbnRlckRlbGEgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkbW91c2VFbnRlckRlbGEsXG4gICAgICBfcHJvcHMkbW91c2VMZWF2ZURlbGEgPSBwcm9wcy5tb3VzZUxlYXZlRGVsYXksXG4gICAgICBtb3VzZUxlYXZlRGVsYXkgPSBfcHJvcHMkbW91c2VMZWF2ZURlbGEgPT09IHZvaWQgMCA/IDAuMSA6IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSxcbiAgICAgIG92ZXJsYXlTdHlsZSA9IHByb3BzLm92ZXJsYXlTdHlsZSxcbiAgICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtdG9vbHRpcCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIG9uVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZSxcbiAgICAgIGFmdGVyVmlzaWJsZUNoYW5nZSA9IHByb3BzLmFmdGVyVmlzaWJsZUNoYW5nZSxcbiAgICAgIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWUsXG4gICAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgICBfcHJvcHMkcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ3JpZ2h0JyA6IF9wcm9wcyRwbGFjZW1lbnQsXG4gICAgICBfcHJvcHMkYWxpZ24gPSBwcm9wcy5hbGlnbixcbiAgICAgIGFsaWduID0gX3Byb3BzJGFsaWduID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRhbGlnbixcbiAgICAgIF9wcm9wcyRkZXN0cm95VG9vbHRpcCA9IHByb3BzLmRlc3Ryb3lUb29sdGlwT25IaWRlLFxuICAgICAgZGVzdHJveVRvb2x0aXBPbkhpZGUgPSBfcHJvcHMkZGVzdHJveVRvb2x0aXAgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRlc3Ryb3lUb29sdGlwLFxuICAgICAgZGVmYXVsdFZpc2libGUgPSBwcm9wcy5kZWZhdWx0VmlzaWJsZSxcbiAgICAgIGdldFRvb2x0aXBDb250YWluZXIgPSBwcm9wcy5nZXRUb29sdGlwQ29udGFpbmVyLFxuICAgICAgb3ZlcmxheUlubmVyU3R5bGUgPSBwcm9wcy5vdmVybGF5SW5uZXJTdHlsZSxcbiAgICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKHByb3BzLCBbXCJvdmVybGF5Q2xhc3NOYW1lXCIsIFwidHJpZ2dlclwiLCBcIm1vdXNlRW50ZXJEZWxheVwiLCBcIm1vdXNlTGVhdmVEZWxheVwiLCBcIm92ZXJsYXlTdHlsZVwiLCBcInByZWZpeENsc1wiLCBcImNoaWxkcmVuXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiYWZ0ZXJWaXNpYmxlQ2hhbmdlXCIsIFwidHJhbnNpdGlvbk5hbWVcIiwgXCJhbmltYXRpb25cIiwgXCJwbGFjZW1lbnRcIiwgXCJhbGlnblwiLCBcImRlc3Ryb3lUb29sdGlwT25IaWRlXCIsIFwiZGVmYXVsdFZpc2libGVcIiwgXCJnZXRUb29sdGlwQ29udGFpbmVyXCIsIFwib3ZlcmxheUlubmVyU3R5bGVcIl0pO1xuICB2YXIgZG9tUmVmID0gKDAsIFJlYWN0LnVzZVJlZikobnVsbCk7XG4gICgwLCBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZG9tUmVmLmN1cnJlbnQ7XG4gIH0pO1xuICB2YXIgZXh0cmFQcm9wcyA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgcmVzdFByb3BzKTtcblxuICBpZiAoJ3Zpc2libGUnIGluIHByb3BzKSB7XG4gICAgZXh0cmFQcm9wcy5wb3B1cFZpc2libGUgPSBwcm9wcy52aXNpYmxlO1xuICB9XG5cbiAgdmFyIGdldFBvcHVwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFBvcHVwRWxlbWVudCgpIHtcbiAgICB2YXIgX3Byb3BzJGFycm93Q29udGVudCA9IHByb3BzLmFycm93Q29udGVudCxcbiAgICAgICAgYXJyb3dDb250ZW50ID0gX3Byb3BzJGFycm93Q29udGVudCA9PT0gdm9pZCAwID8gbnVsbCA6IF9wcm9wcyRhcnJvd0NvbnRlbnQsXG4gICAgICAgIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5LFxuICAgICAgICBpZCA9IHByb3BzLmlkO1xuICAgIHJldHVybiBbUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3dcIiksXG4gICAgICBrZXk6IFwiYXJyb3dcIlxuICAgIH0sIGFycm93Q29udGVudCksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0NvbnRlbnQuZGVmYXVsdCwge1xuICAgICAga2V5OiBcImNvbnRlbnRcIixcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgaWQ6IGlkLFxuICAgICAgb3ZlcmxheTogb3ZlcmxheSxcbiAgICAgIG92ZXJsYXlJbm5lclN0eWxlOiBvdmVybGF5SW5uZXJTdHlsZVxuICAgIH0pXTtcbiAgfTtcblxuICB2YXIgZGVzdHJveVRvb2x0aXAgPSBmYWxzZTtcbiAgdmFyIGF1dG9EZXN0cm95ID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBkZXN0cm95VG9vbHRpcE9uSGlkZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgZGVzdHJveVRvb2x0aXAgPSBkZXN0cm95VG9vbHRpcE9uSGlkZTtcbiAgfSBlbHNlIGlmIChkZXN0cm95VG9vbHRpcE9uSGlkZSAmJiAoMCwgX3R5cGVvZjIuZGVmYXVsdCkoZGVzdHJveVRvb2x0aXBPbkhpZGUpID09PSAnb2JqZWN0Jykge1xuICAgIHZhciBrZWVwUGFyZW50ID0gZGVzdHJveVRvb2x0aXBPbkhpZGUua2VlcFBhcmVudDtcbiAgICBkZXN0cm95VG9vbHRpcCA9IGtlZXBQYXJlbnQgPT09IHRydWU7XG4gICAgYXV0b0Rlc3Ryb3kgPSBrZWVwUGFyZW50ID09PSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9yY1RyaWdnZXIuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcG9wdXBDbGFzc05hbWU6IG92ZXJsYXlDbGFzc05hbWUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcG9wdXA6IGdldFBvcHVwRWxlbWVudCxcbiAgICBhY3Rpb246IHRyaWdnZXIsXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IF9wbGFjZW1lbnRzLnBsYWNlbWVudHMsXG4gICAgcG9wdXBQbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICByZWY6IGRvbVJlZixcbiAgICBwb3B1cEFsaWduOiBhbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0VG9vbHRpcENvbnRhaW5lcixcbiAgICBvblBvcHVwVmlzaWJsZUNoYW5nZTogb25WaXNpYmxlQ2hhbmdlLFxuICAgIGFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlOiBhZnRlclZpc2libGVDaGFuZ2UsXG4gICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgcG9wdXBBbmltYXRpb246IGFuaW1hdGlvbixcbiAgICBkZWZhdWx0UG9wdXBWaXNpYmxlOiBkZWZhdWx0VmlzaWJsZSxcbiAgICBkZXN0cm95UG9wdXBPbkhpZGU6IGRlc3Ryb3lUb29sdGlwLFxuICAgIGF1dG9EZXN0cm95OiBhdXRvRGVzdHJveSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IG1vdXNlTGVhdmVEZWxheSxcbiAgICBwb3B1cFN0eWxlOiBvdmVybGF5U3R5bGUsXG4gICAgbW91c2VFbnRlckRlbGF5OiBtb3VzZUVudGVyRGVsYXlcbiAgfSwgZXh0cmFQcm9wcyksIGNoaWxkcmVuKTtcbn07XG5cbnZhciBfZGVmYXVsdCA9ICgwLCBSZWFjdC5mb3J3YXJkUmVmKShUb29sdGlwKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX1Rvb2x0aXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1Rvb2x0aXBcIikpO1xuXG52YXIgX2RlZmF1bHQgPSBfVG9vbHRpcC5kZWZhdWx0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLnBsYWNlbWVudHMgPSB2b2lkIDA7XG52YXIgYXV0b0FkanVzdE92ZXJmbG93ID0ge1xuICBhZGp1c3RYOiAxLFxuICBhZGp1c3RZOiAxXG59O1xudmFyIHRhcmdldE9mZnNldCA9IFswLCAwXTtcbnZhciBwbGFjZW1lbnRzID0ge1xuICBsZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2NyJywgJ2NsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgcmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnY2wnLCAnY3InXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHRvcDoge1xuICAgIHBvaW50czogWydiYycsICd0YyddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbToge1xuICAgIHBvaW50czogWyd0YycsICdiYyddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWy00LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3BSaWdodDoge1xuICAgIHBvaW50czogWydicicsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ3RyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21SaWdodDoge1xuICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgcmlnaHRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYmwnLCAnYnInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGxlZnRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYnInLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWy00LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9XG59O1xuZXhwb3J0cy5wbGFjZW1lbnRzID0gcGxhY2VtZW50cztcbnZhciBfZGVmYXVsdCA9IHBsYWNlbWVudHM7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuU2VsZWN0Q29udGV4dCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIFNlbGVjdENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0cy5TZWxlY3RDb250ZXh0ID0gU2VsZWN0Q29udGV4dDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF91c2VNZW1vID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVtb1wiKSk7XG5cbnZhciBfcmNUcmVlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdHJlZVwiKSk7XG5cbnZhciBfQ29udGV4dCA9IHJlcXVpcmUoXCIuL0NvbnRleHRcIik7XG5cbnZhciBfdXNlS2V5VmFsdWVNYXBwaW5nMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlS2V5VmFsdWVNYXBwaW5nXCIpKTtcblxudmFyIF91c2VLZXlWYWx1ZU1hcDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZUtleVZhbHVlTWFwXCIpKTtcblxudmFyIEhJRERFTl9TVFlMRSA9IHtcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIG9wYWNpdHk6IDAsXG4gIGJvcmRlcjogMCxcbiAgcGFkZGluZzogMCxcbiAgbWFyZ2luOiAwXG59O1xuXG52YXIgT3B0aW9uTGlzdCA9IGZ1bmN0aW9uIE9wdGlvbkxpc3QocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgICAgaXRlbUhlaWdodCA9IHByb3BzLml0ZW1IZWlnaHQsXG4gICAgICB2aXJ0dWFsID0gcHJvcHMudmlydHVhbCxcbiAgICAgIG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zLFxuICAgICAgZmxhdHRlbk9wdGlvbnMgPSBwcm9wcy5mbGF0dGVuT3B0aW9ucyxcbiAgICAgIG11bHRpcGxlID0gcHJvcHMubXVsdGlwbGUsXG4gICAgICBzZWFyY2hWYWx1ZSA9IHByb3BzLnNlYXJjaFZhbHVlLFxuICAgICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICAgIG9uVG9nZ2xlT3BlbiA9IHByb3BzLm9uVG9nZ2xlT3BlbixcbiAgICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgICAgbm90Rm91bmRDb250ZW50ID0gcHJvcHMubm90Rm91bmRDb250ZW50LFxuICAgICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX0NvbnRleHQuU2VsZWN0Q29udGV4dCksXG4gICAgICBjaGVja2FibGUgPSBfUmVhY3QkdXNlQ29udGV4dC5jaGVja2FibGUsXG4gICAgICBjaGVja2VkS2V5cyA9IF9SZWFjdCR1c2VDb250ZXh0LmNoZWNrZWRLZXlzLFxuICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX1JlYWN0JHVzZUNvbnRleHQuaGFsZkNoZWNrZWRLZXlzLFxuICAgICAgdHJlZUV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VDb250ZXh0LnRyZWVFeHBhbmRlZEtleXMsXG4gICAgICB0cmVlRGVmYXVsdEV4cGFuZEFsbCA9IF9SZWFjdCR1c2VDb250ZXh0LnRyZWVEZWZhdWx0RXhwYW5kQWxsLFxuICAgICAgdHJlZURlZmF1bHRFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlQ29udGV4dC50cmVlRGVmYXVsdEV4cGFuZGVkS2V5cyxcbiAgICAgIG9uVHJlZUV4cGFuZCA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uVHJlZUV4cGFuZCxcbiAgICAgIHRyZWVJY29uID0gX1JlYWN0JHVzZUNvbnRleHQudHJlZUljb24sXG4gICAgICBzaG93VHJlZUljb24gPSBfUmVhY3QkdXNlQ29udGV4dC5zaG93VHJlZUljb24sXG4gICAgICBzd2l0Y2hlckljb24gPSBfUmVhY3QkdXNlQ29udGV4dC5zd2l0Y2hlckljb24sXG4gICAgICB0cmVlTGluZSA9IF9SZWFjdCR1c2VDb250ZXh0LnRyZWVMaW5lLFxuICAgICAgdHJlZU5vZGVGaWx0ZXJQcm9wID0gX1JlYWN0JHVzZUNvbnRleHQudHJlZU5vZGVGaWx0ZXJQcm9wLFxuICAgICAgbG9hZERhdGEgPSBfUmVhY3QkdXNlQ29udGV4dC5sb2FkRGF0YSxcbiAgICAgIHRyZWVMb2FkZWRLZXlzID0gX1JlYWN0JHVzZUNvbnRleHQudHJlZUxvYWRlZEtleXMsXG4gICAgICB0cmVlTW90aW9uID0gX1JlYWN0JHVzZUNvbnRleHQudHJlZU1vdGlvbixcbiAgICAgIG9uVHJlZUxvYWQgPSBfUmVhY3QkdXNlQ29udGV4dC5vblRyZWVMb2FkO1xuXG4gIHZhciB0cmVlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBtZW1vT3B0aW9ucyA9ICgwLCBfdXNlTWVtby5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH0sIFtvcGVuLCBvcHRpb25zXSwgZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gbmV4dFswXSAmJiBwcmV2WzFdICE9PSBuZXh0WzFdO1xuICB9KTtcblxuICB2YXIgX3VzZUtleVZhbHVlTWFwID0gKDAsIF91c2VLZXlWYWx1ZU1hcDMuZGVmYXVsdCkoZmxhdHRlbk9wdGlvbnMpLFxuICAgICAgX3VzZUtleVZhbHVlTWFwMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZUtleVZhbHVlTWFwLCAyKSxcbiAgICAgIGNhY2hlS2V5TWFwID0gX3VzZUtleVZhbHVlTWFwMlswXSxcbiAgICAgIGNhY2hlVmFsdWVNYXAgPSBfdXNlS2V5VmFsdWVNYXAyWzFdO1xuXG4gIHZhciBfdXNlS2V5VmFsdWVNYXBwaW5nID0gKDAsIF91c2VLZXlWYWx1ZU1hcHBpbmczLmRlZmF1bHQpKGNhY2hlS2V5TWFwLCBjYWNoZVZhbHVlTWFwKSxcbiAgICAgIF91c2VLZXlWYWx1ZU1hcHBpbmcyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlS2V5VmFsdWVNYXBwaW5nLCAyKSxcbiAgICAgIGdldEVudGl0eUJ5S2V5ID0gX3VzZUtleVZhbHVlTWFwcGluZzJbMF0sXG4gICAgICBnZXRFbnRpdHlCeVZhbHVlID0gX3VzZUtleVZhbHVlTWFwcGluZzJbMV07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIHZhbHVlS2V5cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjaGVja2VkS2V5cy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgdmFyIGVudGl0eSA9IGdldEVudGl0eUJ5VmFsdWUodmFsKTtcbiAgICAgIHJldHVybiBlbnRpdHkgPyBlbnRpdHkua2V5IDogbnVsbDtcbiAgICB9KTtcbiAgfSwgW2NoZWNrZWRLZXlzXSk7XG4gIHZhciBtZXJnZWRDaGVja2VkS2V5cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghY2hlY2thYmxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogdmFsdWVLZXlzLFxuICAgICAgaGFsZkNoZWNrZWQ6IGhhbGZDaGVja2VkS2V5c1xuICAgIH07XG4gIH0sIFt2YWx1ZUtleXMsIGhhbGZDaGVja2VkS2V5cywgY2hlY2thYmxlXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gU2luZ2xlIG1vZGUgc2hvdWxkIHNjcm9sbCB0byBjdXJyZW50IGtleVxuICAgIGlmIChvcGVuICYmICFtdWx0aXBsZSAmJiB2YWx1ZUtleXMubGVuZ3RoKSB7XG4gICAgICB2YXIgX3RyZWVSZWYkY3VycmVudDtcblxuICAgICAgKF90cmVlUmVmJGN1cnJlbnQgPSB0cmVlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90cmVlUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90cmVlUmVmJGN1cnJlbnQuc2Nyb2xsVG8oe1xuICAgICAgICBrZXk6IHZhbHVlS2V5c1swXVxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbb3Blbl0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgbG93ZXJTZWFyY2hWYWx1ZSA9IFN0cmluZyhzZWFyY2hWYWx1ZSkudG9Mb3dlckNhc2UoKTtcblxuICB2YXIgZmlsdGVyVHJlZU5vZGUgPSBmdW5jdGlvbiBmaWx0ZXJUcmVlTm9kZSh0cmVlTm9kZSkge1xuICAgIGlmICghbG93ZXJTZWFyY2hWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodHJlZU5vZGVbdHJlZU5vZGVGaWx0ZXJQcm9wXSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclNlYXJjaFZhbHVlKTtcbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEtleXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUodHJlZURlZmF1bHRFeHBhbmRlZEtleXMpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU0ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICAgIHNlYXJjaEV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRTZWFyY2hFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBtZXJnZWRFeHBhbmRlZEtleXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHJlZUV4cGFuZGVkS2V5cykge1xuICAgICAgcmV0dXJuICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHRyZWVFeHBhbmRlZEtleXMpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWFyY2hWYWx1ZSA/IHNlYXJjaEV4cGFuZGVkS2V5cyA6IGV4cGFuZGVkS2V5cztcbiAgfSwgW2V4cGFuZGVkS2V5cywgc2VhcmNoRXhwYW5kZWRLZXlzLCBsb3dlclNlYXJjaFZhbHVlLCB0cmVlRXhwYW5kZWRLZXlzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlYXJjaFZhbHVlKSB7XG4gICAgICBzZXRTZWFyY2hFeHBhbmRlZEtleXMoZmxhdHRlbk9wdGlvbnMubWFwKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHJldHVybiBvLmtleTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0sIFtzZWFyY2hWYWx1ZV0pO1xuXG4gIHZhciBvbkludGVybmFsRXhwYW5kID0gZnVuY3Rpb24gb25JbnRlcm5hbEV4cGFuZChrZXlzKSB7XG4gICAgc2V0RXhwYW5kZWRLZXlzKGtleXMpO1xuICAgIHNldFNlYXJjaEV4cGFuZGVkS2V5cyhrZXlzKTtcblxuICAgIGlmIChvblRyZWVFeHBhbmQpIHtcbiAgICAgIG9uVHJlZUV4cGFuZChrZXlzKTtcbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIG9uTGlzdE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTGlzdE1vdXNlRG93bihldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgdmFyIG9uSW50ZXJuYWxTZWxlY3QgPSBmdW5jdGlvbiBvbkludGVybmFsU2VsZWN0KF8sIF9yZWYpIHtcbiAgICB2YXIga2V5ID0gX3JlZi5ub2RlLmtleTtcbiAgICB2YXIgZW50aXR5ID0gZ2V0RW50aXR5QnlLZXkoa2V5LCBjaGVja2FibGUgPyAnY2hlY2tib3gnIDogJ3NlbGVjdCcpO1xuXG4gICAgaWYgKGVudGl0eSAhPT0gbnVsbCkge1xuICAgICAgb25TZWxlY3QoZW50aXR5LmRhdGEudmFsdWUsIHtcbiAgICAgICAgc2VsZWN0ZWQ6ICFjaGVja2VkS2V5cy5pbmNsdWRlcyhlbnRpdHkuZGF0YS52YWx1ZSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghbXVsdGlwbGUpIHtcbiAgICAgIG9uVG9nZ2xlT3BlbihmYWxzZSk7XG4gICAgfVxuICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU2ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICAgIGFjdGl2ZUtleSA9IF9SZWFjdCR1c2VTdGF0ZTZbMF0sXG4gICAgICBzZXRBY3RpdmVLZXkgPSBfUmVhY3QkdXNlU3RhdGU2WzFdO1xuXG4gIHZhciBhY3RpdmVFbnRpdHkgPSBnZXRFbnRpdHlCeUtleShhY3RpdmVLZXkpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgICB2YXIgX3RyZWVSZWYkY3VycmVudDI7XG5cbiAgICAgICAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2g7XG5cbiAgICAgICAgc3dpdGNoICh3aGljaCkge1xuICAgICAgICAgIC8vID4+PiBBcnJvdyBrZXlzXG4gICAgICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LlVQOlxuICAgICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5ET1dOOlxuICAgICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5MRUZUOlxuICAgICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5SSUdIVDpcbiAgICAgICAgICAgIChfdHJlZVJlZiRjdXJyZW50MiA9IHRyZWVSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RyZWVSZWYkY3VycmVudDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90cmVlUmVmJGN1cnJlbnQyLm9uS2V5RG93bihldmVudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAvLyA+Pj4gU2VsZWN0IGl0ZW1cblxuICAgICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5FTlRFUjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGFjdGl2ZUVudGl0eSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9uSW50ZXJuYWxTZWxlY3QobnVsbCwge1xuICAgICAgICAgICAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGFjdGl2ZUtleVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiAhY2hlY2tlZEtleXMuaW5jbHVkZXMoYWN0aXZlRW50aXR5LmRhdGEudmFsdWUpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvLyA+Pj4gQ2xvc2VcblxuICAgICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5FU0M6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9uVG9nZ2xlT3BlbihmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbktleVVwOiBmdW5jdGlvbiBvbktleVVwKCkge31cbiAgICB9O1xuICB9KTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgaWYgKG1lbW9PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJvbGU6IFwibGlzdGJveFwiLFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVtcHR5XCIpLFxuICAgICAgb25Nb3VzZURvd246IG9uTGlzdE1vdXNlRG93blxuICAgIH0sIG5vdEZvdW5kQ29udGVudCk7XG4gIH1cblxuICB2YXIgdHJlZVByb3BzID0ge307XG5cbiAgaWYgKHRyZWVMb2FkZWRLZXlzKSB7XG4gICAgdHJlZVByb3BzLmxvYWRlZEtleXMgPSB0cmVlTG9hZGVkS2V5cztcbiAgfVxuXG4gIGlmIChtZXJnZWRFeHBhbmRlZEtleXMpIHtcbiAgICB0cmVlUHJvcHMuZXhwYW5kZWRLZXlzID0gbWVyZ2VkRXhwYW5kZWRLZXlzO1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIG9uTW91c2VEb3duOiBvbkxpc3RNb3VzZURvd24sXG4gICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXJcbiAgfSwgYWN0aXZlRW50aXR5ICYmIG9wZW4gJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHN0eWxlOiBISURERU5fU1RZTEUsXG4gICAgXCJhcmlhLWxpdmVcIjogXCJhc3NlcnRpdmVcIlxuICB9LCBhY3RpdmVFbnRpdHkuZGF0YS52YWx1ZSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjVHJlZS5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IHRyZWVSZWYsXG4gICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJlZVwiKSxcbiAgICB0cmVlRGF0YTogbWVtb09wdGlvbnMsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgaXRlbUhlaWdodDogaXRlbUhlaWdodCxcbiAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgIG11bHRpcGxlOiBtdWx0aXBsZSxcbiAgICBpY29uOiB0cmVlSWNvbixcbiAgICBzaG93SWNvbjogc2hvd1RyZWVJY29uLFxuICAgIHN3aXRjaGVySWNvbjogc3dpdGNoZXJJY29uLFxuICAgIHNob3dMaW5lOiB0cmVlTGluZSxcbiAgICBsb2FkRGF0YTogc2VhcmNoVmFsdWUgPyBudWxsIDogbG9hZERhdGEsXG4gICAgbW90aW9uOiB0cmVlTW90aW9uLFxuICAgIC8vIFdlIGhhbmRsZSBrZXlzIGJ5IG91dCBpbnN0ZWFkIHRyZWUgc2VsZlxuICAgIGNoZWNrYWJsZTogY2hlY2thYmxlLFxuICAgIGNoZWNrU3RyaWN0bHk6IHRydWUsXG4gICAgY2hlY2tlZEtleXM6IG1lcmdlZENoZWNrZWRLZXlzLFxuICAgIHNlbGVjdGVkS2V5czogIWNoZWNrYWJsZSA/IHZhbHVlS2V5cyA6IFtdLFxuICAgIGRlZmF1bHRFeHBhbmRBbGw6IHRyZWVEZWZhdWx0RXhwYW5kQWxsXG4gIH0sIHRyZWVQcm9wcywge1xuICAgIC8vIFByb3h5IGV2ZW50IG91dFxuICAgIG9uQWN0aXZlQ2hhbmdlOiBzZXRBY3RpdmVLZXksXG4gICAgb25TZWxlY3Q6IG9uSW50ZXJuYWxTZWxlY3QsXG4gICAgb25DaGVjazogb25JbnRlcm5hbFNlbGVjdCxcbiAgICBvbkV4cGFuZDogb25JbnRlcm5hbEV4cGFuZCxcbiAgICBvbkxvYWQ6IG9uVHJlZUxvYWQsXG4gICAgZmlsdGVyVHJlZU5vZGU6IGZpbHRlclRyZWVOb2RlXG4gIH0pKSk7XG59O1xuXG52YXIgUmVmT3B0aW9uTGlzdCA9IFJlYWN0LmZvcndhcmRSZWYoT3B0aW9uTGlzdCk7XG5SZWZPcHRpb25MaXN0LmRpc3BsYXlOYW1lID0gJ09wdGlvbkxpc3QnO1xudmFyIF9kZWZhdWx0ID0gUmVmT3B0aW9uTGlzdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG4vKiogVGhpcyBpcyBhIHBsYWNlaG9sZGVyLCBub3QgcmVhbCByZW5kZXIgaW4gZG9tICovXG52YXIgVHJlZU5vZGUgPSBmdW5jdGlvbiBUcmVlTm9kZSgpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBUcmVlTm9kZTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9pbmhlcml0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpKTtcblxudmFyIF9jcmVhdGVTdXBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZVN1cGVyXCIpKTtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9nZW5lcmF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXNlbGVjdC9saWIvZ2VuZXJhdGVcIikpO1xuXG52YXIgX3ZhbHVlVXRpbCA9IHJlcXVpcmUoXCJyYy1zZWxlY3QvbGliL3V0aWxzL3ZhbHVlVXRpbFwiKTtcblxudmFyIF90cmVlVXRpbCA9IHJlcXVpcmUoXCJyYy10cmVlL2xpYi91dGlscy90cmVlVXRpbFwiKTtcblxudmFyIF9jb25kdWN0VXRpbCA9IHJlcXVpcmUoXCJyYy10cmVlL2xpYi91dGlscy9jb25kdWN0VXRpbFwiKTtcblxudmFyIF9nZW5lcmF0b3IgPSByZXF1aXJlKFwicmMtc2VsZWN0L2xpYi9pbnRlcmZhY2UvZ2VuZXJhdG9yXCIpO1xuXG52YXIgX3VzZU1lcmdlZFN0YXRlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfT3B0aW9uTGlzdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vT3B0aW9uTGlzdFwiKSk7XG5cbnZhciBfVHJlZU5vZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RyZWVOb2RlXCIpKTtcblxudmFyIF92YWx1ZVV0aWwyID0gcmVxdWlyZShcIi4vdXRpbHMvdmFsdWVVdGlsXCIpO1xuXG52YXIgX3dhcm5pbmdQcm9wc1V0aWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V0aWxzL3dhcm5pbmdQcm9wc1V0aWxcIikpO1xuXG52YXIgX0NvbnRleHQgPSByZXF1aXJlKFwiLi9Db250ZXh0XCIpO1xuXG52YXIgX3VzZVRyZWVEYXRhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VUcmVlRGF0YVwiKSk7XG5cbnZhciBfdXNlS2V5VmFsdWVNYXAzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VLZXlWYWx1ZU1hcFwiKSk7XG5cbnZhciBfdXNlS2V5VmFsdWVNYXBwaW5nMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlS2V5VmFsdWVNYXBwaW5nXCIpKTtcblxudmFyIF9zdHJhdGVneVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy9zdHJhdGVneVV0aWxcIik7XG5cbnZhciBfbGVnYWN5VXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL2xlZ2FjeVV0aWxcIik7XG5cbnZhciBfdXNlU2VsZWN0VmFsdWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VTZWxlY3RWYWx1ZXNcIikpO1xuXG52YXIgT01JVF9QUk9QUyA9IFsnZXhwYW5kZWRLZXlzJywgJ3RyZWVEYXRhJywgJ3RyZWVDaGVja2FibGUnLCAnc2hvd0NoZWNrZWRTdHJhdGVneScsICdzZWFyY2hQbGFjZWhvbGRlcicsICd0cmVlTGluZScsICd0cmVlSWNvbicsICdzaG93VHJlZUljb24nLCAnc3dpdGNoZXJJY29uJywgJ3RyZWVOb2RlRmlsdGVyUHJvcCcsICdmaWx0ZXJUcmVlTm9kZScsICdkcm9wZG93blBvcHVwQWxpZ24nLCAndHJlZURlZmF1bHRFeHBhbmRBbGwnLCAndHJlZUNoZWNrU3RyaWN0bHknLCAndHJlZUV4cGFuZGVkS2V5cycsICd0cmVlTG9hZGVkS2V5cycsICd0cmVlTW90aW9uJywgJ29uVHJlZUV4cGFuZCcsICdvblRyZWVMb2FkJywgJ2xvYWREYXRhJywgJ3RyZWVEYXRhU2ltcGxlTW9kZScsICd0cmVlTm9kZUxhYmVsUHJvcCcsICd0cmVlRGVmYXVsdEV4cGFuZGVkS2V5cyddO1xudmFyIFJlZlNlbGVjdCA9ICgwLCBfZ2VuZXJhdGUuZGVmYXVsdCkoe1xuICBwcmVmaXhDbHM6ICdyYy10cmVlLXNlbGVjdCcsXG4gIGNvbXBvbmVudHM6IHtcbiAgICBvcHRpb25MaXN0OiBfT3B0aW9uTGlzdC5kZWZhdWx0XG4gIH0sXG4gIC8vIE5vdCB1c2UgZ2VuZXJhdGUgc2luY2Ugd2Ugd2lsbCBoYW5kbGUgb3Vyc2VsZlxuICBjb252ZXJ0Q2hpbGRyZW5Ub0RhdGE6IGZ1bmN0aW9uIGNvbnZlcnRDaGlsZHJlblRvRGF0YSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgZmxhdHRlbk9wdGlvbnM6IF92YWx1ZVV0aWwyLmZsYXR0ZW5PcHRpb25zLFxuICAvLyBIYW5kbGUgYG9wdGlvbkxhYmVsUHJvcGAgaW4gVHJlZVNlbGVjdCBjb21wb25lbnRcbiAgZ2V0TGFiZWxlZFZhbHVlOiBfdmFsdWVVdGlsLmdldExhYmVsZWRWYWx1ZSxcbiAgZmlsdGVyT3B0aW9uczogX3ZhbHVlVXRpbDIuZmlsdGVyT3B0aW9ucyxcbiAgaXNWYWx1ZURpc2FibGVkOiBfdmFsdWVVdGlsMi5pc1ZhbHVlRGlzYWJsZWQsXG4gIGZpbmRWYWx1ZU9wdGlvbjogX3ZhbHVlVXRpbDIuZmluZFZhbHVlT3B0aW9uLFxuICBvbWl0RE9NUHJvcHM6IGZ1bmN0aW9uIG9taXRET01Qcm9wcyhwcm9wcykge1xuICAgIHZhciBjbG9uZVByb3BzID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwcm9wcyk7XG4gICAgT01JVF9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBkZWxldGUgY2xvbmVQcm9wc1twcm9wXTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmVQcm9wcztcbiAgfVxufSk7XG5SZWZTZWxlY3QuZGlzcGxheU5hbWUgPSAnU2VsZWN0JztcbnZhciBSZWZUcmVlU2VsZWN0ID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgbXVsdGlwbGUgPSBwcm9wcy5tdWx0aXBsZSxcbiAgICAgIHRyZWVDaGVja2FibGUgPSBwcm9wcy50cmVlQ2hlY2thYmxlLFxuICAgICAgdHJlZUNoZWNrU3RyaWN0bHkgPSBwcm9wcy50cmVlQ2hlY2tTdHJpY3RseSxcbiAgICAgIF9wcm9wcyRzaG93Q2hlY2tlZFN0ciA9IHByb3BzLnNob3dDaGVja2VkU3RyYXRlZ3ksXG4gICAgICBzaG93Q2hlY2tlZFN0cmF0ZWd5ID0gX3Byb3BzJHNob3dDaGVja2VkU3RyID09PSB2b2lkIDAgPyAnU0hPV19DSElMRCcgOiBfcHJvcHMkc2hvd0NoZWNrZWRTdHIsXG4gICAgICBsYWJlbEluVmFsdWUgPSBwcm9wcy5sYWJlbEluVmFsdWUsXG4gICAgICBsb2FkRGF0YSA9IHByb3BzLmxvYWREYXRhLFxuICAgICAgdHJlZUxvYWRlZEtleXMgPSBwcm9wcy50cmVlTG9hZGVkS2V5cyxcbiAgICAgIF9wcm9wcyR0cmVlTm9kZUZpbHRlciA9IHByb3BzLnRyZWVOb2RlRmlsdGVyUHJvcCxcbiAgICAgIHRyZWVOb2RlRmlsdGVyUHJvcCA9IF9wcm9wcyR0cmVlTm9kZUZpbHRlciA9PT0gdm9pZCAwID8gJ3ZhbHVlJyA6IF9wcm9wcyR0cmVlTm9kZUZpbHRlcixcbiAgICAgIHRyZWVOb2RlTGFiZWxQcm9wID0gcHJvcHMudHJlZU5vZGVMYWJlbFByb3AsXG4gICAgICB0cmVlRGF0YVNpbXBsZU1vZGUgPSBwcm9wcy50cmVlRGF0YVNpbXBsZU1vZGUsXG4gICAgICB0cmVlRGF0YSA9IHByb3BzLnRyZWVEYXRhLFxuICAgICAgdHJlZUV4cGFuZGVkS2V5cyA9IHByb3BzLnRyZWVFeHBhbmRlZEtleXMsXG4gICAgICB0cmVlRGVmYXVsdEV4cGFuZGVkS2V5cyA9IHByb3BzLnRyZWVEZWZhdWx0RXhwYW5kZWRLZXlzLFxuICAgICAgdHJlZURlZmF1bHRFeHBhbmRBbGwgPSBwcm9wcy50cmVlRGVmYXVsdEV4cGFuZEFsbCxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICB0cmVlSWNvbiA9IHByb3BzLnRyZWVJY29uLFxuICAgICAgc2hvd1RyZWVJY29uID0gcHJvcHMuc2hvd1RyZWVJY29uLFxuICAgICAgc3dpdGNoZXJJY29uID0gcHJvcHMuc3dpdGNoZXJJY29uLFxuICAgICAgdHJlZUxpbmUgPSBwcm9wcy50cmVlTGluZSxcbiAgICAgIHRyZWVNb3Rpb24gPSBwcm9wcy50cmVlTW90aW9uLFxuICAgICAgZmlsdGVyVHJlZU5vZGUgPSBwcm9wcy5maWx0ZXJUcmVlTm9kZSxcbiAgICAgIGRyb3Bkb3duUG9wdXBBbGlnbiA9IHByb3BzLmRyb3Bkb3duUG9wdXBBbGlnbixcbiAgICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgICBvblRyZWVFeHBhbmQgPSBwcm9wcy5vblRyZWVFeHBhbmQsXG4gICAgICBvblRyZWVMb2FkID0gcHJvcHMub25UcmVlTG9hZCxcbiAgICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25Ecm9wZG93blZpc2libGVDaGFuZ2UsXG4gICAgICBvblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0LFxuICAgICAgb25EZXNlbGVjdCA9IHByb3BzLm9uRGVzZWxlY3Q7XG4gIHZhciBtZXJnZWRDaGVja2FibGUgPSB0cmVlQ2hlY2thYmxlIHx8IHRyZWVDaGVja1N0cmljdGx5O1xuICB2YXIgbWVyZ2VkTXVsdGlwbGUgPSBtdWx0aXBsZSB8fCBtZXJnZWRDaGVja2FibGU7XG4gIHZhciB0cmVlQ29uZHVjdGlvbiA9IHRyZWVDaGVja2FibGUgJiYgIXRyZWVDaGVja1N0cmljdGx5O1xuICB2YXIgbWVyZ2VkTGFiZWxJblZhbHVlID0gdHJlZUNoZWNrU3RyaWN0bHkgfHwgbGFiZWxJblZhbHVlOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgc2VsZWN0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogc2VsZWN0UmVmLmN1cnJlbnQuZm9jdXMsXG4gICAgICBibHVyOiBzZWxlY3RSZWYuY3VycmVudC5ibHVyXG4gICAgfTtcbiAgfSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09IFRyZWUgRGF0YSA9PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMZWdhY3kgYm90aCBzdXBwb3J0IGBsYWJlbGAgb3IgYHRpdGxlYCBpZiBub3Qgc2V0LlxuICAvLyBXZSBoYXZlIHRvIGZhbGxiYWNrIHRvIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGlzXG5cbiAgdmFyIGdldFRyZWVOb2RlVGl0bGUgPSBmdW5jdGlvbiBnZXRUcmVlTm9kZVRpdGxlKG5vZGUpIHtcbiAgICBpZiAoIXRyZWVEYXRhKSB7XG4gICAgICByZXR1cm4gbm9kZS50aXRsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZS5sYWJlbCB8fCBub2RlLnRpdGxlO1xuICB9O1xuXG4gIHZhciBnZXRUcmVlTm9kZUxhYmVsUHJvcCA9IGZ1bmN0aW9uIGdldFRyZWVOb2RlTGFiZWxQcm9wKG5vZGUpIHtcbiAgICBpZiAodHJlZU5vZGVMYWJlbFByb3ApIHtcbiAgICAgIHJldHVybiBub2RlW3RyZWVOb2RlTGFiZWxQcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0VHJlZU5vZGVUaXRsZShub2RlKTtcbiAgfTtcblxuICB2YXIgbWVyZ2VkVHJlZURhdGEgPSAoMCwgX3VzZVRyZWVEYXRhLmRlZmF1bHQpKHRyZWVEYXRhLCBjaGlsZHJlbiwge1xuICAgIGdldExhYmVsUHJvcDogZ2V0VHJlZU5vZGVUaXRsZSxcbiAgICBzaW1wbGVNb2RlOiB0cmVlRGF0YVNpbXBsZU1vZGVcbiAgfSk7XG4gIHZhciBmbGF0dGVkT3B0aW9ucyA9ICgwLCBSZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICgwLCBfdmFsdWVVdGlsMi5mbGF0dGVuT3B0aW9ucykobWVyZ2VkVHJlZURhdGEpO1xuICB9LCBbbWVyZ2VkVHJlZURhdGFdKTtcblxuICB2YXIgX3VzZUtleVZhbHVlTWFwID0gKDAsIF91c2VLZXlWYWx1ZU1hcDMuZGVmYXVsdCkoZmxhdHRlZE9wdGlvbnMpLFxuICAgICAgX3VzZUtleVZhbHVlTWFwMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZUtleVZhbHVlTWFwLCAyKSxcbiAgICAgIGNhY2hlS2V5TWFwID0gX3VzZUtleVZhbHVlTWFwMlswXSxcbiAgICAgIGNhY2hlVmFsdWVNYXAgPSBfdXNlS2V5VmFsdWVNYXAyWzFdO1xuXG4gIHZhciBfdXNlS2V5VmFsdWVNYXBwaW5nID0gKDAsIF91c2VLZXlWYWx1ZU1hcHBpbmczLmRlZmF1bHQpKGNhY2hlS2V5TWFwLCBjYWNoZVZhbHVlTWFwKSxcbiAgICAgIF91c2VLZXlWYWx1ZU1hcHBpbmcyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlS2V5VmFsdWVNYXBwaW5nLCAyKSxcbiAgICAgIGdldEVudGl0eUJ5S2V5ID0gX3VzZUtleVZhbHVlTWFwcGluZzJbMF0sXG4gICAgICBnZXRFbnRpdHlCeVZhbHVlID0gX3VzZUtleVZhbHVlTWFwcGluZzJbMV07IC8vIE9ubHkgZ2VuZXJhdGUga2V5RW50aXRpZXMgZm9yIGNoZWNrIGNvbmR1Y3Rpb24gd2hlbiBpcyBgdHJlZUNoZWNrYWJsZWBcblxuXG4gIHZhciBfdXNlTWVtbyA9ICgwLCBSZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRyZWVDb25kdWN0aW9uKSB7XG4gICAgICByZXR1cm4gKDAsIF90cmVlVXRpbC5jb252ZXJ0RGF0YVRvRW50aXRpZXMpKG1lcmdlZFRyZWVEYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAga2V5RW50aXRpZXM6IG51bGxcbiAgICB9O1xuICB9LCBbbWVyZ2VkVHJlZURhdGEsIHRyZWVDaGVja2FibGUsIHRyZWVDaGVja1N0cmljdGx5XSksXG4gICAgICBjb25kdWN0S2V5RW50aXRpZXMgPSBfdXNlTWVtby5rZXlFbnRpdGllczsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBWYWx1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gKDAsIF91c2VNZXJnZWRTdGF0ZTMuZGVmYXVsdCkocHJvcHMuZGVmYXVsdFZhbHVlLCB7XG4gICAgdmFsdWU6IHByb3BzLnZhbHVlXG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICAgIHZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICAgIHNldFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgLyoqIEdldCBgbWlzc2luZ1Jhd1ZhbHVlc2Agd2hpY2ggbm90IGV4aXN0IGluIHRoZSB0cmVlIHlldCAqL1xuXG5cbiAgdmFyIHNwbGl0UmF3VmFsdWVzID0gZnVuY3Rpb24gc3BsaXRSYXdWYWx1ZXMobmV3UmF3VmFsdWVzKSB7XG4gICAgdmFyIG1pc3NpbmdSYXdWYWx1ZXMgPSBbXTtcbiAgICB2YXIgZXhpc3RSYXdWYWx1ZXMgPSBbXTsgLy8gS2VlcCBtaXNzaW5nIHZhbHVlIGluIHRoZSBjYWNoZVxuXG4gICAgbmV3UmF3VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgaWYgKGdldEVudGl0eUJ5VmFsdWUodmFsKSkge1xuICAgICAgICBleGlzdFJhd1ZhbHVlcy5wdXNoKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaXNzaW5nUmF3VmFsdWVzLnB1c2godmFsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbWlzc2luZ1Jhd1ZhbHVlczogbWlzc2luZ1Jhd1ZhbHVlcyxcbiAgICAgIGV4aXN0UmF3VmFsdWVzOiBleGlzdFJhd1ZhbHVlc1xuICAgIH07XG4gIH07XG5cbiAgdmFyIF91c2VNZW1vMiA9ICgwLCBSZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlSGFsZkNoZWNrZWRLZXlzID0gW107XG4gICAgdmFyIG5ld1Jhd1ZhbHVlcyA9IFtdO1xuICAgICgwLCBfdmFsdWVVdGlsMi50b0FycmF5KSh2YWx1ZSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKGl0ZW0gJiYgKDAsIF90eXBlb2YyLmRlZmF1bHQpKGl0ZW0pID09PSAnb2JqZWN0JyAmJiAndmFsdWUnIGluIGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0uaGFsZkNoZWNrZWQgJiYgdHJlZUNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgICB2YXIgZW50aXR5ID0gZ2V0RW50aXR5QnlWYWx1ZShpdGVtLnZhbHVlKTtcbiAgICAgICAgICB2YWx1ZUhhbGZDaGVja2VkS2V5cy5wdXNoKGVudGl0eSA/IGVudGl0eS5rZXkgOiBpdGVtLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdSYXdWYWx1ZXMucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3UmF3VmFsdWVzLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7IC8vIFdlIG5lZWQgZG8gY29uZHVjdGlvbiBvZiB2YWx1ZXNcblxuICAgIGlmICh0cmVlQ29uZHVjdGlvbikge1xuICAgICAgdmFyIF9zcGxpdFJhd1ZhbHVlcyA9IHNwbGl0UmF3VmFsdWVzKG5ld1Jhd1ZhbHVlcyksXG4gICAgICAgICAgbWlzc2luZ1Jhd1ZhbHVlcyA9IF9zcGxpdFJhd1ZhbHVlcy5taXNzaW5nUmF3VmFsdWVzLFxuICAgICAgICAgIGV4aXN0UmF3VmFsdWVzID0gX3NwbGl0UmF3VmFsdWVzLmV4aXN0UmF3VmFsdWVzO1xuXG4gICAgICB2YXIga2V5TGlzdCA9IGV4aXN0UmF3VmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBnZXRFbnRpdHlCeVZhbHVlKHZhbCkua2V5O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBfY29uZHVjdENoZWNrID0gKDAsIF9jb25kdWN0VXRpbC5jb25kdWN0Q2hlY2spKGtleUxpc3QsIHRydWUsIGNvbmR1Y3RLZXlFbnRpdGllcyksXG4gICAgICAgICAgY2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrLmNoZWNrZWRLZXlzLFxuICAgICAgICAgIGhhbGZDaGVja2VkS2V5cyA9IF9jb25kdWN0Q2hlY2suaGFsZkNoZWNrZWRLZXlzO1xuXG4gICAgICByZXR1cm4gW1tdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShtaXNzaW5nUmF3VmFsdWVzKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoY2hlY2tlZEtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGdldEVudGl0eUJ5S2V5KGtleSkuZGF0YS52YWx1ZTtcbiAgICAgIH0pKSksIGhhbGZDaGVja2VkS2V5c107XG4gICAgfVxuXG4gICAgcmV0dXJuIFtuZXdSYXdWYWx1ZXMsIHZhbHVlSGFsZkNoZWNrZWRLZXlzXTtcbiAgfSwgW3ZhbHVlLCBtZXJnZWRNdWx0aXBsZSwgbWVyZ2VkTGFiZWxJblZhbHVlLCB0cmVlQ2hlY2thYmxlLCB0cmVlQ2hlY2tTdHJpY3RseV0pLFxuICAgICAgX3VzZU1lbW8zID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlTWVtbzIsIDIpLFxuICAgICAgcmF3VmFsdWVzID0gX3VzZU1lbW8zWzBdLFxuICAgICAgcmF3SGFsZkNoZWNrZWRLZXlzID0gX3VzZU1lbW8zWzFdO1xuXG4gIHZhciBzZWxlY3RWYWx1ZXMgPSAoMCwgX3VzZVNlbGVjdFZhbHVlcy5kZWZhdWx0KShyYXdWYWx1ZXMsIHtcbiAgICB0cmVlQ29uZHVjdGlvbjogdHJlZUNvbmR1Y3Rpb24sXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNob3dDaGVja2VkU3RyYXRlZ3k6IHNob3dDaGVja2VkU3RyYXRlZ3ksXG4gICAgY29uZHVjdEtleUVudGl0aWVzOiBjb25kdWN0S2V5RW50aXRpZXMsXG4gICAgZ2V0RW50aXR5QnlWYWx1ZTogZ2V0RW50aXR5QnlWYWx1ZSxcbiAgICBnZXRFbnRpdHlCeUtleTogZ2V0RW50aXR5QnlLZXksXG4gICAgZ2V0TGFiZWxQcm9wOiBnZXRUcmVlTm9kZUxhYmVsUHJvcFxuICB9KTtcblxuICB2YXIgdHJpZ2dlckNoYW5nZSA9IGZ1bmN0aW9uIHRyaWdnZXJDaGFuZ2UobmV3UmF3VmFsdWVzLCBleHRyYSwgc291cmNlKSB7XG4gICAgc2V0VmFsdWUobWVyZ2VkTXVsdGlwbGUgPyBuZXdSYXdWYWx1ZXMgOiBuZXdSYXdWYWx1ZXNbMF0pO1xuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICB2YXIgZXZlbnRWYWx1ZXMgPSBuZXdSYXdWYWx1ZXM7XG5cbiAgICAgIGlmICh0cmVlQ29uZHVjdGlvbiAmJiBzaG93Q2hlY2tlZFN0cmF0ZWd5ICE9PSAnU0hPV19BTEwnKSB7XG4gICAgICAgIHZhciBrZXlMaXN0ID0gbmV3UmF3VmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgdmFyIGVudGl0eSA9IGdldEVudGl0eUJ5VmFsdWUodmFsKTtcbiAgICAgICAgICByZXR1cm4gZW50aXR5ID8gZW50aXR5LmtleSA6IHZhbDtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBmb3JtYXR0ZWRLZXlMaXN0ID0gKDAsIF9zdHJhdGVneVV0aWwuZm9ybWF0U3RyYXRlZ3lLZXlzKShrZXlMaXN0LCBzaG93Q2hlY2tlZFN0cmF0ZWd5LCBjb25kdWN0S2V5RW50aXRpZXMpO1xuICAgICAgICBldmVudFZhbHVlcyA9IGZvcm1hdHRlZEtleUxpc3QubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICB2YXIgZW50aXR5ID0gZ2V0RW50aXR5QnlLZXkoa2V5KTtcbiAgICAgICAgICByZXR1cm4gZW50aXR5ID8gZW50aXR5LmRhdGEudmFsdWUgOiBrZXk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3JlZiA9IGV4dHJhIHx8IHtcbiAgICAgICAgdHJpZ2dlclZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIHNlbGVjdGVkOiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICAgICAgdHJpZ2dlclZhbHVlID0gX3JlZi50cmlnZ2VyVmFsdWUsXG4gICAgICAgICAgc2VsZWN0ZWQgPSBfcmVmLnNlbGVjdGVkO1xuXG4gICAgICB2YXIgcmV0dXJuVmFsdWVzID0gbWVyZ2VkTGFiZWxJblZhbHVlID8gKDAsIF92YWx1ZVV0aWwyLmdldFJhd1ZhbHVlTGFiZWxlZCkoZXZlbnRWYWx1ZXMsIHZhbHVlLCBnZXRFbnRpdHlCeVZhbHVlLCBnZXRUcmVlTm9kZUxhYmVsUHJvcCkgOiBldmVudFZhbHVlczsgLy8gV2UgbmVlZCBmaWxsIGhhbGYgY2hlY2sgYmFja1xuXG4gICAgICBpZiAodHJlZUNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgdmFyIGhhbGZWYWx1ZXMgPSByYXdIYWxmQ2hlY2tlZEtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICB2YXIgZW50aXR5ID0gZ2V0RW50aXR5QnlLZXkoa2V5KTtcbiAgICAgICAgICByZXR1cm4gZW50aXR5ID8gZW50aXR5LmRhdGEudmFsdWUgOiBrZXk7XG4gICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgcmV0dXJuICFldmVudFZhbHVlcy5pbmNsdWRlcyh2YWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuVmFsdWVzID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHJldHVyblZhbHVlcyksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKCgwLCBfdmFsdWVVdGlsMi5nZXRSYXdWYWx1ZUxhYmVsZWQpKGhhbGZWYWx1ZXMsIHZhbHVlLCBnZXRFbnRpdHlCeVZhbHVlLCBnZXRUcmVlTm9kZUxhYmVsUHJvcCkpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFkZGl0aW9uYWxJbmZvID0ge1xuICAgICAgICAvLyBbTGVnYWN5XSBBbHdheXMgcmV0dXJuIGFzIGFycmF5IGNvbnRhaW5zIGxhYmVsICYgdmFsdWVcbiAgICAgICAgcHJlVmFsdWU6IHNlbGVjdFZhbHVlcyxcbiAgICAgICAgdHJpZ2dlclZhbHVlOiB0cmlnZ2VyVmFsdWVcbiAgICAgIH07IC8vIFtMZWdhY3ldIEZpbGwgbGVnYWN5IGRhdGEgaWYgdXNlciBxdWVyeS5cbiAgICAgIC8vIFRoaXMgaXMgZXhwYW5zaXZlIHRoYXQgd2Ugb25seSBmaWxsIHdoZW4gdXNlciBxdWVyeVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC90cmVlLXNlbGVjdC9ibG9iL2ZlMzNlYjdjMjc4MzBjOWFjNzBjZDFmZGIxZWJiZTdiYzY3OWMxNmEvc3JjL1NlbGVjdC5qc3hcblxuICAgICAgdmFyIHNob3dQb3NpdGlvbiA9IHRydWU7XG5cbiAgICAgIGlmICh0cmVlQ2hlY2tTdHJpY3RseSB8fCBzb3VyY2UgPT09ICdzZWxlY3Rpb24nICYmICFzZWxlY3RlZCkge1xuICAgICAgICBzaG93UG9zaXRpb24gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgKDAsIF9sZWdhY3lVdGlsLmZpbGxBZGRpdGlvbmFsSW5mbykoYWRkaXRpb25hbEluZm8sIHRyaWdnZXJWYWx1ZSwgbmV3UmF3VmFsdWVzLCBtZXJnZWRUcmVlRGF0YSwgc2hvd1Bvc2l0aW9uKTtcblxuICAgICAgaWYgKG1lcmdlZENoZWNrYWJsZSkge1xuICAgICAgICBhZGRpdGlvbmFsSW5mby5jaGVja2VkID0gc2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRpdGlvbmFsSW5mby5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuXG4gICAgICBvbkNoYW5nZShtZXJnZWRNdWx0aXBsZSA/IHJldHVyblZhbHVlcyA6IHJldHVyblZhbHVlc1swXSwgbWVyZ2VkTGFiZWxJblZhbHVlID8gbnVsbCA6IGV2ZW50VmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHZhciBlbnRpdHkgPSBnZXRFbnRpdHlCeVZhbHVlKHZhbCk7XG4gICAgICAgIHJldHVybiBlbnRpdHkgPyBnZXRUcmVlTm9kZUxhYmVsUHJvcChlbnRpdHkuZGF0YSkgOiBudWxsO1xuICAgICAgfSksIGFkZGl0aW9uYWxJbmZvKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uSW50ZXJuYWxTZWxlY3QgPSBmdW5jdGlvbiBvbkludGVybmFsU2VsZWN0KHNlbGVjdFZhbHVlLCBvcHRpb24sIHNvdXJjZSkge1xuICAgIHZhciBldmVudFZhbHVlID0gbWVyZ2VkTGFiZWxJblZhbHVlID8gc2VsZWN0VmFsdWUgOiBzZWxlY3RWYWx1ZTtcblxuICAgIGlmICghbWVyZ2VkTXVsdGlwbGUpIHtcbiAgICAgIC8vIFNpbmdsZSBtb2RlIGFsd2F5cyBzZXQgdmFsdWVcbiAgICAgIHRyaWdnZXJDaGFuZ2UoW3NlbGVjdFZhbHVlXSwge1xuICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgdHJpZ2dlclZhbHVlOiBzZWxlY3RWYWx1ZVxuICAgICAgfSwgc291cmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5ld1Jhd1ZhbHVlcyA9ICgwLCBfdmFsdWVVdGlsMi5hZGRWYWx1ZSkocmF3VmFsdWVzLCBzZWxlY3RWYWx1ZSk7IC8vIEFkZCBrZXlzIGlmIHRyZWUgY29uZHVjdGlvblxuXG4gICAgICBpZiAodHJlZUNvbmR1Y3Rpb24pIHtcbiAgICAgICAgLy8gU2hvdWxkIGtlZXAgbWlzc2luZyB2YWx1ZXNcbiAgICAgICAgdmFyIF9zcGxpdFJhd1ZhbHVlczIgPSBzcGxpdFJhd1ZhbHVlcyhuZXdSYXdWYWx1ZXMpLFxuICAgICAgICAgICAgbWlzc2luZ1Jhd1ZhbHVlcyA9IF9zcGxpdFJhd1ZhbHVlczIubWlzc2luZ1Jhd1ZhbHVlcyxcbiAgICAgICAgICAgIGV4aXN0UmF3VmFsdWVzID0gX3NwbGl0UmF3VmFsdWVzMi5leGlzdFJhd1ZhbHVlcztcblxuICAgICAgICB2YXIga2V5TGlzdCA9IGV4aXN0UmF3VmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEVudGl0eUJ5VmFsdWUodmFsKS5rZXk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfY29uZHVjdENoZWNrMiA9ICgwLCBfY29uZHVjdFV0aWwuY29uZHVjdENoZWNrKShrZXlMaXN0LCB0cnVlLCBjb25kdWN0S2V5RW50aXRpZXMpLFxuICAgICAgICAgICAgY2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrMi5jaGVja2VkS2V5cztcblxuICAgICAgICBuZXdSYXdWYWx1ZXMgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkobWlzc2luZ1Jhd1ZhbHVlcyksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGNoZWNrZWRLZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGdldEVudGl0eUJ5S2V5KGtleSkuZGF0YS52YWx1ZTtcbiAgICAgICAgfSkpKTtcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckNoYW5nZShuZXdSYXdWYWx1ZXMsIHtcbiAgICAgICAgc2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIHRyaWdnZXJWYWx1ZTogc2VsZWN0VmFsdWVcbiAgICAgIH0sIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKG9uU2VsZWN0KSB7XG4gICAgICBvblNlbGVjdChldmVudFZhbHVlLCBvcHRpb24pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25JbnRlcm5hbERlc2VsZWN0ID0gZnVuY3Rpb24gb25JbnRlcm5hbERlc2VsZWN0KHNlbGVjdFZhbHVlLCBvcHRpb24sIHNvdXJjZSkge1xuICAgIHZhciBldmVudFZhbHVlID0gbWVyZ2VkTGFiZWxJblZhbHVlID8gc2VsZWN0VmFsdWUgOiBzZWxlY3RWYWx1ZTtcbiAgICB2YXIgbmV3UmF3VmFsdWVzID0gKDAsIF92YWx1ZVV0aWwyLnJlbW92ZVZhbHVlKShyYXdWYWx1ZXMsIHNlbGVjdFZhbHVlKTsgLy8gUmVtb3ZlIGtleXMgaWYgdHJlZSBjb25kdWN0aW9uXG5cbiAgICBpZiAodHJlZUNvbmR1Y3Rpb24pIHtcbiAgICAgIHZhciBfc3BsaXRSYXdWYWx1ZXMzID0gc3BsaXRSYXdWYWx1ZXMobmV3UmF3VmFsdWVzKSxcbiAgICAgICAgICBtaXNzaW5nUmF3VmFsdWVzID0gX3NwbGl0UmF3VmFsdWVzMy5taXNzaW5nUmF3VmFsdWVzLFxuICAgICAgICAgIGV4aXN0UmF3VmFsdWVzID0gX3NwbGl0UmF3VmFsdWVzMy5leGlzdFJhd1ZhbHVlcztcblxuICAgICAgdmFyIGtleUxpc3QgPSBleGlzdFJhd1ZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gZ2V0RW50aXR5QnlWYWx1ZSh2YWwpLmtleTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX2NvbmR1Y3RDaGVjazMgPSAoMCwgX2NvbmR1Y3RVdGlsLmNvbmR1Y3RDaGVjaykoa2V5TGlzdCwge1xuICAgICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICAgICAgaGFsZkNoZWNrZWRLZXlzOiByYXdIYWxmQ2hlY2tlZEtleXNcbiAgICAgIH0sIGNvbmR1Y3RLZXlFbnRpdGllcyksXG4gICAgICAgICAgY2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrMy5jaGVja2VkS2V5cztcblxuICAgICAgbmV3UmF3VmFsdWVzID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG1pc3NpbmdSYXdWYWx1ZXMpLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShjaGVja2VkS2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gZ2V0RW50aXR5QnlLZXkoa2V5KS5kYXRhLnZhbHVlO1xuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyQ2hhbmdlKG5ld1Jhd1ZhbHVlcywge1xuICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgdHJpZ2dlclZhbHVlOiBzZWxlY3RWYWx1ZVxuICAgIH0sIHNvdXJjZSk7XG5cbiAgICBpZiAob25EZXNlbGVjdCkge1xuICAgICAgb25EZXNlbGVjdChldmVudFZhbHVlLCBvcHRpb24pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25JbnRlcm5hbENsZWFyID0gZnVuY3Rpb24gb25JbnRlcm5hbENsZWFyKCkge1xuICAgIHRyaWdnZXJDaGFuZ2UoW10sIG51bGwsICdjbGVhcicpO1xuICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE9wZW4gPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBvbkludGVybmFsRHJvcGRvd25WaXNpYmxlQ2hhbmdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG9wZW4pIHtcbiAgICBpZiAob25Ecm9wZG93blZpc2libGVDaGFuZ2UpIHtcbiAgICAgIHZhciBsZWdhY3lQYXJhbSA9IHt9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxlZ2FjeVBhcmFtLCAnZG9jdW1lbnRDbGlja0Nsb3NlJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsICdTZWNvbmQgcGFyYW0gb2YgYG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlYCBoYXMgYmVlbiByZW1vdmVkLicpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZShvcGVuLCBsZWdhY3lQYXJhbSk7XG4gICAgfVxuICB9LCBbb25Ecm9wZG93blZpc2libGVDaGFuZ2VdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAoMCwgX3dhcm5pbmdQcm9wc1V0aWwuZGVmYXVsdCkocHJvcHMpO1xuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBXZSBwYXNzIHNvbWUgcHJvcHMgaW50byBzZWxlY3QgcHJvcHMgc3R5bGVcblxuXG4gIHZhciBzZWxlY3RQcm9wcyA9IHtcbiAgICBvcHRpb25MYWJlbFByb3A6IG51bGwsXG4gICAgb3B0aW9uRmlsdGVyUHJvcDogdHJlZU5vZGVGaWx0ZXJQcm9wLFxuICAgIGRyb3Bkb3duQWxpZ246IGRyb3Bkb3duUG9wdXBBbGlnbixcbiAgICBpbnRlcm5hbFByb3BzOiB7XG4gICAgICBtYXJrOiBfZ2VuZXJhdG9yLklOVEVSTkFMX1BST1BTX01BUkssXG4gICAgICBvbkNsZWFyOiBvbkludGVybmFsQ2xlYXIsXG4gICAgICBza2lwVHJpZ2dlckNoYW5nZTogdHJ1ZSxcbiAgICAgIHNraXBUcmlnZ2VyU2VsZWN0OiB0cnVlLFxuICAgICAgb25SYXdTZWxlY3Q6IG9uSW50ZXJuYWxTZWxlY3QsXG4gICAgICBvblJhd0Rlc2VsZWN0OiBvbkludGVybmFsRGVzZWxlY3RcbiAgICB9XG4gIH07XG5cbiAgaWYgKCdmaWx0ZXJUcmVlTm9kZScgaW4gcHJvcHMpIHtcbiAgICBzZWxlY3RQcm9wcy5maWx0ZXJPcHRpb24gPSBmaWx0ZXJUcmVlTm9kZTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9Db250ZXh0LlNlbGVjdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgY2hlY2thYmxlOiBtZXJnZWRDaGVja2FibGUsXG4gICAgICBsb2FkRGF0YTogbG9hZERhdGEsXG4gICAgICB0cmVlTG9hZGVkS2V5czogdHJlZUxvYWRlZEtleXMsXG4gICAgICBvblRyZWVMb2FkOiBvblRyZWVMb2FkLFxuICAgICAgY2hlY2tlZEtleXM6IHJhd1ZhbHVlcyxcbiAgICAgIGhhbGZDaGVja2VkS2V5czogcmF3SGFsZkNoZWNrZWRLZXlzLFxuICAgICAgdHJlZURlZmF1bHRFeHBhbmRBbGw6IHRyZWVEZWZhdWx0RXhwYW5kQWxsLFxuICAgICAgdHJlZUV4cGFuZGVkS2V5czogdHJlZUV4cGFuZGVkS2V5cyxcbiAgICAgIHRyZWVEZWZhdWx0RXhwYW5kZWRLZXlzOiB0cmVlRGVmYXVsdEV4cGFuZGVkS2V5cyxcbiAgICAgIG9uVHJlZUV4cGFuZDogb25UcmVlRXhwYW5kLFxuICAgICAgdHJlZUljb246IHRyZWVJY29uLFxuICAgICAgdHJlZU1vdGlvbjogdHJlZU1vdGlvbixcbiAgICAgIHNob3dUcmVlSWNvbjogc2hvd1RyZWVJY29uLFxuICAgICAgc3dpdGNoZXJJY29uOiBzd2l0Y2hlckljb24sXG4gICAgICB0cmVlTGluZTogdHJlZUxpbmUsXG4gICAgICB0cmVlTm9kZUZpbHRlclByb3A6IHRyZWVOb2RlRmlsdGVyUHJvcFxuICAgIH1cbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChSZWZTZWxlY3QsIE9iamVjdC5hc3NpZ24oe1xuICAgIHJlZjogc2VsZWN0UmVmLFxuICAgIG1vZGU6IG1lcmdlZE11bHRpcGxlID8gJ211bHRpcGxlJyA6IG51bGxcbiAgfSwgcHJvcHMsIHNlbGVjdFByb3BzLCB7XG4gICAgdmFsdWU6IHNlbGVjdFZhbHVlcyxcbiAgICAvLyBXZSB3aWxsIGhhbmRsZSB0aGlzIG91cnNlbGYgc2luY2Ugd2UgbmVlZCBjYWxjdWxhdGUgY29uZHVjdGlvblxuICAgIGxhYmVsSW5WYWx1ZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBtZXJnZWRUcmVlRGF0YSxcbiAgICBvbkNoYW5nZTogbnVsbCxcbiAgICBvblNlbGVjdDogbnVsbCxcbiAgICBvbkRlc2VsZWN0OiBudWxsLFxuICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlOiBvbkludGVybmFsRHJvcGRvd25WaXNpYmxlQ2hhbmdlXG4gIH0pKSk7XG59KTsgLy8gVXNlIGNsYXNzIGNvbXBvbmVudCBzaW5jZSB0eXBlc2NyaXB0IG5vdCBzdXBwb3J0IGdlbmVyaWNcbi8vIGJ5IGBmb3J3YXJkUmVmYCB3aXRoIGZ1bmN0aW9uIGNvbXBvbmVudCB5ZXQuXG5cbnZhciBUcmVlU2VsZWN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKFRyZWVTZWxlY3QsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShUcmVlU2VsZWN0KTtcblxuICBmdW5jdGlvbiBUcmVlU2VsZWN0KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIFRyZWVTZWxlY3QpO1xuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMuc2VsZWN0UmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG5cbiAgICBfdGhpcy5mb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNlbGVjdFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgfTtcblxuICAgIF90aGlzLmJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZWxlY3RSZWYuY3VycmVudC5ibHVyKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFRyZWVTZWxlY3QsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWZUcmVlU2VsZWN0LCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcmVmOiB0aGlzLnNlbGVjdFJlZlxuICAgICAgfSwgdGhpcy5wcm9wcykpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVHJlZVNlbGVjdDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuVHJlZVNlbGVjdC5UcmVlTm9kZSA9IF9UcmVlTm9kZS5kZWZhdWx0O1xuVHJlZVNlbGVjdC5TSE9XX0FMTCA9IF9zdHJhdGVneVV0aWwuU0hPV19BTEw7XG5UcmVlU2VsZWN0LlNIT1dfUEFSRU5UID0gX3N0cmF0ZWd5VXRpbC5TSE9XX1BBUkVOVDtcblRyZWVTZWxlY3QuU0hPV19DSElMRCA9IF9zdHJhdGVneVV0aWwuU0hPV19DSElMRDtcbnZhciBfZGVmYXVsdCA9IFRyZWVTZWxlY3Q7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZUtleVZhbHVlTWFwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG4vKipcbiAqIFJldHVybiBjYWNoZWQgS2V5IFZhbHVlIG1hcCB3aXRoIERhdGFOb2RlLlxuICogT25seSByZS1jYWxjdWxhdGUgd2hlbiBgZmxhdHRlbk9wdGlvbnNgIGNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIHVzZUtleVZhbHVlTWFwKGZsYXR0ZW5PcHRpb25zKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FjaGVLZXlNYXAgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGNhY2hlVmFsdWVNYXAgPSBuZXcgTWFwKCk7IC8vIENhY2hlIG9wdGlvbnMgYnkga2V5XG5cbiAgICBmbGF0dGVuT3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhTm9kZSkge1xuICAgICAgY2FjaGVLZXlNYXAuc2V0KGRhdGFOb2RlLmtleSwgZGF0YU5vZGUpO1xuICAgICAgY2FjaGVWYWx1ZU1hcC5zZXQoZGF0YU5vZGUuZGF0YS52YWx1ZSwgZGF0YU5vZGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2FjaGVLZXlNYXAsIGNhY2hlVmFsdWVNYXBdO1xuICB9LCBbZmxhdHRlbk9wdGlvbnNdKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VLZXlWYWx1ZU1hcHBpbmc7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIGlzRGlzYWJsZWQoZGF0YU5vZGUsIHNraXBUeXBlKSB7XG4gIGlmICghZGF0YU5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBfZGF0YU5vZGUkZGF0YSA9IGRhdGFOb2RlLmRhdGEsXG4gICAgICBkaXNhYmxlZCA9IF9kYXRhTm9kZSRkYXRhLmRpc2FibGVkLFxuICAgICAgZGlzYWJsZUNoZWNrYm94ID0gX2RhdGFOb2RlJGRhdGEuZGlzYWJsZUNoZWNrYm94O1xuXG4gIHN3aXRjaCAoc2tpcFR5cGUpIHtcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmV0dXJuIGRpc2FibGVkO1xuXG4gICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgcmV0dXJuIGRpc2FibGVkIHx8IGRpc2FibGVDaGVja2JveDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdXNlS2V5VmFsdWVNYXBwaW5nKGNhY2hlS2V5TWFwLCBjYWNoZVZhbHVlTWFwKSB7XG4gIHZhciBnZXRFbnRpdHlCeUtleSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgc2tpcFR5cGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdzZWxlY3QnO1xuICAgIHZhciBpZ25vcmVEaXNhYmxlZENoZWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIGRhdGFOb2RlID0gY2FjaGVLZXlNYXAuZ2V0KGtleSk7XG5cbiAgICBpZiAoIWlnbm9yZURpc2FibGVkQ2hlY2sgJiYgaXNEaXNhYmxlZChkYXRhTm9kZSwgc2tpcFR5cGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YU5vZGU7XG4gIH0sIFtjYWNoZUtleU1hcF0pO1xuICB2YXIgZ2V0RW50aXR5QnlWYWx1ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBza2lwVHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ3NlbGVjdCc7XG4gICAgdmFyIGlnbm9yZURpc2FibGVkQ2hlY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgZGF0YU5vZGUgPSBjYWNoZVZhbHVlTWFwLmdldCh2YWx1ZSk7XG5cbiAgICBpZiAoIWlnbm9yZURpc2FibGVkQ2hlY2sgJiYgaXNEaXNhYmxlZChkYXRhTm9kZSwgc2tpcFR5cGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YU5vZGU7XG4gIH0sIFtjYWNoZVZhbHVlTWFwXSk7XG4gIHJldHVybiBbZ2V0RW50aXR5QnlLZXksIGdldEVudGl0eUJ5VmFsdWVdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlU2VsZWN0VmFsdWVzO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3ZhbHVlVXRpbCA9IHJlcXVpcmUoXCIuLi91dGlscy92YWx1ZVV0aWxcIik7XG5cbnZhciBfc3RyYXRlZ3lVdGlsID0gcmVxdWlyZShcIi4uL3V0aWxzL3N0cmF0ZWd5VXRpbFwiKTtcblxuLyoqIFJldHVybiAgKi9cbmZ1bmN0aW9uIHVzZVNlbGVjdFZhbHVlcyhyYXdWYWx1ZXMsIF9yZWYpIHtcbiAgdmFyIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIGdldEVudGl0eUJ5VmFsdWUgPSBfcmVmLmdldEVudGl0eUJ5VmFsdWUsXG4gICAgICBnZXRFbnRpdHlCeUtleSA9IF9yZWYuZ2V0RW50aXR5QnlLZXksXG4gICAgICB0cmVlQ29uZHVjdGlvbiA9IF9yZWYudHJlZUNvbmR1Y3Rpb24sXG4gICAgICBzaG93Q2hlY2tlZFN0cmF0ZWd5ID0gX3JlZi5zaG93Q2hlY2tlZFN0cmF0ZWd5LFxuICAgICAgY29uZHVjdEtleUVudGl0aWVzID0gX3JlZi5jb25kdWN0S2V5RW50aXRpZXMsXG4gICAgICBnZXRMYWJlbFByb3AgPSBfcmVmLmdldExhYmVsUHJvcDtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZXJnZWRSYXdWYWx1ZXMgPSByYXdWYWx1ZXM7XG5cbiAgICBpZiAodHJlZUNvbmR1Y3Rpb24pIHtcbiAgICAgIHZhciByYXdLZXlzID0gKDAsIF9zdHJhdGVneVV0aWwuZm9ybWF0U3RyYXRlZ3lLZXlzKShyYXdWYWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdmFyIGVudGl0eSA9IGdldEVudGl0eUJ5VmFsdWUodmFsKTtcbiAgICAgICAgcmV0dXJuIGVudGl0eSA/IGVudGl0eS5rZXkgOiB2YWw7XG4gICAgICB9KSwgc2hvd0NoZWNrZWRTdHJhdGVneSwgY29uZHVjdEtleUVudGl0aWVzKTtcbiAgICAgIG1lcmdlZFJhd1ZhbHVlcyA9IHJhd0tleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIGVudGl0eSA9IGdldEVudGl0eUJ5S2V5KGtleSk7XG4gICAgICAgIHJldHVybiBlbnRpdHkgPyBlbnRpdHkuZGF0YS52YWx1ZSA6IGtleTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX3ZhbHVlVXRpbC5nZXRSYXdWYWx1ZUxhYmVsZWQpKG1lcmdlZFJhd1ZhbHVlcywgdmFsdWUsIGdldEVudGl0eUJ5VmFsdWUsIGdldExhYmVsUHJvcCk7XG4gIH0sIFtyYXdWYWx1ZXMsIHZhbHVlLCB0cmVlQ29uZHVjdGlvbiwgc2hvd0NoZWNrZWRTdHJhdGVneSwgZ2V0RW50aXR5QnlWYWx1ZV0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZVRyZWVEYXRhO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3dhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi93YXJuaW5nXCIpKTtcblxudmFyIF9sZWdhY3lVdGlsID0gcmVxdWlyZShcIi4uL3V0aWxzL2xlZ2FjeVV0aWxcIik7XG5cbnZhciBNQVhfV0FSTklOR19USU1FUyA9IDEwO1xuXG5mdW5jdGlvbiBwYXJzZVNpbXBsZVRyZWVEYXRhKHRyZWVEYXRhLCBfcmVmKSB7XG4gIHZhciBpZCA9IF9yZWYuaWQsXG4gICAgICBwSWQgPSBfcmVmLnBJZCxcbiAgICAgIHJvb3RQSWQgPSBfcmVmLnJvb3RQSWQ7XG4gIHZhciBrZXlOb2RlcyA9IHt9O1xuICB2YXIgcm9vdE5vZGVMaXN0ID0gW107IC8vIEZpbGwgaW4gdGhlIG1hcFxuXG4gIHZhciBub2RlTGlzdCA9IHRyZWVEYXRhLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBjbG9uZSA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgbm9kZSk7XG4gICAgdmFyIGtleSA9IGNsb25lW2lkXTtcbiAgICBrZXlOb2Rlc1trZXldID0gY2xvbmU7XG4gICAgY2xvbmUua2V5ID0gY2xvbmUua2V5IHx8IGtleTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH0pOyAvLyBDb25uZWN0IHRyZWVcblxuICBub2RlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIHBhcmVudEtleSA9IG5vZGVbcElkXTtcbiAgICB2YXIgcGFyZW50ID0ga2V5Tm9kZXNbcGFyZW50S2V5XTsgLy8gRmlsbCBwYXJlbnRcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHBhcmVudC5jaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIH0gLy8gRmlsbCByb290IHRyZWUgbm9kZVxuXG5cbiAgICBpZiAocGFyZW50S2V5ID09PSByb290UElkIHx8ICFwYXJlbnQgJiYgcm9vdFBJZCA9PT0gbnVsbCkge1xuICAgICAgcm9vdE5vZGVMaXN0LnB1c2gobm9kZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJvb3ROb2RlTGlzdDtcbn1cbi8qKlxuICogRm9ybWF0IGB0cmVlRGF0YWAgd2l0aCBgdmFsdWVgICYgYGtleWAgd2hpY2ggaXMgdXNlZCBmb3IgY2FsY3VsYXRpb25cbiAqL1xuXG5cbmZ1bmN0aW9uIGZvcm1hdFRyZWVEYXRhKHRyZWVEYXRhLCBnZXRMYWJlbFByb3ApIHtcbiAgdmFyIHdhcm5pbmdUaW1lcyA9IDA7XG4gIHZhciB2YWx1ZVNldCA9IG5ldyBTZXQoKTtcblxuICBmdW5jdGlvbiBkaWcoZGF0YU5vZGVzKSB7XG4gICAgcmV0dXJuIChkYXRhTm9kZXMgfHwgW10pLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGtleSA9IG5vZGUua2V5LFxuICAgICAgICAgIHZhbHVlID0gbm9kZS52YWx1ZSxcbiAgICAgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKG5vZGUsIFtcImtleVwiLCBcInZhbHVlXCIsIFwiY2hpbGRyZW5cIl0pO1xuICAgICAgdmFyIG1lcmdlZFZhbHVlID0gJ3ZhbHVlJyBpbiBub2RlID8gdmFsdWUgOiBrZXk7XG4gICAgICB2YXIgZGF0YU5vZGUgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCByZXN0KSwge30sIHtcbiAgICAgICAga2V5OiBrZXkgIT09IG51bGwgJiYga2V5ICE9PSB1bmRlZmluZWQgPyBrZXkgOiBtZXJnZWRWYWx1ZSxcbiAgICAgICAgdmFsdWU6IG1lcmdlZFZhbHVlLFxuICAgICAgICB0aXRsZTogZ2V0TGFiZWxQcm9wKG5vZGUpXG4gICAgICB9KTsgLy8gQ2hlY2sgYGtleWAgJiBgdmFsdWVgIGFuZCB3YXJuaW5nIHVzZXJcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCAmJiBrZXkgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIFN0cmluZyhrZXkpICE9PSBTdHJpbmcodmFsdWUpICYmIHdhcm5pbmdUaW1lcyA8IE1BWF9XQVJOSU5HX1RJTUVTKSB7XG4gICAgICAgICAgd2FybmluZ1RpbWVzICs9IDE7XG4gICAgICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCBcImBrZXlgIG9yIGB2YWx1ZWAgd2l0aCBUcmVlTm9kZSBtdXN0IGJlIHRoZSBzYW1lIG9yIHlvdSBjYW4gcmVtb3ZlIG9uZSBvZiB0aGVtLiBrZXk6IFwiLmNvbmNhdChrZXksIFwiLCB2YWx1ZTogXCIpLmNvbmNhdCh2YWx1ZSwgXCIuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KSghdmFsdWVTZXQuaGFzKHZhbHVlKSwgXCJTYW1lIGB2YWx1ZWAgZXhpc3QgaW4gdGhlIHRyZWU6IFwiLmNvbmNhdCh2YWx1ZSkpO1xuICAgICAgICB2YWx1ZVNldC5hZGQodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoJ2NoaWxkcmVuJyBpbiBub2RlKSB7XG4gICAgICAgIGRhdGFOb2RlLmNoaWxkcmVuID0gZGlnKGNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGFOb2RlO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGRpZyh0cmVlRGF0YSk7XG59XG4vKipcbiAqIENvbnZlcnQgYHRyZWVEYXRhYCBvciBgY2hpbGRyZW5gIGludG8gZm9ybWF0dGVkIGB0cmVlRGF0YWAuXG4gKiBXaWxsIG5vdCByZS1jYWxjdWxhdGUgaWYgYHRyZWVEYXRhYCBvciBgY2hpbGRyZW5gIG5vdCBjaGFuZ2UuXG4gKi9cblxuXG5mdW5jdGlvbiB1c2VUcmVlRGF0YSh0cmVlRGF0YSwgY2hpbGRyZW4sIF9yZWYyKSB7XG4gIHZhciBnZXRMYWJlbFByb3AgPSBfcmVmMi5nZXRMYWJlbFByb3AsXG4gICAgICBzaW1wbGVNb2RlID0gX3JlZjIuc2ltcGxlTW9kZTtcbiAgdmFyIGNhY2hlUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcblxuICBpZiAodHJlZURhdGEpIHtcbiAgICBjYWNoZVJlZi5jdXJyZW50LmZvcm1hdFRyZWVEYXRhID0gY2FjaGVSZWYuY3VycmVudC50cmVlRGF0YSA9PT0gdHJlZURhdGEgPyBjYWNoZVJlZi5jdXJyZW50LmZvcm1hdFRyZWVEYXRhIDogZm9ybWF0VHJlZURhdGEoc2ltcGxlTW9kZSA/IHBhcnNlU2ltcGxlVHJlZURhdGEodHJlZURhdGEsICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAgICBpZDogJ2lkJyxcbiAgICAgIHBJZDogJ3BJZCcsXG4gICAgICByb290UElkOiBudWxsXG4gICAgfSwgc2ltcGxlTW9kZSAhPT0gdHJ1ZSA/IHNpbXBsZU1vZGUgOiB7fSkpIDogdHJlZURhdGEsIGdldExhYmVsUHJvcCk7XG4gICAgY2FjaGVSZWYuY3VycmVudC50cmVlRGF0YSA9IHRyZWVEYXRhO1xuICB9IGVsc2Uge1xuICAgIGNhY2hlUmVmLmN1cnJlbnQuZm9ybWF0VHJlZURhdGEgPSBjYWNoZVJlZi5jdXJyZW50LmNoaWxkcmVuID09PSBjaGlsZHJlbiA/IGNhY2hlUmVmLmN1cnJlbnQuZm9ybWF0VHJlZURhdGEgOiBmb3JtYXRUcmVlRGF0YSgoMCwgX2xlZ2FjeVV0aWwuY29udmVydENoaWxkcmVuVG9EYXRhKShjaGlsZHJlbiksIGdldExhYmVsUHJvcCk7XG4gIH1cblxuICByZXR1cm4gY2FjaGVSZWYuY3VycmVudC5mb3JtYXRUcmVlRGF0YTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmVlTm9kZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfVHJlZU5vZGUuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTSE9XX0FMTFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfc3RyYXRlZ3lVdGlsLlNIT1dfQUxMO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNIT1dfQ0hJTERcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3N0cmF0ZWd5VXRpbC5TSE9XX0NISUxEO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNIT1dfUEFSRU5UXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdHJhdGVneVV0aWwuU0hPV19QQVJFTlQ7XG4gIH1cbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX1RyZWVTZWxlY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RyZWVTZWxlY3RcIikpO1xuXG52YXIgX1RyZWVOb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UcmVlTm9kZVwiKSk7XG5cbnZhciBfc3RyYXRlZ3lVdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvc3RyYXRlZ3lVdGlsXCIpO1xuXG52YXIgX2RlZmF1bHQgPSBfVHJlZVNlbGVjdC5kZWZhdWx0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jb252ZXJ0Q2hpbGRyZW5Ub0RhdGEgPSBjb252ZXJ0Q2hpbGRyZW5Ub0RhdGE7XG5leHBvcnRzLmZpbGxMZWdhY3lQcm9wcyA9IGZpbGxMZWdhY3lQcm9wcztcbmV4cG9ydHMuZmlsbEFkZGl0aW9uYWxJbmZvID0gZmlsbEFkZGl0aW9uYWxJbmZvO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfVHJlZU5vZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9UcmVlTm9kZVwiKSk7XG5cbmZ1bmN0aW9uIGNvbnZlcnRDaGlsZHJlblRvRGF0YShub2Rlcykge1xuICByZXR1cm4gKDAsIF90b0FycmF5LmRlZmF1bHQpKG5vZGVzKS5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAoIVJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpIHx8ICFub2RlLnR5cGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBub2RlLmtleSxcbiAgICAgICAgX25vZGUkcHJvcHMgPSBub2RlLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF9ub2RlJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICB2YWx1ZSA9IF9ub2RlJHByb3BzLnZhbHVlLFxuICAgICAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfbm9kZSRwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJ2YWx1ZVwiXSk7XG4gICAgdmFyIGRhdGEgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe1xuICAgICAga2V5OiBrZXksXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9LCByZXN0UHJvcHMpO1xuICAgIHZhciBjaGlsZERhdGEgPSBjb252ZXJ0Q2hpbGRyZW5Ub0RhdGEoY2hpbGRyZW4pO1xuXG4gICAgaWYgKGNoaWxkRGF0YS5sZW5ndGgpIHtcbiAgICAgIGRhdGEuY2hpbGRyZW4gPSBjaGlsZERhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoZGF0YSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZmlsbExlZ2FjeVByb3BzKGRhdGFOb2RlKSB7XG4gIC8vIFNraXAgaWYgbm90IGRhdGFOb2RlIGV4aXN0XG4gIGlmICghZGF0YU5vZGUpIHtcbiAgICByZXR1cm4gZGF0YU5vZGU7XG4gIH1cblxuICB2YXIgY2xvbmVOb2RlID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBkYXRhTm9kZSk7XG5cbiAgaWYgKCEoJ3Byb3BzJyBpbiBjbG9uZU5vZGUpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb25lTm9kZSwgJ3Byb3BzJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ05ldyBgcmMtdHJlZS1zZWxlY3RgIG5vdCBzdXBwb3J0IHJldHVybiBub2RlIGluc3RhbmNlIGFzIGFyZ3VtZW50IGFueW1vcmUuIFBsZWFzZSBjb25zaWRlciB0byByZW1vdmUgYHByb3BzYCBhY2Nlc3MuJyk7XG4gICAgICAgIHJldHVybiBjbG9uZU5vZGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY2xvbmVOb2RlO1xufVxuXG5mdW5jdGlvbiBmaWxsQWRkaXRpb25hbEluZm8oZXh0cmEsIHRyaWdnZXJWYWx1ZSwgY2hlY2tlZFZhbHVlcywgdHJlZURhdGEsIHNob3dQb3NpdGlvbikge1xuICB2YXIgdHJpZ2dlck5vZGUgPSBudWxsO1xuICB2YXIgbm9kZUxpc3QgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlTWFwKCkge1xuICAgIGZ1bmN0aW9uIGRpZyhsaXN0KSB7XG4gICAgICB2YXIgbGV2ZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcwJztcbiAgICAgIHZhciBwYXJlbnRJbmNsdWRlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgICByZXR1cm4gbGlzdC5tYXAoZnVuY3Rpb24gKGRhdGFOb2RlLCBpbmRleCkge1xuICAgICAgICB2YXIgcG9zID0gXCJcIi5jb25jYXQobGV2ZWwsIFwiLVwiKS5jb25jYXQoaW5kZXgpO1xuICAgICAgICB2YXIgaW5jbHVkZWQgPSBjaGVja2VkVmFsdWVzLmluY2x1ZGVzKGRhdGFOb2RlLnZhbHVlKTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gZGlnKGRhdGFOb2RlLmNoaWxkcmVuIHx8IFtdLCBwb3MsIGluY2x1ZGVkKTtcbiAgICAgICAgdmFyIG5vZGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KF9UcmVlTm9kZS5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBkYXRhTm9kZSksIGNoaWxkcmVuLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGQubm9kZTtcbiAgICAgICAgfSkpOyAvLyBMaW5rIHdpdGggdHJpZ2dlciBub2RlXG5cbiAgICAgICAgaWYgKHRyaWdnZXJWYWx1ZSA9PT0gZGF0YU5vZGUudmFsdWUpIHtcbiAgICAgICAgICB0cmlnZ2VyTm9kZSA9IG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5jbHVkZWQpIHtcbiAgICAgICAgICB2YXIgY2hlY2tlZE5vZGUgPSB7XG4gICAgICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKCFwYXJlbnRJbmNsdWRlZCkge1xuICAgICAgICAgICAgbm9kZUxpc3QucHVzaChjaGVja2VkTm9kZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNoZWNrZWROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGVMaXN0KSB7XG4gICAgICBub2RlTGlzdCA9IFtdO1xuICAgICAgZGlnKHRyZWVEYXRhKTsgLy8gU29ydCB0byBrZWVwIHRoZSBjaGVja2VkIG5vZGUgbGVuZ3RoXG5cbiAgICAgIG5vZGVMaXN0LnNvcnQoZnVuY3Rpb24gKF9yZWYsIF9yZWYyKSB7XG4gICAgICAgIHZhciB2YWwxID0gX3JlZi5ub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICB2YXIgdmFsMiA9IF9yZWYyLm5vZGUucHJvcHMudmFsdWU7XG4gICAgICAgIHZhciBpbmRleDEgPSBjaGVja2VkVmFsdWVzLmluZGV4T2YodmFsMSk7XG4gICAgICAgIHZhciBpbmRleDIgPSBjaGVja2VkVmFsdWVzLmluZGV4T2YodmFsMik7XG4gICAgICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXh0cmEsICd0cmlnZ2VyTm9kZScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ2B0cmlnZ2VyTm9kZWAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIGNvbnNpZGVyIGRlY291cGxpbmcgZGF0YSB3aXRoIG5vZGUuJyk7XG4gICAgICBnZW5lcmF0ZU1hcCgpO1xuICAgICAgcmV0dXJuIHRyaWdnZXJOb2RlO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHRyYSwgJ2FsbENoZWNrZWROb2RlcycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ2BhbGxDaGVja2VkTm9kZXNgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBjb25zaWRlciBkZWNvdXBsaW5nIGRhdGEgd2l0aCBub2RlLicpO1xuICAgICAgZ2VuZXJhdGVNYXAoKTtcblxuICAgICAgaWYgKHNob3dQb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gbm9kZUxpc3Q7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlTGlzdC5tYXAoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBub2RlID0gX3JlZjMubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5mb3JtYXRTdHJhdGVneUtleXMgPSBmb3JtYXRTdHJhdGVneUtleXM7XG5leHBvcnRzLlNIT1dfQ0hJTEQgPSBleHBvcnRzLlNIT1dfUEFSRU5UID0gZXhwb3J0cy5TSE9XX0FMTCA9IHZvaWQgMDtcblxudmFyIF92YWx1ZVV0aWwgPSByZXF1aXJlKFwiLi92YWx1ZVV0aWxcIik7XG5cbnZhciBTSE9XX0FMTCA9ICdTSE9XX0FMTCc7XG5leHBvcnRzLlNIT1dfQUxMID0gU0hPV19BTEw7XG52YXIgU0hPV19QQVJFTlQgPSAnU0hPV19QQVJFTlQnO1xuZXhwb3J0cy5TSE9XX1BBUkVOVCA9IFNIT1dfUEFSRU5UO1xudmFyIFNIT1dfQ0hJTEQgPSAnU0hPV19DSElMRCc7XG5leHBvcnRzLlNIT1dfQ0hJTEQgPSBTSE9XX0NISUxEO1xuXG5mdW5jdGlvbiBmb3JtYXRTdHJhdGVneUtleXMoa2V5cywgc3RyYXRlZ3ksIGtleUVudGl0aWVzKSB7XG4gIHZhciBrZXlTZXQgPSBuZXcgU2V0KGtleXMpO1xuXG4gIGlmIChzdHJhdGVneSA9PT0gU0hPV19DSElMRCkge1xuICAgIHJldHVybiBrZXlzLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgZW50aXR5ID0ga2V5RW50aXRpZXNba2V5XTtcblxuICAgICAgaWYgKGVudGl0eSAmJiBlbnRpdHkuY2hpbGRyZW4gJiYgZW50aXR5LmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBub2RlID0gX3JlZi5ub2RlO1xuICAgICAgICByZXR1cm4gKDAsIF92YWx1ZVV0aWwuaXNDaGVja0Rpc2FibGVkKShub2RlKSB8fCBrZXlTZXQuaGFzKG5vZGUua2V5KTtcbiAgICAgIH0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoc3RyYXRlZ3kgPT09IFNIT1dfUEFSRU5UKSB7XG4gICAgcmV0dXJuIGtleXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1trZXldO1xuICAgICAgdmFyIHBhcmVudCA9IGVudGl0eSA/IGVudGl0eS5wYXJlbnQgOiBudWxsO1xuXG4gICAgICBpZiAocGFyZW50ICYmICEoMCwgX3ZhbHVlVXRpbC5pc0NoZWNrRGlzYWJsZWQpKHBhcmVudC5ub2RlKSAmJiBrZXlTZXQuaGFzKHBhcmVudC5ub2RlLmtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7XG5leHBvcnRzLmZpbmRWYWx1ZU9wdGlvbiA9IGZpbmRWYWx1ZU9wdGlvbjtcbmV4cG9ydHMuaXNWYWx1ZURpc2FibGVkID0gaXNWYWx1ZURpc2FibGVkO1xuZXhwb3J0cy5pc0NoZWNrRGlzYWJsZWQgPSBpc0NoZWNrRGlzYWJsZWQ7XG5leHBvcnRzLmZsYXR0ZW5PcHRpb25zID0gZmxhdHRlbk9wdGlvbnM7XG5leHBvcnRzLmZpbHRlck9wdGlvbnMgPSBmaWx0ZXJPcHRpb25zO1xuZXhwb3J0cy5nZXRSYXdWYWx1ZUxhYmVsZWQgPSBnZXRSYXdWYWx1ZUxhYmVsZWQ7XG5leHBvcnRzLmFkZFZhbHVlID0gYWRkVmFsdWU7XG5leHBvcnRzLnJlbW92ZVZhbHVlID0gcmVtb3ZlVmFsdWU7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF90cmVlVXRpbCA9IHJlcXVpcmUoXCJyYy10cmVlL2xpYi91dGlscy90cmVlVXRpbFwiKTtcblxudmFyIF9sZWdhY3lVdGlsID0gcmVxdWlyZShcIi4vbGVnYWN5VXRpbFwiKTtcblxuZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IFt2YWx1ZV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gZmluZFZhbHVlT3B0aW9uKHZhbHVlcywgb3B0aW9ucykge1xuICB2YXIgb3B0aW9uTWFwID0gbmV3IE1hcCgpO1xuICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKGZsYXR0ZW5JdGVtKSB7XG4gICAgdmFyIGRhdGEgPSBmbGF0dGVuSXRlbS5kYXRhO1xuICAgIG9wdGlvbk1hcC5zZXQoZGF0YS52YWx1ZSwgZGF0YSk7XG4gIH0pO1xuICByZXR1cm4gdmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICgwLCBfbGVnYWN5VXRpbC5maWxsTGVnYWN5UHJvcHMpKG9wdGlvbk1hcC5nZXQodmFsKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRGlzYWJsZWQodmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdGlvbiA9IGZpbmRWYWx1ZU9wdGlvbihbdmFsdWVdLCBvcHRpb25zKVswXTtcblxuICBpZiAob3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbi5kaXNhYmxlZDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNDaGVja0Rpc2FibGVkKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuZGlzYWJsZWQgfHwgbm9kZS5kaXNhYmxlQ2hlY2tib3ggfHwgbm9kZS5jaGVja2FibGUgPT09IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRMZXZlbChfcmVmKSB7XG4gIHZhciBwYXJlbnQgPSBfcmVmLnBhcmVudDtcbiAgdmFyIGxldmVsID0gMDtcbiAgdmFyIGN1cnJlbnQgPSBwYXJlbnQ7XG5cbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgbGV2ZWwgKz0gMTtcbiAgfVxuXG4gIHJldHVybiBsZXZlbDtcbn1cbi8qKlxuICogQmVmb3JlIHJldXNlIGByYy10cmVlYCBsb2dpYywgd2UgbmVlZCB0byBhZGQga2V5IHNpbmNlIFRyZWVTZWxlY3QgdXNlIGB2YWx1ZWAgaW5zdGVhZCBvZiBga2V5YC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGZsYXR0ZW5PcHRpb25zKG9wdGlvbnMpIHtcbiAgLy8gQWRkIG1pc3Npbmcga2V5XG4gIGZ1bmN0aW9uIGZpbGxLZXkobGlzdCkge1xuICAgIHJldHVybiAobGlzdCB8fCBbXSkubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgdmFsdWUgPSBub2RlLnZhbHVlLFxuICAgICAgICAgIGtleSA9IG5vZGUua2V5LFxuICAgICAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgIHZhciBjbG9uZSA9ICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIG5vZGUpLCB7fSwge1xuICAgICAgICBrZXk6ICdrZXknIGluIG5vZGUgPyBrZXkgOiB2YWx1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICBjbG9uZS5jaGlsZHJlbiA9IGZpbGxLZXkoY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgZmxhdHRlbkxpc3QgPSAoMCwgX3RyZWVVdGlsLmZsYXR0ZW5UcmVlRGF0YSkoZmlsbEtleShvcHRpb25zKSwgdHJ1ZSk7XG4gIHJldHVybiBmbGF0dGVuTGlzdC5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBub2RlLmRhdGEua2V5LFxuICAgICAgZGF0YTogbm9kZS5kYXRhLFxuICAgICAgbGV2ZWw6IGdldExldmVsKG5vZGUpXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRGaWx0ZXJPcHRpb24ob3B0aW9uRmlsdGVyUHJvcCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHNlYXJjaFZhbHVlLCBkYXRhTm9kZSkge1xuICAgIHZhciB2YWx1ZSA9IGRhdGFOb2RlW29wdGlvbkZpbHRlclByb3BdO1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoU3RyaW5nKHNlYXJjaFZhbHVlKS50b0xvd2VyQ2FzZSgpKTtcbiAgfTtcbn1cbi8qKiBGaWx0ZXIgb3B0aW9ucyBhbmQgcmV0dXJuIGEgbmV3IG9wdGlvbnMgYnkgdGhlIHNlYXJjaCB0ZXh0ICovXG5cblxuZnVuY3Rpb24gZmlsdGVyT3B0aW9ucyhzZWFyY2hWYWx1ZSwgb3B0aW9ucywgX3JlZjIpIHtcbiAgdmFyIG9wdGlvbkZpbHRlclByb3AgPSBfcmVmMi5vcHRpb25GaWx0ZXJQcm9wLFxuICAgICAgZmlsdGVyT3B0aW9uID0gX3JlZjIuZmlsdGVyT3B0aW9uO1xuXG4gIGlmIChmaWx0ZXJPcHRpb24gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICB2YXIgZmlsdGVyT3B0aW9uRnVuYztcblxuICBpZiAodHlwZW9mIGZpbHRlck9wdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZpbHRlck9wdGlvbkZ1bmMgPSBmaWx0ZXJPcHRpb247XG4gIH0gZWxzZSB7XG4gICAgZmlsdGVyT3B0aW9uRnVuYyA9IGdldERlZmF1bHRGaWx0ZXJPcHRpb24ob3B0aW9uRmlsdGVyUHJvcCk7XG4gIH1cblxuICBmdW5jdGlvbiBkaWcobGlzdCkge1xuICAgIHZhciBrZWVwQWxsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICByZXR1cm4gbGlzdC5tYXAoZnVuY3Rpb24gKGRhdGFOb2RlKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBkYXRhTm9kZS5jaGlsZHJlbjtcbiAgICAgIHZhciBtYXRjaCA9IGtlZXBBbGwgfHwgZmlsdGVyT3B0aW9uRnVuYyhzZWFyY2hWYWx1ZSwgKDAsIF9sZWdhY3lVdGlsLmZpbGxMZWdhY3lQcm9wcykoZGF0YU5vZGUpKTtcbiAgICAgIHZhciBjaGlsZExpc3QgPSBkaWcoY2hpbGRyZW4gfHwgW10sIG1hdGNoKTtcblxuICAgICAgaWYgKG1hdGNoIHx8IGNoaWxkTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGRhdGFOb2RlKSwge30sIHtcbiAgICAgICAgICBjaGlsZHJlbjogY2hpbGRMaXN0XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGRpZyhvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3VmFsdWVMYWJlbGVkKHZhbHVlcywgcHJldlZhbHVlLCBnZXRFbnRpdHlCeVZhbHVlLCBnZXRMYWJlbFByb3ApIHtcbiAgdmFyIHZhbHVlTWFwID0gbmV3IE1hcCgpO1xuICB0b0FycmF5KHByZXZWYWx1ZSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmIChpdGVtICYmICgwLCBfdHlwZW9mMi5kZWZhdWx0KShpdGVtKSA9PT0gJ29iamVjdCcgJiYgJ3ZhbHVlJyBpbiBpdGVtKSB7XG4gICAgICB2YWx1ZU1hcC5zZXQoaXRlbS52YWx1ZSwgaXRlbSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBpdGVtID0ge1xuICAgICAgdmFsdWU6IHZhbFxuICAgIH07XG4gICAgdmFyIGVudGl0eSA9IGdldEVudGl0eUJ5VmFsdWUodmFsLCAnc2VsZWN0JywgdHJ1ZSk7XG4gICAgdmFyIGxhYmVsID0gZW50aXR5ID8gZ2V0TGFiZWxQcm9wKGVudGl0eS5kYXRhKSA6IHZhbDtcblxuICAgIGlmICh2YWx1ZU1hcC5oYXModmFsKSkge1xuICAgICAgdmFyIGxhYmVsZWRWYWx1ZSA9IHZhbHVlTWFwLmdldCh2YWwpO1xuICAgICAgaXRlbS5sYWJlbCA9ICdsYWJlbCcgaW4gbGFiZWxlZFZhbHVlID8gbGFiZWxlZFZhbHVlLmxhYmVsIDogbGFiZWw7XG5cbiAgICAgIGlmICgnaGFsZkNoZWNrZWQnIGluIGxhYmVsZWRWYWx1ZSkge1xuICAgICAgICBpdGVtLmhhbGZDaGVja2VkID0gbGFiZWxlZFZhbHVlLmhhbGZDaGVja2VkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtLmxhYmVsID0gbGFiZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRWYWx1ZShyYXdWYWx1ZXMsIHZhbHVlKSB7XG4gIHZhciB2YWx1ZXMgPSBuZXcgU2V0KHJhd1ZhbHVlcyk7XG4gIHZhbHVlcy5hZGQodmFsdWUpO1xuICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZXMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVWYWx1ZShyYXdWYWx1ZXMsIHZhbHVlKSB7XG4gIHZhciB2YWx1ZXMgPSBuZXcgU2V0KHJhd1ZhbHVlcyk7XG4gIHZhbHVlcy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZXMpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIikpO1xuXG52YXIgX3dhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi93YXJuaW5nXCIpKTtcblxudmFyIF92YWx1ZVV0aWwgPSByZXF1aXJlKFwiLi92YWx1ZVV0aWxcIik7XG5cbmZ1bmN0aW9uIHdhcm5pbmdQcm9wcyhwcm9wcykge1xuICB2YXIgc2VhcmNoUGxhY2Vob2xkZXIgPSBwcm9wcy5zZWFyY2hQbGFjZWhvbGRlcixcbiAgICAgIHRyZWVDaGVja1N0cmljdGx5ID0gcHJvcHMudHJlZUNoZWNrU3RyaWN0bHksXG4gICAgICB0cmVlQ2hlY2thYmxlID0gcHJvcHMudHJlZUNoZWNrYWJsZSxcbiAgICAgIGxhYmVsSW5WYWx1ZSA9IHByb3BzLmxhYmVsSW5WYWx1ZSxcbiAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICBtdWx0aXBsZSA9IHByb3BzLm11bHRpcGxlO1xuICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoIXNlYXJjaFBsYWNlaG9sZGVyLCAnYHNlYXJjaFBsYWNlaG9sZGVyYCBoYXMgYmVlbiByZW1vdmVkLicpO1xuXG4gIGlmICh0cmVlQ2hlY2tTdHJpY3RseSAmJiBsYWJlbEluVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCAnYHRyZWVDaGVja1N0cmljdGx5YCB3aWxsIGZvcmNlIHNldCBgbGFiZWxJblZhbHVlYCB0byBgdHJ1ZWAuJyk7XG4gIH1cblxuICBpZiAobGFiZWxJblZhbHVlIHx8IHRyZWVDaGVja1N0cmljdGx5KSB7XG4gICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKCgwLCBfdmFsdWVVdGlsLnRvQXJyYXkpKHZhbHVlKS5ldmVyeShmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gdmFsICYmICgwLCBfdHlwZW9mMi5kZWZhdWx0KSh2YWwpID09PSAnb2JqZWN0JyAmJiAndmFsdWUnIGluIHZhbDtcbiAgICB9KSwgJ0ludmFsaWQgcHJvcCBgdmFsdWVgIHN1cHBsaWVkIHRvIGBUcmVlU2VsZWN0YC4gWW91IHNob3VsZCB1c2UgeyBsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH0gb3IgW3sgbGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB9XSBpbnN0ZWFkLicpO1xuICB9XG5cbiAgaWYgKHRyZWVDaGVja1N0cmljdGx5IHx8IG11bHRpcGxlIHx8IHRyZWVDaGVja2FibGUpIHtcbiAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoIXZhbHVlIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpLCAnYHZhbHVlYCBzaG91bGQgYmUgYW4gYXJyYXkgd2hlbiBgVHJlZVNlbGVjdGAgaXMgY2hlY2thYmxlIG9yIG11bHRpcGxlLicpO1xuICB9IGVsc2Uge1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KSghQXJyYXkuaXNBcnJheSh2YWx1ZSksICdgdmFsdWVgIHNob3VsZCBub3QgYmUgYXJyYXkgd2hlbiBgVHJlZVNlbGVjdGAgaXMgc2luZ2xlIG1vZGUuJyk7XG4gIH1cbn1cblxudmFyIF9kZWZhdWx0ID0gd2FybmluZ1Byb3BzO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIEluZGVudCA9IGZ1bmN0aW9uIEluZGVudChfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIGxldmVsID0gX3JlZi5sZXZlbCxcbiAgICAgIGlzU3RhcnQgPSBfcmVmLmlzU3RhcnQsXG4gICAgICBpc0VuZCA9IF9yZWYuaXNFbmQ7XG5cbiAgaWYgKCFsZXZlbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGJhc2VDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWluZGVudC11bml0XCIpO1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGV2ZWw7IGkgKz0gMSkge1xuICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgIGxpc3QucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBrZXk6IGksXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShiYXNlQ2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMgPSB7fSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGJhc2VDbGFzc05hbWUsIFwiLXN0YXJ0XCIpLCBpc1N0YXJ0W2kgKyAxXSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1lbmRcIiksIGlzRW5kW2kgKyAxXSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1lbmQtZmlyc3QtbGV2ZWxcIiksICFpICYmIGlzRW5kWzBdKSwgX2NsYXNzTmFtZXMpKVxuICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5kZW50XCIpXG4gIH0sIGxpc3QpO1xufTtcblxudmFyIF9kZWZhdWx0ID0gSW5kZW50O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcmNNb3Rpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1tb3Rpb25cIikpO1xuXG52YXIgX1RyZWVOb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UcmVlTm9kZVwiKSk7XG5cbnZhciBfdHJlZVV0aWwgPSByZXF1aXJlKFwiLi91dGlscy90cmVlVXRpbFwiKTtcblxudmFyIF9jb250ZXh0VHlwZXMgPSByZXF1aXJlKFwiLi9jb250ZXh0VHlwZXNcIik7XG5cbnZhciBNb3Rpb25UcmVlTm9kZSA9IGZ1bmN0aW9uIE1vdGlvblRyZWVOb2RlKF9yZWYsIHJlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgICBtb3Rpb24gPSBfcmVmLm1vdGlvbixcbiAgICAgIG1vdGlvbk5vZGVzID0gX3JlZi5tb3Rpb25Ob2RlcyxcbiAgICAgIG1vdGlvblR5cGUgPSBfcmVmLm1vdGlvblR5cGUsXG4gICAgICBvbk9yaWdpbk1vdGlvblN0YXJ0ID0gX3JlZi5vbk1vdGlvblN0YXJ0LFxuICAgICAgb25PcmlnaW5Nb3Rpb25FbmQgPSBfcmVmLm9uTW90aW9uRW5kLFxuICAgICAgYWN0aXZlID0gX3JlZi5hY3RpdmUsXG4gICAgICB0cmVlTm9kZVJlcXVpcmVkUHJvcHMgPSBfcmVmLnRyZWVOb2RlUmVxdWlyZWRQcm9wcyxcbiAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3JlZiwgW1wiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJtb3Rpb25cIiwgXCJtb3Rpb25Ob2Rlc1wiLCBcIm1vdGlvblR5cGVcIiwgXCJvbk1vdGlvblN0YXJ0XCIsIFwib25Nb3Rpb25FbmRcIiwgXCJhY3RpdmVcIiwgXCJ0cmVlTm9kZVJlcXVpcmVkUHJvcHNcIl0pO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh0cnVlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICB2aXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbnRleHRUeXBlcy5UcmVlQ29udGV4dCksXG4gICAgICBwcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHM7XG5cbiAgdmFyIG1vdGlvbmVkUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcblxuICB2YXIgb25Nb3Rpb25FbmQgPSBmdW5jdGlvbiBvbk1vdGlvbkVuZCgpIHtcbiAgICBpZiAoIW1vdGlvbmVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIG9uT3JpZ2luTW90aW9uRW5kKCk7XG4gICAgfVxuXG4gICAgbW90aW9uZWRSZWYuY3VycmVudCA9IHRydWU7XG4gIH07XG5cbiAgKDAsIFJlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtb3Rpb25Ob2RlcyAmJiBtb3Rpb25UeXBlID09PSAnaGlkZScgJiYgdmlzaWJsZSkge1xuICAgICAgc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgfVxuICB9LCBbbW90aW9uTm9kZXNdKTtcbiAgKDAsIFJlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIC8vIFRyaWdnZXIgbW90aW9uIG9ubHkgd2hlbiBwYXRjaGVkXG4gICAgaWYgKG1vdGlvbk5vZGVzKSB7XG4gICAgICBvbk9yaWdpbk1vdGlvblN0YXJ0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtb3Rpb25Ob2Rlcykge1xuICAgICAgICBvbk1vdGlvbkVuZCgpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcblxuICBpZiAobW90aW9uTm9kZXMpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfcmNNb3Rpb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICByZWY6IHJlZixcbiAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICB9LCBtb3Rpb24sIHtcbiAgICAgIG1vdGlvbkFwcGVhcjogbW90aW9uVHlwZSA9PT0gJ3Nob3cnLFxuICAgICAgb25BcHBlYXJFbmQ6IG9uTW90aW9uRW5kLFxuICAgICAgb25MZWF2ZUVuZDogb25Nb3Rpb25FbmRcbiAgICB9KSwgZnVuY3Rpb24gKF9yZWYyLCBtb3Rpb25SZWYpIHtcbiAgICAgIHZhciBtb3Rpb25DbGFzc05hbWUgPSBfcmVmMi5jbGFzc05hbWUsXG4gICAgICAgICAgbW90aW9uU3R5bGUgPSBfcmVmMi5zdHlsZTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBtb3Rpb25SZWYsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJlZW5vZGUtbW90aW9uXCIpLCBtb3Rpb25DbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogbW90aW9uU3R5bGVcbiAgICAgIH0sIG1vdGlvbk5vZGVzLm1hcChmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICAgICAgdmFyIF90cmVlTm9kZSRkYXRhID0gdHJlZU5vZGUuZGF0YSxcbiAgICAgICAgICAgIGtleSA9IF90cmVlTm9kZSRkYXRhLmtleSxcbiAgICAgICAgICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF90cmVlTm9kZSRkYXRhLCBbXCJrZXlcIl0pLFxuICAgICAgICAgICAgaXNTdGFydCA9IHRyZWVOb2RlLmlzU3RhcnQsXG4gICAgICAgICAgICBpc0VuZCA9IHRyZWVOb2RlLmlzRW5kO1xuICAgICAgICBkZWxldGUgcmVzdFByb3BzLmNoaWxkcmVuO1xuICAgICAgICB2YXIgdHJlZU5vZGVQcm9wcyA9ICgwLCBfdHJlZVV0aWwuZ2V0VHJlZU5vZGVQcm9wcykoa2V5LCB0cmVlTm9kZVJlcXVpcmVkUHJvcHMpO1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfVHJlZU5vZGUuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcmVzdFByb3BzLCB0cmVlTm9kZVByb3BzLCB7XG4gICAgICAgICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgICAgICAgZGF0YTogdHJlZU5vZGUuZGF0YSxcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICBpc1N0YXJ0OiBpc1N0YXJ0LFxuICAgICAgICAgIGlzRW5kOiBpc0VuZFxuICAgICAgICB9KSk7XG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfVHJlZU5vZGUuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7XG4gICAgZG9tUmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzLCB7XG4gICAgYWN0aXZlOiBhY3RpdmVcbiAgfSkpO1xufTtcblxuTW90aW9uVHJlZU5vZGUuZGlzcGxheU5hbWUgPSAnTW90aW9uVHJlZU5vZGUnO1xudmFyIFJlZk1vdGlvblRyZWVOb2RlID0gUmVhY3QuZm9yd2FyZFJlZihNb3Rpb25UcmVlTm9kZSk7XG52YXIgX2RlZmF1bHQgPSBSZWZNb3Rpb25UcmVlTm9kZTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0TWluaW11bVJhbmdlVHJhbnNpdGlvblJhbmdlID0gZ2V0TWluaW11bVJhbmdlVHJhbnNpdGlvblJhbmdlO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5Nb3Rpb25FbnRpdHkgPSBleHBvcnRzLk1PVElPTl9LRVkgPSB2b2lkIDA7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JjVmlydHVhbExpc3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy12aXJ0dWFsLWxpc3RcIikpO1xuXG52YXIgX01vdGlvblRyZWVOb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Nb3Rpb25UcmVlTm9kZVwiKSk7XG5cbnZhciBfZGlmZlV0aWwgPSByZXF1aXJlKFwiLi91dGlscy9kaWZmVXRpbFwiKTtcblxudmFyIF90cmVlVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL3RyZWVVdGlsXCIpO1xuXG4vKipcbiAqIEhhbmRsZSB2aXJ0dWFsIGxpc3Qgb2YgdGhlIFRyZWVOb2Rlcy5cbiAqL1xudmFyIEhJRERFTl9TVFlMRSA9IHtcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIG9wYWNpdHk6IDAsXG4gIGJvcmRlcjogMCxcbiAgcGFkZGluZzogMCxcbiAgbWFyZ2luOiAwXG59O1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcblxudmFyIE1PVElPTl9LRVkgPSBcIlJDX1RSRUVfTU9USU9OX1wiLmNvbmNhdChNYXRoLnJhbmRvbSgpKTtcbmV4cG9ydHMuTU9USU9OX0tFWSA9IE1PVElPTl9LRVk7XG52YXIgTW90aW9uTm9kZSA9IHtcbiAga2V5OiBNT1RJT05fS0VZXG59O1xudmFyIE1vdGlvbkVudGl0eSA9IHtcbiAga2V5OiBNT1RJT05fS0VZLFxuICBsZXZlbDogMCxcbiAgaW5kZXg6IDAsXG4gIHBvczogJzAnLFxuICBub2RlOiBNb3Rpb25Ob2RlXG59O1xuZXhwb3J0cy5Nb3Rpb25FbnRpdHkgPSBNb3Rpb25FbnRpdHk7XG52YXIgTW90aW9uRmxhdHRlbkRhdGEgPSB7XG4gIHBhcmVudDogbnVsbCxcbiAgY2hpbGRyZW46IFtdLFxuICBwb3M6IE1vdGlvbkVudGl0eS5wb3MsXG4gIGRhdGE6IE1vdGlvbk5vZGUsXG5cbiAgLyoqIEhvbGQgZW1wdHkgbGlzdCBoZXJlIHNpbmNlIHdlIGRvIG5vdCB1c2UgaXQgKi9cbiAgaXNTdGFydDogW10sXG4gIGlzRW5kOiBbXVxufTtcbi8qKlxuICogV2Ugb25seSBuZWVkIGdldCB2aXNpYmxlIGNvbnRlbnQgaXRlbXMgdG8gcGxheSB0aGUgYW5pbWF0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGdldE1pbmltdW1SYW5nZVRyYW5zaXRpb25SYW5nZShsaXN0LCB2aXJ0dWFsLCBoZWlnaHQsIGl0ZW1IZWlnaHQpIHtcbiAgaWYgKHZpcnR1YWwgPT09IGZhbHNlIHx8ICFoZWlnaHQpIHtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHJldHVybiBsaXN0LnNsaWNlKDAsIE1hdGguY2VpbChoZWlnaHQgLyBpdGVtSGVpZ2h0KSArIDEpO1xufVxuXG5mdW5jdGlvbiBpdGVtS2V5KGl0ZW0pIHtcbiAgdmFyIGtleSA9IGl0ZW0uZGF0YS5rZXksXG4gICAgICBwb3MgPSBpdGVtLnBvcztcbiAgcmV0dXJuICgwLCBfdHJlZVV0aWwuZ2V0S2V5KShrZXksIHBvcyk7XG59XG5cbmZ1bmN0aW9uIGdldEFjY2Vzc2liaWxpdHlQYXRoKGl0ZW0pIHtcbiAgdmFyIHBhdGggPSBTdHJpbmcoaXRlbS5kYXRhLmtleSk7XG4gIHZhciBjdXJyZW50ID0gaXRlbTtcblxuICB3aGlsZSAoY3VycmVudC5wYXJlbnQpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgcGF0aCA9IFwiXCIuY29uY2F0KGN1cnJlbnQuZGF0YS5rZXksIFwiID4gXCIpLmNvbmNhdChwYXRoKTtcbiAgfVxuXG4gIHJldHVybiBwYXRoO1xufVxuXG52YXIgUmVmTm9kZUxpc3QgPSBmdW5jdGlvbiBSZWZOb2RlTGlzdChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICAgIHNlbGVjdGFibGUgPSBwcm9wcy5zZWxlY3RhYmxlLFxuICAgICAgY2hlY2thYmxlID0gcHJvcHMuY2hlY2thYmxlLFxuICAgICAgZXhwYW5kZWRLZXlzID0gcHJvcHMuZXhwYW5kZWRLZXlzLFxuICAgICAgc2VsZWN0ZWRLZXlzID0gcHJvcHMuc2VsZWN0ZWRLZXlzLFxuICAgICAgY2hlY2tlZEtleXMgPSBwcm9wcy5jaGVja2VkS2V5cyxcbiAgICAgIGxvYWRlZEtleXMgPSBwcm9wcy5sb2FkZWRLZXlzLFxuICAgICAgbG9hZGluZ0tleXMgPSBwcm9wcy5sb2FkaW5nS2V5cyxcbiAgICAgIGhhbGZDaGVja2VkS2V5cyA9IHByb3BzLmhhbGZDaGVja2VkS2V5cyxcbiAgICAgIGtleUVudGl0aWVzID0gcHJvcHMua2V5RW50aXRpZXMsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZHJhZ2dpbmcgPSBwcm9wcy5kcmFnZ2luZyxcbiAgICAgIGRyYWdPdmVyTm9kZUtleSA9IHByb3BzLmRyYWdPdmVyTm9kZUtleSxcbiAgICAgIGRyb3BQb3NpdGlvbiA9IHByb3BzLmRyb3BQb3NpdGlvbixcbiAgICAgIG1vdGlvbiA9IHByb3BzLm1vdGlvbixcbiAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgIGl0ZW1IZWlnaHQgPSBwcm9wcy5pdGVtSGVpZ2h0LFxuICAgICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgICBmb2N1c2FibGUgPSBwcm9wcy5mb2N1c2FibGUsXG4gICAgICBhY3RpdmVJdGVtID0gcHJvcHMuYWN0aXZlSXRlbSxcbiAgICAgIGZvY3VzZWQgPSBwcm9wcy5mb2N1c2VkLFxuICAgICAgdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleCxcbiAgICAgIG9uS2V5RG93biA9IHByb3BzLm9uS2V5RG93bixcbiAgICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgICAgb25CbHVyID0gcHJvcHMub25CbHVyLFxuICAgICAgb25BY3RpdmVDaGFuZ2UgPSBwcm9wcy5vbkFjdGl2ZUNoYW5nZSxcbiAgICAgIG9uTGlzdENoYW5nZVN0YXJ0ID0gcHJvcHMub25MaXN0Q2hhbmdlU3RhcnQsXG4gICAgICBvbkxpc3RDaGFuZ2VFbmQgPSBwcm9wcy5vbkxpc3RDaGFuZ2VFbmQsXG4gICAgICBkb21Qcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJkYXRhXCIsIFwic2VsZWN0YWJsZVwiLCBcImNoZWNrYWJsZVwiLCBcImV4cGFuZGVkS2V5c1wiLCBcInNlbGVjdGVkS2V5c1wiLCBcImNoZWNrZWRLZXlzXCIsIFwibG9hZGVkS2V5c1wiLCBcImxvYWRpbmdLZXlzXCIsIFwiaGFsZkNoZWNrZWRLZXlzXCIsIFwia2V5RW50aXRpZXNcIiwgXCJkaXNhYmxlZFwiLCBcImRyYWdnaW5nXCIsIFwiZHJhZ092ZXJOb2RlS2V5XCIsIFwiZHJvcFBvc2l0aW9uXCIsIFwibW90aW9uXCIsIFwiaGVpZ2h0XCIsIFwiaXRlbUhlaWdodFwiLCBcInZpcnR1YWxcIiwgXCJmb2N1c2FibGVcIiwgXCJhY3RpdmVJdGVtXCIsIFwiZm9jdXNlZFwiLCBcInRhYkluZGV4XCIsIFwib25LZXlEb3duXCIsIFwib25Gb2N1c1wiLCBcIm9uQmx1clwiLCBcIm9uQWN0aXZlQ2hhbmdlXCIsIFwib25MaXN0Q2hhbmdlU3RhcnRcIiwgXCJvbkxpc3RDaGFuZ2VFbmRcIl0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBsaXN0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oc2Nyb2xsKSB7XG4gICAgICAgIGxpc3RSZWYuY3VycmVudC5zY3JvbGxUbyhzY3JvbGwpO1xuICAgICAgfVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShleHBhbmRlZEtleXMpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHByZXZFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0UHJldkV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShkYXRhKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgICAgcHJldkRhdGEgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0UHJldkRhdGEgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUoZGF0YSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU2ID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICAgIHRyYW5zaXRpb25EYXRhID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICAgIHNldFRyYW5zaXRpb25EYXRhID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlNyA9IFJlYWN0LnVzZVN0YXRlKFtdKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTggPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZTcsIDIpLFxuICAgICAgdHJhbnNpdGlvblJhbmdlID0gX1JlYWN0JHVzZVN0YXRlOFswXSxcbiAgICAgIHNldFRyYW5zaXRpb25SYW5nZSA9IF9SZWFjdCR1c2VTdGF0ZThbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTkgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTEwID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfUmVhY3QkdXNlU3RhdGU5LCAyKSxcbiAgICAgIG1vdGlvblR5cGUgPSBfUmVhY3QkdXNlU3RhdGUxMFswXSxcbiAgICAgIHNldE1vdGlvblR5cGUgPSBfUmVhY3QkdXNlU3RhdGUxMFsxXTtcblxuICBmdW5jdGlvbiBvbk1vdGlvbkVuZCgpIHtcbiAgICBzZXRQcmV2RGF0YShkYXRhKTtcbiAgICBzZXRUcmFuc2l0aW9uRGF0YShkYXRhKTtcbiAgICBzZXRUcmFuc2l0aW9uUmFuZ2UoW10pO1xuICAgIHNldE1vdGlvblR5cGUobnVsbCk7XG4gICAgb25MaXN0Q2hhbmdlRW5kKCk7XG4gIH0gLy8gRG8gYW5pbWF0aW9uIGlmIGV4cGFuZGVkIGtleXMgY2hhbmdlZFxuXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRQcmV2RXhwYW5kZWRLZXlzKGV4cGFuZGVkS2V5cyk7XG4gICAgdmFyIGRpZmZFeHBhbmRlZCA9ICgwLCBfZGlmZlV0aWwuZmluZEV4cGFuZGVkS2V5cykocHJldkV4cGFuZGVkS2V5cywgZXhwYW5kZWRLZXlzKTtcblxuICAgIGlmIChkaWZmRXhwYW5kZWQua2V5ICE9PSBudWxsKSB7XG4gICAgICBpZiAoZGlmZkV4cGFuZGVkLmFkZCkge1xuICAgICAgICB2YXIga2V5SW5kZXggPSBwcmV2RGF0YS5maW5kSW5kZXgoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3JlZi5kYXRhLmtleTtcbiAgICAgICAgICByZXR1cm4ga2V5ID09PSBkaWZmRXhwYW5kZWQua2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJhbmdlTm9kZXMgPSBnZXRNaW5pbXVtUmFuZ2VUcmFuc2l0aW9uUmFuZ2UoKDAsIF9kaWZmVXRpbC5nZXRFeHBhbmRSYW5nZSkocHJldkRhdGEsIGRhdGEsIGRpZmZFeHBhbmRlZC5rZXkpLCB2aXJ0dWFsLCBoZWlnaHQsIGl0ZW1IZWlnaHQpO1xuICAgICAgICB2YXIgbmV3VHJhbnNpdGlvbkRhdGEgPSBwcmV2RGF0YS5zbGljZSgpO1xuICAgICAgICBuZXdUcmFuc2l0aW9uRGF0YS5zcGxpY2Uoa2V5SW5kZXggKyAxLCAwLCBNb3Rpb25GbGF0dGVuRGF0YSk7XG4gICAgICAgIHNldFRyYW5zaXRpb25EYXRhKG5ld1RyYW5zaXRpb25EYXRhKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvblJhbmdlKHJhbmdlTm9kZXMpO1xuICAgICAgICBzZXRNb3Rpb25UeXBlKCdzaG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX2tleUluZGV4ID0gZGF0YS5maW5kSW5kZXgoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIGtleSA9IF9yZWYyLmRhdGEua2V5O1xuICAgICAgICAgIHJldHVybiBrZXkgPT09IGRpZmZFeHBhbmRlZC5rZXk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfcmFuZ2VOb2RlcyA9IGdldE1pbmltdW1SYW5nZVRyYW5zaXRpb25SYW5nZSgoMCwgX2RpZmZVdGlsLmdldEV4cGFuZFJhbmdlKShkYXRhLCBwcmV2RGF0YSwgZGlmZkV4cGFuZGVkLmtleSksIHZpcnR1YWwsIGhlaWdodCwgaXRlbUhlaWdodCk7XG5cbiAgICAgICAgdmFyIF9uZXdUcmFuc2l0aW9uRGF0YSA9IGRhdGEuc2xpY2UoKTtcblxuICAgICAgICBfbmV3VHJhbnNpdGlvbkRhdGEuc3BsaWNlKF9rZXlJbmRleCArIDEsIDAsIE1vdGlvbkZsYXR0ZW5EYXRhKTtcblxuICAgICAgICBzZXRUcmFuc2l0aW9uRGF0YShfbmV3VHJhbnNpdGlvbkRhdGEpO1xuICAgICAgICBzZXRUcmFuc2l0aW9uUmFuZ2UoX3JhbmdlTm9kZXMpO1xuICAgICAgICBzZXRNb3Rpb25UeXBlKCdoaWRlJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcmV2RGF0YSAhPT0gZGF0YSkge1xuICAgICAgLy8gSWYgd2hvbGUgZGF0YSBjaGFuZ2VkLCB3ZSBqdXN0IHJlZnJlc2ggdGhlIGxpc3RcbiAgICAgIHNldFByZXZEYXRhKGRhdGEpO1xuICAgICAgc2V0VHJhbnNpdGlvbkRhdGEoZGF0YSk7XG4gICAgfVxuICB9LCBbZXhwYW5kZWRLZXlzLCBkYXRhXSk7IC8vIFdlIHNob3VsZCBjbGVhbiB1cCBtb3Rpb24gaWYgaXMgY2hhbmdlZCBieSBkcmFnZ2luZ1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFkcmFnZ2luZykge1xuICAgICAgb25Nb3Rpb25FbmQoKTtcbiAgICB9XG4gIH0sIFtkcmFnZ2luZ10pO1xuICB2YXIgbWVyZ2VkRGF0YSA9IG1vdGlvbiA/IHRyYW5zaXRpb25EYXRhIDogZGF0YTtcbiAgdmFyIHRyZWVOb2RlUmVxdWlyZWRQcm9wcyA9IHtcbiAgICBleHBhbmRlZEtleXM6IGV4cGFuZGVkS2V5cyxcbiAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5cyxcbiAgICBsb2FkZWRLZXlzOiBsb2FkZWRLZXlzLFxuICAgIGxvYWRpbmdLZXlzOiBsb2FkaW5nS2V5cyxcbiAgICBjaGVja2VkS2V5czogY2hlY2tlZEtleXMsXG4gICAgaGFsZkNoZWNrZWRLZXlzOiBoYWxmQ2hlY2tlZEtleXMsXG4gICAgZHJhZ092ZXJOb2RlS2V5OiBkcmFnT3Zlck5vZGVLZXksXG4gICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb24sXG4gICAga2V5RW50aXRpZXM6IGtleUVudGl0aWVzXG4gIH07XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBmb2N1c2VkICYmIGFjdGl2ZUl0ZW0gJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHN0eWxlOiBISURERU5fU1RZTEUsXG4gICAgXCJhcmlhLWxpdmVcIjogXCJhc3NlcnRpdmVcIlxuICB9LCBnZXRBY2Nlc3NpYmlsaXR5UGF0aChhY3RpdmVJdGVtKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJvbGU6IFwidHJlZVwiXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7XG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRSxcbiAgICBkaXNhYmxlZDogZm9jdXNhYmxlID09PSBmYWxzZSB8fCBkaXNhYmxlZCxcbiAgICB0YWJJbmRleDogZm9jdXNhYmxlICE9PSBmYWxzZSA/IHRhYkluZGV4IDogbnVsbCxcbiAgICBvbktleURvd246IG9uS2V5RG93bixcbiAgICBvbkZvY3VzOiBvbkZvY3VzLFxuICAgIG9uQmx1cjogb25CbHVyLFxuICAgIHZhbHVlOiBcIlwiLFxuICAgIG9uQ2hhbmdlOiBub29wXG4gIH0pKSwgUmVhY3QuY3JlYXRlRWxlbWVudChfcmNWaXJ0dWFsTGlzdC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBkb21Qcm9wcywge1xuICAgIGRhdGE6IG1lcmdlZERhdGEsXG4gICAgaXRlbUtleTogaXRlbUtleSxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBmdWxsSGVpZ2h0OiBmYWxzZSxcbiAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgIGl0ZW1IZWlnaHQ6IGl0ZW1IZWlnaHQsXG4gICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3RcIiksXG4gICAgcmVmOiBsaXN0UmVmXG4gIH0pLCBmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICB2YXIgcG9zID0gdHJlZU5vZGUucG9zLFxuICAgICAgICBfdHJlZU5vZGUkZGF0YSA9IHRyZWVOb2RlLmRhdGEsXG4gICAgICAgIGtleSA9IF90cmVlTm9kZSRkYXRhLmtleSxcbiAgICAgICAgcmVzdFByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIuZGVmYXVsdCkoX3RyZWVOb2RlJGRhdGEsIFtcImtleVwiXSksXG4gICAgICAgIGlzU3RhcnQgPSB0cmVlTm9kZS5pc1N0YXJ0LFxuICAgICAgICBpc0VuZCA9IHRyZWVOb2RlLmlzRW5kO1xuICAgIHZhciBtZXJnZWRLZXkgPSAoMCwgX3RyZWVVdGlsLmdldEtleSkoa2V5LCBwb3MpO1xuICAgIGRlbGV0ZSByZXN0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIHRyZWVOb2RlUHJvcHMgPSAoMCwgX3RyZWVVdGlsLmdldFRyZWVOb2RlUHJvcHMpKG1lcmdlZEtleSwgdHJlZU5vZGVSZXF1aXJlZFByb3BzKTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfTW90aW9uVHJlZU5vZGUuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcmVzdFByb3BzLCB0cmVlTm9kZVByb3BzLCB7XG4gICAgICBhY3RpdmU6IGFjdGl2ZUl0ZW0gJiYga2V5ID09PSBhY3RpdmVJdGVtLmRhdGEua2V5LFxuICAgICAgcG9zOiBwb3MsXG4gICAgICBkYXRhOiB0cmVlTm9kZS5kYXRhLFxuICAgICAgaXNTdGFydDogaXNTdGFydCxcbiAgICAgIGlzRW5kOiBpc0VuZCxcbiAgICAgIG1vdGlvbjogbW90aW9uLFxuICAgICAgbW90aW9uTm9kZXM6IGtleSA9PT0gTU9USU9OX0tFWSA/IHRyYW5zaXRpb25SYW5nZSA6IG51bGwsXG4gICAgICBtb3Rpb25UeXBlOiBtb3Rpb25UeXBlLFxuICAgICAgb25Nb3Rpb25TdGFydDogb25MaXN0Q2hhbmdlU3RhcnQsXG4gICAgICBvbk1vdGlvbkVuZDogb25Nb3Rpb25FbmQsXG4gICAgICB0cmVlTm9kZVJlcXVpcmVkUHJvcHM6IHRyZWVOb2RlUmVxdWlyZWRQcm9wcyxcbiAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiBvbk1vdXNlTW92ZSgpIHtcbiAgICAgICAgb25BY3RpdmVDaGFuZ2UobnVsbCk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9KSk7XG59O1xuXG52YXIgTm9kZUxpc3QgPSBSZWFjdC5mb3J3YXJkUmVmKFJlZk5vZGVMaXN0KTtcbk5vZGVMaXN0LmRpc3BsYXlOYW1lID0gJ05vZGVMaXN0JztcbnZhciBfZGVmYXVsdCA9IE5vZGVMaXN0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2NvbnRleHRUeXBlcyA9IHJlcXVpcmUoXCIuL2NvbnRleHRUeXBlc1wiKTtcblxudmFyIF91dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxudmFyIF90cmVlVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL3RyZWVVdGlsXCIpO1xuXG52YXIgX05vZGVMaXN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vTm9kZUxpc3RcIikpO1xuXG52YXIgX1RyZWVOb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UcmVlTm9kZVwiKSk7XG5cbnZhciBfY29uZHVjdFV0aWwgPSByZXF1aXJlKFwiLi91dGlscy9jb25kdWN0VXRpbFwiKTtcblxuLy8gVE9ETzogaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTcvTk9URS13YWktYXJpYS1wcmFjdGljZXMtMS4xLTIwMTcxMjE0L2V4YW1wbGVzL3RyZWV2aWV3L3RyZWV2aWV3LTIvdHJlZXZpZXctMmEuaHRtbFxuLy8gRnVsbHkgYWNjZXNzaWJpbGl0eSBzdXBwb3J0XG52YXIgVHJlZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShUcmVlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gKDAsIF9jcmVhdGVTdXBlcjIuZGVmYXVsdCkoVHJlZSk7XG5cbiAgZnVuY3Rpb24gVHJlZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBUcmVlKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAga2V5RW50aXRpZXM6IHt9LFxuICAgICAgc2VsZWN0ZWRLZXlzOiBbXSxcbiAgICAgIGNoZWNrZWRLZXlzOiBbXSxcbiAgICAgIGhhbGZDaGVja2VkS2V5czogW10sXG4gICAgICBsb2FkZWRLZXlzOiBbXSxcbiAgICAgIGxvYWRpbmdLZXlzOiBbXSxcbiAgICAgIGV4cGFuZGVkS2V5czogW10sXG4gICAgICBkcmFnZ2luZzogZmFsc2UsXG4gICAgICBkcmFnTm9kZXNLZXlzOiBbXSxcbiAgICAgIGRyYWdPdmVyTm9kZUtleTogbnVsbCxcbiAgICAgIGRyb3BQb3NpdGlvbjogbnVsbCxcbiAgICAgIHRyZWVEYXRhOiBbXSxcbiAgICAgIGZsYXR0ZW5Ob2RlczogW10sXG4gICAgICBmb2N1c2VkOiBmYWxzZSxcbiAgICAgIGFjdGl2ZUtleTogbnVsbCxcbiAgICAgIGxpc3RDaGFuZ2luZzogZmFsc2UsXG4gICAgICBwcmV2UHJvcHM6IG51bGxcbiAgICB9O1xuICAgIF90aGlzLmxpc3RSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcblxuICAgIF90aGlzLm9uTm9kZURyYWdTdGFydCA9IGZ1bmN0aW9uIChldmVudCwgbm9kZSkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGUuZXhwYW5kZWRLZXlzLFxuICAgICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGUua2V5RW50aXRpZXM7XG4gICAgICB2YXIgb25EcmFnU3RhcnQgPSBfdGhpcy5wcm9wcy5vbkRyYWdTdGFydDtcbiAgICAgIHZhciBldmVudEtleSA9IG5vZGUucHJvcHMuZXZlbnRLZXk7XG4gICAgICBfdGhpcy5kcmFnTm9kZSA9IG5vZGU7XG4gICAgICB2YXIgbmV3RXhwYW5kZWRLZXlzID0gKDAsIF91dGlsLmFyckRlbCkoZXhwYW5kZWRLZXlzLCBldmVudEtleSk7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmc6IHRydWUsXG4gICAgICAgIGRyYWdOb2Rlc0tleXM6ICgwLCBfdXRpbC5nZXREcmFnTm9kZXNLZXlzKShldmVudEtleSwga2V5RW50aXRpZXMpXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMuc2V0RXhwYW5kZWRLZXlzKG5ld0V4cGFuZGVkS2V5cyk7XG5cbiAgICAgIGlmIChvbkRyYWdTdGFydCkge1xuICAgICAgICBvbkRyYWdTdGFydCh7XG4gICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIG5vZGU6ICgwLCBfdHJlZVV0aWwuY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKShub2RlLnByb3BzKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFtMZWdhY3ldIFNlbGVjdCBoYW5kbGVyIGlzIGxlc3Mgc21hbGwgdGhhbiBub2RlLFxuICAgICAqIHNvIHRoYXQgdGhpcyB3aWxsIHRyaWdnZXIgd2hlbiBkcmFnIGVudGVyIG5vZGUgb3Igc2VsZWN0IGhhbmRsZXIuXG4gICAgICogVGhpcyBpcyBhIGxpdHRsZSB0cmlja3kgaWYgY3VzdG9taXplIGNzcyB3aXRob3V0IHBhZGRpbmcuXG4gICAgICogQmV0dGVyIGZvciB1c2UgbW91c2UgbW92ZSBldmVudCB0byByZWZyZXNoIGRyYWcgc3RhdGUuXG4gICAgICogQnV0IGxldCdzIGp1c3Qga2VlcCBpdCB0byBhdm9pZCBldmVudCB0cmlnZ2VyIGxvZ2ljIGNoYW5nZS5cbiAgICAgKi9cblxuXG4gICAgX3RoaXMub25Ob2RlRHJhZ0VudGVyID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGUyLmV4cGFuZGVkS2V5cyxcbiAgICAgICAgICBrZXlFbnRpdGllcyA9IF90aGlzJHN0YXRlMi5rZXlFbnRpdGllcyxcbiAgICAgICAgICBkcmFnTm9kZXNLZXlzID0gX3RoaXMkc3RhdGUyLmRyYWdOb2Rlc0tleXM7XG4gICAgICB2YXIgb25EcmFnRW50ZXIgPSBfdGhpcy5wcm9wcy5vbkRyYWdFbnRlcjtcbiAgICAgIHZhciBfbm9kZSRwcm9wcyA9IG5vZGUucHJvcHMsXG4gICAgICAgICAgcG9zID0gX25vZGUkcHJvcHMucG9zLFxuICAgICAgICAgIGV2ZW50S2V5ID0gX25vZGUkcHJvcHMuZXZlbnRLZXk7XG4gICAgICBpZiAoIV90aGlzLmRyYWdOb2RlIHx8IGRyYWdOb2Rlc0tleXMuaW5kZXhPZihldmVudEtleSkgIT09IC0xKSByZXR1cm47XG4gICAgICB2YXIgZHJvcFBvc2l0aW9uID0gKDAsIF91dGlsLmNhbGNEcm9wUG9zaXRpb24pKGV2ZW50LCBub2RlKTsgLy8gU2tpcCBpZiBkcmFnIG5vZGUgaXMgc2VsZlxuXG4gICAgICBpZiAoX3RoaXMuZHJhZ05vZGUucHJvcHMuZXZlbnRLZXkgPT09IGV2ZW50S2V5ICYmIGRyb3BQb3NpdGlvbiA9PT0gMCkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ092ZXJOb2RlS2V5OiAnJyxcbiAgICAgICAgICBkcm9wUG9zaXRpb246IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBSZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdHJlZS9pc3N1ZXMvMTMyXG4gICAgICAvLyBBZGQgdGltZW91dCB0byBsZXQgb25EcmFnTGV2ZWwgZmlyZSBiZWZvcmUgb25EcmFnRW50ZXIsXG4gICAgICAvLyBzbyB0aGF0IHdlIGNhbiBjbGVhbiBkcmFnIHByb3BzIGZvciBvbkRyYWdMZWF2ZSBub2RlLlxuICAgICAgLy8gTWFjcm8gdGFzayBmb3IgdGhpczpcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNjbGVhbi11cC1hZnRlci1ydW5uaW5nLXNjcmlwdFxuXG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBVcGRhdGUgZHJhZyBvdmVyIG5vZGVcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdPdmVyTm9kZUtleTogZXZlbnRLZXksXG4gICAgICAgICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb25cbiAgICAgICAgfSk7IC8vIFNpZGUgZWZmZWN0IGZvciBkZWxheSBkcmFnXG5cblxuICAgICAgICBpZiAoIV90aGlzLmRlbGF5ZWREcmFnRW50ZXJMb2dpYykge1xuICAgICAgICAgIF90aGlzLmRlbGF5ZWREcmFnRW50ZXJMb2dpYyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmtleXMoX3RoaXMuZGVsYXllZERyYWdFbnRlckxvZ2ljKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMuZGVsYXllZERyYWdFbnRlckxvZ2ljW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgX3RoaXMuZGVsYXllZERyYWdFbnRlckxvZ2ljW3Bvc10gPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFfdGhpcy5zdGF0ZS5kcmFnZ2luZykgcmV0dXJuO1xuICAgICAgICAgIHZhciBuZXdFeHBhbmRlZEtleXMgPSAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShleHBhbmRlZEtleXMpO1xuICAgICAgICAgIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1tldmVudEtleV07XG5cbiAgICAgICAgICBpZiAoZW50aXR5ICYmIChlbnRpdHkuY2hpbGRyZW4gfHwgW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgbmV3RXhwYW5kZWRLZXlzID0gKDAsIF91dGlsLmFyckFkZCkoZXhwYW5kZWRLZXlzLCBldmVudEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEoJ2V4cGFuZGVkS2V5cycgaW4gX3RoaXMucHJvcHMpKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXRFeHBhbmRlZEtleXMobmV3RXhwYW5kZWRLZXlzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob25EcmFnRW50ZXIpIHtcbiAgICAgICAgICAgIG9uRHJhZ0VudGVyKHtcbiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICBub2RlOiAoMCwgX3RyZWVVdGlsLmNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YSkobm9kZS5wcm9wcyksXG4gICAgICAgICAgICAgIGV4cGFuZGVkS2V5czogbmV3RXhwYW5kZWRLZXlzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDQwMCk7XG4gICAgICB9LCAwKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25Ob2RlRHJhZ092ZXIgPSBmdW5jdGlvbiAoZXZlbnQsIG5vZGUpIHtcbiAgICAgIHZhciBkcmFnTm9kZXNLZXlzID0gX3RoaXMuc3RhdGUuZHJhZ05vZGVzS2V5cztcbiAgICAgIHZhciBvbkRyYWdPdmVyID0gX3RoaXMucHJvcHMub25EcmFnT3ZlcjtcbiAgICAgIHZhciBldmVudEtleSA9IG5vZGUucHJvcHMuZXZlbnRLZXk7XG5cbiAgICAgIGlmIChkcmFnTm9kZXNLZXlzLmluZGV4T2YoZXZlbnRLZXkpICE9PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFVwZGF0ZSBkcmFnIHBvc2l0aW9uXG5cblxuICAgICAgaWYgKF90aGlzLmRyYWdOb2RlICYmIGV2ZW50S2V5ID09PSBfdGhpcy5zdGF0ZS5kcmFnT3Zlck5vZGVLZXkpIHtcbiAgICAgICAgdmFyIGRyb3BQb3NpdGlvbiA9ICgwLCBfdXRpbC5jYWxjRHJvcFBvc2l0aW9uKShldmVudCwgbm9kZSk7XG4gICAgICAgIGlmIChkcm9wUG9zaXRpb24gPT09IF90aGlzLnN0YXRlLmRyb3BQb3NpdGlvbikgcmV0dXJuO1xuXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcm9wUG9zaXRpb246IGRyb3BQb3NpdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uRHJhZ092ZXIpIHtcbiAgICAgICAgb25EcmFnT3Zlcih7XG4gICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIG5vZGU6ICgwLCBfdHJlZVV0aWwuY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKShub2RlLnByb3BzKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25Ob2RlRHJhZ0xlYXZlID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgb25EcmFnTGVhdmUgPSBfdGhpcy5wcm9wcy5vbkRyYWdMZWF2ZTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnT3Zlck5vZGVLZXk6ICcnXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9uRHJhZ0xlYXZlKSB7XG4gICAgICAgIG9uRHJhZ0xlYXZlKHtcbiAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgbm9kZTogKDAsIF90cmVlVXRpbC5jb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEpKG5vZGUucHJvcHMpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbk5vZGVEcmFnRW5kID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgb25EcmFnRW5kID0gX3RoaXMucHJvcHMub25EcmFnRW5kO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdPdmVyTm9kZUtleTogJydcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5jbGVhbkRyYWdTdGF0ZSgpO1xuXG4gICAgICBpZiAob25EcmFnRW5kKSB7XG4gICAgICAgIG9uRHJhZ0VuZCh7XG4gICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIG5vZGU6ICgwLCBfdHJlZVV0aWwuY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKShub2RlLnByb3BzKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZHJhZ05vZGUgPSBudWxsO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbk5vZGVEcm9wID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUzID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgX3RoaXMkc3RhdGUzJGRyYWdOb2RlID0gX3RoaXMkc3RhdGUzLmRyYWdOb2Rlc0tleXMsXG4gICAgICAgICAgZHJhZ05vZGVzS2V5cyA9IF90aGlzJHN0YXRlMyRkcmFnTm9kZSA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRzdGF0ZTMkZHJhZ05vZGUsXG4gICAgICAgICAgZHJvcFBvc2l0aW9uID0gX3RoaXMkc3RhdGUzLmRyb3BQb3NpdGlvbjtcbiAgICAgIHZhciBvbkRyb3AgPSBfdGhpcy5wcm9wcy5vbkRyb3A7XG4gICAgICB2YXIgX25vZGUkcHJvcHMyID0gbm9kZS5wcm9wcyxcbiAgICAgICAgICBldmVudEtleSA9IF9ub2RlJHByb3BzMi5ldmVudEtleSxcbiAgICAgICAgICBwb3MgPSBfbm9kZSRwcm9wczIucG9zO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdPdmVyTm9kZUtleTogJydcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5jbGVhbkRyYWdTdGF0ZSgpO1xuXG4gICAgICBpZiAoZHJhZ05vZGVzS2V5cy5pbmRleE9mKGV2ZW50S2V5KSAhPT0gLTEpIHtcbiAgICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGZhbHNlLCBcIkNhbiBub3QgZHJvcCB0byBkcmFnTm9kZShpbmNsdWRlIGl0J3MgY2hpbGRyZW4gbm9kZSlcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvc0FyciA9ICgwLCBfdXRpbC5wb3NUb0FycikocG9zKTtcbiAgICAgIHZhciBkcm9wUmVzdWx0ID0ge1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5vZGU6ICgwLCBfdHJlZVV0aWwuY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKShub2RlLnByb3BzKSxcbiAgICAgICAgZHJhZ05vZGU6IF90aGlzLmRyYWdOb2RlID8gKDAsIF90cmVlVXRpbC5jb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEpKF90aGlzLmRyYWdOb2RlLnByb3BzKSA6IG51bGwsXG4gICAgICAgIGRyYWdOb2Rlc0tleXM6IGRyYWdOb2Rlc0tleXMuc2xpY2UoKSxcbiAgICAgICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb24gKyBOdW1iZXIocG9zQXJyW3Bvc0Fyci5sZW5ndGggLSAxXSksXG4gICAgICAgIGRyb3BUb0dhcDogZmFsc2VcbiAgICAgIH07XG5cbiAgICAgIGlmIChkcm9wUG9zaXRpb24gIT09IDApIHtcbiAgICAgICAgZHJvcFJlc3VsdC5kcm9wVG9HYXAgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob25Ecm9wKSB7XG4gICAgICAgIG9uRHJvcChkcm9wUmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZHJhZ05vZGUgPSBudWxsO1xuICAgIH07XG5cbiAgICBfdGhpcy5jbGVhbkRyYWdTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBkcmFnZ2luZyA9IF90aGlzLnN0YXRlLmRyYWdnaW5nO1xuXG4gICAgICBpZiAoZHJhZ2dpbmcpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25Ob2RlQ2xpY2sgPSBmdW5jdGlvbiAoZSwgdHJlZU5vZGUpIHtcbiAgICAgIHZhciBvbkNsaWNrID0gX3RoaXMucHJvcHMub25DbGljaztcblxuICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgb25DbGljayhlLCB0cmVlTm9kZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uTm9kZURvdWJsZUNsaWNrID0gZnVuY3Rpb24gKGUsIHRyZWVOb2RlKSB7XG4gICAgICB2YXIgb25Eb3VibGVDbGljayA9IF90aGlzLnByb3BzLm9uRG91YmxlQ2xpY2s7XG5cbiAgICAgIGlmIChvbkRvdWJsZUNsaWNrKSB7XG4gICAgICAgIG9uRG91YmxlQ2xpY2soZSwgdHJlZU5vZGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbk5vZGVTZWxlY3QgPSBmdW5jdGlvbiAoZSwgdHJlZU5vZGUpIHtcbiAgICAgIHZhciBzZWxlY3RlZEtleXMgPSBfdGhpcy5zdGF0ZS5zZWxlY3RlZEtleXM7XG4gICAgICB2YXIga2V5RW50aXRpZXMgPSBfdGhpcy5zdGF0ZS5rZXlFbnRpdGllcztcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uU2VsZWN0ID0gX3RoaXMkcHJvcHMub25TZWxlY3QsXG4gICAgICAgICAgbXVsdGlwbGUgPSBfdGhpcyRwcm9wcy5tdWx0aXBsZTtcbiAgICAgIHZhciBzZWxlY3RlZCA9IHRyZWVOb2RlLnNlbGVjdGVkLFxuICAgICAgICAgIGtleSA9IHRyZWVOb2RlLmtleTtcbiAgICAgIHZhciB0YXJnZXRTZWxlY3RlZCA9ICFzZWxlY3RlZDsgLy8gVXBkYXRlIHNlbGVjdGVkIGtleXNcblxuICAgICAgaWYgKCF0YXJnZXRTZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZEtleXMgPSAoMCwgX3V0aWwuYXJyRGVsKShzZWxlY3RlZEtleXMsIGtleSk7XG4gICAgICB9IGVsc2UgaWYgKCFtdWx0aXBsZSkge1xuICAgICAgICBzZWxlY3RlZEtleXMgPSBba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkS2V5cyA9ICgwLCBfdXRpbC5hcnJBZGQpKHNlbGVjdGVkS2V5cywga2V5KTtcbiAgICAgIH0gLy8gW0xlZ2FjeV0gTm90IGZvdW5kIHJlbGF0ZWQgdXNhZ2UgaW4gZG9jIG9yIHVwcGVyIGxpYnNcblxuXG4gICAgICB2YXIgc2VsZWN0ZWROb2RlcyA9IHNlbGVjdGVkS2V5cy5tYXAoZnVuY3Rpb24gKHNlbGVjdGVkS2V5KSB7XG4gICAgICAgIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1tzZWxlY3RlZEtleV07XG4gICAgICAgIGlmICghZW50aXR5KSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGVudGl0eS5ub2RlO1xuICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfSk7XG5cbiAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXNcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgICAgb25TZWxlY3Qoc2VsZWN0ZWRLZXlzLCB7XG4gICAgICAgICAgZXZlbnQ6ICdzZWxlY3QnLFxuICAgICAgICAgIHNlbGVjdGVkOiB0YXJnZXRTZWxlY3RlZCxcbiAgICAgICAgICBub2RlOiB0cmVlTm9kZSxcbiAgICAgICAgICBzZWxlY3RlZE5vZGVzOiBzZWxlY3RlZE5vZGVzLFxuICAgICAgICAgIG5hdGl2ZUV2ZW50OiBlLm5hdGl2ZUV2ZW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbk5vZGVDaGVjayA9IGZ1bmN0aW9uIChlLCB0cmVlTm9kZSwgY2hlY2tlZCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlNCA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGU0LmtleUVudGl0aWVzLFxuICAgICAgICAgIG9yaUNoZWNrZWRLZXlzID0gX3RoaXMkc3RhdGU0LmNoZWNrZWRLZXlzLFxuICAgICAgICAgIG9yaUhhbGZDaGVja2VkS2V5cyA9IF90aGlzJHN0YXRlNC5oYWxmQ2hlY2tlZEtleXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgY2hlY2tTdHJpY3RseSA9IF90aGlzJHByb3BzMi5jaGVja1N0cmljdGx5LFxuICAgICAgICAgIG9uQ2hlY2sgPSBfdGhpcyRwcm9wczIub25DaGVjaztcbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZS5rZXk7IC8vIFByZXBhcmUgdHJpZ2dlciBhcmd1bWVudHNcblxuICAgICAgdmFyIGNoZWNrZWRPYmo7XG4gICAgICB2YXIgZXZlbnRPYmogPSB7XG4gICAgICAgIGV2ZW50OiAnY2hlY2snLFxuICAgICAgICBub2RlOiB0cmVlTm9kZSxcbiAgICAgICAgY2hlY2tlZDogY2hlY2tlZCxcbiAgICAgICAgbmF0aXZlRXZlbnQ6IGUubmF0aXZlRXZlbnRcbiAgICAgIH07XG5cbiAgICAgIGlmIChjaGVja1N0cmljdGx5KSB7XG4gICAgICAgIHZhciBjaGVja2VkS2V5cyA9IGNoZWNrZWQgPyAoMCwgX3V0aWwuYXJyQWRkKShvcmlDaGVja2VkS2V5cywga2V5KSA6ICgwLCBfdXRpbC5hcnJEZWwpKG9yaUNoZWNrZWRLZXlzLCBrZXkpO1xuICAgICAgICB2YXIgaGFsZkNoZWNrZWRLZXlzID0gKDAsIF91dGlsLmFyckRlbCkob3JpSGFsZkNoZWNrZWRLZXlzLCBrZXkpO1xuICAgICAgICBjaGVja2VkT2JqID0ge1xuICAgICAgICAgIGNoZWNrZWQ6IGNoZWNrZWRLZXlzLFxuICAgICAgICAgIGhhbGZDaGVja2VkOiBoYWxmQ2hlY2tlZEtleXNcbiAgICAgICAgfTtcbiAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzID0gY2hlY2tlZEtleXMubWFwKGZ1bmN0aW9uIChjaGVja2VkS2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGtleUVudGl0aWVzW2NoZWNrZWRLZXldO1xuICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgcmV0dXJuIGVudGl0eS5ub2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgY2hlY2tlZEtleXM6IGNoZWNrZWRLZXlzXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWx3YXlzIGZpbGwgZmlyc3RcbiAgICAgICAgdmFyIF9jb25kdWN0Q2hlY2sgPSAoMCwgX2NvbmR1Y3RVdGlsLmNvbmR1Y3RDaGVjaykoW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG9yaUNoZWNrZWRLZXlzKSwgW2tleV0pLCB0cnVlLCBrZXlFbnRpdGllcyksXG4gICAgICAgICAgICBfY2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrLmNoZWNrZWRLZXlzLFxuICAgICAgICAgICAgX2hhbGZDaGVja2VkS2V5cyA9IF9jb25kdWN0Q2hlY2suaGFsZkNoZWNrZWRLZXlzOyAvLyBJZiByZW1vdmUsIHdlIGRvIGl0IGFnYWluIHRvIGNvcnJlY3Rpb25cblxuXG4gICAgICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgICAgIHZhciBrZXlTZXQgPSBuZXcgU2V0KF9jaGVja2VkS2V5cyk7XG4gICAgICAgICAga2V5U2V0LmRlbGV0ZShrZXkpO1xuXG4gICAgICAgICAgdmFyIF9jb25kdWN0Q2hlY2syID0gKDAsIF9jb25kdWN0VXRpbC5jb25kdWN0Q2hlY2spKEFycmF5LmZyb20oa2V5U2V0KSwge1xuICAgICAgICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IF9oYWxmQ2hlY2tlZEtleXNcbiAgICAgICAgICB9LCBrZXlFbnRpdGllcyk7XG5cbiAgICAgICAgICBfY2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrMi5jaGVja2VkS2V5cztcbiAgICAgICAgICBfaGFsZkNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjazIuaGFsZkNoZWNrZWRLZXlzO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tlZE9iaiA9IF9jaGVja2VkS2V5czsgLy8gW0xlZ2FjeV0gVGhpcyBpcyB1c2VkIGZvciBgcmMtdHJlZS1zZWxlY3RgXG5cbiAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzID0gW107XG4gICAgICAgIGV2ZW50T2JqLmNoZWNrZWROb2Rlc1Bvc2l0aW9ucyA9IFtdO1xuICAgICAgICBldmVudE9iai5oYWxmQ2hlY2tlZEtleXMgPSBfaGFsZkNoZWNrZWRLZXlzO1xuXG4gICAgICAgIF9jaGVja2VkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChjaGVja2VkS2V5KSB7XG4gICAgICAgICAgdmFyIGVudGl0eSA9IGtleUVudGl0aWVzW2NoZWNrZWRLZXldO1xuICAgICAgICAgIGlmICghZW50aXR5KSByZXR1cm47XG4gICAgICAgICAgdmFyIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgICAgICAgcG9zID0gZW50aXR5LnBvcztcbiAgICAgICAgICBldmVudE9iai5jaGVja2VkTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICBldmVudE9iai5jaGVja2VkTm9kZXNQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgcG9zOiBwb3NcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMuc2V0VW5jb250cm9sbGVkU3RhdGUoe1xuICAgICAgICAgIGNoZWNrZWRLZXlzOiBfY2hlY2tlZEtleXNcbiAgICAgICAgfSwgZmFsc2UsIHtcbiAgICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IF9oYWxmQ2hlY2tlZEtleXNcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbkNoZWNrKSB7XG4gICAgICAgIG9uQ2hlY2soY2hlY2tlZE9iaiwgZXZlbnRPYmopO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbk5vZGVMb2FkID0gZnVuY3Rpb24gKHRyZWVOb2RlKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgdGhlIGxhdGVzdCBzdGF0ZSBvZiBsb2FkaW5nL2xvYWRlZCBrZXlzXG4gICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgdmFyIF9yZWYkbG9hZGVkS2V5cyA9IF9yZWYubG9hZGVkS2V5cyxcbiAgICAgICAgICAgICAgbG9hZGVkS2V5cyA9IF9yZWYkbG9hZGVkS2V5cyA9PT0gdm9pZCAwID8gW10gOiBfcmVmJGxvYWRlZEtleXMsXG4gICAgICAgICAgICAgIF9yZWYkbG9hZGluZ0tleXMgPSBfcmVmLmxvYWRpbmdLZXlzLFxuICAgICAgICAgICAgICBsb2FkaW5nS2V5cyA9IF9yZWYkbG9hZGluZ0tleXMgPT09IHZvaWQgMCA/IFtdIDogX3JlZiRsb2FkaW5nS2V5cztcbiAgICAgICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICAgIGxvYWREYXRhID0gX3RoaXMkcHJvcHMzLmxvYWREYXRhLFxuICAgICAgICAgICAgICBvbkxvYWQgPSBfdGhpcyRwcm9wczMub25Mb2FkO1xuICAgICAgICAgIHZhciBrZXkgPSB0cmVlTm9kZS5rZXk7XG5cbiAgICAgICAgICBpZiAoIWxvYWREYXRhIHx8IGxvYWRlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSB8fCBsb2FkaW5nS2V5cy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyByZWFjdCAxNSB3aWxsIHdhcm4gaWYgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9IC8vIFByb2Nlc3MgbG9hZCBkYXRhXG5cblxuICAgICAgICAgIHZhciBwcm9taXNlID0gbG9hZERhdGEodHJlZU5vZGUpO1xuICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkc3RhdGU1ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgY3VycmVudExvYWRlZEtleXMgPSBfdGhpcyRzdGF0ZTUubG9hZGVkS2V5cyxcbiAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGluZ0tleXMgPSBfdGhpcyRzdGF0ZTUubG9hZGluZ0tleXM7XG4gICAgICAgICAgICB2YXIgbmV3TG9hZGVkS2V5cyA9ICgwLCBfdXRpbC5hcnJBZGQpKGN1cnJlbnRMb2FkZWRLZXlzLCBrZXkpO1xuICAgICAgICAgICAgdmFyIG5ld0xvYWRpbmdLZXlzID0gKDAsIF91dGlsLmFyckRlbCkoY3VycmVudExvYWRpbmdLZXlzLCBrZXkpOyAvLyBvbkxvYWQgc2hvdWxkIHRyaWdnZXIgYmVmb3JlIGludGVybmFsIHNldFN0YXRlIHRvIGF2b2lkIGBsb2FkRGF0YWAgdHJpZ2dlciB0d2ljZS5cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzEyNDY0XG5cbiAgICAgICAgICAgIGlmIChvbkxvYWQpIHtcbiAgICAgICAgICAgICAgb25Mb2FkKG5ld0xvYWRlZEtleXMsIHtcbiAgICAgICAgICAgICAgICBldmVudDogJ2xvYWQnLFxuICAgICAgICAgICAgICAgIG5vZGU6IHRyZWVOb2RlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgICAgIGxvYWRlZEtleXM6IG5ld0xvYWRlZEtleXNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGxvYWRpbmdLZXlzOiBuZXdMb2FkaW5nS2V5c1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9hZGluZ0tleXM6ICgwLCBfdXRpbC5hcnJBZGQpKGxvYWRpbmdLZXlzLCBrZXkpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25Ob2RlTW91c2VFbnRlciA9IGZ1bmN0aW9uIChldmVudCwgbm9kZSkge1xuICAgICAgdmFyIG9uTW91c2VFbnRlciA9IF90aGlzLnByb3BzLm9uTW91c2VFbnRlcjtcblxuICAgICAgaWYgKG9uTW91c2VFbnRlcikge1xuICAgICAgICBvbk1vdXNlRW50ZXIoe1xuICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICBub2RlOiBub2RlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbk5vZGVNb3VzZUxlYXZlID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgb25Nb3VzZUxlYXZlID0gX3RoaXMucHJvcHMub25Nb3VzZUxlYXZlO1xuXG4gICAgICBpZiAob25Nb3VzZUxlYXZlKSB7XG4gICAgICAgIG9uTW91c2VMZWF2ZSh7XG4gICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIG5vZGU6IG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uTm9kZUNvbnRleHRNZW51ID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgb25SaWdodENsaWNrID0gX3RoaXMucHJvcHMub25SaWdodENsaWNrO1xuXG4gICAgICBpZiAob25SaWdodENsaWNrKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uUmlnaHRDbGljayh7XG4gICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIG5vZGU6IG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb25Gb2N1cyA9IF90aGlzLnByb3BzLm9uRm9jdXM7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZm9jdXNlZDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgIG9uRm9jdXMuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbkJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb25CbHVyID0gX3RoaXMucHJvcHMub25CbHVyO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMub25BY3RpdmVDaGFuZ2UobnVsbCk7XG5cbiAgICAgIGlmIChvbkJsdXIpIHtcbiAgICAgICAgb25CbHVyLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0VHJlZU5vZGVSZXF1aXJlZFByb3BzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlNiA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGV4cGFuZGVkS2V5cyA9IF90aGlzJHN0YXRlNi5leHBhbmRlZEtleXMsXG4gICAgICAgICAgc2VsZWN0ZWRLZXlzID0gX3RoaXMkc3RhdGU2LnNlbGVjdGVkS2V5cyxcbiAgICAgICAgICBsb2FkZWRLZXlzID0gX3RoaXMkc3RhdGU2LmxvYWRlZEtleXMsXG4gICAgICAgICAgbG9hZGluZ0tleXMgPSBfdGhpcyRzdGF0ZTYubG9hZGluZ0tleXMsXG4gICAgICAgICAgY2hlY2tlZEtleXMgPSBfdGhpcyRzdGF0ZTYuY2hlY2tlZEtleXMsXG4gICAgICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX3RoaXMkc3RhdGU2LmhhbGZDaGVja2VkS2V5cyxcbiAgICAgICAgICBkcmFnT3Zlck5vZGVLZXkgPSBfdGhpcyRzdGF0ZTYuZHJhZ092ZXJOb2RlS2V5LFxuICAgICAgICAgIGRyb3BQb3NpdGlvbiA9IF90aGlzJHN0YXRlNi5kcm9wUG9zaXRpb24sXG4gICAgICAgICAga2V5RW50aXRpZXMgPSBfdGhpcyRzdGF0ZTYua2V5RW50aXRpZXM7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleHBhbmRlZEtleXM6IGV4cGFuZGVkS2V5cyB8fCBbXSxcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMgfHwgW10sXG4gICAgICAgIGxvYWRlZEtleXM6IGxvYWRlZEtleXMgfHwgW10sXG4gICAgICAgIGxvYWRpbmdLZXlzOiBsb2FkaW5nS2V5cyB8fCBbXSxcbiAgICAgICAgY2hlY2tlZEtleXM6IGNoZWNrZWRLZXlzIHx8IFtdLFxuICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IGhhbGZDaGVja2VkS2V5cyB8fCBbXSxcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5OiBkcmFnT3Zlck5vZGVLZXksXG4gICAgICAgIGRyb3BQb3NpdGlvbjogZHJvcFBvc2l0aW9uLFxuICAgICAgICBrZXlFbnRpdGllczoga2V5RW50aXRpZXNcbiAgICAgIH07XG4gICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cGFuZGVkID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqIFNldCB1bmNvbnRyb2xsZWQgYGV4cGFuZGVkS2V5c2AuIFRoaXMgd2lsbCBhbHNvIGF1dG8gdXBkYXRlIGBmbGF0dGVuTm9kZXNgLiAqL1xuXG5cbiAgICBfdGhpcy5zZXRFeHBhbmRlZEtleXMgPSBmdW5jdGlvbiAoZXhwYW5kZWRLZXlzKSB7XG4gICAgICB2YXIgdHJlZURhdGEgPSBfdGhpcy5zdGF0ZS50cmVlRGF0YTtcbiAgICAgIHZhciBmbGF0dGVuTm9kZXMgPSAoMCwgX3RyZWVVdGlsLmZsYXR0ZW5UcmVlRGF0YSkodHJlZURhdGEsIGV4cGFuZGVkS2V5cyk7XG5cbiAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgZXhwYW5kZWRLZXlzOiBleHBhbmRlZEtleXMsXG4gICAgICAgIGZsYXR0ZW5Ob2RlczogZmxhdHRlbk5vZGVzXG4gICAgICB9LCB0cnVlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25Ob2RlRXhwYW5kID0gZnVuY3Rpb24gKGUsIHRyZWVOb2RlKSB7XG4gICAgICB2YXIgZXhwYW5kZWRLZXlzID0gX3RoaXMuc3RhdGUuZXhwYW5kZWRLZXlzO1xuICAgICAgdmFyIGxpc3RDaGFuZ2luZyA9IF90aGlzLnN0YXRlLmxpc3RDaGFuZ2luZztcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkV4cGFuZCA9IF90aGlzJHByb3BzNC5vbkV4cGFuZCxcbiAgICAgICAgICBsb2FkRGF0YSA9IF90aGlzJHByb3BzNC5sb2FkRGF0YTtcbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZS5rZXksXG4gICAgICAgICAgZXhwYW5kZWQgPSB0cmVlTm9kZS5leHBhbmRlZDsgLy8gRG8gbm90aGluZyB3aGVuIG1vdGlvbiBpcyBpbiBwcm9ncmVzc1xuXG4gICAgICBpZiAobGlzdENoYW5naW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gVXBkYXRlIHNlbGVjdGVkIGtleXNcblxuXG4gICAgICB2YXIgaW5kZXggPSBleHBhbmRlZEtleXMuaW5kZXhPZihrZXkpO1xuICAgICAgdmFyIHRhcmdldEV4cGFuZGVkID0gIWV4cGFuZGVkO1xuICAgICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKGV4cGFuZGVkICYmIGluZGV4ICE9PSAtMSB8fCAhZXhwYW5kZWQgJiYgaW5kZXggPT09IC0xLCAnRXhwYW5kIHN0YXRlIG5vdCBzeW5jIHdpdGggaW5kZXggY2hlY2snKTtcblxuICAgICAgaWYgKHRhcmdldEV4cGFuZGVkKSB7XG4gICAgICAgIGV4cGFuZGVkS2V5cyA9ICgwLCBfdXRpbC5hcnJBZGQpKGV4cGFuZGVkS2V5cywga2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cGFuZGVkS2V5cyA9ICgwLCBfdXRpbC5hcnJEZWwpKGV4cGFuZGVkS2V5cywga2V5KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2V0RXhwYW5kZWRLZXlzKGV4cGFuZGVkS2V5cyk7XG5cbiAgICAgIGlmIChvbkV4cGFuZCkge1xuICAgICAgICBvbkV4cGFuZChleHBhbmRlZEtleXMsIHtcbiAgICAgICAgICBub2RlOiB0cmVlTm9kZSxcbiAgICAgICAgICBleHBhbmRlZDogdGFyZ2V0RXhwYW5kZWQsXG4gICAgICAgICAgbmF0aXZlRXZlbnQ6IGUubmF0aXZlRXZlbnRcbiAgICAgICAgfSk7XG4gICAgICB9IC8vIEFzeW5jIExvYWQgZGF0YVxuXG5cbiAgICAgIGlmICh0YXJnZXRFeHBhbmRlZCAmJiBsb2FkRGF0YSkge1xuICAgICAgICB2YXIgbG9hZFByb21pc2UgPSBfdGhpcy5vbk5vZGVMb2FkKHRyZWVOb2RlKTtcblxuICAgICAgICBpZiAobG9hZFByb21pc2UpIHtcbiAgICAgICAgICBsb2FkUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIFtMZWdhY3ldIFJlZnJlc2ggbG9naWNcbiAgICAgICAgICAgIHZhciBuZXdGbGF0dGVuVHJlZURhdGEgPSAoMCwgX3RyZWVVdGlsLmZsYXR0ZW5UcmVlRGF0YSkoX3RoaXMuc3RhdGUudHJlZURhdGEsIGV4cGFuZGVkS2V5cyk7XG5cbiAgICAgICAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgICAgICAgZmxhdHRlbk5vZGVzOiBuZXdGbGF0dGVuVHJlZURhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uTGlzdENoYW5nZVN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2V0VW5jb250cm9sbGVkU3RhdGUoe1xuICAgICAgICBsaXN0Q2hhbmdpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkxpc3RDaGFuZ2VFbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuc2V0VW5jb250cm9sbGVkU3RhdGUoe1xuICAgICAgICAgIGxpc3RDaGFuZ2luZzogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlID0gZnVuY3Rpb24gKG5ld0FjdGl2ZUtleSkge1xuICAgICAgdmFyIGFjdGl2ZUtleSA9IF90aGlzLnN0YXRlLmFjdGl2ZUtleTtcbiAgICAgIHZhciBvbkFjdGl2ZUNoYW5nZSA9IF90aGlzLnByb3BzLm9uQWN0aXZlQ2hhbmdlO1xuXG4gICAgICBpZiAoYWN0aXZlS2V5ID09PSBuZXdBY3RpdmVLZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGl2ZUtleTogbmV3QWN0aXZlS2V5XG4gICAgICB9KTtcblxuICAgICAgaWYgKG5ld0FjdGl2ZUtleSAhPT0gbnVsbCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxUbyh7XG4gICAgICAgICAga2V5OiBuZXdBY3RpdmVLZXlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbkFjdGl2ZUNoYW5nZSkge1xuICAgICAgICBvbkFjdGl2ZUNoYW5nZShuZXdBY3RpdmVLZXkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5nZXRBY3RpdmVJdGVtID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlNyA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGFjdGl2ZUtleSA9IF90aGlzJHN0YXRlNy5hY3RpdmVLZXksXG4gICAgICAgICAgZmxhdHRlbk5vZGVzID0gX3RoaXMkc3RhdGU3LmZsYXR0ZW5Ob2RlcztcblxuICAgICAgaWYgKGFjdGl2ZUtleSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsYXR0ZW5Ob2Rlcy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjIuZGF0YS5rZXk7XG4gICAgICAgIHJldHVybiBrZXkgPT09IGFjdGl2ZUtleTtcbiAgICAgIH0pIHx8IG51bGw7XG4gICAgfTtcblxuICAgIF90aGlzLm9mZnNldEFjdGl2ZUtleSA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTggPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICBmbGF0dGVuTm9kZXMgPSBfdGhpcyRzdGF0ZTguZmxhdHRlbk5vZGVzLFxuICAgICAgICAgIGFjdGl2ZUtleSA9IF90aGlzJHN0YXRlOC5hY3RpdmVLZXk7XG4gICAgICB2YXIgaW5kZXggPSBmbGF0dGVuTm9kZXMuZmluZEluZGV4KGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjMuZGF0YS5rZXk7XG4gICAgICAgIHJldHVybiBrZXkgPT09IGFjdGl2ZUtleTtcbiAgICAgIH0pOyAvLyBBbGlnbiB3aXRoIGluZGV4XG5cbiAgICAgIGlmIChpbmRleCA9PT0gLTEgJiYgb2Zmc2V0IDwgMCkge1xuICAgICAgICBpbmRleCA9IGZsYXR0ZW5Ob2Rlcy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ID0gKGluZGV4ICsgb2Zmc2V0ICsgZmxhdHRlbk5vZGVzLmxlbmd0aCkgJSBmbGF0dGVuTm9kZXMubGVuZ3RoO1xuICAgICAgdmFyIGl0ZW0gPSBmbGF0dGVuTm9kZXNbaW5kZXhdO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICB2YXIga2V5ID0gaXRlbS5kYXRhLmtleTtcblxuICAgICAgICBfdGhpcy5vbkFjdGl2ZUNoYW5nZShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMub25BY3RpdmVDaGFuZ2UobnVsbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlOSA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGFjdGl2ZUtleSA9IF90aGlzJHN0YXRlOS5hY3RpdmVLZXksXG4gICAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGU5LmV4cGFuZGVkS2V5cyxcbiAgICAgICAgICBjaGVja2VkS2V5cyA9IF90aGlzJHN0YXRlOS5jaGVja2VkS2V5cztcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbktleURvd24gPSBfdGhpcyRwcm9wczUub25LZXlEb3duLFxuICAgICAgICAgIGNoZWNrYWJsZSA9IF90aGlzJHByb3BzNS5jaGVja2FibGUsXG4gICAgICAgICAgc2VsZWN0YWJsZSA9IF90aGlzJHByb3BzNS5zZWxlY3RhYmxlOyAvLyA+Pj4+Pj4+Pj4+IERpcmVjdGlvblxuXG4gICAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5VUDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGhpcy5vZmZzZXRBY3RpdmVLZXkoLTEpO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5ET1dOOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIF90aGlzLm9mZnNldEFjdGl2ZUtleSgxKTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH0gLy8gPj4+Pj4+Pj4+PiBFeHBhbmQgJiBTZWxlY3Rpb25cblxuXG4gICAgICB2YXIgYWN0aXZlSXRlbSA9IF90aGlzLmdldEFjdGl2ZUl0ZW0oKTtcblxuICAgICAgaWYgKGFjdGl2ZUl0ZW0gJiYgYWN0aXZlSXRlbS5kYXRhKSB7XG4gICAgICAgIHZhciB0cmVlTm9kZVJlcXVpcmVkUHJvcHMgPSBfdGhpcy5nZXRUcmVlTm9kZVJlcXVpcmVkUHJvcHMoKTtcblxuICAgICAgICB2YXIgZXhwYW5kYWJsZSA9IGFjdGl2ZUl0ZW0uZGF0YS5pc0xlYWYgPT09IGZhbHNlIHx8ICEhKGFjdGl2ZUl0ZW0uZGF0YS5jaGlsZHJlbiB8fCBbXSkubGVuZ3RoO1xuICAgICAgICB2YXIgZXZlbnROb2RlID0gKDAsIF90cmVlVXRpbC5jb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEpKCgwLCBfb2JqZWN0U3ByZWFkMy5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoe30sICgwLCBfdHJlZVV0aWwuZ2V0VHJlZU5vZGVQcm9wcykoYWN0aXZlS2V5LCB0cmVlTm9kZVJlcXVpcmVkUHJvcHMpKSwge30sIHtcbiAgICAgICAgICBkYXRhOiBhY3RpdmVJdGVtLmRhdGEsXG4gICAgICAgICAgYWN0aXZlOiB0cnVlXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAgICAgLy8gPj4+IEV4cGFuZFxuICAgICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5MRUZUOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBDb2xsYXBzZSBpZiBwb3NzaWJsZVxuICAgICAgICAgICAgICBpZiAoZXhwYW5kYWJsZSAmJiBleHBhbmRlZEtleXMuaW5jbHVkZXMoYWN0aXZlS2V5KSkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uTm9kZUV4cGFuZCh7fSwgZXZlbnROb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVJdGVtLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlKGFjdGl2ZUl0ZW0ucGFyZW50LmRhdGEua2V5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LlJJR0hUOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBFeHBhbmQgaWYgcG9zc2libGVcbiAgICAgICAgICAgICAgaWYgKGV4cGFuZGFibGUgJiYgIWV4cGFuZGVkS2V5cy5pbmNsdWRlcyhhY3RpdmVLZXkpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25Ob2RlRXhwYW5kKHt9LCBldmVudE5vZGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUl0ZW0uY2hpbGRyZW4gJiYgYWN0aXZlSXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkFjdGl2ZUNoYW5nZShhY3RpdmVJdGVtLmNoaWxkcmVuWzBdLmRhdGEua2V5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIC8vIFNlbGVjdGlvblxuXG4gICAgICAgICAgY2FzZSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSOlxuICAgICAgICAgIGNhc2UgX0tleUNvZGUuZGVmYXVsdC5TUEFDRTpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrYWJsZSAmJiAhZXZlbnROb2RlLmRpc2FibGVkICYmIGV2ZW50Tm9kZS5jaGVja2FibGUgIT09IGZhbHNlICYmICFldmVudE5vZGUuZGlzYWJsZUNoZWNrYm94KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25Ob2RlQ2hlY2soe30sIGV2ZW50Tm9kZSwgIWNoZWNrZWRLZXlzLmluY2x1ZGVzKGFjdGl2ZUtleSkpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja2FibGUgJiYgc2VsZWN0YWJsZSAmJiAhZXZlbnROb2RlLmRpc2FibGVkICYmIGV2ZW50Tm9kZS5zZWxlY3RhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uTm9kZVNlbGVjdCh7fSwgZXZlbnROb2RlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvbktleURvd24pIHtcbiAgICAgICAgb25LZXlEb3duKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9ubHkgdXBkYXRlIHRoZSB2YWx1ZSB3aGljaCBpcyBub3QgaW4gcHJvcHNcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuc2V0VW5jb250cm9sbGVkU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIHZhciBhdG9taWMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgdmFyIGZvcmNlU3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgICAgIGlmIChfdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVlZFN5bmMgPSBmYWxzZTtcbiAgICAgIHZhciBhbGxQYXNzZWQgPSB0cnVlO1xuICAgICAgdmFyIG5ld1N0YXRlID0ge307XG4gICAgICBPYmplY3Qua2V5cyhzdGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAobmFtZSBpbiBfdGhpcy5wcm9wcykge1xuICAgICAgICAgIGFsbFBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5lZWRTeW5jID0gdHJ1ZTtcbiAgICAgICAgbmV3U3RhdGVbbmFtZV0gPSBzdGF0ZVtuYW1lXTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobmVlZFN5bmMgJiYgKCFhdG9taWMgfHwgYWxsUGFzc2VkKSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSgoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQzLmRlZmF1bHQpKHt9LCBuZXdTdGF0ZSksIGZvcmNlU3RhdGUpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuc2Nyb2xsVG8gPSBmdW5jdGlvbiAoc2Nyb2xsKSB7XG4gICAgICBfdGhpcy5saXN0UmVmLmN1cnJlbnQuc2Nyb2xsVG8oc2Nyb2xsKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoVHJlZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgIHZhciBfdGhpcyRzdGF0ZTEwID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBmb2N1c2VkID0gX3RoaXMkc3RhdGUxMC5mb2N1c2VkLFxuICAgICAgICAgIGZsYXR0ZW5Ob2RlcyA9IF90aGlzJHN0YXRlMTAuZmxhdHRlbk5vZGVzLFxuICAgICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGUxMC5rZXlFbnRpdGllcyxcbiAgICAgICAgICBkcmFnZ2luZyA9IF90aGlzJHN0YXRlMTAuZHJhZ2dpbmcsXG4gICAgICAgICAgYWN0aXZlS2V5ID0gX3RoaXMkc3RhdGUxMC5hY3RpdmVLZXk7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczYucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzNi5jbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczYuc3R5bGUsXG4gICAgICAgICAgc2hvd0xpbmUgPSBfdGhpcyRwcm9wczYuc2hvd0xpbmUsXG4gICAgICAgICAgZm9jdXNhYmxlID0gX3RoaXMkcHJvcHM2LmZvY3VzYWJsZSxcbiAgICAgICAgICBfdGhpcyRwcm9wczYkdGFiSW5kZXggPSBfdGhpcyRwcm9wczYudGFiSW5kZXgsXG4gICAgICAgICAgdGFiSW5kZXggPSBfdGhpcyRwcm9wczYkdGFiSW5kZXggPT09IHZvaWQgMCA/IDAgOiBfdGhpcyRwcm9wczYkdGFiSW5kZXgsXG4gICAgICAgICAgc2VsZWN0YWJsZSA9IF90aGlzJHByb3BzNi5zZWxlY3RhYmxlLFxuICAgICAgICAgIHNob3dJY29uID0gX3RoaXMkcHJvcHM2LnNob3dJY29uLFxuICAgICAgICAgIGljb24gPSBfdGhpcyRwcm9wczYuaWNvbixcbiAgICAgICAgICBzd2l0Y2hlckljb24gPSBfdGhpcyRwcm9wczYuc3dpdGNoZXJJY29uLFxuICAgICAgICAgIGRyYWdnYWJsZSA9IF90aGlzJHByb3BzNi5kcmFnZ2FibGUsXG4gICAgICAgICAgY2hlY2thYmxlID0gX3RoaXMkcHJvcHM2LmNoZWNrYWJsZSxcbiAgICAgICAgICBjaGVja1N0cmljdGx5ID0gX3RoaXMkcHJvcHM2LmNoZWNrU3RyaWN0bHksXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczYuZGlzYWJsZWQsXG4gICAgICAgICAgbW90aW9uID0gX3RoaXMkcHJvcHM2Lm1vdGlvbixcbiAgICAgICAgICBsb2FkRGF0YSA9IF90aGlzJHByb3BzNi5sb2FkRGF0YSxcbiAgICAgICAgICBmaWx0ZXJUcmVlTm9kZSA9IF90aGlzJHByb3BzNi5maWx0ZXJUcmVlTm9kZSxcbiAgICAgICAgICBoZWlnaHQgPSBfdGhpcyRwcm9wczYuaGVpZ2h0LFxuICAgICAgICAgIGl0ZW1IZWlnaHQgPSBfdGhpcyRwcm9wczYuaXRlbUhlaWdodCxcbiAgICAgICAgICB2aXJ0dWFsID0gX3RoaXMkcHJvcHM2LnZpcnR1YWwsXG4gICAgICAgICAgdGl0bGVSZW5kZXIgPSBfdGhpcyRwcm9wczYudGl0bGVSZW5kZXIsXG4gICAgICAgICAgb25Db250ZXh0TWVudSA9IF90aGlzJHByb3BzNi5vbkNvbnRleHRNZW51O1xuICAgICAgdmFyIGRvbVByb3BzID0gKDAsIF91dGlsLmdldERhdGFBbmRBcmlhKSh0aGlzLnByb3BzKTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KF9jb250ZXh0VHlwZXMuVHJlZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBzZWxlY3RhYmxlOiBzZWxlY3RhYmxlLFxuICAgICAgICAgIHNob3dJY29uOiBzaG93SWNvbixcbiAgICAgICAgICBpY29uOiBpY29uLFxuICAgICAgICAgIHN3aXRjaGVySWNvbjogc3dpdGNoZXJJY29uLFxuICAgICAgICAgIGRyYWdnYWJsZTogZHJhZ2dhYmxlLFxuICAgICAgICAgIGNoZWNrYWJsZTogY2hlY2thYmxlLFxuICAgICAgICAgIGNoZWNrU3RyaWN0bHk6IGNoZWNrU3RyaWN0bHksXG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgIGtleUVudGl0aWVzOiBrZXlFbnRpdGllcyxcbiAgICAgICAgICBsb2FkRGF0YTogbG9hZERhdGEsXG4gICAgICAgICAgZmlsdGVyVHJlZU5vZGU6IGZpbHRlclRyZWVOb2RlLFxuICAgICAgICAgIHRpdGxlUmVuZGVyOiB0aXRsZVJlbmRlcixcbiAgICAgICAgICBvbk5vZGVDbGljazogdGhpcy5vbk5vZGVDbGljayxcbiAgICAgICAgICBvbk5vZGVEb3VibGVDbGljazogdGhpcy5vbk5vZGVEb3VibGVDbGljayxcbiAgICAgICAgICBvbk5vZGVFeHBhbmQ6IHRoaXMub25Ob2RlRXhwYW5kLFxuICAgICAgICAgIG9uTm9kZVNlbGVjdDogdGhpcy5vbk5vZGVTZWxlY3QsXG4gICAgICAgICAgb25Ob2RlQ2hlY2s6IHRoaXMub25Ob2RlQ2hlY2ssXG4gICAgICAgICAgb25Ob2RlTG9hZDogdGhpcy5vbk5vZGVMb2FkLFxuICAgICAgICAgIG9uTm9kZU1vdXNlRW50ZXI6IHRoaXMub25Ob2RlTW91c2VFbnRlcixcbiAgICAgICAgICBvbk5vZGVNb3VzZUxlYXZlOiB0aGlzLm9uTm9kZU1vdXNlTGVhdmUsXG4gICAgICAgICAgb25Ob2RlQ29udGV4dE1lbnU6IHRoaXMub25Ob2RlQ29udGV4dE1lbnUsXG4gICAgICAgICAgb25Ob2RlRHJhZ1N0YXJ0OiB0aGlzLm9uTm9kZURyYWdTdGFydCxcbiAgICAgICAgICBvbk5vZGVEcmFnRW50ZXI6IHRoaXMub25Ob2RlRHJhZ0VudGVyLFxuICAgICAgICAgIG9uTm9kZURyYWdPdmVyOiB0aGlzLm9uTm9kZURyYWdPdmVyLFxuICAgICAgICAgIG9uTm9kZURyYWdMZWF2ZTogdGhpcy5vbk5vZGVEcmFnTGVhdmUsXG4gICAgICAgICAgb25Ob2RlRHJhZ0VuZDogdGhpcy5vbk5vZGVEcmFnRW5kLFxuICAgICAgICAgIG9uTm9kZURyb3A6IHRoaXMub25Ob2RlRHJvcFxuICAgICAgICB9XG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkocHJlZml4Q2xzLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWxpbmVcIiksIHNob3dMaW5lKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9jdXNlZFwiKSwgZm9jdXNlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZS1mb2N1c2VkXCIpLCBhY3RpdmVLZXkgIT09IG51bGwpLCBfY2xhc3NOYW1lcykpXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9Ob2RlTGlzdC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcmVmOiB0aGlzLmxpc3RSZWYsXG4gICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGRhdGE6IGZsYXR0ZW5Ob2RlcyxcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICBzZWxlY3RhYmxlOiBzZWxlY3RhYmxlLFxuICAgICAgICBjaGVja2FibGU6ICEhY2hlY2thYmxlLFxuICAgICAgICBtb3Rpb246IG1vdGlvbixcbiAgICAgICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgaXRlbUhlaWdodDogaXRlbUhlaWdodCxcbiAgICAgICAgdmlydHVhbDogdmlydHVhbCxcbiAgICAgICAgZm9jdXNhYmxlOiBmb2N1c2FibGUsXG4gICAgICAgIGZvY3VzZWQ6IGZvY3VzZWQsXG4gICAgICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICAgICAgYWN0aXZlSXRlbTogdGhpcy5nZXRBY3RpdmVJdGVtKCksXG4gICAgICAgIG9uRm9jdXM6IHRoaXMub25Gb2N1cyxcbiAgICAgICAgb25CbHVyOiB0aGlzLm9uQmx1cixcbiAgICAgICAgb25LZXlEb3duOiB0aGlzLm9uS2V5RG93bixcbiAgICAgICAgb25BY3RpdmVDaGFuZ2U6IHRoaXMub25BY3RpdmVDaGFuZ2UsXG4gICAgICAgIG9uTGlzdENoYW5nZVN0YXJ0OiB0aGlzLm9uTGlzdENoYW5nZVN0YXJ0LFxuICAgICAgICBvbkxpc3RDaGFuZ2VFbmQ6IHRoaXMub25MaXN0Q2hhbmdlRW5kLFxuICAgICAgICBvbkNvbnRleHRNZW51OiBvbkNvbnRleHRNZW51XG4gICAgICB9LCB0aGlzLmdldFRyZWVOb2RlUmVxdWlyZWRQcm9wcygpLCBkb21Qcm9wcykpKSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICB2YXIgcHJldlByb3BzID0gcHJldlN0YXRlLnByZXZQcm9wcztcbiAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAgICAgcHJldlByb3BzOiBwcm9wc1xuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gbmVlZFN5bmMobmFtZSkge1xuICAgICAgICByZXR1cm4gIXByZXZQcm9wcyAmJiBuYW1lIGluIHByb3BzIHx8IHByZXZQcm9wcyAmJiBwcmV2UHJvcHNbbmFtZV0gIT09IHByb3BzW25hbWVdO1xuICAgICAgfSAvLyA9PT09PT09PT09PT09PT09PT0gVHJlZSBOb2RlID09PT09PT09PT09PT09PT09PVxuXG5cbiAgICAgIHZhciB0cmVlRGF0YTsgLy8gQ2hlY2sgaWYgYHRyZWVEYXRhYCBvciBgY2hpbGRyZW5gIGNoYW5nZWQgYW5kIHNhdmUgaW50byB0aGUgc3RhdGUuXG5cbiAgICAgIGlmIChuZWVkU3luYygndHJlZURhdGEnKSkge1xuICAgICAgICB0cmVlRGF0YSA9IHByb3BzLnRyZWVEYXRhO1xuICAgICAgfSBlbHNlIGlmIChuZWVkU3luYygnY2hpbGRyZW4nKSkge1xuICAgICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsICdgY2hpbGRyZW5gIG9mIFRyZWUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgdHJlZURhdGFgIGluc3RlYWQuJyk7XG4gICAgICAgIHRyZWVEYXRhID0gKDAsIF90cmVlVXRpbC5jb252ZXJ0VHJlZVRvRGF0YSkocHJvcHMuY2hpbGRyZW4pO1xuICAgICAgfSAvLyBTYXZlIGZsYXR0ZW4gbm9kZXMgaW5mbyBhbmQgY29udmVydCBgdHJlZURhdGFgIGludG8ga2V5RW50aXRpZXNcblxuXG4gICAgICBpZiAodHJlZURhdGEpIHtcbiAgICAgICAgbmV3U3RhdGUudHJlZURhdGEgPSB0cmVlRGF0YTtcbiAgICAgICAgdmFyIGVudGl0aWVzTWFwID0gKDAsIF90cmVlVXRpbC5jb252ZXJ0RGF0YVRvRW50aXRpZXMpKHRyZWVEYXRhKTtcbiAgICAgICAgbmV3U3RhdGUua2V5RW50aXRpZXMgPSAoMCwgX29iamVjdFNwcmVhZDMuZGVmYXVsdCkoKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoe30sIF9Ob2RlTGlzdC5NT1RJT05fS0VZLCBfTm9kZUxpc3QuTW90aW9uRW50aXR5KSwgZW50aXRpZXNNYXAua2V5RW50aXRpZXMpOyAvLyBXYXJuaW5nIGlmIHRyZWVOb2RlIG5vdCBwcm92aWRlIGtleVxuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgKDAsIF90cmVlVXRpbC53YXJuaW5nV2l0aG91dEtleSkodHJlZURhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXlFbnRpdGllcyA9IG5ld1N0YXRlLmtleUVudGl0aWVzIHx8IHByZXZTdGF0ZS5rZXlFbnRpdGllczsgLy8gPT09PT09PT09PT09PT09PSBleHBhbmRlZEtleXMgPT09PT09PT09PT09PT09PT1cblxuICAgICAgaWYgKG5lZWRTeW5jKCdleHBhbmRlZEtleXMnKSB8fCBwcmV2UHJvcHMgJiYgbmVlZFN5bmMoJ2F1dG9FeHBhbmRQYXJlbnQnKSkge1xuICAgICAgICBuZXdTdGF0ZS5leHBhbmRlZEtleXMgPSBwcm9wcy5hdXRvRXhwYW5kUGFyZW50IHx8ICFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdEV4cGFuZFBhcmVudCA/ICgwLCBfdXRpbC5jb25kdWN0RXhwYW5kUGFyZW50KShwcm9wcy5leHBhbmRlZEtleXMsIGtleUVudGl0aWVzKSA6IHByb3BzLmV4cGFuZGVkS2V5cztcbiAgICAgIH0gZWxzZSBpZiAoIXByZXZQcm9wcyAmJiBwcm9wcy5kZWZhdWx0RXhwYW5kQWxsKSB7XG4gICAgICAgIHZhciBjbG9uZUtleUVudGl0aWVzID0gKDAsIF9vYmplY3RTcHJlYWQzLmRlZmF1bHQpKHt9LCBrZXlFbnRpdGllcyk7XG4gICAgICAgIGRlbGV0ZSBjbG9uZUtleUVudGl0aWVzW19Ob2RlTGlzdC5NT1RJT05fS0VZXTtcbiAgICAgICAgbmV3U3RhdGUuZXhwYW5kZWRLZXlzID0gT2JqZWN0LmtleXMoY2xvbmVLZXlFbnRpdGllcykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gY2xvbmVLZXlFbnRpdGllc1trZXldLmtleTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdEV4cGFuZGVkS2V5cykge1xuICAgICAgICBuZXdTdGF0ZS5leHBhbmRlZEtleXMgPSBwcm9wcy5hdXRvRXhwYW5kUGFyZW50IHx8IHByb3BzLmRlZmF1bHRFeHBhbmRQYXJlbnQgPyAoMCwgX3V0aWwuY29uZHVjdEV4cGFuZFBhcmVudCkocHJvcHMuZGVmYXVsdEV4cGFuZGVkS2V5cywga2V5RW50aXRpZXMpIDogcHJvcHMuZGVmYXVsdEV4cGFuZGVkS2V5cztcbiAgICAgIH1cblxuICAgICAgaWYgKCFuZXdTdGF0ZS5leHBhbmRlZEtleXMpIHtcbiAgICAgICAgZGVsZXRlIG5ld1N0YXRlLmV4cGFuZGVkS2V5cztcbiAgICAgIH0gLy8gPT09PT09PT09PT09PT09PSBmbGF0dGVuTm9kZXMgPT09PT09PT09PT09PT09PT1cblxuXG4gICAgICBpZiAodHJlZURhdGEgfHwgbmV3U3RhdGUuZXhwYW5kZWRLZXlzKSB7XG4gICAgICAgIHZhciBmbGF0dGVuTm9kZXMgPSAoMCwgX3RyZWVVdGlsLmZsYXR0ZW5UcmVlRGF0YSkodHJlZURhdGEgfHwgcHJldlN0YXRlLnRyZWVEYXRhLCBuZXdTdGF0ZS5leHBhbmRlZEtleXMgfHwgcHJldlN0YXRlLmV4cGFuZGVkS2V5cyk7XG4gICAgICAgIG5ld1N0YXRlLmZsYXR0ZW5Ob2RlcyA9IGZsYXR0ZW5Ob2RlcztcbiAgICAgIH0gLy8gPT09PT09PT09PT09PT09PSBzZWxlY3RlZEtleXMgPT09PT09PT09PT09PT09PT1cblxuXG4gICAgICBpZiAocHJvcHMuc2VsZWN0YWJsZSkge1xuICAgICAgICBpZiAobmVlZFN5bmMoJ3NlbGVjdGVkS2V5cycpKSB7XG4gICAgICAgICAgbmV3U3RhdGUuc2VsZWN0ZWRLZXlzID0gKDAsIF91dGlsLmNhbGNTZWxlY3RlZEtleXMpKHByb3BzLnNlbGVjdGVkS2V5cywgcHJvcHMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdFNlbGVjdGVkS2V5cykge1xuICAgICAgICAgIG5ld1N0YXRlLnNlbGVjdGVkS2V5cyA9ICgwLCBfdXRpbC5jYWxjU2VsZWN0ZWRLZXlzKShwcm9wcy5kZWZhdWx0U2VsZWN0ZWRLZXlzLCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gPT09PT09PT09PT09PT09PT0gY2hlY2tlZEtleXMgPT09PT09PT09PT09PT09PT1cblxuXG4gICAgICBpZiAocHJvcHMuY2hlY2thYmxlKSB7XG4gICAgICAgIHZhciBjaGVja2VkS2V5RW50aXR5O1xuXG4gICAgICAgIGlmIChuZWVkU3luYygnY2hlY2tlZEtleXMnKSkge1xuICAgICAgICAgIGNoZWNrZWRLZXlFbnRpdHkgPSAoMCwgX3V0aWwucGFyc2VDaGVja2VkS2V5cykocHJvcHMuY2hlY2tlZEtleXMpIHx8IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWRLZXlzKSB7XG4gICAgICAgICAgY2hlY2tlZEtleUVudGl0eSA9ICgwLCBfdXRpbC5wYXJzZUNoZWNrZWRLZXlzKShwcm9wcy5kZWZhdWx0Q2hlY2tlZEtleXMpIHx8IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKHRyZWVEYXRhKSB7XG4gICAgICAgICAgLy8gSWYgYHRyZWVEYXRhYCBjaGFuZ2VkLCB3ZSBhbHNvIG5lZWQgY2hlY2sgaXRcbiAgICAgICAgICBjaGVja2VkS2V5RW50aXR5ID0gKDAsIF91dGlsLnBhcnNlQ2hlY2tlZEtleXMpKHByb3BzLmNoZWNrZWRLZXlzKSB8fCB7XG4gICAgICAgICAgICBjaGVja2VkS2V5czogcHJldlN0YXRlLmNoZWNrZWRLZXlzLFxuICAgICAgICAgICAgaGFsZkNoZWNrZWRLZXlzOiBwcmV2U3RhdGUuaGFsZkNoZWNrZWRLZXlzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGVja2VkS2V5RW50aXR5KSB7XG4gICAgICAgICAgdmFyIF9jaGVja2VkS2V5RW50aXR5ID0gY2hlY2tlZEtleUVudGl0eSxcbiAgICAgICAgICAgICAgX2NoZWNrZWRLZXlFbnRpdHkkY2hlID0gX2NoZWNrZWRLZXlFbnRpdHkuY2hlY2tlZEtleXMsXG4gICAgICAgICAgICAgIGNoZWNrZWRLZXlzID0gX2NoZWNrZWRLZXlFbnRpdHkkY2hlID09PSB2b2lkIDAgPyBbXSA6IF9jaGVja2VkS2V5RW50aXR5JGNoZSxcbiAgICAgICAgICAgICAgX2NoZWNrZWRLZXlFbnRpdHkkaGFsID0gX2NoZWNrZWRLZXlFbnRpdHkuaGFsZkNoZWNrZWRLZXlzLFxuICAgICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXMgPSBfY2hlY2tlZEtleUVudGl0eSRoYWwgPT09IHZvaWQgMCA/IFtdIDogX2NoZWNrZWRLZXlFbnRpdHkkaGFsO1xuXG4gICAgICAgICAgaWYgKCFwcm9wcy5jaGVja1N0cmljdGx5KSB7XG4gICAgICAgICAgICB2YXIgY29uZHVjdEtleXMgPSAoMCwgX2NvbmR1Y3RVdGlsLmNvbmR1Y3RDaGVjaykoY2hlY2tlZEtleXMsIHRydWUsIGtleUVudGl0aWVzKTtcbiAgICAgICAgICAgIGNoZWNrZWRLZXlzID0gY29uZHVjdEtleXMuY2hlY2tlZEtleXM7XG4gICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXMgPSBjb25kdWN0S2V5cy5oYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3U3RhdGUuY2hlY2tlZEtleXMgPSBjaGVja2VkS2V5cztcbiAgICAgICAgICBuZXdTdGF0ZS5oYWxmQ2hlY2tlZEtleXMgPSBoYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gPT09PT09PT09PT09PT09PT0gbG9hZGVkS2V5cyA9PT09PT09PT09PT09PT09PT1cblxuXG4gICAgICBpZiAobmVlZFN5bmMoJ2xvYWRlZEtleXMnKSkge1xuICAgICAgICBuZXdTdGF0ZS5sb2FkZWRLZXlzID0gcHJvcHMubG9hZGVkS2V5cztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVHJlZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuVHJlZS5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZWZpeENsczogJ3JjLXRyZWUnLFxuICBzaG93TGluZTogZmFsc2UsXG4gIHNob3dJY29uOiB0cnVlLFxuICBzZWxlY3RhYmxlOiB0cnVlLFxuICBtdWx0aXBsZTogZmFsc2UsXG4gIGNoZWNrYWJsZTogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgY2hlY2tTdHJpY3RseTogZmFsc2UsXG4gIGRyYWdnYWJsZTogZmFsc2UsXG4gIGRlZmF1bHRFeHBhbmRQYXJlbnQ6IHRydWUsXG4gIGF1dG9FeHBhbmRQYXJlbnQ6IGZhbHNlLFxuICBkZWZhdWx0RXhwYW5kQWxsOiBmYWxzZSxcbiAgZGVmYXVsdEV4cGFuZGVkS2V5czogW10sXG4gIGRlZmF1bHRDaGVja2VkS2V5czogW10sXG4gIGRlZmF1bHRTZWxlY3RlZEtleXM6IFtdXG59O1xuVHJlZS5UcmVlTm9kZSA9IF9UcmVlTm9kZS5kZWZhdWx0O1xudmFyIF9kZWZhdWx0ID0gVHJlZTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuSW50ZXJuYWxUcmVlTm9kZSA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpKTtcblxudmFyIF9jcmVhdGVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpKTtcblxudmFyIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIikpO1xuXG52YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIikpO1xuXG52YXIgX2NyZWF0ZVN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlU3VwZXJcIikpO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9jb250ZXh0VHlwZXMgPSByZXF1aXJlKFwiLi9jb250ZXh0VHlwZXNcIik7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbnZhciBfSW5kZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JbmRlbnRcIikpO1xuXG52YXIgX3RyZWVVdGlsID0gcmVxdWlyZShcIi4vdXRpbHMvdHJlZVV0aWxcIik7XG5cbi8vIEB0cy1pZ25vcmVcbnZhciBJQ09OX09QRU4gPSAnb3Blbic7XG52YXIgSUNPTl9DTE9TRSA9ICdjbG9zZSc7XG52YXIgZGVmYXVsdFRpdGxlID0gJy0tLSc7XG5cbnZhciBJbnRlcm5hbFRyZWVOb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKEludGVybmFsVHJlZU5vZGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSAoMCwgX2NyZWF0ZVN1cGVyMi5kZWZhdWx0KShJbnRlcm5hbFRyZWVOb2RlKTtcblxuICBmdW5jdGlvbiBJbnRlcm5hbFRyZWVOb2RlKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIEludGVybmFsVHJlZU5vZGUpO1xuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBkcmFnTm9kZUhpZ2hsaWdodDogZmFsc2VcbiAgICB9O1xuXG4gICAgX3RoaXMub25TZWxlY3RvckNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIENsaWNrIHRyaWdnZXIgYmVmb3JlIHNlbGVjdC9jaGVjayBvcGVyYXRpb25cbiAgICAgIHZhciBvbk5vZGVDbGljayA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlQ2xpY2s7XG4gICAgICBvbk5vZGVDbGljayhlLCAoMCwgX3RyZWVVdGlsLmNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YSkoX3RoaXMucHJvcHMpKTtcblxuICAgICAgaWYgKF90aGlzLmlzU2VsZWN0YWJsZSgpKSB7XG4gICAgICAgIF90aGlzLm9uU2VsZWN0KGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMub25DaGVjayhlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25TZWxlY3RvckRvdWJsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbk5vZGVEb3VibGVDbGljayA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlRG91YmxlQ2xpY2s7XG4gICAgICBvbk5vZGVEb3VibGVDbGljayhlLCAoMCwgX3RyZWVVdGlsLmNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YSkoX3RoaXMucHJvcHMpKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25TZWxlY3QgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKF90aGlzLmlzRGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgdmFyIG9uTm9kZVNlbGVjdCA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlU2VsZWN0O1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgb25Ob2RlU2VsZWN0KGUsICgwLCBfdHJlZVV0aWwuY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKShfdGhpcy5wcm9wcykpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkNoZWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChfdGhpcy5pc0Rpc2FibGVkKCkpIHJldHVybjtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGRpc2FibGVDaGVja2JveCA9IF90aGlzJHByb3BzLmRpc2FibGVDaGVja2JveCxcbiAgICAgICAgICBjaGVja2VkID0gX3RoaXMkcHJvcHMuY2hlY2tlZDtcbiAgICAgIHZhciBvbk5vZGVDaGVjayA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlQ2hlY2s7XG4gICAgICBpZiAoIV90aGlzLmlzQ2hlY2thYmxlKCkgfHwgZGlzYWJsZUNoZWNrYm94KSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgdGFyZ2V0Q2hlY2tlZCA9ICFjaGVja2VkO1xuICAgICAgb25Ob2RlQ2hlY2soZSwgKDAsIF90cmVlVXRpbC5jb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEpKF90aGlzLnByb3BzKSwgdGFyZ2V0Q2hlY2tlZCk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uTW91c2VFbnRlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlTW91c2VFbnRlciA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlTW91c2VFbnRlcjtcbiAgICAgIG9uTm9kZU1vdXNlRW50ZXIoZSwgKDAsIF90cmVlVXRpbC5jb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEpKF90aGlzLnByb3BzKSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlTW91c2VMZWF2ZSA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlTW91c2VMZWF2ZTtcbiAgICAgIG9uTm9kZU1vdXNlTGVhdmUoZSwgKDAsIF90cmVlVXRpbC5jb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEpKF90aGlzLnByb3BzKSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uTm9kZUNvbnRleHRNZW51ID0gX3RoaXMucHJvcHMuY29udGV4dC5vbk5vZGVDb250ZXh0TWVudTtcbiAgICAgIG9uTm9kZUNvbnRleHRNZW51KGUsICgwLCBfdHJlZVV0aWwuY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKShfdGhpcy5wcm9wcykpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkRyYWdTdGFydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlRHJhZ1N0YXJ0ID0gX3RoaXMucHJvcHMuY29udGV4dC5vbk5vZGVEcmFnU3RhcnQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdOb2RlSGlnaGxpZ2h0OiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgb25Ob2RlRHJhZ1N0YXJ0KGUsICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcykpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBpZSB0aHJvdyBlcnJvclxuICAgICAgICAvLyBmaXJlZm94LW5lZWQtaXRcbiAgICAgICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9wbGFpbicsICcnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7Ly8gZW1wdHlcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25EcmFnRW50ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uTm9kZURyYWdFbnRlciA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlRHJhZ0VudGVyO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG9uTm9kZURyYWdFbnRlcihlLCAoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25EcmFnT3ZlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlRHJhZ092ZXIgPSBfdGhpcy5wcm9wcy5jb250ZXh0Lm9uTm9kZURyYWdPdmVyO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG9uTm9kZURyYWdPdmVyKGUsICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcykpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkRyYWdMZWF2ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlRHJhZ0xlYXZlID0gX3RoaXMucHJvcHMuY29udGV4dC5vbk5vZGVEcmFnTGVhdmU7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25Ob2RlRHJhZ0xlYXZlKGUsICgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcykpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkRyYWdFbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uTm9kZURyYWdFbmQgPSBfdGhpcy5wcm9wcy5jb250ZXh0Lm9uTm9kZURyYWdFbmQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdOb2RlSGlnaGxpZ2h0OiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIG9uTm9kZURyYWdFbmQoZSwgKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uRHJvcCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlRHJvcCA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlRHJvcDtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ05vZGVIaWdobGlnaHQ6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgb25Ob2RlRHJvcChlLCAoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpKTtcbiAgICB9OyAvLyBEaXNhYmxlZCBpdGVtIHN0aWxsIGNhbiBiZSBzd2l0Y2hcblxuXG4gICAgX3RoaXMub25FeHBhbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uTm9kZUV4cGFuZCA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlRXhwYW5kO1xuICAgICAgb25Ob2RlRXhwYW5kKGUsICgwLCBfdHJlZVV0aWwuY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKShfdGhpcy5wcm9wcykpO1xuICAgIH07IC8vIERyYWcgdXNhZ2VcblxuXG4gICAgX3RoaXMuc2V0U2VsZWN0SGFuZGxlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLnNlbGVjdEhhbmRsZSA9IG5vZGU7XG4gICAgfTtcblxuICAgIF90aGlzLmdldE5vZGVTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBleHBhbmRlZCA9IF90aGlzLnByb3BzLmV4cGFuZGVkO1xuXG4gICAgICBpZiAoX3RoaXMuaXNMZWFmKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleHBhbmRlZCA/IElDT05fT1BFTiA6IElDT05fQ0xPU0U7XG4gICAgfTtcblxuICAgIF90aGlzLmhhc0NoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV2ZW50S2V5ID0gX3RoaXMucHJvcHMuZXZlbnRLZXk7XG4gICAgICB2YXIga2V5RW50aXRpZXMgPSBfdGhpcy5wcm9wcy5jb250ZXh0LmtleUVudGl0aWVzO1xuXG4gICAgICB2YXIgX3JlZiA9IGtleUVudGl0aWVzW2V2ZW50S2V5XSB8fCB7fSxcbiAgICAgICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG5cbiAgICAgIHJldHVybiAhIShjaGlsZHJlbiB8fCBbXSkubGVuZ3RoO1xuICAgIH07XG5cbiAgICBfdGhpcy5pc0xlYWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgaXNMZWFmID0gX3RoaXMkcHJvcHMyLmlzTGVhZixcbiAgICAgICAgICBsb2FkZWQgPSBfdGhpcyRwcm9wczIubG9hZGVkO1xuICAgICAgdmFyIGxvYWREYXRhID0gX3RoaXMucHJvcHMuY29udGV4dC5sb2FkRGF0YTtcblxuICAgICAgdmFyIGhhc0NoaWxkcmVuID0gX3RoaXMuaGFzQ2hpbGRyZW4oKTtcblxuICAgICAgaWYgKGlzTGVhZiA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNMZWFmIHx8ICFsb2FkRGF0YSAmJiAhaGFzQ2hpbGRyZW4gfHwgbG9hZERhdGEgJiYgbG9hZGVkICYmICFoYXNDaGlsZHJlbjtcbiAgICB9O1xuXG4gICAgX3RoaXMuaXNEaXNhYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBkaXNhYmxlZCA9IF90aGlzLnByb3BzLmRpc2FibGVkO1xuICAgICAgdmFyIHRyZWVEaXNhYmxlZCA9IF90aGlzLnByb3BzLmNvbnRleHQuZGlzYWJsZWQ7XG4gICAgICByZXR1cm4gISEodHJlZURpc2FibGVkIHx8IGRpc2FibGVkKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaXNDaGVja2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hlY2thYmxlID0gX3RoaXMucHJvcHMuY2hlY2thYmxlO1xuICAgICAgdmFyIHRyZWVDaGVja2FibGUgPSBfdGhpcy5wcm9wcy5jb250ZXh0LmNoZWNrYWJsZTsgLy8gUmV0dXJuIGZhbHNlIGlmIHRyZWUgb3IgdHJlZU5vZGUgaXMgbm90IGNoZWNrYWJsZVxuXG4gICAgICBpZiAoIXRyZWVDaGVja2FibGUgfHwgY2hlY2thYmxlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRyZWVDaGVja2FibGU7XG4gICAgfTsgLy8gTG9hZCBkYXRhIHRvIGF2b2lkIGRlZmF1bHQgZXhwYW5kZWQgdHJlZSB3aXRob3V0IGRhdGFcblxuXG4gICAgX3RoaXMuc3luY0xvYWREYXRhID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICB2YXIgZXhwYW5kZWQgPSBwcm9wcy5leHBhbmRlZCxcbiAgICAgICAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICAgICAgICBsb2FkZWQgPSBwcm9wcy5sb2FkZWQ7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMkY29udGV4dCA9IF90aGlzLnByb3BzLmNvbnRleHQsXG4gICAgICAgICAgbG9hZERhdGEgPSBfdGhpcyRwcm9wcyRjb250ZXh0LmxvYWREYXRhLFxuICAgICAgICAgIG9uTm9kZUxvYWQgPSBfdGhpcyRwcm9wcyRjb250ZXh0Lm9uTm9kZUxvYWQ7XG4gICAgICBpZiAobG9hZGluZykgcmV0dXJuOyAvLyByZWFkIGZyb20gc3RhdGUgdG8gYXZvaWQgbG9hZERhdGEgYXQgc2FtZSB0aW1lXG5cbiAgICAgIGlmIChsb2FkRGF0YSAmJiBleHBhbmRlZCAmJiAhX3RoaXMuaXNMZWFmKCkpIHtcbiAgICAgICAgLy8gV2UgbmVlZG4ndCByZWxvYWQgZGF0YSB3aGVuIGhhcyBjaGlsZHJlbiBpbiBzeW5jIGxvZ2ljXG4gICAgICAgIC8vIEl0J3Mgb25seSBuZWVkZWQgaW4gbm9kZSBleHBhbmRlZFxuICAgICAgICBpZiAoIV90aGlzLmhhc0NoaWxkcmVuKCkgJiYgIWxvYWRlZCkge1xuICAgICAgICAgIG9uTm9kZUxvYWQoKDAsIF90cmVlVXRpbC5jb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEpKF90aGlzLnByb3BzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9OyAvLyBTd2l0Y2hlclxuXG5cbiAgICBfdGhpcy5yZW5kZXJTd2l0Y2hlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBleHBhbmRlZCA9IF90aGlzJHByb3BzMy5leHBhbmRlZCxcbiAgICAgICAgICBzd2l0Y2hlckljb25Gcm9tUHJvcHMgPSBfdGhpcyRwcm9wczMuc3dpdGNoZXJJY29uO1xuICAgICAgdmFyIF90aGlzJHByb3BzJGNvbnRleHQyID0gX3RoaXMucHJvcHMuY29udGV4dCxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcyRjb250ZXh0Mi5wcmVmaXhDbHMsXG4gICAgICAgICAgc3dpdGNoZXJJY29uRnJvbUN0eCA9IF90aGlzJHByb3BzJGNvbnRleHQyLnN3aXRjaGVySWNvbjtcbiAgICAgIHZhciBzd2l0Y2hlckljb24gPSBzd2l0Y2hlckljb25Gcm9tUHJvcHMgfHwgc3dpdGNoZXJJY29uRnJvbUN0eDtcblxuICAgICAgaWYgKF90aGlzLmlzTGVhZigpKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlclwiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1ub29wXCIpKVxuICAgICAgICB9LCB0eXBlb2Ygc3dpdGNoZXJJY29uID09PSAnZnVuY3Rpb24nID8gc3dpdGNoZXJJY29uKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIF90aGlzLnByb3BzKSwge30sIHtcbiAgICAgICAgICBpc0xlYWY6IHRydWVcbiAgICAgICAgfSkpIDogc3dpdGNoZXJJY29uKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN3aXRjaGVyQ2xzID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoZXJcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoZXJfXCIpLmNvbmNhdChleHBhbmRlZCA/IElDT05fT1BFTiA6IElDT05fQ0xPU0UpKTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIG9uQ2xpY2s6IF90aGlzLm9uRXhwYW5kLFxuICAgICAgICBjbGFzc05hbWU6IHN3aXRjaGVyQ2xzXG4gICAgICB9LCB0eXBlb2Ygc3dpdGNoZXJJY29uID09PSAnZnVuY3Rpb24nID8gc3dpdGNoZXJJY29uKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIF90aGlzLnByb3BzKSwge30sIHtcbiAgICAgICAgaXNMZWFmOiBmYWxzZVxuICAgICAgfSkpIDogc3dpdGNoZXJJY29uKTtcbiAgICB9OyAvLyBDaGVja2JveFxuXG5cbiAgICBfdGhpcy5yZW5kZXJDaGVja2JveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGVja2VkID0gX3RoaXMkcHJvcHM0LmNoZWNrZWQsXG4gICAgICAgICAgaGFsZkNoZWNrZWQgPSBfdGhpcyRwcm9wczQuaGFsZkNoZWNrZWQsXG4gICAgICAgICAgZGlzYWJsZUNoZWNrYm94ID0gX3RoaXMkcHJvcHM0LmRpc2FibGVDaGVja2JveDtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBfdGhpcy5wcm9wcy5jb250ZXh0LnByZWZpeENscztcblxuICAgICAgdmFyIGRpc2FibGVkID0gX3RoaXMuaXNEaXNhYmxlZCgpO1xuXG4gICAgICB2YXIgY2hlY2thYmxlID0gX3RoaXMuaXNDaGVja2FibGUoKTtcblxuICAgICAgaWYgKCFjaGVja2FibGUpIHJldHVybiBudWxsOyAvLyBbTGVnYWN5XSBDdXN0b20gZWxlbWVudCBzaG91bGQgYmUgc2VwYXJhdGUgd2l0aCBgY2hlY2thYmxlYCBpbiBmdXR1cmVcblxuICAgICAgdmFyICRjdXN0b20gPSB0eXBlb2YgY2hlY2thYmxlICE9PSAnYm9vbGVhbicgPyBjaGVja2FibGUgOiBudWxsO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaGVja2JveFwiKSwgY2hlY2tlZCAmJiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrYm94LWNoZWNrZWRcIiksICFjaGVja2VkICYmIGhhbGZDaGVja2VkICYmIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVwiKSwgKGRpc2FibGVkIHx8IGRpc2FibGVDaGVja2JveCkgJiYgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaGVja2JveC1kaXNhYmxlZFwiKSksXG4gICAgICAgIG9uQ2xpY2s6IF90aGlzLm9uQ2hlY2tcbiAgICAgIH0sICRjdXN0b20pO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJJY29uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGxvYWRpbmcgPSBfdGhpcy5wcm9wcy5sb2FkaW5nO1xuICAgICAgdmFyIHByZWZpeENscyA9IF90aGlzLnByb3BzLmNvbnRleHQucHJlZml4Q2xzO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uRWxlXCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb25fX1wiKS5jb25jYXQoX3RoaXMuZ2V0Tm9kZVN0YXRlKCkgfHwgJ2RvY3UnKSwgbG9hZGluZyAmJiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb25fbG9hZGluZ1wiKSlcbiAgICAgIH0pO1xuICAgIH07IC8vIEljb24gKyBUaXRsZVxuXG5cbiAgICBfdGhpcy5yZW5kZXJTZWxlY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBkcmFnTm9kZUhpZ2hsaWdodCA9IF90aGlzLnN0YXRlLmRyYWdOb2RlSGlnaGxpZ2h0O1xuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHRpdGxlID0gX3RoaXMkcHJvcHM1LnRpdGxlLFxuICAgICAgICAgIHNlbGVjdGVkID0gX3RoaXMkcHJvcHM1LnNlbGVjdGVkLFxuICAgICAgICAgIGljb24gPSBfdGhpcyRwcm9wczUuaWNvbixcbiAgICAgICAgICBsb2FkaW5nID0gX3RoaXMkcHJvcHM1LmxvYWRpbmcsXG4gICAgICAgICAgZGF0YSA9IF90aGlzJHByb3BzNS5kYXRhO1xuICAgICAgdmFyIF90aGlzJHByb3BzJGNvbnRleHQzID0gX3RoaXMucHJvcHMuY29udGV4dCxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcyRjb250ZXh0My5wcmVmaXhDbHMsXG4gICAgICAgICAgc2hvd0ljb24gPSBfdGhpcyRwcm9wcyRjb250ZXh0My5zaG93SWNvbixcbiAgICAgICAgICB0cmVlSWNvbiA9IF90aGlzJHByb3BzJGNvbnRleHQzLmljb24sXG4gICAgICAgICAgZHJhZ2dhYmxlID0gX3RoaXMkcHJvcHMkY29udGV4dDMuZHJhZ2dhYmxlLFxuICAgICAgICAgIGxvYWREYXRhID0gX3RoaXMkcHJvcHMkY29udGV4dDMubG9hZERhdGEsXG4gICAgICAgICAgdGl0bGVSZW5kZXIgPSBfdGhpcyRwcm9wcyRjb250ZXh0My50aXRsZVJlbmRlcjtcblxuICAgICAgdmFyIGRpc2FibGVkID0gX3RoaXMuaXNEaXNhYmxlZCgpO1xuXG4gICAgICB2YXIgd3JhcENsYXNzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ub2RlLWNvbnRlbnQtd3JhcHBlclwiKTsgLy8gSWNvbiAtIFN0aWxsIHNob3cgbG9hZGluZyBpY29uIHdoZW4gbG9hZGluZyB3aXRob3V0IHNob3dJY29uXG5cbiAgICAgIHZhciAkaWNvbjtcblxuICAgICAgaWYgKHNob3dJY29uKSB7XG4gICAgICAgIHZhciBjdXJyZW50SWNvbiA9IGljb24gfHwgdHJlZUljb247XG4gICAgICAgICRpY29uID0gY3VycmVudEljb24gPyBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uRWxlXCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb25fX2N1c3RvbWl6ZVwiKSlcbiAgICAgICAgfSwgdHlwZW9mIGN1cnJlbnRJY29uID09PSAnZnVuY3Rpb24nID8gY3VycmVudEljb24oX3RoaXMucHJvcHMpIDogY3VycmVudEljb24pIDogX3RoaXMucmVuZGVySWNvbigpO1xuICAgICAgfSBlbHNlIGlmIChsb2FkRGF0YSAmJiBsb2FkaW5nKSB7XG4gICAgICAgICRpY29uID0gX3RoaXMucmVuZGVySWNvbigpO1xuICAgICAgfSAvLyBUaXRsZVxuXG5cbiAgICAgIHZhciB0aXRsZU5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2YgdGl0bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGl0bGVOb2RlID0gdGl0bGUoZGF0YSk7XG4gICAgICB9IGVsc2UgaWYgKHRpdGxlUmVuZGVyKSB7XG4gICAgICAgIHRpdGxlTm9kZSA9IHRpdGxlUmVuZGVyKGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGVOb2RlID0gdGl0bGU7XG4gICAgICB9XG5cbiAgICAgIHZhciAkdGl0bGUgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aXRsZVwiKVxuICAgICAgfSwgdGl0bGVOb2RlKTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIHJlZjogX3RoaXMuc2V0U2VsZWN0SGFuZGxlLFxuICAgICAgICB0aXRsZTogdHlwZW9mIHRpdGxlID09PSAnc3RyaW5nJyA/IHRpdGxlIDogJycsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHdyYXBDbGFzcyksIFwiXCIuY29uY2F0KHdyYXBDbGFzcywgXCItXCIpLmNvbmNhdChfdGhpcy5nZXROb2RlU3RhdGUoKSB8fCAnbm9ybWFsJyksICFkaXNhYmxlZCAmJiAoc2VsZWN0ZWQgfHwgZHJhZ05vZGVIaWdobGlnaHQpICYmIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbm9kZS1zZWxlY3RlZFwiKSwgIWRpc2FibGVkICYmIGRyYWdnYWJsZSAmJiAnZHJhZ2dhYmxlJyksXG4gICAgICAgIGRyYWdnYWJsZTogIWRpc2FibGVkICYmIGRyYWdnYWJsZSB8fCB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1ncmFiYmVkXCI6ICFkaXNhYmxlZCAmJiBkcmFnZ2FibGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICBvbk1vdXNlRW50ZXI6IF90aGlzLm9uTW91c2VFbnRlcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBfdGhpcy5vbk1vdXNlTGVhdmUsXG4gICAgICAgIG9uQ29udGV4dE1lbnU6IF90aGlzLm9uQ29udGV4dE1lbnUsXG4gICAgICAgIG9uQ2xpY2s6IF90aGlzLm9uU2VsZWN0b3JDbGljayxcbiAgICAgICAgb25Eb3VibGVDbGljazogX3RoaXMub25TZWxlY3RvckRvdWJsZUNsaWNrLFxuICAgICAgICBvbkRyYWdTdGFydDogZHJhZ2dhYmxlID8gX3RoaXMub25EcmFnU3RhcnQgOiB1bmRlZmluZWRcbiAgICAgIH0sICRpY29uLCAkdGl0bGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH0gLy8gSXNvbW9ycGhpYyBuZWVkbid0IGxvYWQgZGF0YSBpbiBzZXJ2ZXIgc2lkZVxuXG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoSW50ZXJuYWxUcmVlTm9kZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnN5bmNMb2FkRGF0YSh0aGlzLnByb3BzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuc3luY0xvYWREYXRhKHRoaXMucHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1NlbGVjdGFibGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNTZWxlY3RhYmxlKCkge1xuICAgICAgdmFyIHNlbGVjdGFibGUgPSB0aGlzLnByb3BzLnNlbGVjdGFibGU7XG4gICAgICB2YXIgdHJlZVNlbGVjdGFibGUgPSB0aGlzLnByb3BzLmNvbnRleHQuc2VsZWN0YWJsZTsgLy8gSWdub3JlIHdoZW4gc2VsZWN0YWJsZSBpcyB1bmRlZmluZWQgb3IgbnVsbFxuXG4gICAgICBpZiAodHlwZW9mIHNlbGVjdGFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gc2VsZWN0YWJsZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyZWVTZWxlY3RhYmxlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBldmVudEtleSA9IF90aGlzJHByb3BzNi5ldmVudEtleSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczYuY2xhc3NOYW1lLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHM2LnN0eWxlLFxuICAgICAgICAgIGRyYWdPdmVyID0gX3RoaXMkcHJvcHM2LmRyYWdPdmVyLFxuICAgICAgICAgIGRyYWdPdmVyR2FwVG9wID0gX3RoaXMkcHJvcHM2LmRyYWdPdmVyR2FwVG9wLFxuICAgICAgICAgIGRyYWdPdmVyR2FwQm90dG9tID0gX3RoaXMkcHJvcHM2LmRyYWdPdmVyR2FwQm90dG9tLFxuICAgICAgICAgIGlzTGVhZiA9IF90aGlzJHByb3BzNi5pc0xlYWYsXG4gICAgICAgICAgaXNTdGFydCA9IF90aGlzJHByb3BzNi5pc1N0YXJ0LFxuICAgICAgICAgIGlzRW5kID0gX3RoaXMkcHJvcHM2LmlzRW5kLFxuICAgICAgICAgIGV4cGFuZGVkID0gX3RoaXMkcHJvcHM2LmV4cGFuZGVkLFxuICAgICAgICAgIHNlbGVjdGVkID0gX3RoaXMkcHJvcHM2LnNlbGVjdGVkLFxuICAgICAgICAgIGNoZWNrZWQgPSBfdGhpcyRwcm9wczYuY2hlY2tlZCxcbiAgICAgICAgICBoYWxmQ2hlY2tlZCA9IF90aGlzJHByb3BzNi5oYWxmQ2hlY2tlZCxcbiAgICAgICAgICBsb2FkaW5nID0gX3RoaXMkcHJvcHM2LmxvYWRpbmcsXG4gICAgICAgICAgZG9tUmVmID0gX3RoaXMkcHJvcHM2LmRvbVJlZixcbiAgICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wczYuYWN0aXZlLFxuICAgICAgICAgIG9uTW91c2VNb3ZlID0gX3RoaXMkcHJvcHM2Lm9uTW91c2VNb3ZlLFxuICAgICAgICAgIG90aGVyUHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfdGhpcyRwcm9wczYsIFtcImV2ZW50S2V5XCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJkcmFnT3ZlclwiLCBcImRyYWdPdmVyR2FwVG9wXCIsIFwiZHJhZ092ZXJHYXBCb3R0b21cIiwgXCJpc0xlYWZcIiwgXCJpc1N0YXJ0XCIsIFwiaXNFbmRcIiwgXCJleHBhbmRlZFwiLCBcInNlbGVjdGVkXCIsIFwiY2hlY2tlZFwiLCBcImhhbGZDaGVja2VkXCIsIFwibG9hZGluZ1wiLCBcImRvbVJlZlwiLCBcImFjdGl2ZVwiLCBcIm9uTW91c2VNb3ZlXCJdKTtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyRjb250ZXh0NCA9IHRoaXMucHJvcHMuY29udGV4dCxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcyRjb250ZXh0NC5wcmVmaXhDbHMsXG4gICAgICAgICAgZmlsdGVyVHJlZU5vZGUgPSBfdGhpcyRwcm9wcyRjb250ZXh0NC5maWx0ZXJUcmVlTm9kZSxcbiAgICAgICAgICBkcmFnZ2FibGUgPSBfdGhpcyRwcm9wcyRjb250ZXh0NC5kcmFnZ2FibGUsXG4gICAgICAgICAga2V5RW50aXRpZXMgPSBfdGhpcyRwcm9wcyRjb250ZXh0NC5rZXlFbnRpdGllcztcbiAgICAgIHZhciBkaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZCgpO1xuICAgICAgdmFyIGRhdGFPckFyaWFBdHRyaWJ1dGVQcm9wcyA9ICgwLCBfdXRpbC5nZXREYXRhQW5kQXJpYSkob3RoZXJQcm9wcyk7XG5cbiAgICAgIHZhciBfcmVmMiA9IGtleUVudGl0aWVzW2V2ZW50S2V5XSB8fCB7fSxcbiAgICAgICAgICBsZXZlbCA9IF9yZWYyLmxldmVsO1xuXG4gICAgICB2YXIgaXNFbmROb2RlID0gaXNFbmRbaXNFbmQubGVuZ3RoIC0gMV07XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcmVmOiBkb21SZWYsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGNsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlbm9kZVwiKSwgKF9jbGFzc05hbWVzID0ge30sICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLXN3aXRjaGVyLVwiKS5jb25jYXQoZXhwYW5kZWQgPyAnb3BlbicgOiAnY2xvc2UnKSwgIWlzTGVhZiksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLWNoZWNrYm94LWNoZWNrZWRcIiksIGNoZWNrZWQpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlbm9kZS1jaGVja2JveC1pbmRldGVybWluYXRlXCIpLCBoYWxmQ2hlY2tlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLXNlbGVjdGVkXCIpLCBzZWxlY3RlZCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLWxvYWRpbmdcIiksIGxvYWRpbmcpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlbm9kZS1hY3RpdmVcIiksIGFjdGl2ZSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLWxlYWYtbGFzdFwiKSwgaXNFbmROb2RlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsICdkcmFnLW92ZXInLCAhZGlzYWJsZWQgJiYgZHJhZ092ZXIpLCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgJ2RyYWctb3Zlci1nYXAtdG9wJywgIWRpc2FibGVkICYmIGRyYWdPdmVyR2FwVG9wKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsICdkcmFnLW92ZXItZ2FwLWJvdHRvbScsICFkaXNhYmxlZCAmJiBkcmFnT3ZlckdhcEJvdHRvbSksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKF9jbGFzc05hbWVzLCAnZmlsdGVyLW5vZGUnLCBmaWx0ZXJUcmVlTm9kZSAmJiBmaWx0ZXJUcmVlTm9kZSgoMCwgX3RyZWVVdGlsLmNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YSkodGhpcy5wcm9wcykpKSwgX2NsYXNzTmFtZXMpKSxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBvbkRyYWdFbnRlcjogZHJhZ2dhYmxlID8gdGhpcy5vbkRyYWdFbnRlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgb25EcmFnT3ZlcjogZHJhZ2dhYmxlID8gdGhpcy5vbkRyYWdPdmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBvbkRyYWdMZWF2ZTogZHJhZ2dhYmxlID8gdGhpcy5vbkRyYWdMZWF2ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgb25Ecm9wOiBkcmFnZ2FibGUgPyB0aGlzLm9uRHJvcCA6IHVuZGVmaW5lZCxcbiAgICAgICAgb25EcmFnRW5kOiBkcmFnZ2FibGUgPyB0aGlzLm9uRHJhZ0VuZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgb25Nb3VzZU1vdmU6IG9uTW91c2VNb3ZlXG4gICAgICB9LCBkYXRhT3JBcmlhQXR0cmlidXRlUHJvcHMpLCBSZWFjdC5jcmVhdGVFbGVtZW50KF9JbmRlbnQuZGVmYXVsdCwge1xuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgICBpc1N0YXJ0OiBpc1N0YXJ0LFxuICAgICAgICBpc0VuZDogaXNFbmRcbiAgICAgIH0pLCB0aGlzLnJlbmRlclN3aXRjaGVyKCksIHRoaXMucmVuZGVyQ2hlY2tib3goKSwgdGhpcy5yZW5kZXJTZWxlY3RvcigpKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEludGVybmFsVHJlZU5vZGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHMuSW50ZXJuYWxUcmVlTm9kZSA9IEludGVybmFsVHJlZU5vZGU7XG5cbnZhciBDb250ZXh0VHJlZU5vZGUgPSBmdW5jdGlvbiBDb250ZXh0VHJlZU5vZGUocHJvcHMpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbnRleHRUeXBlcy5UcmVlQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbFRyZWVOb2RlLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgY29udGV4dDogY29udGV4dFxuICAgIH0pKTtcbiAgfSk7XG59O1xuXG5Db250ZXh0VHJlZU5vZGUuZGlzcGxheU5hbWUgPSAnVHJlZU5vZGUnO1xuQ29udGV4dFRyZWVOb2RlLmRlZmF1bHRQcm9wcyA9IHtcbiAgdGl0bGU6IGRlZmF1bHRUaXRsZVxufTtcbkNvbnRleHRUcmVlTm9kZS5pc1RyZWVOb2RlID0gMTtcbnZhciBfZGVmYXVsdCA9IENvbnRleHRUcmVlTm9kZTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5UcmVlQ29udGV4dCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuLyoqXG4gKiBXZWJwYWNrIGhhcyBidWcgZm9yIGltcG9ydCBsb29wLCB3aGljaCBpcyBub3QgdGhlIHNhbWUgYmVoYXZpb3IgYXMgRVMgbW9kdWxlLlxuICogV2hlbiB1dGlsLmpzIGltcG9ydHMgdGhlIFRyZWVOb2RlIGZvciB0cmVlIGdlbmVyYXRlIHdpbGwgY2F1c2UgdHJlZUNvbnRleHRUeXBlcyBiZSBlbXB0eS5cbiAqL1xudmFyIFRyZWVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydHMuVHJlZUNvbnRleHQgPSBUcmVlQ29udGV4dDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmVlTm9kZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfVHJlZU5vZGUuZGVmYXVsdDtcbiAgfVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfVHJlZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVHJlZVwiKSk7XG5cbnZhciBfVHJlZU5vZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RyZWVOb2RlXCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX1RyZWUuZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYXJyRGVsID0gYXJyRGVsO1xuZXhwb3J0cy5hcnJBZGQgPSBhcnJBZGQ7XG5leHBvcnRzLnBvc1RvQXJyID0gcG9zVG9BcnI7XG5leHBvcnRzLmdldFBvc2l0aW9uID0gZ2V0UG9zaXRpb247XG5leHBvcnRzLmlzVHJlZU5vZGUgPSBpc1RyZWVOb2RlO1xuZXhwb3J0cy5nZXREcmFnTm9kZXNLZXlzID0gZ2V0RHJhZ05vZGVzS2V5cztcbmV4cG9ydHMuY2FsY0Ryb3BQb3NpdGlvbiA9IGNhbGNEcm9wUG9zaXRpb247XG5leHBvcnRzLmNhbGNTZWxlY3RlZEtleXMgPSBjYWxjU2VsZWN0ZWRLZXlzO1xuZXhwb3J0cy5jb252ZXJ0RGF0YVRvVHJlZSA9IGNvbnZlcnREYXRhVG9UcmVlO1xuZXhwb3J0cy5wYXJzZUNoZWNrZWRLZXlzID0gcGFyc2VDaGVja2VkS2V5cztcbmV4cG9ydHMuY29uZHVjdEV4cGFuZFBhcmVudCA9IGNvbmR1Y3RFeHBhbmRQYXJlbnQ7XG5leHBvcnRzLmdldERhdGFBbmRBcmlhID0gZ2V0RGF0YUFuZEFyaWE7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG5cbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfVHJlZU5vZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RyZWVOb2RlXCIpKTtcblxuLyoqXG4gKiBMZWdhY3kgY29kZS4gU2hvdWxkIGF2b2lkIHRvIHVzZSBpZiB5b3UgYXJlIG5ldyB0byBpbXBvcnQgdGhlc2UgY29kZS5cbiAqL1xudmFyIERSQUdfU0lERV9SQU5HRSA9IDAuMjU7XG52YXIgRFJBR19NSU5fR0FQID0gMjtcblxuZnVuY3Rpb24gYXJyRGVsKGxpc3QsIHZhbHVlKSB7XG4gIHZhciBjbG9uZSA9IGxpc3Quc2xpY2UoKTtcbiAgdmFyIGluZGV4ID0gY2xvbmUuaW5kZXhPZih2YWx1ZSk7XG5cbiAgaWYgKGluZGV4ID49IDApIHtcbiAgICBjbG9uZS5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lO1xufVxuXG5mdW5jdGlvbiBhcnJBZGQobGlzdCwgdmFsdWUpIHtcbiAgdmFyIGNsb25lID0gbGlzdC5zbGljZSgpO1xuXG4gIGlmIChjbG9uZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBjbG9uZS5wdXNoKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gcG9zVG9BcnIocG9zKSB7XG4gIHJldHVybiBwb3Muc3BsaXQoJy0nKTtcbn1cblxuZnVuY3Rpb24gZ2V0UG9zaXRpb24obGV2ZWwsIGluZGV4KSB7XG4gIHJldHVybiBcIlwiLmNvbmNhdChsZXZlbCwgXCItXCIpLmNvbmNhdChpbmRleCk7XG59XG5cbmZ1bmN0aW9uIGlzVHJlZU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLnR5cGUgJiYgbm9kZS50eXBlLmlzVHJlZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldERyYWdOb2Rlc0tleXMoZHJhZ05vZGVLZXksIGtleUVudGl0aWVzKSB7XG4gIHZhciBkcmFnTm9kZXNLZXlzID0gW2RyYWdOb2RlS2V5XTtcbiAgdmFyIGVudGl0eSA9IGtleUVudGl0aWVzW2RyYWdOb2RlS2V5XTtcblxuICBmdW5jdGlvbiBkaWcoKSB7XG4gICAgdmFyIGxpc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGtleSA9IF9yZWYua2V5LFxuICAgICAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgICAgIGRyYWdOb2Rlc0tleXMucHVzaChrZXkpO1xuICAgICAgZGlnKGNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRpZyhlbnRpdHkuY2hpbGRyZW4pO1xuICByZXR1cm4gZHJhZ05vZGVzS2V5cztcbn0gLy8gT25seSB1c2VkIHdoZW4gZHJhZywgbm90IGFmZmVjdCBTU1IuXG5cblxuZnVuY3Rpb24gY2FsY0Ryb3BQb3NpdGlvbihldmVudCwgdHJlZU5vZGUpIHtcbiAgdmFyIGNsaWVudFkgPSBldmVudC5jbGllbnRZO1xuXG4gIHZhciBfdHJlZU5vZGUkc2VsZWN0SGFuZGwgPSB0cmVlTm9kZS5zZWxlY3RIYW5kbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICB0b3AgPSBfdHJlZU5vZGUkc2VsZWN0SGFuZGwudG9wLFxuICAgICAgYm90dG9tID0gX3RyZWVOb2RlJHNlbGVjdEhhbmRsLmJvdHRvbSxcbiAgICAgIGhlaWdodCA9IF90cmVlTm9kZSRzZWxlY3RIYW5kbC5oZWlnaHQ7XG5cbiAgdmFyIGRlcyA9IE1hdGgubWF4KGhlaWdodCAqIERSQUdfU0lERV9SQU5HRSwgRFJBR19NSU5fR0FQKTtcblxuICBpZiAoY2xpZW50WSA8PSB0b3AgKyBkZXMpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBpZiAoY2xpZW50WSA+PSBib3R0b20gLSBkZXMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuLyoqXG4gKiBSZXR1cm4gc2VsZWN0ZWRLZXlzIGFjY29yZGluZyB3aXRoIG11bHRpcGxlIHByb3BcbiAqIEBwYXJhbSBzZWxlY3RlZEtleXNcbiAqIEBwYXJhbSBwcm9wc1xuICogQHJldHVybnMgW3N0cmluZ11cbiAqL1xuXG5cbmZ1bmN0aW9uIGNhbGNTZWxlY3RlZEtleXMoc2VsZWN0ZWRLZXlzLCBwcm9wcykge1xuICBpZiAoIXNlbGVjdGVkS2V5cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG11bHRpcGxlID0gcHJvcHMubXVsdGlwbGU7XG5cbiAgaWYgKG11bHRpcGxlKSB7XG4gICAgcmV0dXJuIHNlbGVjdGVkS2V5cy5zbGljZSgpO1xuICB9XG5cbiAgaWYgKHNlbGVjdGVkS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gW3NlbGVjdGVkS2V5c1swXV07XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRLZXlzO1xufVxuXG52YXIgaW50ZXJuYWxQcm9jZXNzUHJvcHMgPSBmdW5jdGlvbiBpbnRlcm5hbFByb2Nlc3NQcm9wcyhwcm9wcykge1xuICByZXR1cm4gcHJvcHM7XG59O1xuXG5mdW5jdGlvbiBjb252ZXJ0RGF0YVRvVHJlZSh0cmVlRGF0YSwgcHJvY2Vzc29yKSB7XG4gIGlmICghdHJlZURhdGEpIHJldHVybiBbXTtcblxuICB2YXIgX3JlZjIgPSBwcm9jZXNzb3IgfHwge30sXG4gICAgICBfcmVmMiRwcm9jZXNzUHJvcHMgPSBfcmVmMi5wcm9jZXNzUHJvcHMsXG4gICAgICBwcm9jZXNzUHJvcHMgPSBfcmVmMiRwcm9jZXNzUHJvcHMgPT09IHZvaWQgMCA/IGludGVybmFsUHJvY2Vzc1Byb3BzIDogX3JlZjIkcHJvY2Vzc1Byb3BzO1xuXG4gIHZhciBsaXN0ID0gQXJyYXkuaXNBcnJheSh0cmVlRGF0YSkgPyB0cmVlRGF0YSA6IFt0cmVlRGF0YV07XG4gIHJldHVybiBsaXN0Lm1hcChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfcmVmMy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShfcmVmMywgW1wiY2hpbGRyZW5cIl0pO1xuICAgIHZhciBjaGlsZHJlbk5vZGVzID0gY29udmVydERhdGFUb1RyZWUoY2hpbGRyZW4sIHByb2Nlc3Nvcik7XG4gICAgcmV0dXJuIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX1RyZWVOb2RlLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3NQcm9wcyhwcm9wcykpLCBjaGlsZHJlbk5vZGVzKTtcbiAgfSk7XG59XG4vKipcbiAqIFBhcnNlIGBjaGVja2VkS2V5c2AgdG8geyBjaGVja2VkS2V5cywgaGFsZkNoZWNrZWRLZXlzIH0gc3R5bGVcbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnNlQ2hlY2tlZEtleXMoa2V5cykge1xuICBpZiAoIWtleXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBDb252ZXJ0IGtleXMgdG8gb2JqZWN0IGZvcm1hdFxuXG5cbiAgdmFyIGtleVByb3BzO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgLy8gW0xlZ2FjeV0gRm9sbG93IHRoZSBhcGkgZG9jXG4gICAga2V5UHJvcHMgPSB7XG4gICAgICBjaGVja2VkS2V5czoga2V5cyxcbiAgICAgIGhhbGZDaGVja2VkS2V5czogdW5kZWZpbmVkXG4gICAgfTtcbiAgfSBlbHNlIGlmICgoMCwgX3R5cGVvZjIuZGVmYXVsdCkoa2V5cykgPT09ICdvYmplY3QnKSB7XG4gICAga2V5UHJvcHMgPSB7XG4gICAgICBjaGVja2VkS2V5czoga2V5cy5jaGVja2VkIHx8IHVuZGVmaW5lZCxcbiAgICAgIGhhbGZDaGVja2VkS2V5czoga2V5cy5oYWxmQ2hlY2tlZCB8fCB1bmRlZmluZWRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShmYWxzZSwgJ2BjaGVja2VkS2V5c2AgaXMgbm90IGFuIGFycmF5IG9yIGFuIG9iamVjdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGtleVByb3BzO1xufVxuLyoqXG4gKiBJZiB1c2VyIHVzZSBgYXV0b0V4cGFuZFBhcmVudGAgd2Ugc2hvdWxkIGdldCB0aGUgbGlzdCBvZiBwYXJlbnQgbm9kZVxuICogQHBhcmFtIGtleUxpc3RcbiAqIEBwYXJhbSBrZXlFbnRpdGllc1xuICovXG5cblxuZnVuY3Rpb24gY29uZHVjdEV4cGFuZFBhcmVudChrZXlMaXN0LCBrZXlFbnRpdGllcykge1xuICB2YXIgZXhwYW5kZWRLZXlzID0gbmV3IFNldCgpO1xuXG4gIGZ1bmN0aW9uIGNvbmR1Y3RVcChrZXkpIHtcbiAgICBpZiAoZXhwYW5kZWRLZXlzLmhhcyhrZXkpKSByZXR1cm47XG4gICAgdmFyIGVudGl0eSA9IGtleUVudGl0aWVzW2tleV07XG4gICAgaWYgKCFlbnRpdHkpIHJldHVybjtcbiAgICBleHBhbmRlZEtleXMuYWRkKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IGVudGl0eS5wYXJlbnQsXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZTtcbiAgICBpZiAobm9kZS5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgY29uZHVjdFVwKHBhcmVudC5rZXkpO1xuICAgIH1cbiAgfVxuXG4gIChrZXlMaXN0IHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBjb25kdWN0VXAoa2V5KTtcbiAgfSk7XG4gIHJldHVybiAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShleHBhbmRlZEtleXMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgdGhlIGRhdGEtIGFuZCBhcmlhLSBrZXkvdmFsdWUgcGFpcnNcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldERhdGFBbmRBcmlhKHByb3BzKSB7XG4gIHZhciBvbWl0UHJvcHMgPSB7fTtcbiAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnZGF0YS0nKSB8fCBrZXkuc3RhcnRzV2l0aCgnYXJpYS0nKSkge1xuICAgICAgb21pdFByb3BzW2tleV0gPSBwcm9wc1trZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvbWl0UHJvcHM7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc0NoZWNrRGlzYWJsZWQgPSBpc0NoZWNrRGlzYWJsZWQ7XG5leHBvcnRzLmNvbmR1Y3RDaGVjayA9IGNvbmR1Y3RDaGVjaztcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbmZ1bmN0aW9uIHJlbW92ZUZyb21DaGVja2VkS2V5cyhoYWxmQ2hlY2tlZEtleXMsIGNoZWNrZWRLZXlzKSB7XG4gIHZhciBmaWx0ZXJlZEtleXMgPSBuZXcgU2V0KCk7XG4gIGhhbGZDaGVja2VkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIWNoZWNrZWRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICBmaWx0ZXJlZEtleXMuYWRkKGtleSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpbHRlcmVkS2V5cztcbn1cblxuZnVuY3Rpb24gaXNDaGVja0Rpc2FibGVkKG5vZGUpIHtcbiAgdmFyIF9yZWYgPSBub2RlIHx8IHt9LFxuICAgICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgICAgZGlzYWJsZUNoZWNrYm94ID0gX3JlZi5kaXNhYmxlQ2hlY2tib3gsXG4gICAgICBjaGVja2FibGUgPSBfcmVmLmNoZWNrYWJsZTtcblxuICByZXR1cm4gISEoZGlzYWJsZWQgfHwgZGlzYWJsZUNoZWNrYm94KSB8fCBjaGVja2FibGUgPT09IGZhbHNlO1xufSAvLyBGaWxsIG1pc3Mga2V5c1xuXG5cbmZ1bmN0aW9uIGZpbGxDb25kdWN0Q2hlY2soa2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpIHtcbiAgdmFyIGNoZWNrZWRLZXlzID0gbmV3IFNldChrZXlzKTtcbiAgdmFyIGhhbGZDaGVja2VkS2V5cyA9IG5ldyBTZXQoKTsgLy8gQWRkIGNoZWNrZWQga2V5cyB0b3AgdG8gYm90dG9tXG5cbiAgZm9yICh2YXIgbGV2ZWwgPSAwOyBsZXZlbCA8PSBtYXhMZXZlbDsgbGV2ZWwgKz0gMSkge1xuICAgIHZhciBlbnRpdGllcyA9IGxldmVsRW50aXRpZXMuZ2V0KGxldmVsKSB8fCBuZXcgU2V0KCk7XG4gICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICB2YXIga2V5ID0gZW50aXR5LmtleSxcbiAgICAgICAgICBub2RlID0gZW50aXR5Lm5vZGUsXG4gICAgICAgICAgX2VudGl0eSRjaGlsZHJlbiA9IGVudGl0eS5jaGlsZHJlbixcbiAgICAgICAgICBjaGlsZHJlbiA9IF9lbnRpdHkkY2hpbGRyZW4gPT09IHZvaWQgMCA/IFtdIDogX2VudGl0eSRjaGlsZHJlbjtcblxuICAgICAgaWYgKGNoZWNrZWRLZXlzLmhhcyhrZXkpICYmICFzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKG5vZGUpKSB7XG4gICAgICAgIGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgICByZXR1cm4gIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoY2hpbGRFbnRpdHkubm9kZSk7XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkRW50aXR5KSB7XG4gICAgICAgICAgY2hlY2tlZEtleXMuYWRkKGNoaWxkRW50aXR5LmtleSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9IC8vIEFkZCBjaGVja2VkIGtleXMgZnJvbSBib3R0b20gdG8gdG9wXG5cblxuICB2YXIgdmlzaXRlZEtleXMgPSBuZXcgU2V0KCk7XG5cbiAgZm9yICh2YXIgX2xldmVsID0gbWF4TGV2ZWw7IF9sZXZlbCA+PSAwOyBfbGV2ZWwgLT0gMSkge1xuICAgIHZhciBfZW50aXRpZXMgPSBsZXZlbEVudGl0aWVzLmdldChfbGV2ZWwpIHx8IG5ldyBTZXQoKTtcblxuICAgIF9lbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBlbnRpdHkucGFyZW50LFxuICAgICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZTsgLy8gU2tpcCBpZiBubyBuZWVkIHRvIGNoZWNrXG5cbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKG5vZGUpIHx8ICFlbnRpdHkucGFyZW50IHx8IHZpc2l0ZWRLZXlzLmhhcyhlbnRpdHkucGFyZW50LmtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBTa2lwIGlmIHBhcmVudCBpcyBkaXNhYmxlZFxuXG5cbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGVudGl0eS5wYXJlbnQubm9kZSkpIHtcbiAgICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBhbGxDaGVja2VkID0gdHJ1ZTtcbiAgICAgIHZhciBwYXJ0aWFsQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgKHBhcmVudC5jaGlsZHJlbiB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICByZXR1cm4gIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoY2hpbGRFbnRpdHkubm9kZSk7XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjIua2V5O1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGNoZWNrZWRLZXlzLmhhcyhrZXkpO1xuXG4gICAgICAgIGlmIChhbGxDaGVja2VkICYmICFjaGVja2VkKSB7XG4gICAgICAgICAgYWxsQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXJ0aWFsQ2hlY2tlZCAmJiAoY2hlY2tlZCB8fCBoYWxmQ2hlY2tlZEtleXMuaGFzKGtleSkpKSB7XG4gICAgICAgICAgcGFydGlhbENoZWNrZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGFsbENoZWNrZWQpIHtcbiAgICAgICAgY2hlY2tlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFydGlhbENoZWNrZWQpIHtcbiAgICAgICAgaGFsZkNoZWNrZWRLZXlzLmFkZChwYXJlbnQua2V5KTtcbiAgICAgIH1cblxuICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjaGVja2VkS2V5czogQXJyYXkuZnJvbShjaGVja2VkS2V5cyksXG4gICAgaGFsZkNoZWNrZWRLZXlzOiBBcnJheS5mcm9tKHJlbW92ZUZyb21DaGVja2VkS2V5cyhoYWxmQ2hlY2tlZEtleXMsIGNoZWNrZWRLZXlzKSlcbiAgfTtcbn0gLy8gUmVtb3ZlIHVzZWxlc3Mga2V5XG5cblxuZnVuY3Rpb24gY2xlYW5Db25kdWN0Q2hlY2soa2V5cywgaGFsZktleXMsIGxldmVsRW50aXRpZXMsIG1heExldmVsLCBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKSB7XG4gIHZhciBjaGVja2VkS2V5cyA9IG5ldyBTZXQoa2V5cyk7XG4gIHZhciBoYWxmQ2hlY2tlZEtleXMgPSBuZXcgU2V0KGhhbGZLZXlzKTsgLy8gUmVtb3ZlIGNoZWNrZWQga2V5cyBmcm9tIHRvcCB0byBib3R0b21cblxuICBmb3IgKHZhciBsZXZlbCA9IDA7IGxldmVsIDw9IG1heExldmVsOyBsZXZlbCArPSAxKSB7XG4gICAgdmFyIGVudGl0aWVzID0gbGV2ZWxFbnRpdGllcy5nZXQobGV2ZWwpIHx8IG5ldyBTZXQoKTtcbiAgICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgIHZhciBrZXkgPSBlbnRpdHkua2V5LFxuICAgICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgICBfZW50aXR5JGNoaWxkcmVuMiA9IGVudGl0eS5jaGlsZHJlbixcbiAgICAgICAgICBjaGlsZHJlbiA9IF9lbnRpdHkkY2hpbGRyZW4yID09PSB2b2lkIDAgPyBbXSA6IF9lbnRpdHkkY2hpbGRyZW4yO1xuXG4gICAgICBpZiAoIWNoZWNrZWRLZXlzLmhhcyhrZXkpICYmICFoYWxmQ2hlY2tlZEtleXMuaGFzKGtleSkgJiYgIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQobm9kZSkpIHtcbiAgICAgICAgY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgIHJldHVybiAhc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChjaGlsZEVudGl0eS5ub2RlKTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgICBjaGVja2VkS2V5cy5kZWxldGUoY2hpbGRFbnRpdHkua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gLy8gUmVtb3ZlIGNoZWNrZWQga2V5cyBmb3JtIGJvdHRvbSB0byB0b3BcblxuXG4gIGhhbGZDaGVja2VkS2V5cyA9IG5ldyBTZXQoKTtcbiAgdmFyIHZpc2l0ZWRLZXlzID0gbmV3IFNldCgpO1xuXG4gIGZvciAodmFyIF9sZXZlbDIgPSBtYXhMZXZlbDsgX2xldmVsMiA+PSAwOyBfbGV2ZWwyIC09IDEpIHtcbiAgICB2YXIgX2VudGl0aWVzMiA9IGxldmVsRW50aXRpZXMuZ2V0KF9sZXZlbDIpIHx8IG5ldyBTZXQoKTtcblxuICAgIF9lbnRpdGllczIuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICB2YXIgcGFyZW50ID0gZW50aXR5LnBhcmVudCxcbiAgICAgICAgICBub2RlID0gZW50aXR5Lm5vZGU7IC8vIFNraXAgaWYgbm8gbmVlZCB0byBjaGVja1xuXG4gICAgICBpZiAoc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChub2RlKSB8fCAhZW50aXR5LnBhcmVudCB8fCB2aXNpdGVkS2V5cy5oYXMoZW50aXR5LnBhcmVudC5rZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gU2tpcCBpZiBwYXJlbnQgaXMgZGlzYWJsZWRcblxuXG4gICAgICBpZiAoc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChlbnRpdHkucGFyZW50Lm5vZGUpKSB7XG4gICAgICAgIHZpc2l0ZWRLZXlzLmFkZChwYXJlbnQua2V5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWxsQ2hlY2tlZCA9IHRydWU7XG4gICAgICB2YXIgcGFydGlhbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuICFzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGNoaWxkRW50aXR5Lm5vZGUpO1xuICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYzLmtleTtcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBjaGVja2VkS2V5cy5oYXMoa2V5KTtcblxuICAgICAgICBpZiAoYWxsQ2hlY2tlZCAmJiAhY2hlY2tlZCkge1xuICAgICAgICAgIGFsbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFydGlhbENoZWNrZWQgJiYgKGNoZWNrZWQgfHwgaGFsZkNoZWNrZWRLZXlzLmhhcyhrZXkpKSkge1xuICAgICAgICAgIHBhcnRpYWxDaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghYWxsQ2hlY2tlZCkge1xuICAgICAgICBjaGVja2VkS2V5cy5kZWxldGUocGFyZW50LmtleSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0aWFsQ2hlY2tlZCkge1xuICAgICAgICBoYWxmQ2hlY2tlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgfVxuXG4gICAgICB2aXNpdGVkS2V5cy5hZGQocGFyZW50LmtleSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNoZWNrZWRLZXlzOiBBcnJheS5mcm9tKGNoZWNrZWRLZXlzKSxcbiAgICBoYWxmQ2hlY2tlZEtleXM6IEFycmF5LmZyb20ocmVtb3ZlRnJvbUNoZWNrZWRLZXlzKGhhbGZDaGVja2VkS2V5cywgY2hlY2tlZEtleXMpKVxuICB9O1xufVxuLyoqXG4gKiBDb25kdWN0IHdpdGgga2V5cy5cbiAqIEBwYXJhbSBrZXlMaXN0IGN1cnJlbnQga2V5IGxpc3RcbiAqIEBwYXJhbSBrZXlFbnRpdGllcyBrZXkgLSBkYXRhRW50aXR5IG1hcFxuICogQHBhcmFtIG1vZGUgYGZpbGxgIHRvIGZpbGwgbWlzc2luZyBrZXksIGBjbGVhbmAgdG8gcmVtb3ZlIHVzZWxlc3Mga2V5XG4gKi9cblxuXG5mdW5jdGlvbiBjb25kdWN0Q2hlY2soa2V5TGlzdCwgY2hlY2tlZCwga2V5RW50aXRpZXMsIGdldENoZWNrRGlzYWJsZWQpIHtcbiAgdmFyIHdhcm5pbmdNaXNzS2V5cyA9IFtdO1xuICB2YXIgc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZDtcblxuICBpZiAoZ2V0Q2hlY2tEaXNhYmxlZCkge1xuICAgIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQgPSBnZXRDaGVja0Rpc2FibGVkO1xuICB9IGVsc2Uge1xuICAgIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQgPSBpc0NoZWNrRGlzYWJsZWQ7XG4gIH0gLy8gV2Ugb25seSBoYW5kbGUgZXhpc3Qga2V5c1xuXG5cbiAgdmFyIGtleXMgPSBuZXcgU2V0KGtleUxpc3QuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaGFzRW50aXR5ID0gISFrZXlFbnRpdGllc1trZXldO1xuXG4gICAgaWYgKCFoYXNFbnRpdHkpIHtcbiAgICAgIHdhcm5pbmdNaXNzS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0VudGl0eTtcbiAgfSkpO1xuICB2YXIgbGV2ZWxFbnRpdGllcyA9IG5ldyBNYXAoKTtcbiAgdmFyIG1heExldmVsID0gMDsgLy8gQ29udmVydCBlbnRpdGllcyBieSBsZXZlbCBmb3IgY2FsY3VsYXRpb25cblxuICBPYmplY3Qua2V5cyhrZXlFbnRpdGllcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudGl0eSA9IGtleUVudGl0aWVzW2tleV07XG4gICAgdmFyIGxldmVsID0gZW50aXR5LmxldmVsO1xuICAgIHZhciBsZXZlbFNldCA9IGxldmVsRW50aXRpZXMuZ2V0KGxldmVsKTtcblxuICAgIGlmICghbGV2ZWxTZXQpIHtcbiAgICAgIGxldmVsU2V0ID0gbmV3IFNldCgpO1xuICAgICAgbGV2ZWxFbnRpdGllcy5zZXQobGV2ZWwsIGxldmVsU2V0KTtcbiAgICB9XG5cbiAgICBsZXZlbFNldC5hZGQoZW50aXR5KTtcbiAgICBtYXhMZXZlbCA9IE1hdGgubWF4KG1heExldmVsLCBsZXZlbCk7XG4gIH0pO1xuICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoIXdhcm5pbmdNaXNzS2V5cy5sZW5ndGgsIFwiVHJlZSBtaXNzaW5nIGZvbGxvdyBrZXlzOiBcIi5jb25jYXQod2FybmluZ01pc3NLZXlzLnNsaWNlKDAsIDEwMCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gXCInXCIuY29uY2F0KGtleSwgXCInXCIpO1xuICB9KS5qb2luKCcsICcpKSk7XG4gIHZhciByZXN1bHQ7XG5cbiAgaWYgKGNoZWNrZWQgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSBmaWxsQ29uZHVjdENoZWNrKGtleXMsIGxldmVsRW50aXRpZXMsIG1heExldmVsLCBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBjbGVhbkNvbmR1Y3RDaGVjayhrZXlzLCBjaGVja2VkLmhhbGZDaGVja2VkS2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZmluZEV4cGFuZGVkS2V5cyA9IGZpbmRFeHBhbmRlZEtleXM7XG5leHBvcnRzLmdldEV4cGFuZFJhbmdlID0gZ2V0RXhwYW5kUmFuZ2U7XG5cbmZ1bmN0aW9uIGZpbmRFeHBhbmRlZEtleXMoKSB7XG4gIHZhciBwcmV2ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgdmFyIG5leHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICB2YXIgcHJldkxlbiA9IHByZXYubGVuZ3RoO1xuICB2YXIgbmV4dExlbiA9IG5leHQubGVuZ3RoO1xuXG4gIGlmIChNYXRoLmFicyhwcmV2TGVuIC0gbmV4dExlbikgIT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWRkOiBmYWxzZSxcbiAgICAgIGtleTogbnVsbFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kKHNob3J0ZXIsIGxvbmdlcikge1xuICAgIHZhciBjYWNoZSA9IG5ldyBNYXAoKTtcbiAgICBzaG9ydGVyLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgY2FjaGUuc2V0KGtleSwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgdmFyIGtleXMgPSBsb25nZXIuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiAhY2FjaGUuaGFzKGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IG51bGw7XG4gIH1cblxuICBpZiAocHJldkxlbiA8IG5leHRMZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWRkOiB0cnVlLFxuICAgICAga2V5OiBmaW5kKHByZXYsIG5leHQpXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYWRkOiBmYWxzZSxcbiAgICBrZXk6IGZpbmQobmV4dCwgcHJldilcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwYW5kUmFuZ2Uoc2hvcnRlciwgbG9uZ2VyLCBrZXkpIHtcbiAgdmFyIHNob3J0ZXJTdGFydEluZGV4ID0gc2hvcnRlci5maW5kSW5kZXgoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZGF0YSA9IF9yZWYuZGF0YTtcbiAgICByZXR1cm4gZGF0YS5rZXkgPT09IGtleTtcbiAgfSk7XG4gIHZhciBzaG9ydGVyRW5kTm9kZSA9IHNob3J0ZXJbc2hvcnRlclN0YXJ0SW5kZXggKyAxXTtcbiAgdmFyIGxvbmdlclN0YXJ0SW5kZXggPSBsb25nZXIuZmluZEluZGV4KGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBkYXRhID0gX3JlZjIuZGF0YTtcbiAgICByZXR1cm4gZGF0YS5rZXkgPT09IGtleTtcbiAgfSk7XG5cbiAgaWYgKHNob3J0ZXJFbmROb2RlKSB7XG4gICAgdmFyIGxvbmdlckVuZEluZGV4ID0gbG9uZ2VyLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgIHZhciBkYXRhID0gX3JlZjMuZGF0YTtcbiAgICAgIHJldHVybiBkYXRhLmtleSA9PT0gc2hvcnRlckVuZE5vZGUuZGF0YS5rZXk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGxvbmdlci5zbGljZShsb25nZXJTdGFydEluZGV4ICsgMSwgbG9uZ2VyRW5kSW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIGxvbmdlci5zbGljZShsb25nZXJTdGFydEluZGV4ICsgMSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRLZXkgPSBnZXRLZXk7XG5leHBvcnRzLndhcm5pbmdXaXRob3V0S2V5ID0gd2FybmluZ1dpdGhvdXRLZXk7XG5leHBvcnRzLmNvbnZlcnRUcmVlVG9EYXRhID0gY29udmVydFRyZWVUb0RhdGE7XG5leHBvcnRzLmZsYXR0ZW5UcmVlRGF0YSA9IGZsYXR0ZW5UcmVlRGF0YTtcbmV4cG9ydHMudHJhdmVyc2VEYXRhTm9kZXMgPSB0cmF2ZXJzZURhdGFOb2RlcztcbmV4cG9ydHMuY29udmVydERhdGFUb0VudGl0aWVzID0gY29udmVydERhdGFUb0VudGl0aWVzO1xuZXhwb3J0cy5nZXRUcmVlTm9kZVByb3BzID0gZ2V0VHJlZU5vZGVQcm9wcztcbmV4cG9ydHMuY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhID0gY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhO1xuXG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX3RvQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9DaGlsZHJlbi90b0FycmF5XCIpKTtcblxudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuXG5mdW5jdGlvbiBnZXRLZXkoa2V5LCBwb3MpIHtcbiAgaWYgKGtleSAhPT0gbnVsbCAmJiBrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICByZXR1cm4gcG9zO1xufVxuLyoqXG4gKiBXYXJuaW5nIGlmIFRyZWVOb2RlIGRvIG5vdCBwcm92aWRlcyBrZXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHdhcm5pbmdXaXRob3V0S2V5KCkge1xuICB2YXIgdHJlZURhdGEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICB2YXIga2V5cyA9IG5ldyBNYXAoKTtcblxuICBmdW5jdGlvbiBkaWcobGlzdCkge1xuICAgIHZhciBwYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcbiAgICAobGlzdCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZS5rZXksXG4gICAgICAgICAgY2hpbGRyZW4gPSB0cmVlTm9kZS5jaGlsZHJlbjtcbiAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KShrZXkgIT09IG51bGwgJiYga2V5ICE9PSB1bmRlZmluZWQsIFwiVHJlZSBub2RlIG11c3QgaGF2ZSBhIGNlcnRhaW4ga2V5OiBbXCIuY29uY2F0KHBhdGgpLmNvbmNhdChrZXksIFwiXVwiKSk7XG4gICAgICB2YXIgcmVjb3JkS2V5ID0gU3RyaW5nKGtleSk7XG4gICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoIWtleXMuaGFzKHJlY29yZEtleSkgfHwga2V5ID09PSBudWxsIHx8IGtleSA9PT0gdW5kZWZpbmVkLCBcIlNhbWUgJ2tleScgZXhpc3QgaW4gdGhlIFRyZWU6IFwiLmNvbmNhdChyZWNvcmRLZXkpKTtcbiAgICAgIGtleXMuc2V0KHJlY29yZEtleSwgdHJ1ZSk7XG4gICAgICBkaWcoY2hpbGRyZW4sIFwiXCIuY29uY2F0KHBhdGgpLmNvbmNhdChyZWNvcmRLZXksIFwiID4gXCIpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRpZyh0cmVlRGF0YSk7XG59XG4vKipcbiAqIENvbnZlcnQgYGNoaWxkcmVuYCBvZiBUcmVlIGludG8gYHRyZWVEYXRhYCBzdHJ1Y3R1cmUuXG4gKi9cblxuXG5mdW5jdGlvbiBjb252ZXJ0VHJlZVRvRGF0YShyb290Tm9kZXMpIHtcbiAgZnVuY3Rpb24gZGlnKG5vZGUpIHtcbiAgICB2YXIgdHJlZU5vZGVzID0gKDAsIF90b0FycmF5LmRlZmF1bHQpKG5vZGUpO1xuICAgIHJldHVybiB0cmVlTm9kZXMubWFwKGZ1bmN0aW9uICh0cmVlTm9kZSkge1xuICAgICAgLy8gRmlsdGVyIGludmFsaWRhdGUgbm9kZVxuICAgICAgaWYgKCEoMCwgX3V0aWwuaXNUcmVlTm9kZSkodHJlZU5vZGUpKSB7XG4gICAgICAgICgwLCBfd2FybmluZy5kZWZhdWx0KSghdHJlZU5vZGUsICdUcmVlL1RyZWVOb2RlIGNhbiBvbmx5IGFjY2VwdCBUcmVlTm9kZSBhcyBjaGlsZHJlbi4nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZS5rZXk7XG4gICAgICB2YXIgX3RyZWVOb2RlJHByb3BzID0gdHJlZU5vZGUucHJvcHMsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdHJlZU5vZGUkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF90cmVlTm9kZSRwcm9wcywgW1wiY2hpbGRyZW5cIl0pO1xuICAgICAgdmFyIGRhdGFOb2RlID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHtcbiAgICAgICAga2V5OiBrZXlcbiAgICAgIH0sIHJlc3QpO1xuICAgICAgdmFyIHBhcnNlZENoaWxkcmVuID0gZGlnKGNoaWxkcmVuKTtcblxuICAgICAgaWYgKHBhcnNlZENoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBkYXRhTm9kZS5jaGlsZHJlbiA9IHBhcnNlZENoaWxkcmVuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YU5vZGU7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChkYXRhTm9kZSkge1xuICAgICAgcmV0dXJuIGRhdGFOb2RlO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGRpZyhyb290Tm9kZXMpO1xufVxuLyoqXG4gKiBGbGF0IG5lc3QgdHJlZSBkYXRhIGludG8gZmxhdHRlbiBsaXN0LiBUaGlzIGlzIHVzZWQgZm9yIHZpcnR1YWwgbGlzdCByZW5kZXIuXG4gKiBAcGFyYW0gdHJlZU5vZGVMaXN0IE9yaWdpbiBkYXRhIG5vZGUgbGlzdFxuICogQHBhcmFtIGV4cGFuZGVkS2V5c1xuICogbmVlZCBleHBhbmRlZCBrZXlzLCBwcm92aWRlcyBgdHJ1ZWAgbWVhbnMgYWxsIGV4cGFuZGVkICh1c2VkIGluIGByYy10cmVlLXNlbGVjdGApLlxuICovXG5cblxuZnVuY3Rpb24gZmxhdHRlblRyZWVEYXRhKCkge1xuICB2YXIgdHJlZU5vZGVMaXN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgdmFyIGV4cGFuZGVkS2V5cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107XG4gIHZhciBleHBhbmRlZEtleVNldCA9IG5ldyBTZXQoZXhwYW5kZWRLZXlzID09PSB0cnVlID8gW10gOiBleHBhbmRlZEtleXMpO1xuICB2YXIgZmxhdHRlbkxpc3QgPSBbXTtcblxuICBmdW5jdGlvbiBkaWcobGlzdCkge1xuICAgIHZhciBwYXJlbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgcmV0dXJuIGxpc3QubWFwKGZ1bmN0aW9uICh0cmVlTm9kZSwgaW5kZXgpIHtcbiAgICAgIHZhciBwb3MgPSAoMCwgX3V0aWwuZ2V0UG9zaXRpb24pKHBhcmVudCA/IHBhcmVudC5wb3MgOiAnMCcsIGluZGV4KTtcbiAgICAgIHZhciBtZXJnZWRLZXkgPSBnZXRLZXkodHJlZU5vZGUua2V5LCBwb3MpOyAvLyBBZGQgRmxhdHRlbkRhdGFOb2RlIGludG8gbGlzdFxuXG4gICAgICB2YXIgZmxhdHRlbk5vZGUgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCB0cmVlTm9kZSksIHt9LCB7XG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgY2hpbGRyZW46IG51bGwsXG4gICAgICAgIGRhdGE6IHRyZWVOb2RlLFxuICAgICAgICBpc1N0YXJ0OiBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkocGFyZW50ID8gcGFyZW50LmlzU3RhcnQgOiBbXSksIFtpbmRleCA9PT0gMF0pLFxuICAgICAgICBpc0VuZDogW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHBhcmVudCA/IHBhcmVudC5pc0VuZCA6IFtdKSwgW2luZGV4ID09PSBsaXN0Lmxlbmd0aCAtIDFdKVxuICAgICAgfSk7XG4gICAgICBmbGF0dGVuTGlzdC5wdXNoKGZsYXR0ZW5Ob2RlKTsgLy8gTG9vcCB0cmVlTm9kZSBjaGlsZHJlblxuXG4gICAgICBpZiAoZXhwYW5kZWRLZXlzID09PSB0cnVlIHx8IGV4cGFuZGVkS2V5U2V0LmhhcyhtZXJnZWRLZXkpKSB7XG4gICAgICAgIGZsYXR0ZW5Ob2RlLmNoaWxkcmVuID0gZGlnKHRyZWVOb2RlLmNoaWxkcmVuIHx8IFtdLCBmbGF0dGVuTm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmbGF0dGVuTm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmxhdHRlbk5vZGU7XG4gICAgfSk7XG4gIH1cblxuICBkaWcodHJlZU5vZGVMaXN0KTtcbiAgcmV0dXJuIGZsYXR0ZW5MaXN0O1xufVxuLyoqXG4gKiBUcmF2ZXJzZSBhbGwgdGhlIGRhdGEgYnkgYHRyZWVEYXRhYC5cbiAqIFBsZWFzZSBub3QgdXNlIGl0IG91dCBvZiB0aGUgYHJjLXRyZWVgIHNpbmNlIHdlIG1heSByZWZhY3RvciB0aGlzIGNvZGUuXG4gKi9cblxuXG5mdW5jdGlvbiB0cmF2ZXJzZURhdGFOb2RlcyhkYXRhTm9kZXMsIGNhbGxiYWNrLCBleHRlcm5hbEdldEtleSkge1xuICB2YXIgc3ludGhldGljR2V0S2V5O1xuXG4gIGlmIChleHRlcm5hbEdldEtleSkge1xuICAgIGlmICh0eXBlb2YgZXh0ZXJuYWxHZXRLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzeW50aGV0aWNHZXRLZXkgPSBmdW5jdGlvbiBzeW50aGV0aWNHZXRLZXkobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZVtleHRlcm5hbEdldEtleV07XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4dGVybmFsR2V0S2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzeW50aGV0aWNHZXRLZXkgPSBmdW5jdGlvbiBzeW50aGV0aWNHZXRLZXkobm9kZSkge1xuICAgICAgICByZXR1cm4gZXh0ZXJuYWxHZXRLZXkobm9kZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzeW50aGV0aWNHZXRLZXkgPSBmdW5jdGlvbiBzeW50aGV0aWNHZXRLZXkobm9kZSwgcG9zKSB7XG4gICAgICByZXR1cm4gZ2V0S2V5KG5vZGUua2V5LCBwb3MpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShub2RlLCBpbmRleCwgcGFyZW50KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZSA/IG5vZGUuY2hpbGRyZW4gOiBkYXRhTm9kZXM7XG4gICAgdmFyIHBvcyA9IG5vZGUgPyAoMCwgX3V0aWwuZ2V0UG9zaXRpb24pKHBhcmVudC5wb3MsIGluZGV4KSA6ICcwJzsgLy8gUHJvY2VzcyBub2RlIGlmIGlzIG5vdCByb290XG5cbiAgICBpZiAobm9kZSkge1xuICAgICAgdmFyIGtleSA9IHN5bnRoZXRpY0dldEtleShub2RlLCBwb3MpO1xuICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBwYXJlbnRQb3M6IHBhcmVudC5ub2RlID8gcGFyZW50LnBvcyA6IG51bGwsXG4gICAgICAgIGxldmVsOiBwYXJlbnQubGV2ZWwgKyAxXG4gICAgICB9O1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSAvLyBQcm9jZXNzIGNoaWxkcmVuIG5vZGVcblxuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChzdWJOb2RlLCBzdWJJbmRleCkge1xuICAgICAgICBwcm9jZXNzTm9kZShzdWJOb2RlLCBzdWJJbmRleCwge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgICAgbGV2ZWw6IHBhcmVudCA/IHBhcmVudC5sZXZlbCArIDEgOiAtMVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NOb2RlKG51bGwpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGB0cmVlRGF0YWAgaW50byBlbnRpdHkgcmVjb3Jkcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhVG9FbnRpdGllcyhkYXRhTm9kZXMpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgaW5pdFdyYXBwZXIgPSBfcmVmLmluaXRXcmFwcGVyLFxuICAgICAgcHJvY2Vzc0VudGl0eSA9IF9yZWYucHJvY2Vzc0VudGl0eSxcbiAgICAgIG9uUHJvY2Vzc0ZpbmlzaGVkID0gX3JlZi5vblByb2Nlc3NGaW5pc2hlZDtcblxuICB2YXIgZXh0ZXJuYWxHZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIHBvc0VudGl0aWVzID0ge307XG4gIHZhciBrZXlFbnRpdGllcyA9IHt9O1xuICB2YXIgd3JhcHBlciA9IHtcbiAgICBwb3NFbnRpdGllczogcG9zRW50aXRpZXMsXG4gICAga2V5RW50aXRpZXM6IGtleUVudGl0aWVzXG4gIH07XG5cbiAgaWYgKGluaXRXcmFwcGVyKSB7XG4gICAgd3JhcHBlciA9IGluaXRXcmFwcGVyKHdyYXBwZXIpIHx8IHdyYXBwZXI7XG4gIH1cblxuICB0cmF2ZXJzZURhdGFOb2RlcyhkYXRhTm9kZXMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIG5vZGUgPSBpdGVtLm5vZGUsXG4gICAgICAgIGluZGV4ID0gaXRlbS5pbmRleCxcbiAgICAgICAgcG9zID0gaXRlbS5wb3MsXG4gICAgICAgIGtleSA9IGl0ZW0ua2V5LFxuICAgICAgICBwYXJlbnRQb3MgPSBpdGVtLnBhcmVudFBvcyxcbiAgICAgICAgbGV2ZWwgPSBpdGVtLmxldmVsO1xuICAgIHZhciBlbnRpdHkgPSB7XG4gICAgICBub2RlOiBub2RlLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAga2V5OiBrZXksXG4gICAgICBwb3M6IHBvcyxcbiAgICAgIGxldmVsOiBsZXZlbFxuICAgIH07XG4gICAgdmFyIG1lcmdlZEtleSA9IGdldEtleShrZXksIHBvcyk7XG4gICAgcG9zRW50aXRpZXNbcG9zXSA9IGVudGl0eTtcbiAgICBrZXlFbnRpdGllc1ttZXJnZWRLZXldID0gZW50aXR5OyAvLyBGaWxsIGNoaWxkcmVuXG5cbiAgICBlbnRpdHkucGFyZW50ID0gcG9zRW50aXRpZXNbcGFyZW50UG9zXTtcblxuICAgIGlmIChlbnRpdHkucGFyZW50KSB7XG4gICAgICBlbnRpdHkucGFyZW50LmNoaWxkcmVuID0gZW50aXR5LnBhcmVudC5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGVudGl0eS5wYXJlbnQuY2hpbGRyZW4ucHVzaChlbnRpdHkpO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzRW50aXR5KSB7XG4gICAgICBwcm9jZXNzRW50aXR5KGVudGl0eSwgd3JhcHBlcik7XG4gICAgfVxuICB9LCBleHRlcm5hbEdldEtleSk7XG5cbiAgaWYgKG9uUHJvY2Vzc0ZpbmlzaGVkKSB7XG4gICAgb25Qcm9jZXNzRmluaXNoZWQod3JhcHBlcik7XG4gIH1cblxuICByZXR1cm4gd3JhcHBlcjtcbn1cbi8qKlxuICogR2V0IFRyZWVOb2RlIHByb3BzIHdpdGggVHJlZSBwcm9wcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFRyZWVOb2RlUHJvcHMoa2V5LCBfcmVmMikge1xuICB2YXIgZXhwYW5kZWRLZXlzID0gX3JlZjIuZXhwYW5kZWRLZXlzLFxuICAgICAgc2VsZWN0ZWRLZXlzID0gX3JlZjIuc2VsZWN0ZWRLZXlzLFxuICAgICAgbG9hZGVkS2V5cyA9IF9yZWYyLmxvYWRlZEtleXMsXG4gICAgICBsb2FkaW5nS2V5cyA9IF9yZWYyLmxvYWRpbmdLZXlzLFxuICAgICAgY2hlY2tlZEtleXMgPSBfcmVmMi5jaGVja2VkS2V5cyxcbiAgICAgIGhhbGZDaGVja2VkS2V5cyA9IF9yZWYyLmhhbGZDaGVja2VkS2V5cyxcbiAgICAgIGRyYWdPdmVyTm9kZUtleSA9IF9yZWYyLmRyYWdPdmVyTm9kZUtleSxcbiAgICAgIGRyb3BQb3NpdGlvbiA9IF9yZWYyLmRyb3BQb3NpdGlvbixcbiAgICAgIGtleUVudGl0aWVzID0gX3JlZjIua2V5RW50aXRpZXM7XG4gIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1trZXldO1xuICB2YXIgdHJlZU5vZGVQcm9wcyA9IHtcbiAgICBldmVudEtleToga2V5LFxuICAgIGV4cGFuZGVkOiBleHBhbmRlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBzZWxlY3RlZDogc2VsZWN0ZWRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEsXG4gICAgbG9hZGVkOiBsb2FkZWRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEsXG4gICAgbG9hZGluZzogbG9hZGluZ0tleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBjaGVja2VkOiBjaGVja2VkS2V5cy5pbmRleE9mKGtleSkgIT09IC0xLFxuICAgIGhhbGZDaGVja2VkOiBoYWxmQ2hlY2tlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBwb3M6IFN0cmluZyhlbnRpdHkgPyBlbnRpdHkucG9zIDogJycpLFxuICAgIC8vIFtMZWdhY3ldIERyYWcgcHJvcHNcbiAgICBkcmFnT3ZlcjogZHJhZ092ZXJOb2RlS2V5ID09PSBrZXkgJiYgZHJvcFBvc2l0aW9uID09PSAwLFxuICAgIGRyYWdPdmVyR2FwVG9wOiBkcmFnT3Zlck5vZGVLZXkgPT09IGtleSAmJiBkcm9wUG9zaXRpb24gPT09IC0xLFxuICAgIGRyYWdPdmVyR2FwQm90dG9tOiBkcmFnT3Zlck5vZGVLZXkgPT09IGtleSAmJiBkcm9wUG9zaXRpb24gPT09IDFcbiAgfTtcbiAgcmV0dXJuIHRyZWVOb2RlUHJvcHM7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykge1xuICB2YXIgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgICBleHBhbmRlZCA9IHByb3BzLmV4cGFuZGVkLFxuICAgICAgc2VsZWN0ZWQgPSBwcm9wcy5zZWxlY3RlZCxcbiAgICAgIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkLFxuICAgICAgbG9hZGVkID0gcHJvcHMubG9hZGVkLFxuICAgICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmcsXG4gICAgICBoYWxmQ2hlY2tlZCA9IHByb3BzLmhhbGZDaGVja2VkLFxuICAgICAgZHJhZ092ZXIgPSBwcm9wcy5kcmFnT3ZlcixcbiAgICAgIGRyYWdPdmVyR2FwVG9wID0gcHJvcHMuZHJhZ092ZXJHYXBUb3AsXG4gICAgICBkcmFnT3ZlckdhcEJvdHRvbSA9IHByb3BzLmRyYWdPdmVyR2FwQm90dG9tLFxuICAgICAgcG9zID0gcHJvcHMucG9zLFxuICAgICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlO1xuICB2YXIgZXZlbnREYXRhID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgZGF0YSksIHt9LCB7XG4gICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgIHNlbGVjdGVkOiBzZWxlY3RlZCxcbiAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgIGxvYWRlZDogbG9hZGVkLFxuICAgIGxvYWRpbmc6IGxvYWRpbmcsXG4gICAgaGFsZkNoZWNrZWQ6IGhhbGZDaGVja2VkLFxuICAgIGRyYWdPdmVyOiBkcmFnT3ZlcixcbiAgICBkcmFnT3ZlckdhcFRvcDogZHJhZ092ZXJHYXBUb3AsXG4gICAgZHJhZ092ZXJHYXBCb3R0b206IGRyYWdPdmVyR2FwQm90dG9tLFxuICAgIHBvczogcG9zLFxuICAgIGFjdGl2ZTogYWN0aXZlXG4gIH0pO1xuXG4gIGlmICghKCdwcm9wcycgaW4gZXZlbnREYXRhKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudERhdGEsICdwcm9wcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAoMCwgX3dhcm5pbmcuZGVmYXVsdCkoZmFsc2UsICdTZWNvbmQgcGFyYW0gcmV0dXJuIGZyb20gZXZlbnQgaXMgbm9kZSBkYXRhIGluc3RlYWQgb2YgVHJlZU5vZGUgaW5zdGFuY2UuIFBsZWFzZSByZWFkIHZhbHVlIGRpcmVjdGx5IGluc3RlYWQgb2YgcmVhZGluZyBmcm9tIGBwcm9wc2AuJyk7XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBldmVudERhdGE7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gTWFzaztcblxudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfcmNNb3Rpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1tb3Rpb25cIikpO1xuXG52YXIgX2xlZ2FjeVV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbHMvbGVnYWN5VXRpbFwiKTtcblxuZnVuY3Rpb24gTWFzayhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgICB6SW5kZXggPSBwcm9wcy56SW5kZXgsXG4gICAgICBtYXNrID0gcHJvcHMubWFzayxcbiAgICAgIG1hc2tNb3Rpb24gPSBwcm9wcy5tYXNrTW90aW9uLFxuICAgICAgbWFza0FuaW1hdGlvbiA9IHByb3BzLm1hc2tBbmltYXRpb24sXG4gICAgICBtYXNrVHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5tYXNrVHJhbnNpdGlvbk5hbWU7XG5cbiAgaWYgKCFtYXNrKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbW90aW9uID0ge307XG5cbiAgaWYgKG1hc2tNb3Rpb24gfHwgbWFza1RyYW5zaXRpb25OYW1lIHx8IG1hc2tBbmltYXRpb24pIHtcbiAgICBtb3Rpb24gPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe1xuICAgICAgbW90aW9uQXBwZWFyOiB0cnVlXG4gICAgfSwgKDAsIF9sZWdhY3lVdGlsLmdldE1vdGlvbikoe1xuICAgICAgbW90aW9uOiBtYXNrTW90aW9uLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICB0cmFuc2l0aW9uTmFtZTogbWFza1RyYW5zaXRpb25OYW1lLFxuICAgICAgYW5pbWF0aW9uOiBtYXNrQW5pbWF0aW9uXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjTW90aW9uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIG1vdGlvbiwge1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgcmVtb3ZlT25MZWF2ZTogdHJ1ZVxuICB9KSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWU7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgekluZGV4OiB6SW5kZXhcbiAgICAgIH0sXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1hc2tcIiksIGNsYXNzTmFtZSlcbiAgICB9KTtcbiAgfSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY0FsaWduID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtYWxpZ25cIikpO1xuXG52YXIgX3JjTW90aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtbW90aW9uXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfdXNlVmlzaWJsZVN0YXR1czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VzZVZpc2libGVTdGF0dXNcIikpO1xuXG52YXIgX2xlZ2FjeVV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbHMvbGVnYWN5VXRpbFwiKTtcblxudmFyIF91c2VTdHJldGNoU3R5bGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91c2VTdHJldGNoU3R5bGVcIikpO1xuXG52YXIgUG9wdXBJbm5lciA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICB6SW5kZXggPSBwcm9wcy56SW5kZXgsXG4gICAgICBzdHJldGNoID0gcHJvcHMuc3RyZXRjaCxcbiAgICAgIGRlc3Ryb3lQb3B1cE9uSGlkZSA9IHByb3BzLmRlc3Ryb3lQb3B1cE9uSGlkZSxcbiAgICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgICBwb2ludCA9IHByb3BzLnBvaW50LFxuICAgICAgZ2V0Um9vdERvbU5vZGUgPSBwcm9wcy5nZXRSb290RG9tTm9kZSxcbiAgICAgIGdldENsYXNzTmFtZUZyb21BbGlnbiA9IHByb3BzLmdldENsYXNzTmFtZUZyb21BbGlnbixcbiAgICAgIG9uQWxpZ24gPSBwcm9wcy5vbkFsaWduLFxuICAgICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgb25Nb3VzZUxlYXZlID0gcHJvcHMub25Nb3VzZUxlYXZlLFxuICAgICAgb25Nb3VzZURvd24gPSBwcm9wcy5vbk1vdXNlRG93bixcbiAgICAgIG9uVG91Y2hTdGFydCA9IHByb3BzLm9uVG91Y2hTdGFydDtcbiAgdmFyIGFsaWduUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoKTtcbiAgdmFyIGVsZW1lbnRSZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgpO1xuXG4gIHZhciBfdXNlU3RhdGUgPSAoMCwgUmVhY3QudXNlU3RhdGUpKCksXG4gICAgICBfdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlU3RhdGUsIDIpLFxuICAgICAgYWxpZ25lZENsYXNzTmFtZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRBbGlnbmVkQ2xhc3NOYW1lID0gX3VzZVN0YXRlMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gTWVhc3VyZSA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfdXNlU3RyZXRjaFN0eWxlID0gKDAsIF91c2VTdHJldGNoU3R5bGUzLmRlZmF1bHQpKHN0cmV0Y2gpLFxuICAgICAgX3VzZVN0cmV0Y2hTdHlsZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF91c2VTdHJldGNoU3R5bGUsIDIpLFxuICAgICAgc3RyZXRjaFN0eWxlID0gX3VzZVN0cmV0Y2hTdHlsZTJbMF0sXG4gICAgICBtZWFzdXJlU3RyZXRjaFN0eWxlID0gX3VzZVN0cmV0Y2hTdHlsZTJbMV07XG5cbiAgZnVuY3Rpb24gZG9NZWFzdXJlKCkge1xuICAgIGlmIChzdHJldGNoKSB7XG4gICAgICBtZWFzdXJlU3RyZXRjaFN0eWxlKGdldFJvb3REb21Ob2RlKCkpO1xuICAgIH1cbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIF91c2VWaXNpYmxlU3RhdHVzID0gKDAsIF91c2VWaXNpYmxlU3RhdHVzMy5kZWZhdWx0KSh2aXNpYmxlLCBkb01lYXN1cmUpLFxuICAgICAgX3VzZVZpc2libGVTdGF0dXMyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfdXNlVmlzaWJsZVN0YXR1cywgMiksXG4gICAgICBzdGF0dXMgPSBfdXNlVmlzaWJsZVN0YXR1czJbMF0sXG4gICAgICBnb05leHRTdGF0dXMgPSBfdXNlVmlzaWJsZVN0YXR1czJbMV07IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBBbGlnbnMgPT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgcHJlcGFyZVJlc29sdmVSZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgpOyAvLyBgdGFyZ2V0YCBvbiBgcmMtYWxpZ25gIGNhbiBhY2NlcHQgYXMgYSBmdW5jdGlvbiB0byBnZXQgdGhlIGJpbmQgZWxlbWVudCBvciBhIHBvaW50LlxuICAvLyByZWY6IGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3JjLWFsaWduXG5cbiAgZnVuY3Rpb24gZ2V0QWxpZ25UYXJnZXQoKSB7XG4gICAgaWYgKHBvaW50KSB7XG4gICAgICByZXR1cm4gcG9pbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFJvb3REb21Ob2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9yY2VBbGlnbigpIHtcbiAgICB2YXIgX2FsaWduUmVmJGN1cnJlbnQ7XG5cbiAgICAoX2FsaWduUmVmJGN1cnJlbnQgPSBhbGlnblJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYWxpZ25SZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FsaWduUmVmJGN1cnJlbnQuZm9yY2VBbGlnbigpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25JbnRlcm5hbEFsaWduKHBvcHVwRG9tTm9kZSwgbWF0Y2hBbGlnbikge1xuICAgIGlmIChzdGF0dXMgPT09ICdhbGlnbicpIHtcbiAgICAgIHZhciBuZXh0QWxpZ25lZENsYXNzTmFtZSA9IGdldENsYXNzTmFtZUZyb21BbGlnbihtYXRjaEFsaWduKTtcbiAgICAgIHNldEFsaWduZWRDbGFzc05hbWUobmV4dEFsaWduZWRDbGFzc05hbWUpOyAvLyBSZXBlYXQgdW50aWwgbm90IG1vcmUgYWxpZ24gbmVlZGVkXG5cbiAgICAgIGlmIChhbGlnbmVkQ2xhc3NOYW1lICE9PSBuZXh0QWxpZ25lZENsYXNzTmFtZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBmb3JjZUFsaWduKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ29OZXh0U3RhdHVzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3ByZXBhcmVSZXNvbHZlUmVmJGN1O1xuXG4gICAgICAgICAgKF9wcmVwYXJlUmVzb2x2ZVJlZiRjdSA9IHByZXBhcmVSZXNvbHZlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9wcmVwYXJlUmVzb2x2ZVJlZiRjdSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3ByZXBhcmVSZXNvbHZlUmVmJGN1LmNhbGwocHJlcGFyZVJlc29sdmVSZWYpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgb25BbGlnbiA9PT0gbnVsbCB8fCBvbkFsaWduID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFsaWduKHBvcHVwRG9tTm9kZSwgbWF0Y2hBbGlnbik7XG4gICAgfVxuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgbW90aW9uID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCAoMCwgX2xlZ2FjeVV0aWwuZ2V0TW90aW9uKShwcm9wcykpO1xuICBbJ29uQXBwZWFyRW5kJywgJ29uRW50ZXJFbmQnLCAnb25MZWF2ZUVuZCddLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgIHZhciBvcmlnaW5IYW5kbGVyID0gbW90aW9uW2V2ZW50TmFtZV07XG5cbiAgICBtb3Rpb25bZXZlbnROYW1lXSA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudCkge1xuICAgICAgZ29OZXh0U3RhdHVzKCk7XG4gICAgICByZXR1cm4gb3JpZ2luSGFuZGxlciA9PT0gbnVsbCB8fCBvcmlnaW5IYW5kbGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5IYW5kbGVyKGVsZW1lbnQsIGV2ZW50KTtcbiAgICB9O1xuICB9KTtcblxuICBmdW5jdGlvbiBvblNob3dQcmVwYXJlKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcHJlcGFyZVJlc29sdmVSZWYuY3VycmVudCA9IHJlc29sdmU7XG4gICAgfSk7XG4gIH0gLy8gR28gdG8gc3RhYmxlIGRpcmVjdGx5IHdoZW4gbW90aW9uIG5vdCBwcm92aWRlZFxuXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW1vdGlvbi5tb3Rpb25OYW1lICYmIHN0YXR1cyA9PT0gJ21vdGlvbicpIHtcbiAgICAgIGdvTmV4dFN0YXR1cygpO1xuICAgIH1cbiAgfSwgW21vdGlvbi5tb3Rpb25OYW1lLCBzdGF0dXNdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JjZUFsaWduOiBmb3JjZUFsaWduLFxuICAgICAgZ2V0RWxlbWVudDogZnVuY3Rpb24gZ2V0RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRSZWYuY3VycmVudDtcbiAgICAgIH1cbiAgICB9O1xuICB9KTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgbWVyZ2VkU3R5bGUgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgc3RyZXRjaFN0eWxlKSwge30sIHtcbiAgICB6SW5kZXg6IHpJbmRleFxuICB9LCBzdHlsZSksIHt9LCB7XG4gICAgb3BhY2l0eTogc3RhdHVzID09PSAnbW90aW9uJyB8fCBzdGF0dXMgPT09ICdzdGFibGUnIHx8ICF2aXNpYmxlID8gdW5kZWZpbmVkIDogMCxcbiAgICBwb2ludGVyRXZlbnRzOiBzdGF0dXMgPT09ICdzdGFibGUnID8gdW5kZWZpbmVkIDogJ25vbmUnXG4gIH0pOyAvLyBBbGlnbiBzdGF0dXNcblxuICB2YXIgYWxpZ25EaXNhYmxlZCA9IHRydWU7XG5cbiAgaWYgKChhbGlnbiA9PT0gbnVsbCB8fCBhbGlnbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWxpZ24ucG9pbnRzKSAmJiAoc3RhdHVzID09PSAnYWxpZ24nIHx8IHN0YXR1cyA9PT0gJ3N0YWJsZScpKSB7XG4gICAgYWxpZ25EaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkcmVuOyAvLyBXcmFwcGVyIHdoZW4gbXVsdGlwbGUgY2hpbGRyZW5cblxuICBpZiAoUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID4gMSkge1xuICAgIGNoaWxkTm9kZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnRcIilcbiAgICB9LCBjaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfcmNNb3Rpb24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7XG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICByZWY6IGVsZW1lbnRSZWZcbiAgfSwgbW90aW9uLCB7XG4gICAgb25BcHBlYXJQcmVwYXJlOiBvblNob3dQcmVwYXJlLFxuICAgIG9uRW50ZXJQcmVwYXJlOiBvblNob3dQcmVwYXJlLFxuICAgIHJlbW92ZU9uTGVhdmU6IGRlc3Ryb3lQb3B1cE9uSGlkZSxcbiAgICBsZWF2ZWRDbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGlkZGVuXCIpXG4gIH0pLCBmdW5jdGlvbiAoX3JlZiwgbW90aW9uUmVmKSB7XG4gICAgdmFyIG1vdGlvbkNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgICBtb3Rpb25TdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgdmFyIG1lcmdlZENsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIGNsYXNzTmFtZSwgYWxpZ25lZENsYXNzTmFtZSwgbW90aW9uQ2xhc3NOYW1lKTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChfcmNBbGlnbi5kZWZhdWx0LCB7XG4gICAgICB0YXJnZXQ6IGdldEFsaWduVGFyZ2V0KCksXG4gICAgICBrZXk6IFwicG9wdXBcIixcbiAgICAgIHJlZjogYWxpZ25SZWYsXG4gICAgICBtb25pdG9yV2luZG93UmVzaXplOiB0cnVlLFxuICAgICAgZGlzYWJsZWQ6IGFsaWduRGlzYWJsZWQsXG4gICAgICBhbGlnbjogYWxpZ24sXG4gICAgICBvbkFsaWduOiBvbkludGVybmFsQWxpZ25cbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogbW90aW9uUmVmLFxuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWUsXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlLFxuICAgICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgICAgb25Ub3VjaFN0YXJ0OiBvblRvdWNoU3RhcnQsXG4gICAgICBzdHlsZTogKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgbW90aW9uU3R5bGUpLCBtZXJnZWRTdHlsZSlcbiAgICB9LCBjaGlsZE5vZGUpKTtcbiAgfSk7XG59KTtcblBvcHVwSW5uZXIuZGlzcGxheU5hbWUgPSAnUG9wdXBJbm5lcic7XG52YXIgX2RlZmF1bHQgPSBQb3B1cElubmVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9NYXNrID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9NYXNrXCIpKTtcblxudmFyIF9Qb3B1cElubmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Qb3B1cElubmVyXCIpKTtcblxudmFyIFBvcHVwID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgY2xvbmVQcm9wcyA9ICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe30sIHByb3BzKTsgLy8gV2UgY2FuIHVzZSBmcmFnbWVudCBkaXJlY3RseSBidXQgdGhpcyBtYXkgZmFpbGVkIHNvbWUgc2VsZWN0b3IgdXNhZ2UuIEtlZXAgYXMgb3JpZ2luIGxvZ2ljXG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgUmVhY3QuY3JlYXRlRWxlbWVudChfTWFzay5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBjbG9uZVByb3BzKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1BvcHVwSW5uZXIuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgY2xvbmVQcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pKSk7XG59KTtcblBvcHVwLmRpc3BsYXlOYW1lID0gJ1BvcHVwJztcbnZhciBfZGVmYXVsdCA9IFBvcHVwO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9kZWZhdWx0ID0gZnVuY3Rpb24gX2RlZmF1bHQoc3RyZXRjaCkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gX3JlYWN0LmRlZmF1bHQudXNlU3RhdGUoe1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9KSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyLmRlZmF1bHQpKF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICB0YXJnZXRTaXplID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFRhcmdldFNpemUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIGZ1bmN0aW9uIG1lYXN1cmVTdHJldGNoKGVsZW1lbnQpIHtcbiAgICBzZXRUYXJnZXRTaXplKHtcbiAgICAgIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLFxuICAgICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodFxuICAgIH0pO1xuICB9IC8vIE1lcmdlIHN0cmV0Y2ggc3R5bGVcblxuXG4gIHZhciBzdHlsZSA9IF9yZWFjdC5kZWZhdWx0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzaXplU3R5bGUgPSB7fTtcblxuICAgIGlmIChzdHJldGNoKSB7XG4gICAgICB2YXIgd2lkdGggPSB0YXJnZXRTaXplLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRhcmdldFNpemUuaGVpZ2h0OyAvLyBTdHJldGNoIHdpdGggdGFyZ2V0XG5cbiAgICAgIGlmIChzdHJldGNoLmluZGV4T2YoJ2hlaWdodCcpICE9PSAtMSAmJiBoZWlnaHQpIHtcbiAgICAgICAgc2l6ZVN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH0gZWxzZSBpZiAoc3RyZXRjaC5pbmRleE9mKCdtaW5IZWlnaHQnKSAhPT0gLTEgJiYgaGVpZ2h0KSB7XG4gICAgICAgIHNpemVTdHlsZS5taW5IZWlnaHQgPSBoZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJldGNoLmluZGV4T2YoJ3dpZHRoJykgIT09IC0xICYmIHdpZHRoKSB7XG4gICAgICAgIHNpemVTdHlsZS53aWR0aCA9IHdpZHRoO1xuICAgICAgfSBlbHNlIGlmIChzdHJldGNoLmluZGV4T2YoJ21pbldpZHRoJykgIT09IC0xICYmIHdpZHRoKSB7XG4gICAgICAgIHNpemVTdHlsZS5taW5XaWR0aCA9IHdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaXplU3R5bGU7XG4gIH0sIFtzdHJldGNoLCB0YXJnZXRTaXplXSk7XG5cbiAgcmV0dXJuIFtzdHlsZSwgbWVhc3VyZVN0cmV0Y2hdO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIikpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbnZhciBfcmFmID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvcmFmXCIpKTtcblxudmFyIFN0YXR1c1F1ZXVlID0gWydtZWFzdXJlJywgJ2FsaWduJywgbnVsbCwgJ21vdGlvbiddO1xuXG52YXIgX2RlZmF1bHQgPSBmdW5jdGlvbiBfZGVmYXVsdCh2aXNpYmxlLCBkb01lYXN1cmUpIHtcbiAgdmFyIF91c2VTdGF0ZSA9ICgwLCBfcmVhY3QudXNlU3RhdGUpKG51bGwpLFxuICAgICAgX3VzZVN0YXRlMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIHN0YXR1cyA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTdGF0dXMgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciByYWZSZWYgPSAoMCwgX3JlYWN0LnVzZVJlZikoKTtcblxuICBmdW5jdGlvbiBjYW5jZWxSYWYoKSB7XG4gICAgX3JhZi5kZWZhdWx0LmNhbmNlbChyYWZSZWYuY3VycmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBnb05leHRTdGF0dXMoY2FsbGJhY2spIHtcbiAgICBjYW5jZWxSYWYoKTtcbiAgICByYWZSZWYuY3VycmVudCA9ICgwLCBfcmFmLmRlZmF1bHQpKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE9ubHkgYWxpZ24gc2hvdWxkIGJlIG1hbnVhbGx5IHRyaWdnZXJcbiAgICAgIHNldFN0YXR1cyhmdW5jdGlvbiAocHJldikge1xuICAgICAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgICAgIGNhc2UgJ2FsaWduJzpcbiAgICAgICAgICAgIHJldHVybiAnbW90aW9uJztcblxuICAgICAgICAgIGNhc2UgJ21vdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gJ3N0YWJsZSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0pO1xuICAgICAgY2FsbGJhY2sgPT09IG51bGwgfHwgY2FsbGJhY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH0gLy8gSW5pdCBzdGF0dXNcblxuXG4gICgwLCBfcmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgc2V0U3RhdHVzKCdtZWFzdXJlJyk7XG4gIH0sIFt2aXNpYmxlXSk7IC8vIEdvIG5leHQgc3RhdHVzXG5cbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSAnbWVhc3VyZSc6XG4gICAgICAgIGRvTWVhc3VyZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICByYWZSZWYuY3VycmVudCA9ICgwLCBfcmFmLmRlZmF1bHQpKCAvKiNfX1BVUkVfXyovKDAsIF9hc3luY1RvR2VuZXJhdG9yMi5kZWZhdWx0KSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvci5kZWZhdWx0Lm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgICAgdmFyIGluZGV4LCBuZXh0U3RhdHVzO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yLmRlZmF1bHQud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpbmRleCA9IFN0YXR1c1F1ZXVlLmluZGV4T2Yoc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBuZXh0U3RhdHVzID0gU3RhdHVzUXVldWVbaW5kZXggKyAxXTtcblxuICAgICAgICAgICAgICAgIGlmIChuZXh0U3RhdHVzICYmIGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgc2V0U3RhdHVzKG5leHRTdGF0dXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSk7XG4gICAgICB9KSkpO1xuICAgIH1cbiAgfSwgW3N0YXR1c10pO1xuICAoMCwgX3JlYWN0LnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW5jZWxSYWYoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbc3RhdHVzLCBnb05leHRTdGF0dXNdO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBUcmlnZ2VyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG52YXIgX2RlZmF1bHQgPSBUcmlnZ2VyQ29udGV4dDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2VuZXJhdGVUcmlnZ2VyID0gZ2VuZXJhdGVUcmlnZ2VyO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xuXG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3JhZlwiKSk7XG5cbnZhciBfY29udGFpbnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vY29udGFpbnNcIikpO1xuXG52YXIgX2ZpbmRET01Ob2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2ZpbmRET01Ob2RlXCIpKTtcblxudmFyIF9yZWYyID0gcmVxdWlyZShcInJjLXV0aWwvbGliL3JlZlwiKTtcblxudmFyIF9hZGRFdmVudExpc3RlbmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2FkZEV2ZW50TGlzdGVuZXJcIikpO1xuXG52YXIgX1BvcnRhbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL1BvcnRhbFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2FsaWduVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxzL2FsaWduVXRpbFwiKTtcblxudmFyIF9Qb3B1cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUG9wdXBcIikpO1xuXG52YXIgX2NvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NvbnRleHRcIikpO1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gcmV0dXJuRW1wdHlTdHJpbmcoKSB7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gcmV0dXJuRG9jdW1lbnQoKSB7XG4gIHJldHVybiB3aW5kb3cuZG9jdW1lbnQ7XG59XG5cbnZhciBBTExfSEFORExFUlMgPSBbJ29uQ2xpY2snLCAnb25Nb3VzZURvd24nLCAnb25Ub3VjaFN0YXJ0JywgJ29uTW91c2VFbnRlcicsICdvbk1vdXNlTGVhdmUnLCAnb25Gb2N1cycsICdvbkJsdXInLCAnb25Db250ZXh0TWVudSddO1xuLyoqXG4gKiBJbnRlcm5hbCB1c2FnZS4gRG8gbm90IHVzZSBpbiB5b3VyIGNvZGUgc2luY2UgdGhpcyB3aWxsIGJlIHJlbW92ZWQuXG4gKi9cblxuZnVuY3Rpb24gZ2VuZXJhdGVUcmlnZ2VyKFBvcnRhbENvbXBvbmVudCkge1xuICB2YXIgVHJpZ2dlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKFRyaWdnZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gICAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyLmRlZmF1bHQpKFRyaWdnZXIpO1xuXG4gICAgZnVuY3Rpb24gVHJpZ2dlcihwcm9wcykge1xuICAgICAgdmFyIF90aGlzO1xuXG4gICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBUcmlnZ2VyKTtcbiAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgICAgX3RoaXMucG9wdXBSZWYgPSBfcmVhY3QuZGVmYXVsdC5jcmVhdGVSZWYoKTtcbiAgICAgIF90aGlzLnRyaWdnZXJSZWYgPSBfcmVhY3QuZGVmYXVsdC5jcmVhdGVSZWYoKTtcblxuICAgICAgX3RoaXMub25Nb3VzZUVudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG1vdXNlRW50ZXJEZWxheSA9IF90aGlzLnByb3BzLm1vdXNlRW50ZXJEZWxheTtcblxuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKCdvbk1vdXNlRW50ZXInLCBlKTtcblxuICAgICAgICBfdGhpcy5kZWxheVNldFBvcHVwVmlzaWJsZSh0cnVlLCBtb3VzZUVudGVyRGVsYXksIG1vdXNlRW50ZXJEZWxheSA/IG51bGwgOiBlKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgX3RoaXMuZmlyZUV2ZW50cygnb25Nb3VzZU1vdmUnLCBlKTtcblxuICAgICAgICBfdGhpcy5zZXRQb2ludChlKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uTW91c2VMZWF2ZScsIGUpO1xuXG4gICAgICAgIF90aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKGZhbHNlLCBfdGhpcy5wcm9wcy5tb3VzZUxlYXZlRGVsYXkpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMub25Qb3B1cE1vdXNlRW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMub25Qb3B1cE1vdXNlTGVhdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX3RoaXMkcG9wdXBSZWYkY3VycmVuO1xuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdHJpZ2dlci9wdWxsLzEzXG4gICAgICAgIC8vIHJlYWN0IGJ1Zz9cbiAgICAgICAgaWYgKGUucmVsYXRlZFRhcmdldCAmJiAhZS5yZWxhdGVkVGFyZ2V0LnNldFRpbWVvdXQgJiYgKDAsIF9jb250YWlucy5kZWZhdWx0KSgoX3RoaXMkcG9wdXBSZWYkY3VycmVuID0gX3RoaXMucG9wdXBSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RoaXMkcG9wdXBSZWYkY3VycmVuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRwb3B1cFJlZiRjdXJyZW4uZ2V0RWxlbWVudCgpLCBlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuZGVsYXlTZXRQb3B1cFZpc2libGUoZmFsc2UsIF90aGlzLnByb3BzLm1vdXNlTGVhdmVEZWxheSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5vbkZvY3VzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgX3RoaXMuZmlyZUV2ZW50cygnb25Gb2N1cycsIGUpOyAvLyBpbmNhc2UgZm9jdXNpbiBhbmQgZm9jdXNvdXRcblxuXG4gICAgICAgIF90aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuXG4gICAgICAgIGlmIChfdGhpcy5pc0ZvY3VzVG9TaG93KCkpIHtcbiAgICAgICAgICBfdGhpcy5mb2N1c1RpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgX3RoaXMuZGVsYXlTZXRQb3B1cFZpc2libGUodHJ1ZSwgX3RoaXMucHJvcHMuZm9jdXNEZWxheSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uTW91c2VEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgX3RoaXMuZmlyZUV2ZW50cygnb25Nb3VzZURvd24nLCBlKTtcblxuICAgICAgICBfdGhpcy5wcmVDbGlja1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMub25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgX3RoaXMuZmlyZUV2ZW50cygnb25Ub3VjaFN0YXJ0JywgZSk7XG5cbiAgICAgICAgX3RoaXMucHJlVG91Y2hUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uQmx1ciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uQmx1cicsIGUpO1xuXG4gICAgICAgIF90aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuXG4gICAgICAgIGlmIChfdGhpcy5pc0JsdXJUb0hpZGUoKSkge1xuICAgICAgICAgIF90aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKGZhbHNlLCBfdGhpcy5wcm9wcy5ibHVyRGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5vbkNvbnRleHRNZW51ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uQ29udGV4dE1lbnUnLCBlKTtcblxuICAgICAgICBfdGhpcy5zZXRQb3B1cFZpc2libGUodHJ1ZSwgZSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5vbkNvbnRleHRNZW51Q2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpcy5pc0NvbnRleHRNZW51VG9TaG93KCkpIHtcbiAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5vbkNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uQ2xpY2snLCBldmVudCk7IC8vIGZvY3VzIHdpbGwgdHJpZ2dlciBjbGlja1xuXG5cbiAgICAgICAgaWYgKF90aGlzLmZvY3VzVGltZSkge1xuICAgICAgICAgIHZhciBwcmVUaW1lO1xuXG4gICAgICAgICAgaWYgKF90aGlzLnByZUNsaWNrVGltZSAmJiBfdGhpcy5wcmVUb3VjaFRpbWUpIHtcbiAgICAgICAgICAgIHByZVRpbWUgPSBNYXRoLm1pbihfdGhpcy5wcmVDbGlja1RpbWUsIF90aGlzLnByZVRvdWNoVGltZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChfdGhpcy5wcmVDbGlja1RpbWUpIHtcbiAgICAgICAgICAgIHByZVRpbWUgPSBfdGhpcy5wcmVDbGlja1RpbWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChfdGhpcy5wcmVUb3VjaFRpbWUpIHtcbiAgICAgICAgICAgIHByZVRpbWUgPSBfdGhpcy5wcmVUb3VjaFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKE1hdGguYWJzKHByZVRpbWUgLSBfdGhpcy5mb2N1c1RpbWUpIDwgMjApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5mb2N1c1RpbWUgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMucHJlQ2xpY2tUaW1lID0gMDtcbiAgICAgICAgX3RoaXMucHJlVG91Y2hUaW1lID0gMDsgLy8gT25seSBwcmV2ZW50IGRlZmF1bHQgd2hlbiBhbGwgdGhlIGFjdGlvbiBpcyBjbGljay5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTcwNDNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTcyOTFcblxuICAgICAgICBpZiAoX3RoaXMuaXNDbGlja1RvU2hvdygpICYmIChfdGhpcy5pc0NsaWNrVG9IaWRlKCkgfHwgX3RoaXMuaXNCbHVyVG9IaWRlKCkpICYmIGV2ZW50ICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0VmlzaWJsZSA9ICFfdGhpcy5zdGF0ZS5wb3B1cFZpc2libGU7XG5cbiAgICAgICAgaWYgKF90aGlzLmlzQ2xpY2tUb0hpZGUoKSAmJiAhbmV4dFZpc2libGUgfHwgbmV4dFZpc2libGUgJiYgX3RoaXMuaXNDbGlja1RvU2hvdygpKSB7XG4gICAgICAgICAgX3RoaXMuc2V0UG9wdXBWaXNpYmxlKCFfdGhpcy5zdGF0ZS5wb3B1cFZpc2libGUsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3RoaXMub25Qb3B1cE1vdXNlRG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuaGFzUG9wdXBNb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMubW91c2VEb3duVGltZW91dCk7XG4gICAgICAgIF90aGlzLm1vdXNlRG93blRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMuaGFzUG9wdXBNb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgaWYgKF90aGlzLmNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkY29udGV4dDtcblxuICAgICAgICAgIChfdGhpcyRjb250ZXh0ID0gX3RoaXMuY29udGV4dCkub25Qb3B1cE1vdXNlRG93bi5hcHBseShfdGhpcyRjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5vbkRvY3VtZW50Q2xpY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKF90aGlzLnByb3BzLm1hc2sgJiYgIV90aGlzLnByb3BzLm1hc2tDbG9zYWJsZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgdmFyIHJvb3QgPSBfdGhpcy5nZXRSb290RG9tTm9kZSgpO1xuXG4gICAgICAgIHZhciBwb3B1cE5vZGUgPSBfdGhpcy5nZXRQb3B1cERvbU5vZGUoKTtcblxuICAgICAgICBpZiAoISgwLCBfY29udGFpbnMuZGVmYXVsdCkocm9vdCwgdGFyZ2V0KSAmJiAhKDAsIF9jb250YWlucy5kZWZhdWx0KShwb3B1cE5vZGUsIHRhcmdldCkgJiYgIV90aGlzLmhhc1BvcHVwTW91c2VEb3duKSB7XG4gICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3RoaXMuZ2V0Um9vdERvbU5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXRUcmlnZ2VyRE9NTm9kZSA9IF90aGlzLnByb3BzLmdldFRyaWdnZXJET01Ob2RlO1xuXG4gICAgICAgIGlmIChnZXRUcmlnZ2VyRE9NTm9kZSkge1xuICAgICAgICAgIHJldHVybiBnZXRUcmlnZ2VyRE9NTm9kZShfdGhpcy50cmlnZ2VyUmVmLmN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZG9tTm9kZSA9ICgwLCBfZmluZERPTU5vZGUuZGVmYXVsdCkoX3RoaXMudHJpZ2dlclJlZi5jdXJyZW50KTtcblxuICAgICAgICAgIGlmIChkb21Ob2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9tTm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikgey8vIERvIG5vdGhpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcmVhY3REb20uZGVmYXVsdC5maW5kRE9NTm9kZSgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduID0gZnVuY3Rpb24gKGFsaWduKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBbXTtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICBwb3B1cFBsYWNlbWVudCA9IF90aGlzJHByb3BzLnBvcHVwUGxhY2VtZW50LFxuICAgICAgICAgICAgYnVpbHRpblBsYWNlbWVudHMgPSBfdGhpcyRwcm9wcy5idWlsdGluUGxhY2VtZW50cyxcbiAgICAgICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzLnByZWZpeENscyxcbiAgICAgICAgICAgIGFsaWduUG9pbnQgPSBfdGhpcyRwcm9wcy5hbGlnblBvaW50LFxuICAgICAgICAgICAgZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ24gPSBfdGhpcyRwcm9wcy5nZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbjtcblxuICAgICAgICBpZiAocG9wdXBQbGFjZW1lbnQgJiYgYnVpbHRpblBsYWNlbWVudHMpIHtcbiAgICAgICAgICBjbGFzc05hbWUucHVzaCgoMCwgX2FsaWduVXRpbC5nZXRBbGlnblBvcHVwQ2xhc3NOYW1lKShidWlsdGluUGxhY2VtZW50cywgcHJlZml4Q2xzLCBhbGlnbiwgYWxpZ25Qb2ludCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduKSB7XG4gICAgICAgICAgY2xhc3NOYW1lLnB1c2goZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ24oYWxpZ24pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbGFzc05hbWUuam9pbignICcpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuZ2V0Q29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgICAgZGVzdHJveVBvcHVwT25IaWRlID0gX3RoaXMkcHJvcHMyLmRlc3Ryb3lQb3B1cE9uSGlkZSxcbiAgICAgICAgICAgIHBvcHVwQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMyLnBvcHVwQ2xhc3NOYW1lLFxuICAgICAgICAgICAgb25Qb3B1cEFsaWduID0gX3RoaXMkcHJvcHMyLm9uUG9wdXBBbGlnbixcbiAgICAgICAgICAgIHBvcHVwTW90aW9uID0gX3RoaXMkcHJvcHMyLnBvcHVwTW90aW9uLFxuICAgICAgICAgICAgcG9wdXBBbmltYXRpb24gPSBfdGhpcyRwcm9wczIucG9wdXBBbmltYXRpb24sXG4gICAgICAgICAgICBwb3B1cFRyYW5zaXRpb25OYW1lID0gX3RoaXMkcHJvcHMyLnBvcHVwVHJhbnNpdGlvbk5hbWUsXG4gICAgICAgICAgICBwb3B1cFN0eWxlID0gX3RoaXMkcHJvcHMyLnBvcHVwU3R5bGUsXG4gICAgICAgICAgICBtYXNrID0gX3RoaXMkcHJvcHMyLm1hc2ssXG4gICAgICAgICAgICBtYXNrQW5pbWF0aW9uID0gX3RoaXMkcHJvcHMyLm1hc2tBbmltYXRpb24sXG4gICAgICAgICAgICBtYXNrVHJhbnNpdGlvbk5hbWUgPSBfdGhpcyRwcm9wczIubWFza1RyYW5zaXRpb25OYW1lLFxuICAgICAgICAgICAgbWFza01vdGlvbiA9IF90aGlzJHByb3BzMi5tYXNrTW90aW9uLFxuICAgICAgICAgICAgekluZGV4ID0gX3RoaXMkcHJvcHMyLnpJbmRleCxcbiAgICAgICAgICAgIHBvcHVwID0gX3RoaXMkcHJvcHMyLnBvcHVwLFxuICAgICAgICAgICAgc3RyZXRjaCA9IF90aGlzJHByb3BzMi5zdHJldGNoLFxuICAgICAgICAgICAgYWxpZ25Qb2ludCA9IF90aGlzJHByb3BzMi5hbGlnblBvaW50O1xuICAgICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHBvcHVwVmlzaWJsZSA9IF90aGlzJHN0YXRlLnBvcHVwVmlzaWJsZSxcbiAgICAgICAgICAgIHBvaW50ID0gX3RoaXMkc3RhdGUucG9pbnQ7XG5cbiAgICAgICAgdmFyIGFsaWduID0gX3RoaXMuZ2V0UG9wdXBBbGlnbigpO1xuXG4gICAgICAgIHZhciBtb3VzZVByb3BzID0ge307XG5cbiAgICAgICAgaWYgKF90aGlzLmlzTW91c2VFbnRlclRvU2hvdygpKSB7XG4gICAgICAgICAgbW91c2VQcm9wcy5vbk1vdXNlRW50ZXIgPSBfdGhpcy5vblBvcHVwTW91c2VFbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcy5pc01vdXNlTGVhdmVUb0hpZGUoKSkge1xuICAgICAgICAgIG1vdXNlUHJvcHMub25Nb3VzZUxlYXZlID0gX3RoaXMub25Qb3B1cE1vdXNlTGVhdmU7XG4gICAgICAgIH1cblxuICAgICAgICBtb3VzZVByb3BzLm9uTW91c2VEb3duID0gX3RoaXMub25Qb3B1cE1vdXNlRG93bjtcbiAgICAgICAgbW91c2VQcm9wcy5vblRvdWNoU3RhcnQgPSBfdGhpcy5vblBvcHVwTW91c2VEb3duO1xuICAgICAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfUG9wdXAuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgZGVzdHJveVBvcHVwT25IaWRlOiBkZXN0cm95UG9wdXBPbkhpZGUsXG4gICAgICAgICAgdmlzaWJsZTogcG9wdXBWaXNpYmxlLFxuICAgICAgICAgIHBvaW50OiBhbGlnblBvaW50ICYmIHBvaW50LFxuICAgICAgICAgIGNsYXNzTmFtZTogcG9wdXBDbGFzc05hbWUsXG4gICAgICAgICAgYWxpZ246IGFsaWduLFxuICAgICAgICAgIG9uQWxpZ246IG9uUG9wdXBBbGlnbixcbiAgICAgICAgICBhbmltYXRpb246IHBvcHVwQW5pbWF0aW9uLFxuICAgICAgICAgIGdldENsYXNzTmFtZUZyb21BbGlnbjogX3RoaXMuZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ25cbiAgICAgICAgfSwgbW91c2VQcm9wcywge1xuICAgICAgICAgIHN0cmV0Y2g6IHN0cmV0Y2gsXG4gICAgICAgICAgZ2V0Um9vdERvbU5vZGU6IF90aGlzLmdldFJvb3REb21Ob2RlLFxuICAgICAgICAgIHN0eWxlOiBwb3B1cFN0eWxlLFxuICAgICAgICAgIG1hc2s6IG1hc2ssXG4gICAgICAgICAgekluZGV4OiB6SW5kZXgsXG4gICAgICAgICAgdHJhbnNpdGlvbk5hbWU6IHBvcHVwVHJhbnNpdGlvbk5hbWUsXG4gICAgICAgICAgbWFza0FuaW1hdGlvbjogbWFza0FuaW1hdGlvbixcbiAgICAgICAgICBtYXNrVHJhbnNpdGlvbk5hbWU6IG1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICAgICAgICBtYXNrTW90aW9uOiBtYXNrTW90aW9uLFxuICAgICAgICAgIHJlZjogX3RoaXMucG9wdXBSZWYsXG4gICAgICAgICAgbW90aW9uOiBwb3B1cE1vdGlvblxuICAgICAgICB9KSwgdHlwZW9mIHBvcHVwID09PSAnZnVuY3Rpb24nID8gcG9wdXAoKSA6IHBvcHVwKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmF0dGFjaFBhcmVudCA9IGZ1bmN0aW9uIChwb3B1cENvbnRhaW5lcikge1xuICAgICAgICBfcmFmLmRlZmF1bHQuY2FuY2VsKF90aGlzLmF0dGFjaElkKTtcblxuICAgICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lciA9IF90aGlzJHByb3BzMy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICAgIGdldERvY3VtZW50ID0gX3RoaXMkcHJvcHMzLmdldERvY3VtZW50O1xuXG4gICAgICAgIHZhciBkb21Ob2RlID0gX3RoaXMuZ2V0Um9vdERvbU5vZGUoKTtcblxuICAgICAgICB2YXIgbW91bnROb2RlO1xuXG4gICAgICAgIGlmICghZ2V0UG9wdXBDb250YWluZXIpIHtcbiAgICAgICAgICBtb3VudE5vZGUgPSBnZXREb2N1bWVudCgpLmJvZHk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9tTm9kZSB8fCBnZXRQb3B1cENvbnRhaW5lci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBDb21wYXRpYmxlIGZvciBsZWdhY3kgZ2V0UG9wdXBDb250YWluZXIgd2l0aCBkb21Ob2RlIGFyZ3VtZW50LlxuICAgICAgICAgIC8vIElmIG5vIG5lZWQgYGRvbU5vZGVgIGFyZ3VtZW50LCB3aWxsIGNhbGwgZGlyZWN0bHkuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL2Vsb3F1ZW50LW1jbGVhbi1zczkzbT9maWxlPS9zcmMvQXBwLmpzXG4gICAgICAgICAgbW91bnROb2RlID0gZ2V0UG9wdXBDb250YWluZXIoZG9tTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW91bnROb2RlKSB7XG4gICAgICAgICAgbW91bnROb2RlLmFwcGVuZENoaWxkKHBvcHVwQ29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZXRyeSBhZnRlciBmcmFtZSByZW5kZXIgaW4gY2FzZSBwYXJlbnQgbm90IHJlYWR5XG4gICAgICAgICAgX3RoaXMuYXR0YWNoSWQgPSAoMCwgX3JhZi5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5hdHRhY2hQYXJlbnQocG9wdXBDb250YWluZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5nZXRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwb3B1cENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBNYWtlIHN1cmUgZGVmYXVsdCBwb3B1cCBjb250YWluZXIgd2lsbCBuZXZlciBjYXVzZSBzY3JvbGxiYXIgYXBwZWFyaW5nXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdHJpZ2dlci9pc3N1ZXMvNDFcblxuICAgICAgICBwb3B1cENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHBvcHVwQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcbiAgICAgICAgcG9wdXBDb250YWluZXIuc3R5bGUubGVmdCA9ICcwJztcbiAgICAgICAgcG9wdXBDb250YWluZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG5cbiAgICAgICAgX3RoaXMuYXR0YWNoUGFyZW50KHBvcHVwQ29udGFpbmVyKTtcblxuICAgICAgICByZXR1cm4gcG9wdXBDb250YWluZXI7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5zZXRQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuICAgICAgICB2YXIgYWxpZ25Qb2ludCA9IF90aGlzLnByb3BzLmFsaWduUG9pbnQ7XG4gICAgICAgIGlmICghYWxpZ25Qb2ludCB8fCAhcG9pbnQpIHJldHVybjtcblxuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcG9pbnQ6IHtcbiAgICAgICAgICAgIHBhZ2VYOiBwb2ludC5wYWdlWCxcbiAgICAgICAgICAgIHBhZ2VZOiBwb2ludC5wYWdlWVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5oYW5kbGVQb3J0YWxVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpcy5zdGF0ZS5wcmV2UG9wdXBWaXNpYmxlICE9PSBfdGhpcy5zdGF0ZS5wb3B1cFZpc2libGUpIHtcbiAgICAgICAgICBfdGhpcy5wcm9wcy5hZnRlclBvcHVwVmlzaWJsZUNoYW5nZShfdGhpcy5zdGF0ZS5wb3B1cFZpc2libGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgcG9wdXBWaXNpYmxlO1xuXG4gICAgICBpZiAoJ3BvcHVwVmlzaWJsZScgaW4gcHJvcHMpIHtcbiAgICAgICAgcG9wdXBWaXNpYmxlID0gISFwcm9wcy5wb3B1cFZpc2libGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3B1cFZpc2libGUgPSAhIXByb3BzLmRlZmF1bHRQb3B1cFZpc2libGU7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICBwcmV2UG9wdXBWaXNpYmxlOiBwb3B1cFZpc2libGUsXG4gICAgICAgIHBvcHVwVmlzaWJsZTogcG9wdXBWaXNpYmxlXG4gICAgICB9O1xuICAgICAgQUxMX0hBTkRMRVJTLmZvckVhY2goZnVuY3Rpb24gKGgpIHtcbiAgICAgICAgX3RoaXNbXCJmaXJlXCIuY29uY2F0KGgpXSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgX3RoaXMuZmlyZUV2ZW50cyhoLCBlKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFRyaWdnZXIsIFt7XG4gICAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnREaWRVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlOyAvLyBXZSBtdXN0IGxpc3RlbiB0byBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAsIGVkZ2UgY2FzZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTgwNFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L2NhbGVuZGFyL2lzc3Vlcy8yNTBcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC90cmlnZ2VyL2lzc3Vlcy81MFxuXG4gICAgICAgIGlmIChzdGF0ZS5wb3B1cFZpc2libGUpIHtcbiAgICAgICAgICB2YXIgY3VycmVudERvY3VtZW50O1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIgJiYgKHRoaXMuaXNDbGlja1RvSGlkZSgpIHx8IHRoaXMuaXNDb250ZXh0TWVudVRvU2hvdygpKSkge1xuICAgICAgICAgICAgY3VycmVudERvY3VtZW50ID0gcHJvcHMuZ2V0RG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tPdXRzaWRlSGFuZGxlciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lci5kZWZhdWx0KShjdXJyZW50RG9jdW1lbnQsICdtb3VzZWRvd24nLCB0aGlzLm9uRG9jdW1lbnRDbGljayk7XG4gICAgICAgICAgfSAvLyBhbHdheXMgaGlkZSBvbiBtb2JpbGVcblxuXG4gICAgICAgICAgaWYgKCF0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgICAgICAgIGN1cnJlbnREb2N1bWVudCA9IGN1cnJlbnREb2N1bWVudCB8fCBwcm9wcy5nZXREb2N1bWVudCgpO1xuICAgICAgICAgICAgdGhpcy50b3VjaE91dHNpZGVIYW5kbGVyID0gKDAsIF9hZGRFdmVudExpc3RlbmVyLmRlZmF1bHQpKGN1cnJlbnREb2N1bWVudCwgJ3RvdWNoc3RhcnQnLCB0aGlzLm9uRG9jdW1lbnRDbGljayk7XG4gICAgICAgICAgfSAvLyBjbG9zZSBwb3B1cCB3aGVuIHRyaWdnZXIgdHlwZSBjb250YWlucyAnb25Db250ZXh0TWVudScgYW5kIGRvY3VtZW50IGlzIHNjcm9sbGluZy5cblxuXG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIxICYmIHRoaXMuaXNDb250ZXh0TWVudVRvU2hvdygpKSB7XG4gICAgICAgICAgICBjdXJyZW50RG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQgfHwgcHJvcHMuZ2V0RG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVPdXRzaWRlSGFuZGxlcjEgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIuZGVmYXVsdCkoY3VycmVudERvY3VtZW50LCAnc2Nyb2xsJywgdGhpcy5vbkNvbnRleHRNZW51Q2xvc2UpO1xuICAgICAgICAgIH0gLy8gY2xvc2UgcG9wdXAgd2hlbiB0cmlnZ2VyIHR5cGUgY29udGFpbnMgJ29uQ29udGV4dE1lbnUnIGFuZCB3aW5kb3cgaXMgYmx1ci5cblxuXG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyICYmIHRoaXMuaXNDb250ZXh0TWVudVRvU2hvdygpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyID0gKDAsIF9hZGRFdmVudExpc3RlbmVyLmRlZmF1bHQpKHdpbmRvdywgJ2JsdXInLCB0aGlzLm9uQ29udGV4dE1lbnVDbG9zZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhck91dHNpZGVIYW5kbGVyKCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJEZWxheVRpbWVyKCk7XG4gICAgICAgIHRoaXMuY2xlYXJPdXRzaWRlSGFuZGxlcigpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZURvd25UaW1lb3V0KTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0UG9wdXBEb21Ob2RlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UG9wdXBEb21Ob2RlKCkge1xuICAgICAgICB2YXIgX3RoaXMkcG9wdXBSZWYkY3VycmVuMjtcblxuICAgICAgICAvLyBmb3IgdGVzdFxuICAgICAgICByZXR1cm4gKChfdGhpcyRwb3B1cFJlZiRjdXJyZW4yID0gdGhpcy5wb3B1cFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdGhpcyRwb3B1cFJlZiRjdXJyZW4yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRwb3B1cFJlZiRjdXJyZW4yLmdldEVsZW1lbnQoKSkgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0UG9wdXBBbGlnblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvcHVwQWxpZ24oKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciBwb3B1cFBsYWNlbWVudCA9IHByb3BzLnBvcHVwUGxhY2VtZW50LFxuICAgICAgICAgICAgcG9wdXBBbGlnbiA9IHByb3BzLnBvcHVwQWxpZ24sXG4gICAgICAgICAgICBidWlsdGluUGxhY2VtZW50cyA9IHByb3BzLmJ1aWx0aW5QbGFjZW1lbnRzO1xuXG4gICAgICAgIGlmIChwb3B1cFBsYWNlbWVudCAmJiBidWlsdGluUGxhY2VtZW50cykge1xuICAgICAgICAgIHJldHVybiAoMCwgX2FsaWduVXRpbC5nZXRBbGlnbkZyb21QbGFjZW1lbnQpKGJ1aWx0aW5QbGFjZW1lbnRzLCBwb3B1cFBsYWNlbWVudCwgcG9wdXBBbGlnbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9wdXBBbGlnbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHBvcHVwVmlzaWJsZSAgICBTaG93IG9yIG5vdCB0aGUgcG9wdXAgZWxlbWVudFxuICAgICAgICogQHBhcmFtIGV2ZW50ICAgICAgICAgICBTeW50aGV0aWNFdmVudCwgdXNlZCBmb3IgYHBvaW50QWxpZ25gXG4gICAgICAgKi9cblxuICAgIH0sIHtcbiAgICAgIGtleTogXCJzZXRQb3B1cFZpc2libGVcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQb3B1cFZpc2libGUocG9wdXBWaXNpYmxlLCBldmVudCkge1xuICAgICAgICB2YXIgYWxpZ25Qb2ludCA9IHRoaXMucHJvcHMuYWxpZ25Qb2ludDtcbiAgICAgICAgdmFyIHByZXZQb3B1cFZpc2libGUgPSB0aGlzLnN0YXRlLnBvcHVwVmlzaWJsZTtcbiAgICAgICAgdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcblxuICAgICAgICBpZiAocHJldlBvcHVwVmlzaWJsZSAhPT0gcG9wdXBWaXNpYmxlKSB7XG4gICAgICAgICAgaWYgKCEoJ3BvcHVwVmlzaWJsZScgaW4gdGhpcy5wcm9wcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBwb3B1cFZpc2libGU6IHBvcHVwVmlzaWJsZSxcbiAgICAgICAgICAgICAgcHJldlBvcHVwVmlzaWJsZTogcHJldlBvcHVwVmlzaWJsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5wcm9wcy5vblBvcHVwVmlzaWJsZUNoYW5nZShwb3B1cFZpc2libGUpO1xuICAgICAgICB9IC8vIEFsd2F5cyByZWNvcmQgdGhlIHBvaW50IHBvc2l0aW9uIHNpbmNlIG1vdXNlRW50ZXJEZWxheSB3aWxsIGRlbGF5IHRoZSBzaG93XG5cblxuICAgICAgICBpZiAoYWxpZ25Qb2ludCAmJiBldmVudCkge1xuICAgICAgICAgIHRoaXMuc2V0UG9pbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImRlbGF5U2V0UG9wdXBWaXNpYmxlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZGVsYXlTZXRQb3B1cFZpc2libGUodmlzaWJsZSwgZGVsYXlTLCBldmVudCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICB2YXIgZGVsYXkgPSBkZWxheVMgKiAxMDAwO1xuICAgICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuXG4gICAgICAgIGlmIChkZWxheSkge1xuICAgICAgICAgIHZhciBwb2ludCA9IGV2ZW50ID8ge1xuICAgICAgICAgICAgcGFnZVg6IGV2ZW50LnBhZ2VYLFxuICAgICAgICAgICAgcGFnZVk6IGV2ZW50LnBhZ2VZXG4gICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgdGhpcy5kZWxheVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLnNldFBvcHVwVmlzaWJsZSh2aXNpYmxlLCBwb2ludCk7XG5cbiAgICAgICAgICAgIF90aGlzMi5jbGVhckRlbGF5VGltZXIoKTtcbiAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRQb3B1cFZpc2libGUodmlzaWJsZSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNsZWFyRGVsYXlUaW1lclwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyRGVsYXlUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsYXlUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZXIpO1xuICAgICAgICAgIHRoaXMuZGVsYXlUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY2xlYXJPdXRzaWRlSGFuZGxlclwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyT3V0c2lkZUhhbmRsZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy5jbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIxKSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMS5yZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIxID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyKSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMi5yZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy50b3VjaE91dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjcmVhdGVUd29DaGFpbnNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUd29DaGFpbnMoZXZlbnQpIHtcbiAgICAgICAgdmFyIGNoaWxkUHJvcyA9IHRoaXMucHJvcHMuY2hpbGRyZW4ucHJvcHM7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgaWYgKGNoaWxkUHJvc1tldmVudF0gJiYgcHJvcHNbZXZlbnRdKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbXCJmaXJlXCIuY29uY2F0KGV2ZW50KV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGRQcm9zW2V2ZW50XSB8fCBwcm9wc1tldmVudF07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzQ2xpY2tUb1Nob3dcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc0NsaWNrVG9TaG93KCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzNC5hY3Rpb24sXG4gICAgICAgICAgICBzaG93QWN0aW9uID0gX3RoaXMkcHJvcHM0LnNob3dBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignY2xpY2snKSAhPT0gLTEgfHwgc2hvd0FjdGlvbi5pbmRleE9mKCdjbGljaycpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaXNDb250ZXh0TWVudVRvU2hvd1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGlzQ29udGV4dE1lbnVUb1Nob3coKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczUgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgYWN0aW9uID0gX3RoaXMkcHJvcHM1LmFjdGlvbixcbiAgICAgICAgICAgIHNob3dBY3Rpb24gPSBfdGhpcyRwcm9wczUuc2hvd0FjdGlvbjtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5pbmRleE9mKCdjb250ZXh0TWVudScpICE9PSAtMSB8fCBzaG93QWN0aW9uLmluZGV4T2YoJ2NvbnRleHRNZW51JykgIT09IC0xO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJpc0NsaWNrVG9IaWRlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaXNDbGlja1RvSGlkZSgpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzNiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBhY3Rpb24gPSBfdGhpcyRwcm9wczYuYWN0aW9uLFxuICAgICAgICAgICAgaGlkZUFjdGlvbiA9IF90aGlzJHByb3BzNi5oaWRlQWN0aW9uO1xuICAgICAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2NsaWNrJykgIT09IC0xIHx8IGhpZGVBY3Rpb24uaW5kZXhPZignY2xpY2snKSAhPT0gLTE7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzTW91c2VFbnRlclRvU2hvd1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGlzTW91c2VFbnRlclRvU2hvdygpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzNyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBhY3Rpb24gPSBfdGhpcyRwcm9wczcuYWN0aW9uLFxuICAgICAgICAgICAgc2hvd0FjdGlvbiA9IF90aGlzJHByb3BzNy5zaG93QWN0aW9uO1xuICAgICAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2hvdmVyJykgIT09IC0xIHx8IHNob3dBY3Rpb24uaW5kZXhPZignbW91c2VFbnRlcicpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaXNNb3VzZUxlYXZlVG9IaWRlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaXNNb3VzZUxlYXZlVG9IaWRlKCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM4ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzOC5hY3Rpb24sXG4gICAgICAgICAgICBoaWRlQWN0aW9uID0gX3RoaXMkcHJvcHM4LmhpZGVBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignaG92ZXInKSAhPT0gLTEgfHwgaGlkZUFjdGlvbi5pbmRleE9mKCdtb3VzZUxlYXZlJykgIT09IC0xO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJpc0ZvY3VzVG9TaG93XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaXNGb2N1c1RvU2hvdygpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzOSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBhY3Rpb24gPSBfdGhpcyRwcm9wczkuYWN0aW9uLFxuICAgICAgICAgICAgc2hvd0FjdGlvbiA9IF90aGlzJHByb3BzOS5zaG93QWN0aW9uO1xuICAgICAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2ZvY3VzJykgIT09IC0xIHx8IHNob3dBY3Rpb24uaW5kZXhPZignZm9jdXMnKSAhPT0gLTE7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzQmx1clRvSGlkZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGlzQmx1clRvSGlkZSgpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzMTAgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgYWN0aW9uID0gX3RoaXMkcHJvcHMxMC5hY3Rpb24sXG4gICAgICAgICAgICBoaWRlQWN0aW9uID0gX3RoaXMkcHJvcHMxMC5oaWRlQWN0aW9uO1xuICAgICAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2ZvY3VzJykgIT09IC0xIHx8IGhpZGVBY3Rpb24uaW5kZXhPZignYmx1cicpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZm9yY2VQb3B1cEFsaWduXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZm9yY2VQb3B1cEFsaWduKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5wb3B1cFZpc2libGUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkcG9wdXBSZWYkY3VycmVuMztcblxuICAgICAgICAgIChfdGhpcyRwb3B1cFJlZiRjdXJyZW4zID0gdGhpcy5wb3B1cFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdGhpcyRwb3B1cFJlZiRjdXJyZW4zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRwb3B1cFJlZiRjdXJyZW4zLmZvcmNlQWxpZ24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJmaXJlRXZlbnRzXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZmlyZUV2ZW50cyh0eXBlLCBlKSB7XG4gICAgICAgIHZhciBjaGlsZENhbGxiYWNrID0gdGhpcy5wcm9wcy5jaGlsZHJlbi5wcm9wc1t0eXBlXTtcblxuICAgICAgICBpZiAoY2hpbGRDYWxsYmFjaykge1xuICAgICAgICAgIGNoaWxkQ2FsbGJhY2soZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0aGlzLnByb3BzW3R5cGVdO1xuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNsb3NlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuc2V0UG9wdXBWaXNpYmxlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgcG9wdXBWaXNpYmxlID0gdGhpcy5zdGF0ZS5wb3B1cFZpc2libGU7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczExID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMxMS5jaGlsZHJlbixcbiAgICAgICAgICAgIGZvcmNlUmVuZGVyID0gX3RoaXMkcHJvcHMxMS5mb3JjZVJlbmRlcixcbiAgICAgICAgICAgIGFsaWduUG9pbnQgPSBfdGhpcyRwcm9wczExLmFsaWduUG9pbnQsXG4gICAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczExLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIGF1dG9EZXN0cm95ID0gX3RoaXMkcHJvcHMxMS5hdXRvRGVzdHJveTtcblxuICAgICAgICB2YXIgY2hpbGQgPSBfcmVhY3QuZGVmYXVsdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcblxuICAgICAgICB2YXIgbmV3Q2hpbGRQcm9wcyA9IHtcbiAgICAgICAgICBrZXk6ICd0cmlnZ2VyJ1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmlzQ29udGV4dE1lbnVUb1Nob3coKSkge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Db250ZXh0TWVudSA9IHRoaXMub25Db250ZXh0TWVudTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uQ29udGV4dE1lbnUgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Db250ZXh0TWVudScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNDbGlja1RvSGlkZSgpIHx8IHRoaXMuaXNDbGlja1RvU2hvdygpKSB7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrO1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZURvd24gPSB0aGlzLm9uTW91c2VEb3duO1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Ub3VjaFN0YXJ0ID0gdGhpcy5vblRvdWNoU3RhcnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbkNsaWNrID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uQ2xpY2snKTtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VEb3duID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uTW91c2VEb3duJyk7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vblRvdWNoU3RhcnQgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Ub3VjaFN0YXJ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc01vdXNlRW50ZXJUb1Nob3coKSkge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZUVudGVyID0gdGhpcy5vbk1vdXNlRW50ZXI7XG5cbiAgICAgICAgICBpZiAoYWxpZ25Qb2ludCkge1xuICAgICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbk1vdXNlTW92ZSA9IHRoaXMub25Nb3VzZU1vdmU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZUVudGVyID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uTW91c2VFbnRlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNNb3VzZUxlYXZlVG9IaWRlKCkpIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VMZWF2ZSA9IHRoaXMub25Nb3VzZUxlYXZlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZUxlYXZlID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uTW91c2VMZWF2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNGb2N1c1RvU2hvdygpIHx8IHRoaXMuaXNCbHVyVG9IaWRlKCkpIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uRm9jdXMgPSB0aGlzLm9uRm9jdXM7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbkJsdXIgPSB0aGlzLm9uQmx1cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uRm9jdXMgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Gb2N1cycpO1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25CbHVyID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uQmx1cicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkcmVuQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGNoaWxkICYmIGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLmNsYXNzTmFtZSwgY2xhc3NOYW1lKTtcblxuICAgICAgICBpZiAoY2hpbGRyZW5DbGFzc05hbWUpIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLmNsYXNzTmFtZSA9IGNoaWxkcmVuQ2xhc3NOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNsb25lUHJvcHMgPSAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIG5ld0NoaWxkUHJvcHMpO1xuXG4gICAgICAgIGlmICgoMCwgX3JlZjIuc3VwcG9ydFJlZikoY2hpbGQpKSB7XG4gICAgICAgICAgY2xvbmVQcm9wcy5yZWYgPSAoMCwgX3JlZjIuY29tcG9zZVJlZikodGhpcy50cmlnZ2VyUmVmLCBjaGlsZC5yZWYpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyaWdnZXIgPSBfcmVhY3QuZGVmYXVsdC5jbG9uZUVsZW1lbnQoY2hpbGQsIGNsb25lUHJvcHMpO1xuXG4gICAgICAgIHZhciBwb3J0YWw7IC8vIHByZXZlbnQgdW5tb3VudGluZyBhZnRlciBpdCdzIHJlbmRlcmVkXG5cbiAgICAgICAgaWYgKHBvcHVwVmlzaWJsZSB8fCB0aGlzLnBvcHVwUmVmLmN1cnJlbnQgfHwgZm9yY2VSZW5kZXIpIHtcbiAgICAgICAgICBwb3J0YWwgPSBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFBvcnRhbENvbXBvbmVudCwge1xuICAgICAgICAgICAga2V5OiBcInBvcnRhbFwiLFxuICAgICAgICAgICAgZ2V0Q29udGFpbmVyOiB0aGlzLmdldENvbnRhaW5lcixcbiAgICAgICAgICAgIGRpZFVwZGF0ZTogdGhpcy5oYW5kbGVQb3J0YWxVcGRhdGVcbiAgICAgICAgICB9LCB0aGlzLmdldENvbXBvbmVudCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcG9wdXBWaXNpYmxlICYmIGF1dG9EZXN0cm95KSB7XG4gICAgICAgICAgcG9ydGFsID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9jb250ZXh0LmRlZmF1bHQuUHJvdmlkZXIsIHtcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgb25Qb3B1cE1vdXNlRG93bjogdGhpcy5vblBvcHVwTW91c2VEb3duXG4gICAgICAgICAgfVxuICAgICAgICB9LCB0cmlnZ2VyLCBwb3J0YWwpO1xuICAgICAgfVxuICAgIH1dLCBbe1xuICAgICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhfcmVmLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgdmFyIHBvcHVwVmlzaWJsZSA9IF9yZWYucG9wdXBWaXNpYmxlO1xuICAgICAgICB2YXIgbmV3U3RhdGUgPSB7fTtcblxuICAgICAgICBpZiAocG9wdXBWaXNpYmxlICE9PSB1bmRlZmluZWQgJiYgcHJldlN0YXRlLnBvcHVwVmlzaWJsZSAhPT0gcG9wdXBWaXNpYmxlKSB7XG4gICAgICAgICAgbmV3U3RhdGUucG9wdXBWaXNpYmxlID0gcG9wdXBWaXNpYmxlO1xuICAgICAgICAgIG5ld1N0YXRlLnByZXZQb3B1cFZpc2libGUgPSBwcmV2U3RhdGUucG9wdXBWaXNpYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gVHJpZ2dlcjtcbiAgfShfcmVhY3QuZGVmYXVsdC5Db21wb25lbnQpO1xuXG4gIFRyaWdnZXIuY29udGV4dFR5cGUgPSBfY29udGV4dC5kZWZhdWx0O1xuICBUcmlnZ2VyLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBwcmVmaXhDbHM6ICdyYy10cmlnZ2VyLXBvcHVwJyxcbiAgICBnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbjogcmV0dXJuRW1wdHlTdHJpbmcsXG4gICAgZ2V0RG9jdW1lbnQ6IHJldHVybkRvY3VtZW50LFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBub29wLFxuICAgIGFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlOiBub29wLFxuICAgIG9uUG9wdXBBbGlnbjogbm9vcCxcbiAgICBwb3B1cENsYXNzTmFtZTogJycsXG4gICAgbW91c2VFbnRlckRlbGF5OiAwLFxuICAgIG1vdXNlTGVhdmVEZWxheTogMC4xLFxuICAgIGZvY3VzRGVsYXk6IDAsXG4gICAgYmx1ckRlbGF5OiAwLjE1LFxuICAgIHBvcHVwU3R5bGU6IHt9LFxuICAgIGRlc3Ryb3lQb3B1cE9uSGlkZTogZmFsc2UsXG4gICAgcG9wdXBBbGlnbjoge30sXG4gICAgZGVmYXVsdFBvcHVwVmlzaWJsZTogZmFsc2UsXG4gICAgbWFzazogZmFsc2UsXG4gICAgbWFza0Nsb3NhYmxlOiB0cnVlLFxuICAgIGFjdGlvbjogW10sXG4gICAgc2hvd0FjdGlvbjogW10sXG4gICAgaGlkZUFjdGlvbjogW10sXG4gICAgYXV0b0Rlc3Ryb3k6IGZhbHNlXG4gIH07XG4gIHJldHVybiBUcmlnZ2VyO1xufVxuXG52YXIgX2RlZmF1bHQgPSBnZW5lcmF0ZVRyaWdnZXIoX1BvcnRhbC5kZWZhdWx0KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRBbGlnbkZyb21QbGFjZW1lbnQgPSBnZXRBbGlnbkZyb21QbGFjZW1lbnQ7XG5leHBvcnRzLmdldEFsaWduUG9wdXBDbGFzc05hbWUgPSBnZXRBbGlnblBvcHVwQ2xhc3NOYW1lO1xuXG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xuXG5mdW5jdGlvbiBpc1BvaW50c0VxKGExLCBhMiwgaXNBbGlnblBvaW50KSB7XG4gIGlmIChpc0FsaWduUG9pbnQpIHtcbiAgICByZXR1cm4gYTFbMF0gPT09IGEyWzBdO1xuICB9XG5cbiAgcmV0dXJuIGExWzBdID09PSBhMlswXSAmJiBhMVsxXSA9PT0gYTJbMV07XG59XG5cbmZ1bmN0aW9uIGdldEFsaWduRnJvbVBsYWNlbWVudChidWlsdGluUGxhY2VtZW50cywgcGxhY2VtZW50U3RyLCBhbGlnbikge1xuICB2YXIgYmFzZUFsaWduID0gYnVpbHRpblBsYWNlbWVudHNbcGxhY2VtZW50U3RyXSB8fCB7fTtcbiAgcmV0dXJuICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIGJhc2VBbGlnbiksIGFsaWduKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxpZ25Qb3B1cENsYXNzTmFtZShidWlsdGluUGxhY2VtZW50cywgcHJlZml4Q2xzLCBhbGlnbiwgaXNBbGlnblBvaW50KSB7XG4gIHZhciBwb2ludHMgPSBhbGlnbi5wb2ludHM7XG4gIHZhciBwbGFjZW1lbnRzID0gT2JqZWN0LmtleXMoYnVpbHRpblBsYWNlbWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGxhY2VtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBwbGFjZW1lbnQgPSBwbGFjZW1lbnRzW2ldO1xuXG4gICAgaWYgKGlzUG9pbnRzRXEoYnVpbHRpblBsYWNlbWVudHNbcGxhY2VtZW50XS5wb2ludHMsIHBvaW50cywgaXNBbGlnblBvaW50KSkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGxhY2VtZW50LVwiKS5jb25jYXQocGxhY2VtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldE1vdGlvbiA9IGdldE1vdGlvbjtcblxuZnVuY3Rpb24gZ2V0TW90aW9uKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgbW90aW9uID0gX3JlZi5tb3Rpb24sXG4gICAgICBhbmltYXRpb24gPSBfcmVmLmFuaW1hdGlvbixcbiAgICAgIHRyYW5zaXRpb25OYW1lID0gX3JlZi50cmFuc2l0aW9uTmFtZTtcblxuICBpZiAobW90aW9uKSB7XG4gICAgcmV0dXJuIG1vdGlvbjtcbiAgfVxuXG4gIGlmIChhbmltYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW90aW9uTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGFuaW1hdGlvbilcbiAgICB9O1xuICB9XG5cbiAgaWYgKHRyYW5zaXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9waWNrQXR0cnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9waWNrQXR0cnNcIikpO1xuXG52YXIgX3JlcXVlc3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JlcXVlc3RcIikpO1xuXG52YXIgX3VpZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdWlkXCIpKTtcblxudmFyIF9hdHRyQWNjZXB0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9hdHRyLWFjY2VwdFwiKSk7XG5cbnZhciBfdHJhdmVyc2VGaWxlVHJlZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdHJhdmVyc2VGaWxlVHJlZVwiKSk7XG5cbi8qIGVzbGludCByZWFjdC9uby1pcy1tb3VudGVkOjAscmVhY3Qvc29ydC1jb21wOjAscmVhY3QvcHJvcC10eXBlczowICovXG52YXIgQWpheFVwbG9hZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKEFqYXhVcGxvYWRlciwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyLmRlZmF1bHQpKEFqYXhVcGxvYWRlcik7XG5cbiAgZnVuY3Rpb24gQWpheFVwbG9hZGVyKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIEFqYXhVcGxvYWRlcik7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHVpZDogKDAsIF91aWQuZGVmYXVsdCkoKVxuICAgIH07XG4gICAgX3RoaXMucmVxcyA9IHt9O1xuXG4gICAgX3RoaXMub25DaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGZpbGVzID0gZS50YXJnZXQuZmlsZXM7XG5cbiAgICAgIF90aGlzLnVwbG9hZEZpbGVzKGZpbGVzKTtcblxuICAgICAgX3RoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25DbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZWwgPSBfdGhpcy5maWxlSW5wdXQ7XG5cbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIG9uQ2xpY2sgPSBfdGhpcyRwcm9wcy5vbkNsaWNrO1xuXG4gICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4udHlwZSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudE5vZGU7XG4gICAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgICBwYXJlbnQucXVlcnlTZWxlY3RvcignYnV0dG9uJykuYmx1cigpO1xuICAgICAgfVxuXG4gICAgICBlbC5jbGljaygpO1xuXG4gICAgICBpZiAob25DbGljaykge1xuICAgICAgICBvbkNsaWNrKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vbktleURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIF90aGlzLm9uQ2xpY2soZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uRmlsZURyb3AgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG11bHRpcGxlID0gX3RoaXMucHJvcHMubXVsdGlwbGU7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChlLnR5cGUgPT09ICdkcmFnb3ZlcicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMucHJvcHMuZGlyZWN0b3J5KSB7XG4gICAgICAgICgwLCBfdHJhdmVyc2VGaWxlVHJlZS5kZWZhdWx0KShBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmRhdGFUcmFuc2Zlci5pdGVtcyksIF90aGlzLnVwbG9hZEZpbGVzLCBmdW5jdGlvbiAoX2ZpbGUpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIF9hdHRyQWNjZXB0LmRlZmF1bHQpKF9maWxlLCBfdGhpcy5wcm9wcy5hY2NlcHQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmaWxlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuZGF0YVRyYW5zZmVyLmZpbGVzKS5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIF9hdHRyQWNjZXB0LmRlZmF1bHQpKGZpbGUsIF90aGlzLnByb3BzLmFjY2VwdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChtdWx0aXBsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmaWxlcyA9IGZpbGVzLnNsaWNlKDAsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMudXBsb2FkRmlsZXMoZmlsZXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy51cGxvYWRGaWxlcyA9IGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgdmFyIHBvc3RGaWxlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZpbGVzKTtcbiAgICAgIHBvc3RGaWxlcy5tYXAoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGZpbGUudWlkID0gKDAsIF91aWQuZGVmYXVsdCkoKTtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIF90aGlzLnVwbG9hZChmaWxlLCBwb3N0RmlsZXMpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLnNhdmVGaWxlSW5wdXQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMuZmlsZUlucHV0ID0gbm9kZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoQWpheFVwbG9hZGVyLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuX2lzTW91bnRlZCA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5faXNNb3VudGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmFib3J0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwbG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGxvYWQoZmlsZSwgZmlsZUxpc3QpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuXG4gICAgICBpZiAoIXByb3BzLmJlZm9yZVVwbG9hZCkge1xuICAgICAgICAvLyBhbHdheXMgYXN5bmMgaW4gY2FzZSB1c2UgcmVhY3Qgc3RhdGUgdG8ga2VlcCBmaWxlTGlzdFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIucG9zdChmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGJlZm9yZSA9IHByb3BzLmJlZm9yZVVwbG9hZChmaWxlLCBmaWxlTGlzdCk7XG5cbiAgICAgIGlmIChiZWZvcmUgJiYgdHlwZW9mIGJlZm9yZSAhPT0gJ2Jvb2xlYW4nICYmIGJlZm9yZS50aGVuKSB7XG4gICAgICAgIGJlZm9yZS50aGVuKGZ1bmN0aW9uIChwcm9jZXNzZWRGaWxlKSB7XG4gICAgICAgICAgdmFyIHByb2Nlc3NlZEZpbGVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3NlZEZpbGUpO1xuXG4gICAgICAgICAgaWYgKHByb2Nlc3NlZEZpbGVUeXBlID09PSAnW29iamVjdCBGaWxlXScgfHwgcHJvY2Vzc2VkRmlsZVR5cGUgPT09ICdbb2JqZWN0IEJsb2JdJykge1xuICAgICAgICAgICAgX3RoaXMyLnBvc3QocHJvY2Vzc2VkRmlsZSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczIucG9zdChmaWxlKTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoYmVmb3JlICE9PSBmYWxzZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIucG9zdChmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBvc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9zdChmaWxlKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLl9pc01vdW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgdmFyIG9uU3RhcnQgPSBwcm9wcy5vblN0YXJ0LFxuICAgICAgICAgIG9uUHJvZ3Jlc3MgPSBwcm9wcy5vblByb2dyZXNzLFxuICAgICAgICAgIF9wcm9wcyR0cmFuc2Zvcm1GaWxlID0gcHJvcHMudHJhbnNmb3JtRmlsZSxcbiAgICAgICAgICB0cmFuc2Zvcm1GaWxlID0gX3Byb3BzJHRyYW5zZm9ybUZpbGUgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChvcmlnaW5GaWxlKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5GaWxlO1xuICAgICAgfSA6IF9wcm9wcyR0cmFuc2Zvcm1GaWxlO1xuICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgdmFyIGFjdGlvbiA9IHByb3BzLmFjdGlvbjtcblxuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbihmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvbHZlKGFjdGlvbik7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdmFyIHVpZCA9IGZpbGUudWlkO1xuICAgICAgICB2YXIgcmVxdWVzdCA9IHByb3BzLmN1c3RvbVJlcXVlc3QgfHwgX3JlcXVlc3QuZGVmYXVsdDtcbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IFByb21pc2UucmVzb2x2ZSh0cmFuc2Zvcm1GaWxlKGZpbGUpKS50aGVuKGZ1bmN0aW9uICh0cmFuc2Zvcm1lZEZpbGUpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IHByb3BzLmRhdGE7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhKHRyYW5zZm9ybWVkRmlsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFt0cmFuc2Zvcm1lZEZpbGUsIGRhdGFdKTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgfSk7XG4gICAgICAgIHRyYW5zZm9ybS50aGVuKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgdmFyIF9yZWYyID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfcmVmLCAyKSxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWRGaWxlID0gX3JlZjJbMF0sXG4gICAgICAgICAgICAgIGRhdGEgPSBfcmVmMlsxXTtcblxuICAgICAgICAgIHZhciByZXF1ZXN0T3B0aW9uID0ge1xuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgICAgICBmaWxlbmFtZTogcHJvcHMubmFtZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBmaWxlOiB0cmFuc2Zvcm1lZEZpbGUsXG4gICAgICAgICAgICBoZWFkZXJzOiBwcm9wcy5oZWFkZXJzLFxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBwcm9wcy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICBtZXRob2Q6IHByb3BzLm1ldGhvZCB8fCAncG9zdCcsXG4gICAgICAgICAgICBvblByb2dyZXNzOiBvblByb2dyZXNzID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgb25Qcm9ncmVzcyhlLCBmaWxlKTtcbiAgICAgICAgICAgIH0gOiBudWxsLFxuICAgICAgICAgICAgb25TdWNjZXNzOiBmdW5jdGlvbiBvblN1Y2Nlc3MocmV0LCB4aHIpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIF90aGlzMy5yZXFzW3VpZF07XG4gICAgICAgICAgICAgIHByb3BzLm9uU3VjY2VzcyhyZXQsIGZpbGUsIHhocik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25FcnJvcjogZnVuY3Rpb24gb25FcnJvcihlcnIsIHJldCkge1xuICAgICAgICAgICAgICBkZWxldGUgX3RoaXMzLnJlcXNbdWlkXTtcbiAgICAgICAgICAgICAgcHJvcHMub25FcnJvcihlcnIsIHJldCwgZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBvblN0YXJ0KGZpbGUpO1xuICAgICAgICAgIF90aGlzMy5yZXFzW3VpZF0gPSByZXF1ZXN0KHJlcXVlc3RPcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB1aWQ6ICgwLCBfdWlkLmRlZmF1bHQpKClcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhYm9ydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhYm9ydChmaWxlKSB7XG4gICAgICB2YXIgcmVxcyA9IHRoaXMucmVxcztcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgdmFyIHVpZCA9IGZpbGUudWlkID8gZmlsZS51aWQgOiBmaWxlO1xuXG4gICAgICAgIGlmIChyZXFzW3VpZF0gJiYgcmVxc1t1aWRdLmFib3J0KSB7XG4gICAgICAgICAgcmVxc1t1aWRdLmFib3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgcmVxc1t1aWRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmtleXMocmVxcykuZm9yRWFjaChmdW5jdGlvbiAodWlkKSB7XG4gICAgICAgICAgaWYgKHJlcXNbdWlkXSAmJiByZXFzW3VpZF0uYWJvcnQpIHtcbiAgICAgICAgICAgIHJlcXNbdWlkXS5hYm9ydCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlbGV0ZSByZXFzW3VpZF07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBUYWcgPSBfdGhpcyRwcm9wczIuY29tcG9uZW50LFxuICAgICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzMi5wcmVmaXhDbHMsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMi5kaXNhYmxlZCxcbiAgICAgICAgICBpZCA9IF90aGlzJHByb3BzMi5pZCxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMi5zdHlsZSxcbiAgICAgICAgICBtdWx0aXBsZSA9IF90aGlzJHByb3BzMi5tdWx0aXBsZSxcbiAgICAgICAgICBhY2NlcHQgPSBfdGhpcyRwcm9wczIuYWNjZXB0LFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMyLmNoaWxkcmVuLFxuICAgICAgICAgIGRpcmVjdG9yeSA9IF90aGlzJHByb3BzMi5kaXJlY3RvcnksXG4gICAgICAgICAgb3BlbkZpbGVEaWFsb2dPbkNsaWNrID0gX3RoaXMkcHJvcHMyLm9wZW5GaWxlRGlhbG9nT25DbGljayxcbiAgICAgICAgICBvbk1vdXNlRW50ZXIgPSBfdGhpcyRwcm9wczIub25Nb3VzZUVudGVyLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZSA9IF90aGlzJHByb3BzMi5vbk1vdXNlTGVhdmUsXG4gICAgICAgICAgb3RoZXJQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKF90aGlzJHByb3BzMiwgW1wiY29tcG9uZW50XCIsIFwicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiZGlzYWJsZWRcIiwgXCJpZFwiLCBcInN0eWxlXCIsIFwibXVsdGlwbGVcIiwgXCJhY2NlcHRcIiwgXCJjaGlsZHJlblwiLCBcImRpcmVjdG9yeVwiLCBcIm9wZW5GaWxlRGlhbG9nT25DbGlja1wiLCBcIm9uTW91c2VFbnRlclwiLCBcIm9uTW91c2VMZWF2ZVwiXSk7XG4gICAgICB2YXIgY2xzID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgcHJlZml4Q2xzLCB0cnVlKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIGNsYXNzTmFtZSwgY2xhc3NOYW1lKSwgX2NsYXNzTmFtZXMpKTsgLy8gYmVjYXVzZSBpbnB1dCBkb24ndCBoYXZlIGRpcmVjdG9yeS93ZWJraXRkaXJlY3RvcnkgdHlwZSBkZWNsYXJhdGlvblxuXG4gICAgICB2YXIgZGlyUHJvcHMgPSBkaXJlY3RvcnkgPyB7XG4gICAgICAgIGRpcmVjdG9yeTogJ2RpcmVjdG9yeScsXG4gICAgICAgIHdlYmtpdGRpcmVjdG9yeTogJ3dlYmtpdGRpcmVjdG9yeSdcbiAgICAgIH0gOiB7fTtcbiAgICAgIHZhciBldmVudHMgPSBkaXNhYmxlZCA/IHt9IDoge1xuICAgICAgICBvbkNsaWNrOiBvcGVuRmlsZURpYWxvZ09uQ2xpY2sgPyB0aGlzLm9uQ2xpY2sgOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgb25LZXlEb3duOiBvcGVuRmlsZURpYWxvZ09uQ2xpY2sgPyB0aGlzLm9uS2V5RG93biA6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgICAgIG9uRHJvcDogdGhpcy5vbkZpbGVEcm9wLFxuICAgICAgICBvbkRyYWdPdmVyOiB0aGlzLm9uRmlsZURyb3AsXG4gICAgICAgIHRhYkluZGV4OiAnMCdcbiAgICAgIH07XG4gICAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChUYWcsIE9iamVjdC5hc3NpZ24oe30sIGV2ZW50cywge1xuICAgICAgICBjbGFzc05hbWU6IGNscyxcbiAgICAgICAgcm9sZTogXCJidXR0b25cIixcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9KSwgX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIE9iamVjdC5hc3NpZ24oe30sICgwLCBfcGlja0F0dHJzLmRlZmF1bHQpKG90aGVyUHJvcHMsIHtcbiAgICAgICAgYXJpYTogdHJ1ZSxcbiAgICAgICAgZGF0YTogdHJ1ZVxuICAgICAgfSksIHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgcmVmOiB0aGlzLnNhdmVGaWxlSW5wdXQsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgIHJldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBrZXk6IHRoaXMuc3RhdGUudWlkLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICBhY2NlcHQ6IGFjY2VwdFxuICAgICAgfSwgZGlyUHJvcHMsIHtcbiAgICAgICAgbXVsdGlwbGU6IG11bHRpcGxlLFxuICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZVxuICAgICAgfSkpLCBjaGlsZHJlbik7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBamF4VXBsb2FkZXI7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG52YXIgX2RlZmF1bHQgPSBBamF4VXBsb2FkZXI7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSk7XG5cbnZhciBfaW5oZXJpdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKSk7XG5cbnZhciBfY3JlYXRlU3VwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVTdXBlclwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX0FqYXhVcGxvYWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQWpheFVwbG9hZGVyXCIpKTtcblxuLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6MCAqL1xuZnVuY3Rpb24gZW1wdHkoKSB7fVxuXG52YXIgVXBsb2FkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKFVwbG9hZCwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9ICgwLCBfY3JlYXRlU3VwZXIyLmRlZmF1bHQpKFVwbG9hZCk7XG5cbiAgZnVuY3Rpb24gVXBsb2FkKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIFVwbG9hZCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIF90aGlzLnNhdmVVcGxvYWRlciA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBfdGhpcy51cGxvYWRlciA9IG5vZGU7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKFVwbG9hZCwgW3tcbiAgICBrZXk6IFwiYWJvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWJvcnQoZmlsZSkge1xuICAgICAgdGhpcy51cGxvYWRlci5hYm9ydChmaWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9BamF4VXBsb2FkZXIuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICByZWY6IHRoaXMuc2F2ZVVwbG9hZGVyXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBVcGxvYWQ7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5VcGxvYWQuZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnQ6ICdzcGFuJyxcbiAgcHJlZml4Q2xzOiAncmMtdXBsb2FkJyxcbiAgZGF0YToge30sXG4gIGhlYWRlcnM6IHt9LFxuICBuYW1lOiAnZmlsZScsXG4gIG11bHRpcGFydDogZmFsc2UsXG4gIG9uU3RhcnQ6IGVtcHR5LFxuICBvbkVycm9yOiBlbXB0eSxcbiAgb25TdWNjZXNzOiBlbXB0eSxcbiAgbXVsdGlwbGU6IGZhbHNlLFxuICBiZWZvcmVVcGxvYWQ6IG51bGwsXG4gIGN1c3RvbVJlcXVlc3Q6IG51bGwsXG4gIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gIG9wZW5GaWxlRGlhbG9nT25DbGljazogdHJ1ZVxufTtcbnZhciBfZGVmYXVsdCA9IFVwbG9hZDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICByZXR1cm4gc3RyLmluZGV4T2Yoc3VmZml4LCBzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xO1xufVxuXG52YXIgX2RlZmF1bHQgPSBmdW5jdGlvbiBfZGVmYXVsdChmaWxlLCBhY2NlcHRlZEZpbGVzKSB7XG4gIGlmIChmaWxlICYmIGFjY2VwdGVkRmlsZXMpIHtcbiAgICB2YXIgYWNjZXB0ZWRGaWxlc0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NlcHRlZEZpbGVzKSA/IGFjY2VwdGVkRmlsZXMgOiBhY2NlcHRlZEZpbGVzLnNwbGl0KCcsJyk7XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8ICcnO1xuICAgIHZhciBtaW1lVHlwZSA9IGZpbGUudHlwZSB8fCAnJztcbiAgICB2YXIgYmFzZU1pbWVUeXBlID0gbWltZVR5cGUucmVwbGFjZSgvXFwvLiokLywgJycpO1xuICAgIHJldHVybiBhY2NlcHRlZEZpbGVzQXJyYXkuc29tZShmdW5jdGlvbiAodHlwZSkge1xuICAgICAgdmFyIHZhbGlkVHlwZSA9IHR5cGUudHJpbSgpO1xuXG4gICAgICBpZiAodmFsaWRUeXBlLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBlbmRzV2l0aChmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLCB2YWxpZFR5cGUudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgvXFwvXFwqJC8udGVzdCh2YWxpZFR5cGUpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgc29tZXRoaW5nIGxpa2UgYSBpbWFnZS8qIG1pbWUgdHlwZVxuICAgICAgICByZXR1cm4gYmFzZU1pbWVUeXBlID09PSB2YWxpZFR5cGUucmVwbGFjZSgvXFwvLiokLywgJycpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWltZVR5cGUgPT09IHZhbGlkVHlwZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX1VwbG9hZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVXBsb2FkXCIpKTtcblxudmFyIF9kZWZhdWx0ID0gX1VwbG9hZC5kZWZhdWx0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1cGxvYWQ7XG5cbmZ1bmN0aW9uIGdldEVycm9yKG9wdGlvbiwgeGhyKSB7XG4gIHZhciBtc2cgPSBcImNhbm5vdCBcIi5jb25jYXQob3B0aW9uLm1ldGhvZCwgXCIgXCIpLmNvbmNhdChvcHRpb24uYWN0aW9uLCBcIiBcIikuY29uY2F0KHhoci5zdGF0dXMsIFwiJ1wiKTtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIuc3RhdHVzID0geGhyLnN0YXR1cztcbiAgZXJyLm1ldGhvZCA9IG9wdGlvbi5tZXRob2Q7XG4gIGVyci51cmwgPSBvcHRpb24uYWN0aW9uO1xuICByZXR1cm4gZXJyO1xufVxuXG5mdW5jdGlvbiBnZXRCb2R5KHhocikge1xuICB2YXIgdGV4dCA9IHhoci5yZXNwb25zZVRleHQgfHwgeGhyLnJlc3BvbnNlO1xuXG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwbG9hZChvcHRpb24pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICBpZiAob3B0aW9uLm9uUHJvZ3Jlc3MgJiYgeGhyLnVwbG9hZCkge1xuICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uIHByb2dyZXNzKGUpIHtcbiAgICAgIGlmIChlLnRvdGFsID4gMCkge1xuICAgICAgICBlLnBlcmNlbnQgPSBlLmxvYWRlZCAvIGUudG90YWwgKiAxMDA7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbi5vblByb2dyZXNzKGUpO1xuICAgIH07XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5cblxuICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICBpZiAob3B0aW9uLmRhdGEpIHtcbiAgICBPYmplY3Qua2V5cyhvcHRpb24uZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBvcHRpb24uZGF0YVtrZXldOyAvLyBzdXBwb3J0IGtleS12YWx1ZSBhcnJheSBkYXRhXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgLy8geyBsaXN0OiBbIDExLCAyMiBdIH1cbiAgICAgICAgICAvLyBmb3JtRGF0YS5hcHBlbmQoJ2xpc3RbXScsIDExKTtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoXCJcIi5jb25jYXQoa2V5LCBcIltdXCIpLCBpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb3B0aW9uLmRhdGFba2V5XSk7XG4gICAgfSk7XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5cblxuICBpZiAob3B0aW9uLmZpbGUgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgZm9ybURhdGEuYXBwZW5kKG9wdGlvbi5maWxlbmFtZSwgb3B0aW9uLmZpbGUsIG9wdGlvbi5maWxlLm5hbWUpO1xuICB9IGVsc2Uge1xuICAgIGZvcm1EYXRhLmFwcGVuZChvcHRpb24uZmlsZW5hbWUsIG9wdGlvbi5maWxlKTtcbiAgfVxuXG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gZXJyb3IoZSkge1xuICAgIG9wdGlvbi5vbkVycm9yKGUpO1xuICB9O1xuXG4gIHhoci5vbmxvYWQgPSBmdW5jdGlvbiBvbmxvYWQoKSB7XG4gICAgLy8gYWxsb3cgc3VjY2VzcyB3aGVuIDJ4eCBzdGF0dXNcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC91cGxvYWQvaXNzdWVzLzM0XG4gICAgaWYgKHhoci5zdGF0dXMgPCAyMDAgfHwgeGhyLnN0YXR1cyA+PSAzMDApIHtcbiAgICAgIHJldHVybiBvcHRpb24ub25FcnJvcihnZXRFcnJvcihvcHRpb24sIHhociksIGdldEJvZHkoeGhyKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbi5vblN1Y2Nlc3MoZ2V0Qm9keSh4aHIpLCB4aHIpO1xuICB9O1xuXG4gIHhoci5vcGVuKG9wdGlvbi5tZXRob2QsIG9wdGlvbi5hY3Rpb24sIHRydWUpOyAvLyBIYXMgdG8gYmUgYWZ0ZXIgYC5vcGVuKClgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VueW8vZHJvcHpvbmUvaXNzdWVzLzE3OVxuXG4gIGlmIChvcHRpb24ud2l0aENyZWRlbnRpYWxzICYmICd3aXRoQ3JlZGVudGlhbHMnIGluIHhocikge1xuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGhlYWRlcnMgPSBvcHRpb24uaGVhZGVycyB8fCB7fTsgLy8gd2hlbiBzZXQgaGVhZGVyc1snWC1SZXF1ZXN0ZWQtV2l0aCddID0gbnVsbCAsIGNhbiBjbG9zZSBkZWZhdWx0IFhIUiBoZWFkZXJcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdXBsb2FkL2lzc3Vlcy8zM1xuXG4gIGlmIChoZWFkZXJzWydYLVJlcXVlc3RlZC1XaXRoJ10gIT09IG51bGwpIHtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xuICB9XG5cbiAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAoaCkge1xuICAgIGlmIChoZWFkZXJzW2hdICE9PSBudWxsKSB7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoLCBoZWFkZXJzW2hdKTtcbiAgICB9XG4gIH0pO1xuICB4aHIuc2VuZChmb3JtRGF0YSk7XG4gIHJldHVybiB7XG4gICAgYWJvcnQ6IGZ1bmN0aW9uIGFib3J0KCkge1xuICAgICAgeGhyLmFib3J0KCk7XG4gICAgfVxuICB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBsb29wRmlsZXMoaXRlbSwgY2FsbGJhY2spIHtcbiAgdmFyIGRpclJlYWRlciA9IGl0ZW0uY3JlYXRlUmVhZGVyKCk7XG4gIHZhciBmaWxlTGlzdCA9IFtdO1xuXG4gIGZ1bmN0aW9uIHNlcXVlbmNlKCkge1xuICAgIGRpclJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgdmFyIGVudHJ5TGlzdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShlbnRyaWVzKTtcbiAgICAgIGZpbGVMaXN0ID0gZmlsZUxpc3QuY29uY2F0KGVudHJ5TGlzdCk7IC8vIENoZWNrIGlmIGFsbCB0aGUgZmlsZSBoYXMgYmVlbiB2aWV3ZWRcblxuICAgICAgdmFyIGlzRmluaXNoZWQgPSAhZW50cnlMaXN0Lmxlbmd0aDtcblxuICAgICAgaWYgKGlzRmluaXNoZWQpIHtcbiAgICAgICAgY2FsbGJhY2soZmlsZUxpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VxdWVuY2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNlcXVlbmNlKCk7XG59XG5cbnZhciB0cmF2ZXJzZUZpbGVUcmVlID0gZnVuY3Rpb24gdHJhdmVyc2VGaWxlVHJlZShmaWxlcywgY2FsbGJhY2ssIGlzQWNjZXB0ZWQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICB2YXIgX3RyYXZlcnNlRmlsZVRyZWUgPSBmdW5jdGlvbiBfdHJhdmVyc2VGaWxlVHJlZShpdGVtLCBwYXRoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgaXRlbS5wYXRoID0gcGF0aCB8fCAnJztcblxuICAgIGlmIChpdGVtLmlzRmlsZSkge1xuICAgICAgaXRlbS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIGlmIChpc0FjY2VwdGVkKGZpbGUpKSB7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTY0MjZcbiAgICAgICAgICBpZiAoaXRlbS5mdWxsUGF0aCAmJiAhZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGgpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGZpbGUsIHtcbiAgICAgICAgICAgICAgd2Via2l0UmVsYXRpdmVQYXRoOiB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXG4gICAgICAgICAgICBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aCA9IGl0ZW0uZnVsbFBhdGgucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGZpbGUsIHtcbiAgICAgICAgICAgICAgd2Via2l0UmVsYXRpdmVQYXRoOiB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhbGxiYWNrKFtmaWxlXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXRlbS5pc0RpcmVjdG9yeSkge1xuICAgICAgbG9vcEZpbGVzKGl0ZW0sIGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnlJdGVtKSB7XG4gICAgICAgICAgX3RyYXZlcnNlRmlsZVRyZWUoZW50cnlJdGVtLCBcIlwiLmNvbmNhdChwYXRoKS5jb25jYXQoaXRlbS5uYW1lLCBcIi9cIikpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgX3RyYXZlcnNlRmlsZVRyZWUoZmlsZS53ZWJraXRHZXRBc0VudHJ5KCkpO1xuICB9KTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IHRyYXZlcnNlRmlsZVRyZWU7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVpZDtcbnZhciBub3cgPSArbmV3IERhdGUoKTtcbnZhciBpbmRleCA9IDA7XG5cbmZ1bmN0aW9uIHVpZCgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXG4gIHJldHVybiBcInJjLXVwbG9hZC1cIi5jb25jYXQobm93LCBcIi1cIikuY29uY2F0KCsraW5kZXgpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdG9BcnJheTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yZWFjdElzID0gcmVxdWlyZShcInJlYWN0LWlzXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgcmV0ID0gW107XG5cbiAgX3JlYWN0LmRlZmF1bHQuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKChjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkID09PSBudWxsKSAmJiAhb3B0aW9uLmtlZXBFbXB0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgcmV0ID0gcmV0LmNvbmNhdCh0b0FycmF5KGNoaWxkKSk7XG4gICAgfSBlbHNlIGlmICgoMCwgX3JlYWN0SXMuaXNGcmFnbWVudCkoY2hpbGQpICYmIGNoaWxkLnByb3BzKSB7XG4gICAgICByZXQgPSByZXQuY29uY2F0KHRvQXJyYXkoY2hpbGQucHJvcHMuY2hpbGRyZW4sIG9wdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucHVzaChjaGlsZCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmV0O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gYWRkRXZlbnRMaXN0ZW5lcldyYXA7XG5cbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyV3JhcCh0YXJnZXQsIGV2ZW50VHlwZSwgY2IsIG9wdGlvbikge1xuICAvKiBlc2xpbnQgY2FtZWxjYXNlOiAyICovXG4gIHZhciBjYWxsYmFjayA9IF9yZWFjdERvbS5kZWZhdWx0LnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID8gZnVuY3Rpb24gcnVuKGUpIHtcbiAgICBfcmVhY3REb20uZGVmYXVsdC51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhjYiwgZSk7XG4gIH0gOiBjYjtcblxuICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrLCBvcHRpb24pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIGlmICh0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjYW5Vc2VEb207XG5cbmZ1bmN0aW9uIGNhblVzZURvbSgpIHtcbiAgcmV0dXJuICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjb250YWlucztcblxuZnVuY3Rpb24gY29udGFpbnMocm9vdCwgbikge1xuICBpZiAoIXJvb3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gcm9vdC5jb250YWlucyhuKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0ID0gZ2V0O1xuZXhwb3J0cy5zZXQgPSBzZXQ7XG5leHBvcnRzLmdldE91dGVyV2lkdGggPSBnZXRPdXRlcldpZHRoO1xuZXhwb3J0cy5nZXRPdXRlckhlaWdodCA9IGdldE91dGVySGVpZ2h0O1xuZXhwb3J0cy5nZXREb2NTaXplID0gZ2V0RG9jU2l6ZTtcbmV4cG9ydHMuZ2V0Q2xpZW50U2l6ZSA9IGdldENsaWVudFNpemU7XG5leHBvcnRzLmdldFNjcm9sbCA9IGdldFNjcm9sbDtcbmV4cG9ydHMuZ2V0T2Zmc2V0ID0gZ2V0T2Zmc2V0O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xudmFyIFBJWEVMX1BBVFRFUk4gPSAvbWFyZ2lufHBhZGRpbmd8d2lkdGh8aGVpZ2h0fG1heHxtaW58b2Zmc2V0LztcbnZhciByZW1vdmVQaXhlbCA9IHtcbiAgbGVmdDogdHJ1ZSxcbiAgdG9wOiB0cnVlXG59O1xudmFyIGZsb2F0TWFwID0ge1xuICBjc3NGbG9hdDogMSxcbiAgc3R5bGVGbG9hdDogMSxcbiAgZmxvYXQ6IDFcbn07XG5cbmZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSA/IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpIDoge307XG59XG5cbmZ1bmN0aW9uIGdldFN0eWxlVmFsdWUobm9kZSwgdHlwZSwgdmFsdWUpIHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAodmFsdWUgPT09ICdhdXRvJykge1xuICAgIGlmICh0eXBlID09PSAnaGVpZ2h0Jykge1xuICAgICAgcmV0dXJuIG5vZGUub2Zmc2V0SGVpZ2h0O1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnd2lkdGgnKSB7XG4gICAgICByZXR1cm4gbm9kZS5vZmZzZXRXaWR0aDtcbiAgICB9XG4gIH1cblxuICBpZiAoISh0eXBlIGluIHJlbW92ZVBpeGVsKSkge1xuICAgIHJlbW92ZVBpeGVsW3R5cGVdID0gUElYRUxfUEFUVEVSTi50ZXN0KHR5cGUpO1xuICB9XG5cbiAgcmV0dXJuIHJlbW92ZVBpeGVsW3R5cGVdID8gcGFyc2VGbG9hdCh2YWx1ZSkgfHwgMCA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXQobm9kZSwgbmFtZSkge1xuICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgbmFtZSA9IGZsb2F0TWFwW25hbWVdID8gJ2Nzc0Zsb2F0JyBpbiBub2RlLnN0eWxlID8gJ2Nzc0Zsb2F0JyA6ICdzdHlsZUZsb2F0JyA6IG5hbWU7XG4gIHJldHVybiBsZW5ndGggPT09IDEgPyBzdHlsZSA6IGdldFN0eWxlVmFsdWUobm9kZSwgbmFtZSwgc3R5bGVbbmFtZV0gfHwgbm9kZS5zdHlsZVtuYW1lXSk7XG59XG5cbmZ1bmN0aW9uIHNldChub2RlLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgbmFtZSA9IGZsb2F0TWFwW25hbWVdID8gJ2Nzc0Zsb2F0JyBpbiBub2RlLnN0eWxlID8gJ2Nzc0Zsb2F0JyA6ICdzdHlsZUZsb2F0JyA6IG5hbWU7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIFBJWEVMX1BBVFRFUk4udGVzdChuYW1lKSkge1xuICAgICAgdmFsdWUgPSBcIlwiLmNvbmNhdCh2YWx1ZSwgXCJweFwiKTtcbiAgICB9XG5cbiAgICBub2RlLnN0eWxlW25hbWVdID0gdmFsdWU7IC8vIE51bWJlclxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZm9yICh2YXIgeCBpbiBuYW1lKSB7XG4gICAgaWYgKG5hbWUuaGFzT3duUHJvcGVydHkoeCkpIHtcbiAgICAgIHNldChub2RlLCB4LCBuYW1lW3hdKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0ZXJXaWR0aChlbCkge1xuICBpZiAoZWwgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIGVsLm9mZnNldFdpZHRoO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRlckhlaWdodChlbCkge1xuICBpZiAoZWwgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIH1cblxuICByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBnZXREb2NTaXplKCkge1xuICB2YXIgd2lkdGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGgpO1xuICB2YXIgaGVpZ2h0ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRTaXplKCkge1xuICB2YXIgd2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsKCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpLFxuICAgIHNjcm9sbFRvcDogTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldChub2RlKSB7XG4gIHZhciBib3ggPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsgLy8gPCBpZTgg5LiN5pSv5oyBIHdpbi5wYWdlWE9mZnNldCwg5YiZ5L2/55SoIGRvY0VsZW0uc2Nyb2xsTGVmdFxuXG4gIHJldHVybiB7XG4gICAgbGVmdDogYm94LmxlZnQgKyAod2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCkgLSAoZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGRvY3VtZW50LmJvZHkuY2xpZW50TGVmdCB8fCAwKSxcbiAgICB0b3A6IGJveC50b3AgKyAod2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsVG9wKSAtIChkb2NFbGVtLmNsaWVudFRvcCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFRvcCB8fCAwKVxuICB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZmluZERPTU5vZGU7XG5cbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIFJldHVybiBpZiBhIG5vZGUgaXMgYSBET00gbm9kZS4gRWxzZSB3aWxsIHJldHVybiBieSBgZmluZERPTU5vZGVgXG4gKi9cbmZ1bmN0aW9uIGZpbmRET01Ob2RlKG5vZGUpIHtcbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIF9yZWFjdERvbS5kZWZhdWx0LmZpbmRET01Ob2RlKG5vZGUpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2RlZmF1bHQgPSBmdW5jdGlvbiBfZGVmYXVsdChlbGVtZW50KSB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVsZW1lbnQuZ2V0QkJveCkge1xuICAgIHZhciBib3ggPSBlbGVtZW50LmdldEJCb3goKTtcblxuICAgIGlmIChib3gud2lkdGggfHwgYm94LmhlaWdodCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgdmFyIF9ib3ggPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgaWYgKF9ib3gud2lkdGggfHwgX2JveC5oZWlnaHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG4vKipcbiAqIEBpZ25vcmVcbiAqIHNvbWUga2V5LWNvZGVzIGRlZmluaXRpb24gYW5kIHV0aWxzIGZyb20gY2xvc3VyZS1saWJyYXJ5XG4gKiBAYXV0aG9yIHlpbWluZ2hlQGdtYWlsLmNvbVxuICovXG52YXIgS2V5Q29kZSA9IHtcbiAgLyoqXG4gICAqIE1BQ19FTlRFUlxuICAgKi9cbiAgTUFDX0VOVEVSOiAzLFxuXG4gIC8qKlxuICAgKiBCQUNLU1BBQ0VcbiAgICovXG4gIEJBQ0tTUEFDRTogOCxcblxuICAvKipcbiAgICogVEFCXG4gICAqL1xuICBUQUI6IDksXG5cbiAgLyoqXG4gICAqIE5VTUxPQ0sgb24gRkYvU2FmYXJpIE1hY1xuICAgKi9cbiAgTlVNX0NFTlRFUjogMTIsXG5cbiAgLyoqXG4gICAqIEVOVEVSXG4gICAqL1xuICBFTlRFUjogMTMsXG5cbiAgLyoqXG4gICAqIFNISUZUXG4gICAqL1xuICBTSElGVDogMTYsXG5cbiAgLyoqXG4gICAqIENUUkxcbiAgICovXG4gIENUUkw6IDE3LFxuXG4gIC8qKlxuICAgKiBBTFRcbiAgICovXG4gIEFMVDogMTgsXG5cbiAgLyoqXG4gICAqIFBBVVNFXG4gICAqL1xuICBQQVVTRTogMTksXG5cbiAgLyoqXG4gICAqIENBUFNfTE9DS1xuICAgKi9cbiAgQ0FQU19MT0NLOiAyMCxcblxuICAvKipcbiAgICogRVNDXG4gICAqL1xuICBFU0M6IDI3LFxuXG4gIC8qKlxuICAgKiBTUEFDRVxuICAgKi9cbiAgU1BBQ0U6IDMyLFxuXG4gIC8qKlxuICAgKiBQQUdFX1VQXG4gICAqL1xuICBQQUdFX1VQOiAzMyxcblxuICAvKipcbiAgICogUEFHRV9ET1dOXG4gICAqL1xuICBQQUdFX0RPV046IDM0LFxuXG4gIC8qKlxuICAgKiBFTkRcbiAgICovXG4gIEVORDogMzUsXG5cbiAgLyoqXG4gICAqIEhPTUVcbiAgICovXG4gIEhPTUU6IDM2LFxuXG4gIC8qKlxuICAgKiBMRUZUXG4gICAqL1xuICBMRUZUOiAzNyxcblxuICAvKipcbiAgICogVVBcbiAgICovXG4gIFVQOiAzOCxcblxuICAvKipcbiAgICogUklHSFRcbiAgICovXG4gIFJJR0hUOiAzOSxcblxuICAvKipcbiAgICogRE9XTlxuICAgKi9cbiAgRE9XTjogNDAsXG5cbiAgLyoqXG4gICAqIFBSSU5UX1NDUkVFTlxuICAgKi9cbiAgUFJJTlRfU0NSRUVOOiA0NCxcblxuICAvKipcbiAgICogSU5TRVJUXG4gICAqL1xuICBJTlNFUlQ6IDQ1LFxuXG4gIC8qKlxuICAgKiBERUxFVEVcbiAgICovXG4gIERFTEVURTogNDYsXG5cbiAgLyoqXG4gICAqIFpFUk9cbiAgICovXG4gIFpFUk86IDQ4LFxuXG4gIC8qKlxuICAgKiBPTkVcbiAgICovXG4gIE9ORTogNDksXG5cbiAgLyoqXG4gICAqIFRXT1xuICAgKi9cbiAgVFdPOiA1MCxcblxuICAvKipcbiAgICogVEhSRUVcbiAgICovXG4gIFRIUkVFOiA1MSxcblxuICAvKipcbiAgICogRk9VUlxuICAgKi9cbiAgRk9VUjogNTIsXG5cbiAgLyoqXG4gICAqIEZJVkVcbiAgICovXG4gIEZJVkU6IDUzLFxuXG4gIC8qKlxuICAgKiBTSVhcbiAgICovXG4gIFNJWDogNTQsXG5cbiAgLyoqXG4gICAqIFNFVkVOXG4gICAqL1xuICBTRVZFTjogNTUsXG5cbiAgLyoqXG4gICAqIEVJR0hUXG4gICAqL1xuICBFSUdIVDogNTYsXG5cbiAgLyoqXG4gICAqIE5JTkVcbiAgICovXG4gIE5JTkU6IDU3LFxuXG4gIC8qKlxuICAgKiBRVUVTVElPTl9NQVJLXG4gICAqL1xuICBRVUVTVElPTl9NQVJLOiA2MyxcblxuICAvKipcbiAgICogQVxuICAgKi9cbiAgQTogNjUsXG5cbiAgLyoqXG4gICAqIEJcbiAgICovXG4gIEI6IDY2LFxuXG4gIC8qKlxuICAgKiBDXG4gICAqL1xuICBDOiA2NyxcblxuICAvKipcbiAgICogRFxuICAgKi9cbiAgRDogNjgsXG5cbiAgLyoqXG4gICAqIEVcbiAgICovXG4gIEU6IDY5LFxuXG4gIC8qKlxuICAgKiBGXG4gICAqL1xuICBGOiA3MCxcblxuICAvKipcbiAgICogR1xuICAgKi9cbiAgRzogNzEsXG5cbiAgLyoqXG4gICAqIEhcbiAgICovXG4gIEg6IDcyLFxuXG4gIC8qKlxuICAgKiBJXG4gICAqL1xuICBJOiA3MyxcblxuICAvKipcbiAgICogSlxuICAgKi9cbiAgSjogNzQsXG5cbiAgLyoqXG4gICAqIEtcbiAgICovXG4gIEs6IDc1LFxuXG4gIC8qKlxuICAgKiBMXG4gICAqL1xuICBMOiA3NixcblxuICAvKipcbiAgICogTVxuICAgKi9cbiAgTTogNzcsXG5cbiAgLyoqXG4gICAqIE5cbiAgICovXG4gIE46IDc4LFxuXG4gIC8qKlxuICAgKiBPXG4gICAqL1xuICBPOiA3OSxcblxuICAvKipcbiAgICogUFxuICAgKi9cbiAgUDogODAsXG5cbiAgLyoqXG4gICAqIFFcbiAgICovXG4gIFE6IDgxLFxuXG4gIC8qKlxuICAgKiBSXG4gICAqL1xuICBSOiA4MixcblxuICAvKipcbiAgICogU1xuICAgKi9cbiAgUzogODMsXG5cbiAgLyoqXG4gICAqIFRcbiAgICovXG4gIFQ6IDg0LFxuXG4gIC8qKlxuICAgKiBVXG4gICAqL1xuICBVOiA4NSxcblxuICAvKipcbiAgICogVlxuICAgKi9cbiAgVjogODYsXG5cbiAgLyoqXG4gICAqIFdcbiAgICovXG4gIFc6IDg3LFxuXG4gIC8qKlxuICAgKiBYXG4gICAqL1xuICBYOiA4OCxcblxuICAvKipcbiAgICogWVxuICAgKi9cbiAgWTogODksXG5cbiAgLyoqXG4gICAqIFpcbiAgICovXG4gIFo6IDkwLFxuXG4gIC8qKlxuICAgKiBNRVRBXG4gICAqL1xuICBNRVRBOiA5MSxcblxuICAvKipcbiAgICogV0lOX0tFWV9SSUdIVFxuICAgKi9cbiAgV0lOX0tFWV9SSUdIVDogOTIsXG5cbiAgLyoqXG4gICAqIENPTlRFWFRfTUVOVVxuICAgKi9cbiAgQ09OVEVYVF9NRU5VOiA5MyxcblxuICAvKipcbiAgICogTlVNX1pFUk9cbiAgICovXG4gIE5VTV9aRVJPOiA5NixcblxuICAvKipcbiAgICogTlVNX09ORVxuICAgKi9cbiAgTlVNX09ORTogOTcsXG5cbiAgLyoqXG4gICAqIE5VTV9UV09cbiAgICovXG4gIE5VTV9UV086IDk4LFxuXG4gIC8qKlxuICAgKiBOVU1fVEhSRUVcbiAgICovXG4gIE5VTV9USFJFRTogOTksXG5cbiAgLyoqXG4gICAqIE5VTV9GT1VSXG4gICAqL1xuICBOVU1fRk9VUjogMTAwLFxuXG4gIC8qKlxuICAgKiBOVU1fRklWRVxuICAgKi9cbiAgTlVNX0ZJVkU6IDEwMSxcblxuICAvKipcbiAgICogTlVNX1NJWFxuICAgKi9cbiAgTlVNX1NJWDogMTAyLFxuXG4gIC8qKlxuICAgKiBOVU1fU0VWRU5cbiAgICovXG4gIE5VTV9TRVZFTjogMTAzLFxuXG4gIC8qKlxuICAgKiBOVU1fRUlHSFRcbiAgICovXG4gIE5VTV9FSUdIVDogMTA0LFxuXG4gIC8qKlxuICAgKiBOVU1fTklORVxuICAgKi9cbiAgTlVNX05JTkU6IDEwNSxcblxuICAvKipcbiAgICogTlVNX01VTFRJUExZXG4gICAqL1xuICBOVU1fTVVMVElQTFk6IDEwNixcblxuICAvKipcbiAgICogTlVNX1BMVVNcbiAgICovXG4gIE5VTV9QTFVTOiAxMDcsXG5cbiAgLyoqXG4gICAqIE5VTV9NSU5VU1xuICAgKi9cbiAgTlVNX01JTlVTOiAxMDksXG5cbiAgLyoqXG4gICAqIE5VTV9QRVJJT0RcbiAgICovXG4gIE5VTV9QRVJJT0Q6IDExMCxcblxuICAvKipcbiAgICogTlVNX0RJVklTSU9OXG4gICAqL1xuICBOVU1fRElWSVNJT046IDExMSxcblxuICAvKipcbiAgICogRjFcbiAgICovXG4gIEYxOiAxMTIsXG5cbiAgLyoqXG4gICAqIEYyXG4gICAqL1xuICBGMjogMTEzLFxuXG4gIC8qKlxuICAgKiBGM1xuICAgKi9cbiAgRjM6IDExNCxcblxuICAvKipcbiAgICogRjRcbiAgICovXG4gIEY0OiAxMTUsXG5cbiAgLyoqXG4gICAqIEY1XG4gICAqL1xuICBGNTogMTE2LFxuXG4gIC8qKlxuICAgKiBGNlxuICAgKi9cbiAgRjY6IDExNyxcblxuICAvKipcbiAgICogRjdcbiAgICovXG4gIEY3OiAxMTgsXG5cbiAgLyoqXG4gICAqIEY4XG4gICAqL1xuICBGODogMTE5LFxuXG4gIC8qKlxuICAgKiBGOVxuICAgKi9cbiAgRjk6IDEyMCxcblxuICAvKipcbiAgICogRjEwXG4gICAqL1xuICBGMTA6IDEyMSxcblxuICAvKipcbiAgICogRjExXG4gICAqL1xuICBGMTE6IDEyMixcblxuICAvKipcbiAgICogRjEyXG4gICAqL1xuICBGMTI6IDEyMyxcblxuICAvKipcbiAgICogTlVNTE9DS1xuICAgKi9cbiAgTlVNTE9DSzogMTQ0LFxuXG4gIC8qKlxuICAgKiBTRU1JQ09MT05cbiAgICovXG4gIFNFTUlDT0xPTjogMTg2LFxuXG4gIC8qKlxuICAgKiBEQVNIXG4gICAqL1xuICBEQVNIOiAxODksXG5cbiAgLyoqXG4gICAqIEVRVUFMU1xuICAgKi9cbiAgRVFVQUxTOiAxODcsXG5cbiAgLyoqXG4gICAqIENPTU1BXG4gICAqL1xuICBDT01NQTogMTg4LFxuXG4gIC8qKlxuICAgKiBQRVJJT0RcbiAgICovXG4gIFBFUklPRDogMTkwLFxuXG4gIC8qKlxuICAgKiBTTEFTSFxuICAgKi9cbiAgU0xBU0g6IDE5MSxcblxuICAvKipcbiAgICogQVBPU1RST1BIRVxuICAgKi9cbiAgQVBPU1RST1BIRTogMTkyLFxuXG4gIC8qKlxuICAgKiBTSU5HTEVfUVVPVEVcbiAgICovXG4gIFNJTkdMRV9RVU9URTogMjIyLFxuXG4gIC8qKlxuICAgKiBPUEVOX1NRVUFSRV9CUkFDS0VUXG4gICAqL1xuICBPUEVOX1NRVUFSRV9CUkFDS0VUOiAyMTksXG5cbiAgLyoqXG4gICAqIEJBQ0tTTEFTSFxuICAgKi9cbiAgQkFDS1NMQVNIOiAyMjAsXG5cbiAgLyoqXG4gICAqIENMT1NFX1NRVUFSRV9CUkFDS0VUXG4gICAqL1xuICBDTE9TRV9TUVVBUkVfQlJBQ0tFVDogMjIxLFxuXG4gIC8qKlxuICAgKiBXSU5fS0VZXG4gICAqL1xuICBXSU5fS0VZOiAyMjQsXG5cbiAgLyoqXG4gICAqIE1BQ19GRl9NRVRBXG4gICAqL1xuICBNQUNfRkZfTUVUQTogMjI0LFxuXG4gIC8qKlxuICAgKiBXSU5fSU1FXG4gICAqL1xuICBXSU5fSU1FOiAyMjksXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBGdW5jdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogd2hldGhlciB0ZXh0IGFuZCBtb2RpZmllZCBrZXkgaXMgZW50ZXJlZCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgKi9cbiAgaXNUZXh0TW9kaWZ5aW5nS2V5RXZlbnQ6IGZ1bmN0aW9uIGlzVGV4dE1vZGlmeWluZ0tleUV2ZW50KGUpIHtcbiAgICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZTtcblxuICAgIGlmIChlLmFsdEtleSAmJiAhZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fCAvLyBGdW5jdGlvbiBrZXlzIGRvbid0IGdlbmVyYXRlIHRleHRcbiAgICBrZXlDb2RlID49IEtleUNvZGUuRjEgJiYga2V5Q29kZSA8PSBLZXlDb2RlLkYxMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gVGhlIGZvbGxvd2luZyBrZXlzIGFyZSBxdWl0ZSBoYXJtbGVzcywgZXZlbiBpbiBjb21iaW5hdGlvbiB3aXRoXG4gICAgLy8gQ1RSTCwgQUxUIG9yIFNISUZULlxuXG5cbiAgICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICAgIGNhc2UgS2V5Q29kZS5BTFQ6XG4gICAgICBjYXNlIEtleUNvZGUuQ0FQU19MT0NLOlxuICAgICAgY2FzZSBLZXlDb2RlLkNPTlRFWFRfTUVOVTpcbiAgICAgIGNhc2UgS2V5Q29kZS5DVFJMOlxuICAgICAgY2FzZSBLZXlDb2RlLkRPV046XG4gICAgICBjYXNlIEtleUNvZGUuRU5EOlxuICAgICAgY2FzZSBLZXlDb2RlLkVTQzpcbiAgICAgIGNhc2UgS2V5Q29kZS5IT01FOlxuICAgICAgY2FzZSBLZXlDb2RlLklOU0VSVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5MRUZUOlxuICAgICAgY2FzZSBLZXlDb2RlLk1BQ19GRl9NRVRBOlxuICAgICAgY2FzZSBLZXlDb2RlLk1FVEE6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNTE9DSzpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fQ0VOVEVSOlxuICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfRE9XTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5QQUdFX1VQOlxuICAgICAgY2FzZSBLZXlDb2RlLlBBVVNFOlxuICAgICAgY2FzZSBLZXlDb2RlLlBSSU5UX1NDUkVFTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5SSUdIVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5TSElGVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgIGNhc2UgS2V5Q29kZS5XSU5fS0VZOlxuICAgICAgY2FzZSBLZXlDb2RlLldJTl9LRVlfUklHSFQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiB3aGV0aGVyIGNoYXJhY3RlciBpcyBlbnRlcmVkLlxuICAgKi9cbiAgaXNDaGFyYWN0ZXJLZXk6IGZ1bmN0aW9uIGlzQ2hhcmFjdGVyS2V5KGtleUNvZGUpIHtcbiAgICBpZiAoa2V5Q29kZSA+PSBLZXlDb2RlLlpFUk8gJiYga2V5Q29kZSA8PSBLZXlDb2RlLk5JTkUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChrZXlDb2RlID49IEtleUNvZGUuTlVNX1pFUk8gJiYga2V5Q29kZSA8PSBLZXlDb2RlLk5VTV9NVUxUSVBMWSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPj0gS2V5Q29kZS5BICYmIGtleUNvZGUgPD0gS2V5Q29kZS5aKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFNhZmFyaSBzZW5kcyB6ZXJvIGtleSBjb2RlIGZvciBub24tbGF0aW4gY2hhcmFjdGVycy5cblxuXG4gICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1dlYktpdCcpICE9PSAtMSAmJiBrZXlDb2RlID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICAgIGNhc2UgS2V5Q29kZS5TUEFDRTpcbiAgICAgIGNhc2UgS2V5Q29kZS5RVUVTVElPTl9NQVJLOlxuICAgICAgY2FzZSBLZXlDb2RlLk5VTV9QTFVTOlxuICAgICAgY2FzZSBLZXlDb2RlLk5VTV9NSU5VUzpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fUEVSSU9EOlxuICAgICAgY2FzZSBLZXlDb2RlLk5VTV9ESVZJU0lPTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5TRU1JQ09MT046XG4gICAgICBjYXNlIEtleUNvZGUuREFTSDpcbiAgICAgIGNhc2UgS2V5Q29kZS5FUVVBTFM6XG4gICAgICBjYXNlIEtleUNvZGUuQ09NTUE6XG4gICAgICBjYXNlIEtleUNvZGUuUEVSSU9EOlxuICAgICAgY2FzZSBLZXlDb2RlLlNMQVNIOlxuICAgICAgY2FzZSBLZXlDb2RlLkFQT1NUUk9QSEU6XG4gICAgICBjYXNlIEtleUNvZGUuU0lOR0xFX1FVT1RFOlxuICAgICAgY2FzZSBLZXlDb2RlLk9QRU5fU1FVQVJFX0JSQUNLRVQ6XG4gICAgICBjYXNlIEtleUNvZGUuQkFDS1NMQVNIOlxuICAgICAgY2FzZSBLZXlDb2RlLkNMT1NFX1NRVUFSRV9CUkFDS0VUOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufTtcbnZhciBfZGVmYXVsdCA9IEtleUNvZGU7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxudmFyIF9yZWFjdERvbSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0LWRvbVwiKSk7XG5cbnZhciBfY2FuVXNlRG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Eb20vY2FuVXNlRG9tXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIFBvcnRhbCA9ICgwLCBfcmVhY3QuZm9yd2FyZFJlZikoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIGRpZFVwZGF0ZSA9IHByb3BzLmRpZFVwZGF0ZSxcbiAgICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcixcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gIHZhciBjb250YWluZXJSZWYgPSAoMCwgX3JlYWN0LnVzZVJlZikoKTsgLy8gUmVmIHJldHVybiBub3RoaW5nLCBvbmx5IGZvciB3cmFwcGVyIGNoZWNrIGV4aXN0XG5cbiAgKDAsIF9yZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pOyAvLyBDcmVhdGUgY29udGFpbmVyIGluIGNsaWVudCBzaWRlIHdpdGggc3luYyB0byBhdm9pZCB1c2VFZmZlY3Qgbm90IGdldCByZWZcblxuICB2YXIgaW5pdFJlZiA9ICgwLCBfcmVhY3QudXNlUmVmKShmYWxzZSk7XG5cbiAgaWYgKCFpbml0UmVmLmN1cnJlbnQgJiYgKDAsIF9jYW5Vc2VEb20uZGVmYXVsdCkoKSkge1xuICAgIGNvbnRhaW5lclJlZi5jdXJyZW50ID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgaW5pdFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfSAvLyBbTGVnYWN5XSBVc2VkIGJ5IGByYy10cmlnZ2VyYFxuXG5cbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICBkaWRVcGRhdGUgPT09IG51bGwgfHwgZGlkVXBkYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaWRVcGRhdGUocHJvcHMpO1xuICB9KTtcbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9jb250YWluZXJSZWYkY3VycmVudCwgX2NvbnRhaW5lclJlZiRjdXJyZW50MjtcblxuICAgICAgLy8gW0xlZ2FjeV0gVGhpcyBzaG91bGQgbm90IGJlIGhhbmRsZSBieSBQb3J0YWwgYnV0IHBhcmVudCBQb3J0YWxXcmFwcGVyIGluc3RlYWQuXG4gICAgICAvLyBTaW5jZSBzb21lIGNvbXBvbmVudCB1c2UgYFBvcnRhbGAgZGlyZWN0bHksIHdlIGhhdmUgdG8ga2VlcCB0aGUgbG9naWMgaGVyZS5cbiAgICAgIChfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2NvbnRhaW5lclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2NvbnRhaW5lclJlZiRjdXJyZW50MiA9IF9jb250YWluZXJSZWYkY3VycmVudC5wYXJlbnROb2RlKSA9PT0gbnVsbCB8fCBfY29udGFpbmVyUmVmJGN1cnJlbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29udGFpbmVyUmVmJGN1cnJlbnQyLnJlbW92ZUNoaWxkKGNvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBjb250YWluZXJSZWYuY3VycmVudCA/IF9yZWFjdERvbS5kZWZhdWx0LmNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVyUmVmLmN1cnJlbnQpIDogbnVsbDtcbn0pO1xudmFyIF9kZWZhdWx0ID0gUG9ydGFsO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldE9wZW5Db3VudCA9IGdldE9wZW5Db3VudDtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JhZlwiKSk7XG5cbnZhciBfUG9ydGFsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Qb3J0YWxcIikpO1xuXG52YXIgX3N3aXRjaFNjcm9sbGluZ0VmZmVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3dpdGNoU2Nyb2xsaW5nRWZmZWN0XCIpKTtcblxudmFyIF9zZXRTdHlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc2V0U3R5bGVcIikpO1xuXG52YXIgX2NhblVzZURvbSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRG9tL2NhblVzZURvbVwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxudmFyIG9wZW5Db3VudCA9IDA7XG52YXIgc3VwcG9ydERvbSA9ICgwLCBfY2FuVXNlRG9tLmRlZmF1bHQpKCk7XG4vKiogQHByaXZhdGUgVGVzdCB1c2FnZSBvbmx5ICovXG5cbmZ1bmN0aW9uIGdldE9wZW5Db3VudCgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcgPyBvcGVuQ291bnQgOiAwO1xufSAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xOTM0MFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTkzMzJcblxuXG52YXIgY2FjaGVPdmVyZmxvdyA9IHt9O1xuXG52YXIgZ2V0UGFyZW50ID0gZnVuY3Rpb24gZ2V0UGFyZW50KGdldENvbnRhaW5lcikge1xuICBpZiAoIXN1cHBvcnREb20pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChnZXRDb250YWluZXIpIHtcbiAgICBpZiAodHlwZW9mIGdldENvbnRhaW5lciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGdldENvbnRhaW5lcilbMF07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBnZXRDb250YWluZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBnZXRDb250YWluZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoX3R5cGVvZihnZXRDb250YWluZXIpID09PSAnb2JqZWN0JyAmJiBnZXRDb250YWluZXIgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBnZXRDb250YWluZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG59O1xuXG52YXIgUG9ydGFsV3JhcHBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUG9ydGFsV3JhcHBlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQb3J0YWxXcmFwcGVyKTtcblxuICBmdW5jdGlvbiBQb3J0YWxXcmFwcGVyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBvcnRhbFdyYXBwZXIpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgX3RoaXMuY29tcG9uZW50UmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG5cbiAgICBfdGhpcy5hdHRhY2hUb1BhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBmb3JjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG5cbiAgICAgIGlmIChmb3JjZSB8fCBfdGhpcy5jb250YWluZXIgJiYgIV90aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBnZXRQYXJlbnQoX3RoaXMucHJvcHMuZ2V0Q29udGFpbmVyKTtcblxuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKF90aGlzLmNvbnRhaW5lcik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXN1cHBvcnREb20pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICghX3RoaXMuY29udGFpbmVyKSB7XG4gICAgICAgIF90aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIF90aGlzLmF0dGFjaFRvUGFyZW50KHRydWUpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zZXRXcmFwcGVyQ2xhc3NOYW1lKCk7XG5cbiAgICAgIHJldHVybiBfdGhpcy5jb250YWluZXI7XG4gICAgfTtcblxuICAgIF90aGlzLnNldFdyYXBwZXJDbGFzc05hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgd3JhcHBlckNsYXNzTmFtZSA9IF90aGlzLnByb3BzLndyYXBwZXJDbGFzc05hbWU7XG5cbiAgICAgIGlmIChfdGhpcy5jb250YWluZXIgJiYgd3JhcHBlckNsYXNzTmFtZSAmJiB3cmFwcGVyQ2xhc3NOYW1lICE9PSBfdGhpcy5jb250YWluZXIuY2xhc3NOYW1lKSB7XG4gICAgICAgIF90aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB3cmFwcGVyQ2xhc3NOYW1lO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5yZW1vdmVDdXJyZW50Q29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJGNvbnRhaW5lciwgX3RoaXMkY29udGFpbmVyJHBhcmVuO1xuXG4gICAgICAvLyBQb3J0YWwgd2lsbCByZW1vdmUgZnJvbSBgcGFyZW50Tm9kZWAuXG4gICAgICAvLyBMZXQncyBoYW5kbGUgdGhpcyBhZ2FpbiB0byBhdm9pZCByZWZhY3RvciBpc3N1ZS5cbiAgICAgIChfdGhpcyRjb250YWluZXIgPSBfdGhpcy5jb250YWluZXIpID09PSBudWxsIHx8IF90aGlzJGNvbnRhaW5lciA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF90aGlzJGNvbnRhaW5lciRwYXJlbiA9IF90aGlzJGNvbnRhaW5lci5wYXJlbnROb2RlKSA9PT0gbnVsbCB8fCBfdGhpcyRjb250YWluZXIkcGFyZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGNvbnRhaW5lciRwYXJlbi5yZW1vdmVDaGlsZChfdGhpcy5jb250YWluZXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW5oYW5jZSAuL3N3aXRjaFNjcm9sbGluZ0VmZmVjdFxuICAgICAqIDEuIFNpbXVsYXRlIGRvY3VtZW50IGJvZHkgc2Nyb2xsIGJhciB3aXRoXG4gICAgICogMi4gUmVjb3JkIGJvZHkgaGFzIG92ZXJmbG93IHN0eWxlIGFuZCByZWNvdmVyIHdoZW4gYWxsIG9mIFBvcnRhbFdyYXBwZXIgaW52aXNpYmxlXG4gICAgICogMy4gRGlzYWJsZSBib2R5IHNjcm9sbCB3aGVuIFBvcnRhbFdyYXBwZXIgaGFzIG9wZW5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQb3J0YWxXcmFwcGVyXG4gICAgICovXG5cblxuICAgIF90aGlzLnN3aXRjaFNjcm9sbGluZ0VmZmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvcGVuQ291bnQgPT09IDEgJiYgIU9iamVjdC5rZXlzKGNhY2hlT3ZlcmZsb3cpLmxlbmd0aCkge1xuICAgICAgICAoMCwgX3N3aXRjaFNjcm9sbGluZ0VmZmVjdC5kZWZhdWx0KSgpOyAvLyBNdXN0IGJlIHNldCBhZnRlciBzd2l0Y2hTY3JvbGxpbmdFZmZlY3RcblxuICAgICAgICBjYWNoZU92ZXJmbG93ID0gKDAsIF9zZXRTdHlsZS5kZWZhdWx0KSh7XG4gICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgICAgICAgb3ZlcmZsb3dZOiAnaGlkZGVuJ1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoIW9wZW5Db3VudCkge1xuICAgICAgICAoMCwgX3NldFN0eWxlLmRlZmF1bHQpKGNhY2hlT3ZlcmZsb3cpO1xuICAgICAgICBjYWNoZU92ZXJmbG93ID0ge307XG4gICAgICAgICgwLCBfc3dpdGNoU2Nyb2xsaW5nRWZmZWN0LmRlZmF1bHQpKHRydWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcjtcblxuICAgIGlmIChzdXBwb3J0RG9tICYmIGdldFBhcmVudChnZXRDb250YWluZXIpID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICBvcGVuQ291bnQgPSB2aXNpYmxlID8gb3BlbkNvdW50ICsgMSA6IG9wZW5Db3VudDtcbiAgICB9XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIF9zZWxmOiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBvcnRhbFdyYXBwZXIsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5hdHRhY2hUb1BhcmVudCgpKSB7XG4gICAgICAgIHRoaXMucmFmSWQgPSAoMCwgX3JhZi5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy5zZXRXcmFwcGVyQ2xhc3NOYW1lKCk7XG4gICAgICB0aGlzLmF0dGFjaFRvUGFyZW50KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB2aXNpYmxlID0gX3RoaXMkcHJvcHMudmlzaWJsZSxcbiAgICAgICAgICBnZXRDb250YWluZXIgPSBfdGhpcyRwcm9wcy5nZXRDb250YWluZXI7XG5cbiAgICAgIGlmIChzdXBwb3J0RG9tICYmIGdldFBhcmVudChnZXRDb250YWluZXIpID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIC8vIOemu+W8gOaXtuS4jeS8miByZW5kZXLvvIwg5a+85Yiw56a75byA5pe25pWw5YC85LiN5Y+Y77yM5pS555SoIGZ1bmMg44CC44CCXG4gICAgICAgIG9wZW5Db3VudCA9IHZpc2libGUgJiYgb3BlbkNvdW50ID8gb3BlbkNvdW50IC0gMSA6IG9wZW5Db3VudDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZW1vdmVDdXJyZW50Q29udGFpbmVyKCk7XG5cbiAgICAgIF9yYWYuZGVmYXVsdC5jYW5jZWwodGhpcy5yYWZJZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbixcbiAgICAgICAgICBmb3JjZVJlbmRlciA9IF90aGlzJHByb3BzMi5mb3JjZVJlbmRlcixcbiAgICAgICAgICB2aXNpYmxlID0gX3RoaXMkcHJvcHMyLnZpc2libGU7XG4gICAgICB2YXIgcG9ydGFsID0gbnVsbDtcbiAgICAgIHZhciBjaGlsZFByb3BzID0ge1xuICAgICAgICBnZXRPcGVuQ291bnQ6IGZ1bmN0aW9uIGdldE9wZW5Db3VudCgpIHtcbiAgICAgICAgICByZXR1cm4gb3BlbkNvdW50O1xuICAgICAgICB9LFxuICAgICAgICBnZXRDb250YWluZXI6IHRoaXMuZ2V0Q29udGFpbmVyLFxuICAgICAgICBzd2l0Y2hTY3JvbGxpbmdFZmZlY3Q6IHRoaXMuc3dpdGNoU2Nyb2xsaW5nRWZmZWN0XG4gICAgICB9O1xuXG4gICAgICBpZiAoZm9yY2VSZW5kZXIgfHwgdmlzaWJsZSB8fCB0aGlzLmNvbXBvbmVudFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHBvcnRhbCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoX1BvcnRhbC5kZWZhdWx0LCB7XG4gICAgICAgICAgZ2V0Q29udGFpbmVyOiB0aGlzLmdldENvbnRhaW5lcixcbiAgICAgICAgICByZWY6IHRoaXMuY29tcG9uZW50UmVmXG4gICAgICAgIH0sIGNoaWxkcmVuKGNoaWxkUHJvcHMpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBvcnRhbDtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgICB2YXIgcHJldlByb3BzID0gX3JlZi5wcmV2UHJvcHMsXG4gICAgICAgICAgX3NlbGYgPSBfcmVmLl9zZWxmO1xuICAgICAgdmFyIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcjtcblxuICAgICAgaWYgKHByZXZQcm9wcykge1xuICAgICAgICB2YXIgcHJldlZpc2libGUgPSBwcmV2UHJvcHMudmlzaWJsZSxcbiAgICAgICAgICAgIHByZXZHZXRDb250YWluZXIgPSBwcmV2UHJvcHMuZ2V0Q29udGFpbmVyO1xuXG4gICAgICAgIGlmICh2aXNpYmxlICE9PSBwcmV2VmlzaWJsZSAmJiBzdXBwb3J0RG9tICYmIGdldFBhcmVudChnZXRDb250YWluZXIpID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgb3BlbkNvdW50ID0gdmlzaWJsZSAmJiAhcHJldlZpc2libGUgPyBvcGVuQ291bnQgKyAxIDogb3BlbkNvdW50IC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBnZXRDb250YWluZXJJc0Z1bmMgPSB0eXBlb2YgZ2V0Q29udGFpbmVyID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwcmV2R2V0Q29udGFpbmVyID09PSAnZnVuY3Rpb24nO1xuXG4gICAgICAgIGlmIChnZXRDb250YWluZXJJc0Z1bmMgPyBnZXRDb250YWluZXIudG9TdHJpbmcoKSAhPT0gcHJldkdldENvbnRhaW5lci50b1N0cmluZygpIDogZ2V0Q29udGFpbmVyICE9PSBwcmV2R2V0Q29udGFpbmVyKSB7XG4gICAgICAgICAgX3NlbGYucmVtb3ZlQ3VycmVudENvbnRhaW5lcigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXZQcm9wczogcHJvcHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBvcnRhbFdyYXBwZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBfZGVmYXVsdCA9IFBvcnRhbFdyYXBwZXI7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZUNoYWluZWRGdW5jdGlvbjtcblxuLyoqXG4gKiBTYWZlIGNoYWluZWQgZnVuY3Rpb25cbiAqXG4gKiBXaWxsIG9ubHkgY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIGlmIG5lZWRlZCxcbiAqIG90aGVyd2lzZSB3aWxsIHBhc3MgYmFjayBleGlzdGluZyBmdW5jdGlvbnMgb3IgbnVsbC5cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb258bnVsbH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKCkge1xuICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYXJnc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBjaGFpbmVkRnVuY3Rpb24oKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJnc1tpXSAmJiBhcmdzW2ldLmFwcGx5KSB7XG4gICAgICAgIGFyZ3NbaV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBnZXRTY3JvbGxCYXJTaXplO1xudmFyIGNhY2hlZDtcblxuZnVuY3Rpb24gZ2V0U2Nyb2xsQmFyU2l6ZShmcmVzaCkge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKGZyZXNoIHx8IGNhY2hlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaW5uZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgaW5uZXIuc3R5bGUuaGVpZ2h0ID0gJzIwMHB4JztcbiAgICB2YXIgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB2YXIgb3V0ZXJTdHlsZSA9IG91dGVyLnN0eWxlO1xuICAgIG91dGVyU3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIG91dGVyU3R5bGUudG9wID0gMDtcbiAgICBvdXRlclN0eWxlLmxlZnQgPSAwO1xuICAgIG91dGVyU3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICBvdXRlclN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICBvdXRlclN0eWxlLndpZHRoID0gJzIwMHB4JztcbiAgICBvdXRlclN0eWxlLmhlaWdodCA9ICcxNTBweCc7XG4gICAgb3V0ZXJTdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIG91dGVyLmFwcGVuZENoaWxkKGlubmVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTtcbiAgICB2YXIgd2lkdGhDb250YWluZWQgPSBpbm5lci5vZmZzZXRXaWR0aDtcbiAgICBvdXRlci5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xuICAgIHZhciB3aWR0aFNjcm9sbCA9IGlubmVyLm9mZnNldFdpZHRoO1xuXG4gICAgaWYgKHdpZHRoQ29udGFpbmVkID09PSB3aWR0aFNjcm9sbCkge1xuICAgICAgd2lkdGhTY3JvbGwgPSBvdXRlci5jbGllbnRXaWR0aDtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG91dGVyKTtcbiAgICBjYWNoZWQgPSB3aWR0aENvbnRhaW5lZCAtIHdpZHRoU2Nyb2xsO1xuICB9XG5cbiAgcmV0dXJuIGNhY2hlZDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlTWVtbztcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gdXNlTWVtbyhnZXRWYWx1ZSwgY29uZGl0aW9uLCBzaG91bGRVcGRhdGUpIHtcbiAgdmFyIGNhY2hlUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcblxuICBpZiAoISgndmFsdWUnIGluIGNhY2hlUmVmLmN1cnJlbnQpIHx8IHNob3VsZFVwZGF0ZShjYWNoZVJlZi5jdXJyZW50LmNvbmRpdGlvbiwgY29uZGl0aW9uKSkge1xuICAgIGNhY2hlUmVmLmN1cnJlbnQudmFsdWUgPSBnZXRWYWx1ZSgpO1xuICAgIGNhY2hlUmVmLmN1cnJlbnQuY29uZGl0aW9uID0gY29uZGl0aW9uO1xuICB9XG5cbiAgcmV0dXJuIGNhY2hlUmVmLmN1cnJlbnQudmFsdWU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZUNvbnRyb2xsZWRTdGF0ZTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gdXNlQ29udHJvbGxlZFN0YXRlKGRlZmF1bHRTdGF0ZVZhbHVlLCBvcHRpb24pIHtcbiAgdmFyIF9yZWYgPSBvcHRpb24gfHwge30sXG4gICAgICBkZWZhdWx0VmFsdWUgPSBfcmVmLmRlZmF1bHRWYWx1ZSxcbiAgICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIG9uQ2hhbmdlID0gX3JlZi5vbkNoYW5nZSxcbiAgICAgIHBvc3RTdGF0ZSA9IF9yZWYucG9zdFN0YXRlO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0U3RhdGVWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRTdGF0ZVZhbHVlKCkgOiBkZWZhdWx0U3RhdGVWYWx1ZTtcbiAgfSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGlubmVyVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0SW5uZXJWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIG1lcmdlZFZhbHVlID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogaW5uZXJWYWx1ZTtcblxuICBpZiAocG9zdFN0YXRlKSB7XG4gICAgbWVyZ2VkVmFsdWUgPSBwb3N0U3RhdGUobWVyZ2VkVmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJpZ2dlckNoYW5nZShuZXdWYWx1ZSkge1xuICAgIHNldElubmVyVmFsdWUobmV3VmFsdWUpO1xuXG4gICAgaWYgKG1lcmdlZFZhbHVlICE9PSBuZXdWYWx1ZSAmJiBvbkNoYW5nZSkge1xuICAgICAgb25DaGFuZ2UobmV3VmFsdWUsIG1lcmdlZFZhbHVlKTtcbiAgICB9XG4gIH0gLy8gRWZmZWN0IG9mIHJlc2V0IHZhbHVlIHRvIGB1bmRlZmluZWRgXG5cblxuICB2YXIgZmlyc3RSZW5kZXJSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpcnN0UmVuZGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIGZpcnN0UmVuZGVyUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0SW5uZXJWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgcmV0dXJuIFttZXJnZWRWYWx1ZSwgdHJpZ2dlckNoYW5nZV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBwaWNrQXR0cnM7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgYXR0cmlidXRlcyA9IFwiYWNjZXB0IGFjY2VwdENoYXJzZXQgYWNjZXNzS2V5IGFjdGlvbiBhbGxvd0Z1bGxTY3JlZW4gYWxsb3dUcmFuc3BhcmVuY3lcXG4gICAgYWx0IGFzeW5jIGF1dG9Db21wbGV0ZSBhdXRvRm9jdXMgYXV0b1BsYXkgY2FwdHVyZSBjZWxsUGFkZGluZyBjZWxsU3BhY2luZyBjaGFsbGVuZ2VcXG4gICAgY2hhclNldCBjaGVja2VkIGNsYXNzSUQgY2xhc3NOYW1lIGNvbFNwYW4gY29scyBjb250ZW50IGNvbnRlbnRFZGl0YWJsZSBjb250ZXh0TWVudVxcbiAgICBjb250cm9scyBjb29yZHMgY3Jvc3NPcmlnaW4gZGF0YSBkYXRlVGltZSBkZWZhdWx0IGRlZmVyIGRpciBkaXNhYmxlZCBkb3dubG9hZCBkcmFnZ2FibGVcXG4gICAgZW5jVHlwZSBmb3JtIGZvcm1BY3Rpb24gZm9ybUVuY1R5cGUgZm9ybU1ldGhvZCBmb3JtTm9WYWxpZGF0ZSBmb3JtVGFyZ2V0IGZyYW1lQm9yZGVyXFxuICAgIGhlYWRlcnMgaGVpZ2h0IGhpZGRlbiBoaWdoIGhyZWYgaHJlZkxhbmcgaHRtbEZvciBodHRwRXF1aXYgaWNvbiBpZCBpbnB1dE1vZGUgaW50ZWdyaXR5XFxuICAgIGlzIGtleVBhcmFtcyBrZXlUeXBlIGtpbmQgbGFiZWwgbGFuZyBsaXN0IGxvb3AgbG93IG1hbmlmZXN0IG1hcmdpbkhlaWdodCBtYXJnaW5XaWR0aCBtYXggbWF4TGVuZ3RoIG1lZGlhXFxuICAgIG1lZGlhR3JvdXAgbWV0aG9kIG1pbiBtaW5MZW5ndGggbXVsdGlwbGUgbXV0ZWQgbmFtZSBub1ZhbGlkYXRlIG5vbmNlIG9wZW5cXG4gICAgb3B0aW11bSBwYXR0ZXJuIHBsYWNlaG9sZGVyIHBvc3RlciBwcmVsb2FkIHJhZGlvR3JvdXAgcmVhZE9ubHkgcmVsIHJlcXVpcmVkXFxuICAgIHJldmVyc2VkIHJvbGUgcm93U3BhbiByb3dzIHNhbmRib3ggc2NvcGUgc2NvcGVkIHNjcm9sbGluZyBzZWFtbGVzcyBzZWxlY3RlZFxcbiAgICBzaGFwZSBzaXplIHNpemVzIHNwYW4gc3BlbGxDaGVjayBzcmMgc3JjRG9jIHNyY0xhbmcgc3JjU2V0IHN0YXJ0IHN0ZXAgc3R5bGVcXG4gICAgc3VtbWFyeSB0YWJJbmRleCB0YXJnZXQgdGl0bGUgdHlwZSB1c2VNYXAgdmFsdWUgd2lkdGggd21vZGUgd3JhcFwiO1xudmFyIGV2ZW50c05hbWUgPSBcIm9uQ29weSBvbkN1dCBvblBhc3RlIG9uQ29tcG9zaXRpb25FbmQgb25Db21wb3NpdGlvblN0YXJ0IG9uQ29tcG9zaXRpb25VcGRhdGUgb25LZXlEb3duXFxuICAgIG9uS2V5UHJlc3Mgb25LZXlVcCBvbkZvY3VzIG9uQmx1ciBvbkNoYW5nZSBvbklucHV0IG9uU3VibWl0IG9uQ2xpY2sgb25Db250ZXh0TWVudSBvbkRvdWJsZUNsaWNrXFxuICAgIG9uRHJhZyBvbkRyYWdFbmQgb25EcmFnRW50ZXIgb25EcmFnRXhpdCBvbkRyYWdMZWF2ZSBvbkRyYWdPdmVyIG9uRHJhZ1N0YXJ0IG9uRHJvcCBvbk1vdXNlRG93blxcbiAgICBvbk1vdXNlRW50ZXIgb25Nb3VzZUxlYXZlIG9uTW91c2VNb3ZlIG9uTW91c2VPdXQgb25Nb3VzZU92ZXIgb25Nb3VzZVVwIG9uU2VsZWN0IG9uVG91Y2hDYW5jZWxcXG4gICAgb25Ub3VjaEVuZCBvblRvdWNoTW92ZSBvblRvdWNoU3RhcnQgb25TY3JvbGwgb25XaGVlbCBvbkFib3J0IG9uQ2FuUGxheSBvbkNhblBsYXlUaHJvdWdoXFxuICAgIG9uRHVyYXRpb25DaGFuZ2Ugb25FbXB0aWVkIG9uRW5jcnlwdGVkIG9uRW5kZWQgb25FcnJvciBvbkxvYWRlZERhdGEgb25Mb2FkZWRNZXRhZGF0YVxcbiAgICBvbkxvYWRTdGFydCBvblBhdXNlIG9uUGxheSBvblBsYXlpbmcgb25Qcm9ncmVzcyBvblJhdGVDaGFuZ2Ugb25TZWVrZWQgb25TZWVraW5nIG9uU3RhbGxlZCBvblN1c3BlbmQgb25UaW1lVXBkYXRlIG9uVm9sdW1lQ2hhbmdlIG9uV2FpdGluZyBvbkxvYWQgb25FcnJvclwiO1xudmFyIHByb3BMaXN0ID0gXCJcIi5jb25jYXQoYXR0cmlidXRlcywgXCIgXCIpLmNvbmNhdChldmVudHNOYW1lKS5zcGxpdCgvW1xcc1xcbl0rLyk7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIGFyaWFQcmVmaXggPSAnYXJpYS0nO1xudmFyIGRhdGFQcmVmaXggPSAnZGF0YS0nO1xuXG5mdW5jdGlvbiBtYXRjaChrZXksIHByZWZpeCkge1xuICByZXR1cm4ga2V5LmluZGV4T2YocHJlZml4KSA9PT0gMDtcbn1cbi8qKlxuICogUGlja2VyIHByb3BzIGZyb20gZXhpc3QgcHJvcHMgd2l0aCBmaWx0ZXJcbiAqIEBwYXJhbSBwcm9wcyBQYXNzZWQgcHJvcHNcbiAqIEBwYXJhbSBhcmlhT25seSBib29sZWFuIHwgeyBhcmlhPzogYm9vbGVhbjsgZGF0YT86IGJvb2xlYW47IGF0dHI/OiBib29sZWFuOyB9IGZpbHRlciBjb25maWdcbiAqL1xuXG5cbmZ1bmN0aW9uIHBpY2tBdHRycyhwcm9wcykge1xuICB2YXIgYXJpYU9ubHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICB2YXIgbWVyZ2VkQ29uZmlnO1xuXG4gIGlmIChhcmlhT25seSA9PT0gZmFsc2UpIHtcbiAgICBtZXJnZWRDb25maWcgPSB7XG4gICAgICBhcmlhOiB0cnVlLFxuICAgICAgZGF0YTogdHJ1ZSxcbiAgICAgIGF0dHI6IHRydWVcbiAgICB9O1xuICB9IGVsc2UgaWYgKGFyaWFPbmx5ID09PSB0cnVlKSB7XG4gICAgbWVyZ2VkQ29uZmlnID0ge1xuICAgICAgYXJpYTogdHJ1ZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkQ29uZmlnID0gX29iamVjdFNwcmVhZCh7fSwgYXJpYU9ubHkpO1xuICB9XG5cbiAgdmFyIGF0dHJzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIC8vIEFyaWFcbiAgICBtZXJnZWRDb25maWcuYXJpYSAmJiAoa2V5ID09PSAncm9sZScgfHwgbWF0Y2goa2V5LCBhcmlhUHJlZml4KSkgfHwgLy8gRGF0YVxuICAgIG1lcmdlZENvbmZpZy5kYXRhICYmIG1hdGNoKGtleSwgZGF0YVByZWZpeCkgfHwgLy8gQXR0clxuICAgIG1lcmdlZENvbmZpZy5hdHRyICYmIHByb3BMaXN0LmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGF0dHJzW2tleV0gPSBwcm9wc1trZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhdHRycztcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHdyYXBwZXJSYWY7XG5cbnZhciByYWYgPSBmdW5jdGlvbiByYWYoY2FsbGJhY2spIHtcbiAgcmV0dXJuICtzZXRUaW1lb3V0KGNhbGxiYWNrLCAxNik7XG59O1xuXG52YXIgY2FmID0gZnVuY3Rpb24gY2FmKG51bSkge1xuICByZXR1cm4gY2xlYXJUaW1lb3V0KG51bSk7XG59O1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ3JlcXVlc3RBbmltYXRpb25GcmFtZScgaW4gd2luZG93KSB7XG4gIHJhZiA9IGZ1bmN0aW9uIHJhZihjYWxsYmFjaykge1xuICAgIHJldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTtcbiAgfTtcblxuICBjYWYgPSBmdW5jdGlvbiBjYWYoaGFuZGxlKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiB3cmFwcGVyUmFmKGNhbGxiYWNrKSB7XG4gIHJldHVybiByYWYoY2FsbGJhY2spO1xufVxuXG53cmFwcGVyUmFmLmNhbmNlbCA9IGNhZjsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZmlsbFJlZiA9IGZpbGxSZWY7XG5leHBvcnRzLmNvbXBvc2VSZWYgPSBjb21wb3NlUmVmO1xuZXhwb3J0cy5zdXBwb3J0UmVmID0gc3VwcG9ydFJlZjtcblxudmFyIF9yZWFjdElzID0gcmVxdWlyZShcInJlYWN0LWlzXCIpO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIGZpbGxSZWYocmVmLCBub2RlKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKG5vZGUpO1xuICB9IGVsc2UgaWYgKF90eXBlb2YocmVmKSA9PT0gJ29iamVjdCcgJiYgcmVmICYmICdjdXJyZW50JyBpbiByZWYpIHtcbiAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gIH1cbn1cbi8qKlxuICogTWVyZ2UgcmVmcyBpbnRvIG9uZSByZWYgZnVuY3Rpb24gdG8gc3VwcG9ydCByZWYgcGFzc2luZy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbXBvc2VSZWYoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZWZzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHJlZnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZWZzLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgZmlsbFJlZihyZWYsIG5vZGUpO1xuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0UmVmKG5vZGVPckNvbXBvbmVudCkge1xuICB2YXIgX3R5cGUkcHJvdG90eXBlLCBfbm9kZU9yQ29tcG9uZW50JHByb3Q7XG5cbiAgdmFyIHR5cGUgPSAoMCwgX3JlYWN0SXMuaXNNZW1vKShub2RlT3JDb21wb25lbnQpID8gbm9kZU9yQ29tcG9uZW50LnR5cGUudHlwZSA6IG5vZGVPckNvbXBvbmVudC50eXBlOyAvLyBGdW5jdGlvbiBjb21wb25lbnQgbm9kZVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKChfdHlwZSRwcm90b3R5cGUgPSB0eXBlLnByb3RvdHlwZSkgPT09IG51bGwgfHwgX3R5cGUkcHJvdG90eXBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdHlwZSRwcm90b3R5cGUucmVuZGVyKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBDbGFzcyBjb21wb25lbnRcblxuXG4gIGlmICh0eXBlb2Ygbm9kZU9yQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmICEoKF9ub2RlT3JDb21wb25lbnQkcHJvdCA9IG5vZGVPckNvbXBvbmVudC5wcm90b3R5cGUpID09PSBudWxsIHx8IF9ub2RlT3JDb21wb25lbnQkcHJvdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX25vZGVPckNvbXBvbmVudCRwcm90LnJlbmRlcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbi8qIGVzbGludC1lbmFibGUgKi8iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxuLyoqXG4gKiBFYXN5IHRvIHNldCBlbGVtZW50IHN0eWxlLCByZXR1cm4gcHJldmlvdXMgc3R5bGVcbiAqIElFIGJyb3dzZXIgY29tcGF0aWJsZShJRSBicm93c2VyIGRvZXNuJ3QgbWVyZ2Ugb3ZlcmZsb3cgc3R5bGUsIG5lZWQgdG8gc2V0IGl0IHNlcGFyYXRlbHkpXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xOTM5M1xuICpcbiAqL1xuZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGVsZW1lbnQgPSBfb3B0aW9ucyRlbGVtZW50ID09PSB2b2lkIDAgPyBkb2N1bWVudC5ib2R5IDogX29wdGlvbnMkZWxlbWVudDtcbiAgdmFyIG9sZFN0eWxlID0ge307XG4gIHZhciBzdHlsZUtleXMgPSBPYmplY3Qua2V5cyhzdHlsZSk7IC8vIElFIGJyb3dzZXIgY29tcGF0aWJsZVxuXG4gIHN0eWxlS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBvbGRTdHlsZVtrZXldID0gZWxlbWVudC5zdHlsZVtrZXldO1xuICB9KTtcbiAgc3R5bGVLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07XG4gIH0pO1xuICByZXR1cm4gb2xkU3R5bGU7XG59XG5cbnZhciBfZGVmYXVsdCA9IHNldFN0eWxlO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfZ2V0U2Nyb2xsQmFyU2l6ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZ2V0U2Nyb2xsQmFyU2l6ZVwiKSk7XG5cbnZhciBfc2V0U3R5bGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3NldFN0eWxlXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gaXNCb2R5T3ZlcmZsb3dpbmcoKSB7XG4gIHJldHVybiBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCA+ICh3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkgJiYgd2luZG93LmlubmVyV2lkdGggPiBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoO1xufVxuXG52YXIgY2FjaGVTdHlsZSA9IHt9O1xuXG52YXIgX2RlZmF1bHQgPSBmdW5jdGlvbiBfZGVmYXVsdChjbG9zZSkge1xuICBpZiAoIWlzQm9keU92ZXJmbG93aW5nKCkgJiYgIWNsb3NlKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE5NzI5XG5cblxuICB2YXIgc2Nyb2xsaW5nRWZmZWN0Q2xhc3NOYW1lID0gJ2FudC1zY3JvbGxpbmctZWZmZWN0JztcbiAgdmFyIHNjcm9sbGluZ0VmZmVjdENsYXNzTmFtZVJlZyA9IG5ldyBSZWdFeHAoXCJcIi5jb25jYXQoc2Nyb2xsaW5nRWZmZWN0Q2xhc3NOYW1lKSwgJ2cnKTtcbiAgdmFyIGJvZHlDbGFzc05hbWUgPSBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZTtcblxuICBpZiAoY2xvc2UpIHtcbiAgICBpZiAoIXNjcm9sbGluZ0VmZmVjdENsYXNzTmFtZVJlZy50ZXN0KGJvZHlDbGFzc05hbWUpKSByZXR1cm47XG4gICAgKDAsIF9zZXRTdHlsZS5kZWZhdWx0KShjYWNoZVN0eWxlKTtcbiAgICBjYWNoZVN0eWxlID0ge307XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc05hbWUgPSBib2R5Q2xhc3NOYW1lLnJlcGxhY2Uoc2Nyb2xsaW5nRWZmZWN0Q2xhc3NOYW1lUmVnLCAnJykudHJpbSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzY3JvbGxCYXJTaXplID0gKDAsIF9nZXRTY3JvbGxCYXJTaXplLmRlZmF1bHQpKCk7XG5cbiAgaWYgKHNjcm9sbEJhclNpemUpIHtcbiAgICBjYWNoZVN0eWxlID0gKDAsIF9zZXRTdHlsZS5kZWZhdWx0KSh7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIHdpZHRoOiBcImNhbGMoMTAwJSAtIFwiLmNvbmNhdChzY3JvbGxCYXJTaXplLCBcInB4KVwiKVxuICAgIH0pO1xuXG4gICAgaWYgKCFzY3JvbGxpbmdFZmZlY3RDbGFzc05hbWVSZWcudGVzdChib2R5Q2xhc3NOYW1lKSkge1xuICAgICAgdmFyIGFkZENsYXNzTmFtZSA9IFwiXCIuY29uY2F0KGJvZHlDbGFzc05hbWUsIFwiIFwiKS5jb25jYXQoc2Nyb2xsaW5nRWZmZWN0Q2xhc3NOYW1lKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NOYW1lID0gYWRkQ2xhc3NOYW1lLnRyaW0oKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZ2V0O1xuXG5mdW5jdGlvbiBnZXQoZW50aXR5LCBwYXRoKSB7XG4gIHZhciBjdXJyZW50ID0gZW50aXR5O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjdXJyZW50ID0gY3VycmVudFtwYXRoW2ldXTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gc2V0O1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuXG5mdW5jdGlvbiBfdG9BcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gc2V0KGVudGl0eSwgcGF0aHMsIHZhbHVlKSB7XG4gIGlmICghcGF0aHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgdmFyIF9wYXRocyA9IF90b0FycmF5KHBhdGhzKSxcbiAgICAgIHBhdGggPSBfcGF0aHNbMF0sXG4gICAgICByZXN0UGF0aCA9IF9wYXRocy5zbGljZSgxKTtcblxuICB2YXIgY2xvbmU7XG5cbiAgaWYgKCFlbnRpdHkgJiYgdHlwZW9mIHBhdGggPT09ICdudW1iZXInKSB7XG4gICAgY2xvbmUgPSBbXTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudGl0eSkpIHtcbiAgICBjbG9uZSA9IF90b0NvbnN1bWFibGVBcnJheShlbnRpdHkpO1xuICB9IGVsc2Uge1xuICAgIGNsb25lID0gX29iamVjdFNwcmVhZCh7fSwgZW50aXR5KTtcbiAgfVxuXG4gIGNsb25lW3BhdGhdID0gc2V0KGNsb25lW3BhdGhdLCByZXN0UGF0aCwgdmFsdWUpO1xuICByZXR1cm4gY2xvbmU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLndhcm5pbmcgPSB3YXJuaW5nO1xuZXhwb3J0cy5ub3RlID0gbm90ZTtcbmV4cG9ydHMucmVzZXRXYXJuZWQgPSByZXNldFdhcm5lZDtcbmV4cG9ydHMuY2FsbCA9IGNhbGw7XG5leHBvcnRzLndhcm5pbmdPbmNlID0gd2FybmluZ09uY2U7XG5leHBvcnRzLm5vdGVPbmNlID0gbm90ZU9uY2U7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbnZhciB3YXJuZWQgPSB7fTtcblxuZnVuY3Rpb24gd2FybmluZyh2YWxpZCwgbWVzc2FnZSkge1xuICAvLyBTdXBwb3J0IHVnbGlmeVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdmFsaWQgJiYgY29uc29sZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5lcnJvcihcIldhcm5pbmc6IFwiLmNvbmNhdChtZXNzYWdlKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm90ZSh2YWxpZCwgbWVzc2FnZSkge1xuICAvLyBTdXBwb3J0IHVnbGlmeVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdmFsaWQgJiYgY29uc29sZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS53YXJuKFwiTm90ZTogXCIuY29uY2F0KG1lc3NhZ2UpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldFdhcm5lZCgpIHtcbiAgd2FybmVkID0ge307XG59XG5cbmZ1bmN0aW9uIGNhbGwobWV0aG9kLCB2YWxpZCwgbWVzc2FnZSkge1xuICBpZiAoIXZhbGlkICYmICF3YXJuZWRbbWVzc2FnZV0pIHtcbiAgICBtZXRob2QoZmFsc2UsIG1lc3NhZ2UpO1xuICAgIHdhcm5lZFttZXNzYWdlXSA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2FybmluZ09uY2UodmFsaWQsIG1lc3NhZ2UpIHtcbiAgY2FsbCh3YXJuaW5nLCB2YWxpZCwgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIG5vdGVPbmNlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIGNhbGwobm90ZSwgdmFsaWQsIG1lc3NhZ2UpO1xufVxuXG52YXIgX2RlZmF1bHQgPSB3YXJuaW5nT25jZTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yY1Jlc2l6ZU9ic2VydmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtcmVzaXplLW9ic2VydmVyXCIpKTtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG4vKipcbiAqIEZpbGwgY29tcG9uZW50IHRvIHByb3ZpZGVkIHRoZSBzY3JvbGwgY29udGVudCByZWFsIGhlaWdodC5cbiAqL1xudmFyIEZpbGxlciA9IGZ1bmN0aW9uIEZpbGxlcihfcmVmKSB7XG4gIHZhciBoZWlnaHQgPSBfcmVmLmhlaWdodCxcbiAgICAgIG9mZnNldCA9IF9yZWYub2Zmc2V0LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgICAgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICBvbklubmVyUmVzaXplID0gX3JlZi5vbklubmVyUmVzaXplO1xuICB2YXIgb3V0ZXJTdHlsZSA9IHt9O1xuICB2YXIgaW5uZXJTdHlsZSA9IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbidcbiAgfTtcblxuICBpZiAob2Zmc2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBvdXRlclN0eWxlID0ge1xuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH07XG4gICAgaW5uZXJTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5uZXJTdHlsZSksIHt9LCB7XG4gICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWShcIi5jb25jYXQob2Zmc2V0LCBcInB4KVwiKSxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IG91dGVyU3R5bGVcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChfcmNSZXNpemVPYnNlcnZlci5kZWZhdWx0LCB7XG4gICAgb25SZXNpemU6IGZ1bmN0aW9uIG9uUmVzaXplKF9yZWYyKSB7XG4gICAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gX3JlZjIub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICBpZiAob2Zmc2V0SGVpZ2h0ICYmIG9uSW5uZXJSZXNpemUpIHtcbiAgICAgICAgb25Jbm5lclJlc2l6ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IGlubmVyU3R5bGUsXG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhvbGRlci1pbm5lclwiKSwgcHJlZml4Q2xzKSlcbiAgfSwgY2hpbGRyZW4pKSk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBGaWxsZXI7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5JdGVtID0gSXRlbTtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gSXRlbShfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBzZXRSZWYgPSBfcmVmLnNldFJlZjtcbiAgdmFyIHJlZkZ1bmMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobm9kZSkge1xuICAgIHNldFJlZihub2RlKTtcbiAgfSwgW10pO1xuICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgcmVmOiByZWZGdW5jXG4gIH0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlJhd0xpc3QgPSBSYXdMaXN0O1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9GaWxsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0ZpbGxlclwiKSk7XG5cbnZhciBfU2Nyb2xsQmFyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TY3JvbGxCYXJcIikpO1xuXG52YXIgX3VzZUNoaWxkcmVuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VDaGlsZHJlblwiKSk7XG5cbnZhciBfdXNlSGVpZ2h0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZUhlaWdodHNcIikpO1xuXG52YXIgX3VzZVNjcm9sbFRvID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VTY3JvbGxUb1wiKSk7XG5cbnZhciBfdXNlRGlmZkl0ZW0zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VEaWZmSXRlbVwiKSk7XG5cbnZhciBfdXNlRnJhbWVXaGVlbDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZUZyYW1lV2hlZWxcIikpO1xuXG52YXIgX3VzZU1vYmlsZVRvdWNoTW92ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlTW9iaWxlVG91Y2hNb3ZlXCIpKTtcblxudmFyIF91c2VPcmlnaW5TY3JvbGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZU9yaWdpblNjcm9sbFwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG52YXIgRU1QVFlfREFUQSA9IFtdO1xudmFyIFNjcm9sbFN0eWxlID0ge1xuICBvdmVyZmxvd1k6ICdhdXRvJyxcbiAgb3ZlcmZsb3dBbmNob3I6ICdub25lJ1xufTtcblxuZnVuY3Rpb24gUmF3TGlzdChwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXZpcnR1YWwtbGlzdCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgICAgaXRlbUhlaWdodCA9IHByb3BzLml0ZW1IZWlnaHQsXG4gICAgICBfcHJvcHMkZnVsbEhlaWdodCA9IHByb3BzLmZ1bGxIZWlnaHQsXG4gICAgICBmdWxsSGVpZ2h0ID0gX3Byb3BzJGZ1bGxIZWlnaHQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkZnVsbEhlaWdodCxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBpdGVtS2V5ID0gcHJvcHMuaXRlbUtleSxcbiAgICAgIHZpcnR1YWwgPSBwcm9wcy52aXJ0dWFsLFxuICAgICAgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIENvbXBvbmVudCA9IF9wcm9wcyRjb21wb25lbnQgPT09IHZvaWQgMCA/ICdkaXYnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICAgIG9uU2Nyb2xsID0gcHJvcHMub25TY3JvbGwsXG4gICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImhlaWdodFwiLCBcIml0ZW1IZWlnaHRcIiwgXCJmdWxsSGVpZ2h0XCIsIFwic3R5bGVcIiwgXCJkYXRhXCIsIFwiY2hpbGRyZW5cIiwgXCJpdGVtS2V5XCIsIFwidmlydHVhbFwiLCBcImNvbXBvbmVudFwiLCBcIm9uU2Nyb2xsXCJdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1JU0MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgaW5WaXJ0dWFsID0gdmlydHVhbCAhPT0gZmFsc2UgJiYgaGVpZ2h0ICYmIGl0ZW1IZWlnaHQgJiYgZGF0YSAmJiBpdGVtSGVpZ2h0ICogZGF0YS5sZW5ndGggPiBoZWlnaHQ7XG5cbiAgdmFyIF91c2VTdGF0ZSA9ICgwLCBSZWFjdC51c2VTdGF0ZSkoMCksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIHNjcm9sbFRvcCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTY3JvbGxUb3AgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfdXNlU3RhdGUzID0gKDAsIFJlYWN0LnVzZVN0YXRlKShmYWxzZSksXG4gICAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgICBzY3JvbGxNb3ZpbmcgPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0U2Nyb2xsTW92aW5nID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgbWVyZ2VkQ2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHByZWZpeENscywgY2xhc3NOYW1lKTtcbiAgdmFyIG1lcmdlZERhdGEgPSBkYXRhIHx8IEVNUFRZX0RBVEE7XG4gIHZhciBjb21wb25lbnRSZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW0gS2V5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgZ2V0S2V5ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAodHlwZW9mIGl0ZW1LZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVtS2V5KGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtW2l0ZW1LZXldO1xuICB9LCBbaXRlbUtleV0pO1xuICB2YXIgc2hhcmVkQ29uZmlnID0ge1xuICAgIGdldEtleTogZ2V0S2V5XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIHN5bmNTY3JvbGxUb3AobmV3VG9wKSB7XG4gICAgc2V0U2Nyb2xsVG9wKGZ1bmN0aW9uIChvcmlnaW4pIHtcbiAgICAgIHZhciB2YWx1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXdUb3AgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuZXdUb3Aob3JpZ2luKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gbmV3VG9wO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWxpZ25lZFRvcCA9IGtlZXBJblJhbmdlKHZhbHVlKTtcbiAgICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IGFsaWduZWRUb3A7XG4gICAgICByZXR1cm4gYWxpZ25lZFRvcDtcbiAgICB9KTtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBMZWdhY3kgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHV0IHJlZiBoZXJlIHNpbmNlIHRoZSByYW5nZSBpcyBnZW5lcmF0ZSBieSBmb2xsb3dcblxuXG4gIHZhciByYW5nZVJlZiA9ICgwLCBSZWFjdC51c2VSZWYpKHtcbiAgICBzdGFydDogMCxcbiAgICBlbmQ6IG1lcmdlZERhdGEubGVuZ3RoXG4gIH0pO1xuICB2YXIgZGlmZkl0ZW1SZWYgPSAoMCwgUmVhY3QudXNlUmVmKSgpO1xuXG4gIHZhciBfdXNlRGlmZkl0ZW0gPSAoMCwgX3VzZURpZmZJdGVtMy5kZWZhdWx0KShtZXJnZWREYXRhLCBnZXRLZXkpLFxuICAgICAgX3VzZURpZmZJdGVtMiA9IF9zbGljZWRUb0FycmF5KF91c2VEaWZmSXRlbSwgMSksXG4gICAgICBkaWZmSXRlbSA9IF91c2VEaWZmSXRlbTJbMF07XG5cbiAgZGlmZkl0ZW1SZWYuY3VycmVudCA9IGRpZmZJdGVtOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIZWlnaHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgX3VzZUhlaWdodHMgPSAoMCwgX3VzZUhlaWdodHMzLmRlZmF1bHQpKGdldEtleSwgbnVsbCwgbnVsbCksXG4gICAgICBfdXNlSGVpZ2h0czIgPSBfc2xpY2VkVG9BcnJheShfdXNlSGVpZ2h0cywgNCksXG4gICAgICBzZXRJbnN0YW5jZVJlZiA9IF91c2VIZWlnaHRzMlswXSxcbiAgICAgIGNvbGxlY3RIZWlnaHQgPSBfdXNlSGVpZ2h0czJbMV0sXG4gICAgICBoZWlnaHRzID0gX3VzZUhlaWdodHMyWzJdLFxuICAgICAgaGVpZ2h0VXBkYXRlZE1hcmsgPSBfdXNlSGVpZ2h0czJbM107IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFZpc2libGUgQ2FsY3VsYXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpblZpcnR1YWwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbEhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgICBzdGFydDogMCxcbiAgICAgICAgZW5kOiBtZXJnZWREYXRhLmxlbmd0aCAtIDEsXG4gICAgICAgIG9mZnNldDogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBpdGVtVG9wID0gMDtcbiAgICB2YXIgc3RhcnRJbmRleDtcbiAgICB2YXIgc3RhcnRPZmZzZXQ7XG4gICAgdmFyIGVuZEluZGV4O1xuICAgIHZhciBkYXRhTGVuID0gbWVyZ2VkRGF0YS5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFMZW47IGkgKz0gMSkge1xuICAgICAgdmFyIGl0ZW0gPSBtZXJnZWREYXRhW2ldO1xuICAgICAgdmFyIGtleSA9IGdldEtleShpdGVtKTtcbiAgICAgIHZhciBjYWNoZUhlaWdodCA9IGhlaWdodHMuZ2V0KGtleSk7XG4gICAgICB2YXIgY3VycmVudEl0ZW1Cb3R0b20gPSBpdGVtVG9wICsgKGNhY2hlSGVpZ2h0ID09PSB1bmRlZmluZWQgPyBpdGVtSGVpZ2h0IDogY2FjaGVIZWlnaHQpOyAvLyBDaGVjayBpdGVtIHRvcCBpbiB0aGUgcmFuZ2VcblxuICAgICAgaWYgKGN1cnJlbnRJdGVtQm90dG9tID49IHNjcm9sbFRvcCAmJiBzdGFydEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhcnRJbmRleCA9IGk7XG4gICAgICAgIHN0YXJ0T2Zmc2V0ID0gaXRlbVRvcDtcbiAgICAgIH0gLy8gQ2hlY2sgaXRlbSBib3R0b20gaW4gdGhlIHJhbmdlLiBXZSB3aWxsIHJlbmRlciBhZGRpdGlvbmFsIG9uZSBpdGVtIGZvciBtb3Rpb24gdXNhZ2VcblxuXG4gICAgICBpZiAoY3VycmVudEl0ZW1Cb3R0b20gPiBzY3JvbGxUb3AgKyBoZWlnaHQgJiYgZW5kSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmRJbmRleCA9IGk7XG4gICAgICB9XG5cbiAgICAgIGl0ZW1Ub3AgPSBjdXJyZW50SXRlbUJvdHRvbTtcbiAgICB9IC8vIEZhbGxiYWNrIHRvIG5vcm1hbCBpZiBub3QgbWF0Y2guIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcmVhY2hcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgIGlmIChzdGFydEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgc3RhcnRPZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChlbmRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmRJbmRleCA9IG1lcmdlZERhdGEubGVuZ3RoIC0gMTtcbiAgICB9IC8vIEdpdmUgY2FjaGUgdG8gaW1wcm92ZSBzY3JvbGwgZXhwZXJpZW5jZVxuXG5cbiAgICBlbmRJbmRleCA9IE1hdGgubWluKGVuZEluZGV4ICsgMSwgbWVyZ2VkRGF0YS5sZW5ndGgpO1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxIZWlnaHQ6IGl0ZW1Ub3AsXG4gICAgICBzdGFydDogc3RhcnRJbmRleCxcbiAgICAgIGVuZDogZW5kSW5kZXgsXG4gICAgICBvZmZzZXQ6IHN0YXJ0T2Zmc2V0XG4gICAgfTtcbiAgfSwgW2luVmlydHVhbCwgc2Nyb2xsVG9wLCBtZXJnZWREYXRhLCBoZWlnaHRVcGRhdGVkTWFyaywgaGVpZ2h0XSksXG4gICAgICBzY3JvbGxIZWlnaHQgPSBfUmVhY3QkdXNlTWVtby5zY3JvbGxIZWlnaHQsXG4gICAgICBzdGFydCA9IF9SZWFjdCR1c2VNZW1vLnN0YXJ0LFxuICAgICAgZW5kID0gX1JlYWN0JHVzZU1lbW8uZW5kLFxuICAgICAgb2Zmc2V0ID0gX1JlYWN0JHVzZU1lbW8ub2Zmc2V0O1xuXG4gIHJhbmdlUmVmLmN1cnJlbnQuc3RhcnQgPSBzdGFydDtcbiAgcmFuZ2VSZWYuY3VycmVudC5lbmQgPSBlbmQ7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSW4gUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBtYXhTY3JvbGxIZWlnaHQgPSBzY3JvbGxIZWlnaHQgLSBoZWlnaHQ7XG4gIHZhciBtYXhTY3JvbGxIZWlnaHRSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShtYXhTY3JvbGxIZWlnaHQpO1xuICBtYXhTY3JvbGxIZWlnaHRSZWYuY3VycmVudCA9IG1heFNjcm9sbEhlaWdodDtcblxuICBmdW5jdGlvbiBrZWVwSW5SYW5nZShuZXdTY3JvbGxUb3ApIHtcbiAgICB2YXIgbmV3VG9wID0gTWF0aC5tYXgobmV3U2Nyb2xsVG9wLCAwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKG1heFNjcm9sbEhlaWdodFJlZi5jdXJyZW50KSkge1xuICAgICAgbmV3VG9wID0gTWF0aC5taW4obmV3VG9wLCBtYXhTY3JvbGxIZWlnaHRSZWYuY3VycmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1RvcDtcbiAgfVxuXG4gIHZhciBpc1Njcm9sbEF0VG9wID0gc2Nyb2xsVG9wIDw9IDA7XG4gIHZhciBpc1Njcm9sbEF0Qm90dG9tID0gc2Nyb2xsVG9wID49IG1heFNjcm9sbEhlaWdodDtcbiAgdmFyIG9yaWdpblNjcm9sbCA9ICgwLCBfdXNlT3JpZ2luU2Nyb2xsLmRlZmF1bHQpKGlzU2Nyb2xsQXRUb3AsIGlzU2Nyb2xsQXRCb3R0b20pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTY3JvbGwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBvblNjcm9sbEJhcihuZXdTY3JvbGxUb3ApIHtcbiAgICB2YXIgbmV3VG9wID0gbmV3U2Nyb2xsVG9wO1xuICAgIHN5bmNTY3JvbGxUb3AobmV3VG9wKTtcbiAgfSAvLyBUaGlzIGNvZGUgbWF5IG9ubHkgdHJpZ2dlciBpbiB0ZXN0IGNhc2UuXG4gIC8vIEJ1dCB3ZSBzdGlsbCBuZWVkIGEgc3luYyBpZiBzb21lIHNwZWNpYWwgZXNjYXBlXG5cblxuICBmdW5jdGlvbiBvbkZhbGxiYWNrU2Nyb2xsKGUpIHtcbiAgICB2YXIgbmV3U2Nyb2xsVG9wID0gZS5jdXJyZW50VGFyZ2V0LnNjcm9sbFRvcDtcblxuICAgIGlmIChuZXdTY3JvbGxUb3AgIT09IHNjcm9sbFRvcCkge1xuICAgICAgc3luY1Njcm9sbFRvcChuZXdTY3JvbGxUb3ApO1xuICAgIH0gLy8gVHJpZ2dlciBvcmlnaW4gb25TY3JvbGxcblxuXG4gICAgb25TY3JvbGwgPT09IG51bGwgfHwgb25TY3JvbGwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2Nyb2xsKGUpO1xuICB9IC8vIFNpbmNlIHRoaXMgYWRkZWQgaW4gZ2xvYmFsLHNob3VsZCB1c2UgcmVmIHRvIGtlZXAgdXBkYXRlXG5cblxuICB2YXIgX3VzZUZyYW1lV2hlZWwgPSAoMCwgX3VzZUZyYW1lV2hlZWwzLmRlZmF1bHQpKGluVmlydHVhbCwgaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgZnVuY3Rpb24gKG9mZnNldFkpIHtcbiAgICBzeW5jU2Nyb2xsVG9wKGZ1bmN0aW9uICh0b3ApIHtcbiAgICAgIHZhciBuZXdUb3AgPSB0b3AgKyBvZmZzZXRZO1xuICAgICAgcmV0dXJuIG5ld1RvcDtcbiAgICB9KTtcbiAgfSksXG4gICAgICBfdXNlRnJhbWVXaGVlbDIgPSBfc2xpY2VkVG9BcnJheShfdXNlRnJhbWVXaGVlbCwgMiksXG4gICAgICBvblJhd1doZWVsID0gX3VzZUZyYW1lV2hlZWwyWzBdLFxuICAgICAgb25GaXJlRm94U2Nyb2xsID0gX3VzZUZyYW1lV2hlZWwyWzFdOyAvLyBNb2JpbGUgdG91Y2ggbW92ZVxuXG5cbiAgKDAsIF91c2VNb2JpbGVUb3VjaE1vdmUuZGVmYXVsdCkoaW5WaXJ0dWFsLCBjb21wb25lbnRSZWYsIGZ1bmN0aW9uIChkZWx0YVksIHNtb290aE9mZnNldCkge1xuICAgIGlmIChvcmlnaW5TY3JvbGwoZGVsdGFZLCBzbW9vdGhPZmZzZXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgb25SYXdXaGVlbCh7XG4gICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7fSxcbiAgICAgIGRlbHRhWTogZGVsdGFZXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIEZpcmVmb3ggb25seVxuICAgIGZ1bmN0aW9uIG9uTW96TW91c2VQaXhlbFNjcm9sbChlKSB7XG4gICAgICBpZiAoaW5WaXJ0dWFsKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uUmF3V2hlZWwpO1xuICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgb25GaXJlRm94U2Nyb2xsKTtcbiAgICBjb21wb25lbnRSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCdNb3pNb3VzZVBpeGVsU2Nyb2xsJywgb25Nb3pNb3VzZVBpeGVsU2Nyb2xsKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY29tcG9uZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvblJhd1doZWVsKTtcbiAgICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgb25GaXJlRm94U2Nyb2xsKTtcbiAgICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ01vek1vdXNlUGl4ZWxTY3JvbGwnLCBvbk1vek1vdXNlUGl4ZWxTY3JvbGwpO1xuICAgIH07XG4gIH0sIFtpblZpcnR1YWxdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIHNjcm9sbFRvID0gKDAsIF91c2VTY3JvbGxUby5kZWZhdWx0KShjb21wb25lbnRSZWYsIG1lcmdlZERhdGEsIGhlaWdodHMsIGl0ZW1IZWlnaHQsIGdldEtleSwgY29sbGVjdEhlaWdodCwgc3luY1Njcm9sbFRvcCk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbFRvOiBzY3JvbGxUb1xuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgbGlzdENoaWxkcmVuID0gKDAsIF91c2VDaGlsZHJlbi5kZWZhdWx0KShtZXJnZWREYXRhLCBzdGFydCwgZW5kLCBzZXRJbnN0YW5jZVJlZiwgY2hpbGRyZW4sIHNoYXJlZENvbmZpZyk7XG4gIHZhciBjb21wb25lbnRTdHlsZSA9IG51bGw7XG5cbiAgaWYgKGhlaWdodCkge1xuICAgIGNvbXBvbmVudFN0eWxlID0gX29iamVjdFNwcmVhZChfZGVmaW5lUHJvcGVydHkoe30sIGZ1bGxIZWlnaHQgPyAnaGVpZ2h0JyA6ICdtYXhIZWlnaHQnLCBoZWlnaHQpLCBTY3JvbGxTdHlsZSk7XG5cbiAgICBpZiAoaW5WaXJ0dWFsKSB7XG4gICAgICBjb21wb25lbnRTdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJztcblxuICAgICAgaWYgKHNjcm9sbE1vdmluZykge1xuICAgICAgICBjb21wb25lbnRTdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgfSksXG4gICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWVcbiAgfSwgcmVzdFByb3BzKSwgUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaG9sZGVyXCIpLFxuICAgIHN0eWxlOiBjb21wb25lbnRTdHlsZSxcbiAgICByZWY6IGNvbXBvbmVudFJlZixcbiAgICBvblNjcm9sbDogb25GYWxsYmFja1Njcm9sbFxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KF9GaWxsZXIuZGVmYXVsdCwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGhlaWdodDogc2Nyb2xsSGVpZ2h0LFxuICAgIG9mZnNldDogb2Zmc2V0LFxuICAgIG9uSW5uZXJSZXNpemU6IGNvbGxlY3RIZWlnaHRcbiAgfSwgbGlzdENoaWxkcmVuKSksIGluVmlydHVhbCAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KF9TY3JvbGxCYXIuZGVmYXVsdCwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHNjcm9sbEhlaWdodDogc2Nyb2xsSGVpZ2h0LFxuICAgIGNvdW50OiBtZXJnZWREYXRhLmxlbmd0aCxcbiAgICBvblNjcm9sbDogb25TY3JvbGxCYXIsXG4gICAgb25TdGFydE1vdmU6IGZ1bmN0aW9uIG9uU3RhcnRNb3ZlKCkge1xuICAgICAgc2V0U2Nyb2xsTW92aW5nKHRydWUpO1xuICAgIH0sXG4gICAgb25TdG9wTW92ZTogZnVuY3Rpb24gb25TdG9wTW92ZSgpIHtcbiAgICAgIHNldFNjcm9sbE1vdmluZyhmYWxzZSk7XG4gICAgfVxuICB9KSk7XG59XG5cbnZhciBMaXN0ID0gUmVhY3QuZm9yd2FyZFJlZihSYXdMaXN0KTtcbkxpc3QuZGlzcGxheU5hbWUgPSAnTGlzdCc7XG52YXIgX2RlZmF1bHQgPSBMaXN0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3JhZlwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxudmFyIE1JTl9TSVpFID0gMjA7XG5cbmZ1bmN0aW9uIGdldFBhZ2VZKGUpIHtcbiAgcmV0dXJuICd0b3VjaGVzJyBpbiBlID8gZS50b3VjaGVzWzBdLnBhZ2VZIDogZS5wYWdlWTtcbn1cblxudmFyIFNjcm9sbEJhciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoU2Nyb2xsQmFyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFNjcm9sbEJhcik7XG5cbiAgZnVuY3Rpb24gU2Nyb2xsQmFyKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY3JvbGxCYXIpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy5tb3ZlUmFmID0gbnVsbDtcbiAgICBfdGhpcy5zY3JvbGxiYXJSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgICBfdGhpcy50aHVtYlJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgIF90aGlzLnZpc2libGVUaW1lb3V0ID0gbnVsbDtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICAgIHBhZ2VZOiBudWxsLFxuICAgICAgc3RhcnRUb3A6IG51bGwsXG4gICAgICB2aXNpYmxlOiBmYWxzZVxuICAgIH07XG5cbiAgICBfdGhpcy5kZWxheUhpZGRlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNsZWFyVGltZW91dChfdGhpcy52aXNpYmxlVGltZW91dCk7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzLnZpc2libGVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0sIDIwMDApO1xuICAgIH07XG5cbiAgICBfdGhpcy5vblNjcm9sbGJhclRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkNvbnRhaW5lck1vdXNlRG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09IENsZWFuID09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgIF90aGlzLnBhdGNoRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIF90aGlzLm9uTW91c2VNb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgX3RoaXMub25Nb3VzZVVwKTtcblxuICAgICAgX3RoaXMudGh1bWJSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5vbk1vdXNlTW92ZSk7XG5cbiAgICAgIF90aGlzLnRodW1iUmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBfdGhpcy5vbk1vdXNlVXApO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW1vdmVFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgX3RoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBfdGhpcy5vbk1vdXNlVXApO1xuXG4gICAgICBfdGhpcy5zY3JvbGxiYXJSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgX3RoaXMub25TY3JvbGxiYXJUb3VjaFN0YXJ0KTtcblxuICAgICAgX3RoaXMudGh1bWJSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgX3RoaXMub25Nb3VzZURvd24pO1xuXG4gICAgICBfdGhpcy50aHVtYlJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIF90aGlzLm9uTW91c2VNb3ZlKTtcblxuICAgICAgX3RoaXMudGh1bWJSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIF90aGlzLm9uTW91c2VVcCk7XG5cbiAgICAgIF9yYWYuZGVmYXVsdC5jYW5jZWwoX3RoaXMubW92ZVJhZik7XG4gICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gVGh1bWIgPT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gICAgX3RoaXMub25Nb3VzZURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uU3RhcnRNb3ZlID0gX3RoaXMucHJvcHMub25TdGFydE1vdmU7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmc6IHRydWUsXG4gICAgICAgIHBhZ2VZOiBnZXRQYWdlWShlKSxcbiAgICAgICAgc3RhcnRUb3A6IF90aGlzLmdldFRvcCgpXG4gICAgICB9KTtcblxuICAgICAgb25TdGFydE1vdmUoKTtcblxuICAgICAgX3RoaXMucGF0Y2hFdmVudHMoKTtcblxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25Nb3VzZU1vdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgZHJhZ2dpbmcgPSBfdGhpcyRzdGF0ZS5kcmFnZ2luZyxcbiAgICAgICAgICBwYWdlWSA9IF90aGlzJHN0YXRlLnBhZ2VZLFxuICAgICAgICAgIHN0YXJ0VG9wID0gX3RoaXMkc3RhdGUuc3RhcnRUb3A7XG4gICAgICB2YXIgb25TY3JvbGwgPSBfdGhpcy5wcm9wcy5vblNjcm9sbDtcblxuICAgICAgX3JhZi5kZWZhdWx0LmNhbmNlbChfdGhpcy5tb3ZlUmFmKTtcblxuICAgICAgaWYgKGRyYWdnaW5nKSB7XG4gICAgICAgIHZhciBvZmZzZXRZID0gZ2V0UGFnZVkoZSkgLSBwYWdlWTtcbiAgICAgICAgdmFyIG5ld1RvcCA9IHN0YXJ0VG9wICsgb2Zmc2V0WTtcblxuICAgICAgICB2YXIgZW5hYmxlU2Nyb2xsUmFuZ2UgPSBfdGhpcy5nZXRFbmFibGVTY3JvbGxSYW5nZSgpO1xuXG4gICAgICAgIHZhciBlbmFibGVIZWlnaHRSYW5nZSA9IF90aGlzLmdldEVuYWJsZUhlaWdodFJhbmdlKCk7XG5cbiAgICAgICAgdmFyIHB0ZyA9IG5ld1RvcCAvIGVuYWJsZUhlaWdodFJhbmdlO1xuICAgICAgICB2YXIgbmV3U2Nyb2xsVG9wID0gTWF0aC5jZWlsKHB0ZyAqIGVuYWJsZVNjcm9sbFJhbmdlKTtcbiAgICAgICAgX3RoaXMubW92ZVJhZiA9ICgwLCBfcmFmLmRlZmF1bHQpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBvblNjcm9sbChuZXdTY3JvbGxUb3ApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25Nb3VzZVVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uU3RvcE1vdmUgPSBfdGhpcy5wcm9wcy5vblN0b3BNb3ZlO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIG9uU3RvcE1vdmUoKTtcblxuICAgICAgX3RoaXMucmVtb3ZlRXZlbnRzKCk7XG4gICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09IENhbGN1bGF0ZSA9PT09PT09PT09PT09PT09PT09PT1cblxuXG4gICAgX3RoaXMuZ2V0U3BpbkhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzLmhlaWdodCxcbiAgICAgICAgICBjb3VudCA9IF90aGlzJHByb3BzLmNvdW50O1xuICAgICAgdmFyIGJhc2VIZWlnaHQgPSBoZWlnaHQgLyBjb3VudCAqIDEwO1xuICAgICAgYmFzZUhlaWdodCA9IE1hdGgubWF4KGJhc2VIZWlnaHQsIE1JTl9TSVpFKTtcbiAgICAgIGJhc2VIZWlnaHQgPSBNYXRoLm1pbihiYXNlSGVpZ2h0LCBoZWlnaHQgLyAyKTtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKGJhc2VIZWlnaHQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRFbmFibGVTY3JvbGxSYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBzY3JvbGxIZWlnaHQgPSBfdGhpcyRwcm9wczIuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzMi5oZWlnaHQ7XG4gICAgICByZXR1cm4gc2Nyb2xsSGVpZ2h0IC0gaGVpZ2h0O1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRFbmFibGVIZWlnaHRSYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBoZWlnaHQgPSBfdGhpcy5wcm9wcy5oZWlnaHQ7XG5cbiAgICAgIHZhciBzcGluSGVpZ2h0ID0gX3RoaXMuZ2V0U3BpbkhlaWdodCgpO1xuXG4gICAgICByZXR1cm4gaGVpZ2h0IC0gc3BpbkhlaWdodDtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0VG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNjcm9sbFRvcCA9IF90aGlzLnByb3BzLnNjcm9sbFRvcDtcblxuICAgICAgdmFyIGVuYWJsZVNjcm9sbFJhbmdlID0gX3RoaXMuZ2V0RW5hYmxlU2Nyb2xsUmFuZ2UoKTtcblxuICAgICAgdmFyIGVuYWJsZUhlaWdodFJhbmdlID0gX3RoaXMuZ2V0RW5hYmxlSGVpZ2h0UmFuZ2UoKTtcblxuICAgICAgdmFyIHB0ZyA9IHNjcm9sbFRvcCAvIGVuYWJsZVNjcm9sbFJhbmdlO1xuICAgICAgcmV0dXJuIHB0ZyAqIGVuYWJsZUhlaWdodFJhbmdlO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU2Nyb2xsQmFyLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuc2Nyb2xsYmFyUmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25TY3JvbGxiYXJUb3VjaFN0YXJ0KTtcbiAgICAgIHRoaXMudGh1bWJSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vbk1vdXNlRG93bik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICBpZiAocHJldlByb3BzLnNjcm9sbFRvcCAhPT0gdGhpcy5wcm9wcy5zY3JvbGxUb3ApIHtcbiAgICAgICAgdGhpcy5kZWxheUhpZGRlbigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRzKCk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy52aXNpYmxlVGltZW91dCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICB2aXNpYmxlID0gX3RoaXMkc3RhdGUyLnZpc2libGUsXG4gICAgICAgICAgZHJhZ2dpbmcgPSBfdGhpcyRzdGF0ZTIuZHJhZ2dpbmc7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gdGhpcy5wcm9wcy5wcmVmaXhDbHM7XG4gICAgICB2YXIgc3BpbkhlaWdodCA9IHRoaXMuZ2V0U3BpbkhlaWdodCgpO1xuICAgICAgdmFyIHRvcCA9IHRoaXMuZ2V0VG9wKCk7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5zY3JvbGxiYXJSZWYsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zY3JvbGxiYXJcIiksXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBkaXNwbGF5OiB2aXNpYmxlID8gbnVsbCA6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICBvbk1vdXNlRG93bjogdGhpcy5vbkNvbnRhaW5lck1vdXNlRG93bixcbiAgICAgICAgb25Nb3VzZU1vdmU6IHRoaXMuZGVsYXlIaWRkZW5cbiAgICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICByZWY6IHRoaXMudGh1bWJSZWYsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2Nyb2xsYmFyLXRodW1iXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2Nyb2xsYmFyLXRodW1iLW1vdmluZ1wiKSwgZHJhZ2dpbmcpKSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIGhlaWdodDogc3BpbkhlaWdodCxcbiAgICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNSknLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogOTksXG4gICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnXG4gICAgICAgIH0sXG4gICAgICAgIG9uTW91c2VEb3duOiB0aGlzLm9uTW91c2VEb3duXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNjcm9sbEJhcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gU2Nyb2xsQmFyOyIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VDaGlsZHJlbjtcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9JdGVtID0gcmVxdWlyZShcIi4uL0l0ZW1cIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIHVzZUNoaWxkcmVuKGxpc3QsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzZXROb2RlUmVmLCByZW5kZXJGdW5jLCBfcmVmKSB7XG4gIHZhciBnZXRLZXkgPSBfcmVmLmdldEtleTtcbiAgcmV0dXJuIGxpc3Quc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXggKyAxKS5tYXAoZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgdmFyIGVsZUluZGV4ID0gc3RhcnRJbmRleCArIGluZGV4O1xuICAgIHZhciBub2RlID0gcmVuZGVyRnVuYyhpdGVtLCBlbGVJbmRleCwgey8vIHN0eWxlOiBzdGF0dXMgPT09ICdNRUFTVVJFX1NUQVJUJyA/IHsgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSA6IHt9LFxuICAgIH0pO1xuICAgIHZhciBrZXkgPSBnZXRLZXkoaXRlbSk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoX0l0ZW0uSXRlbSwge1xuICAgICAga2V5OiBrZXksXG4gICAgICBzZXRSZWY6IGZ1bmN0aW9uIHNldFJlZihlbGUpIHtcbiAgICAgICAgcmV0dXJuIHNldE5vZGVSZWYoaXRlbSwgZWxlKTtcbiAgICAgIH1cbiAgICB9LCBub2RlKTtcbiAgfSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZURpZmZJdGVtO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2FsZ29yaXRobVV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbHMvYWxnb3JpdGhtVXRpbFwiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gdXNlRGlmZkl0ZW0oZGF0YSwgZ2V0S2V5LCBvbkRpZmYpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGRhdGEpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBwcmV2RGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRQcmV2RGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICAgIGRpZmZJdGVtID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICAgIHNldERpZmZJdGVtID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBkaWZmID0gKDAsIF9hbGdvcml0aG1VdGlsLmZpbmRMaXN0RGlmZkluZGV4KShwcmV2RGF0YSB8fCBbXSwgZGF0YSB8fCBbXSwgZ2V0S2V5KTtcblxuICAgIGlmICgoZGlmZiA9PT0gbnVsbCB8fCBkaWZmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaWZmLmluZGV4KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvbkRpZmYgPT09IG51bGwgfHwgb25EaWZmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkRpZmYoZGlmZi5pbmRleCk7XG4gICAgICBzZXREaWZmSXRlbShkYXRhW2RpZmYuaW5kZXhdKTtcbiAgICB9XG5cbiAgICBzZXRQcmV2RGF0YShkYXRhKTtcbiAgfSwgW2RhdGFdKTtcbiAgcmV0dXJuIFtkaWZmSXRlbV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VGcmFtZVdoZWVsO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3JhZlwiKSk7XG5cbnZhciBfaXNGaXJlZm94ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vdXRpbHMvaXNGaXJlZm94XCIpKTtcblxudmFyIF91c2VPcmlnaW5TY3JvbGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VzZU9yaWdpblNjcm9sbFwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHVzZUZyYW1lV2hlZWwoaW5WaXJ0dWFsLCBpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tLCBvbldoZWVsRGVsdGEpIHtcbiAgdmFyIG9mZnNldFJlZiA9ICgwLCBfcmVhY3QudXNlUmVmKSgwKTtcbiAgdmFyIG5leHRGcmFtZVJlZiA9ICgwLCBfcmVhY3QudXNlUmVmKShudWxsKTsgLy8gRmlyZWZveCBwYXRjaFxuXG4gIHZhciB3aGVlbFZhbHVlUmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKG51bGwpO1xuICB2YXIgaXNNb3VzZVNjcm9sbFJlZiA9ICgwLCBfcmVhY3QudXNlUmVmKShmYWxzZSk7IC8vIFNjcm9sbCBzdGF0dXMgc3luY1xuXG4gIHZhciBvcmlnaW5TY3JvbGwgPSAoMCwgX3VzZU9yaWdpblNjcm9sbC5kZWZhdWx0KShpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tKTtcblxuICBmdW5jdGlvbiBvbldoZWVsKGV2ZW50KSB7XG4gICAgaWYgKCFpblZpcnR1YWwpIHJldHVybjtcblxuICAgIF9yYWYuZGVmYXVsdC5jYW5jZWwobmV4dEZyYW1lUmVmLmN1cnJlbnQpO1xuXG4gICAgdmFyIGRlbHRhWSA9IGV2ZW50LmRlbHRhWTtcbiAgICBvZmZzZXRSZWYuY3VycmVudCArPSBkZWx0YVk7XG4gICAgd2hlZWxWYWx1ZVJlZi5jdXJyZW50ID0gZGVsdGFZOyAvLyBEbyBub3RoaW5nIHdoZW4gc2Nyb2xsIGF0IHRoZSBlZGdlLCBTa2lwIGNoZWNrIHdoZW4gaXMgaW4gc2Nyb2xsXG5cbiAgICBpZiAob3JpZ2luU2Nyb2xsKGRlbHRhWSkpIHJldHVybjsgLy8gUHJveHkgb2Ygc2Nyb2xsIGV2ZW50c1xuXG4gICAgaWYgKCFfaXNGaXJlZm94LmRlZmF1bHQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgbmV4dEZyYW1lUmVmLmN1cnJlbnQgPSAoMCwgX3JhZi5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBQYXRjaCBhIG11bHRpcGxlIGZvciBGaXJlZm94IHRvIGZpeCB3aGVlbCBudW1iZXIgdG9vIHNtYWxsXG4gICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI2MzcyI2lzc3VlY29tbWVudC02Nzk0NjAyNjZcbiAgICAgIHZhciBwYXRjaE11bHRpcGxlID0gaXNNb3VzZVNjcm9sbFJlZi5jdXJyZW50ID8gMTAgOiAxO1xuICAgICAgb25XaGVlbERlbHRhKG9mZnNldFJlZi5jdXJyZW50ICogcGF0Y2hNdWx0aXBsZSk7XG4gICAgICBvZmZzZXRSZWYuY3VycmVudCA9IDA7XG4gICAgfSk7XG4gIH0gLy8gQSBwYXRjaCBmb3IgZmlyZWZveFxuXG5cbiAgZnVuY3Rpb24gb25GaXJlRm94U2Nyb2xsKGV2ZW50KSB7XG4gICAgaWYgKCFpblZpcnR1YWwpIHJldHVybjtcbiAgICBpc01vdXNlU2Nyb2xsUmVmLmN1cnJlbnQgPSBldmVudC5kZXRhaWwgPT09IHdoZWVsVmFsdWVSZWYuY3VycmVudDtcbiAgfVxuXG4gIHJldHVybiBbb25XaGVlbCwgb25GaXJlRm94U2Nyb2xsXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlSGVpZ2h0cztcblxudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9maW5kRE9NTm9kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9maW5kRE9NTm9kZVwiKSk7XG5cbnZhciBfQ2FjaGVNYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi91dGlscy9DYWNoZU1hcFwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuOyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVkOyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5cbmZ1bmN0aW9uIHVzZUhlaWdodHMoZ2V0S2V5LCBvbkl0ZW1BZGQsIG9uSXRlbVJlbW92ZSkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoMCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHVwZGF0ZWRNYXJrID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFVwZGF0ZWRNYXJrID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgaW5zdGFuY2VSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShuZXcgTWFwKCkpO1xuICB2YXIgaGVpZ2h0c1JlZiA9ICgwLCBSZWFjdC51c2VSZWYpKG5ldyBfQ2FjaGVNYXAuZGVmYXVsdCgpKTtcbiAgdmFyIGhlaWdodFVwZGF0ZUlkUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoMCk7XG5cbiAgZnVuY3Rpb24gY29sbGVjdEhlaWdodCgpIHtcbiAgICBoZWlnaHRVcGRhdGVJZFJlZi5jdXJyZW50ICs9IDE7XG4gICAgdmFyIGN1cnJlbnRJZCA9IGhlaWdodFVwZGF0ZUlkUmVmLmN1cnJlbnQ7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBPbmx5IGNvbGxlY3Qgd2hlbiBpdCdzIGxhdGVzdCBjYWxsXG4gICAgICBpZiAoY3VycmVudElkICE9PSBoZWlnaHRVcGRhdGVJZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50LCBrZXkpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5vZmZzZXRQYXJlbnQpIHtcbiAgICAgICAgICB2YXIgaHRtbEVsZW1lbnQgPSAoMCwgX2ZpbmRET01Ob2RlLmRlZmF1bHQpKGVsZW1lbnQpO1xuICAgICAgICAgIHZhciBvZmZzZXRIZWlnaHQgPSBodG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICBpZiAoaGVpZ2h0c1JlZi5jdXJyZW50LmdldChrZXkpICE9PSBvZmZzZXRIZWlnaHQpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgaGVpZ2h0c1JlZi5jdXJyZW50LnNldChrZXksIGh0bWxFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgc2V0VXBkYXRlZE1hcmsoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICByZXR1cm4gYyArIDE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0SW5zdGFuY2VSZWYoaXRlbSwgaW5zdGFuY2UpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgIHZhciBvcmlnaW4gPSBpbnN0YW5jZVJlZi5jdXJyZW50LmdldChrZXkpO1xuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZVJlZi5jdXJyZW50LnNldChrZXksIGluc3RhbmNlKTtcbiAgICAgIGNvbGxlY3RIZWlnaHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5kZWxldGUoa2V5KTtcbiAgICB9IC8vIEluc3RhbmNlIGNoYW5nZWRcblxuXG4gICAgaWYgKCFvcmlnaW4gIT09ICFpbnN0YW5jZSkge1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIG9uSXRlbUFkZCA9PT0gbnVsbCB8fCBvbkl0ZW1BZGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uSXRlbUFkZChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uSXRlbVJlbW92ZSA9PT0gbnVsbCB8fCBvbkl0ZW1SZW1vdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uSXRlbVJlbW92ZShpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3NldEluc3RhbmNlUmVmLCBjb2xsZWN0SGVpZ2h0LCBoZWlnaHRzUmVmLmN1cnJlbnQsIHVwZGF0ZWRNYXJrXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlTW9iaWxlVG91Y2hNb3ZlO1xuXG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG52YXIgU01PT1RIX1BURyA9IDE0IC8gMTU7XG5cbmZ1bmN0aW9uIHVzZU1vYmlsZVRvdWNoTW92ZShpblZpcnR1YWwsIGxpc3RSZWYsIGNhbGxiYWNrKSB7XG4gIHZhciB0b3VjaGVkUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoZmFsc2UpO1xuICB2YXIgdG91Y2hZUmVmID0gKDAsIFJlYWN0LnVzZVJlZikoMCk7XG4gIHZhciBlbGVtZW50UmVmID0gKDAsIFJlYWN0LnVzZVJlZikobnVsbCk7IC8vIFNtb290aCBzY3JvbGxcblxuICB2YXIgaW50ZXJ2YWxSZWYgPSAoMCwgUmVhY3QudXNlUmVmKShudWxsKTtcbiAgdmFyIGNsZWFuVXBFdmVudHM7XG5cbiAgdmFyIG9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZSkge1xuICAgIGlmICh0b3VjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBjdXJyZW50WSA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgdmFyIG9mZnNldFkgPSB0b3VjaFlSZWYuY3VycmVudCAtIGN1cnJlbnRZO1xuICAgICAgdG91Y2hZUmVmLmN1cnJlbnQgPSBjdXJyZW50WTtcblxuICAgICAgaWYgKGNhbGxiYWNrKG9mZnNldFkpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0gLy8gU21vb3RoIGludGVydmFsXG5cblxuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbFJlZi5jdXJyZW50KTtcbiAgICAgIGludGVydmFsUmVmLmN1cnJlbnQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9mZnNldFkgKj0gU01PT1RIX1BURztcblxuICAgICAgICBpZiAoIWNhbGxiYWNrKG9mZnNldFksIHRydWUpIHx8IE1hdGguYWJzKG9mZnNldFkpIDw9IDAuMSkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxSZWYuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDE2KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uVG91Y2hFbmQgPSBmdW5jdGlvbiBvblRvdWNoRW5kKCkge1xuICAgIHRvdWNoZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGNsZWFuVXBFdmVudHMoKTtcbiAgfTtcblxuICB2YXIgb25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICBjbGVhblVwRXZlbnRzKCk7XG5cbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMSAmJiAhdG91Y2hlZFJlZi5jdXJyZW50KSB7XG4gICAgICB0b3VjaGVkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgdG91Y2hZUmVmLmN1cnJlbnQgPSBNYXRoLmNlaWwoZS50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgIGVsZW1lbnRSZWYuY3VycmVudCA9IGUudGFyZ2V0O1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlKTtcbiAgICAgIGVsZW1lbnRSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQpO1xuICAgIH1cbiAgfTtcblxuICBjbGVhblVwRXZlbnRzID0gZnVuY3Rpb24gY2xlYW5VcEV2ZW50cygpIHtcbiAgICBpZiAoZWxlbWVudFJlZi5jdXJyZW50KSB7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGluVmlydHVhbCkge1xuICAgICAgbGlzdFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBsaXN0UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gICAgICBjbGVhblVwRXZlbnRzKCk7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtpblZpcnR1YWxdKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxudmFyIF9kZWZhdWx0ID0gZnVuY3Rpb24gX2RlZmF1bHQoaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSkge1xuICAvLyBEbyBsb2NrIGZvciBhIHdoZWVsIHdoZW4gc2Nyb2xsaW5nXG4gIHZhciBsb2NrUmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKGZhbHNlKTtcbiAgdmFyIGxvY2tUaW1lb3V0UmVmID0gKDAsIF9yZWFjdC51c2VSZWYpKG51bGwpO1xuXG4gIGZ1bmN0aW9uIGxvY2tTY3JvbGwoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGxvY2tUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIGxvY2tSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbG9ja1RpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSwgNTApO1xuICB9IC8vIFBhc3MgdG8gcmVmIHNpbmNlIGdsb2JhbCBhZGQgaXMgaW4gY2xvc3VyZVxuXG5cbiAgdmFyIHNjcm9sbFBpbmdSZWYgPSAoMCwgX3JlYWN0LnVzZVJlZikoe1xuICAgIHRvcDogaXNTY3JvbGxBdFRvcCxcbiAgICBib3R0b206IGlzU2Nyb2xsQXRCb3R0b21cbiAgfSk7XG4gIHNjcm9sbFBpbmdSZWYuY3VycmVudC50b3AgPSBpc1Njcm9sbEF0VG9wO1xuICBzY3JvbGxQaW5nUmVmLmN1cnJlbnQuYm90dG9tID0gaXNTY3JvbGxBdEJvdHRvbTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChkZWx0YVkpIHtcbiAgICB2YXIgc21vb3RoT2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICB2YXIgb3JpZ2luU2Nyb2xsID0gLy8gUGFzcyBvcmlnaW4gd2hlZWwgd2hlbiBvbiB0aGUgdG9wXG4gICAgZGVsdGFZIDwgMCAmJiBzY3JvbGxQaW5nUmVmLmN1cnJlbnQudG9wIHx8IC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIGJvdHRvbVxuICAgIGRlbHRhWSA+IDAgJiYgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LmJvdHRvbTtcblxuICAgIGlmIChzbW9vdGhPZmZzZXQgJiYgb3JpZ2luU2Nyb2xsKSB7XG4gICAgICAvLyBObyBuZWVkIGxvY2sgYW55bW9yZSB3aGVuIGl0J3Mgc21vb3RoIG9mZnNldCBmcm9tIHRvdWNoTW92ZSBpbnRlcnZhbFxuICAgICAgY2xlYXJUaW1lb3V0KGxvY2tUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghb3JpZ2luU2Nyb2xsIHx8IGxvY2tSZWYuY3VycmVudCkge1xuICAgICAgbG9ja1Njcm9sbCgpO1xuICAgIH1cblxuICAgIHJldHVybiAhbG9ja1JlZi5jdXJyZW50ICYmIG9yaWdpblNjcm9sbDtcbiAgfTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlU2Nyb2xsVG87XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmFmID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvcmFmXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiB1c2VTY3JvbGxUbyhjb250YWluZXJSZWYsIGRhdGEsIGhlaWdodHMsIGl0ZW1IZWlnaHQsIGdldEtleSwgY29sbGVjdEhlaWdodCwgc3luY1Njcm9sbFRvcCkge1xuICB2YXIgc2Nyb2xsUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgX3JhZi5kZWZhdWx0LmNhbmNlbChzY3JvbGxSZWYuY3VycmVudCk7XG5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHN5bmNTY3JvbGxUb3AoYXJnKTtcbiAgICB9IGVsc2UgaWYgKGFyZyAmJiBfdHlwZW9mKGFyZykgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgaW5kZXg7XG4gICAgICB2YXIgYWxpZ24gPSBhcmcuYWxpZ247XG5cbiAgICAgIGlmICgnaW5kZXgnIGluIGFyZykge1xuICAgICAgICBpbmRleCA9IGFyZy5pbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4ID0gZGF0YS5maW5kSW5kZXgoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gZ2V0S2V5KGl0ZW0pID09PSBhcmcua2V5O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9hcmckb2Zmc2V0ID0gYXJnLm9mZnNldCxcbiAgICAgICAgICBvZmZzZXQgPSBfYXJnJG9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9hcmckb2Zmc2V0OyAvLyBXZSB3aWxsIHJldHJ5IDMgdGltZXMgaW4gY2FzZSBkeW5hbWljIGhlaWdodCBzaGFraW5nXG5cbiAgICAgIHZhciBzeW5jU2Nyb2xsID0gZnVuY3Rpb24gc3luY1Njcm9sbCh0aW1lcywgdGFyZ2V0QWxpZ24pIHtcbiAgICAgICAgaWYgKHRpbWVzIDwgMCB8fCAhY29udGFpbmVyUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICAgICAgdmFyIGhlaWdodCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgdmFyIG5lZWRDb2xsZWN0SGVpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHZhciBuZXdUYXJnZXRBbGlnbiA9IHRhcmdldEFsaWduOyAvLyBHbyB0byBuZXh0IGZyYW1lIGlmIGhlaWdodCBub3QgZXhpc3RcblxuICAgICAgICBpZiAoaGVpZ2h0KSB7XG4gICAgICAgICAgdmFyIG1lcmdlZEFsaWduID0gdGFyZ2V0QWxpZ24gfHwgYWxpZ247IC8vIEdldCB0b3AgJiBib3R0b21cblxuICAgICAgICAgIHZhciBzdGFja1RvcCA9IDA7XG4gICAgICAgICAgdmFyIGl0ZW1Ub3AgPSAwO1xuICAgICAgICAgIHZhciBpdGVtQm90dG9tID0gMDtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGluZGV4OyBpICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBnZXRLZXkoZGF0YVtpXSk7XG4gICAgICAgICAgICBpdGVtVG9wID0gc3RhY2tUb3A7XG4gICAgICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChrZXkpO1xuICAgICAgICAgICAgaXRlbUJvdHRvbSA9IGl0ZW1Ub3AgKyAoY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCA/IGl0ZW1IZWlnaHQgOiBjYWNoZUhlaWdodCk7XG4gICAgICAgICAgICBzdGFja1RvcCA9IGl0ZW1Cb3R0b207XG5cbiAgICAgICAgICAgIGlmIChpID09PSBpbmRleCAmJiBjYWNoZUhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIG5lZWRDb2xsZWN0SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFNjcm9sbCB0b1xuXG5cbiAgICAgICAgICB2YXIgdGFyZ2V0VG9wID0gbnVsbDtcblxuICAgICAgICAgIHN3aXRjaCAobWVyZ2VkQWxpZ24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICAgIHRhcmdldFRvcCA9IGl0ZW1Ub3AgLSBvZmZzZXQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICB0YXJnZXRUb3AgPSBpdGVtQm90dG9tIC0gaGVpZ2h0ICsgb2Zmc2V0O1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSBjb250YWluZXJSZWYuY3VycmVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgdmFyIHNjcm9sbEJvdHRvbSA9IHNjcm9sbFRvcCArIGhlaWdodDtcblxuICAgICAgICAgICAgICAgIGlmIChpdGVtVG9wIDwgc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICAgICAgICBuZXdUYXJnZXRBbGlnbiA9ICd0b3AnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbUJvdHRvbSA+IHNjcm9sbEJvdHRvbSkge1xuICAgICAgICAgICAgICAgICAgbmV3VGFyZ2V0QWxpZ24gPSAnYm90dG9tJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGFyZ2V0VG9wICE9PSBudWxsICYmIHRhcmdldFRvcCAhPT0gY29udGFpbmVyUmVmLmN1cnJlbnQuc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICBzeW5jU2Nyb2xsVG9wKHRhcmdldFRvcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFdlIHdpbGwgcmV0cnkgc2luY2UgZWxlbWVudCBtYXkgbm90IHN5bmMgaGVpZ2h0IGFzIGl0IGRlc2NyaWJlZFxuXG5cbiAgICAgICAgc2Nyb2xsUmVmLmN1cnJlbnQgPSAoMCwgX3JhZi5kZWZhdWx0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG5lZWRDb2xsZWN0SGVpZ2h0KSB7XG4gICAgICAgICAgICBjb2xsZWN0SGVpZ2h0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3luY1Njcm9sbCh0aW1lcyAtIDEsIG5ld1RhcmdldEFsaWduKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBzeW5jU2Nyb2xsKDMpO1xuICAgIH1cbiAgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9MaXN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9MaXN0XCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIF9kZWZhdWx0ID0gX0xpc3QuZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbi8vIEZpcmVmb3ggaGFzIGxvdyBwZXJmb3JtYW5jZSBvZiBtYXAuXG52YXIgQ2FjaGVNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDYWNoZU1hcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FjaGVNYXApO1xuXG4gICAgdGhpcy5tYXBzID0ge307XG4gICAgdGhpcy5tYXBzLnByb3RvdHlwZSA9IG51bGw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ2FjaGVNYXAsIFt7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdGhpcy5tYXBzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcHNba2V5XTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ2FjaGVNYXA7XG59KCk7XG5cbnZhciBfZGVmYXVsdCA9IENhY2hlTWFwO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldEluZGV4QnlTdGFydExvYyA9IGdldEluZGV4QnlTdGFydExvYztcbmV4cG9ydHMuZmluZExpc3REaWZmSW5kZXggPSBmaW5kTGlzdERpZmZJbmRleDtcblxuLyoqXG4gKiBHZXQgaW5kZXggd2l0aCBzcGVjaWZpYyBzdGFydCBpbmRleCBvbmUgYnkgb25lLiBlLmcuXG4gKiBtaW46IDMsIG1heDogOSwgc3RhcnQ6IDZcbiAqXG4gKiBSZXR1cm4gaW5kZXggaXM6XG4gKiBbMF06IDZcbiAqIFsxXTogN1xuICogWzJdOiA1XG4gKiBbM106IDhcbiAqIFs0XTogNFxuICogWzVdOiA5XG4gKiBbNl06IDNcbiAqL1xuZnVuY3Rpb24gZ2V0SW5kZXhCeVN0YXJ0TG9jKG1pbiwgbWF4LCBzdGFydCwgaW5kZXgpIHtcbiAgdmFyIGJlZm9yZUNvdW50ID0gc3RhcnQgLSBtaW47XG4gIHZhciBhZnRlckNvdW50ID0gbWF4IC0gc3RhcnQ7XG4gIHZhciBiYWxhbmNlQ291bnQgPSBNYXRoLm1pbihiZWZvcmVDb3VudCwgYWZ0ZXJDb3VudCkgKiAyOyAvLyBCYWxhbmNlXG5cbiAgaWYgKGluZGV4IDw9IGJhbGFuY2VDb3VudCkge1xuICAgIHZhciBzdGVwSW5kZXggPSBNYXRoLmZsb29yKGluZGV4IC8gMik7XG5cbiAgICBpZiAoaW5kZXggJSAyKSB7XG4gICAgICByZXR1cm4gc3RhcnQgKyBzdGVwSW5kZXggKyAxO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFydCAtIHN0ZXBJbmRleDtcbiAgfSAvLyBPbmUgaXMgb3V0IG9mIHJhbmdlXG5cblxuICBpZiAoYmVmb3JlQ291bnQgPiBhZnRlckNvdW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0IC0gKGluZGV4IC0gYWZ0ZXJDb3VudCk7XG4gIH1cblxuICByZXR1cm4gc3RhcnQgKyAoaW5kZXggLSBiZWZvcmVDb3VudCk7XG59XG4vKipcbiAqIFdlIGFzc3VtZSB0aGF0IDIgbGlzdCBoYXMgb25seSAxIGl0ZW0gZGlmZiBhbmQgb3RoZXJzIGtlZXBpbmcgdGhlIG9yZGVyLlxuICogU28gd2UgY2FuIHVzZSBkaWNob3RvbXkgYWxnb3JpdGhtIHRvIGZpbmQgY2hhbmdlZCBvbmUuXG4gKi9cblxuXG5mdW5jdGlvbiBmaW5kTGlzdERpZmZJbmRleChvcmlnaW5MaXN0LCB0YXJnZXRMaXN0LCBnZXRLZXkpIHtcbiAgdmFyIG9yaWdpbkxlbiA9IG9yaWdpbkxpc3QubGVuZ3RoO1xuICB2YXIgdGFyZ2V0TGVuID0gdGFyZ2V0TGlzdC5sZW5ndGg7XG4gIHZhciBzaG9ydExpc3Q7XG4gIHZhciBsb25nTGlzdDtcblxuICBpZiAob3JpZ2luTGVuID09PSAwICYmIHRhcmdldExlbiA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG9yaWdpbkxlbiA8IHRhcmdldExlbikge1xuICAgIHNob3J0TGlzdCA9IG9yaWdpbkxpc3Q7XG4gICAgbG9uZ0xpc3QgPSB0YXJnZXRMaXN0O1xuICB9IGVsc2Uge1xuICAgIHNob3J0TGlzdCA9IHRhcmdldExpc3Q7XG4gICAgbG9uZ0xpc3QgPSBvcmlnaW5MaXN0O1xuICB9XG5cbiAgdmFyIG5vdEV4aXN0S2V5ID0ge1xuICAgIF9fRU1QVFlfSVRFTV9fOiB0cnVlXG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0SXRlbUtleShpdGVtKSB7XG4gICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGdldEtleShpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm90RXhpc3RLZXk7XG4gIH0gLy8gTG9vcCB0byBmaW5kIGRpZmYgb25lXG5cblxuICB2YXIgZGlmZkluZGV4ID0gbnVsbDtcbiAgdmFyIG11bHRpcGxlID0gTWF0aC5hYnMob3JpZ2luTGVuIC0gdGFyZ2V0TGVuKSAhPT0gMTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdMaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIHNob3J0S2V5ID0gZ2V0SXRlbUtleShzaG9ydExpc3RbaV0pO1xuICAgIHZhciBsb25nS2V5ID0gZ2V0SXRlbUtleShsb25nTGlzdFtpXSk7XG5cbiAgICBpZiAoc2hvcnRLZXkgIT09IGxvbmdLZXkpIHtcbiAgICAgIGRpZmZJbmRleCA9IGk7XG4gICAgICBtdWx0aXBsZSA9IG11bHRpcGxlIHx8IHNob3J0S2V5ICE9PSBnZXRJdGVtS2V5KGxvbmdMaXN0W2kgKyAxXSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlmZkluZGV4ID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBpbmRleDogZGlmZkluZGV4LFxuICAgIG11bHRpcGxlOiBtdWx0aXBsZVxuICB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbnZhciBpc0ZGID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihuYXZpZ2F0b3IpKSA9PT0gJ29iamVjdCcgJiYgL0ZpcmVmb3gvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xudmFyIF9kZWZhdWx0ID0gaXNGRjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLGM9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMyxkPWI/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixlPWI/U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpOjYwMTA3LGY9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsZz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCxoPWI/U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpOjYwMTA5LGs9Yj9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCxsPWI/U3ltYm9sLmZvcihcInJlYWN0LmFzeW5jX21vZGVcIik6NjAxMTEsbT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5jb25jdXJyZW50X21vZGVcIik6NjAxMTEsbj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTo2MDExMixwPWI/U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpOjYwMTEzLHE9Yj9cblN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpOjYwMTIwLHI9Yj9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSx0PWI/U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik6NjAxMTYsdj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5ibG9ja1wiKTo2MDEyMSx3PWI/U3ltYm9sLmZvcihcInJlYWN0LmZ1bmRhbWVudGFsXCIpOjYwMTE3LHg9Yj9TeW1ib2wuZm9yKFwicmVhY3QucmVzcG9uZGVyXCIpOjYwMTE4LHk9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc2NvcGVcIik6NjAxMTk7XG5mdW5jdGlvbiB6KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciB1PWEuJCR0eXBlb2Y7c3dpdGNoKHUpe2Nhc2UgYzpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBsOmNhc2UgbTpjYXNlIGU6Y2FzZSBnOmNhc2UgZjpjYXNlIHA6cmV0dXJuIGE7ZGVmYXVsdDpzd2l0Y2goYT1hJiZhLiQkdHlwZW9mLGEpe2Nhc2UgazpjYXNlIG46Y2FzZSB0OmNhc2UgcjpjYXNlIGg6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gdX19Y2FzZSBkOnJldHVybiB1fX19ZnVuY3Rpb24gQShhKXtyZXR1cm4geihhKT09PW19ZXhwb3J0cy5Bc3luY01vZGU9bDtleHBvcnRzLkNvbmN1cnJlbnRNb2RlPW07ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aztleHBvcnRzLkNvbnRleHRQcm92aWRlcj1oO2V4cG9ydHMuRWxlbWVudD1jO2V4cG9ydHMuRm9yd2FyZFJlZj1uO2V4cG9ydHMuRnJhZ21lbnQ9ZTtleHBvcnRzLkxhenk9dDtleHBvcnRzLk1lbW89cjtleHBvcnRzLlBvcnRhbD1kO1xuZXhwb3J0cy5Qcm9maWxlcj1nO2V4cG9ydHMuU3RyaWN0TW9kZT1mO2V4cG9ydHMuU3VzcGVuc2U9cDtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpfHx6KGEpPT09bH07ZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlPUE7ZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWt9O2V4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ofTtleHBvcnRzLmlzRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Y307ZXhwb3J0cy5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ufTtleHBvcnRzLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1lfTtleHBvcnRzLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXR9O1xuZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1yfTtleHBvcnRzLmlzUG9ydGFsPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09ZH07ZXhwb3J0cy5pc1Byb2ZpbGVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09Z307ZXhwb3J0cy5pc1N0cmljdE1vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1mfTtleHBvcnRzLmlzU3VzcGVuc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1wfTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1lfHxhPT09bXx8YT09PWd8fGE9PT1mfHxhPT09cHx8YT09PXF8fFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJihhLiQkdHlwZW9mPT09dHx8YS4kJHR5cGVvZj09PXJ8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09a3x8YS4kJHR5cGVvZj09PW58fGEuJCR0eXBlb2Y9PT13fHxhLiQkdHlwZW9mPT09eHx8YS4kJHR5cGVvZj09PXl8fGEuJCR0eXBlb2Y9PT12KX07ZXhwb3J0cy50eXBlT2Y9ejtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgcnVudGltZSA9IChmdW5jdGlvbiAoZXhwb3J0cykge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfVxuICB0cnkge1xuICAgIC8vIElFIDggaGFzIGEgYnJva2VuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0aGF0IG9ubHkgd29ya3Mgb24gRE9NIG9iamVjdHMuXG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24ob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgZXhwb3J0cy53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoXG4gICAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgdG9TdHJpbmdUYWdTeW1ib2wsXG4gICAgXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICk7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIik7XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkge1xuICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7XG5cbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksXG4gICAgICBQcm9taXNlSW1wbFxuICAgICk7XG5cbiAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgLy8gTm90ZTogW1wicmV0dXJuXCJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgZGVmaW5lKEdwLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JcIik7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG5cbiAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZVxuICAvLyBvciBub3QsIHJldHVybiB0aGUgcnVudGltZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGUgdmFyaWFibGVcbiAgLy8gcmVnZW5lcmF0b3JSdW50aW1lIGluIHRoZSBvdXRlciBzY29wZSwgd2hpY2ggYWxsb3dzIHRoaXMgbW9kdWxlIHRvIGJlXG4gIC8vIGluamVjdGVkIGVhc2lseSBieSBgYmluL3JlZ2VuZXJhdG9yIC0taW5jbHVkZS1ydW50aW1lIHNjcmlwdC5qc2AuXG4gIHJldHVybiBleHBvcnRzO1xuXG59KFxuICAvLyBJZiB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGUsIHVzZSBtb2R1bGUuZXhwb3J0c1xuICAvLyBhcyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIG5hbWVzcGFjZS4gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbXB0eVxuICAvLyBvYmplY3QuIEVpdGhlciB3YXksIHRoZSByZXN1bHRpbmcgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplXG4gIC8vIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgdmFyaWFibGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuXG4gIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgPyBtb2R1bGUuZXhwb3J0cyA6IHt9XG4pKTtcblxudHJ5IHtcbiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbn0gY2F0Y2ggKGFjY2lkZW50YWxTdHJpY3RNb2RlKSB7XG4gIC8vIFRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgcnVubmluZyBpbiBzdHJpY3QgbW9kZSwgc28gdGhlIGFib3ZlXG4gIC8vIGFzc2lnbm1lbnQgc2hvdWxkIGFsd2F5cyB3b3JrIHVubGVzcyBzb21ldGhpbmcgaXMgbWlzY29uZmlndXJlZC4gSnVzdFxuICAvLyBpbiBjYXNlIHJ1bnRpbWUuanMgYWNjaWRlbnRhbGx5IHJ1bnMgaW4gc3RyaWN0IG1vZGUsIHdlIGNhbiBlc2NhcGVcbiAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsXG4gIC8vIGlmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgZm9yYmlkcyB1c2luZyBGdW5jdGlvbiwgYnV0IGluIHRoYXQgY2FzZVxuICAvLyB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGUgYWNjaWRlbnRhbCBzdHJpY3QgbW9kZSBwcm9ibGVtLiBJZlxuICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYVxuICAvLyBDU1AgdG8gZm9yYmlkIEZ1bmN0aW9uLCBhbmQgeW91J3JlIG5vdCB3aWxsaW5nIHRvIGZpeCBlaXRoZXIgb2YgdGhvc2VcbiAgLy8gcHJvYmxlbXMsIHBsZWFzZSBkZXRhaWwgeW91ciB1bmlxdWUgcHJlZGljYW1lbnQgaW4gYSBHaXRIdWIgaXNzdWUuXG4gIEZ1bmN0aW9uKFwiclwiLCBcInJlZ2VuZXJhdG9yUnVudGltZSA9IHJcIikocnVudGltZSk7XG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIChnbG9iYWwuUmVzaXplT2JzZXJ2ZXIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvKipcclxuICAgICAqIEEgY29sbGVjdGlvbiBvZiBzaGltcyB0aGF0IHByb3ZpZGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBFUzYgY29sbGVjdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogVGhlc2UgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgbWVhbnQgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBSZXNpemVPYnNlcnZlclxyXG4gICAgICogbW9kdWxlcyBhcyB0aGV5IGNvdmVyIG9ubHkgYSBsaW1pdGVkIHJhbmdlIG9mIHVzZSBjYXNlcy5cclxuICAgICAqL1xyXG4gICAgLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1qc2RvYywgdmFsaWQtanNkb2MgKi9cclxuICAgIHZhciBNYXBTaGltID0gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmV0dXJucyBpbmRleCBpbiBwcm92aWRlZCBhcnJheSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBrZXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5PEFycmF5Pn0gYXJyXHJcbiAgICAgICAgICogQHBhcmFtIHsqfSBrZXlcclxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIGdldEluZGV4KGFyciwga2V5KSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgYXJyLnNvbWUoZnVuY3Rpb24gKGVudHJ5LCBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5WzBdID09PSBrZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpbmRleDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsYXNzXzEoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9fZW50cmllc19fID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXNzXzEucHJvdG90eXBlLCBcInNpemVcIiwge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19lbnRyaWVzX18ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7Kn1cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGdldEluZGV4KHRoaXMuX19lbnRyaWVzX18sIGtleSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLl9fZW50cmllc19fW2luZGV4XTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeVsxXTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcclxuICAgICAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcclxuICAgICAgICAgICAgICAgIGlmICh+aW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fZW50cmllc19fW2luZGV4XVsxXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2VudHJpZXNfXy5wdXNoKFtrZXksIHZhbHVlXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5fX2VudHJpZXNfXztcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGdldEluZGV4KGVudHJpZXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICBpZiAofmluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQHBhcmFtIHsqfSBrZXlcclxuICAgICAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gISF+Z2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9fZW50cmllc19fLnNwbGljZSgwKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7Kn0gW2N0eD1udWxsXVxyXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGN0eCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0eCA9PT0gdm9pZCAwKSB7IGN0eCA9IG51bGw7IH1cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLl9fZW50cmllc19fOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IF9hW19pXTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGN0eCwgZW50cnlbMV0sIGVudHJ5WzBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIGNsYXNzXzE7XHJcbiAgICAgICAgfSgpKTtcclxuICAgIH0pKCk7XG5cbiAgICAvKipcclxuICAgICAqIERldGVjdHMgd2hldGhlciB3aW5kb3cgYW5kIGRvY3VtZW50IG9iamVjdHMgYXJlIGF2YWlsYWJsZSBpbiBjdXJyZW50IGVudmlyb25tZW50LlxyXG4gICAgICovXHJcbiAgICB2YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgPT09IGRvY3VtZW50O1xuXG4gICAgLy8gUmV0dXJucyBnbG9iYWwgb2JqZWN0IG9mIGEgY3VycmVudCBlbnZpcm9ubWVudC5cclxuICAgIHZhciBnbG9iYWwkMSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbC5NYXRoID09PSBNYXRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09PSBNYXRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT09IE1hdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXHJcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XHJcbiAgICB9KSgpO1xuXG4gICAgLyoqXHJcbiAgICAgKiBBIHNoaW0gZm9yIHRoZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgd2hpY2ggZmFsbHMgYmFjayB0byB0aGUgc2V0VGltZW91dCBpZlxyXG4gICAgICogZmlyc3Qgb25lIGlzIG5vdCBzdXBwb3J0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmVxdWVzdHMnIGlkZW50aWZpZXIuXHJcbiAgICAgKi9cclxuICAgIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUkMSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgLy8gSXQncyByZXF1aXJlZCB0byB1c2UgYSBib3VuZGVkIGZ1bmN0aW9uIGJlY2F1c2UgSUUgc29tZXRpbWVzIHRocm93c1xyXG4gICAgICAgICAgICAvLyBhbiBcIkludmFsaWQgY2FsbGluZyBvYmplY3RcIiBlcnJvciBpZiByQUYgaXMgaW52b2tlZCB3aXRob3V0IHRoZSBnbG9iYWxcclxuICAgICAgICAgICAgLy8gb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZS5cclxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKGdsb2JhbCQxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykgeyByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBjYWxsYmFjayhEYXRlLm5vdygpKTsgfSwgMTAwMCAvIDYwKTsgfTtcclxuICAgIH0pKCk7XG5cbiAgICAvLyBEZWZpbmVzIG1pbmltdW0gdGltZW91dCBiZWZvcmUgYWRkaW5nIGEgdHJhaWxpbmcgY2FsbC5cclxuICAgIHZhciB0cmFpbGluZ1RpbWVvdXQgPSAyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgd3JhcHBlciBmdW5jdGlvbiB3aGljaCBlbnN1cmVzIHRoYXQgcHJvdmlkZWQgY2FsbGJhY2sgd2lsbCBiZVxyXG4gICAgICogaW52b2tlZCBvbmx5IG9uY2UgZHVyaW5nIHRoZSBzcGVjaWZpZWQgZGVsYXkgcGVyaW9kLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUgZGVsYXkgcGVyaW9kLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IC0gRGVsYXkgYWZ0ZXIgd2hpY2ggdG8gaW52b2tlIGNhbGxiYWNrLlxyXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiB0aHJvdHRsZSAoY2FsbGJhY2ssIGRlbGF5KSB7XHJcbiAgICAgICAgdmFyIGxlYWRpbmdDYWxsID0gZmFsc2UsIHRyYWlsaW5nQ2FsbCA9IGZhbHNlLCBsYXN0Q2FsbFRpbWUgPSAwO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludm9rZXMgdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBzY2hlZHVsZXMgbmV3IGludm9jYXRpb24gaWZcclxuICAgICAgICAgKiB0aGUgXCJwcm94eVwiIHdhcyBjYWxsZWQgZHVyaW5nIGN1cnJlbnQgcmVxdWVzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIHJlc29sdmVQZW5kaW5nKCkge1xyXG4gICAgICAgICAgICBpZiAobGVhZGluZ0NhbGwpIHtcclxuICAgICAgICAgICAgICAgIGxlYWRpbmdDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0cmFpbGluZ0NhbGwpIHtcclxuICAgICAgICAgICAgICAgIHByb3h5KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2FsbGJhY2sgaW52b2tlZCBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LiBJdCB3aWxsIGZ1cnRoZXIgcG9zdHBvbmVcclxuICAgICAgICAgKiBpbnZvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBkZWxlZ2F0aW5nIGl0IHRvIHRoZVxyXG4gICAgICAgICAqIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIHRpbWVvdXRDYWxsYmFjaygpIHtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJDEocmVzb2x2ZVBlbmRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTY2hlZHVsZXMgaW52b2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBmdW5jdGlvbiBwcm94eSgpIHtcclxuICAgICAgICAgICAgdmFyIHRpbWVTdGFtcCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIGlmIChsZWFkaW5nQ2FsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVqZWN0IGltbWVkaWF0ZWx5IGZvbGxvd2luZyBjYWxscy5cclxuICAgICAgICAgICAgICAgIGlmICh0aW1lU3RhbXAgLSBsYXN0Q2FsbFRpbWUgPCB0cmFpbGluZ1RpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBuZXcgY2FsbCB0byBiZSBpbiBpbnZva2VkIHdoZW4gdGhlIHBlbmRpbmcgb25lIGlzIHJlc29sdmVkLlxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIFwidHJhbnNpdGlvbnNcIiB3aGljaCBuZXZlciBhY3R1YWxseSBzdGFydFxyXG4gICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgc28gdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCB3ZSBtaWdodCBtaXNzIG9uZSBpZiBjaGFuZ2VcclxuICAgICAgICAgICAgICAgIC8vIGhhcHBlbnMgYW1pZHMgdGhlIHBlbmRpbmcgaW52b2NhdGlvbi5cclxuICAgICAgICAgICAgICAgIHRyYWlsaW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZWFkaW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0cmFpbGluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodGltZW91dENhbGxiYWNrLCBkZWxheSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdENhbGxUaW1lID0gdGltZVN0YW1wO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJveHk7XHJcbiAgICB9XG5cbiAgICAvLyBNaW5pbXVtIGRlbGF5IGJlZm9yZSBpbnZva2luZyB0aGUgdXBkYXRlIG9mIG9ic2VydmVycy5cclxuICAgIHZhciBSRUZSRVNIX0RFTEFZID0gMjA7XHJcbiAgICAvLyBBIGxpc3Qgb2Ygc3Vic3RyaW5ncyBvZiBDU1MgcHJvcGVydGllcyB1c2VkIHRvIGZpbmQgdHJhbnNpdGlvbiBldmVudHMgdGhhdFxyXG4gICAgLy8gbWlnaHQgYWZmZWN0IGRpbWVuc2lvbnMgb2Ygb2JzZXJ2ZWQgZWxlbWVudHMuXHJcbiAgICB2YXIgdHJhbnNpdGlvbktleXMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCcsICd3aWR0aCcsICdoZWlnaHQnLCAnc2l6ZScsICd3ZWlnaHQnXTtcclxuICAgIC8vIENoZWNrIGlmIE11dGF0aW9uT2JzZXJ2ZXIgaXMgYXZhaWxhYmxlLlxyXG4gICAgdmFyIG11dGF0aW9uT2JzZXJ2ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCc7XHJcbiAgICAvKipcclxuICAgICAqIFNpbmdsZXRvbiBjb250cm9sbGVyIGNsYXNzIHdoaWNoIGhhbmRsZXMgdXBkYXRlcyBvZiBSZXNpemVPYnNlcnZlciBpbnN0YW5jZXMuXHJcbiAgICAgKi9cclxuICAgIHZhciBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlcigpIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIERPTSBsaXN0ZW5lcnMgaGF2ZSBiZWVuIGFkZGVkLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAcHJpdmF0ZSB7Ym9vbGVhbn1cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGVkXyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVGVsbHMgdGhhdCBjb250cm9sbGVyIGhhcyBzdWJzY3JpYmVkIGZvciBNdXRhdGlvbiBFdmVudHMuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEBwcml2YXRlIHtib29sZWFufVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGhpcy5tdXRhdGlvbkV2ZW50c0FkZGVkXyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogS2VlcHMgcmVmZXJlbmNlIHRvIHRoZSBpbnN0YW5jZSBvZiBNdXRhdGlvbk9ic2VydmVyLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAcHJpdmF0ZSB7TXV0YXRpb25PYnNlcnZlcn1cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbnVsbDtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgb2JzZXJ2ZXJzLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAcHJpdmF0ZSB7QXJyYXk8UmVzaXplT2JzZXJ2ZXJTUEk+fVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnNfID0gW107XHJcbiAgICAgICAgICAgIHRoaXMub25UcmFuc2l0aW9uRW5kXyA9IHRoaXMub25UcmFuc2l0aW9uRW5kXy5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2ggPSB0aHJvdHRsZSh0aGlzLnJlZnJlc2guYmluZCh0aGlzKSwgUkVGUkVTSF9ERUxBWSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFkZHMgb2JzZXJ2ZXIgdG8gb2JzZXJ2ZXJzIGxpc3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyU1BJfSBvYnNlcnZlciAtIE9ic2VydmVyIHRvIGJlIGFkZGVkLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUuYWRkT2JzZXJ2ZXIgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcclxuICAgICAgICAgICAgaWYgKCF+dGhpcy5vYnNlcnZlcnNfLmluZGV4T2Yob2JzZXJ2ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVyc18ucHVzaChvYnNlcnZlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQWRkIGxpc3RlbmVycyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBhZGRlZCB5ZXQuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWRfKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RfKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlbW92ZXMgb2JzZXJ2ZXIgZnJvbSBvYnNlcnZlcnMgbGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJTUEl9IG9ic2VydmVyIC0gT2JzZXJ2ZXIgdG8gYmUgcmVtb3ZlZC5cclxuICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLnJlbW92ZU9ic2VydmVyID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyc187XHJcbiAgICAgICAgICAgIHZhciBpbmRleCA9IG9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIG9ic2VydmVyIGlmIGl0J3MgcHJlc2VudCBpbiByZWdpc3RyeS5cclxuICAgICAgICAgICAgaWYgKH5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVycyBpZiBjb250cm9sbGVyIGhhcyBubyBjb25uZWN0ZWQgb2JzZXJ2ZXJzLlxyXG4gICAgICAgICAgICBpZiAoIW9ic2VydmVycy5sZW5ndGggJiYgdGhpcy5jb25uZWN0ZWRfKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RfKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludm9rZXMgdGhlIHVwZGF0ZSBvZiBvYnNlcnZlcnMuIEl0IHdpbGwgY29udGludWUgcnVubmluZyB1cGRhdGVzIGluc29mYXJcclxuICAgICAgICAgKiBpdCBkZXRlY3RzIGNoYW5nZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGFuZ2VzRGV0ZWN0ZWQgPSB0aGlzLnVwZGF0ZU9ic2VydmVyc18oKTtcclxuICAgICAgICAgICAgLy8gQ29udGludWUgcnVubmluZyB1cGRhdGVzIGlmIGNoYW5nZXMgaGF2ZSBiZWVuIGRldGVjdGVkIGFzIHRoZXJlIG1pZ2h0XHJcbiAgICAgICAgICAgIC8vIGJlIGZ1dHVyZSBvbmVzIGNhdXNlZCBieSBDU1MgdHJhbnNpdGlvbnMuXHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzRGV0ZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBVcGRhdGVzIGV2ZXJ5IG9ic2VydmVyIGZyb20gb2JzZXJ2ZXJzIGxpc3QgYW5kIG5vdGlmaWVzIHRoZW0gb2YgcXVldWVkXHJcbiAgICAgICAgICogZW50cmllcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgXCJ0cnVlXCIgaWYgYW55IG9ic2VydmVyIGhhcyBkZXRlY3RlZCBjaGFuZ2VzIGluXHJcbiAgICAgICAgICogICAgICBkaW1lbnNpb25zIG9mIGl0J3MgZWxlbWVudHMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS51cGRhdGVPYnNlcnZlcnNfID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBDb2xsZWN0IG9ic2VydmVycyB0aGF0IGhhdmUgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAgICAgICAgdmFyIGFjdGl2ZU9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzXy5maWx0ZXIoZnVuY3Rpb24gKG9ic2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZ2F0aGVyQWN0aXZlKCksIG9ic2VydmVyLmhhc0FjdGl2ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gRGVsaXZlciBub3RpZmljYXRpb25zIGluIGEgc2VwYXJhdGUgY3ljbGUgaW4gb3JkZXIgdG8gYXZvaWQgYW55XHJcbiAgICAgICAgICAgIC8vIGNvbGxpc2lvbnMgYmV0d2VlbiBvYnNlcnZlcnMsIGUuZy4gd2hlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2ZcclxuICAgICAgICAgICAgLy8gUmVzaXplT2JzZXJ2ZXIgYXJlIHRyYWNraW5nIHRoZSBzYW1lIGVsZW1lbnQgYW5kIHRoZSBjYWxsYmFjayBvZiBvbmVcclxuICAgICAgICAgICAgLy8gb2YgdGhlbSBjaGFuZ2VzIGNvbnRlbnQgZGltZW5zaW9ucyBvZiB0aGUgb2JzZXJ2ZWQgdGFyZ2V0LiBTb21ldGltZXNcclxuICAgICAgICAgICAgLy8gdGhpcyBtYXkgcmVzdWx0IGluIG5vdGlmaWNhdGlvbnMgYmVpbmcgYmxvY2tlZCBmb3IgdGhlIHJlc3Qgb2Ygb2JzZXJ2ZXJzLlxyXG4gICAgICAgICAgICBhY3RpdmVPYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2ZXIpIHsgcmV0dXJuIG9ic2VydmVyLmJyb2FkY2FzdEFjdGl2ZSgpOyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZU9ic2VydmVycy5sZW5ndGggPiAwO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW5pdGlhbGl6ZXMgRE9NIGxpc3RlbmVycy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5jb25uZWN0XyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy8gRG8gbm90aGluZyBpZiBydW5uaW5nIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQgb3IgaWYgbGlzdGVuZXJzXHJcbiAgICAgICAgICAgIC8vIGhhdmUgYmVlbiBhbHJlYWR5IGFkZGVkLlxyXG4gICAgICAgICAgICBpZiAoIWlzQnJvd3NlciB8fCB0aGlzLmNvbm5lY3RlZF8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBTdWJzY3JpcHRpb24gdG8gdGhlIFwiVHJhbnNpdGlvbmVuZFwiIGV2ZW50IGlzIHVzZWQgYXMgYSB3b3JrYXJvdW5kIGZvclxyXG4gICAgICAgICAgICAvLyBkZWxheWVkIHRyYW5zaXRpb25zLiBUaGlzIHdheSBpdCdzIHBvc3NpYmxlIHRvIGNhcHR1cmUgYXQgbGVhc3QgdGhlXHJcbiAgICAgICAgICAgIC8vIGZpbmFsIHN0YXRlIG9mIGFuIGVsZW1lbnQuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLm9uVHJhbnNpdGlvbkVuZF8pO1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZWZyZXNoKTtcclxuICAgICAgICAgICAgaWYgKG11dGF0aW9uT2JzZXJ2ZXJTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5yZWZyZXNoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfLm9ic2VydmUoZG9jdW1lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NU3VidHJlZU1vZGlmaWVkJywgdGhpcy5yZWZyZXNoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGVkXyA9IHRydWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZW1vdmVzIERPTSBsaXN0ZW5lcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUuZGlzY29ubmVjdF8gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgcnVubmluZyBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50IG9yIGlmIGxpc3RlbmVyc1xyXG4gICAgICAgICAgICAvLyBoYXZlIGJlZW4gYWxyZWFkeSByZW1vdmVkLlxyXG4gICAgICAgICAgICBpZiAoIWlzQnJvd3NlciB8fCAhdGhpcy5jb25uZWN0ZWRfKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMub25UcmFuc2l0aW9uRW5kXyk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlZnJlc2gpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5tdXRhdGlvbkV2ZW50c0FkZGVkXykge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NU3VidHJlZU1vZGlmaWVkJywgdGhpcy5yZWZyZXNoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXyA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWRfID0gZmFsc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBcIlRyYW5zaXRpb25lbmRcIiBldmVudCBoYW5kbGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zaXRpb25FdmVudH0gZXZlbnRcclxuICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLm9uVHJhbnNpdGlvbkVuZF8gPSBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgdmFyIF9iID0gX2EucHJvcGVydHlOYW1lLCBwcm9wZXJ0eU5hbWUgPSBfYiA9PT0gdm9pZCAwID8gJycgOiBfYjtcclxuICAgICAgICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgdHJhbnNpdGlvbiBtYXkgYWZmZWN0IGRpbWVuc2lvbnMgb2YgYW4gZWxlbWVudC5cclxuICAgICAgICAgICAgdmFyIGlzUmVmbG93UHJvcGVydHkgPSB0cmFuc2l0aW9uS2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhIX5wcm9wZXJ0eU5hbWUuaW5kZXhPZihrZXkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKGlzUmVmbG93UHJvcGVydHkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZXR1cm5zIGluc3RhbmNlIG9mIHRoZSBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcmV0dXJucyB7UmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlXykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZV8gPSBuZXcgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VfO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG9sZHMgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sbGVyJ3MgaW5zdGFuY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7UmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5pbnN0YW5jZV8gPSBudWxsO1xyXG4gICAgICAgIHJldHVybiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXI7XHJcbiAgICB9KCkpO1xuXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIG5vbi13cml0YWJsZS9lbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHByb3ZpZGVkIHRhcmdldCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCAtIE9iamVjdCBmb3Igd2hpY2ggdG8gZGVmaW5lIHByb3BlcnRpZXMuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBQcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUYXJnZXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB2YXIgZGVmaW5lQ29uZmlndXJhYmxlID0gKGZ1bmN0aW9uICh0YXJnZXQsIHByb3BzKSB7XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IE9iamVjdC5rZXlzKHByb3BzKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdmFyIGtleSA9IF9hW19pXTtcclxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcHNba2V5XSxcclxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xyXG4gICAgfSk7XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxyXG4gICAgICogQHJldHVybnMge09iamVjdH1cclxuICAgICAqL1xyXG4gICAgdmFyIGdldFdpbmRvd09mID0gKGZ1bmN0aW9uICh0YXJnZXQpIHtcclxuICAgICAgICAvLyBBc3N1bWUgdGhhdCB0aGUgZWxlbWVudCBpcyBhbiBpbnN0YW5jZSBvZiBOb2RlLCB3aGljaCBtZWFucyB0aGF0IGl0XHJcbiAgICAgICAgLy8gaGFzIHRoZSBcIm93bmVyRG9jdW1lbnRcIiBwcm9wZXJ0eSBmcm9tIHdoaWNoIHdlIGNhbiByZXRyaWV2ZSBhXHJcbiAgICAgICAgLy8gY29ycmVzcG9uZGluZyBnbG9iYWwgb2JqZWN0LlxyXG4gICAgICAgIHZhciBvd25lckdsb2JhbCA9IHRhcmdldCAmJiB0YXJnZXQub3duZXJEb2N1bWVudCAmJiB0YXJnZXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcclxuICAgICAgICAvLyBSZXR1cm4gdGhlIGxvY2FsIGdsb2JhbCBvYmplY3QgaWYgaXQncyBub3QgcG9zc2libGUgZXh0cmFjdCBvbmUgZnJvbVxyXG4gICAgICAgIC8vIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICAgICAgcmV0dXJuIG93bmVyR2xvYmFsIHx8IGdsb2JhbCQxO1xyXG4gICAgfSk7XG5cbiAgICAvLyBQbGFjZWhvbGRlciBvZiBhbiBlbXB0eSBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgIHZhciBlbXB0eVJlY3QgPSBjcmVhdGVSZWN0SW5pdCgwLCAwLCAwLCAwKTtcclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgcHJvdmlkZWQgc3RyaW5nIHRvIGEgbnVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHRvRmxvYXQodmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgfHwgMDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRXh0cmFjdHMgYm9yZGVycyBzaXplIGZyb20gcHJvdmlkZWQgc3R5bGVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Q1NTU3R5bGVEZWNsYXJhdGlvbn0gc3R5bGVzXHJcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gcG9zaXRpb25zIC0gQm9yZGVycyBwb3NpdGlvbnMgKHRvcCwgcmlnaHQsIC4uLilcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGdldEJvcmRlcnNTaXplKHN0eWxlcykge1xyXG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbnNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwb3NpdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChzaXplLCBwb3NpdGlvbikge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBzdHlsZXNbJ2JvcmRlci0nICsgcG9zaXRpb24gKyAnLXdpZHRoJ107XHJcbiAgICAgICAgICAgIHJldHVybiBzaXplICsgdG9GbG9hdCh2YWx1ZSk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhY3RzIHBhZGRpbmdzIHNpemVzIGZyb20gcHJvdmlkZWQgc3R5bGVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Q1NTU3R5bGVEZWNsYXJhdGlvbn0gc3R5bGVzXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBQYWRkaW5ncyBib3guXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGdldFBhZGRpbmdzKHN0eWxlcykge1xyXG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddO1xyXG4gICAgICAgIHZhciBwYWRkaW5ncyA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgcG9zaXRpb25zXzEgPSBwb3NpdGlvbnM7IF9pIDwgcG9zaXRpb25zXzEubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IHBvc2l0aW9uc18xW19pXTtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gc3R5bGVzWydwYWRkaW5nLScgKyBwb3NpdGlvbl07XHJcbiAgICAgICAgICAgIHBhZGRpbmdzW3Bvc2l0aW9uXSA9IHRvRmxvYXQodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFkZGluZ3M7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgY29udGVudCByZWN0YW5nbGUgb2YgcHJvdmlkZWQgU1ZHIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtTVkdHcmFwaGljc0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgY29udGVudCByZWN0YW5nbGUgb2Ygd2hpY2ggbmVlZHNcclxuICAgICAqICAgICAgdG8gYmUgY2FsY3VsYXRlZC5cclxuICAgICAqIEByZXR1cm5zIHtET01SZWN0SW5pdH1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZ2V0U1ZHQ29udGVudFJlY3QodGFyZ2V0KSB7XHJcbiAgICAgICAgdmFyIGJib3ggPSB0YXJnZXQuZ2V0QkJveCgpO1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVSZWN0SW5pdCgwLCAwLCBiYm94LndpZHRoLCBiYm94LmhlaWdodCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgY29udGVudCByZWN0YW5nbGUgb2YgcHJvdmlkZWQgSFRNTEVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCBmb3Igd2hpY2ggdG8gY2FsY3VsYXRlIHRoZSBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAqIEByZXR1cm5zIHtET01SZWN0SW5pdH1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRDb250ZW50UmVjdCh0YXJnZXQpIHtcclxuICAgICAgICAvLyBDbGllbnQgd2lkdGggJiBoZWlnaHQgcHJvcGVydGllcyBjYW4ndCBiZVxyXG4gICAgICAgIC8vIHVzZWQgZXhjbHVzaXZlbHkgYXMgdGhleSBwcm92aWRlIHJvdW5kZWQgdmFsdWVzLlxyXG4gICAgICAgIHZhciBjbGllbnRXaWR0aCA9IHRhcmdldC5jbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0ID0gdGFyZ2V0LmNsaWVudEhlaWdodDtcclxuICAgICAgICAvLyBCeSB0aGlzIGNvbmRpdGlvbiB3ZSBjYW4gY2F0Y2ggYWxsIG5vbi1yZXBsYWNlZCBpbmxpbmUsIGhpZGRlbiBhbmRcclxuICAgICAgICAvLyBkZXRhY2hlZCBlbGVtZW50cy4gVGhvdWdoIGVsZW1lbnRzIHdpdGggd2lkdGggJiBoZWlnaHQgcHJvcGVydGllcyBsZXNzXHJcbiAgICAgICAgLy8gdGhhbiAwLjUgd2lsbCBiZSBkaXNjYXJkZWQgYXMgd2VsbC5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFdpdGhvdXQgaXQgd2Ugd291bGQgbmVlZCB0byBpbXBsZW1lbnQgc2VwYXJhdGUgbWV0aG9kcyBmb3IgZWFjaCBvZlxyXG4gICAgICAgIC8vIHRob3NlIGNhc2VzIGFuZCBpdCdzIG5vdCBwb3NzaWJsZSB0byBwZXJmb3JtIGEgcHJlY2lzZSBhbmQgcGVyZm9ybWFuY2VcclxuICAgICAgICAvLyBlZmZlY3RpdmUgdGVzdCBmb3IgaGlkZGVuIGVsZW1lbnRzLiBFLmcuIGV2ZW4galF1ZXJ5J3MgJzp2aXNpYmxlJyBmaWx0ZXJcclxuICAgICAgICAvLyBnaXZlcyB3cm9uZyByZXN1bHRzIGZvciBlbGVtZW50cyB3aXRoIHdpZHRoICYgaGVpZ2h0IGxlc3MgdGhhbiAwLjUuXHJcbiAgICAgICAgaWYgKCFjbGllbnRXaWR0aCAmJiAhY2xpZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbXB0eVJlY3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzdHlsZXMgPSBnZXRXaW5kb3dPZih0YXJnZXQpLmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KTtcclxuICAgICAgICB2YXIgcGFkZGluZ3MgPSBnZXRQYWRkaW5ncyhzdHlsZXMpO1xyXG4gICAgICAgIHZhciBob3JpelBhZCA9IHBhZGRpbmdzLmxlZnQgKyBwYWRkaW5ncy5yaWdodDtcclxuICAgICAgICB2YXIgdmVydFBhZCA9IHBhZGRpbmdzLnRvcCArIHBhZGRpbmdzLmJvdHRvbTtcclxuICAgICAgICAvLyBDb21wdXRlZCBzdHlsZXMgb2Ygd2lkdGggJiBoZWlnaHQgYXJlIGJlaW5nIHVzZWQgYmVjYXVzZSB0aGV5IGFyZSB0aGVcclxuICAgICAgICAvLyBvbmx5IGRpbWVuc2lvbnMgYXZhaWxhYmxlIHRvIEpTIHRoYXQgY29udGFpbiBub24tcm91bmRlZCB2YWx1ZXMuIEl0IGNvdWxkXHJcbiAgICAgICAgLy8gYmUgcG9zc2libGUgdG8gdXRpbGl6ZSB0aGUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlmIG9ubHkgaXQncyBkYXRhIHdhc24ndFxyXG4gICAgICAgIC8vIGFmZmVjdGVkIGJ5IENTUyB0cmFuc2Zvcm1hdGlvbnMgbGV0IGFsb25lIHBhZGRpbmdzLCBib3JkZXJzIGFuZCBzY3JvbGwgYmFycy5cclxuICAgICAgICB2YXIgd2lkdGggPSB0b0Zsb2F0KHN0eWxlcy53aWR0aCksIGhlaWdodCA9IHRvRmxvYXQoc3R5bGVzLmhlaWdodCk7XHJcbiAgICAgICAgLy8gV2lkdGggJiBoZWlnaHQgaW5jbHVkZSBwYWRkaW5ncyBhbmQgYm9yZGVycyB3aGVuIHRoZSAnYm9yZGVyLWJveCcgYm94XHJcbiAgICAgICAgLy8gbW9kZWwgaXMgYXBwbGllZCAoZXhjZXB0IGZvciBJRSkuXHJcbiAgICAgICAgaWYgKHN0eWxlcy5ib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xyXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgcmVxdWlyZWQgdG8gaGFuZGxlIEludGVybmV0IEV4cGxvcmVyIHdoaWNoXHJcbiAgICAgICAgICAgIC8vIGRvZXNuJ3QgaW5jbHVkZSBwYWRkaW5ncyBhbmQgYm9yZGVycyB0byBjb21wdXRlZCBDU1MgZGltZW5zaW9ucy5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gV2UgY2FuIHNheSB0aGF0IGlmIENTUyBkaW1lbnNpb25zICsgcGFkZGluZ3MgYXJlIGVxdWFsIHRvIHRoZSBcImNsaWVudFwiXHJcbiAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgdGhlbiBpdCdzIGVpdGhlciBJRSwgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZCB0byBzdWJ0cmFjdFxyXG4gICAgICAgICAgICAvLyBhbnl0aGluZywgb3IgYW4gZWxlbWVudCBtZXJlbHkgZG9lc24ndCBoYXZlIHBhZGRpbmdzL2JvcmRlcnMgc3R5bGVzLlxyXG4gICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh3aWR0aCArIGhvcml6UGFkKSAhPT0gY2xpZW50V2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ2xlZnQnLCAncmlnaHQnKSArIGhvcml6UGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKGhlaWdodCArIHZlcnRQYWQpICE9PSBjbGllbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIGhlaWdodCAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICd0b3AnLCAnYm90dG9tJykgKyB2ZXJ0UGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEZvbGxvd2luZyBzdGVwcyBjYW4ndCBiZSBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudCdzIHJvb3QgZWxlbWVudCBhcyBpdHNcclxuICAgICAgICAvLyBjbGllbnRbV2lkdGgvSGVpZ2h0XSBwcm9wZXJ0aWVzIHJlcHJlc2VudCB2aWV3cG9ydCBhcmVhIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgICAgLy8gQmVzaWRlcywgaXQncyBhcyB3ZWxsIG5vdCBuZWNlc3NhcnkgYXMgdGhlIDxodG1sPiBpdHNlbGYgbmVpdGhlciBoYXNcclxuICAgICAgICAvLyByZW5kZXJlZCBzY3JvbGwgYmFycyBub3IgaXQgY2FuIGJlIGNsaXBwZWQuXHJcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50RWxlbWVudCh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIC8vIEluIHNvbWUgYnJvd3NlcnMgKG9ubHkgaW4gRmlyZWZveCwgYWN0dWFsbHkpIENTUyB3aWR0aCAmIGhlaWdodFxyXG4gICAgICAgICAgICAvLyBpbmNsdWRlIHNjcm9sbCBiYXJzIHNpemUgd2hpY2ggY2FuIGJlIHJlbW92ZWQgYXQgdGhpcyBzdGVwIGFzIHNjcm9sbFxyXG4gICAgICAgICAgICAvLyBiYXJzIGFyZSB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gcm91bmRlZCBkaW1lbnNpb25zICsgcGFkZGluZ3NcclxuICAgICAgICAgICAgLy8gYW5kIFwiY2xpZW50XCIgcHJvcGVydGllcywgdGhvdWdoIHRoYXQgaXMgbm90IGFsd2F5cyB0cnVlIGluIENocm9tZS5cclxuICAgICAgICAgICAgdmFyIHZlcnRTY3JvbGxiYXIgPSBNYXRoLnJvdW5kKHdpZHRoICsgaG9yaXpQYWQpIC0gY2xpZW50V2lkdGg7XHJcbiAgICAgICAgICAgIHZhciBob3JpelNjcm9sbGJhciA9IE1hdGgucm91bmQoaGVpZ2h0ICsgdmVydFBhZCkgLSBjbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgIC8vIENocm9tZSBoYXMgYSByYXRoZXIgd2VpcmQgcm91bmRpbmcgb2YgXCJjbGllbnRcIiBwcm9wZXJ0aWVzLlxyXG4gICAgICAgICAgICAvLyBFLmcuIGZvciBhbiBlbGVtZW50IHdpdGggY29udGVudCB3aWR0aCBvZiAzMTQuMnB4IGl0IHNvbWV0aW1lcyBnaXZlc1xyXG4gICAgICAgICAgICAvLyB0aGUgY2xpZW50IHdpZHRoIG9mIDMxNXB4IGFuZCBmb3IgdGhlIHdpZHRoIG9mIDMxNC43cHggaXQgbWF5IGdpdmVcclxuICAgICAgICAgICAgLy8gMzE0cHguIEFuZCBpdCBkb2Vzbid0IGhhcHBlbiBhbGwgdGhlIHRpbWUuIFNvIGp1c3QgaWdub3JlIHRoaXMgZGVsdGFcclxuICAgICAgICAgICAgLy8gYXMgYSBub24tcmVsZXZhbnQuXHJcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh2ZXJ0U2Nyb2xsYmFyKSAhPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGggLT0gdmVydFNjcm9sbGJhcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoaG9yaXpTY3JvbGxiYXIpICE9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgLT0gaG9yaXpTY3JvbGxiYXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3RJbml0KHBhZGRpbmdzLmxlZnQsIHBhZGRpbmdzLnRvcCwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGV0aGVyIHByb3ZpZGVkIGVsZW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNWR0dyYXBoaWNzRWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgY2hlY2tlZC5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICB2YXIgaXNTVkdHcmFwaGljc0VsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIFNvbWUgYnJvd3NlcnMsIG5hbWVseSBJRSBhbmQgRWRnZSwgZG9uJ3QgaGF2ZSB0aGUgU1ZHR3JhcGhpY3NFbGVtZW50XHJcbiAgICAgICAgLy8gaW50ZXJmYWNlLlxyXG4gICAgICAgIGlmICh0eXBlb2YgU1ZHR3JhcGhpY3NFbGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkgeyByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5TVkdHcmFwaGljc0VsZW1lbnQ7IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIGl0J3Mgc28sIHRoZW4gY2hlY2sgdGhhdCBlbGVtZW50IGlzIGF0IGxlYXN0IGFuIGluc3RhbmNlIG9mIHRoZVxyXG4gICAgICAgIC8vIFNWR0VsZW1lbnQgYW5kIHRoYXQgaXQgaGFzIHRoZSBcImdldEJCb3hcIiBtZXRob2QuXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7IHJldHVybiAodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5TVkdFbGVtZW50ICYmXHJcbiAgICAgICAgICAgIHR5cGVvZiB0YXJnZXQuZ2V0QkJveCA9PT0gJ2Z1bmN0aW9uJyk7IH07XHJcbiAgICB9KSgpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3Mgd2hldGhlciBwcm92aWRlZCBlbGVtZW50IGlzIGEgZG9jdW1lbnQgZWxlbWVudCAoPGh0bWw+KS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgY2hlY2tlZC5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBpc0RvY3VtZW50RWxlbWVudCh0YXJnZXQpIHtcclxuICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSBnZXRXaW5kb3dPZih0YXJnZXQpLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyBhbiBhcHByb3ByaWF0ZSBjb250ZW50IHJlY3RhbmdsZSBmb3IgcHJvdmlkZWQgaHRtbCBvciBzdmcgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgY29udGVudCByZWN0YW5nbGUgb2Ygd2hpY2ggbmVlZHMgdG8gYmUgY2FsY3VsYXRlZC5cclxuICAgICAqIEByZXR1cm5zIHtET01SZWN0SW5pdH1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZ2V0Q29udGVudFJlY3QodGFyZ2V0KSB7XHJcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVtcHR5UmVjdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzU1ZHR3JhcGhpY3NFbGVtZW50KHRhcmdldCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdldFNWR0NvbnRlbnRSZWN0KHRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBnZXRIVE1MRWxlbWVudENvbnRlbnRSZWN0KHRhcmdldCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgcmVjdGFuZ2xlIHdpdGggYW4gaW50ZXJmYWNlIG9mIHRoZSBET01SZWN0UmVhZE9ubHkuXHJcbiAgICAgKiBTcGVjOiBodHRwczovL2RyYWZ0cy5meHRmLm9yZy9nZW9tZXRyeS8jZG9tcmVjdHJlYWRvbmx5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtET01SZWN0SW5pdH0gcmVjdEluaXQgLSBPYmplY3Qgd2l0aCByZWN0YW5nbGUncyB4L3kgY29vcmRpbmF0ZXMgYW5kIGRpbWVuc2lvbnMuXHJcbiAgICAgKiBAcmV0dXJucyB7RE9NUmVjdFJlYWRPbmx5fVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVSZWFkT25seVJlY3QoX2EpIHtcclxuICAgICAgICB2YXIgeCA9IF9hLngsIHkgPSBfYS55LCB3aWR0aCA9IF9hLndpZHRoLCBoZWlnaHQgPSBfYS5oZWlnaHQ7XHJcbiAgICAgICAgLy8gSWYgRE9NUmVjdFJlYWRPbmx5IGlzIGF2YWlsYWJsZSB1c2UgaXQgYXMgYSBwcm90b3R5cGUgZm9yIHRoZSByZWN0YW5nbGUuXHJcbiAgICAgICAgdmFyIENvbnN0ciA9IHR5cGVvZiBET01SZWN0UmVhZE9ubHkgIT09ICd1bmRlZmluZWQnID8gRE9NUmVjdFJlYWRPbmx5IDogT2JqZWN0O1xyXG4gICAgICAgIHZhciByZWN0ID0gT2JqZWN0LmNyZWF0ZShDb25zdHIucHJvdG90eXBlKTtcclxuICAgICAgICAvLyBSZWN0YW5nbGUncyBwcm9wZXJ0aWVzIGFyZSBub3Qgd3JpdGFibGUgYW5kIG5vbi1lbnVtZXJhYmxlLlxyXG4gICAgICAgIGRlZmluZUNvbmZpZ3VyYWJsZShyZWN0LCB7XHJcbiAgICAgICAgICAgIHg6IHgsIHk6IHksIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgICAgIHRvcDogeSxcclxuICAgICAgICAgICAgcmlnaHQ6IHggKyB3aWR0aCxcclxuICAgICAgICAgICAgYm90dG9tOiBoZWlnaHQgKyB5LFxyXG4gICAgICAgICAgICBsZWZ0OiB4XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlY3Q7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgRE9NUmVjdEluaXQgb2JqZWN0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBkaW1lbnNpb25zIGFuZCB0aGUgeC95IGNvb3JkaW5hdGVzLlxyXG4gICAgICogU3BlYzogaHR0cHM6Ly9kcmFmdHMuZnh0Zi5vcmcvZ2VvbWV0cnkvI2RpY3RkZWYtZG9tcmVjdGluaXRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFggY29vcmRpbmF0ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gWSBjb29yZGluYXRlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gUmVjdGFuZ2xlJ3Mgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gUmVjdGFuZ2xlJ3MgaGVpZ2h0LlxyXG4gICAgICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN0SW5pdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xyXG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBDbGFzcyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBjb21wdXRhdGlvbnMgb2YgdGhlIGNvbnRlbnQgcmVjdGFuZ2xlIG9mXHJcbiAgICAgKiBwcm92aWRlZCBET00gZWxlbWVudCBhbmQgZm9yIGtlZXBpbmcgdHJhY2sgb2YgaXQncyBjaGFuZ2VzLlxyXG4gICAgICovXHJcbiAgICB2YXIgUmVzaXplT2JzZXJ2YXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBiZSBvYnNlcnZlZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZhdGlvbih0YXJnZXQpIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEJyb2FkY2FzdGVkIHdpZHRoIG9mIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGhpcy5icm9hZGNhc3RXaWR0aCA9IDA7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBCcm9hZGNhc3RlZCBoZWlnaHQgb2YgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB0aGlzLmJyb2FkY2FzdEhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIGxhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEBwcml2YXRlIHtET01SZWN0SW5pdH1cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHRoaXMuY29udGVudFJlY3RfID0gY3JlYXRlUmVjdEluaXQoMCwgMCwgMCwgMCk7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBVcGRhdGVzIGNvbnRlbnQgcmVjdGFuZ2xlIGFuZCB0ZWxscyB3aGV0aGVyIGl0J3Mgd2lkdGggb3IgaGVpZ2h0IHByb3BlcnRpZXNcclxuICAgICAgICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgYnJvYWRjYXN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgUmVzaXplT2JzZXJ2YXRpb24ucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcmVjdCA9IGdldENvbnRlbnRSZWN0KHRoaXMudGFyZ2V0KTtcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50UmVjdF8gPSByZWN0O1xyXG4gICAgICAgICAgICByZXR1cm4gKHJlY3Qud2lkdGggIT09IHRoaXMuYnJvYWRjYXN0V2lkdGggfHxcclxuICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0ICE9PSB0aGlzLmJyb2FkY2FzdEhlaWdodCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBVcGRhdGVzICdicm9hZGNhc3RXaWR0aCcgYW5kICdicm9hZGNhc3RIZWlnaHQnIHByb3BlcnRpZXMgd2l0aCBhIGRhdGFcclxuICAgICAgICAgKiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgb2YgdGhlIGxhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9IExhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgUmVzaXplT2JzZXJ2YXRpb24ucHJvdG90eXBlLmJyb2FkY2FzdFJlY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByZWN0ID0gdGhpcy5jb250ZW50UmVjdF87XHJcbiAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0V2lkdGggPSByZWN0LndpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLmJyb2FkY2FzdEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xyXG4gICAgICAgICAgICByZXR1cm4gcmVjdDtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBSZXNpemVPYnNlcnZhdGlvbjtcclxuICAgIH0oKSk7XG5cbiAgICB2YXIgUmVzaXplT2JzZXJ2ZXJFbnRyeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFJlc2l6ZU9ic2VydmVyRW50cnkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdGhhdCBpcyBiZWluZyBvYnNlcnZlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0RPTVJlY3RJbml0fSByZWN0SW5pdCAtIERhdGEgb2YgdGhlIGVsZW1lbnQncyBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlckVudHJ5KHRhcmdldCwgcmVjdEluaXQpIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRlbnRSZWN0ID0gY3JlYXRlUmVhZE9ubHlSZWN0KHJlY3RJbml0KTtcclxuICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBub3Qgd3JpdGFibGVcclxuICAgICAgICAgICAgLy8gYW5kIGFyZSBhbHNvIG5vdCBlbnVtZXJhYmxlIGluIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24uXHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycyBhcmUgbm90IGJlaW5nIHVzZWQgYXMgdGhleSdkIHJlcXVpcmUgdG8gZGVmaW5lIGFcclxuICAgICAgICAgICAgLy8gcHJpdmF0ZSBXZWFrTWFwIHN0b3JhZ2Ugd2hpY2ggbWF5IGNhdXNlIG1lbW9yeSBsZWFrcyBpbiBicm93c2VycyB0aGF0XHJcbiAgICAgICAgICAgIC8vIGRvbid0IHN1cHBvcnQgdGhpcyB0eXBlIG9mIGNvbGxlY3Rpb25zLlxyXG4gICAgICAgICAgICBkZWZpbmVDb25maWd1cmFibGUodGhpcywgeyB0YXJnZXQ6IHRhcmdldCwgY29udGVudFJlY3Q6IGNvbnRlbnRSZWN0IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVzaXplT2JzZXJ2ZXJFbnRyeTtcclxuICAgIH0oKSk7XG5cbiAgICB2YXIgUmVzaXplT2JzZXJ2ZXJTUEkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJDYWxsYmFja30gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWRcclxuICAgICAgICAgKiAgICAgIHdoZW4gb25lIG9mIHRoZSBvYnNlcnZlZCBlbGVtZW50cyBjaGFuZ2VzIGl0J3MgY29udGVudCBkaW1lbnNpb25zLlxyXG4gICAgICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBpbnN0YW5jZSB3aGljaFxyXG4gICAgICAgICAqICAgICAgaXMgcmVzcG9uc2libGUgZm9yIHRoZSB1cGRhdGVzIG9mIG9ic2VydmVyLlxyXG4gICAgICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJ9IGNhbGxiYWNrQ3R4IC0gUmVmZXJlbmNlIHRvIHRoZSBwdWJsaWNcclxuICAgICAgICAgKiAgICAgIFJlc2l6ZU9ic2VydmVyIGluc3RhbmNlIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyU1BJKGNhbGxiYWNrLCBjb250cm9sbGVyLCBjYWxsYmFja0N0eCkge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQ29sbGVjdGlvbiBvZiByZXNpemUgb2JzZXJ2YXRpb25zIHRoYXQgaGF2ZSBkZXRlY3RlZCBjaGFuZ2VzIGluIGRpbWVuc2lvbnNcclxuICAgICAgICAgICAgICogb2YgZWxlbWVudHMuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEBwcml2YXRlIHtBcnJheTxSZXNpemVPYnNlcnZhdGlvbj59XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18gPSBbXTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFJlZ2lzdHJ5IG9mIHRoZSBSZXNpemVPYnNlcnZhdGlvbiBpbnN0YW5jZXMuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEBwcml2YXRlIHtNYXA8RWxlbWVudCwgUmVzaXplT2JzZXJ2YXRpb24+fVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGhpcy5vYnNlcnZhdGlvbnNfID0gbmV3IE1hcFNoaW0oKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNhbGxiYWNrIHByb3ZpZGVkIGFzIHBhcmFtZXRlciAxIGlzIG5vdCBhIGZ1bmN0aW9uLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tfID0gY2FsbGJhY2s7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcl8gPSBjb250cm9sbGVyO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrQ3R4XyA9IGNhbGxiYWNrQ3R4O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTdGFydHMgb2JzZXJ2aW5nIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgb2JzZXJ2ZWQuXHJcbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgdGhlIEVsZW1lbnQgaW50ZXJmYWNlLlxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICEoRWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLkVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgb2JzZXJ2YXRpb25zID0gdGhpcy5vYnNlcnZhdGlvbnNfO1xyXG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGVsZW1lbnQgaXMgYWxyZWFkeSBiZWluZyBvYnNlcnZlZC5cclxuICAgICAgICAgICAgaWYgKG9ic2VydmF0aW9ucy5oYXModGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9ic2VydmF0aW9ucy5zZXQodGFyZ2V0LCBuZXcgUmVzaXplT2JzZXJ2YXRpb24odGFyZ2V0KSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcl8uYWRkT2JzZXJ2ZXIodGhpcyk7XHJcbiAgICAgICAgICAgIC8vIEZvcmNlIHRoZSB1cGRhdGUgb2Ygb2JzZXJ2YXRpb25zLlxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJfLnJlZnJlc2goKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFN0b3BzIG9ic2VydmluZyBwcm92aWRlZCBlbGVtZW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIHN0b3Agb2JzZXJ2aW5nLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS51bm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgdGhlIEVsZW1lbnQgaW50ZXJmYWNlLlxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICEoRWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLkVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgb2JzZXJ2YXRpb25zID0gdGhpcy5vYnNlcnZhdGlvbnNfO1xyXG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGVsZW1lbnQgaXMgbm90IGJlaW5nIG9ic2VydmVkLlxyXG4gICAgICAgICAgICBpZiAoIW9ic2VydmF0aW9ucy5oYXModGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9ic2VydmF0aW9ucy5kZWxldGUodGFyZ2V0KTtcclxuICAgICAgICAgICAgaWYgKCFvYnNlcnZhdGlvbnMuc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyXy5yZW1vdmVPYnNlcnZlcih0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3RvcHMgb2JzZXJ2aW5nIGFsbCBlbGVtZW50cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2YXRpb25zXy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJfLnJlbW92ZU9ic2VydmVyKHRoaXMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29sbGVjdHMgb2JzZXJ2YXRpb24gaW5zdGFuY2VzIHRoZSBhc3NvY2lhdGVkIGVsZW1lbnQgb2Ygd2hpY2ggaGFzIGNoYW5nZWRcclxuICAgICAgICAgKiBpdCdzIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmdhdGhlckFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VydmF0aW9uc18uZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2YXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmIChvYnNlcnZhdGlvbi5pc0FjdGl2ZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5wdXNoKG9ic2VydmF0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnZva2VzIGluaXRpYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBhIGxpc3Qgb2YgUmVzaXplT2JzZXJ2ZXJFbnRyeVxyXG4gICAgICAgICAqIGluc3RhbmNlcyBjb2xsZWN0ZWQgZnJvbSBhY3RpdmUgcmVzaXplIG9ic2VydmF0aW9ucy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5icm9hZGNhc3RBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgb2JzZXJ2ZXIgZG9lc24ndCBoYXZlIGFjdGl2ZSBvYnNlcnZhdGlvbnMuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLmNhbGxiYWNrQ3R4XztcclxuICAgICAgICAgICAgLy8gQ3JlYXRlIFJlc2l6ZU9ic2VydmVyRW50cnkgaW5zdGFuY2UgZm9yIGV2ZXJ5IGFjdGl2ZSBvYnNlcnZhdGlvbi5cclxuICAgICAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ubWFwKGZ1bmN0aW9uIChvYnNlcnZhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNpemVPYnNlcnZlckVudHJ5KG9ic2VydmF0aW9uLnRhcmdldCwgb2JzZXJ2YXRpb24uYnJvYWRjYXN0UmVjdCgpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tfLmNhbGwoY3R4LCBlbnRyaWVzLCBjdHgpO1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDbGVhcnMgdGhlIGNvbGxlY3Rpb24gb2YgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5jbGVhckFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLnNwbGljZSgwKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRlbGxzIHdoZXRoZXIgb2JzZXJ2ZXIgaGFzIGFjdGl2ZSBvYnNlcnZhdGlvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAgICAgKi9cclxuICAgICAgICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuaGFzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gUmVzaXplT2JzZXJ2ZXJTUEk7XHJcbiAgICB9KCkpO1xuXG4gICAgLy8gUmVnaXN0cnkgb2YgaW50ZXJuYWwgb2JzZXJ2ZXJzLiBJZiBXZWFrTWFwIGlzIG5vdCBhdmFpbGFibGUgdXNlIGN1cnJlbnQgc2hpbVxyXG4gICAgLy8gZm9yIHRoZSBNYXAgY29sbGVjdGlvbiBhcyBpdCBoYXMgYWxsIHJlcXVpcmVkIG1ldGhvZHMgYW5kIGJlY2F1c2UgV2Vha01hcFxyXG4gICAgLy8gY2FuJ3QgYmUgZnVsbHkgcG9seWZpbGxlZCBhbnl3YXkuXHJcbiAgICB2YXIgb2JzZXJ2ZXJzID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnID8gbmV3IFdlYWtNYXAoKSA6IG5ldyBNYXBTaGltKCk7XHJcbiAgICAvKipcclxuICAgICAqIFJlc2l6ZU9ic2VydmVyIEFQSS4gRW5jYXBzdWxhdGVzIHRoZSBSZXNpemVPYnNlcnZlciBTUEkgaW1wbGVtZW50YXRpb25cclxuICAgICAqIGV4cG9zaW5nIG9ubHkgdGhvc2UgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBzcGVjLlxyXG4gICAgICovXHJcbiAgICB2YXIgUmVzaXplT2JzZXJ2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJDYWxsYmFja30gY2FsbGJhY2sgLSBDYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlblxyXG4gICAgICAgICAqICAgICAgZGltZW5zaW9ucyBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudHMgY2hhbmdlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbi4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgY29udHJvbGxlciA9IFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXJTUEkoY2FsbGJhY2ssIGNvbnRyb2xsZXIsIHRoaXMpO1xyXG4gICAgICAgICAgICBvYnNlcnZlcnMuc2V0KHRoaXMsIG9ic2VydmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyO1xyXG4gICAgfSgpKTtcclxuICAgIC8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcyBvZiBSZXNpemVPYnNlcnZlci5cclxuICAgIFtcclxuICAgICAgICAnb2JzZXJ2ZScsXHJcbiAgICAgICAgJ3Vub2JzZXJ2ZScsXHJcbiAgICAgICAgJ2Rpc2Nvbm5lY3QnXHJcbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xyXG4gICAgICAgIFJlc2l6ZU9ic2VydmVyLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIHJldHVybiAoX2EgPSBvYnNlcnZlcnMuZ2V0KHRoaXMpKVttZXRob2RdLmFwcGx5KF9hLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIH07XHJcbiAgICB9KTtcblxuICAgIHZhciBpbmRleCA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gRXhwb3J0IGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJsZS5cclxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbCQxLlJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsJDEuUmVzaXplT2JzZXJ2ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBSZXNpemVPYnNlcnZlcjtcclxuICAgIH0pKCk7XG5cbiAgICByZXR1cm4gaW5kZXg7XG5cbn0pKSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2NvbXB1dGVTY3JvbGxJbnRvVmlldyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNvbXB1dGUtc2Nyb2xsLWludG8tdmlld1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBpc09wdGlvbnNPYmplY3Qob3B0aW9ucykge1xuICByZXR1cm4gb3B0aW9ucyA9PT0gT2JqZWN0KG9wdGlvbnMpICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCAhPT0gMDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEJlaGF2aW9yKGFjdGlvbnMsIGJlaGF2aW9yKSB7XG4gIGlmIChiZWhhdmlvciA9PT0gdm9pZCAwKSB7XG4gICAgYmVoYXZpb3IgPSAnYXV0byc7XG4gIH1cblxuICB2YXIgY2FuU21vb3RoU2Nyb2xsID0gKCdzY3JvbGxCZWhhdmlvcicgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSk7XG4gIGFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBlbCA9IF9yZWYuZWwsXG4gICAgICAgIHRvcCA9IF9yZWYudG9wLFxuICAgICAgICBsZWZ0ID0gX3JlZi5sZWZ0O1xuXG4gICAgaWYgKGVsLnNjcm9sbCAmJiBjYW5TbW9vdGhTY3JvbGwpIHtcbiAgICAgIGVsLnNjcm9sbCh7XG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICBiZWhhdmlvcjogYmVoYXZpb3JcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICBlbC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJsb2NrOiAnZW5kJyxcbiAgICAgIGlubGluZTogJ25lYXJlc3QnXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpc09wdGlvbnNPYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmxvY2s6ICdzdGFydCcsXG4gICAgaW5saW5lOiAnbmVhcmVzdCdcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcodGFyZ2V0LCBvcHRpb25zKSB7XG4gIHZhciB0YXJnZXRJc0RldGFjaGVkID0gIXRhcmdldC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0YXJnZXQpO1xuXG4gIGlmIChpc09wdGlvbnNPYmplY3Qob3B0aW9ucykgJiYgdHlwZW9mIG9wdGlvbnMuYmVoYXZpb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5iZWhhdmlvcih0YXJnZXRJc0RldGFjaGVkID8gW10gOiAoMCwgX2NvbXB1dGVTY3JvbGxJbnRvVmlld1tcImRlZmF1bHRcIl0pKHRhcmdldCwgb3B0aW9ucykpO1xuICB9XG5cbiAgaWYgKHRhcmdldElzRGV0YWNoZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgY29tcHV0ZU9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gZGVmYXVsdEJlaGF2aW9yKCgwLCBfY29tcHV0ZVNjcm9sbEludG9WaWV3W1wiZGVmYXVsdFwiXSkodGFyZ2V0LCBjb21wdXRlT3B0aW9ucyksIGNvbXB1dGVPcHRpb25zLmJlaGF2aW9yKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gc2Nyb2xsSW50b1ZpZXc7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7IiwiLy9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQiwgY29tcGFyZSwgY29tcGFyZUNvbnRleHQpIHtcbiAgdmFyIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIG9iakEsIG9iakIpIDogdm9pZCAwO1xuXG4gIGlmIChyZXQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgIW9iakEgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgIW9iakIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlQSA9IG9iakFba2V5XTtcbiAgICB2YXIgdmFsdWVCID0gb2JqQltrZXldO1xuXG4gICAgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgdmFsdWVBLCB2YWx1ZUIsIGtleSkgOiB2b2lkIDA7XG5cbiAgICBpZiAocmV0ID09PSBmYWxzZSB8fCAocmV0ID09PSB2b2lkIDAgJiYgdmFsdWVBICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwidmFyIGNhbWVsMmh5cGhlbiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0clxuICAgICAgICAgIC5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiAnLScgKyBtYXRjaC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbWVsMmh5cGhlbjsiLCIvLyBUaW55Q29sb3IgdjEuNC4yXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYmdyaW5zL1RpbnlDb2xvclxuLy8gQnJpYW4gR3JpbnN0ZWFkLCBNSVQgTGljZW5zZVxuXG4oZnVuY3Rpb24oTWF0aCkge1xuXG52YXIgdHJpbUxlZnQgPSAvXlxccysvLFxuICAgIHRyaW1SaWdodCA9IC9cXHMrJC8sXG4gICAgdGlueUNvdW50ZXIgPSAwLFxuICAgIG1hdGhSb3VuZCA9IE1hdGgucm91bmQsXG4gICAgbWF0aE1pbiA9IE1hdGgubWluLFxuICAgIG1hdGhNYXggPSBNYXRoLm1heCxcbiAgICBtYXRoUmFuZG9tID0gTWF0aC5yYW5kb207XG5cbmZ1bmN0aW9uIHRpbnljb2xvciAoY29sb3IsIG9wdHMpIHtcblxuICAgIGNvbG9yID0gKGNvbG9yKSA/IGNvbG9yIDogJyc7XG4gICAgb3B0cyA9IG9wdHMgfHwgeyB9O1xuXG4gICAgLy8gSWYgaW5wdXQgaXMgYWxyZWFkeSBhIHRpbnljb2xvciwgcmV0dXJuIGl0c2VsZlxuICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIHRpbnljb2xvcikge1xuICAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9XG4gICAgLy8gSWYgd2UgYXJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBjYWxsIHVzaW5nIG5ldyBpbnN0ZWFkXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHRpbnljb2xvcikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aW55Y29sb3IoY29sb3IsIG9wdHMpO1xuICAgIH1cblxuICAgIHZhciByZ2IgPSBpbnB1dFRvUkdCKGNvbG9yKTtcbiAgICB0aGlzLl9vcmlnaW5hbElucHV0ID0gY29sb3IsXG4gICAgdGhpcy5fciA9IHJnYi5yLFxuICAgIHRoaXMuX2cgPSByZ2IuZyxcbiAgICB0aGlzLl9iID0gcmdiLmIsXG4gICAgdGhpcy5fYSA9IHJnYi5hLFxuICAgIHRoaXMuX3JvdW5kQSA9IG1hdGhSb3VuZCgxMDAqdGhpcy5fYSkgLyAxMDAsXG4gICAgdGhpcy5fZm9ybWF0ID0gb3B0cy5mb3JtYXQgfHwgcmdiLmZvcm1hdDtcbiAgICB0aGlzLl9ncmFkaWVudFR5cGUgPSBvcHRzLmdyYWRpZW50VHlwZTtcblxuICAgIC8vIERvbid0IGxldCB0aGUgcmFuZ2Ugb2YgWzAsMjU1XSBjb21lIGJhY2sgaW4gWzAsMV0uXG4gICAgLy8gUG90ZW50aWFsbHkgbG9zZSBhIGxpdHRsZSBiaXQgb2YgcHJlY2lzaW9uIGhlcmUsIGJ1dCB3aWxsIGZpeCBpc3N1ZXMgd2hlcmVcbiAgICAvLyAuNSBnZXRzIGludGVycHJldGVkIGFzIGhhbGYgb2YgdGhlIHRvdGFsLCBpbnN0ZWFkIG9mIGhhbGYgb2YgMVxuICAgIC8vIElmIGl0IHdhcyBzdXBwb3NlZCB0byBiZSAxMjgsIHRoaXMgd2FzIGFscmVhZHkgdGFrZW4gY2FyZSBvZiBieSBgaW5wdXRUb1JnYmBcbiAgICBpZiAodGhpcy5fciA8IDEpIHsgdGhpcy5fciA9IG1hdGhSb3VuZCh0aGlzLl9yKTsgfVxuICAgIGlmICh0aGlzLl9nIDwgMSkgeyB0aGlzLl9nID0gbWF0aFJvdW5kKHRoaXMuX2cpOyB9XG4gICAgaWYgKHRoaXMuX2IgPCAxKSB7IHRoaXMuX2IgPSBtYXRoUm91bmQodGhpcy5fYik7IH1cblxuICAgIHRoaXMuX29rID0gcmdiLm9rO1xuICAgIHRoaXMuX3RjX2lkID0gdGlueUNvdW50ZXIrKztcbn1cblxudGlueWNvbG9yLnByb3RvdHlwZSA9IHtcbiAgICBpc0Rhcms6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCcmlnaHRuZXNzKCkgPCAxMjg7XG4gICAgfSxcbiAgICBpc0xpZ2h0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRGFyaygpO1xuICAgIH0sXG4gICAgaXNWYWxpZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vaztcbiAgICB9LFxuICAgIGdldE9yaWdpbmFsSW5wdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsSW5wdXQ7XG4gICAgfSxcbiAgICBnZXRGb3JtYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0O1xuICAgIH0sXG4gICAgZ2V0QWxwaGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYTtcbiAgICB9LFxuICAgIGdldEJyaWdodG5lc3M6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvL2h0dHA6Ly93d3cudzMub3JnL1RSL0FFUlQjY29sb3ItY29udHJhc3RcbiAgICAgICAgdmFyIHJnYiA9IHRoaXMudG9SZ2IoKTtcbiAgICAgICAgcmV0dXJuIChyZ2IuciAqIDI5OSArIHJnYi5nICogNTg3ICsgcmdiLmIgKiAxMTQpIC8gMTAwMDtcbiAgICB9LFxuICAgIGdldEx1bWluYW5jZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpO1xuICAgICAgICB2YXIgUnNSR0IsIEdzUkdCLCBCc1JHQiwgUiwgRywgQjtcbiAgICAgICAgUnNSR0IgPSByZ2Iuci8yNTU7XG4gICAgICAgIEdzUkdCID0gcmdiLmcvMjU1O1xuICAgICAgICBCc1JHQiA9IHJnYi5iLzI1NTtcblxuICAgICAgICBpZiAoUnNSR0IgPD0gMC4wMzkyOCkge1IgPSBSc1JHQiAvIDEyLjkyO30gZWxzZSB7UiA9IE1hdGgucG93KCgoUnNSR0IgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCk7fVxuICAgICAgICBpZiAoR3NSR0IgPD0gMC4wMzkyOCkge0cgPSBHc1JHQiAvIDEyLjkyO30gZWxzZSB7RyA9IE1hdGgucG93KCgoR3NSR0IgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCk7fVxuICAgICAgICBpZiAoQnNSR0IgPD0gMC4wMzkyOCkge0IgPSBCc1JHQiAvIDEyLjkyO30gZWxzZSB7QiA9IE1hdGgucG93KCgoQnNSR0IgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCk7fVxuICAgICAgICByZXR1cm4gKDAuMjEyNiAqIFIpICsgKDAuNzE1MiAqIEcpICsgKDAuMDcyMiAqIEIpO1xuICAgIH0sXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2EgPSBib3VuZEFscGhhKHZhbHVlKTtcbiAgICAgICAgdGhpcy5fcm91bmRBID0gbWF0aFJvdW5kKDEwMCp0aGlzLl9hKSAvIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB0b0hzdjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBoc3YgPSByZ2JUb0hzdih0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTtcbiAgICAgICAgcmV0dXJuIHsgaDogaHN2LmggKiAzNjAsIHM6IGhzdi5zLCB2OiBoc3YudiwgYTogdGhpcy5fYSB9O1xuICAgIH0sXG4gICAgdG9Ic3ZTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaHN2ID0gcmdiVG9Ic3YodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYik7XG4gICAgICAgIHZhciBoID0gbWF0aFJvdW5kKGhzdi5oICogMzYwKSwgcyA9IG1hdGhSb3VuZChoc3YucyAqIDEwMCksIHYgPSBtYXRoUm91bmQoaHN2LnYgKiAxMDApO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgP1xuICAgICAgICAgIFwiaHN2KFwiICArIGggKyBcIiwgXCIgKyBzICsgXCIlLCBcIiArIHYgKyBcIiUpXCIgOlxuICAgICAgICAgIFwiaHN2YShcIiArIGggKyBcIiwgXCIgKyBzICsgXCIlLCBcIiArIHYgKyBcIiUsIFwiKyB0aGlzLl9yb3VuZEEgKyBcIilcIjtcbiAgICB9LFxuICAgIHRvSHNsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGhzbCA9IHJnYlRvSHNsKHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IpO1xuICAgICAgICByZXR1cm4geyBoOiBoc2wuaCAqIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sLCBhOiB0aGlzLl9hIH07XG4gICAgfSxcbiAgICB0b0hzbFN0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBoc2wgPSByZ2JUb0hzbCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTtcbiAgICAgICAgdmFyIGggPSBtYXRoUm91bmQoaHNsLmggKiAzNjApLCBzID0gbWF0aFJvdW5kKGhzbC5zICogMTAwKSwgbCA9IG1hdGhSb3VuZChoc2wubCAqIDEwMCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fYSA9PSAxKSA/XG4gICAgICAgICAgXCJoc2woXCIgICsgaCArIFwiLCBcIiArIHMgKyBcIiUsIFwiICsgbCArIFwiJSlcIiA6XG4gICAgICAgICAgXCJoc2xhKFwiICsgaCArIFwiLCBcIiArIHMgKyBcIiUsIFwiICsgbCArIFwiJSwgXCIrIHRoaXMuX3JvdW5kQSArIFwiKVwiO1xuICAgIH0sXG4gICAgdG9IZXg6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHtcbiAgICAgICAgcmV0dXJuIHJnYlRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIGFsbG93M0NoYXIpO1xuICAgIH0sXG4gICAgdG9IZXhTdHJpbmc6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHtcbiAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXgoYWxsb3czQ2hhcik7XG4gICAgfSxcbiAgICB0b0hleDg6IGZ1bmN0aW9uKGFsbG93NENoYXIpIHtcbiAgICAgICAgcmV0dXJuIHJnYmFUb0hleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCB0aGlzLl9hLCBhbGxvdzRDaGFyKTtcbiAgICB9LFxuICAgIHRvSGV4OFN0cmluZzogZnVuY3Rpb24oYWxsb3c0Q2hhcikge1xuICAgICAgICByZXR1cm4gJyMnICsgdGhpcy50b0hleDgoYWxsb3c0Q2hhcik7XG4gICAgfSxcbiAgICB0b1JnYjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7IHI6IG1hdGhSb3VuZCh0aGlzLl9yKSwgZzogbWF0aFJvdW5kKHRoaXMuX2cpLCBiOiBtYXRoUm91bmQodGhpcy5fYiksIGE6IHRoaXMuX2EgfTtcbiAgICB9LFxuICAgIHRvUmdiU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9hID09IDEpID9cbiAgICAgICAgICBcInJnYihcIiAgKyBtYXRoUm91bmQodGhpcy5fcikgKyBcIiwgXCIgKyBtYXRoUm91bmQodGhpcy5fZykgKyBcIiwgXCIgKyBtYXRoUm91bmQodGhpcy5fYikgKyBcIilcIiA6XG4gICAgICAgICAgXCJyZ2JhKFwiICsgbWF0aFJvdW5kKHRoaXMuX3IpICsgXCIsIFwiICsgbWF0aFJvdW5kKHRoaXMuX2cpICsgXCIsIFwiICsgbWF0aFJvdW5kKHRoaXMuX2IpICsgXCIsIFwiICsgdGhpcy5fcm91bmRBICsgXCIpXCI7XG4gICAgfSxcbiAgICB0b1BlcmNlbnRhZ2VSZ2I6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4geyByOiBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArIFwiJVwiLCBnOiBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9nLCAyNTUpICogMTAwKSArIFwiJVwiLCBiOiBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9iLCAyNTUpICogMTAwKSArIFwiJVwiLCBhOiB0aGlzLl9hIH07XG4gICAgfSxcbiAgICB0b1BlcmNlbnRhZ2VSZ2JTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgP1xuICAgICAgICAgIFwicmdiKFwiICArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX3IsIDI1NSkgKiAxMDApICsgXCIlLCBcIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2csIDI1NSkgKiAxMDApICsgXCIlLCBcIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgXCIlKVwiIDpcbiAgICAgICAgICBcInJnYmEoXCIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9nLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9iLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyB0aGlzLl9yb3VuZEEgKyBcIilcIjtcbiAgICB9LFxuICAgIHRvTmFtZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9hID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0cmFuc3BhcmVudFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2EgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGV4TmFtZXNbcmdiVG9IZXgodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYiwgdHJ1ZSldIHx8IGZhbHNlO1xuICAgIH0sXG4gICAgdG9GaWx0ZXI6IGZ1bmN0aW9uKHNlY29uZENvbG9yKSB7XG4gICAgICAgIHZhciBoZXg4U3RyaW5nID0gJyMnICsgcmdiYVRvQXJnYkhleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCB0aGlzLl9hKTtcbiAgICAgICAgdmFyIHNlY29uZEhleDhTdHJpbmcgPSBoZXg4U3RyaW5nO1xuICAgICAgICB2YXIgZ3JhZGllbnRUeXBlID0gdGhpcy5fZ3JhZGllbnRUeXBlID8gXCJHcmFkaWVudFR5cGUgPSAxLCBcIiA6IFwiXCI7XG5cbiAgICAgICAgaWYgKHNlY29uZENvbG9yKSB7XG4gICAgICAgICAgICB2YXIgcyA9IHRpbnljb2xvcihzZWNvbmRDb2xvcik7XG4gICAgICAgICAgICBzZWNvbmRIZXg4U3RyaW5nID0gJyMnICsgcmdiYVRvQXJnYkhleChzLl9yLCBzLl9nLCBzLl9iLCBzLl9hKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChcIitncmFkaWVudFR5cGUrXCJzdGFydENvbG9yc3RyPVwiK2hleDhTdHJpbmcrXCIsZW5kQ29sb3JzdHI9XCIrc2Vjb25kSGV4OFN0cmluZytcIilcIjtcbiAgICB9LFxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbihmb3JtYXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdFNldCA9ICEhZm9ybWF0O1xuICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgdGhpcy5fZm9ybWF0O1xuXG4gICAgICAgIHZhciBmb3JtYXR0ZWRTdHJpbmcgPSBmYWxzZTtcbiAgICAgICAgdmFyIGhhc0FscGhhID0gdGhpcy5fYSA8IDEgJiYgdGhpcy5fYSA+PSAwO1xuICAgICAgICB2YXIgbmVlZHNBbHBoYUZvcm1hdCA9ICFmb3JtYXRTZXQgJiYgaGFzQWxwaGEgJiYgKGZvcm1hdCA9PT0gXCJoZXhcIiB8fCBmb3JtYXQgPT09IFwiaGV4NlwiIHx8IGZvcm1hdCA9PT0gXCJoZXgzXCIgfHwgZm9ybWF0ID09PSBcImhleDRcIiB8fCBmb3JtYXQgPT09IFwiaGV4OFwiIHx8IGZvcm1hdCA9PT0gXCJuYW1lXCIpO1xuXG4gICAgICAgIGlmIChuZWVkc0FscGhhRm9ybWF0KSB7XG4gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIFwidHJhbnNwYXJlbnRcIiwgYWxsIG90aGVyIG5vbi1hbHBoYSBmb3JtYXRzXG4gICAgICAgICAgICAvLyB3aWxsIHJldHVybiByZ2JhIHdoZW4gdGhlcmUgaXMgdHJhbnNwYXJlbmN5LlxuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJuYW1lXCIgJiYgdGhpcy5fYSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvTmFtZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9SZ2JTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcInJnYlwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJwcmdiXCIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9QZXJjZW50YWdlUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJoZXhcIiB8fCBmb3JtYXQgPT09IFwiaGV4NlwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJoZXgzXCIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXhTdHJpbmcodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJoZXg0XCIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXg4U3RyaW5nKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiaGV4OFwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4OFN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwibmFtZVwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvTmFtZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiaHNsXCIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9Ic2xTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImhzdlwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSHN2U3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkU3RyaW5nIHx8IHRoaXMudG9IZXhTdHJpbmcoKTtcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRpbnljb2xvcih0aGlzLnRvU3RyaW5nKCkpO1xuICAgIH0sXG5cbiAgICBfYXBwbHlNb2RpZmljYXRpb246IGZ1bmN0aW9uKGZuLCBhcmdzKSB7XG4gICAgICAgIHZhciBjb2xvciA9IGZuLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzKSkpO1xuICAgICAgICB0aGlzLl9yID0gY29sb3IuX3I7XG4gICAgICAgIHRoaXMuX2cgPSBjb2xvci5fZztcbiAgICAgICAgdGhpcy5fYiA9IGNvbG9yLl9iO1xuICAgICAgICB0aGlzLnNldEFscGhhKGNvbG9yLl9hKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBsaWdodGVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGxpZ2h0ZW4sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBicmlnaHRlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihicmlnaHRlbiwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGRhcmtlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihkYXJrZW4sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBkZXNhdHVyYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGRlc2F0dXJhdGUsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBzYXR1cmF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihzYXR1cmF0ZSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGdyZXlzY2FsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihncmV5c2NhbGUsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBzcGluOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKHNwaW4sIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIF9hcHBseUNvbWJpbmF0aW9uOiBmdW5jdGlvbihmbiwgYXJncykge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW3RoaXNdLmNvbmNhdChbXS5zbGljZS5jYWxsKGFyZ3MpKSk7XG4gICAgfSxcbiAgICBhbmFsb2dvdXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihhbmFsb2dvdXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBjb21wbGVtZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24oY29tcGxlbWVudCwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG1vbm9jaHJvbWF0aWM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihtb25vY2hyb21hdGljLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc3BsaXRjb21wbGVtZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24oc3BsaXRjb21wbGVtZW50LCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgdHJpYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbih0cmlhZCwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHRldHJhZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKHRldHJhZCwgYXJndW1lbnRzKTtcbiAgICB9XG59O1xuXG4vLyBJZiBpbnB1dCBpcyBhbiBvYmplY3QsIGZvcmNlIDEgaW50byBcIjEuMFwiIHRvIGhhbmRsZSByYXRpb3MgcHJvcGVybHlcbi8vIFN0cmluZyBpbnB1dCByZXF1aXJlcyBcIjEuMFwiIGFzIGlucHV0LCBzbyAxIHdpbGwgYmUgdHJlYXRlZCBhcyAxXG50aW55Y29sb3IuZnJvbVJhdGlvID0gZnVuY3Rpb24oY29sb3IsIG9wdHMpIHtcbiAgICBpZiAodHlwZW9mIGNvbG9yID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdmFyIG5ld0NvbG9yID0ge307XG4gICAgICAgIGZvciAodmFyIGkgaW4gY29sb3IpIHtcbiAgICAgICAgICAgIGlmIChjb2xvci5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSBcImFcIikge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb2xvcltpXSA9IGNvbG9yW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29sb3JbaV0gPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sb3IgPSBuZXdDb2xvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yLCBvcHRzKTtcbn07XG5cbi8vIEdpdmVuIGEgc3RyaW5nIG9yIG9iamVjdCwgY29udmVydCB0aGF0IGlucHV0IHRvIFJHQlxuLy8gUG9zc2libGUgc3RyaW5nIGlucHV0czpcbi8vXG4vLyAgICAgXCJyZWRcIlxuLy8gICAgIFwiI2YwMFwiIG9yIFwiZjAwXCJcbi8vICAgICBcIiNmZjAwMDBcIiBvciBcImZmMDAwMFwiXG4vLyAgICAgXCIjZmYwMDAwMDBcIiBvciBcImZmMDAwMDAwXCJcbi8vICAgICBcInJnYiAyNTUgMCAwXCIgb3IgXCJyZ2IgKDI1NSwgMCwgMClcIlxuLy8gICAgIFwicmdiIDEuMCAwIDBcIiBvciBcInJnYiAoMSwgMCwgMClcIlxuLy8gICAgIFwicmdiYSAoMjU1LCAwLCAwLCAxKVwiIG9yIFwicmdiYSAyNTUsIDAsIDAsIDFcIlxuLy8gICAgIFwicmdiYSAoMS4wLCAwLCAwLCAxKVwiIG9yIFwicmdiYSAxLjAsIDAsIDAsIDFcIlxuLy8gICAgIFwiaHNsKDAsIDEwMCUsIDUwJSlcIiBvciBcImhzbCAwIDEwMCUgNTAlXCJcbi8vICAgICBcImhzbGEoMCwgMTAwJSwgNTAlLCAxKVwiIG9yIFwiaHNsYSAwIDEwMCUgNTAlLCAxXCJcbi8vICAgICBcImhzdigwLCAxMDAlLCAxMDAlKVwiIG9yIFwiaHN2IDAgMTAwJSAxMDAlXCJcbi8vXG5mdW5jdGlvbiBpbnB1dFRvUkdCKGNvbG9yKSB7XG5cbiAgICB2YXIgcmdiID0geyByOiAwLCBnOiAwLCBiOiAwIH07XG4gICAgdmFyIGEgPSAxO1xuICAgIHZhciBzID0gbnVsbDtcbiAgICB2YXIgdiA9IG51bGw7XG4gICAgdmFyIGwgPSBudWxsO1xuICAgIHZhciBvayA9IGZhbHNlO1xuICAgIHZhciBmb3JtYXQgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgY29sb3IgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb2xvciA9IHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sb3IgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoaXNWYWxpZENTU1VuaXQoY29sb3IucikgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IuZykgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IuYikpIHtcbiAgICAgICAgICAgIHJnYiA9IHJnYlRvUmdiKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIpO1xuICAgICAgICAgICAgb2sgPSB0cnVlO1xuICAgICAgICAgICAgZm9ybWF0ID0gU3RyaW5nKGNvbG9yLnIpLnN1YnN0cigtMSkgPT09IFwiJVwiID8gXCJwcmdiXCIgOiBcInJnYlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzVmFsaWRDU1NVbml0KGNvbG9yLmgpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLnMpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLnYpKSB7XG4gICAgICAgICAgICBzID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci5zKTtcbiAgICAgICAgICAgIHYgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLnYpO1xuICAgICAgICAgICAgcmdiID0gaHN2VG9SZ2IoY29sb3IuaCwgcywgdik7XG4gICAgICAgICAgICBvayA9IHRydWU7XG4gICAgICAgICAgICBmb3JtYXQgPSBcImhzdlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzVmFsaWRDU1NVbml0KGNvbG9yLmgpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLnMpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmwpKSB7XG4gICAgICAgICAgICBzID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci5zKTtcbiAgICAgICAgICAgIGwgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLmwpO1xuICAgICAgICAgICAgcmdiID0gaHNsVG9SZ2IoY29sb3IuaCwgcywgbCk7XG4gICAgICAgICAgICBvayA9IHRydWU7XG4gICAgICAgICAgICBmb3JtYXQgPSBcImhzbFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbG9yLmhhc093blByb3BlcnR5KFwiYVwiKSkge1xuICAgICAgICAgICAgYSA9IGNvbG9yLmE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhID0gYm91bmRBbHBoYShhKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIG9rOiBvayxcbiAgICAgICAgZm9ybWF0OiBjb2xvci5mb3JtYXQgfHwgZm9ybWF0LFxuICAgICAgICByOiBtYXRoTWluKDI1NSwgbWF0aE1heChyZ2IuciwgMCkpLFxuICAgICAgICBnOiBtYXRoTWluKDI1NSwgbWF0aE1heChyZ2IuZywgMCkpLFxuICAgICAgICBiOiBtYXRoTWluKDI1NSwgbWF0aE1heChyZ2IuYiwgMCkpLFxuICAgICAgICBhOiBhXG4gICAgfTtcbn1cblxuXG4vLyBDb252ZXJzaW9uIEZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gYHJnYlRvSHNsYCwgYHJnYlRvSHN2YCwgYGhzbFRvUmdiYCwgYGhzdlRvUmdiYCBtb2RpZmllZCBmcm9tOlxuLy8gPGh0dHA6Ly9tamlqYWNrc29uLmNvbS8yMDA4LzAyL3JnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY29udmVyc2lvbi1hbGdvcml0aG1zLWluLWphdmFzY3JpcHQ+XG5cbi8vIGByZ2JUb1JnYmBcbi8vIEhhbmRsZSBib3VuZHMgLyBwZXJjZW50YWdlIGNoZWNraW5nIHRvIGNvbmZvcm0gdG8gQ1NTIGNvbG9yIHNwZWNcbi8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLz5cbi8vICpBc3N1bWVzOiogciwgZywgYiBpbiBbMCwgMjU1XSBvciBbMCwgMV1cbi8vICpSZXR1cm5zOiogeyByLCBnLCBiIH0gaW4gWzAsIDI1NV1cbmZ1bmN0aW9uIHJnYlRvUmdiKHIsIGcsIGIpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHI6IGJvdW5kMDEociwgMjU1KSAqIDI1NSxcbiAgICAgICAgZzogYm91bmQwMShnLCAyNTUpICogMjU1LFxuICAgICAgICBiOiBib3VuZDAxKGIsIDI1NSkgKiAyNTVcbiAgICB9O1xufVxuXG4vLyBgcmdiVG9Ic2xgXG4vLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNMLlxuLy8gKkFzc3VtZXM6KiByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIFswLCAyNTVdIG9yIFswLCAxXVxuLy8gKlJldHVybnM6KiB7IGgsIHMsIGwgfSBpbiBbMCwxXVxuZnVuY3Rpb24gcmdiVG9Ic2wociwgZywgYikge1xuXG4gICAgciA9IGJvdW5kMDEociwgMjU1KTtcbiAgICBnID0gYm91bmQwMShnLCAyNTUpO1xuICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7XG5cbiAgICB2YXIgbWF4ID0gbWF0aE1heChyLCBnLCBiKSwgbWluID0gbWF0aE1pbihyLCBnLCBiKTtcbiAgICB2YXIgaCwgcywgbCA9IChtYXggKyBtaW4pIC8gMjtcblxuICAgIGlmKG1heCA9PSBtaW4pIHtcbiAgICAgICAgaCA9IHMgPSAwOyAvLyBhY2hyb21hdGljXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgZCA9IG1heCAtIG1pbjtcbiAgICAgICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xuICAgICAgICBzd2l0Y2gobWF4KSB7XG4gICAgICAgICAgICBjYXNlIHI6IGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGc6IGggPSAoYiAtIHIpIC8gZCArIDI7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBiOiBoID0gKHIgLSBnKSAvIGQgKyA0OyBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGggLz0gNjtcbiAgICB9XG5cbiAgICByZXR1cm4geyBoOiBoLCBzOiBzLCBsOiBsIH07XG59XG5cbi8vIGBoc2xUb1JnYmBcbi8vIENvbnZlcnRzIGFuIEhTTCBjb2xvciB2YWx1ZSB0byBSR0IuXG4vLyAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgbCBhcmUgY29udGFpbmVkIFswLCAxXSBvciBbMCwgMTAwXVxuLy8gKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdXG5mdW5jdGlvbiBoc2xUb1JnYihoLCBzLCBsKSB7XG4gICAgdmFyIHIsIGcsIGI7XG5cbiAgICBoID0gYm91bmQwMShoLCAzNjApO1xuICAgIHMgPSBib3VuZDAxKHMsIDEwMCk7XG4gICAgbCA9IGJvdW5kMDEobCwgMTAwKTtcblxuICAgIGZ1bmN0aW9uIGh1ZTJyZ2IocCwgcSwgdCkge1xuICAgICAgICBpZih0IDwgMCkgdCArPSAxO1xuICAgICAgICBpZih0ID4gMSkgdCAtPSAxO1xuICAgICAgICBpZih0IDwgMS82KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICAgICAgaWYodCA8IDEvMikgcmV0dXJuIHE7XG4gICAgICAgIGlmKHQgPCAyLzMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyLzMgLSB0KSAqIDY7XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIGlmKHMgPT09IDApIHtcbiAgICAgICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpY1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICB2YXIgcCA9IDIgKiBsIC0gcTtcbiAgICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEvMyk7XG4gICAgICAgIGcgPSBodWUycmdiKHAsIHEsIGgpO1xuICAgICAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMS8zKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByOiByICogMjU1LCBnOiBnICogMjU1LCBiOiBiICogMjU1IH07XG59XG5cbi8vIGByZ2JUb0hzdmBcbi8vIENvbnZlcnRzIGFuIFJHQiBjb2xvciB2YWx1ZSB0byBIU1Zcbi8vICpBc3N1bWVzOiogciwgZywgYW5kIGIgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc2V0IFswLCAyNTVdIG9yIFswLCAxXVxuLy8gKlJldHVybnM6KiB7IGgsIHMsIHYgfSBpbiBbMCwxXVxuZnVuY3Rpb24gcmdiVG9Ic3YociwgZywgYikge1xuXG4gICAgciA9IGJvdW5kMDEociwgMjU1KTtcbiAgICBnID0gYm91bmQwMShnLCAyNTUpO1xuICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7XG5cbiAgICB2YXIgbWF4ID0gbWF0aE1heChyLCBnLCBiKSwgbWluID0gbWF0aE1pbihyLCBnLCBiKTtcbiAgICB2YXIgaCwgcywgdiA9IG1heDtcblxuICAgIHZhciBkID0gbWF4IC0gbWluO1xuICAgIHMgPSBtYXggPT09IDAgPyAwIDogZCAvIG1heDtcblxuICAgIGlmKG1heCA9PSBtaW4pIHtcbiAgICAgICAgaCA9IDA7IC8vIGFjaHJvbWF0aWNcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN3aXRjaChtYXgpIHtcbiAgICAgICAgICAgIGNhc2UgcjogaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgZzogaCA9IChiIC0gcikgLyBkICsgMjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGI6IGggPSAociAtIGcpIC8gZCArIDQ7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGggLz0gNjtcbiAgICB9XG4gICAgcmV0dXJuIHsgaDogaCwgczogcywgdjogdiB9O1xufVxuXG4vLyBgaHN2VG9SZ2JgXG4vLyBDb252ZXJ0cyBhbiBIU1YgY29sb3IgdmFsdWUgdG8gUkdCLlxuLy8gKkFzc3VtZXM6KiBoIGlzIGNvbnRhaW5lZCBpbiBbMCwgMV0gb3IgWzAsIDM2MF0gYW5kIHMgYW5kIHYgYXJlIGNvbnRhaW5lZCBpbiBbMCwgMV0gb3IgWzAsIDEwMF1cbi8vICpSZXR1cm5zOiogeyByLCBnLCBiIH0gaW4gdGhlIHNldCBbMCwgMjU1XVxuIGZ1bmN0aW9uIGhzdlRvUmdiKGgsIHMsIHYpIHtcblxuICAgIGggPSBib3VuZDAxKGgsIDM2MCkgKiA2O1xuICAgIHMgPSBib3VuZDAxKHMsIDEwMCk7XG4gICAgdiA9IGJvdW5kMDEodiwgMTAwKTtcblxuICAgIHZhciBpID0gTWF0aC5mbG9vcihoKSxcbiAgICAgICAgZiA9IGggLSBpLFxuICAgICAgICBwID0gdiAqICgxIC0gcyksXG4gICAgICAgIHEgPSB2ICogKDEgLSBmICogcyksXG4gICAgICAgIHQgPSB2ICogKDEgLSAoMSAtIGYpICogcyksXG4gICAgICAgIG1vZCA9IGkgJSA2LFxuICAgICAgICByID0gW3YsIHEsIHAsIHAsIHQsIHZdW21vZF0sXG4gICAgICAgIGcgPSBbdCwgdiwgdiwgcSwgcCwgcF1bbW9kXSxcbiAgICAgICAgYiA9IFtwLCBwLCB0LCB2LCB2LCBxXVttb2RdO1xuXG4gICAgcmV0dXJuIHsgcjogciAqIDI1NSwgZzogZyAqIDI1NSwgYjogYiAqIDI1NSB9O1xufVxuXG4vLyBgcmdiVG9IZXhgXG4vLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdG8gaGV4XG4vLyBBc3N1bWVzIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XVxuLy8gUmV0dXJucyBhIDMgb3IgNiBjaGFyYWN0ZXIgaGV4XG5mdW5jdGlvbiByZ2JUb0hleChyLCBnLCBiLCBhbGxvdzNDaGFyKSB7XG5cbiAgICB2YXIgaGV4ID0gW1xuICAgICAgICBwYWQyKG1hdGhSb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChiKS50b1N0cmluZygxNikpXG4gICAgXTtcblxuICAgIC8vIFJldHVybiBhIDMgY2hhcmFjdGVyIGhleCBpZiBwb3NzaWJsZVxuICAgIGlmIChhbGxvdzNDaGFyICYmIGhleFswXS5jaGFyQXQoMCkgPT0gaGV4WzBdLmNoYXJBdCgxKSAmJiBoZXhbMV0uY2hhckF0KDApID09IGhleFsxXS5jaGFyQXQoMSkgJiYgaGV4WzJdLmNoYXJBdCgwKSA9PSBoZXhbMl0uY2hhckF0KDEpKSB7XG4gICAgICAgIHJldHVybiBoZXhbMF0uY2hhckF0KDApICsgaGV4WzFdLmNoYXJBdCgwKSArIGhleFsyXS5jaGFyQXQoMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhleC5qb2luKFwiXCIpO1xufVxuXG4vLyBgcmdiYVRvSGV4YFxuLy8gQ29udmVydHMgYW4gUkdCQSBjb2xvciBwbHVzIGFscGhhIHRyYW5zcGFyZW5jeSB0byBoZXhcbi8vIEFzc3VtZXMgciwgZywgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0gYW5kXG4vLyBhIGluIFswLCAxXS4gUmV0dXJucyBhIDQgb3IgOCBjaGFyYWN0ZXIgcmdiYSBoZXhcbmZ1bmN0aW9uIHJnYmFUb0hleChyLCBnLCBiLCBhLCBhbGxvdzRDaGFyKSB7XG5cbiAgICB2YXIgaGV4ID0gW1xuICAgICAgICBwYWQyKG1hdGhSb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChiKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKGNvbnZlcnREZWNpbWFsVG9IZXgoYSkpXG4gICAgXTtcblxuICAgIC8vIFJldHVybiBhIDQgY2hhcmFjdGVyIGhleCBpZiBwb3NzaWJsZVxuICAgIGlmIChhbGxvdzRDaGFyICYmIGhleFswXS5jaGFyQXQoMCkgPT0gaGV4WzBdLmNoYXJBdCgxKSAmJiBoZXhbMV0uY2hhckF0KDApID09IGhleFsxXS5jaGFyQXQoMSkgJiYgaGV4WzJdLmNoYXJBdCgwKSA9PSBoZXhbMl0uY2hhckF0KDEpICYmIGhleFszXS5jaGFyQXQoMCkgPT0gaGV4WzNdLmNoYXJBdCgxKSkge1xuICAgICAgICByZXR1cm4gaGV4WzBdLmNoYXJBdCgwKSArIGhleFsxXS5jaGFyQXQoMCkgKyBoZXhbMl0uY2hhckF0KDApICsgaGV4WzNdLmNoYXJBdCgwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGV4LmpvaW4oXCJcIik7XG59XG5cbi8vIGByZ2JhVG9BcmdiSGV4YFxuLy8gQ29udmVydHMgYW4gUkdCQSBjb2xvciB0byBhbiBBUkdCIEhleDggc3RyaW5nXG4vLyBSYXJlbHkgdXNlZCwgYnV0IHJlcXVpcmVkIGZvciBcInRvRmlsdGVyKClcIlxuZnVuY3Rpb24gcmdiYVRvQXJnYkhleChyLCBnLCBiLCBhKSB7XG5cbiAgICB2YXIgaGV4ID0gW1xuICAgICAgICBwYWQyKGNvbnZlcnREZWNpbWFsVG9IZXgoYSkpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChiKS50b1N0cmluZygxNikpXG4gICAgXTtcblxuICAgIHJldHVybiBoZXguam9pbihcIlwiKTtcbn1cblxuLy8gYGVxdWFsc2Bcbi8vIENhbiBiZSBjYWxsZWQgd2l0aCBhbnkgdGlueWNvbG9yIGlucHV0XG50aW55Y29sb3IuZXF1YWxzID0gZnVuY3Rpb24gKGNvbG9yMSwgY29sb3IyKSB7XG4gICAgaWYgKCFjb2xvcjEgfHwgIWNvbG9yMikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2JTdHJpbmcoKSA9PSB0aW55Y29sb3IoY29sb3IyKS50b1JnYlN0cmluZygpO1xufTtcblxudGlueWNvbG9yLnJhbmRvbSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aW55Y29sb3IuZnJvbVJhdGlvKHtcbiAgICAgICAgcjogbWF0aFJhbmRvbSgpLFxuICAgICAgICBnOiBtYXRoUmFuZG9tKCksXG4gICAgICAgIGI6IG1hdGhSYW5kb20oKVxuICAgIH0pO1xufTtcblxuXG4vLyBNb2RpZmljYXRpb24gRnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGFua3MgdG8gbGVzcy5qcyBmb3Igc29tZSBvZiB0aGUgYmFzaWNzIGhlcmVcbi8vIDxodHRwczovL2dpdGh1Yi5jb20vY2xvdWRoZWFkL2xlc3MuanMvYmxvYi9tYXN0ZXIvbGliL2xlc3MvZnVuY3Rpb25zLmpzPlxuXG5mdW5jdGlvbiBkZXNhdHVyYXRlKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSAoYW1vdW50ID09PSAwKSA/IDAgOiAoYW1vdW50IHx8IDEwKTtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIGhzbC5zIC09IGFtb3VudCAvIDEwMDtcbiAgICBoc2wucyA9IGNsYW1wMDEoaHNsLnMpO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuZnVuY3Rpb24gc2F0dXJhdGUoY29sb3IsIGFtb3VudCkge1xuICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApO1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgaHNsLnMgKz0gYW1vdW50IC8gMTAwO1xuICAgIGhzbC5zID0gY2xhbXAwMShoc2wucyk7XG4gICAgcmV0dXJuIHRpbnljb2xvcihoc2wpO1xufVxuXG5mdW5jdGlvbiBncmV5c2NhbGUoY29sb3IpIHtcbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yKS5kZXNhdHVyYXRlKDEwMCk7XG59XG5cbmZ1bmN0aW9uIGxpZ2h0ZW4gKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSAoYW1vdW50ID09PSAwKSA/IDAgOiAoYW1vdW50IHx8IDEwKTtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIGhzbC5sICs9IGFtb3VudCAvIDEwMDtcbiAgICBoc2wubCA9IGNsYW1wMDEoaHNsLmwpO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuZnVuY3Rpb24gYnJpZ2h0ZW4oY29sb3IsIGFtb3VudCkge1xuICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApO1xuICAgIHZhciByZ2IgPSB0aW55Y29sb3IoY29sb3IpLnRvUmdiKCk7XG4gICAgcmdiLnIgPSBtYXRoTWF4KDAsIG1hdGhNaW4oMjU1LCByZ2IuciAtIG1hdGhSb3VuZCgyNTUgKiAtIChhbW91bnQgLyAxMDApKSkpO1xuICAgIHJnYi5nID0gbWF0aE1heCgwLCBtYXRoTWluKDI1NSwgcmdiLmcgLSBtYXRoUm91bmQoMjU1ICogLSAoYW1vdW50IC8gMTAwKSkpKTtcbiAgICByZ2IuYiA9IG1hdGhNYXgoMCwgbWF0aE1pbigyNTUsIHJnYi5iIC0gbWF0aFJvdW5kKDI1NSAqIC0gKGFtb3VudCAvIDEwMCkpKSk7XG4gICAgcmV0dXJuIHRpbnljb2xvcihyZ2IpO1xufVxuXG5mdW5jdGlvbiBkYXJrZW4gKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSAoYW1vdW50ID09PSAwKSA/IDAgOiAoYW1vdW50IHx8IDEwKTtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIGhzbC5sIC09IGFtb3VudCAvIDEwMDtcbiAgICBoc2wubCA9IGNsYW1wMDEoaHNsLmwpO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuLy8gU3BpbiB0YWtlcyBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGFtb3VudCB3aXRoaW4gWy0zNjAsIDM2MF0gaW5kaWNhdGluZyB0aGUgY2hhbmdlIG9mIGh1ZS5cbi8vIFZhbHVlcyBvdXRzaWRlIG9mIHRoaXMgcmFuZ2Ugd2lsbCBiZSB3cmFwcGVkIGludG8gdGhpcyByYW5nZS5cbmZ1bmN0aW9uIHNwaW4oY29sb3IsIGFtb3VudCkge1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgdmFyIGh1ZSA9IChoc2wuaCArIGFtb3VudCkgJSAzNjA7XG4gICAgaHNsLmggPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuLy8gQ29tYmluYXRpb24gRnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoYW5rcyB0byBqUXVlcnkgeENvbG9yIGZvciBzb21lIG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhlc2Vcbi8vIDxodHRwczovL2dpdGh1Yi5jb20vaW5mdXNpb24valF1ZXJ5LXhjb2xvci9ibG9iL21hc3Rlci9qcXVlcnkueGNvbG9yLmpzPlxuXG5mdW5jdGlvbiBjb21wbGVtZW50KGNvbG9yKSB7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICBoc2wuaCA9IChoc2wuaCArIDE4MCkgJSAzNjA7XG4gICAgcmV0dXJuIHRpbnljb2xvcihoc2wpO1xufVxuXG5mdW5jdGlvbiB0cmlhZChjb2xvcikge1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgdmFyIGggPSBoc2wuaDtcbiAgICByZXR1cm4gW1xuICAgICAgICB0aW55Y29sb3IoY29sb3IpLFxuICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDEyMCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSxcbiAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyNDApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSlcbiAgICBdO1xufVxuXG5mdW5jdGlvbiB0ZXRyYWQoY29sb3IpIHtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIHZhciBoID0gaHNsLmg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgdGlueWNvbG9yKGNvbG9yKSxcbiAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyA5MCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSxcbiAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAxODApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSksXG4gICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgMjcwKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gc3BsaXRjb21wbGVtZW50KGNvbG9yKSB7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICB2YXIgaCA9IGhzbC5oO1xuICAgIHJldHVybiBbXG4gICAgICAgIHRpbnljb2xvcihjb2xvciksXG4gICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgNzIpICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmx9KSxcbiAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyMTYpICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmx9KVxuICAgIF07XG59XG5cbmZ1bmN0aW9uIGFuYWxvZ291cyhjb2xvciwgcmVzdWx0cywgc2xpY2VzKSB7XG4gICAgcmVzdWx0cyA9IHJlc3VsdHMgfHwgNjtcbiAgICBzbGljZXMgPSBzbGljZXMgfHwgMzA7XG5cbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIHZhciBwYXJ0ID0gMzYwIC8gc2xpY2VzO1xuICAgIHZhciByZXQgPSBbdGlueWNvbG9yKGNvbG9yKV07XG5cbiAgICBmb3IgKGhzbC5oID0gKChoc2wuaCAtIChwYXJ0ICogcmVzdWx0cyA+PiAxKSkgKyA3MjApICUgMzYwOyAtLXJlc3VsdHM7ICkge1xuICAgICAgICBoc2wuaCA9IChoc2wuaCArIHBhcnQpICUgMzYwO1xuICAgICAgICByZXQucHVzaCh0aW55Y29sb3IoaHNsKSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG1vbm9jaHJvbWF0aWMoY29sb3IsIHJlc3VsdHMpIHtcbiAgICByZXN1bHRzID0gcmVzdWx0cyB8fCA2O1xuICAgIHZhciBoc3YgPSB0aW55Y29sb3IoY29sb3IpLnRvSHN2KCk7XG4gICAgdmFyIGggPSBoc3YuaCwgcyA9IGhzdi5zLCB2ID0gaHN2LnY7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIHZhciBtb2RpZmljYXRpb24gPSAxIC8gcmVzdWx0cztcblxuICAgIHdoaWxlIChyZXN1bHRzLS0pIHtcbiAgICAgICAgcmV0LnB1c2godGlueWNvbG9yKHsgaDogaCwgczogcywgdjogdn0pKTtcbiAgICAgICAgdiA9ICh2ICsgbW9kaWZpY2F0aW9uKSAlIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbn1cblxuLy8gVXRpbGl0eSBGdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50aW55Y29sb3IubWl4ID0gZnVuY3Rpb24oY29sb3IxLCBjb2xvcjIsIGFtb3VudCkge1xuICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgNTApO1xuXG4gICAgdmFyIHJnYjEgPSB0aW55Y29sb3IoY29sb3IxKS50b1JnYigpO1xuICAgIHZhciByZ2IyID0gdGlueWNvbG9yKGNvbG9yMikudG9SZ2IoKTtcblxuICAgIHZhciBwID0gYW1vdW50IC8gMTAwO1xuXG4gICAgdmFyIHJnYmEgPSB7XG4gICAgICAgIHI6ICgocmdiMi5yIC0gcmdiMS5yKSAqIHApICsgcmdiMS5yLFxuICAgICAgICBnOiAoKHJnYjIuZyAtIHJnYjEuZykgKiBwKSArIHJnYjEuZyxcbiAgICAgICAgYjogKChyZ2IyLmIgLSByZ2IxLmIpICogcCkgKyByZ2IxLmIsXG4gICAgICAgIGE6ICgocmdiMi5hIC0gcmdiMS5hKSAqIHApICsgcmdiMS5hXG4gICAgfTtcblxuICAgIHJldHVybiB0aW55Y29sb3IocmdiYSk7XG59O1xuXG5cbi8vIFJlYWRhYmlsaXR5IEZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyA8aHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNjb250cmFzdC1yYXRpb2RlZiAoV0NBRyBWZXJzaW9uIDIpXG5cbi8vIGBjb250cmFzdGBcbi8vIEFuYWx5emUgdGhlIDIgY29sb3JzIGFuZCByZXR1cm5zIHRoZSBjb2xvciBjb250cmFzdCBkZWZpbmVkIGJ5IChXQ0FHIFZlcnNpb24gMilcbnRpbnljb2xvci5yZWFkYWJpbGl0eSA9IGZ1bmN0aW9uKGNvbG9yMSwgY29sb3IyKSB7XG4gICAgdmFyIGMxID0gdGlueWNvbG9yKGNvbG9yMSk7XG4gICAgdmFyIGMyID0gdGlueWNvbG9yKGNvbG9yMik7XG4gICAgcmV0dXJuIChNYXRoLm1heChjMS5nZXRMdW1pbmFuY2UoKSxjMi5nZXRMdW1pbmFuY2UoKSkrMC4wNSkgLyAoTWF0aC5taW4oYzEuZ2V0THVtaW5hbmNlKCksYzIuZ2V0THVtaW5hbmNlKCkpKzAuMDUpO1xufTtcblxuLy8gYGlzUmVhZGFibGVgXG4vLyBFbnN1cmUgdGhhdCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9yIGNvbWJpbmF0aW9ucyBtZWV0IFdDQUcyIGd1aWRlbGluZXMuXG4vLyBUaGUgdGhpcmQgYXJndW1lbnQgaXMgYW4gb3B0aW9uYWwgT2JqZWN0LlxuLy8gICAgICB0aGUgJ2xldmVsJyBwcm9wZXJ0eSBzdGF0ZXMgJ0FBJyBvciAnQUFBJyAtIGlmIG1pc3Npbmcgb3IgaW52YWxpZCwgaXQgZGVmYXVsdHMgdG8gJ0FBJztcbi8vICAgICAgdGhlICdzaXplJyBwcm9wZXJ0eSBzdGF0ZXMgJ2xhcmdlJyBvciAnc21hbGwnIC0gaWYgbWlzc2luZyBvciBpbnZhbGlkLCBpdCBkZWZhdWx0cyB0byAnc21hbGwnLlxuLy8gSWYgdGhlIGVudGlyZSBvYmplY3QgaXMgYWJzZW50LCBpc1JlYWRhYmxlIGRlZmF1bHRzIHRvIHtsZXZlbDpcIkFBXCIsc2l6ZTpcInNtYWxsXCJ9LlxuXG4vLyAqRXhhbXBsZSpcbi8vICAgIHRpbnljb2xvci5pc1JlYWRhYmxlKFwiIzAwMFwiLCBcIiMxMTFcIikgPT4gZmFsc2Vcbi8vICAgIHRpbnljb2xvci5pc1JlYWRhYmxlKFwiIzAwMFwiLCBcIiMxMTFcIix7bGV2ZWw6XCJBQVwiLHNpemU6XCJsYXJnZVwifSkgPT4gZmFsc2VcbnRpbnljb2xvci5pc1JlYWRhYmxlID0gZnVuY3Rpb24oY29sb3IxLCBjb2xvcjIsIHdjYWcyKSB7XG4gICAgdmFyIHJlYWRhYmlsaXR5ID0gdGlueWNvbG9yLnJlYWRhYmlsaXR5KGNvbG9yMSwgY29sb3IyKTtcbiAgICB2YXIgd2NhZzJQYXJtcywgb3V0O1xuXG4gICAgb3V0ID0gZmFsc2U7XG5cbiAgICB3Y2FnMlBhcm1zID0gdmFsaWRhdGVXQ0FHMlBhcm1zKHdjYWcyKTtcbiAgICBzd2l0Y2ggKHdjYWcyUGFybXMubGV2ZWwgKyB3Y2FnMlBhcm1zLnNpemUpIHtcbiAgICAgICAgY2FzZSBcIkFBc21hbGxcIjpcbiAgICAgICAgY2FzZSBcIkFBQWxhcmdlXCI6XG4gICAgICAgICAgICBvdXQgPSByZWFkYWJpbGl0eSA+PSA0LjU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFBbGFyZ2VcIjpcbiAgICAgICAgICAgIG91dCA9IHJlYWRhYmlsaXR5ID49IDM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFBQXNtYWxsXCI6XG4gICAgICAgICAgICBvdXQgPSByZWFkYWJpbGl0eSA+PSA3O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG5cbn07XG5cbi8vIGBtb3N0UmVhZGFibGVgXG4vLyBHaXZlbiBhIGJhc2UgY29sb3IgYW5kIGEgbGlzdCBvZiBwb3NzaWJsZSBmb3JlZ3JvdW5kIG9yIGJhY2tncm91bmRcbi8vIGNvbG9ycyBmb3IgdGhhdCBiYXNlLCByZXR1cm5zIHRoZSBtb3N0IHJlYWRhYmxlIGNvbG9yLlxuLy8gT3B0aW9uYWxseSByZXR1cm5zIEJsYWNrIG9yIFdoaXRlIGlmIHRoZSBtb3N0IHJlYWRhYmxlIGNvbG9yIGlzIHVucmVhZGFibGUuXG4vLyAqRXhhbXBsZSpcbi8vICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUodGlueWNvbG9yLm1vc3RSZWFkYWJsZShcIiMxMjNcIiwgW1wiIzEyNFwiLCBcIiMxMjVcIl0se2luY2x1ZGVGYWxsYmFja0NvbG9yczpmYWxzZX0pLnRvSGV4U3RyaW5nKCk7IC8vIFwiIzExMjI1NVwiXG4vLyAgICB0aW55Y29sb3IubW9zdFJlYWRhYmxlKHRpbnljb2xvci5tb3N0UmVhZGFibGUoXCIjMTIzXCIsIFtcIiMxMjRcIiwgXCIjMTI1XCJdLHtpbmNsdWRlRmFsbGJhY2tDb2xvcnM6dHJ1ZX0pLnRvSGV4U3RyaW5nKCk7ICAvLyBcIiNmZmZmZmZcIlxuLy8gICAgdGlueWNvbG9yLm1vc3RSZWFkYWJsZShcIiNhODAxNWFcIiwgW1wiI2ZhZjNmM1wiXSx7aW5jbHVkZUZhbGxiYWNrQ29sb3JzOnRydWUsbGV2ZWw6XCJBQUFcIixzaXplOlwibGFyZ2VcIn0pLnRvSGV4U3RyaW5nKCk7IC8vIFwiI2ZhZjNmM1wiXG4vLyAgICB0aW55Y29sb3IubW9zdFJlYWRhYmxlKFwiI2E4MDE1YVwiLCBbXCIjZmFmM2YzXCJdLHtpbmNsdWRlRmFsbGJhY2tDb2xvcnM6dHJ1ZSxsZXZlbDpcIkFBQVwiLHNpemU6XCJzbWFsbFwifSkudG9IZXhTdHJpbmcoKTsgLy8gXCIjZmZmZmZmXCJcbnRpbnljb2xvci5tb3N0UmVhZGFibGUgPSBmdW5jdGlvbihiYXNlQ29sb3IsIGNvbG9yTGlzdCwgYXJncykge1xuICAgIHZhciBiZXN0Q29sb3IgPSBudWxsO1xuICAgIHZhciBiZXN0U2NvcmUgPSAwO1xuICAgIHZhciByZWFkYWJpbGl0eTtcbiAgICB2YXIgaW5jbHVkZUZhbGxiYWNrQ29sb3JzLCBsZXZlbCwgc2l6ZSA7XG4gICAgYXJncyA9IGFyZ3MgfHwge307XG4gICAgaW5jbHVkZUZhbGxiYWNrQ29sb3JzID0gYXJncy5pbmNsdWRlRmFsbGJhY2tDb2xvcnMgO1xuICAgIGxldmVsID0gYXJncy5sZXZlbDtcbiAgICBzaXplID0gYXJncy5zaXplO1xuXG4gICAgZm9yICh2YXIgaT0gMDsgaSA8IGNvbG9yTGlzdC5sZW5ndGggOyBpKyspIHtcbiAgICAgICAgcmVhZGFiaWxpdHkgPSB0aW55Y29sb3IucmVhZGFiaWxpdHkoYmFzZUNvbG9yLCBjb2xvckxpc3RbaV0pO1xuICAgICAgICBpZiAocmVhZGFiaWxpdHkgPiBiZXN0U2NvcmUpIHtcbiAgICAgICAgICAgIGJlc3RTY29yZSA9IHJlYWRhYmlsaXR5O1xuICAgICAgICAgICAgYmVzdENvbG9yID0gdGlueWNvbG9yKGNvbG9yTGlzdFtpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGlueWNvbG9yLmlzUmVhZGFibGUoYmFzZUNvbG9yLCBiZXN0Q29sb3IsIHtcImxldmVsXCI6bGV2ZWwsXCJzaXplXCI6c2l6ZX0pIHx8ICFpbmNsdWRlRmFsbGJhY2tDb2xvcnMpIHtcbiAgICAgICAgcmV0dXJuIGJlc3RDb2xvcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFyZ3MuaW5jbHVkZUZhbGxiYWNrQ29sb3JzPWZhbHNlO1xuICAgICAgICByZXR1cm4gdGlueWNvbG9yLm1vc3RSZWFkYWJsZShiYXNlQ29sb3IsW1wiI2ZmZlwiLCBcIiMwMDBcIl0sYXJncyk7XG4gICAgfVxufTtcblxuXG4vLyBCaWcgTGlzdCBvZiBDb2xvcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gPGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvI3N2Zy1jb2xvcj5cbnZhciBuYW1lcyA9IHRpbnljb2xvci5uYW1lcyA9IHtcbiAgICBhbGljZWJsdWU6IFwiZjBmOGZmXCIsXG4gICAgYW50aXF1ZXdoaXRlOiBcImZhZWJkN1wiLFxuICAgIGFxdWE6IFwiMGZmXCIsXG4gICAgYXF1YW1hcmluZTogXCI3ZmZmZDRcIixcbiAgICBhenVyZTogXCJmMGZmZmZcIixcbiAgICBiZWlnZTogXCJmNWY1ZGNcIixcbiAgICBiaXNxdWU6IFwiZmZlNGM0XCIsXG4gICAgYmxhY2s6IFwiMDAwXCIsXG4gICAgYmxhbmNoZWRhbG1vbmQ6IFwiZmZlYmNkXCIsXG4gICAgYmx1ZTogXCIwMGZcIixcbiAgICBibHVldmlvbGV0OiBcIjhhMmJlMlwiLFxuICAgIGJyb3duOiBcImE1MmEyYVwiLFxuICAgIGJ1cmx5d29vZDogXCJkZWI4ODdcIixcbiAgICBidXJudHNpZW5uYTogXCJlYTdlNWRcIixcbiAgICBjYWRldGJsdWU6IFwiNWY5ZWEwXCIsXG4gICAgY2hhcnRyZXVzZTogXCI3ZmZmMDBcIixcbiAgICBjaG9jb2xhdGU6IFwiZDI2OTFlXCIsXG4gICAgY29yYWw6IFwiZmY3ZjUwXCIsXG4gICAgY29ybmZsb3dlcmJsdWU6IFwiNjQ5NWVkXCIsXG4gICAgY29ybnNpbGs6IFwiZmZmOGRjXCIsXG4gICAgY3JpbXNvbjogXCJkYzE0M2NcIixcbiAgICBjeWFuOiBcIjBmZlwiLFxuICAgIGRhcmtibHVlOiBcIjAwMDA4YlwiLFxuICAgIGRhcmtjeWFuOiBcIjAwOGI4YlwiLFxuICAgIGRhcmtnb2xkZW5yb2Q6IFwiYjg4NjBiXCIsXG4gICAgZGFya2dyYXk6IFwiYTlhOWE5XCIsXG4gICAgZGFya2dyZWVuOiBcIjAwNjQwMFwiLFxuICAgIGRhcmtncmV5OiBcImE5YTlhOVwiLFxuICAgIGRhcmtraGFraTogXCJiZGI3NmJcIixcbiAgICBkYXJrbWFnZW50YTogXCI4YjAwOGJcIixcbiAgICBkYXJrb2xpdmVncmVlbjogXCI1NTZiMmZcIixcbiAgICBkYXJrb3JhbmdlOiBcImZmOGMwMFwiLFxuICAgIGRhcmtvcmNoaWQ6IFwiOTkzMmNjXCIsXG4gICAgZGFya3JlZDogXCI4YjAwMDBcIixcbiAgICBkYXJrc2FsbW9uOiBcImU5OTY3YVwiLFxuICAgIGRhcmtzZWFncmVlbjogXCI4ZmJjOGZcIixcbiAgICBkYXJrc2xhdGVibHVlOiBcIjQ4M2Q4YlwiLFxuICAgIGRhcmtzbGF0ZWdyYXk6IFwiMmY0ZjRmXCIsXG4gICAgZGFya3NsYXRlZ3JleTogXCIyZjRmNGZcIixcbiAgICBkYXJrdHVycXVvaXNlOiBcIjAwY2VkMVwiLFxuICAgIGRhcmt2aW9sZXQ6IFwiOTQwMGQzXCIsXG4gICAgZGVlcHBpbms6IFwiZmYxNDkzXCIsXG4gICAgZGVlcHNreWJsdWU6IFwiMDBiZmZmXCIsXG4gICAgZGltZ3JheTogXCI2OTY5NjlcIixcbiAgICBkaW1ncmV5OiBcIjY5Njk2OVwiLFxuICAgIGRvZGdlcmJsdWU6IFwiMWU5MGZmXCIsXG4gICAgZmlyZWJyaWNrOiBcImIyMjIyMlwiLFxuICAgIGZsb3JhbHdoaXRlOiBcImZmZmFmMFwiLFxuICAgIGZvcmVzdGdyZWVuOiBcIjIyOGIyMlwiLFxuICAgIGZ1Y2hzaWE6IFwiZjBmXCIsXG4gICAgZ2FpbnNib3JvOiBcImRjZGNkY1wiLFxuICAgIGdob3N0d2hpdGU6IFwiZjhmOGZmXCIsXG4gICAgZ29sZDogXCJmZmQ3MDBcIixcbiAgICBnb2xkZW5yb2Q6IFwiZGFhNTIwXCIsXG4gICAgZ3JheTogXCI4MDgwODBcIixcbiAgICBncmVlbjogXCIwMDgwMDBcIixcbiAgICBncmVlbnllbGxvdzogXCJhZGZmMmZcIixcbiAgICBncmV5OiBcIjgwODA4MFwiLFxuICAgIGhvbmV5ZGV3OiBcImYwZmZmMFwiLFxuICAgIGhvdHBpbms6IFwiZmY2OWI0XCIsXG4gICAgaW5kaWFucmVkOiBcImNkNWM1Y1wiLFxuICAgIGluZGlnbzogXCI0YjAwODJcIixcbiAgICBpdm9yeTogXCJmZmZmZjBcIixcbiAgICBraGFraTogXCJmMGU2OGNcIixcbiAgICBsYXZlbmRlcjogXCJlNmU2ZmFcIixcbiAgICBsYXZlbmRlcmJsdXNoOiBcImZmZjBmNVwiLFxuICAgIGxhd25ncmVlbjogXCI3Y2ZjMDBcIixcbiAgICBsZW1vbmNoaWZmb246IFwiZmZmYWNkXCIsXG4gICAgbGlnaHRibHVlOiBcImFkZDhlNlwiLFxuICAgIGxpZ2h0Y29yYWw6IFwiZjA4MDgwXCIsXG4gICAgbGlnaHRjeWFuOiBcImUwZmZmZlwiLFxuICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiBcImZhZmFkMlwiLFxuICAgIGxpZ2h0Z3JheTogXCJkM2QzZDNcIixcbiAgICBsaWdodGdyZWVuOiBcIjkwZWU5MFwiLFxuICAgIGxpZ2h0Z3JleTogXCJkM2QzZDNcIixcbiAgICBsaWdodHBpbms6IFwiZmZiNmMxXCIsXG4gICAgbGlnaHRzYWxtb246IFwiZmZhMDdhXCIsXG4gICAgbGlnaHRzZWFncmVlbjogXCIyMGIyYWFcIixcbiAgICBsaWdodHNreWJsdWU6IFwiODdjZWZhXCIsXG4gICAgbGlnaHRzbGF0ZWdyYXk6IFwiNzg5XCIsXG4gICAgbGlnaHRzbGF0ZWdyZXk6IFwiNzg5XCIsXG4gICAgbGlnaHRzdGVlbGJsdWU6IFwiYjBjNGRlXCIsXG4gICAgbGlnaHR5ZWxsb3c6IFwiZmZmZmUwXCIsXG4gICAgbGltZTogXCIwZjBcIixcbiAgICBsaW1lZ3JlZW46IFwiMzJjZDMyXCIsXG4gICAgbGluZW46IFwiZmFmMGU2XCIsXG4gICAgbWFnZW50YTogXCJmMGZcIixcbiAgICBtYXJvb246IFwiODAwMDAwXCIsXG4gICAgbWVkaXVtYXF1YW1hcmluZTogXCI2NmNkYWFcIixcbiAgICBtZWRpdW1ibHVlOiBcIjAwMDBjZFwiLFxuICAgIG1lZGl1bW9yY2hpZDogXCJiYTU1ZDNcIixcbiAgICBtZWRpdW1wdXJwbGU6IFwiOTM3MGRiXCIsXG4gICAgbWVkaXVtc2VhZ3JlZW46IFwiM2NiMzcxXCIsXG4gICAgbWVkaXVtc2xhdGVibHVlOiBcIjdiNjhlZVwiLFxuICAgIG1lZGl1bXNwcmluZ2dyZWVuOiBcIjAwZmE5YVwiLFxuICAgIG1lZGl1bXR1cnF1b2lzZTogXCI0OGQxY2NcIixcbiAgICBtZWRpdW12aW9sZXRyZWQ6IFwiYzcxNTg1XCIsXG4gICAgbWlkbmlnaHRibHVlOiBcIjE5MTk3MFwiLFxuICAgIG1pbnRjcmVhbTogXCJmNWZmZmFcIixcbiAgICBtaXN0eXJvc2U6IFwiZmZlNGUxXCIsXG4gICAgbW9jY2FzaW46IFwiZmZlNGI1XCIsXG4gICAgbmF2YWpvd2hpdGU6IFwiZmZkZWFkXCIsXG4gICAgbmF2eTogXCIwMDAwODBcIixcbiAgICBvbGRsYWNlOiBcImZkZjVlNlwiLFxuICAgIG9saXZlOiBcIjgwODAwMFwiLFxuICAgIG9saXZlZHJhYjogXCI2YjhlMjNcIixcbiAgICBvcmFuZ2U6IFwiZmZhNTAwXCIsXG4gICAgb3JhbmdlcmVkOiBcImZmNDUwMFwiLFxuICAgIG9yY2hpZDogXCJkYTcwZDZcIixcbiAgICBwYWxlZ29sZGVucm9kOiBcImVlZThhYVwiLFxuICAgIHBhbGVncmVlbjogXCI5OGZiOThcIixcbiAgICBwYWxldHVycXVvaXNlOiBcImFmZWVlZVwiLFxuICAgIHBhbGV2aW9sZXRyZWQ6IFwiZGI3MDkzXCIsXG4gICAgcGFwYXlhd2hpcDogXCJmZmVmZDVcIixcbiAgICBwZWFjaHB1ZmY6IFwiZmZkYWI5XCIsXG4gICAgcGVydTogXCJjZDg1M2ZcIixcbiAgICBwaW5rOiBcImZmYzBjYlwiLFxuICAgIHBsdW06IFwiZGRhMGRkXCIsXG4gICAgcG93ZGVyYmx1ZTogXCJiMGUwZTZcIixcbiAgICBwdXJwbGU6IFwiODAwMDgwXCIsXG4gICAgcmViZWNjYXB1cnBsZTogXCI2NjMzOTlcIixcbiAgICByZWQ6IFwiZjAwXCIsXG4gICAgcm9zeWJyb3duOiBcImJjOGY4ZlwiLFxuICAgIHJveWFsYmx1ZTogXCI0MTY5ZTFcIixcbiAgICBzYWRkbGVicm93bjogXCI4YjQ1MTNcIixcbiAgICBzYWxtb246IFwiZmE4MDcyXCIsXG4gICAgc2FuZHlicm93bjogXCJmNGE0NjBcIixcbiAgICBzZWFncmVlbjogXCIyZThiNTdcIixcbiAgICBzZWFzaGVsbDogXCJmZmY1ZWVcIixcbiAgICBzaWVubmE6IFwiYTA1MjJkXCIsXG4gICAgc2lsdmVyOiBcImMwYzBjMFwiLFxuICAgIHNreWJsdWU6IFwiODdjZWViXCIsXG4gICAgc2xhdGVibHVlOiBcIjZhNWFjZFwiLFxuICAgIHNsYXRlZ3JheTogXCI3MDgwOTBcIixcbiAgICBzbGF0ZWdyZXk6IFwiNzA4MDkwXCIsXG4gICAgc25vdzogXCJmZmZhZmFcIixcbiAgICBzcHJpbmdncmVlbjogXCIwMGZmN2ZcIixcbiAgICBzdGVlbGJsdWU6IFwiNDY4MmI0XCIsXG4gICAgdGFuOiBcImQyYjQ4Y1wiLFxuICAgIHRlYWw6IFwiMDA4MDgwXCIsXG4gICAgdGhpc3RsZTogXCJkOGJmZDhcIixcbiAgICB0b21hdG86IFwiZmY2MzQ3XCIsXG4gICAgdHVycXVvaXNlOiBcIjQwZTBkMFwiLFxuICAgIHZpb2xldDogXCJlZTgyZWVcIixcbiAgICB3aGVhdDogXCJmNWRlYjNcIixcbiAgICB3aGl0ZTogXCJmZmZcIixcbiAgICB3aGl0ZXNtb2tlOiBcImY1ZjVmNVwiLFxuICAgIHllbGxvdzogXCJmZjBcIixcbiAgICB5ZWxsb3dncmVlbjogXCI5YWNkMzJcIlxufTtcblxuLy8gTWFrZSBpdCBlYXN5IHRvIGFjY2VzcyBjb2xvcnMgdmlhIGBoZXhOYW1lc1toZXhdYFxudmFyIGhleE5hbWVzID0gdGlueWNvbG9yLmhleE5hbWVzID0gZmxpcChuYW1lcyk7XG5cblxuLy8gVXRpbGl0aWVzXG4vLyAtLS0tLS0tLS1cblxuLy8gYHsgJ25hbWUxJzogJ3ZhbDEnIH1gIGJlY29tZXMgYHsgJ3ZhbDEnOiAnbmFtZTEnIH1gXG5mdW5jdGlvbiBmbGlwKG8pIHtcbiAgICB2YXIgZmxpcHBlZCA9IHsgfTtcbiAgICBmb3IgKHZhciBpIGluIG8pIHtcbiAgICAgICAgaWYgKG8uaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIGZsaXBwZWRbb1tpXV0gPSBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbGlwcGVkO1xufVxuXG4vLyBSZXR1cm4gYSB2YWxpZCBhbHBoYSB2YWx1ZSBbMCwxXSB3aXRoIGFsbCBpbnZhbGlkIHZhbHVlcyBiZWluZyBzZXQgdG8gMVxuZnVuY3Rpb24gYm91bmRBbHBoYShhKSB7XG4gICAgYSA9IHBhcnNlRmxvYXQoYSk7XG5cbiAgICBpZiAoaXNOYU4oYSkgfHwgYSA8IDAgfHwgYSA+IDEpIHtcbiAgICAgICAgYSA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG59XG5cbi8vIFRha2UgaW5wdXQgZnJvbSBbMCwgbl0gYW5kIHJldHVybiBpdCBhcyBbMCwgMV1cbmZ1bmN0aW9uIGJvdW5kMDEobiwgbWF4KSB7XG4gICAgaWYgKGlzT25lUG9pbnRaZXJvKG4pKSB7IG4gPSBcIjEwMCVcIjsgfVxuXG4gICAgdmFyIHByb2Nlc3NQZXJjZW50ID0gaXNQZXJjZW50YWdlKG4pO1xuICAgIG4gPSBtYXRoTWluKG1heCwgbWF0aE1heCgwLCBwYXJzZUZsb2F0KG4pKSk7XG5cbiAgICAvLyBBdXRvbWF0aWNhbGx5IGNvbnZlcnQgcGVyY2VudGFnZSBpbnRvIG51bWJlclxuICAgIGlmIChwcm9jZXNzUGVyY2VudCkge1xuICAgICAgICBuID0gcGFyc2VJbnQobiAqIG1heCwgMTApIC8gMTAwO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnNcbiAgICBpZiAoKE1hdGguYWJzKG4gLSBtYXgpIDwgMC4wMDAwMDEpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgaW50byBbMCwgMV0gcmFuZ2UgaWYgaXQgaXNuJ3QgYWxyZWFkeVxuICAgIHJldHVybiAobiAlIG1heCkgLyBwYXJzZUZsb2F0KG1heCk7XG59XG5cbi8vIEZvcmNlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMVxuZnVuY3Rpb24gY2xhbXAwMSh2YWwpIHtcbiAgICByZXR1cm4gbWF0aE1pbigxLCBtYXRoTWF4KDAsIHZhbCkpO1xufVxuXG4vLyBQYXJzZSBhIGJhc2UtMTYgaGV4IHZhbHVlIGludG8gYSBiYXNlLTEwIGludGVnZXJcbmZ1bmN0aW9uIHBhcnNlSW50RnJvbUhleCh2YWwpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodmFsLCAxNik7XG59XG5cbi8vIE5lZWQgdG8gaGFuZGxlIDEuMCBhcyAxMDAlLCBzaW5jZSBvbmNlIGl0IGlzIGEgbnVtYmVyLCB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gaXQgYW5kIDFcbi8vIDxodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc0MjIwNzIvamF2YXNjcmlwdC1ob3ctdG8tZGV0ZWN0LW51bWJlci1hcy1hLWRlY2ltYWwtaW5jbHVkaW5nLTEtMD5cbmZ1bmN0aW9uIGlzT25lUG9pbnRaZXJvKG4pIHtcbiAgICByZXR1cm4gdHlwZW9mIG4gPT0gXCJzdHJpbmdcIiAmJiBuLmluZGV4T2YoJy4nKSAhPSAtMSAmJiBwYXJzZUZsb2F0KG4pID09PSAxO1xufVxuXG4vLyBDaGVjayB0byBzZWUgaWYgc3RyaW5nIHBhc3NlZCBpbiBpcyBhIHBlcmNlbnRhZ2VcbmZ1bmN0aW9uIGlzUGVyY2VudGFnZShuKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuID09PSBcInN0cmluZ1wiICYmIG4uaW5kZXhPZignJScpICE9IC0xO1xufVxuXG4vLyBGb3JjZSBhIGhleCB2YWx1ZSB0byBoYXZlIDIgY2hhcmFjdGVyc1xuZnVuY3Rpb24gcGFkMihjKSB7XG4gICAgcmV0dXJuIGMubGVuZ3RoID09IDEgPyAnMCcgKyBjIDogJycgKyBjO1xufVxuXG4vLyBSZXBsYWNlIGEgZGVjaW1hbCB3aXRoIGl0J3MgcGVyY2VudGFnZSB2YWx1ZVxuZnVuY3Rpb24gY29udmVydFRvUGVyY2VudGFnZShuKSB7XG4gICAgaWYgKG4gPD0gMSkge1xuICAgICAgICBuID0gKG4gKiAxMDApICsgXCIlXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG47XG59XG5cbi8vIENvbnZlcnRzIGEgZGVjaW1hbCB0byBhIGhleCB2YWx1ZVxuZnVuY3Rpb24gY29udmVydERlY2ltYWxUb0hleChkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChkKSAqIDI1NSkudG9TdHJpbmcoMTYpO1xufVxuLy8gQ29udmVydHMgYSBoZXggdmFsdWUgdG8gYSBkZWNpbWFsXG5mdW5jdGlvbiBjb252ZXJ0SGV4VG9EZWNpbWFsKGgpIHtcbiAgICByZXR1cm4gKHBhcnNlSW50RnJvbUhleChoKSAvIDI1NSk7XG59XG5cbnZhciBtYXRjaGVycyA9IChmdW5jdGlvbigpIHtcblxuICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jaW50ZWdlcnM+XG4gICAgdmFyIENTU19JTlRFR0VSID0gXCJbLVxcXFwrXT9cXFxcZCslP1wiO1xuXG4gICAgLy8gPGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtdmFsdWVzLyNudW1iZXItdmFsdWU+XG4gICAgdmFyIENTU19OVU1CRVIgPSBcIlstXFxcXCtdP1xcXFxkKlxcXFwuXFxcXGQrJT9cIjtcblxuICAgIC8vIEFsbG93IHBvc2l0aXZlL25lZ2F0aXZlIGludGVnZXIvbnVtYmVyLiAgRG9uJ3QgY2FwdHVyZSB0aGUgZWl0aGVyL29yLCBqdXN0IHRoZSBlbnRpcmUgb3V0Y29tZS5cbiAgICB2YXIgQ1NTX1VOSVQgPSBcIig/OlwiICsgQ1NTX05VTUJFUiArIFwiKXwoPzpcIiArIENTU19JTlRFR0VSICsgXCIpXCI7XG5cbiAgICAvLyBBY3R1YWwgbWF0Y2hpbmcuXG4gICAgLy8gUGFyZW50aGVzZXMgYW5kIGNvbW1hcyBhcmUgb3B0aW9uYWwsIGJ1dCBub3QgcmVxdWlyZWQuXG4gICAgLy8gV2hpdGVzcGFjZSBjYW4gdGFrZSB0aGUgcGxhY2Ugb2YgY29tbWFzIG9yIG9wZW5pbmcgcGFyZW5cbiAgICB2YXIgUEVSTUlTU0lWRV9NQVRDSDMgPSBcIltcXFxcc3xcXFxcKF0rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilcXFxccypcXFxcKT9cIjtcbiAgICB2YXIgUEVSTUlTU0lWRV9NQVRDSDQgPSBcIltcXFxcc3xcXFxcKF0rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilcXFxccypcXFxcKT9cIjtcblxuICAgIHJldHVybiB7XG4gICAgICAgIENTU19VTklUOiBuZXcgUmVnRXhwKENTU19VTklUKSxcbiAgICAgICAgcmdiOiBuZXcgUmVnRXhwKFwicmdiXCIgKyBQRVJNSVNTSVZFX01BVENIMyksXG4gICAgICAgIHJnYmE6IG5ldyBSZWdFeHAoXCJyZ2JhXCIgKyBQRVJNSVNTSVZFX01BVENINCksXG4gICAgICAgIGhzbDogbmV3IFJlZ0V4cChcImhzbFwiICsgUEVSTUlTU0lWRV9NQVRDSDMpLFxuICAgICAgICBoc2xhOiBuZXcgUmVnRXhwKFwiaHNsYVwiICsgUEVSTUlTU0lWRV9NQVRDSDQpLFxuICAgICAgICBoc3Y6IG5ldyBSZWdFeHAoXCJoc3ZcIiArIFBFUk1JU1NJVkVfTUFUQ0gzKSxcbiAgICAgICAgaHN2YTogbmV3IFJlZ0V4cChcImhzdmFcIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSxcbiAgICAgICAgaGV4MzogL14jPyhbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KSQvLFxuICAgICAgICBoZXg2OiAvXiM/KFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pJC8sXG4gICAgICAgIGhleDQ6IC9eIz8oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC8sXG4gICAgICAgIGhleDg6IC9eIz8oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pJC9cbiAgICB9O1xufSkoKTtcblxuLy8gYGlzVmFsaWRDU1NVbml0YFxuLy8gVGFrZSBpbiBhIHNpbmdsZSBzdHJpbmcgLyBudW1iZXIgYW5kIGNoZWNrIHRvIHNlZSBpZiBpdCBsb29rcyBsaWtlIGEgQ1NTIHVuaXRcbi8vIChzZWUgYG1hdGNoZXJzYCBhYm92ZSBmb3IgZGVmaW5pdGlvbikuXG5mdW5jdGlvbiBpc1ZhbGlkQ1NTVW5pdChjb2xvcikge1xuICAgIHJldHVybiAhIW1hdGNoZXJzLkNTU19VTklULmV4ZWMoY29sb3IpO1xufVxuXG4vLyBgc3RyaW5nSW5wdXRUb09iamVjdGBcbi8vIFBlcm1pc3NpdmUgc3RyaW5nIHBhcnNpbmcuICBUYWtlIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMsIGFuZCBvdXRwdXQgYW4gb2JqZWN0XG4vLyBiYXNlZCBvbiBkZXRlY3RlZCBmb3JtYXQuICBSZXR1cm5zIGB7IHIsIGcsIGIgfWAgb3IgYHsgaCwgcywgbCB9YCBvciBgeyBoLCBzLCB2fWBcbmZ1bmN0aW9uIHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpIHtcblxuICAgIGNvbG9yID0gY29sb3IucmVwbGFjZSh0cmltTGVmdCwnJykucmVwbGFjZSh0cmltUmlnaHQsICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBuYW1lZCA9IGZhbHNlO1xuICAgIGlmIChuYW1lc1tjb2xvcl0pIHtcbiAgICAgICAgY29sb3IgPSBuYW1lc1tjb2xvcl07XG4gICAgICAgIG5hbWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29sb3IgPT0gJ3RyYW5zcGFyZW50Jykge1xuICAgICAgICByZXR1cm4geyByOiAwLCBnOiAwLCBiOiAwLCBhOiAwLCBmb3JtYXQ6IFwibmFtZVwiIH07XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIG1hdGNoIHN0cmluZyBpbnB1dCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zLlxuICAgIC8vIEtlZXAgbW9zdCBvZiB0aGUgbnVtYmVyIGJvdW5kaW5nIG91dCBvZiB0aGlzIGZ1bmN0aW9uIC0gZG9uJ3Qgd29ycnkgYWJvdXQgWzAsMV0gb3IgWzAsMTAwXSBvciBbMCwzNjBdXG4gICAgLy8gSnVzdCByZXR1cm4gYW4gb2JqZWN0IGFuZCBsZXQgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGhhbmRsZSB0aGF0LlxuICAgIC8vIFRoaXMgd2F5IHRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZSB3aGV0aGVyIHRoZSB0aW55Y29sb3IgaXMgaW5pdGlhbGl6ZWQgd2l0aCBzdHJpbmcgb3Igb2JqZWN0LlxuICAgIHZhciBtYXRjaDtcbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMucmdiLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyByOiBtYXRjaFsxXSwgZzogbWF0Y2hbMl0sIGI6IG1hdGNoWzNdIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5yZ2JhLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyByOiBtYXRjaFsxXSwgZzogbWF0Y2hbMl0sIGI6IG1hdGNoWzNdLCBhOiBtYXRjaFs0XSB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMuaHNsLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIGw6IG1hdGNoWzNdIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc2xhLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIGw6IG1hdGNoWzNdLCBhOiBtYXRjaFs0XSB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMuaHN2LmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIHY6IG1hdGNoWzNdIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc3ZhLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIHY6IG1hdGNoWzNdLCBhOiBtYXRjaFs0XSB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMuaGV4OC5leGVjKGNvbG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHI6IHBhcnNlSW50RnJvbUhleChtYXRjaFsxXSksXG4gICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0pLFxuICAgICAgICAgICAgYjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzNdKSxcbiAgICAgICAgICAgIGE6IGNvbnZlcnRIZXhUb0RlY2ltYWwobWF0Y2hbNF0pLFxuICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/IFwibmFtZVwiIDogXCJoZXg4XCJcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhleDYuZXhlYyhjb2xvcikpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0pLFxuICAgICAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gXCJuYW1lXCIgOiBcImhleFwiXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXg0LmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdICsgJycgKyBtYXRjaFsxXSksXG4gICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0gKyAnJyArIG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSArICcnICsgbWF0Y2hbM10pLFxuICAgICAgICAgICAgYTogY29udmVydEhleFRvRGVjaW1hbChtYXRjaFs0XSArICcnICsgbWF0Y2hbNF0pLFxuICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/IFwibmFtZVwiIDogXCJoZXg4XCJcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhleDMuZXhlYyhjb2xvcikpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0gKyAnJyArIG1hdGNoWzFdKSxcbiAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSArICcnICsgbWF0Y2hbMl0pLFxuICAgICAgICAgICAgYjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzNdICsgJycgKyBtYXRjaFszXSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gXCJuYW1lXCIgOiBcImhleFwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVdDQUcyUGFybXMocGFybXMpIHtcbiAgICAvLyByZXR1cm4gdmFsaWQgV0NBRzIgcGFybXMgZm9yIGlzUmVhZGFibGUuXG4gICAgLy8gSWYgaW5wdXQgcGFybXMgYXJlIGludmFsaWQsIHJldHVybiB7XCJsZXZlbFwiOlwiQUFcIiwgXCJzaXplXCI6XCJzbWFsbFwifVxuICAgIHZhciBsZXZlbCwgc2l6ZTtcbiAgICBwYXJtcyA9IHBhcm1zIHx8IHtcImxldmVsXCI6XCJBQVwiLCBcInNpemVcIjpcInNtYWxsXCJ9O1xuICAgIGxldmVsID0gKHBhcm1zLmxldmVsIHx8IFwiQUFcIikudG9VcHBlckNhc2UoKTtcbiAgICBzaXplID0gKHBhcm1zLnNpemUgfHwgXCJzbWFsbFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsZXZlbCAhPT0gXCJBQVwiICYmIGxldmVsICE9PSBcIkFBQVwiKSB7XG4gICAgICAgIGxldmVsID0gXCJBQVwiO1xuICAgIH1cbiAgICBpZiAoc2l6ZSAhPT0gXCJzbWFsbFwiICYmIHNpemUgIT09IFwibGFyZ2VcIikge1xuICAgICAgICBzaXplID0gXCJzbWFsbFwiO1xuICAgIH1cbiAgICByZXR1cm4ge1wibGV2ZWxcIjpsZXZlbCwgXCJzaXplXCI6c2l6ZX07XG59XG5cbi8vIE5vZGU6IEV4cG9ydCBmdW5jdGlvblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHRpbnljb2xvcjtcbn1cbi8vIEFNRC9yZXF1aXJlanM6IERlZmluZSB0aGUgbW9kdWxlXG5lbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24gKCkge3JldHVybiB0aW55Y29sb3I7fSk7XG59XG4vLyBCcm93c2VyOiBFeHBvc2UgdG8gd2luZG93XG5lbHNlIHtcbiAgICB3aW5kb3cudGlueWNvbG9yID0gdGlueWNvbG9yO1xufVxuXG59KShNYXRoKTtcbiIsIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fTtcbiAgfVxuICB2YXIgYWN0aXZlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICB2YXIgcmFuZ2VzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0aW9uLnJhbmdlQ291bnQ7IGkrKykge1xuICAgIHJhbmdlcy5wdXNoKHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpKTtcbiAgfVxuXG4gIHN3aXRjaCAoYWN0aXZlLnRhZ05hbWUudG9VcHBlckNhc2UoKSkgeyAvLyAudG9VcHBlckNhc2UgaGFuZGxlcyBYSFRNTFxuICAgIGNhc2UgJ0lOUFVUJzpcbiAgICBjYXNlICdURVhUQVJFQSc6XG4gICAgICBhY3RpdmUuYmx1cigpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgYWN0aXZlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHNlbGVjdGlvbi50eXBlID09PSAnQ2FyZXQnICYmXG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgcmFuZ2VzLmZvckVhY2goZnVuY3Rpb24ocmFuZ2UpIHtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFjdGl2ZSAmJlxuICAgIGFjdGl2ZS5mb2N1cygpO1xuICB9O1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgX19ERVZfXyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbic7XG5cbnZhciB3YXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKF9fREVWX18pIHtcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDEgPyBsZW4gLSAxIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMTsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAxXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgK1xuICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH1cblxuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArXG4gICAgICAgICAgJ21lc3NhZ2UgYXJndW1lbnQnXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KG51bGwsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdhcm5pbmc7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBZmZpeFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfYWZmaXhbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFuY2hvclwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfYW5jaG9yW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBdXRvQ29tcGxldGVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2F1dG9Db21wbGV0ZVtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQWxlcnRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2FsZXJ0W1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBdmF0YXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2F2YXRhcltcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQmFja1RvcFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfYmFja1RvcFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQmFkZ2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2JhZGdlW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJCcmVhZGNydW1iXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9icmVhZGNydW1iW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJCdXR0b25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2J1dHRvbltcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FsZW5kYXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NhbGVuZGFyW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDYXJkXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jYXJkW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2xsYXBzZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29sbGFwc2VbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhcm91c2VsXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jYXJvdXNlbFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FzY2FkZXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2Nhc2NhZGVyW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDaGVja2JveFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY2hlY2tib3hbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29sW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb21tZW50XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb21tZW50W1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25maWdQcm92aWRlclwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29uZmlnUHJvdmlkZXJbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRhdGVQaWNrZXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2RhdGVQaWNrZXJbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRlc2NyaXB0aW9uc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfZGVzY3JpcHRpb25zW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEaXZpZGVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9kaXZpZGVyW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEcm9wZG93blwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfZHJvcGRvd25bXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRyYXdlclwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfZHJhd2VyW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFbXB0eVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfZW1wdHlbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkZvcm1cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2Zvcm1bXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkdyaWRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2dyaWRbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIklucHV0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbnB1dFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiSW1hZ2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ltYWdlW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJJbnB1dE51bWJlclwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW5wdXROdW1iZXJbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxheW91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbGF5b3V0W1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMaXN0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9saXN0W1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtZXNzYWdlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tZXNzYWdlW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZW51XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tZW51W1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZW50aW9uc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbWVudGlvbnNbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1vZGFsXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tb2RhbFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU3RhdGlzdGljXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdGF0aXN0aWNbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm5vdGlmaWNhdGlvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbm90aWZpY2F0aW9uW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQYWdlSGVhZGVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wYWdlSGVhZGVyW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQYWdpbmF0aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wYWdpbmF0aW9uW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQb3Bjb25maXJtXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wb3Bjb25maXJtW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQb3BvdmVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wb3BvdmVyW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQcm9ncmVzc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcHJvZ3Jlc3NbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJhZGlvXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9yYWRpb1tcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmF0ZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcmF0ZVtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVzdWx0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9yZXN1bHRbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJvd1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcm93W1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTZWxlY3RcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3NlbGVjdFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2tlbGV0b25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3NrZWxldG9uW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTbGlkZXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3NsaWRlcltcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU3BhY2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3NwYWNlW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTcGluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zcGluW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdGVwc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfc3RlcHNbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlN3aXRjaFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfc3dpdGNoW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUYWJsZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdGFibGVbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYW5zZmVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF90cmFuc2ZlcltcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJlZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdHJlZVtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJlZVNlbGVjdFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdHJlZVNlbGVjdFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVGFic1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdGFic1tcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVGFnXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF90YWdbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRpbWVQaWNrZXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3RpbWVQaWNrZXJbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRpbWVsaW5lXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF90aW1lbGluZVtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVG9vbHRpcFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdG9vbHRpcFtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHlwb2dyYXBoeVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdHlwb2dyYXBoeVtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVXBsb2FkXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF91cGxvYWRbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInZlcnNpb25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3ZlcnNpb25bXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcblxudmFyIF9hZmZpeCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYWZmaXhcIikpO1xuXG52YXIgX2FuY2hvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYW5jaG9yXCIpKTtcblxudmFyIF9hdXRvQ29tcGxldGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2F1dG8tY29tcGxldGVcIikpO1xuXG52YXIgX2FsZXJ0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9hbGVydFwiKSk7XG5cbnZhciBfYXZhdGFyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9hdmF0YXJcIikpO1xuXG52YXIgX2JhY2tUb3AgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2JhY2stdG9wXCIpKTtcblxudmFyIF9iYWRnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYmFkZ2VcIikpO1xuXG52YXIgX2JyZWFkY3J1bWIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2JyZWFkY3J1bWJcIikpO1xuXG52YXIgX2J1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYnV0dG9uXCIpKTtcblxudmFyIF9jYWxlbmRhciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY2FsZW5kYXJcIikpO1xuXG52YXIgX2NhcmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NhcmRcIikpO1xuXG52YXIgX2NvbGxhcHNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb2xsYXBzZVwiKSk7XG5cbnZhciBfY2Fyb3VzZWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Nhcm91c2VsXCIpKTtcblxudmFyIF9jYXNjYWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY2FzY2FkZXJcIikpO1xuXG52YXIgX2NoZWNrYm94ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jaGVja2JveFwiKSk7XG5cbnZhciBfY29sID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb2xcIikpO1xuXG52YXIgX2NvbW1lbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NvbW1lbnRcIikpO1xuXG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb25maWctcHJvdmlkZXJcIikpO1xuXG52YXIgX2RhdGVQaWNrZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RhdGUtcGlja2VyXCIpKTtcblxudmFyIF9kZXNjcmlwdGlvbnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Rlc2NyaXB0aW9uc1wiKSk7XG5cbnZhciBfZGl2aWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGl2aWRlclwiKSk7XG5cbnZhciBfZHJvcGRvd24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Ryb3Bkb3duXCIpKTtcblxudmFyIF9kcmF3ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RyYXdlclwiKSk7XG5cbnZhciBfZW1wdHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VtcHR5XCIpKTtcblxudmFyIF9mb3JtID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9mb3JtXCIpKTtcblxudmFyIF9ncmlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ncmlkXCIpKTtcblxudmFyIF9pbnB1dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaW5wdXRcIikpO1xuXG52YXIgX2ltYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9pbWFnZVwiKSk7XG5cbnZhciBfaW5wdXROdW1iZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2lucHV0LW51bWJlclwiKSk7XG5cbnZhciBfbGF5b3V0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9sYXlvdXRcIikpO1xuXG52YXIgX2xpc3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2xpc3RcIikpO1xuXG52YXIgX21lc3NhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21lc3NhZ2VcIikpO1xuXG52YXIgX21lbnUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21lbnVcIikpO1xuXG52YXIgX21lbnRpb25zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tZW50aW9uc1wiKSk7XG5cbnZhciBfbW9kYWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21vZGFsXCIpKTtcblxudmFyIF9zdGF0aXN0aWMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3N0YXRpc3RpY1wiKSk7XG5cbnZhciBfbm90aWZpY2F0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ub3RpZmljYXRpb25cIikpO1xuXG52YXIgX3BhZ2VIZWFkZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhZ2UtaGVhZGVyXCIpKTtcblxudmFyIF9wYWdpbmF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYWdpbmF0aW9uXCIpKTtcblxudmFyIF9wb3Bjb25maXJtID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wb3Bjb25maXJtXCIpKTtcblxudmFyIF9wb3BvdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wb3BvdmVyXCIpKTtcblxudmFyIF9wcm9ncmVzcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcHJvZ3Jlc3NcIikpO1xuXG52YXIgX3JhZGlvID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9yYWRpb1wiKSk7XG5cbnZhciBfcmF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcmF0ZVwiKSk7XG5cbnZhciBfcmVzdWx0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9yZXN1bHRcIikpO1xuXG52YXIgX3JvdyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcm93XCIpKTtcblxudmFyIF9zZWxlY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3NlbGVjdFwiKSk7XG5cbnZhciBfc2tlbGV0b24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3NrZWxldG9uXCIpKTtcblxudmFyIF9zbGlkZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3NsaWRlclwiKSk7XG5cbnZhciBfc3BhY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3NwYWNlXCIpKTtcblxudmFyIF9zcGluID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zcGluXCIpKTtcblxudmFyIF9zdGVwcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3RlcHNcIikpO1xuXG52YXIgX3N3aXRjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3dpdGNoXCIpKTtcblxudmFyIF90YWJsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdGFibGVcIikpO1xuXG52YXIgX3RyYW5zZmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi90cmFuc2ZlclwiKSk7XG5cbnZhciBfdHJlZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdHJlZVwiKSk7XG5cbnZhciBfdHJlZVNlbGVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdHJlZS1zZWxlY3RcIikpO1xuXG52YXIgX3RhYnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3RhYnNcIikpO1xuXG52YXIgX3RhZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdGFnXCIpKTtcblxudmFyIF90aW1lUGlja2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi90aW1lLXBpY2tlclwiKSk7XG5cbnZhciBfdGltZWxpbmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3RpbWVsaW5lXCIpKTtcblxudmFyIF90b29sdGlwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi90b29sdGlwXCIpKTtcblxudmFyIF90eXBvZ3JhcGh5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi90eXBvZ3JhcGh5XCIpKTtcblxudmFyIF91cGxvYWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VwbG9hZFwiKSk7XG5cbnZhciBfdmVyc2lvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdmVyc2lvblwiKSk7XG5cbi8qIEByZW1vdmUtb24tZXMtYnVpbGQtYmVnaW4gKi9cbi8vIHRoaXMgZmlsZSBpcyBub3QgdXNlZCBpZiB1c2UgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYmFiZWwtcGx1Z2luLWltcG9ydFxudmFyIEVOViA9IHByb2Nlc3MuZW52Lk5PREVfRU5WO1xuXG5pZiAoRU5WICE9PSAncHJvZHVjdGlvbicgJiYgRU5WICE9PSAndGVzdCcgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2FybiAmJiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbnR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUud2FybignWW91IGFyZSB1c2luZyBhIHdob2xlIHBhY2thZ2Ugb2YgYW50ZCwgJyArICdwbGVhc2UgdXNlIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBsdWdpbi1pbXBvcnQgdG8gcmVkdWNlIGFwcCBidW5kbGUgc2l6ZS4nKTtcbn1cbi8qIEByZW1vdmUtb24tZXMtYnVpbGQtZW5kICovIl19